discorb 0.0.1

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 (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