Class: DiscordRDA::Member

Inherits:
Entity
  • Object
show all
Defined in:
lib/discord_rda/entity/member.rb

Overview

Represents a Discord guild member. Combines User data with guild-specific information.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Entity

#==, attribute, from_hash, #hash, #inspect, #to_h, #to_json

Constructor Details

#initialize(data = {}) ⇒ Member

Create a new member

Parameters:

  • data (Hash) (defaults to: {})

    Member data



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/discord_rda/entity/member.rb', line 51

def initialize(data = {})
  super

  @user = data['user'] ? User.new(data['user']) : nil
  @nick = data['nick']
  @avatar = data['avatar']
  @roles = (data['roles'] || []).map { |r| Snowflake.new(r) }
  @joined_at = data['joined_at'] ? Time.parse(data['joined_at']) : nil
  @premium_since = data['premium_since'] ? Time.parse(data['premium_since']) : nil
  @deaf = data['deaf'] || false
  @mute = data['mute'] || false
  @flags = data['flags'] || 0
  @pending = data['pending'] || false
  @permissions = data['permissions']
  @communication_disabled_until = data['communication_disabled_until'] ? Time.parse(data['communication_disabled_until']) : nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

Delegate methods to user



209
210
211
212
213
214
215
# File 'lib/discord_rda/entity/member.rb', line 209

def method_missing(method, *args, &block)
  if user&.respond_to?(method)
    user.public_send(method, *args, &block)
  else
    super
  end
end

Instance Attribute Details

#avatarString (readonly)

Returns Guild avatar hash.

Returns:

  • (String)

    Guild avatar hash



20
21
22
# File 'lib/discord_rda/entity/member.rb', line 20

def avatar
  @avatar
end

#communication_disabled_untilTime (readonly)

Returns When member’s timeout expires.

Returns:

  • (Time)

    When member’s timeout expires



47
48
49
# File 'lib/discord_rda/entity/member.rb', line 47

def communication_disabled_until
  @communication_disabled_until
end

#deafBoolean (readonly)

Returns Whether member is deafened.

Returns:

  • (Boolean)

    Whether member is deafened



32
33
34
# File 'lib/discord_rda/entity/member.rb', line 32

def deaf
  @deaf
end

#flagsInteger (readonly)

Returns Guild flags.

Returns:

  • (Integer)

    Guild flags



38
39
40
# File 'lib/discord_rda/entity/member.rb', line 38

def flags
  @flags
end

#joined_atTime (readonly)

Returns When member joined.

Returns:

  • (Time)

    When member joined



26
27
28
# File 'lib/discord_rda/entity/member.rb', line 26

def joined_at
  @joined_at
end

#muteBoolean (readonly)

Returns Whether member is muted.

Returns:

  • (Boolean)

    Whether member is muted



35
36
37
# File 'lib/discord_rda/entity/member.rb', line 35

def mute
  @mute
end

#nickString (readonly)

Returns Nickname in the guild.

Returns:

  • (String)

    Nickname in the guild



17
18
19
# File 'lib/discord_rda/entity/member.rb', line 17

def nick
  @nick
end

#pendingBoolean (readonly)

Returns Whether member is pending.

Returns:

  • (Boolean)

    Whether member is pending



41
42
43
# File 'lib/discord_rda/entity/member.rb', line 41

def pending
  @pending
end

#permissionsString (readonly)

Returns Permissions for this member in channel.

Returns:

  • (String)

    Permissions for this member in channel



44
45
46
# File 'lib/discord_rda/entity/member.rb', line 44

def permissions
  @permissions
end

#premium_sinceTime (readonly)

Returns When member started boosting.

Returns:

  • (Time)

    When member started boosting



29
30
31
# File 'lib/discord_rda/entity/member.rb', line 29

def premium_since
  @premium_since
end

#rolesArray<Snowflake> (readonly)

Returns Role IDs.

Returns:



23
24
25
# File 'lib/discord_rda/entity/member.rb', line 23

def roles
  @roles
end

#userUser (readonly)

Get the user object

Returns:

  • (User)

    User object



14
15
16
# File 'lib/discord_rda/entity/member.rb', line 14

def user
  @user
end

Instance Method Details

#avatar_url(format: 'png', size: nil) ⇒ String

Get member’s guild avatar URL

Parameters:

  • format (String) (defaults to: 'png')

    Image format

  • size (Integer) (defaults to: nil)

    Image size

Returns:

  • (String)

    Avatar URL



96
97
98
99
100
101
102
103
104
# File 'lib/discord_rda/entity/member.rb', line 96

def avatar_url(format: 'png', size: nil)
  if avatar
    url = "https://cdn.discordapp.com/guilds/#{guild_id}/users/#{id}/avatars/#{avatar}.#{format}"
    url += "?size=#{size}" if size
    url
  else
    user&.avatar_url(format: format, size: size)
  end
end

#boost_durationFloat?

Get how long member has been boosting

Returns:

  • (Float, nil)

    Duration in seconds or nil if not boosting



154
155
156
157
158
# File 'lib/discord_rda/entity/member.rb', line 154

def boost_duration
  return nil unless premium_since

  Time.now.utc - premium_since
end

#boost_sinceTime?

Get boost start time

Returns:

  • (Time, nil)

    When boosting started



140
141
142
# File 'lib/discord_rda/entity/member.rb', line 140

def boost_since
  premium_since
end

#boosting?Boolean

Check if member is boosting

Returns:

  • (Boolean)

    True if boosting



134
135
136
# File 'lib/discord_rda/entity/member.rb', line 134

def boosting?
  !premium_since.nil?
end

#bypasses_verification?Boolean

Check if member has bypassed verification

Returns:

  • (Boolean)

    True if bypassed



242
243
244
# File 'lib/discord_rda/entity/member.rb', line 242

def bypasses_verification?
  !flags.nil? && (flags & 4) == 4
end

#can_act_on?(target, guild_roles) ⇒ Boolean

Check if member can perform action on target Compares roles and permissions

Parameters:

  • target (Member)

    Target member

  • guild_roles (Array<Role>)

    Guild roles for comparison

Returns:

  • (Boolean)

    True if this member outranks target



195
196
197
198
199
200
# File 'lib/discord_rda/entity/member.rb', line 195

def can_act_on?(target, guild_roles)
  return false if target.id == id # Can't act on self
  return false if target.id == guild_id # Can't act on owner

  highest_role_position(guild_roles) > target.highest_role_position(guild_roles)
end

#completed_onboarding?Boolean

Check if member has completed onboarding

Returns:

  • (Boolean)

    True if completed



236
237
238
# File 'lib/discord_rda/entity/member.rb', line 236

def completed_onboarding?
  !flags.nil? && (flags & 2) == 2
end

#created_atTime?

Get creation time (from user)

Returns:

  • (Time, nil)

    Account creation time



204
205
206
# File 'lib/discord_rda/entity/member.rb', line 204

def created_at
  user&.created_at
end

#deaf?Boolean

Check if member is server deafened

Returns:

  • (Boolean)

    True if deafened



108
109
110
# File 'lib/discord_rda/entity/member.rb', line 108

def deaf?
  deaf
end

#display_color(guild_roles) ⇒ Color

Get member’s display color from highest colored role

Parameters:

  • guild_roles (Array<Role>)

    All guild roles

Returns:

  • (Color)

    Display color



255
256
257
258
259
260
261
# File 'lib/discord_rda/entity/member.rb', line 255

def display_color(guild_roles)
  member_roles = guild_roles.select { |r| has_role?(r.id) && r.color > 0 }
  return Color.new(0) if member_roles.empty?

  highest_colored = member_roles.max_by(&:position)
  Color.new(highest_colored.color)
end

#display_nameString

Get member’s effective name (nickname or username)

Returns:

  • (String)

    Display name



76
77
78
# File 'lib/discord_rda/entity/member.rb', line 76

def display_name
  nick || user&.display_name || user&.username
end

#duration_in_guildFloat

Get how long member has been in the guild

Returns:

  • (Float)

    Duration in seconds



146
147
148
149
150
# File 'lib/discord_rda/entity/member.rb', line 146

def duration_in_guild
  return 0 unless joined_at

  Time.now.utc - joined_at
end

#guild_idSnowflake?

Get guild ID

Returns:



162
163
164
# File 'lib/discord_rda/entity/member.rb', line 162

def guild_id
  @raw_data['guild_id'] ? Snowflake.new(@raw_data['guild_id']) : nil
end

#has_role?(role_id) ⇒ Boolean

Check if member has a specific role

Parameters:

  • role_id (String, Snowflake)

    Role ID to check

Returns:

  • (Boolean)

    True if has role



177
178
179
180
# File 'lib/discord_rda/entity/member.rb', line 177

def has_role?(role_id)
  role_snowflake = role_id.is_a?(Snowflake) ? role_id : Snowflake.new(role_id)
  roles.include?(role_snowflake)
end

#highest_role_position(guild_roles) ⇒ Integer

Get the highest role position

Parameters:

  • guild_roles (Array<Role>)

    All guild roles

Returns:

  • (Integer)

    Highest position



185
186
187
188
# File 'lib/discord_rda/entity/member.rb', line 185

def highest_role_position(guild_roles)
  member_roles = guild_roles.select { |r| has_role?(r.id) }
  member_roles.map(&:position).max || 0
end

#idObject

Member inherits ID from user



9
10
11
# File 'lib/discord_rda/entity/member.rb', line 9

def id
  user&.id
end

#member_flagsMemberFlags

Get member flags

Returns:



230
231
232
# File 'lib/discord_rda/entity/member.rb', line 230

def member_flags
  MemberFlags.new(flags)
end

#mentionString

Get mention string

Returns:

  • (String)

    Member mention



82
83
84
# File 'lib/discord_rda/entity/member.rb', line 82

def mention
  "<@!#{id}>"
end

#mute?Boolean

Check if member is server muted

Returns:

  • (Boolean)

    True if muted



114
115
116
# File 'lib/discord_rda/entity/member.rb', line 114

def mute?
  mute
end

#nick?Boolean

Check if member has a nickname

Returns:

  • (Boolean)

    True if has nickname



88
89
90
# File 'lib/discord_rda/entity/member.rb', line 88

def nick?
  !nick.nil?
end

#owner?(guild_owner_id) ⇒ Boolean

Check if this member is the guild owner

Parameters:

  • guild_owner_id (Snowflake)

    Guild owner ID

Returns:

  • (Boolean)

    True if owner



224
225
226
# File 'lib/discord_rda/entity/member.rb', line 224

def owner?(guild_owner_id)
  id == guild_owner_id
end

#pending?Boolean

Check if member has pending membership screening

Returns:

  • (Boolean)

    True if pending



120
121
122
# File 'lib/discord_rda/entity/member.rb', line 120

def pending?
  pending
end

#permission_setPermission?

Get permission set for this member

Returns:



168
169
170
171
172
# File 'lib/discord_rda/entity/member.rb', line 168

def permission_set
  return nil unless permissions

  Permission.new(permissions.to_i)
end

#respond_to_missing?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


217
218
219
# File 'lib/discord_rda/entity/member.rb', line 217

def respond_to_missing?(method, include_private = false)
  user&.respond_to?(method) || super
end

#started_onboarding?Boolean

Check if member started onboarding

Returns:

  • (Boolean)

    True if started



248
249
250
# File 'lib/discord_rda/entity/member.rb', line 248

def started_onboarding?
  !flags.nil? && (flags & 1) == 1
end

#timed_out?Boolean

Check if member is currently timed out

Returns:

  • (Boolean)

    True if timed out



126
127
128
129
130
# File 'lib/discord_rda/entity/member.rb', line 126

def timed_out?
  return false unless communication_disabled_until

  communication_disabled_until > Time.now.utc
end