discorb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +56 -0
- data/.yardopts +6 -0
- data/Changelog.md +5 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +70 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/Rakefile +46 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/discorb.gemspec +37 -0
- data/docs/Examples.md +26 -0
- data/docs/events.md +480 -0
- data/docs/voice_events.md +283 -0
- data/examples/components/authorization_button.rb +43 -0
- data/examples/components/select_menu.rb +61 -0
- data/examples/extension/main.rb +12 -0
- data/examples/extension/message_expander.rb +41 -0
- data/examples/simple/eval.rb +32 -0
- data/examples/simple/ping_pong.rb +16 -0
- data/examples/simple/rolepanel.rb +65 -0
- data/examples/simple/wait_for_message.rb +30 -0
- data/lib/discorb/application.rb +157 -0
- data/lib/discorb/asset.rb +57 -0
- data/lib/discorb/audit_logs.rb +323 -0
- data/lib/discorb/channel.rb +1101 -0
- data/lib/discorb/client.rb +363 -0
- data/lib/discorb/color.rb +173 -0
- data/lib/discorb/common.rb +123 -0
- data/lib/discorb/components.rb +290 -0
- data/lib/discorb/dictionary.rb +119 -0
- data/lib/discorb/embed.rb +345 -0
- data/lib/discorb/emoji.rb +218 -0
- data/lib/discorb/emoji_table.rb +3799 -0
- data/lib/discorb/error.rb +98 -0
- data/lib/discorb/event.rb +35 -0
- data/lib/discorb/extend.rb +18 -0
- data/lib/discorb/extension.rb +54 -0
- data/lib/discorb/file.rb +69 -0
- data/lib/discorb/flag.rb +109 -0
- data/lib/discorb/gateway.rb +967 -0
- data/lib/discorb/gateway_requests.rb +47 -0
- data/lib/discorb/guild.rb +1244 -0
- data/lib/discorb/guild_template.rb +211 -0
- data/lib/discorb/image.rb +43 -0
- data/lib/discorb/integration.rb +111 -0
- data/lib/discorb/intents.rb +137 -0
- data/lib/discorb/interaction.rb +333 -0
- data/lib/discorb/internet.rb +285 -0
- data/lib/discorb/invite.rb +145 -0
- data/lib/discorb/log.rb +70 -0
- data/lib/discorb/member.rb +232 -0
- data/lib/discorb/message.rb +583 -0
- data/lib/discorb/modules.rb +138 -0
- data/lib/discorb/permission.rb +270 -0
- data/lib/discorb/presence.rb +308 -0
- data/lib/discorb/reaction.rb +48 -0
- data/lib/discorb/role.rb +189 -0
- data/lib/discorb/sticker.rb +157 -0
- data/lib/discorb/user.rb +163 -0
- data/lib/discorb/utils.rb +16 -0
- data/lib/discorb/voice_state.rb +251 -0
- data/lib/discorb/webhook.rb +420 -0
- data/lib/discorb.rb +51 -0
- metadata +120 -0
@@ -0,0 +1,363 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
require "logger"
|
5
|
+
|
6
|
+
require "async"
|
7
|
+
require "async/websocket/client"
|
8
|
+
|
9
|
+
module Discorb
|
10
|
+
#
|
11
|
+
# Class for connecting to the Discord server.
|
12
|
+
#
|
13
|
+
class Client
|
14
|
+
# @return [Discorb::Intents] The intents that the client is currently using.
|
15
|
+
attr_accessor :intents
|
16
|
+
# @return [Discorb::Application] The application that the client is using.
|
17
|
+
# @return [nil] If never fetched application by {#fetch_application}.
|
18
|
+
attr_reader :application
|
19
|
+
# @return [Discorb::Internet] The internet client.
|
20
|
+
attr_reader :internet
|
21
|
+
# @return [Integer] The heartbeat interval.
|
22
|
+
attr_reader :heartbeat_interval
|
23
|
+
# @return [Integer] The API version of the Discord gateway.
|
24
|
+
# @return [nil] If not connected to the gateway.
|
25
|
+
attr_reader :api_version
|
26
|
+
# @return [String] The token of the client.
|
27
|
+
attr_reader :token
|
28
|
+
# @return [Discorb::AllowedMentions] The allowed mentions that the client is using.
|
29
|
+
attr_reader :allowed_mentions
|
30
|
+
# @return [Discorb::ClientUser] The client user.
|
31
|
+
attr_reader :user
|
32
|
+
# @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Guild}] A dictionary of guilds.
|
33
|
+
attr_reader :guilds
|
34
|
+
# @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::User}] A dictionary of users.
|
35
|
+
attr_reader :users
|
36
|
+
# @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Channel}] A dictionary of channels.
|
37
|
+
attr_reader :channels
|
38
|
+
# @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Emoji}] A dictionary of emojis.
|
39
|
+
attr_reader :emojis
|
40
|
+
# @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Message}] A dictionary of messages.
|
41
|
+
attr_reader :messages
|
42
|
+
# @return [Discorb::Logger] The logger.
|
43
|
+
attr_reader :log
|
44
|
+
|
45
|
+
#
|
46
|
+
# Initializes a new client.
|
47
|
+
#
|
48
|
+
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions that the client is using.
|
49
|
+
# @param [Discorb::Intents] intents The intents that the client is currently using.
|
50
|
+
# @param [Integer] message_caches The number of messages to cache.
|
51
|
+
# @param [#puts] log The IO object to use for logging.
|
52
|
+
# @param [Boolean] colorize_log Whether to colorize the log.
|
53
|
+
# @param [:debug, :info, :warn, :error, :critical] log_level The log level.
|
54
|
+
# @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
|
55
|
+
#
|
56
|
+
def initialize(allowed_mentions: nil, intents: nil, message_caches: 1000, log: nil, colorize_log: false, log_level: :info, wait_until_ready: true)
|
57
|
+
@allowed_mentions = allowed_mentions || AllowedMentions.new(everyone: true, roles: true, users: true)
|
58
|
+
@intents = (intents or Intents.default)
|
59
|
+
@events = {}
|
60
|
+
@api_version = nil
|
61
|
+
@log = Logger.new(log, colorize_log, log_level)
|
62
|
+
@user = nil
|
63
|
+
@users = Discorb::Dictionary.new
|
64
|
+
@channels = Discorb::Dictionary.new
|
65
|
+
@guilds = Discorb::Dictionary.new(sort: ->(k) { k[0].to_i })
|
66
|
+
@emojis = Discorb::Dictionary.new
|
67
|
+
@messages = Discorb::Dictionary.new(limit: message_caches)
|
68
|
+
@application = nil
|
69
|
+
@last_s = nil
|
70
|
+
@identify_presence = nil
|
71
|
+
@wait_until_ready = wait_until_ready
|
72
|
+
@ready = false
|
73
|
+
@tasks = []
|
74
|
+
@conditions = {}
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# Registers an event handler.
|
79
|
+
# @see file:docs/Events.md
|
80
|
+
#
|
81
|
+
# @param [Symbol] event_name The name of the event.
|
82
|
+
# @param [Symbol] id Custom ID of the event.
|
83
|
+
# @param [Hash] discriminator The discriminator of the event.
|
84
|
+
# @param [Proc] block The block to execute when the event is triggered.
|
85
|
+
#
|
86
|
+
# @return [Discorb::Event] The event.
|
87
|
+
#
|
88
|
+
def on(event_name, id: nil, **discriminator, &block)
|
89
|
+
ne = Event.new(block, id, discriminator)
|
90
|
+
@events[event_name] ||= []
|
91
|
+
@events[event_name] << ne
|
92
|
+
ne
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# Almost same as {#on}, but only triggers the event once.
|
97
|
+
#
|
98
|
+
# @param (see #on)
|
99
|
+
#
|
100
|
+
# @return [Discorb::Event] The event.
|
101
|
+
#
|
102
|
+
def once(event_name, id: nil, **discriminator, &block)
|
103
|
+
discriminator[:once] = true
|
104
|
+
ne = Event.new(block, id, discriminator)
|
105
|
+
@events[event_name] ||= []
|
106
|
+
@events[event_name] << ne
|
107
|
+
ne
|
108
|
+
end
|
109
|
+
|
110
|
+
#
|
111
|
+
# Remove event by ID.
|
112
|
+
#
|
113
|
+
# @param [Symbol] event_name The name of the event.
|
114
|
+
# @param [Symbol] id The ID of the event.
|
115
|
+
#
|
116
|
+
def remove_event(event_name, id)
|
117
|
+
@events[event_name].delete_if { |e| e.id == id }
|
118
|
+
end
|
119
|
+
|
120
|
+
#
|
121
|
+
# Dispatch an event.
|
122
|
+
#
|
123
|
+
# @param [Symbol] event_name The name of the event.
|
124
|
+
# @param [Object] args The arguments to pass to the event.
|
125
|
+
#
|
126
|
+
def dispatch(event_name, *args)
|
127
|
+
Async do |_task|
|
128
|
+
if (conditions = @conditions[event_name])
|
129
|
+
ids = Set[*conditions.map(&:first).map(&:object_id)]
|
130
|
+
conditions.delete_if do |condition|
|
131
|
+
next unless ids.include?(condition.first.object_id)
|
132
|
+
|
133
|
+
check_result = condition[1].nil? || condition[1].call(*args)
|
134
|
+
if check_result
|
135
|
+
condition.first.signal(args)
|
136
|
+
true
|
137
|
+
else
|
138
|
+
false
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
if @events[event_name].nil?
|
143
|
+
@log.debug "Event #{event_name} doesn't have any proc, skipping"
|
144
|
+
next
|
145
|
+
end
|
146
|
+
@log.debug "Dispatching event #{event_name}"
|
147
|
+
@events[event_name].each do |block|
|
148
|
+
lambda { |event_args|
|
149
|
+
Async(annotation: "Discorb event: #{event_name}") do |task|
|
150
|
+
@events[event_name].delete(block) if block.discriminator[:once]
|
151
|
+
block.call(task, *event_args)
|
152
|
+
@log.debug "Dispatched proc with ID #{block.id.inspect}"
|
153
|
+
rescue StandardError, ScriptError => e
|
154
|
+
message = "An error occurred while dispatching proc with ID #{block.id.inspect}\n#{e.full_message}"
|
155
|
+
dispatch(:error, event_name, event_args, e)
|
156
|
+
if @log.out
|
157
|
+
@log.error message
|
158
|
+
else
|
159
|
+
warn message
|
160
|
+
end
|
161
|
+
end
|
162
|
+
}.call(args)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
# Starts the client.
|
169
|
+
#
|
170
|
+
# @param [String] token The token to use.
|
171
|
+
#
|
172
|
+
def run(token)
|
173
|
+
@token = token.to_s
|
174
|
+
connect_gateway(true)
|
175
|
+
end
|
176
|
+
|
177
|
+
#
|
178
|
+
# Fetch user from ID.
|
179
|
+
# @macro async
|
180
|
+
# @macro http
|
181
|
+
#
|
182
|
+
# @param [#to_s] id <description>
|
183
|
+
#
|
184
|
+
# @return [Discorb::User] The user.
|
185
|
+
#
|
186
|
+
# @raise [Discorb::NotFoundError] If the user doesn't exist.
|
187
|
+
#
|
188
|
+
def fetch_user(id)
|
189
|
+
Async do
|
190
|
+
_resp, data = internet.get("/users/#{id}").wait
|
191
|
+
User.new(self, data)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
#
|
196
|
+
# Fetch channel from ID.
|
197
|
+
# @macro async
|
198
|
+
# @macro http
|
199
|
+
#
|
200
|
+
# @param [#to_s] id The ID of the channel.
|
201
|
+
#
|
202
|
+
# @return [Discorb::Channel] The channel.
|
203
|
+
#
|
204
|
+
# @raise [Discorb::NotFoundError] If the channel doesn't exist.
|
205
|
+
#
|
206
|
+
def fetch_channel(id)
|
207
|
+
Async do
|
208
|
+
_resp, data = internet.get("/channels/#{id}").wait
|
209
|
+
Channel.make_channel(self, data)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
#
|
214
|
+
# Fetch guild from ID.
|
215
|
+
# @macro async
|
216
|
+
# @macro http
|
217
|
+
#
|
218
|
+
# @param [#to_s] id <description>
|
219
|
+
#
|
220
|
+
# @return [Discorb::Guild] The guild.
|
221
|
+
#
|
222
|
+
# @raise [Discorb::NotFoundError] If the guild doesn't exist.
|
223
|
+
#
|
224
|
+
def fetch_guild(id)
|
225
|
+
Async do
|
226
|
+
_resp, data = internet.get("/guilds/#{id}").wait
|
227
|
+
Guild.new(self, data, false)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
#
|
232
|
+
# Fetch invite from code.
|
233
|
+
# @macro async
|
234
|
+
# @macro http
|
235
|
+
#
|
236
|
+
# @param [String] code The code of the invite.
|
237
|
+
# @param [Boolean] with_count Whether to include the count of the invite.
|
238
|
+
# @param [Boolean] with_expiration Whether to include the expiration of the invite.
|
239
|
+
#
|
240
|
+
# @return [Discorb::Invite] The invite.
|
241
|
+
#
|
242
|
+
def fetch_invite(code, with_count: false, with_expiration: false)
|
243
|
+
Async do
|
244
|
+
_resp, data = internet.get("/invites/#{code}?with_count=#{with_count}&with_expiration=#{with_expiration}").wait
|
245
|
+
Invite.new(self, data, false)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
#
|
250
|
+
# Fetch webhook from ID.
|
251
|
+
# If application was cached, it will be used.
|
252
|
+
# @macro async
|
253
|
+
# @macro http
|
254
|
+
#
|
255
|
+
# @param [Boolean] force Whether to force the fetch.
|
256
|
+
#
|
257
|
+
# @return [Discorb::Application] The application.
|
258
|
+
#
|
259
|
+
def fetch_application(force: false)
|
260
|
+
Async do
|
261
|
+
next @application if @application && !force
|
262
|
+
|
263
|
+
_resp, data = internet.get("/oauth2/applications/@me").wait
|
264
|
+
@application = Application.new(self, data)
|
265
|
+
@application
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
#
|
270
|
+
# Fetch nitro sticker pack from ID.
|
271
|
+
# @macro async
|
272
|
+
# @macro http
|
273
|
+
#
|
274
|
+
# @return [Array<Discorb::Sticker::Pack>] The packs.
|
275
|
+
#
|
276
|
+
def fetch_nitro_sticker_packs
|
277
|
+
Async do
|
278
|
+
_resp, data = internet.get("/stickers-packs").wait
|
279
|
+
data.map { |pack| Sticker::Pack.new(self, pack) }
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
#
|
284
|
+
# Update presence of the client.
|
285
|
+
#
|
286
|
+
# @param [Discorb::Activity] activity The activity to update.
|
287
|
+
# @param [:online, :idle, :dnd, :invisible] status The status to update.
|
288
|
+
#
|
289
|
+
def update_presence(activity = nil, status: nil)
|
290
|
+
payload = {}
|
291
|
+
if !activity.nil?
|
292
|
+
payload[:activities] = [activity.to_hash]
|
293
|
+
end
|
294
|
+
payload[:status] = status unless status.nil?
|
295
|
+
if @connection
|
296
|
+
Async do |_task|
|
297
|
+
send_gateway(3, **payload)
|
298
|
+
end
|
299
|
+
else
|
300
|
+
@identify_presence = payload
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
alias change_presence update_presence
|
305
|
+
|
306
|
+
#
|
307
|
+
# Method to wait for a event.
|
308
|
+
#
|
309
|
+
# @param [Symbol] event_name The name of the event.
|
310
|
+
# @param [Integer] timeout The timeout in seconds.
|
311
|
+
# @param [Proc] check The check to use.
|
312
|
+
#
|
313
|
+
# @return [Object] The result of the event.
|
314
|
+
#
|
315
|
+
# @raise [Discorb::TimeoutError] If the event didn't occur in time.
|
316
|
+
#
|
317
|
+
def event_lock(event, timeout = nil, &check)
|
318
|
+
Async do |task|
|
319
|
+
condition = Async::Condition.new
|
320
|
+
@conditions[event] ||= []
|
321
|
+
@conditions[event] << [condition, check]
|
322
|
+
if timeout.nil?
|
323
|
+
value = condition.wait
|
324
|
+
else
|
325
|
+
timeout_task = task.with_timeout(timeout) do
|
326
|
+
condition.wait
|
327
|
+
rescue Async::TimeoutError
|
328
|
+
@conditions[event].delete_if { |c| c.first == condition }
|
329
|
+
raise Discorb::TimeoutError, "Timeout waiting for event #{event}", cause: nil
|
330
|
+
end
|
331
|
+
value = timeout_task
|
332
|
+
end
|
333
|
+
value.length <= 1 ? value.first : value
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
alias await event_lock
|
338
|
+
|
339
|
+
def inspect
|
340
|
+
"#<#{self.class} user=\"#{user}\">"
|
341
|
+
end
|
342
|
+
|
343
|
+
#
|
344
|
+
# Load the extension.
|
345
|
+
#
|
346
|
+
# @param [Module] mod The extension to load.
|
347
|
+
#
|
348
|
+
def extend(mod)
|
349
|
+
if mod.respond_to?(:events)
|
350
|
+
mod.events.each do |name, events|
|
351
|
+
@events[name] = [] if @events[name].nil?
|
352
|
+
events.each do |event|
|
353
|
+
@events[name] << event
|
354
|
+
end
|
355
|
+
end
|
356
|
+
mod.client = self
|
357
|
+
end
|
358
|
+
super(mod)
|
359
|
+
end
|
360
|
+
|
361
|
+
include Discorb::GatewayHandler
|
362
|
+
end
|
363
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Discorb
|
4
|
+
#
|
5
|
+
# Represents RGB color.
|
6
|
+
#
|
7
|
+
class Color
|
8
|
+
attr_accessor :value
|
9
|
+
|
10
|
+
@discord_colors = {
|
11
|
+
teal: 0x1abc9c,
|
12
|
+
dark_teal: 0x11806a,
|
13
|
+
green: 0x2ecc71,
|
14
|
+
dark_green: 0x1f8b4c,
|
15
|
+
blue: 0x3498db,
|
16
|
+
dark_blue: 0x206694,
|
17
|
+
purple: 0x9b59b6,
|
18
|
+
dark_purple: 0x71368a,
|
19
|
+
magenta: 0xe91e63,
|
20
|
+
dark_magenta: 0xad1457,
|
21
|
+
gold: 0xf1c40f,
|
22
|
+
dark_gold: 0xc27c0e,
|
23
|
+
orange: 0xe67e22,
|
24
|
+
dark_orange: 0xa84300,
|
25
|
+
red: 0xe74c3c,
|
26
|
+
dark_red: 0x992d22,
|
27
|
+
lighter_grey: 0x95a5a6,
|
28
|
+
lighter_gray: 0x95a5a6,
|
29
|
+
dark_grey: 0x607d8b,
|
30
|
+
dark_gray: 0x607d8b,
|
31
|
+
light_grey: 0x979c9f,
|
32
|
+
light_gray: 0x979c9f,
|
33
|
+
darker_grey: 0x546e7a,
|
34
|
+
darker_gray: 0x546e7a,
|
35
|
+
og_blurple: 0x7289da,
|
36
|
+
blurple: 0x5865f2,
|
37
|
+
greyple: 0x99aab5,
|
38
|
+
dark_theme: 0x36393f,
|
39
|
+
fuchsia: 0xeb459e,
|
40
|
+
yellow: 0xfee75c,
|
41
|
+
}.freeze
|
42
|
+
|
43
|
+
#
|
44
|
+
# Create a color from a Integer.
|
45
|
+
#
|
46
|
+
# @param [Integer] value A color value.
|
47
|
+
#
|
48
|
+
def initialize(value)
|
49
|
+
@value = value
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# Integerize a color.
|
54
|
+
#
|
55
|
+
# @return [Integer] A color value.
|
56
|
+
#
|
57
|
+
def to_i
|
58
|
+
@value
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Convert a color to a hexadecimal value.
|
63
|
+
#
|
64
|
+
# @return [String] A hexadecimal value.
|
65
|
+
#
|
66
|
+
def to_hex
|
67
|
+
@value.to_s(16).rjust(6, "0")
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Convert a color to RGB array.
|
72
|
+
#
|
73
|
+
# @return [Array(Integer, Integer, Integer)] A RGB array.
|
74
|
+
#
|
75
|
+
def to_rgb
|
76
|
+
[@value / (256 * 256), @value / 256 % 256, @value % 256]
|
77
|
+
end
|
78
|
+
|
79
|
+
alias to_a to_rgb
|
80
|
+
alias deconstruct to_rgb
|
81
|
+
|
82
|
+
#
|
83
|
+
# Convert a color to RGB hash.
|
84
|
+
#
|
85
|
+
# @return [Hash{:r, :g, :b => Integer}] A RGB hash.
|
86
|
+
#
|
87
|
+
def to_rgb_hash
|
88
|
+
[@value / (256 * 256), @value / 256 % 256, @value % 256]
|
89
|
+
end
|
90
|
+
|
91
|
+
alias deconstruct_keys to_rgb_hash
|
92
|
+
|
93
|
+
#
|
94
|
+
# Converts a color to a `#000000` string.
|
95
|
+
#
|
96
|
+
# @return [String] Converted string.
|
97
|
+
#
|
98
|
+
def to_s
|
99
|
+
"##{to_hex}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def inspect
|
103
|
+
"#<#{self.class} #{@value}/#{self}>"
|
104
|
+
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# Create a color from a hexadecimal string.
|
108
|
+
#
|
109
|
+
# @param [String] hex A hexadecimal string.
|
110
|
+
#
|
111
|
+
# @return [Discorb::Color] A color object.
|
112
|
+
#
|
113
|
+
def self.from_hex(hex)
|
114
|
+
new(hex.to_i(16))
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Create a color from a RGB array.
|
119
|
+
#
|
120
|
+
# @param [Integer] red A red value.
|
121
|
+
# @param [Integer] green A green value.
|
122
|
+
# @param [Integer] blue A blue value.
|
123
|
+
#
|
124
|
+
# @return [Discorb::Color] A color object.
|
125
|
+
#
|
126
|
+
def self.from_rgb(red, green, blue)
|
127
|
+
new(red * 256 * 256 + green * 256 + blue)
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
# Create a color from a Discord's color.
|
132
|
+
# Currently these colors are supported:
|
133
|
+
# - teal (0x1abc9c)
|
134
|
+
# - dark_teal (0x11806a)
|
135
|
+
# - green (0x2ecc71)
|
136
|
+
# - dark_green (0x1f8b4c)
|
137
|
+
# - blue (0x3498db)
|
138
|
+
# - dark_blue (0x206694)
|
139
|
+
# - purple (0x9b59b6)
|
140
|
+
# - dark_purple (0x71368a)
|
141
|
+
# - magenta (0xe91e63)
|
142
|
+
# - dark_magenta (0xad1457)
|
143
|
+
# - gold (0xf1c40f)
|
144
|
+
# - dark_gold (0xc27c0e)
|
145
|
+
# - orange (0xe67e22)
|
146
|
+
# - dark_orange (0xa84300)
|
147
|
+
# - red (0xe74c3c)
|
148
|
+
# - dark_red (0x992d22)
|
149
|
+
# - lighter_grey (0x95a5a6)
|
150
|
+
# - lighter_gray (0x95a5a6)
|
151
|
+
# - dark_grey (0x607d8b)
|
152
|
+
# - dark_gray (0x607d8b)
|
153
|
+
# - light_grey (0x979c9f)
|
154
|
+
# - light_gray (0x979c9f)
|
155
|
+
# - darker_grey (0x546e7a)
|
156
|
+
# - darker_gray (0x546e7a)
|
157
|
+
# - og_blurple (0x7289da)
|
158
|
+
# - blurple (0x5865f2)
|
159
|
+
# - greyple (0x99aab5)
|
160
|
+
# - dark_theme (0x36393f)
|
161
|
+
# - fuchsia (0xeb459e)
|
162
|
+
#
|
163
|
+
# @param [Symbol] color A Discord color name.
|
164
|
+
#
|
165
|
+
# @return [Discorb::Color] A color object.
|
166
|
+
#
|
167
|
+
def self.[](color)
|
168
|
+
new(@discord_colors[color])
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
Colour = Color
|
173
|
+
end
|