discorb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +56 -0
  3. data/.yardopts +6 -0
  4. data/Changelog.md +5 -0
  5. data/Gemfile +23 -0
  6. data/Gemfile.lock +70 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +53 -0
  9. data/Rakefile +46 -0
  10. data/bin/console +15 -0
  11. data/bin/setup +8 -0
  12. data/discorb.gemspec +37 -0
  13. data/docs/Examples.md +26 -0
  14. data/docs/events.md +480 -0
  15. data/docs/voice_events.md +283 -0
  16. data/examples/components/authorization_button.rb +43 -0
  17. data/examples/components/select_menu.rb +61 -0
  18. data/examples/extension/main.rb +12 -0
  19. data/examples/extension/message_expander.rb +41 -0
  20. data/examples/simple/eval.rb +32 -0
  21. data/examples/simple/ping_pong.rb +16 -0
  22. data/examples/simple/rolepanel.rb +65 -0
  23. data/examples/simple/wait_for_message.rb +30 -0
  24. data/lib/discorb/application.rb +157 -0
  25. data/lib/discorb/asset.rb +57 -0
  26. data/lib/discorb/audit_logs.rb +323 -0
  27. data/lib/discorb/channel.rb +1101 -0
  28. data/lib/discorb/client.rb +363 -0
  29. data/lib/discorb/color.rb +173 -0
  30. data/lib/discorb/common.rb +123 -0
  31. data/lib/discorb/components.rb +290 -0
  32. data/lib/discorb/dictionary.rb +119 -0
  33. data/lib/discorb/embed.rb +345 -0
  34. data/lib/discorb/emoji.rb +218 -0
  35. data/lib/discorb/emoji_table.rb +3799 -0
  36. data/lib/discorb/error.rb +98 -0
  37. data/lib/discorb/event.rb +35 -0
  38. data/lib/discorb/extend.rb +18 -0
  39. data/lib/discorb/extension.rb +54 -0
  40. data/lib/discorb/file.rb +69 -0
  41. data/lib/discorb/flag.rb +109 -0
  42. data/lib/discorb/gateway.rb +967 -0
  43. data/lib/discorb/gateway_requests.rb +47 -0
  44. data/lib/discorb/guild.rb +1244 -0
  45. data/lib/discorb/guild_template.rb +211 -0
  46. data/lib/discorb/image.rb +43 -0
  47. data/lib/discorb/integration.rb +111 -0
  48. data/lib/discorb/intents.rb +137 -0
  49. data/lib/discorb/interaction.rb +333 -0
  50. data/lib/discorb/internet.rb +285 -0
  51. data/lib/discorb/invite.rb +145 -0
  52. data/lib/discorb/log.rb +70 -0
  53. data/lib/discorb/member.rb +232 -0
  54. data/lib/discorb/message.rb +583 -0
  55. data/lib/discorb/modules.rb +138 -0
  56. data/lib/discorb/permission.rb +270 -0
  57. data/lib/discorb/presence.rb +308 -0
  58. data/lib/discorb/reaction.rb +48 -0
  59. data/lib/discorb/role.rb +189 -0
  60. data/lib/discorb/sticker.rb +157 -0
  61. data/lib/discorb/user.rb +163 -0
  62. data/lib/discorb/utils.rb +16 -0
  63. data/lib/discorb/voice_state.rb +251 -0
  64. data/lib/discorb/webhook.rb +420 -0
  65. data/lib/discorb.rb +51 -0
  66. metadata +120 -0
@@ -0,0 +1,211 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a guild template.
6
+ #
7
+ class GuildTemplate < DiscordModel
8
+ # @return [String] The code of the template.
9
+ attr_reader :code
10
+ # @return [String] The name of the template.
11
+ attr_reader :name
12
+ # @return [String] The description of the template.
13
+ attr_reader :description
14
+ # @return [Integer] The number of times this template has been used.
15
+ attr_reader :usage_count
16
+ # @return [Discorb::User] The user who created this template.
17
+ attr_reader :creator
18
+ # @return [Time] The time this template was created.
19
+ attr_reader :created_at
20
+ # @return [Time] The time this template was last updated.
21
+ attr_reader :updated_at
22
+ # @return [Discorb::Guild] The guild where the template was created.
23
+ attr_reader :source_guild_id
24
+ # @return [Discorb::GuildTemplate::TemplateGuild] The guild where the template was created.
25
+ attr_reader :serialized_source_guild
26
+ alias content serialized_source_guild
27
+ # @return [Boolean] Whether this template is dirty.
28
+ attr_reader :is_dirty
29
+ alias dirty? is_dirty
30
+
31
+ # @!attribute [r] source_guild
32
+ # @macro client_cache
33
+ # @return [Discorb::Guild] The guild this template is based on.
34
+ # @return [nil] Client wasn't able to find the guild this template is based on.
35
+
36
+ # @!visibility private
37
+ def initialize(client, data)
38
+ @client = client
39
+ _set_data(data)
40
+ end
41
+
42
+ def source_guild
43
+ @client.guilds[@source_guild_id]
44
+ end
45
+
46
+ #
47
+ # Edit the template.
48
+ # @macro async
49
+ # @macro http
50
+ # @macro edit
51
+ #
52
+ # @param [String] name The new name of the template.
53
+ # @param [String] description The new description of the template.
54
+ #
55
+ def edit(name = nil, description = :unset)
56
+ Async do
57
+ payload = {}
58
+ payload[:name] = name if name
59
+ payload[:description] = description if description != :unset
60
+ @client.internet.patch("/guilds/#{@source_guild_id}/templates/#{@code}", payload).wait
61
+ end
62
+ end
63
+
64
+ alias modify edit
65
+
66
+ #
67
+ # Update the template.
68
+ # @macro async
69
+ # @macro http
70
+ #
71
+ def update
72
+ Async do
73
+ _resp, data = @client.internet.put("/guilds/#{@source_guild_id}/templates/#{@code}").wait
74
+ _set_data(data)
75
+ end
76
+ end
77
+
78
+ #
79
+ # Delete the template.
80
+ # @macro async
81
+ # @macro http
82
+ #
83
+ def delete!
84
+ Async do
85
+ @client.internet.delete("/guilds/#{@source_guild_id}/templates/#{@code}").wait
86
+ end
87
+ end
88
+
89
+ alias destroy! delete!
90
+
91
+ #
92
+ # Represents a guild in guild template.
93
+ #
94
+ class TemplateGuild < DiscordModel
95
+ # @return [String] The name of the guild.
96
+ attr_reader :name
97
+ # @return [Integer] The AFK timeout of the guild.
98
+ attr_reader :afk_timeout
99
+ # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Role}] A dictionary of roles in the guild.
100
+ attr_reader :roles
101
+ # @return [Discorb::Guild::SystemChannelFlag] The flag for the system channel.
102
+ attr_reader :system_channel_flags
103
+ # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::GuildChannel}] A dictionary of channels in the guild.
104
+ attr_reader :channels
105
+ # @return [String] The description of the guild.
106
+ attr_reader :description
107
+ # @return [Symbol] The preffered language of the guild.
108
+ # @note This modifies the language code, `-` will be replaced with `_`.
109
+ attr_reader :preferred_locale
110
+ # @return [:none, :low, :medium, :high, :very_high] The verification level of the guild.
111
+ attr_reader :verification_level
112
+ # @return [:all_messages, :only_mentions] The default message notification level of the guild.
113
+ attr_reader :default_message_notifications
114
+ # @return [:disabled_in_text, :members_without_roles, :all_members] The explict content filter level of the guild.
115
+ attr_reader :explicit_content_filter
116
+ # @return [Boolean] Whether the guild enabled the widget.
117
+ attr_reader :widget_enabled
118
+ alias widget_enabled? widget_enabled
119
+
120
+ # @!visibility private
121
+ def initialize(data)
122
+ @name = data[:name]
123
+ @description = data[:description]
124
+ @region = data[:region]
125
+ @verification_level = Discorb::Guild.mfa_levels[data[:verification_level]]
126
+ @default_message_notifications = Discorb::Guild.notification_levels[data[:default_message_notifications]]
127
+ @explicit_content_filter = Discorb::Guild.explicit_content_filter[data[:explicit_content_filter]]
128
+ @preferred_locale = data[:preferred_locale]
129
+ @afk_timeout = data[:afk_timeout]
130
+ @roles = data[:roles].map { |r| Role.new(r) }
131
+ @channels = data[:channels].map { |c| Channel.new(c) }
132
+ @system_channel_flags = Discorb::SystemChannelFlag.new(data[:system_channel_flags])
133
+ end
134
+
135
+ #
136
+ # Represents a role in guild template.
137
+ #
138
+ class Role < DiscordModel
139
+ # @return [String] The name of the role.
140
+ attr_reader :name
141
+ # @return [Discorb::Permission] The permissions of the role.
142
+ attr_reader :permissions
143
+ # @return [Discorb::Color] The color of the role.
144
+ attr_reader :color
145
+
146
+ # @!visibility private
147
+ def initialize(data)
148
+ @name = data[:name]
149
+ @permissions = Permission.new(data[:permissions])
150
+ @color = Color.new(data[:color])
151
+ @hoist = data[:hoist]
152
+ @mentionable = data[:mentionable]
153
+ end
154
+ end
155
+
156
+ #
157
+ # Represents a channel in guild template.
158
+ #
159
+ class Channel < DiscordModel
160
+ # @return [String] The name of the channel.
161
+ attr_reader :name
162
+ # @return [Integer] The position of the channel.
163
+ attr_reader :position
164
+ # @return [String] The type of the channel.
165
+ attr_reader :topic
166
+ # @return [Integer] The bitrate of the channel.
167
+ attr_reader :bitrate
168
+ # @return [Integer] The user limit of the channel.
169
+ attr_reader :user_limit
170
+ # @return [Boolean] Whether the channel is nsfw.
171
+ attr_reader :nsfw
172
+ # @return [Integer] The rate limit of the channel.
173
+ attr_reader :rate_limit_per_user
174
+ # @return [Class] The class of the channel.
175
+ attr_reader :type
176
+
177
+ # @!visibility private
178
+ def initialize(data)
179
+ @name = data[:name]
180
+ @position = data[:position]
181
+ @topic = data[:topic]
182
+ @bitrate = data[:bitrate]
183
+ @user_limit = data[:user_limit]
184
+ @nsfw = data[:nsfw]
185
+ @rate_limit_per_user = data[:rate_limit_per_user]
186
+ @parent_id = data[:parent_id]
187
+ @permission_overwrites = data[:permission_overwrites].map do |ow|
188
+ [Snowflake.new(ow[:id]), PermissionOverwrite.new(ow[:allow], ow[:deny])]
189
+ end.to_h
190
+ @type = Discorb::Channel.descendants.find { |c| c.channel_type == data[:type] }
191
+ end
192
+ end
193
+ end
194
+
195
+ private
196
+
197
+ def _set_data(data)
198
+ @code = data[:code]
199
+ @name = data[:name]
200
+ @description = data[:description]
201
+ @usage_count = data[:usage_count]
202
+ @creator_id = Snowflake.new(data[:creator_id])
203
+ @creator = @client.users[@creator_id] || User.new(@client, data[:creator])
204
+ @created_at = Time.iso8601(data[:created_at])
205
+ @updated_at = Time.iso8601(data[:updated_at])
206
+ @source_guild_id = Snowflake.new(data[:source_guild_id])
207
+ @serialized_source_guild = data[:serialized_source_guild]
208
+ @is_dirty = data[:is_dirty]
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "mime/types"
5
+
6
+ module Discorb
7
+ #
8
+ # Represents an image.
9
+ #
10
+ class Image
11
+ #
12
+ # Initializes a new Image.
13
+ #
14
+ # @param [#read] source The source of the image.
15
+ # @param [String] type The MIME type of the image.
16
+ # @overload
17
+ # @param [String] source The file path of the source.
18
+ # @param [String] type The MIME type of the image.
19
+ #
20
+ def initialize(source, type = nil)
21
+ if source.respond_to?(:read)
22
+ @bytes = source.read
23
+ @type = type || MIME::Types.type_for(source.path).first.content_type
24
+ elsif ::File.exist?(source)
25
+ ::File.open(source, "rb") do |file|
26
+ @bytes = file.read
27
+ end
28
+ @type = MIME::Types.type_for(source).first.to_s
29
+ else
30
+ raise ArgumentError, "Couldn't read file."
31
+ end
32
+ end
33
+
34
+ #
35
+ # Formats the image as a Discord style.
36
+ #
37
+ # @return [String] The image as a Discord style.
38
+ #
39
+ def to_s
40
+ "data:#{@type};base64,#{Base64.strict_encode64(@bytes)}"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a integration.
6
+ #
7
+ class Integration < DiscordModel
8
+ # @return [Discorb::Snowflake] The ID of the integration.
9
+ attr_reader :id
10
+ # @return [Symbol] The type of integration.
11
+ attr_reader :type
12
+ # @return [Boolean] Whether the integration is enabled.
13
+ attr_reader :enabled
14
+ alias enabled? enabled
15
+ # @return [Boolean] Whether the integration is syncing.
16
+ attr_reader :syncing
17
+ alias syncing? syncing
18
+ # @return [Boolean] Whether the integration is enabled emoticons.
19
+ attr_reader :enable_emoticons
20
+ alias enable_emoticons? enable_emoticons
21
+ # @return [:remove_role, :kick] The behavior of the integration when it expires.
22
+ attr_reader :expire_behavior
23
+ # @return [Integer] The grace period of the integration.
24
+ attr_reader :expire_grace_period
25
+ # @return [Discorb::User] The user for the integration.
26
+ attr_reader :user
27
+ # @return [Discorb::Integration::Account] The account for the integration.
28
+ attr_reader :account
29
+ # @return [Integer] The number of subscribers for the integration.
30
+ attr_reader :subscriber_count
31
+ # @return [Boolean] Whether the integration is revoked.
32
+ attr_reader :revoked
33
+ alias revoked? revoked
34
+ # @return [Discorb::Application] The application for the integration.
35
+ attr_reader :application
36
+
37
+ # @!attribute [r] guild
38
+ # @macro client_cache
39
+ # @return [Discorb::Guild] The guild this integration is in.
40
+
41
+ @expire_behavior = {
42
+ 0 => :remove_role,
43
+ 1 => :kick,
44
+ }
45
+
46
+ # @!visibility private
47
+ def initialize(client, data, guild_id, no_cache: false)
48
+ @client = client
49
+ @data = data
50
+ @guild_id = guild_id
51
+ _set_data(data)
52
+ guild.integrations[@id] = self unless no_cache
53
+ end
54
+
55
+ def guild
56
+ @client.guilds[@guild_id]
57
+ end
58
+
59
+ #
60
+ # Delete the integration.
61
+ #
62
+ # @param [String] reason The reason for deleting the integration.
63
+ #
64
+ def delete!(reason: nil)
65
+ Async do
66
+ @client.internet.delete("/guilds/#{@guild}/integrations/#{@id}", reason: reason).wait
67
+ end
68
+ end
69
+
70
+ alias destroy! delete!
71
+
72
+ private
73
+
74
+ def _set_data(data)
75
+ @id = Snowflake.new(data[:id])
76
+ @type = data[:type].to_sym
77
+ @enabled = data[:enabled]
78
+ @syncing = data[:syncing]
79
+ @role_id = Snowflake.new(data[:role_id])
80
+ @enable_emoticons = data[:enable_emoticons]
81
+ @expire_behavior = self.class.expire_behavior[data[:expire_behavior]]
82
+ @expire_grace_period = data[:expire_grace_period]
83
+ @user = client.users[data[:user].to_i]
84
+ @account = Account.new(data[:account])
85
+ @subscriber_count = data[:subscriber_count]
86
+ @revoked = data[:revoked]
87
+ @application = Application.new(@client, data[:application])
88
+ end
89
+
90
+ class << self
91
+ # @!visibility private
92
+ attr_reader :expire_behavior
93
+ end
94
+
95
+ #
96
+ # Represents an account for an integration.
97
+ #
98
+ class Account < DiscordModel
99
+ # @return [String] The ID of the account.
100
+ attr_reader :id
101
+ # @return [String] The name of the account.
102
+ attr_reader :name
103
+
104
+ # @!visibility private
105
+ def initialize(data)
106
+ @id = data[:id]
107
+ @name = data[:name]
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ # Represents intents.
5
+ class Intents
6
+ @intent_bits = {
7
+ guilds: 1 << 0,
8
+ members: 1 << 1,
9
+ bans: 1 << 2,
10
+ emojis: 1 << 3,
11
+ integrations: 1 << 4,
12
+ webhooks: 1 << 5,
13
+ invites: 1 << 6,
14
+ voice_states: 1 << 7,
15
+ presences: 1 << 8,
16
+ messages: 1 << 9,
17
+ reactions: 1 << 10,
18
+ typing: 1 << 11,
19
+ dm_messages: 1 << 12,
20
+ dm_reactions: 1 << 13,
21
+ dm_typing: 1 << 14,
22
+ }.freeze
23
+
24
+ #
25
+ # Create new intents object with default (no members and presence) intents.
26
+ #
27
+ # @param guilds [Boolean] Whether guild related events are enabled.
28
+ # @param members [Boolean] Whether guild members related events are enabled.
29
+ # @note You must enable members intent on developers portal.
30
+ # @param bans [Boolean] Whether guild ban related events are enabled.
31
+ # @param emojis [Boolean] Whether guild emojis related events are enabled.
32
+ # @param integrations [Boolean] Whether guild integration related events are enabled.
33
+ # @param webhooks [Boolean] Whether guild webhooks related events are enabled.
34
+ # @param invites [Boolean] Whether guild invite related events are enabled.
35
+ # @param voice_states [Boolean] Whether guild voice state related events are enabled.
36
+ # @param presences [Boolean] Whether guild presences related events are enabled.
37
+ # @note You must enable members intent on developers portal.
38
+ # @param messages [Boolean] Whether guild messages related events are enabled.
39
+ # @param reactions [Boolean] Whether guild reaction related events are enabled.
40
+ # @param dm_messages [Boolean] Whether dm messages related events are enabled.
41
+ # @param dm_reactions [Boolean] Whether dm reactions related events are enabled.
42
+ # @param dm_typing [Boolean] Whether dm typing related events are enabled.
43
+ #
44
+ def initialize(guilds: true,
45
+ members: false,
46
+ bans: true,
47
+ emojis: true,
48
+ integrations: true,
49
+ webhooks: true,
50
+ invites: true,
51
+ voice_states: true,
52
+ presences: false,
53
+ messages: true,
54
+ reactions: true,
55
+ typing: true,
56
+ dm_messages: true,
57
+ dm_reactions: true,
58
+ dm_typing: true)
59
+ @raw_value = {
60
+ guilds: guilds,
61
+ members: members,
62
+ bans: bans,
63
+ emojis: emojis,
64
+ integrations: integrations,
65
+ webhooks: webhooks,
66
+ invites: invites,
67
+ voice_states: voice_states,
68
+ presences: presences,
69
+ messages: messages,
70
+ reactions: reactions,
71
+ typing: typing,
72
+ dm_messages: dm_messages,
73
+ dm_reactions: dm_reactions,
74
+ dm_typing: dm_typing,
75
+ }
76
+ end
77
+
78
+ def method_missing(name, args = nil)
79
+ if @raw_value.key?(name)
80
+ @raw_value[name]
81
+ elsif name.end_with?("=") && @raw_value.key?(name[0..-2].to_sym)
82
+ raise ArgumentError, "true/false expected" if (!args.is_a? TrueClass) || args.is_a?(FalseClass)
83
+
84
+ @raw_value[name[0..-2].to_sym] = args
85
+ else
86
+ super
87
+ end
88
+ end
89
+
90
+ def respond_to_missing?(sym, include_private)
91
+ @raw_value.key?(name) ? true : super
92
+ end
93
+
94
+ # Returns value of the intent.
95
+ # @return [Integer] The value of the intent.
96
+ def value
97
+ res = 0
98
+ self.class.intent_bits.each do |intent, bit|
99
+ res += bit if @raw_value[intent]
100
+ end
101
+ res
102
+ end
103
+
104
+ def inspect
105
+ "#<#{self.class} value=#{value}>"
106
+ end
107
+
108
+ class << self
109
+ # Create new intent object from raw value.
110
+ # @param value [Integer] The value of the intent.
111
+ def from_value(value)
112
+ raw_value = {}
113
+ @intent_bits.each do |intent, bit|
114
+ raw_value[intent] = value & bit != 0
115
+ end
116
+ new(**raw_value)
117
+ end
118
+
119
+ # Create new intent object with default values.
120
+ def default
121
+ from_value(32_509)
122
+ end
123
+
124
+ # Create new intent object with all intents.
125
+ def all
126
+ from_value(32_767)
127
+ end
128
+
129
+ # Create new intent object with no intents.
130
+ def none
131
+ from_value(0)
132
+ end
133
+
134
+ attr_reader :intent_bits
135
+ end
136
+ end
137
+ end