mij-discord 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE +21 -0
  6. data/README.md +35 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +7 -0
  9. data/bin/setup +6 -0
  10. data/lib/mij-discord.rb +56 -0
  11. data/lib/mij-discord/bot.rb +579 -0
  12. data/lib/mij-discord/cache.rb +298 -0
  13. data/lib/mij-discord/core/api.rb +228 -0
  14. data/lib/mij-discord/core/api/channel.rb +416 -0
  15. data/lib/mij-discord/core/api/invite.rb +43 -0
  16. data/lib/mij-discord/core/api/server.rb +465 -0
  17. data/lib/mij-discord/core/api/user.rb +144 -0
  18. data/lib/mij-discord/core/errors.rb +106 -0
  19. data/lib/mij-discord/core/gateway.rb +505 -0
  20. data/lib/mij-discord/data.rb +65 -0
  21. data/lib/mij-discord/data/application.rb +38 -0
  22. data/lib/mij-discord/data/channel.rb +404 -0
  23. data/lib/mij-discord/data/embed.rb +115 -0
  24. data/lib/mij-discord/data/emoji.rb +62 -0
  25. data/lib/mij-discord/data/invite.rb +87 -0
  26. data/lib/mij-discord/data/member.rb +174 -0
  27. data/lib/mij-discord/data/message.rb +206 -0
  28. data/lib/mij-discord/data/permissions.rb +121 -0
  29. data/lib/mij-discord/data/role.rb +99 -0
  30. data/lib/mij-discord/data/server.rb +359 -0
  31. data/lib/mij-discord/data/user.rb +173 -0
  32. data/lib/mij-discord/data/voice.rb +68 -0
  33. data/lib/mij-discord/events.rb +133 -0
  34. data/lib/mij-discord/events/basic.rb +80 -0
  35. data/lib/mij-discord/events/channel.rb +50 -0
  36. data/lib/mij-discord/events/member.rb +66 -0
  37. data/lib/mij-discord/events/message.rb +150 -0
  38. data/lib/mij-discord/events/server.rb +102 -0
  39. data/lib/mij-discord/logger.rb +20 -0
  40. data/lib/mij-discord/version.rb +5 -0
  41. data/mij-discord.gemspec +31 -0
  42. metadata +154 -0
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord::Events
4
+ class Channel < Generic
5
+ attr_reader :channel
6
+
7
+ delegate_method :name, :server, :type, :owner, :nsfw?, :text?, :pm?, :voice?, :group?, to: :channel
8
+
9
+ filter_match(:type, on: Symbol, cmp: :eql?)
10
+
11
+ filter_match(:channel, field: [:channel, :name], on: [String, Regexp], cmp: :case)
12
+ filter_match(:channel, on: :id_obj, cmp: :eql?)
13
+
14
+ filter_match(:server, field: [:server, :name], on: [String, Regexp], cmp: :case)
15
+ filter_match(:server, on: :id_obj, cmp: :eql?)
16
+
17
+ filter_match(:owner, field: [:owner, :name], on: [String, Regexp], cmp: :case)
18
+ filter_match(:owner, on: :id_obj, cmp: :eql?)
19
+
20
+ def initialize(bot, channel)
21
+ super(bot)
22
+
23
+ @channel = channel
24
+ end
25
+ end
26
+
27
+ class CreateChannel < Channel; end
28
+
29
+ class UpdateChannel < Channel; end
30
+
31
+ class DeleteChannel < Channel; end
32
+
33
+ class Recipient < Channel
34
+ attr_reader :recipient
35
+ alias_method :user, :recipient
36
+
37
+ filter_match(:user, field: [:user, :name], on: [String, Regexp], cmp: :case)
38
+ filter_match(:user, on: :id_obj, cmp: :eql?)
39
+
40
+ def initialize(bot, channel, recipient)
41
+ super(bot, channel)
42
+
43
+ @recipient = recipient
44
+ end
45
+ end
46
+
47
+ class AddRecipient < Recipient; end
48
+
49
+ class RemoveRecipient < Recipient; end
50
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord::Events
4
+ class Role < Server
5
+ attr_reader :role
6
+
7
+ filter_match(:role, field: [:role, :name], on: [String, Regexp], cmp: :case)
8
+ filter_match(:role, on: :id_obj, cmp: :eql?)
9
+
10
+ def initialize(bot, server, role)
11
+ super(bot, server)
12
+
13
+ @role = role
14
+ end
15
+ end
16
+
17
+ class CreateRole < Role; end
18
+
19
+ class UpdateRole < Role; end
20
+
21
+ class DeleteRole < Role; end
22
+
23
+ # class DeleteRole < Server
24
+ # attr_reader :id
25
+ #
26
+ # filter_match(:role, field: :id, on: :id_obj) {|x,k| x == k.to_id }
27
+ #
28
+ # def initialize(bot, server, data)
29
+ # super(bot, server)
30
+ #
31
+ # @id = data['id'].to_i
32
+ # end
33
+ # end
34
+
35
+ class Member < Server
36
+ attr_reader :user
37
+ alias_method :member, :user
38
+
39
+ filter_match(:user, field: [:user, :name], on: [String, Regexp], cmp: :case)
40
+ filter_match(:user, on: :id_obj, cmp: :eql?)
41
+
42
+ def initialize(bot, user, server = nil)
43
+ super(bot, server || user.server)
44
+
45
+ @user = user
46
+ end
47
+ end
48
+
49
+ class CreateMember < Member; end
50
+
51
+ class UpdateMember < Member; end
52
+
53
+ class DeleteMember < Member; end
54
+
55
+ class UpdateVoiceState < Member
56
+ attr_reader :state
57
+
58
+ delegate_method :mute?, :deaf?, :self_mute?, :self_deaf?, :voice_channel, to: :state
59
+
60
+ def initialize(bot, user, state)
61
+ super(bot, user)
62
+
63
+ @state = state
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord::Events
4
+ class Message < Generic
5
+ attr_reader :message
6
+
7
+ delegate_method :author, :user, :channel, :content, :text, :timestamp, to: :message
8
+
9
+ delegate_method :server, to: :channel
10
+
11
+ filter_match(:message, on: :id_obj, cmp: :eql?)
12
+
13
+ filter_match(:user, field: [:user, :name], on: [String, Regexp], cmp: :case)
14
+ filter_match(:user, on: :id_obj, cmp: :eql?)
15
+
16
+ filter_match(:channel, field: [:channel, :name], on: [String, Regexp], cmp: :case)
17
+ filter_match(:channel, on: :id_obj, cmp: :eql?)
18
+
19
+ filter_match(:server, field: [:server, :name], on: [String, Regexp], cmp: :case)
20
+ filter_match(:server, on: :id_obj, cmp: :eql?)
21
+
22
+ filter_match(:before, field: :timestamp, on: Time) {|x,k| x < k }
23
+ filter_match(:after, field: :timestamp, on: Time) {|x,k| x > k }
24
+
25
+ filter_match(:include, field: :content, on: Regexp, cmp: :case)
26
+ filter_match(:include, field: :content, on: String) {|x,k| x.include?(k) }
27
+
28
+ filter_match(:start_with, field: :content, on: String) {|x,k| x.start_with?(k) }
29
+ filter_match(:end_with, field: :content, on: String) {|x,k| x.end_with?(k) }
30
+
31
+ def initialize(bot, message)
32
+ super(bot)
33
+
34
+ @message = message
35
+ end
36
+ end
37
+
38
+ class CreateMessage < Message; end
39
+
40
+ class ChannelMessage < Message; end
41
+
42
+ class PrivateMessage < Message; end
43
+
44
+ class EditMessage < Message; end
45
+
46
+ class DeleteMessage < Generic
47
+ attr_reader :id
48
+
49
+ attr_reader :channel
50
+
51
+ delegate_method :server, to: :channel
52
+
53
+ filter_match(:message, field: :id, on: :id_obj) {|x,k| x == k.to_id }
54
+
55
+ filter_match(:channel, field: [:channel, :name], on: [String, Regexp], cmp: :case)
56
+ filter_match(:channel, on: :id_obj, cmp: :eql?)
57
+
58
+ filter_match(:server, field: [:server, :name], on: [String, Regexp], cmp: :case)
59
+ filter_match(:server, on: :id_obj, cmp: :eql?)
60
+
61
+ def initialize(bot, data)
62
+ super(bot)
63
+
64
+ @id = data['id'].to_i
65
+ @channel = @bot.channel(data['channel_id'])
66
+ end
67
+ end
68
+
69
+ class StartTyping < Generic
70
+ attr_reader :channel
71
+
72
+ attr_reader :user
73
+ alias_method :author, :user
74
+
75
+ attr_reader :timestamp
76
+
77
+ delegate_method :server, to: :channel
78
+
79
+ filter_match(:user, field: [:user, :name], on: [String, Regexp], cmp: :case)
80
+ filter_match(:user, on: :id_obj, cmp: :eql?)
81
+
82
+ filter_match(:channel, field: [:channel, :name], on: [String, Regexp], cmp: :case)
83
+ filter_match(:channel, on: :id_obj, cmp: :eql?)
84
+
85
+ filter_match(:server, field: [:server, :name], on: [String, Regexp], cmp: :case)
86
+ filter_match(:server, on: :id_obj, cmp: :eql?)
87
+
88
+ filter_match(:before, field: :timestamp, on: Time) {|x,k| x < k }
89
+ filter_match(:after, field: :timestamp, on: Time) {|x,k| x > k }
90
+
91
+ def initialize(bot, data)
92
+ super(bot)
93
+
94
+ @timestamp = Time.at(data['timestamp'].to_i).utc
95
+ @channel = @bot.channel(data['channel_id'])
96
+
97
+ @user = if @channel.pm?
98
+ @channel.recipient
99
+ elsif @channel.group?
100
+ @bot.user(data['user_id'])
101
+ else
102
+ @bot.member(@channel.server, data['user_id'])
103
+ end
104
+ end
105
+ end
106
+
107
+ class Reaction < Generic
108
+ attr_reader :emoji
109
+
110
+ attr_reader :user
111
+
112
+ attr_reader :channel
113
+
114
+ attr_reader :message_id
115
+
116
+ delegate_method :server, to: :channel
117
+
118
+ filter_match(:message, field: :message_id, on: :id_obj) {|x,k| x == k.to_id }
119
+
120
+ filter_match(:emoji, field: [:emoji, :name], on: [String, Regexp], cmp: :case)
121
+ filter_match(:emoji, field: [:emoji, :id], on: :id_obj) {|x,k| x == k.to_id }
122
+
123
+ def initialize(bot, data)
124
+ super(bot)
125
+
126
+ @message_id = data['message_id'].to_i
127
+ @channel = @bot.channel(data['channel_id'])
128
+
129
+ user_id, server = data['user_id'], @channel.server
130
+ @user = server ? server.member(user_id) : @bot.user(user_id) if user_id
131
+
132
+ if (emoji = data['emoji'])
133
+ @emoji = server&.emoji(emoji['id'])
134
+ @emoji ||= MijDiscord::Data::Emoji.new(emoji, @bot, nil)
135
+ end
136
+ end
137
+
138
+ def message
139
+ @channel.message(@message_id)
140
+ end
141
+ end
142
+
143
+ class AddReaction < Reaction; end
144
+
145
+ class RemoveReaction < Reaction; end
146
+
147
+ class ToggleReaction < Reaction; end
148
+
149
+ class ClearReactions < Reaction; end
150
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord::Events
4
+ class Server < Generic
5
+ attr_reader :server
6
+
7
+ filter_match(:server, field: [:server, :name], on: [String, Regexp], cmp: :case)
8
+ filter_match(:server, on: :id_obj, cmp: :eql?)
9
+
10
+ def initialize(bot, server)
11
+ super(bot)
12
+
13
+ @server = server
14
+ end
15
+ end
16
+
17
+ class CreateServer < Server; end
18
+
19
+ class UpdateServer < Server; end
20
+
21
+ class DeleteServer < Server; end
22
+
23
+ # class DeleteServer < Generic
24
+ # attr_reader :id
25
+ #
26
+ # filter_match(:server, field: :id, on: :id_obj) {|x,k| x == k.to_id }
27
+ #
28
+ # def initialize(bot, data)
29
+ # super(bot)
30
+ #
31
+ # @id = data['id'].to_i
32
+ # end
33
+ # end
34
+
35
+ class UpdateEmoji < Server
36
+ attr_reader :added
37
+
38
+ attr_reader :removed
39
+
40
+ delegate_method :emojis, to: :server
41
+
42
+ def initialize(bot, server, old_emoji, new_emoji)
43
+ super(bot, server)
44
+
45
+ @added = new_emoji - old_emoji
46
+ @removed = old_emoji - new_emoji
47
+ end
48
+ end
49
+
50
+ class BanUser < Server
51
+ attr_reader :user
52
+
53
+ filter_match(:user, field: [:user, :name], on: [String, Regexp], cmp: :case)
54
+ filter_match(:user, on: :id_obj, cmp: :eql?)
55
+
56
+ def initialize(bot, server, user)
57
+ super(bot, server)
58
+
59
+ @user = user
60
+ end
61
+ end
62
+
63
+ class UnbanUser < BanUser; end
64
+
65
+ class UpdatePresence < Server
66
+ attr_reader :user
67
+
68
+ attr_reader :status
69
+
70
+ filter_match(:user, on: :id_obj, cmp: :eql?)
71
+ filter_match(:status, on: Symbol, cmp: :eql?)
72
+
73
+ def initialize(bot, data)
74
+ server = @bot.server(data['guild_id'])
75
+ super(bot, server)
76
+
77
+ @status = data['status'].to_sym
78
+ @user = @bot.user(data['user']['id'])
79
+ end
80
+ end
81
+
82
+ class UpdatePlaying < UpdatePresence
83
+ attr_reader :game
84
+
85
+ attr_reader :stream_type
86
+
87
+ attr_reader :stream_url
88
+
89
+ filter_match(:game, on: [String, Regexp], cmp: :case)
90
+ filter_match(:stream_type, on: Integer, cmp: :eql?)
91
+
92
+ def initialize(bot, data)
93
+ super(bot, data)
94
+
95
+ if (game = data['game'])
96
+ @game = game['name']
97
+ @stream_type = game['type']
98
+ @stream_url = game['url']
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord
4
+ LOGGER = Logger.new(STDOUT, level: :error)
5
+
6
+ LOGGER.formatter = proc do |sev, ts, prg, msg|
7
+ time = ts.strftime '%Y-%m-%d %H:%M:%S %z'
8
+ text = case msg
9
+ when Exception
10
+ trace = msg.backtrace.map {|x| "TRACE> #{x}" }
11
+ "#{msg.message} (#{msg.class})\n#{trace.join("\n")}"
12
+ when String
13
+ msg
14
+ else
15
+ msg.inspect
16
+ end
17
+
18
+ "[#{sev}] [#{time}] #{prg.upcase}: #{text}\n"
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MijDiscord
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mij-discord/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'mij-discord'
8
+ spec.version = MijDiscord::VERSION
9
+ spec.authors = ['Mijyuoon']
10
+ spec.email = ['mijyuoon@gmail.com']
11
+
12
+ spec.summary = %q{Discord bot library partially based on Discordrb}
13
+ spec.homepage = 'https://github.com/Mijyuoon/MijDiscord'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_dependency 'rest-client', '~> 2.0'
24
+ spec.add_dependency 'websocket-client-simple', '~> 0.3'
25
+
26
+ spec.required_ruby_version = '>= 2.3.0'
27
+
28
+ spec.add_development_dependency 'bundler', '~> 1.15'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'minitest', '~> 5.0'
31
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mij-discord
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mijyuoon
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: websocket-client-simple
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ description:
84
+ email:
85
+ - mijyuoon@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".travis.yml"
92
+ - Gemfile
93
+ - LICENSE
94
+ - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - lib/mij-discord.rb
99
+ - lib/mij-discord/bot.rb
100
+ - lib/mij-discord/cache.rb
101
+ - lib/mij-discord/core/api.rb
102
+ - lib/mij-discord/core/api/channel.rb
103
+ - lib/mij-discord/core/api/invite.rb
104
+ - lib/mij-discord/core/api/server.rb
105
+ - lib/mij-discord/core/api/user.rb
106
+ - lib/mij-discord/core/errors.rb
107
+ - lib/mij-discord/core/gateway.rb
108
+ - lib/mij-discord/data.rb
109
+ - lib/mij-discord/data/application.rb
110
+ - lib/mij-discord/data/channel.rb
111
+ - lib/mij-discord/data/embed.rb
112
+ - lib/mij-discord/data/emoji.rb
113
+ - lib/mij-discord/data/invite.rb
114
+ - lib/mij-discord/data/member.rb
115
+ - lib/mij-discord/data/message.rb
116
+ - lib/mij-discord/data/permissions.rb
117
+ - lib/mij-discord/data/role.rb
118
+ - lib/mij-discord/data/server.rb
119
+ - lib/mij-discord/data/user.rb
120
+ - lib/mij-discord/data/voice.rb
121
+ - lib/mij-discord/events.rb
122
+ - lib/mij-discord/events/basic.rb
123
+ - lib/mij-discord/events/channel.rb
124
+ - lib/mij-discord/events/member.rb
125
+ - lib/mij-discord/events/message.rb
126
+ - lib/mij-discord/events/server.rb
127
+ - lib/mij-discord/logger.rb
128
+ - lib/mij-discord/version.rb
129
+ - mij-discord.gemspec
130
+ homepage: https://github.com/Mijyuoon/MijDiscord
131
+ licenses:
132
+ - MIT
133
+ metadata: {}
134
+ post_install_message:
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 2.3.0
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubyforge_project:
150
+ rubygems_version: 2.6.11
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: Discord bot library partially based on Discordrb
154
+ test_files: []