Class: ESM::User

Inherits:
ApplicationRecord show all
Defined in:
lib/esm/model/user.rb,
lib/esm/model/user/ephemeral.rb

Defined Under Namespace

Classes: Ephemeral

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#discord_userObject



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/esm/model/user.rb', line 53

def discord_user
  return if discord_id.nil?

  @discord_user ||= lambda do
    discord_user = ESM.bot.user(discord_id)
    return if discord_user.nil?

    # Keep the discord user data up-to-date
    incoming_attributes = [discord_user.username, discord_user.avatar_url]
    current_attributes = [discord_username, discord_avatar]

    if current_attributes != incoming_attributes
      update!(
        discord_username: discord_user.username,
        discord_avatar: discord_user.avatar_url
      )
    end

    # Save some data for later consumption
    discord_user.esm_user = self
    discord_user
  end.call
end

Class Method Details

.from_discord(discord_user) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/esm/model/user.rb', line 33

def self.from_discord(discord_user)
  return if discord_user.nil?

  user = order(:discord_id)
    .where(discord_id: discord_user.id)
    .first_or_initialize

  user.update!(discord_username: discord_user.username, discord_avatar: discord_user.avatar_url)
  user.discord_user = discord_user
  user
end

.parse(input) ⇒ Object

Parses and finds a user based off of SteamUID, Discord ID, or Discord Mention



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/esm/model/user.rb', line 14

def self.parse(input)
  return if input.nil?

  # In case of frozen strings
  input = input.dup if input.frozen?

  # Discordrb stores the Discord ID as an Integer.
  input = input.to_s if !input.is_a?(String)

  if ESM::Regex::DISCORD_TAG_ONLY.match?(input)
    # Remove the extra stuff from a mention
    find_by_discord_id(input.gsub(/[<@!&>]/, ""))
  elsif input.steam_uid?
    find_by_steam_uid(input)
  else
    find_by_discord_id(input)
  end
end

Instance Method Details

#can_modify?(guild_id) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/esm/model/user.rb', line 85

def can_modify?(guild_id)
  return false if discord_id.nil?
  return true if developer? && !Rails.env.development?

  community = Community.find_by_guild_id(guild_id)
  return false if community.nil?

  server = community.discord_server
  return false if server.nil?

  # Check if they're the owner or admin
  community.modifiable_by?(on(server))
end

#channel_permission?(permission, channel) ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/esm/model/user.rb', line 99

def channel_permission?(permission, channel)
  !!on(channel.server)&.permission?(permission, channel)
end

#developer?Boolean

Instance Methods

Returns:

  • (Boolean)


49
50
51
# File 'lib/esm/model/user.rb', line 49

def developer?
  ESM.config.dev_user_allowlist.include?(discord_id)
end

#discord_serversObject



77
78
79
80
81
82
83
# File 'lib/esm/model/user.rb', line 77

def discord_servers
  return if discord_id.nil?

  @discord_servers ||= ESM.bot.servers.values.select do |server|
    server.users.any? { |user| user.id.to_s == discord_id }
  end
end