discordrb 1.2.0 → 1.3.0
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/.gitignore +9 -9
- data/.travis.yml +4 -4
- data/Gemfile +4 -4
- data/LICENSE.txt +21 -21
- data/README.md +78 -78
- data/Rakefile +4 -4
- data/bin/console +14 -14
- data/bin/setup +7 -7
- data/discordrb.gemspec +28 -28
- data/examples/ping.rb +11 -11
- data/examples/pm.rb +11 -11
- data/lib/discordrb.rb +7 -6
- data/lib/discordrb/bot.rb +550 -525
- data/lib/discordrb/commands/command-bot.rb +135 -0
- data/lib/discordrb/commands/parser.rb +210 -0
- data/lib/discordrb/data.rb +341 -391
- data/lib/discordrb/endpoints/endpoints.rb +16 -16
- data/lib/discordrb/events/channel-delete.rb +48 -48
- data/lib/discordrb/events/channel-update.rb +49 -49
- data/lib/discordrb/events/generic.rb +59 -59
- data/lib/discordrb/events/guild-member-update.rb +40 -40
- data/lib/discordrb/events/guild-role-create.rb +34 -34
- data/lib/discordrb/events/guild-role-delete.rb +35 -35
- data/lib/discordrb/events/guild-role-update.rb +34 -34
- data/lib/discordrb/events/lifetime.rb +9 -9
- data/lib/discordrb/events/message.rb +60 -59
- data/lib/discordrb/events/presence.rb +40 -40
- data/lib/discordrb/events/typing.rb +45 -45
- data/lib/discordrb/events/voice-state-update.rb +89 -89
- data/lib/discordrb/exceptions.rb +10 -10
- data/lib/discordrb/permissions.rb +46 -0
- data/lib/discordrb/version.rb +3 -3
- metadata +5 -2
@@ -1,16 +1,16 @@
|
|
1
|
-
module Discordrb::Endpoints
|
2
|
-
BASE = "https://discordapp.com/"
|
3
|
-
APIBASE = BASE + "api"
|
4
|
-
|
5
|
-
#WEBSOCKET_HUB = "wss://discordapp.com/hub"
|
6
|
-
GATEWAY = APIBASE + "/gateway"
|
7
|
-
|
8
|
-
LOGIN = APIBASE + "/auth/login"
|
9
|
-
LOGOUT = APIBASE + "/auth/logout"
|
10
|
-
|
11
|
-
SERVERS = APIBASE + "/guilds"
|
12
|
-
|
13
|
-
CHANNELS = APIBASE + "/channels"
|
14
|
-
|
15
|
-
USERS = APIBASE + "/users"
|
16
|
-
end
|
1
|
+
module Discordrb::Endpoints
|
2
|
+
BASE = "https://discordapp.com/"
|
3
|
+
APIBASE = BASE + "api"
|
4
|
+
|
5
|
+
#WEBSOCKET_HUB = "wss://discordapp.com/hub"
|
6
|
+
GATEWAY = APIBASE + "/gateway"
|
7
|
+
|
8
|
+
LOGIN = APIBASE + "/auth/login"
|
9
|
+
LOGOUT = APIBASE + "/auth/logout"
|
10
|
+
|
11
|
+
SERVERS = APIBASE + "/guilds"
|
12
|
+
|
13
|
+
CHANNELS = APIBASE + "/channels"
|
14
|
+
|
15
|
+
USERS = APIBASE + "/users"
|
16
|
+
end
|
@@ -1,48 +1,48 @@
|
|
1
|
-
require 'discordrb/events/generic'
|
2
|
-
require 'discordrb/data'
|
3
|
-
|
4
|
-
module Discordrb::Events
|
5
|
-
class ChannelDeleteEvent
|
6
|
-
attr_reader :type
|
7
|
-
attr_reader :topic
|
8
|
-
attr_reader :position
|
9
|
-
attr_reader :name
|
10
|
-
attr_reader :is_private
|
11
|
-
attr_reader :id
|
12
|
-
attr_reader :server
|
13
|
-
|
14
|
-
def initialize(data, bot)
|
15
|
-
@type = data['type']
|
16
|
-
@topic = data['topic']
|
17
|
-
@position = data['position']
|
18
|
-
@name = data['name']
|
19
|
-
@is_private = data['is_private']
|
20
|
-
@id = data['id'].to_i
|
21
|
-
@server = bot.server(data['guild_id'].to_i)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class ChannelDeleteEventHandler < EventHandler
|
26
|
-
def matches?(event)
|
27
|
-
# Check for the proper event type
|
28
|
-
return false unless event.is_a? ChannelDeleteEvent
|
29
|
-
|
30
|
-
return [
|
31
|
-
matches_all(@attributes[:type], event.type) do |a,e|
|
32
|
-
if a.is_a? String
|
33
|
-
a == e.name
|
34
|
-
else
|
35
|
-
a == e
|
36
|
-
end
|
37
|
-
end,
|
38
|
-
matches_all(@attributes[:name], event.name) do |a,e|
|
39
|
-
if a.is_a? String
|
40
|
-
a == e.to_s
|
41
|
-
else
|
42
|
-
a == e
|
43
|
-
end
|
44
|
-
end
|
45
|
-
].reduce(true, &:&)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/data'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
class ChannelDeleteEvent
|
6
|
+
attr_reader :type
|
7
|
+
attr_reader :topic
|
8
|
+
attr_reader :position
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :is_private
|
11
|
+
attr_reader :id
|
12
|
+
attr_reader :server
|
13
|
+
|
14
|
+
def initialize(data, bot)
|
15
|
+
@type = data['type']
|
16
|
+
@topic = data['topic']
|
17
|
+
@position = data['position']
|
18
|
+
@name = data['name']
|
19
|
+
@is_private = data['is_private']
|
20
|
+
@id = data['id'].to_i
|
21
|
+
@server = bot.server(data['guild_id'].to_i)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ChannelDeleteEventHandler < EventHandler
|
26
|
+
def matches?(event)
|
27
|
+
# Check for the proper event type
|
28
|
+
return false unless event.is_a? ChannelDeleteEvent
|
29
|
+
|
30
|
+
return [
|
31
|
+
matches_all(@attributes[:type], event.type) do |a,e|
|
32
|
+
if a.is_a? String
|
33
|
+
a == e.name
|
34
|
+
else
|
35
|
+
a == e
|
36
|
+
end
|
37
|
+
end,
|
38
|
+
matches_all(@attributes[:name], event.name) do |a,e|
|
39
|
+
if a.is_a? String
|
40
|
+
a == e.to_s
|
41
|
+
else
|
42
|
+
a == e
|
43
|
+
end
|
44
|
+
end
|
45
|
+
].reduce(true, &:&)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,49 +1,49 @@
|
|
1
|
-
require 'discordrb/events/generic'
|
2
|
-
require 'discordrb/data'
|
3
|
-
|
4
|
-
module Discordrb::Events
|
5
|
-
class ChannelUpdateEvent
|
6
|
-
attr_reader :type
|
7
|
-
attr_reader :topic
|
8
|
-
attr_reader :position
|
9
|
-
attr_reader :name
|
10
|
-
attr_reader :is_private
|
11
|
-
attr_reader :channel
|
12
|
-
attr_reader :server
|
13
|
-
|
14
|
-
def initialize(data, bot)
|
15
|
-
@type = data['type']
|
16
|
-
@topic = data['topic']
|
17
|
-
@position = data['position']
|
18
|
-
@name = data['name']
|
19
|
-
@is_private = data['is_private']
|
20
|
-
@server = bot.server(data['guild_id'].to_i)
|
21
|
-
return if !@server
|
22
|
-
@channel = bot.channel(data['id'].to_i)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class ChannelUpdateEventHandler < EventHandler
|
27
|
-
def matches?(event)
|
28
|
-
# Check for the proper event type
|
29
|
-
return false unless event.is_a? ChannelUpdateEvent
|
30
|
-
|
31
|
-
return [
|
32
|
-
matches_all(@attributes[:type], event.type) do |a,e|
|
33
|
-
if a.is_a? String
|
34
|
-
a == e.name
|
35
|
-
else
|
36
|
-
a == e
|
37
|
-
end
|
38
|
-
end,
|
39
|
-
matches_all(@attributes[:name], event.name) do |a,e|
|
40
|
-
if a.is_a? String
|
41
|
-
a == e.to_s
|
42
|
-
else
|
43
|
-
a == e
|
44
|
-
end
|
45
|
-
end
|
46
|
-
].reduce(true, &:&)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/data'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
class ChannelUpdateEvent
|
6
|
+
attr_reader :type
|
7
|
+
attr_reader :topic
|
8
|
+
attr_reader :position
|
9
|
+
attr_reader :name
|
10
|
+
attr_reader :is_private
|
11
|
+
attr_reader :channel
|
12
|
+
attr_reader :server
|
13
|
+
|
14
|
+
def initialize(data, bot)
|
15
|
+
@type = data['type']
|
16
|
+
@topic = data['topic']
|
17
|
+
@position = data['position']
|
18
|
+
@name = data['name']
|
19
|
+
@is_private = data['is_private']
|
20
|
+
@server = bot.server(data['guild_id'].to_i)
|
21
|
+
return if !@server
|
22
|
+
@channel = bot.channel(data['id'].to_i)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class ChannelUpdateEventHandler < EventHandler
|
27
|
+
def matches?(event)
|
28
|
+
# Check for the proper event type
|
29
|
+
return false unless event.is_a? ChannelUpdateEvent
|
30
|
+
|
31
|
+
return [
|
32
|
+
matches_all(@attributes[:type], event.type) do |a,e|
|
33
|
+
if a.is_a? String
|
34
|
+
a == e.name
|
35
|
+
else
|
36
|
+
a == e
|
37
|
+
end
|
38
|
+
end,
|
39
|
+
matches_all(@attributes[:name], event.name) do |a,e|
|
40
|
+
if a.is_a? String
|
41
|
+
a == e.to_s
|
42
|
+
else
|
43
|
+
a == e
|
44
|
+
end
|
45
|
+
end
|
46
|
+
].reduce(true, &:&)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -1,59 +1,59 @@
|
|
1
|
-
require 'active_support/core_ext/module'
|
2
|
-
|
3
|
-
module Discordrb::Events
|
4
|
-
class Negated
|
5
|
-
attr_reader :object
|
6
|
-
def initialize(object); @object = object; end
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.matches_all(attributes, to_check, &block)
|
10
|
-
# "Zeroth" case: attributes is nil
|
11
|
-
return true unless attributes
|
12
|
-
|
13
|
-
# First case: there's a single negated attribute
|
14
|
-
if attributes.is_a? Negated
|
15
|
-
# The contained object might also be an array, so recursively call matches_all (and negate the result)
|
16
|
-
return !matches_all(attributes.object, to_check, &block)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Second case: there's a single, not-negated attribute
|
20
|
-
unless attributes.is_a? Array
|
21
|
-
return yield(attributes, to_check)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Third case: it's an array of attributes
|
25
|
-
attributes.reduce(false) do |result, element|
|
26
|
-
result || yield(element, to_check)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class EventHandler
|
31
|
-
def initialize(attributes, block)
|
32
|
-
@attributes = attributes
|
33
|
-
@block = block
|
34
|
-
end
|
35
|
-
|
36
|
-
def matches?(event)
|
37
|
-
raise "Attempted to call matches?() from a generic EventHandler"
|
38
|
-
end
|
39
|
-
|
40
|
-
def match(event)
|
41
|
-
@block.call(event) if matches? event
|
42
|
-
end
|
43
|
-
|
44
|
-
def matches_all(attributes, to_check, &block)
|
45
|
-
Discordrb::Events.matches_all(attributes, to_check, &block)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Event handler that matches all events
|
50
|
-
class TrueEventHandler < EventHandler
|
51
|
-
def matches?(event)
|
52
|
-
true
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def not!(object)
|
58
|
-
Discordrb::Events::Negated.new(object)
|
59
|
-
end
|
1
|
+
require 'active_support/core_ext/module'
|
2
|
+
|
3
|
+
module Discordrb::Events
|
4
|
+
class Negated
|
5
|
+
attr_reader :object
|
6
|
+
def initialize(object); @object = object; end
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.matches_all(attributes, to_check, &block)
|
10
|
+
# "Zeroth" case: attributes is nil
|
11
|
+
return true unless attributes
|
12
|
+
|
13
|
+
# First case: there's a single negated attribute
|
14
|
+
if attributes.is_a? Negated
|
15
|
+
# The contained object might also be an array, so recursively call matches_all (and negate the result)
|
16
|
+
return !matches_all(attributes.object, to_check, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Second case: there's a single, not-negated attribute
|
20
|
+
unless attributes.is_a? Array
|
21
|
+
return yield(attributes, to_check)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Third case: it's an array of attributes
|
25
|
+
attributes.reduce(false) do |result, element|
|
26
|
+
result || yield(element, to_check)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class EventHandler
|
31
|
+
def initialize(attributes, block)
|
32
|
+
@attributes = attributes
|
33
|
+
@block = block
|
34
|
+
end
|
35
|
+
|
36
|
+
def matches?(event)
|
37
|
+
raise "Attempted to call matches?() from a generic EventHandler"
|
38
|
+
end
|
39
|
+
|
40
|
+
def match(event)
|
41
|
+
@block.call(event) if matches? event
|
42
|
+
end
|
43
|
+
|
44
|
+
def matches_all(attributes, to_check, &block)
|
45
|
+
Discordrb::Events.matches_all(attributes, to_check, &block)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Event handler that matches all events
|
50
|
+
class TrueEventHandler < EventHandler
|
51
|
+
def matches?(event)
|
52
|
+
true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def not!(object)
|
58
|
+
Discordrb::Events::Negated.new(object)
|
59
|
+
end
|
@@ -1,40 +1,40 @@
|
|
1
|
-
require 'discordrb/events/generic'
|
2
|
-
require 'discordrb/data'
|
3
|
-
|
4
|
-
module Discordrb::Events
|
5
|
-
class GuildMemberUpdateEvent
|
6
|
-
attr_reader :user
|
7
|
-
attr_reader :roles
|
8
|
-
attr_reader :server
|
9
|
-
|
10
|
-
def initialize(data, bot)
|
11
|
-
@server = bot.server(data['guild_id'].to_i)
|
12
|
-
return if !@server
|
13
|
-
|
14
|
-
user_id = data['user']['id'].to_i
|
15
|
-
@user = @server.members.find {|u| u.id == user_id}
|
16
|
-
@roles = []
|
17
|
-
data['roles'].each do |element|
|
18
|
-
role_id = element.to_i
|
19
|
-
@roles << @server.roles.find {|r| r.id == role_id}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class GuildMemberUpdateHandler < EventHandler
|
25
|
-
def matches?(event)
|
26
|
-
# Check for the proper event type
|
27
|
-
return false unless event.is_a? GuildMemberUpdateEvent
|
28
|
-
|
29
|
-
return [
|
30
|
-
matches_all(@attributes[:name], event.name) do |a,e|
|
31
|
-
if a.is_a? String
|
32
|
-
a == e.to_s
|
33
|
-
else
|
34
|
-
a == e
|
35
|
-
end
|
36
|
-
end
|
37
|
-
].reduce(true, &:&)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/data'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
class GuildMemberUpdateEvent
|
6
|
+
attr_reader :user
|
7
|
+
attr_reader :roles
|
8
|
+
attr_reader :server
|
9
|
+
|
10
|
+
def initialize(data, bot)
|
11
|
+
@server = bot.server(data['guild_id'].to_i)
|
12
|
+
return if !@server
|
13
|
+
|
14
|
+
user_id = data['user']['id'].to_i
|
15
|
+
@user = @server.members.find {|u| u.id == user_id}
|
16
|
+
@roles = []
|
17
|
+
data['roles'].each do |element|
|
18
|
+
role_id = element.to_i
|
19
|
+
@roles << @server.roles.find {|r| r.id == role_id}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class GuildMemberUpdateHandler < EventHandler
|
25
|
+
def matches?(event)
|
26
|
+
# Check for the proper event type
|
27
|
+
return false unless event.is_a? GuildMemberUpdateEvent
|
28
|
+
|
29
|
+
return [
|
30
|
+
matches_all(@attributes[:name], event.name) do |a,e|
|
31
|
+
if a.is_a? String
|
32
|
+
a == e.to_s
|
33
|
+
else
|
34
|
+
a == e
|
35
|
+
end
|
36
|
+
end
|
37
|
+
].reduce(true, &:&)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,34 +1,34 @@
|
|
1
|
-
require 'discordrb/events/generic'
|
2
|
-
require 'discordrb/data'
|
3
|
-
|
4
|
-
module Discordrb::Events
|
5
|
-
class GuildRoleCreateEvent
|
6
|
-
attr_reader :role
|
7
|
-
attr_reader :server
|
8
|
-
|
9
|
-
def initialize(data, bot)
|
10
|
-
@server = bot.server(data['guild_id'].to_i)
|
11
|
-
return if !@server
|
12
|
-
|
13
|
-
role_id = data['role']['id'].to_i
|
14
|
-
@role = @server.roles.find {|r| r.id == role_id}
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class GuildRoleCreateEventHandler < EventHandler
|
19
|
-
def matches?(event)
|
20
|
-
# Check for the proper event type
|
21
|
-
return false unless event.is_a? GuildRoleCreateEvent
|
22
|
-
|
23
|
-
return [
|
24
|
-
matches_all(@attributes[:name], event.name) do |a,e|
|
25
|
-
if a.is_a? String
|
26
|
-
a == e.to_s
|
27
|
-
else
|
28
|
-
a == e
|
29
|
-
end
|
30
|
-
end
|
31
|
-
].reduce(true, &:&)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
1
|
+
require 'discordrb/events/generic'
|
2
|
+
require 'discordrb/data'
|
3
|
+
|
4
|
+
module Discordrb::Events
|
5
|
+
class GuildRoleCreateEvent
|
6
|
+
attr_reader :role
|
7
|
+
attr_reader :server
|
8
|
+
|
9
|
+
def initialize(data, bot)
|
10
|
+
@server = bot.server(data['guild_id'].to_i)
|
11
|
+
return if !@server
|
12
|
+
|
13
|
+
role_id = data['role']['id'].to_i
|
14
|
+
@role = @server.roles.find {|r| r.id == role_id}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class GuildRoleCreateEventHandler < EventHandler
|
19
|
+
def matches?(event)
|
20
|
+
# Check for the proper event type
|
21
|
+
return false unless event.is_a? GuildRoleCreateEvent
|
22
|
+
|
23
|
+
return [
|
24
|
+
matches_all(@attributes[:name], event.name) do |a,e|
|
25
|
+
if a.is_a? String
|
26
|
+
a == e.to_s
|
27
|
+
else
|
28
|
+
a == e
|
29
|
+
end
|
30
|
+
end
|
31
|
+
].reduce(true, &:&)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|