discordrb 1.3.8 → 1.3.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of discordrb might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/discordrb.rb +0 -1
- data/lib/discordrb/api.rb +16 -0
- data/lib/discordrb/await.rb +23 -0
- data/lib/discordrb/bot.rb +153 -8
- data/lib/discordrb/commands/command_bot.rb +3 -3
- data/lib/discordrb/data.rb +46 -26
- data/lib/discordrb/events/await.rb +29 -0
- data/lib/discordrb/events/members.rb +71 -0
- data/lib/discordrb/version.rb +1 -1
- metadata +5 -3
- data/lib/discordrb/events/guild_member_update.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 569e1f420904120c2bcc90a4d3210dcd6e2bbb33
|
4
|
+
data.tar.gz: 4aa9f7b948e80d2b510981089df082fe3b25e536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ccdf4a5c16ea40690f0bcd522c7532bf71a857bd006a7b332484409ae1ecdb68380673250c5d96850be92ede58381af76f4d5154f26ff59e0dcdc8b2e51990c
|
7
|
+
data.tar.gz: 5cd3c4927f10709b9605f242da79d9cc881d3cd466eab30b3996d5827fb6dae2619e2f6a160fa22ca8750a614d6926389dccbffa5d1b40908319633423400d34
|
data/lib/discordrb.rb
CHANGED
data/lib/discordrb/api.rb
CHANGED
@@ -15,6 +15,22 @@ module Discordrb::API
|
|
15
15
|
)
|
16
16
|
end
|
17
17
|
|
18
|
+
# Unban a user from a server
|
19
|
+
def unban_user(token, server_id, user_id)
|
20
|
+
RestClient.delete(
|
21
|
+
"#{APIBASE}/guilds/#{server_id}/bans/#{user_id}",
|
22
|
+
Authorization: token
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Kick a user from a server
|
27
|
+
def kick_user(token, server_id, user_id)
|
28
|
+
RestClient.delete(
|
29
|
+
"#{APIBASE}/guilds/#{server_id}/members/#{user_id}",
|
30
|
+
Authorization: token
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
18
34
|
# Get a server's banned users
|
19
35
|
def bans(token, server_id)
|
20
36
|
RestClient.get(
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Discordrb
|
2
|
+
# Class that represents an await to wait for a further event
|
3
|
+
class Await
|
4
|
+
attr_reader :key, :type, :attributes
|
5
|
+
|
6
|
+
def initialize(bot, key, type, attributes, block = nil)
|
7
|
+
@bot = bot
|
8
|
+
@key = key
|
9
|
+
@type = type
|
10
|
+
@attributes = attributes
|
11
|
+
@block = block
|
12
|
+
end
|
13
|
+
|
14
|
+
def match(event)
|
15
|
+
dummy_handler = @bot.handler_class(@type).new(@attributes, @bot)
|
16
|
+
return [nil, nil] unless dummy_handler.matches?(event)
|
17
|
+
|
18
|
+
should_delete = true if (@block && @block.call(event) != false) || !@block
|
19
|
+
|
20
|
+
[@key, should_delete]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/discordrb/bot.rb
CHANGED
@@ -10,15 +10,17 @@ require 'discordrb/events/voice_state_update'
|
|
10
10
|
require 'discordrb/events/channel_create'
|
11
11
|
require 'discordrb/events/channel_update'
|
12
12
|
require 'discordrb/events/channel_delete'
|
13
|
-
require 'discordrb/events/
|
13
|
+
require 'discordrb/events/members'
|
14
14
|
require 'discordrb/events/guild_role_create'
|
15
15
|
require 'discordrb/events/guild_role_delete'
|
16
16
|
require 'discordrb/events/guild_role_update'
|
17
|
+
require 'discordrb/events/await'
|
17
18
|
|
18
19
|
require 'discordrb/api'
|
19
20
|
require 'discordrb/games'
|
20
21
|
require 'discordrb/exceptions'
|
21
22
|
require 'discordrb/data'
|
23
|
+
require 'discordrb/await'
|
22
24
|
|
23
25
|
module Discordrb
|
24
26
|
# Represents a Discord bot, including servers, users, etc.
|
@@ -45,6 +47,8 @@ module Discordrb
|
|
45
47
|
|
46
48
|
@channels = {}
|
47
49
|
@users = {}
|
50
|
+
|
51
|
+
@awaits = {}
|
48
52
|
end
|
49
53
|
|
50
54
|
def run(async = false)
|
@@ -121,6 +125,27 @@ module Discordrb
|
|
121
125
|
@servers[id]
|
122
126
|
end
|
123
127
|
|
128
|
+
def find(channel_name, server_name = nil, threshold = 0)
|
129
|
+
require 'levenshtein'
|
130
|
+
|
131
|
+
results = []
|
132
|
+
@servers.values.each do |server|
|
133
|
+
server.channels.each do |channel|
|
134
|
+
distance = Levenshtein.distance(channel.name, channel_name)
|
135
|
+
distance += Levenshtein.distance(server_name || server.name, server.name)
|
136
|
+
next if distance > threshold
|
137
|
+
|
138
|
+
# Make a singleton accessor "distance"
|
139
|
+
channel.instance_variable_set(:@distance, distance)
|
140
|
+
class << channel
|
141
|
+
attr_reader :distance
|
142
|
+
end
|
143
|
+
results << channel
|
144
|
+
end
|
145
|
+
end
|
146
|
+
results
|
147
|
+
end
|
148
|
+
|
124
149
|
def send_message(channel_id, content)
|
125
150
|
debug("Sending message to #{channel_id} with content '#{content}'")
|
126
151
|
response = API.send_message(@token, channel_id, content)
|
@@ -131,6 +156,18 @@ module Discordrb
|
|
131
156
|
API.send_file(@token, channel_id, file)
|
132
157
|
end
|
133
158
|
|
159
|
+
def add_await(key, type, attributes = {}, &block)
|
160
|
+
fail "You can't await an AwaitEvent!" if type == Discordrb::Events::AwaitEvent
|
161
|
+
await = Await.new(self, key, type, attributes, block)
|
162
|
+
@awaits[key] = await
|
163
|
+
end
|
164
|
+
|
165
|
+
def parse_mention(mention)
|
166
|
+
# Mention format: <@id>
|
167
|
+
return nil unless /\<@(?<id>\d+)\>?/ =~ mention
|
168
|
+
user(id)
|
169
|
+
end
|
170
|
+
|
134
171
|
def game=(name_or_id)
|
135
172
|
game = Discordrb::Games.find_game(name_or_id)
|
136
173
|
@game = game
|
@@ -149,6 +186,14 @@ module Discordrb
|
|
149
186
|
|
150
187
|
attr_writer :debug
|
151
188
|
|
189
|
+
## ## ### ## ## ######## ## ######## ######## ######
|
190
|
+
## ## ## ## ### ## ## ## ## ## ## ## ## ##
|
191
|
+
## ## ## ## #### ## ## ## ## ## ## ## ##
|
192
|
+
######### ## ## ## ## ## ## ## ## ###### ######## ######
|
193
|
+
## ## ######### ## #### ## ## ## ## ## ## ##
|
194
|
+
## ## ## ## ## ### ## ## ## ## ## ## ## ##
|
195
|
+
## ## ## ## ## ## ######## ######## ######## ## ## ######
|
196
|
+
|
152
197
|
def message(attributes = {}, &block)
|
153
198
|
register_event(MessageEvent, attributes, block)
|
154
199
|
end
|
@@ -210,6 +255,22 @@ module Discordrb
|
|
210
255
|
register_event(VoiceStateUpdateEvent, attributes, block)
|
211
256
|
end
|
212
257
|
|
258
|
+
def member_join(attributes = {}, &block)
|
259
|
+
register_event(GuildMemberAddEvent, attributes, block)
|
260
|
+
end
|
261
|
+
|
262
|
+
def member_update(attributes = {}, &block)
|
263
|
+
register_event(GuildMemberUpdateEvent, attributes, block)
|
264
|
+
end
|
265
|
+
|
266
|
+
def member_leave(attributes = {}, &block)
|
267
|
+
register_event(GuildMemberDeleteEvent, attributes, block)
|
268
|
+
end
|
269
|
+
|
270
|
+
def await(attributes = {}, &block)
|
271
|
+
register_event(AwaitEvent, attributes, block)
|
272
|
+
end
|
273
|
+
|
213
274
|
def remove_handler(handler)
|
214
275
|
clazz = event_class(handler.class)
|
215
276
|
@event_handlers[clazz].delete(handler)
|
@@ -224,10 +285,22 @@ module Discordrb
|
|
224
285
|
puts "[DEBUG @ #{Time.now}] #{message}" if @debug || important
|
225
286
|
end
|
226
287
|
|
288
|
+
def handler_class(event_class)
|
289
|
+
class_from_string(event_class.to_s + 'Handler')
|
290
|
+
end
|
291
|
+
|
227
292
|
alias_method :<<, :add_handler
|
228
293
|
|
229
294
|
private
|
230
295
|
|
296
|
+
### ## ## ######## ######## ######## ## ## ### ## ######
|
297
|
+
## ### ## ## ## ## ## ### ## ## ## ## ## ##
|
298
|
+
## #### ## ## ## ## ## #### ## ## ## ## ##
|
299
|
+
## ## ## ## ## ###### ######## ## ## ## ## ## ## ######
|
300
|
+
## ## #### ## ## ## ## ## #### ######### ## ##
|
301
|
+
## ## ### ## ## ## ## ## ### ## ## ## ## ##
|
302
|
+
### ## ## ## ######## ## ## ## ## ## ## ######## ######
|
303
|
+
|
231
304
|
# Internal handler for PRESENCE_UPDATE
|
232
305
|
def update_presence(data)
|
233
306
|
user_id = data['user']['id'].to_i
|
@@ -295,21 +368,57 @@ module Discordrb
|
|
295
368
|
server.channels.reject! { |c| c.id == channel.id }
|
296
369
|
end
|
297
370
|
|
371
|
+
# Internal handler for GUILD_MEMBER_ADD
|
372
|
+
def add_guild_member(data)
|
373
|
+
user = User.new(data['user'], self)
|
374
|
+
server_id = data['guild_id'].to_i
|
375
|
+
server = @servers[server_id]
|
376
|
+
|
377
|
+
roles = []
|
378
|
+
data['roles'].each do |element|
|
379
|
+
role_id = element.to_i
|
380
|
+
roles << server.roles.find { |r| r.id == role_id }
|
381
|
+
end
|
382
|
+
user.update_roles(server, roles)
|
383
|
+
|
384
|
+
if @users[user.id]
|
385
|
+
# If the user is already cached, just add the new roles
|
386
|
+
@users[user.id].merge_roles(server, user.roles[server.id])
|
387
|
+
else
|
388
|
+
@users[user.id] = user
|
389
|
+
end
|
390
|
+
|
391
|
+
server.add_user(user)
|
392
|
+
end
|
393
|
+
|
298
394
|
# Internal handler for GUILD_MEMBER_UPDATE
|
299
395
|
def update_guild_member(data)
|
300
|
-
|
396
|
+
user_id = data['user']['id'].to_i
|
397
|
+
user = @users[user_id]
|
398
|
+
|
301
399
|
server_id = data['guild_id'].to_i
|
302
400
|
server = @servers[server_id]
|
401
|
+
|
303
402
|
roles = []
|
304
403
|
data['roles'].each do |element|
|
305
404
|
role_id = element.to_i
|
306
405
|
roles << server.roles.find { |r| r.id == role_id }
|
307
406
|
end
|
308
|
-
user_id = user_data['id'].to_i
|
309
|
-
user = @users[user_id]
|
310
407
|
user.update_roles(server, roles)
|
311
408
|
end
|
312
409
|
|
410
|
+
# Internal handler for GUILD_MEMBER_DELETE
|
411
|
+
def delete_guild_member(data)
|
412
|
+
user_id = data['user']['id'].to_i
|
413
|
+
user = @users[user_id]
|
414
|
+
|
415
|
+
server_id = data['guild_id'].to_i
|
416
|
+
server = @servers[server_id]
|
417
|
+
|
418
|
+
user.delete_roles(server_id)
|
419
|
+
server.delete_user(user_id)
|
420
|
+
end
|
421
|
+
|
313
422
|
# Internal handler for GUILD_ROLE_UPDATE
|
314
423
|
def update_guild_role(data)
|
315
424
|
role_data = data['role']
|
@@ -345,6 +454,14 @@ module Discordrb
|
|
345
454
|
# Internal handler for TYPING_START
|
346
455
|
def start_typing(data); end
|
347
456
|
|
457
|
+
## ####### ###### #### ## ##
|
458
|
+
## ## ## ## ## ## ### ##
|
459
|
+
## ## ## ## ## #### ##
|
460
|
+
## ## ## ## #### ## ## ## ##
|
461
|
+
## ## ## ## ## ## ## ####
|
462
|
+
## ## ## ## ## ## ## ###
|
463
|
+
######## ####### ###### #### ## ##
|
464
|
+
|
348
465
|
def login
|
349
466
|
debug('Logging in')
|
350
467
|
login_attempts ||= 0
|
@@ -382,6 +499,14 @@ module Discordrb
|
|
382
499
|
JSON.parse(response)['url']
|
383
500
|
end
|
384
501
|
|
502
|
+
## ## ###### ######## ## ## ######## ## ## ######## ######
|
503
|
+
## ## ## ## ## ## ## ## ## ### ## ## ## ##
|
504
|
+
## ## ## ## ## ## ## ## #### ## ## ##
|
505
|
+
## ## ## ###### ###### ## ## ###### ## ## ## ## ######
|
506
|
+
## ## ## ## ## ## ## ## ## #### ## ##
|
507
|
+
## ## ## ## ## ## ## ## ## ## ### ## ## ##
|
508
|
+
#### ### ###### ######## ### ######## ## ## ## ######
|
509
|
+
|
385
510
|
def websocket_connect
|
386
511
|
debug('Attempting to get gateway URL...')
|
387
512
|
websocket_hub = find_gateway
|
@@ -493,11 +618,21 @@ module Discordrb
|
|
493
618
|
|
494
619
|
event = ChannelDeleteEvent.new(data, self)
|
495
620
|
raise_event(event)
|
621
|
+
when 'GUILD_MEMBER_ADD'
|
622
|
+
add_guild_member(data)
|
623
|
+
|
624
|
+
event = GuildMemberAddEvent.new(data, self)
|
625
|
+
raise_event(event)
|
496
626
|
when 'GUILD_MEMBER_UPDATE'
|
497
627
|
update_guild_member(data)
|
498
628
|
|
499
629
|
event = GuildMemberUpdateEvent.new(data, self)
|
500
630
|
raise_event(event)
|
631
|
+
when 'GUILD_MEMBER_REMOVE'
|
632
|
+
delete_guild_member(data)
|
633
|
+
|
634
|
+
event = GuildMemberDeleteEvent.new(data, self)
|
635
|
+
raise_event(event)
|
501
636
|
when 'GUILD_ROLE_UPDATE'
|
502
637
|
update_guild_role(data)
|
503
638
|
|
@@ -549,12 +684,26 @@ module Discordrb
|
|
549
684
|
|
550
685
|
def raise_event(event)
|
551
686
|
debug("Raised a #{event.class}")
|
687
|
+
handle_awaits(event)
|
688
|
+
|
552
689
|
handlers = @event_handlers[event.class]
|
553
690
|
(handlers || []).each do |handler|
|
554
691
|
handler.match(event)
|
555
692
|
end
|
556
693
|
end
|
557
694
|
|
695
|
+
def handle_awaits(event)
|
696
|
+
@awaits.each do |_, await|
|
697
|
+
key, should_delete = await.match(event)
|
698
|
+
next unless key
|
699
|
+
debug("should_delete: #{should_delete}")
|
700
|
+
@awaits.delete(await.key) if should_delete
|
701
|
+
|
702
|
+
await_event = Discordrb::Events::AwaitEvent.new(await, event, self)
|
703
|
+
raise_event(await_event)
|
704
|
+
end
|
705
|
+
end
|
706
|
+
|
558
707
|
def register_event(clazz, attributes, block)
|
559
708
|
handler = handler_class(clazz).new(attributes, block)
|
560
709
|
|
@@ -588,9 +737,5 @@ module Discordrb
|
|
588
737
|
|
589
738
|
class_from_string(class_name[0..-8])
|
590
739
|
end
|
591
|
-
|
592
|
-
def handler_class(event_class)
|
593
|
-
class_from_string(event_class.to_s + 'Handler')
|
594
|
-
end
|
595
740
|
end
|
596
741
|
end
|
@@ -91,7 +91,7 @@ module Discordrb::Commands
|
|
91
91
|
event.respond @attributes[:command_doesnt_exist_message].gsub('%command%', name) if @attributes[:command_doesnt_exist_message]
|
92
92
|
return
|
93
93
|
end
|
94
|
-
if permission?(user(event.user.id), command.attributes[:permission_level], event.server
|
94
|
+
if permission?(user(event.user.id), command.attributes[:permission_level], event.server)
|
95
95
|
event.command = command
|
96
96
|
command.call(event, arguments, chained)
|
97
97
|
else
|
@@ -132,8 +132,8 @@ module Discordrb::Commands
|
|
132
132
|
@permissions[:roles][id] = level
|
133
133
|
end
|
134
134
|
|
135
|
-
def permission?(user, level,
|
136
|
-
determined_level = user.roles[
|
135
|
+
def permission?(user, level, server)
|
136
|
+
determined_level = server.nil? ? 0 : user.roles[server.id].each.reduce(0) do |memo, role|
|
137
137
|
[@permissions[:roles][role.id] || 0, memo].max
|
138
138
|
end
|
139
139
|
[@permissions[:users][user.id] || 0, determined_level].max >= level
|
data/lib/discordrb/data.rb
CHANGED
@@ -8,20 +8,12 @@ require 'discordrb/games'
|
|
8
8
|
module Discordrb
|
9
9
|
# User on Discord, including internal data like discriminators
|
10
10
|
class User
|
11
|
-
attr_reader :username, :id, :discriminator, :avatar
|
11
|
+
attr_reader :username, :id, :discriminator, :avatar, :voice_channel, :roles
|
12
|
+
attr_accessor :status, :game, :server_mute, :server_deaf, :self_mute, :self_deaf
|
12
13
|
|
13
|
-
|
14
|
-
attr_accessor :game
|
15
|
-
attr_accessor :server_mute
|
16
|
-
attr_accessor :server_deaf
|
17
|
-
attr_accessor :self_mute
|
18
|
-
attr_accessor :self_deaf
|
19
|
-
attr_reader :voice_channel
|
20
|
-
|
21
|
-
# Hash of user roles.
|
14
|
+
# @roles is a hash of user roles:
|
22
15
|
# Key: Server ID
|
23
16
|
# Value: Array of roles.
|
24
|
-
attr_reader :roles
|
25
17
|
|
26
18
|
alias_method :name, :username
|
27
19
|
|
@@ -74,6 +66,16 @@ module Discordrb
|
|
74
66
|
end
|
75
67
|
end
|
76
68
|
|
69
|
+
# Delete a specific server from the roles (in case a user leaves a server)
|
70
|
+
def delete_roles(server_id)
|
71
|
+
@roles.delete(server_id)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Add an await for a message from this user
|
75
|
+
def await(key, attributes = {}, &block)
|
76
|
+
@bot.add_await(key, MessageEvent, { from: @id }.merge(attributes), &block)
|
77
|
+
end
|
78
|
+
|
77
79
|
# Determine if the user has permission to do an action
|
78
80
|
# action is a permission from Permissions::Flags.
|
79
81
|
# channel is the channel in which the action takes place (not applicable for server-wide actions).
|
@@ -116,11 +118,7 @@ module Discordrb
|
|
116
118
|
|
117
119
|
# A Discord role that contains permissions and applies to certain users
|
118
120
|
class Role
|
119
|
-
attr_reader :permissions
|
120
|
-
attr_reader :name
|
121
|
-
attr_reader :id
|
122
|
-
attr_reader :hoist
|
123
|
-
attr_reader :color
|
121
|
+
attr_reader :permissions, :name, :id, :hoist, :color
|
124
122
|
|
125
123
|
def initialize(data, bot, server = nil)
|
126
124
|
@bot = bot
|
@@ -142,9 +140,7 @@ module Discordrb
|
|
142
140
|
|
143
141
|
# A Discord channel, including data like the topic
|
144
142
|
class Channel
|
145
|
-
attr_reader :name, :server, :type, :id, :is_private, :recipient, :topic, :position
|
146
|
-
|
147
|
-
attr_reader :permission_overwrites
|
143
|
+
attr_reader :name, :server, :type, :id, :is_private, :recipient, :topic, :position, :permission_overwrites
|
148
144
|
|
149
145
|
def initialize(data, bot, server = nil)
|
150
146
|
@bot = bot
|
@@ -230,6 +226,11 @@ module Discordrb
|
|
230
226
|
@permission_overwrites = overwrites
|
231
227
|
end
|
232
228
|
|
229
|
+
# Add an await for a message in this channel
|
230
|
+
def await(key, attributes = {}, &block)
|
231
|
+
@bot.add_await(key, MessageEvent, { in: @id }.merge(attributes), &block)
|
232
|
+
end
|
233
|
+
|
233
234
|
alias_method :send, :send_message
|
234
235
|
alias_method :message, :send_message
|
235
236
|
|
@@ -272,17 +273,16 @@ module Discordrb
|
|
272
273
|
def delete
|
273
274
|
API.delete_message(@bot.token, @channel.id, @id)
|
274
275
|
end
|
276
|
+
|
277
|
+
# Add an await for a message with the same user and channel
|
278
|
+
def await(key, attributes = {}, &block)
|
279
|
+
@bot.add_await(key, MessageEvent, { from: @author.id, in: @channel.id }.merge(attributes), &block)
|
280
|
+
end
|
275
281
|
end
|
276
282
|
|
277
283
|
# A server on Discord
|
278
284
|
class Server
|
279
|
-
attr_reader :region, :name, :owner_id, :id, :members
|
280
|
-
|
281
|
-
# Array of channels on the server
|
282
|
-
attr_reader :channels
|
283
|
-
|
284
|
-
# Array of roles on the server
|
285
|
-
attr_reader :roles
|
285
|
+
attr_reader :region, :name, :owner_id, :id, :members, :channels, :roles
|
286
286
|
|
287
287
|
def initialize(data, bot)
|
288
288
|
@bot = bot
|
@@ -370,10 +370,30 @@ module Discordrb
|
|
370
370
|
end
|
371
371
|
end
|
372
372
|
|
373
|
+
def add_user(user)
|
374
|
+
@members << user
|
375
|
+
end
|
376
|
+
|
377
|
+
def delete_user(user_id)
|
378
|
+
@members.reject! { |member| member.id == user_id }
|
379
|
+
end
|
380
|
+
|
373
381
|
def create_channel(name)
|
374
382
|
response = API.create_channel(@bot.token, @id, name, 'text')
|
375
383
|
Channel.new(JSON.parse(response), @bot)
|
376
384
|
end
|
385
|
+
|
386
|
+
def ban(user, message_days = 0)
|
387
|
+
API.ban_user(@bot.token, @id, user.id, message_days)
|
388
|
+
end
|
389
|
+
|
390
|
+
def unban(user)
|
391
|
+
API.unban_user(@bot.token, @id, user.id)
|
392
|
+
end
|
393
|
+
|
394
|
+
def kick(user)
|
395
|
+
API.kick_user(@bot.token, @id, user.id)
|
396
|
+
end
|
377
397
|
end
|
378
398
|
|
379
399
|
# A colour (red, green and blue values). Used for role colours
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/await'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
# Event raised when an await is triggered
|
6
|
+
class AwaitEvent
|
7
|
+
attr_reader :await, :event
|
8
|
+
delegate :key, :type, :attributes, to: :await
|
9
|
+
|
10
|
+
def initialize(await, event, bot)
|
11
|
+
@await = await
|
12
|
+
@event = event
|
13
|
+
@bot = bot
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Event handler for AwaitEvent
|
18
|
+
class AwaitEventHandler < EventHandler
|
19
|
+
def matches?(event)
|
20
|
+
# Check for the proper event type
|
21
|
+
return false unless event.is_a? AwaitEvent
|
22
|
+
|
23
|
+
[
|
24
|
+
matches_all(@attributes[:key], event.key) { |a, e| a == e },
|
25
|
+
matches_all(@attributes[:type], event.type) { |a, e| a == e }
|
26
|
+
].reduce(true, &:&)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/data'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
# Generic subclass for server member events (add/update/delete)
|
6
|
+
class GuildMemberEvent
|
7
|
+
attr_reader :user
|
8
|
+
attr_reader :roles
|
9
|
+
attr_reader :server
|
10
|
+
|
11
|
+
def initialize(data, bot)
|
12
|
+
@server = bot.server(data['guild_id'].to_i)
|
13
|
+
return unless @server
|
14
|
+
|
15
|
+
init_user(data, bot)
|
16
|
+
init_roles(data, bot)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def init_user(data, _)
|
22
|
+
user_id = data['user']['id'].to_i
|
23
|
+
@user = @server.members.find { |u| u.id == user_id }
|
24
|
+
end
|
25
|
+
|
26
|
+
def init_roles(data, _)
|
27
|
+
@roles = []
|
28
|
+
return unless data['roles']
|
29
|
+
data['roles'].each do |element|
|
30
|
+
role_id = element.to_i
|
31
|
+
@roles << @server.roles.find { |r| r.id == role_id }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Generic event handler for member events
|
37
|
+
class GuildMemberEventHandler < EventHandler
|
38
|
+
def matches?(event)
|
39
|
+
# Check for the proper event type
|
40
|
+
return false unless event.is_a? GuildMemberEvent
|
41
|
+
|
42
|
+
[
|
43
|
+
matches_all(@attributes[:username], event.user.name) do |a, e|
|
44
|
+
if a.is_a? String
|
45
|
+
a == e.to_s
|
46
|
+
else
|
47
|
+
a == e
|
48
|
+
end
|
49
|
+
end
|
50
|
+
].reduce(true, &:&)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Specialized subclasses
|
55
|
+
# Member joins
|
56
|
+
class GuildMemberAddEvent < GuildMemberEvent; end
|
57
|
+
class GuildMemberAddEventHandler < GuildMemberEventHandler; end
|
58
|
+
|
59
|
+
# Member is updated (e.g. name changed)
|
60
|
+
class GuildMemberUpdateEvent < GuildMemberEvent; end
|
61
|
+
class GuildMemberUpdateEventHandler < GuildMemberEventHandler; end
|
62
|
+
|
63
|
+
# Member leaves
|
64
|
+
class GuildMemberDeleteEvent < GuildMemberEvent
|
65
|
+
# Overide init_user to account for the deleted user on the server
|
66
|
+
def init_user(data, bot)
|
67
|
+
@user = Discordrb::User.new(data['user'], bot)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
class GuildMemberDeleteEventHandler < GuildMemberEventHandler; end
|
71
|
+
end
|
data/lib/discordrb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discordrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- meew0
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faye-websocket
|
@@ -102,20 +102,22 @@ files:
|
|
102
102
|
- examples/pm.rb
|
103
103
|
- lib/discordrb.rb
|
104
104
|
- lib/discordrb/api.rb
|
105
|
+
- lib/discordrb/await.rb
|
105
106
|
- lib/discordrb/bot.rb
|
106
107
|
- lib/discordrb/commands/command_bot.rb
|
107
108
|
- lib/discordrb/commands/events.rb
|
108
109
|
- lib/discordrb/commands/parser.rb
|
109
110
|
- lib/discordrb/data.rb
|
111
|
+
- lib/discordrb/events/await.rb
|
110
112
|
- lib/discordrb/events/channel_create.rb
|
111
113
|
- lib/discordrb/events/channel_delete.rb
|
112
114
|
- lib/discordrb/events/channel_update.rb
|
113
115
|
- lib/discordrb/events/generic.rb
|
114
|
-
- lib/discordrb/events/guild_member_update.rb
|
115
116
|
- lib/discordrb/events/guild_role_create.rb
|
116
117
|
- lib/discordrb/events/guild_role_delete.rb
|
117
118
|
- lib/discordrb/events/guild_role_update.rb
|
118
119
|
- lib/discordrb/events/lifetime.rb
|
120
|
+
- lib/discordrb/events/members.rb
|
119
121
|
- lib/discordrb/events/message.rb
|
120
122
|
- lib/discordrb/events/presence.rb
|
121
123
|
- lib/discordrb/events/typing.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'discordrb/events/generic'
|
2
|
-
require 'discordrb/data'
|
3
|
-
|
4
|
-
module Discordrb::Events
|
5
|
-
# Raised when a user updates on a server (e.g. new name)
|
6
|
-
class GuildMemberUpdateEvent
|
7
|
-
attr_reader :user
|
8
|
-
attr_reader :roles
|
9
|
-
attr_reader :server
|
10
|
-
|
11
|
-
def initialize(data, bot)
|
12
|
-
@server = bot.server(data['guild_id'].to_i)
|
13
|
-
return unless @server
|
14
|
-
|
15
|
-
user_id = data['user']['id'].to_i
|
16
|
-
@user = @server.members.find { |u| u.id == user_id }
|
17
|
-
@roles = []
|
18
|
-
data['roles'].each do |element|
|
19
|
-
role_id = element.to_i
|
20
|
-
@roles << @server.roles.find { |r| r.id == role_id }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Event handler for GuildMemberUpdateEvent
|
26
|
-
class GuildMemberUpdateHandler < EventHandler
|
27
|
-
def matches?(event)
|
28
|
-
# Check for the proper event type
|
29
|
-
return false unless event.is_a? GuildMemberUpdateEvent
|
30
|
-
|
31
|
-
[
|
32
|
-
matches_all(@attributes[:name], event.name) do |a, e|
|
33
|
-
if a.is_a? String
|
34
|
-
a == e.to_s
|
35
|
-
else
|
36
|
-
a == e
|
37
|
-
end
|
38
|
-
end
|
39
|
-
].reduce(true, &:&)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|