Skip to content

Commit d92596c

Browse files
authored
Merge branch 'shardlab:main' into message-components
2 parents bcfa22b + d5b15eb commit d92596c

30 files changed

+414
-113
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ commands:
66
steps:
77
- run:
88
name: Install OS packages
9-
command: apk add git build-base ruby-dev ruby-etc ruby-json libsodium-dev
9+
command: apk add git build-base ruby-dev libsodium-dev
1010
- checkout
1111
- run:
1212
name: "Ruby version"

discordrb.gemspec

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
3131
spec.add_dependency 'ffi', '>= 1.9.24'
3232
spec.add_dependency 'opus-ruby'
3333
spec.add_dependency 'rest-client', '>= 2.0.0'
34-
spec.add_dependency 'websocket-client-simple', '>= 0.3.0'
34+
spec.add_dependency 'websocket-client-simple', '>= 0.9.0'
3535

3636
spec.add_dependency 'discordrb-webhooks', '~> 3.5.0'
3737

@@ -41,11 +41,11 @@ Gem::Specification.new do |spec|
4141
spec.add_development_dependency 'rake', '~> 13.0'
4242
spec.add_development_dependency 'redcarpet', '~> 3.5' # YARD markdown formatting
4343
spec.add_development_dependency 'rspec', '~> 3.0'
44-
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.5'
45-
spec.add_development_dependency 'rspec-prof', '~> 0.0'
46-
spec.add_development_dependency 'rubocop', '~> 1.0'
47-
spec.add_development_dependency 'rubocop-performance', '~> 1.0'
48-
spec.add_development_dependency 'rubocop-rake', '~> 0.6'
44+
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0'
45+
spec.add_development_dependency 'rspec-prof', '~> 0.0.7'
46+
spec.add_development_dependency 'rubocop', '~> 1.77.0'
47+
spec.add_development_dependency 'rubocop-performance', '~> 1.25.0'
48+
spec.add_development_dependency 'rubocop-rake', '~> 0.7.0'
4949
spec.add_development_dependency 'simplecov', '~> 0.21'
50-
spec.add_development_dependency 'yard', '~> 0.9'
50+
spec.add_development_dependency 'yard', '~> 0.9.37'
5151
end

lib/discordrb.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,13 @@ module Discordrb
4646
NO_INTENTS = 0
4747

4848
# Compares two objects based on IDs - either the objects' IDs are equal, or one object is equal to the other's ID.
49-
def self.id_compare(one_id, other)
49+
def self.id_compare?(one_id, other)
5050
other.respond_to?(:resolve_id) ? (one_id.resolve_id == other.resolve_id) : (one_id == other)
5151
end
5252

53+
# @deprecated Please use {Discordrb.id_compare?}
54+
singleton_class.alias_method :id_compare, :id_compare?
55+
5356
# The maximum length a Discord message can have
5457
CHARACTER_LIMIT = 2000
5558

lib/discordrb/api.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ def nameplate_url(nameplate_asset, format = 'webm')
241241
"#{cdn_url}/assets/collectibles/#{nameplate_asset.delete_suffix('/')}/asset.#{format}"
242242
end
243243

244+
# make a server tag badge URL from a server ID and badge ID.
245+
def server_tag_badge_url(server_id, badge_id, format = 'webp')
246+
"#{cdn_url}/guild-tag-badges/#{server_id}/#{badge_id}.#{format}"
247+
end
248+
244249
# Create an OAuth application
245250
def create_oauth_application(token, name, redirect_uris)
246251
request(

lib/discordrb/api/application.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,16 @@ def batch_edit_command_permissions(token, application_id, guild_id, permissions)
199199
content_type: :json
200200
)
201201
end
202+
203+
# Get the permissions for a specific command in a guild.
204+
# https://discord.com/developers/docs/interactions/application-commands#get-application-command-permissions
205+
def get_application_command_permissions(token, application_id, guild_id, command_id)
206+
Discordrb::API.request(
207+
:applications_aid_guilds_gid_commands_cid_permissions,
208+
guild_id,
209+
:get,
210+
"#{Discordrb::API.api_base}/applications/#{application_id}/guilds/#{guild_id}/commands/#{command_id}/permissions",
211+
Authorization: token
212+
)
213+
end
202214
end

lib/discordrb/api/channel.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,39 +319,40 @@ def start_typing(token, channel_id)
319319
end
320320

321321
# Get a list of pinned messages in a channel
322-
# https://discord.com/developers/docs/resources/channel#get-pinned-messages
323-
def pinned_messages(token, channel_id)
322+
# https://discord.com/developers/docs/resources/message#get-channel-pins
323+
def pinned_messages(token, channel_id, limit = 50, before = nil)
324+
query = URI.encode_www_form({ limit: limit, before: before }.compact)
324325
Discordrb::API.request(
325326
:channels_cid_pins,
326327
channel_id,
327328
:get,
328-
"#{Discordrb::API.api_base}/channels/#{channel_id}/pins",
329+
"#{Discordrb::API.api_base}/channels/#{channel_id}/messages/pins?#{query}",
329330
Authorization: token
330331
)
331332
end
332333

333334
# Pin a message
334-
# https://discord.com/developers/docs/resources/channel#add-pinned-channel-message
335+
# https://discord.com/developers/docs/resources/message#pin-message
335336
def pin_message(token, channel_id, message_id, reason = nil)
336337
Discordrb::API.request(
337338
:channels_cid_pins_mid,
338339
channel_id,
339340
:put,
340-
"#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
341+
"#{Discordrb::API.api_base}/channels/#{channel_id}/messages/pins/#{message_id}",
341342
nil,
342343
Authorization: token,
343344
'X-Audit-Log-Reason': reason
344345
)
345346
end
346347

347348
# Unpin a message
348-
# https://discord.com/developers/docs/resources/channel#delete-pinned-channel-message
349+
# https://discord.com/developers/docs/resources/message#unpin-message
349350
def unpin_message(token, channel_id, message_id, reason = nil)
350351
Discordrb::API.request(
351352
:channels_cid_pins_mid,
352353
channel_id,
353354
:delete,
354-
"#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
355+
"#{Discordrb::API.api_base}/channels/#{channel_id}/messages/pins/#{message_id}",
355356
Authorization: token,
356357
'X-Audit-Log-Reason': reason
357358
)

lib/discordrb/api/invite.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def resolve(token, invite_code, counts = true)
1111
:invite_code,
1212
nil,
1313
:get,
14-
"#{Discordrb::API.api_base}/invites/#{invite_code}#{counts ? '?with_counts=true' : ''}",
14+
"#{Discordrb::API.api_base}/invites/#{invite_code}#{'?with_counts=true' if counts}",
1515
Authorization: token
1616
)
1717
end

lib/discordrb/bot.rb

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,10 +1101,11 @@ def update_guild_member(data)
11011101
server_id = data['guild_id'].to_i
11021102
server = self.server(server_id)
11031103

1104-
if (member = server.member(data['user']['id'].to_i))
1104+
# Only attempt to update members that're already cached
1105+
if (member = server.member(data['user']['id'].to_i, false))
11051106
member.update_data(data)
11061107
else
1107-
Discordrb::LOGGER.warn("update_guild_member attempted to access a member which doesn't exist! Not sure what happened here, ignoring.")
1108+
ensure_user(data['user'])
11081109
end
11091110
end
11101111

@@ -1301,12 +1302,21 @@ def handle_dispatch(type, data)
13011302
return
13021303
end
13031304

1305+
if !should_parse_self && profile.id == data['author']['id'].to_i
1306+
debug('Ignored message from the current bot')
1307+
return
1308+
end
1309+
13041310
# If create_message is overwritten with a method that returns the parsed message, use that instead, so we don't
13051311
# parse the message twice (which is just thrown away performance)
13061312
message = create_message(data)
13071313
message = Message.new(data, self) unless message.is_a? Message
13081314

1309-
return if message.from_bot? && !should_parse_self
1315+
# Update the existing member if it exists in the cache.
1316+
if data['member']
1317+
member = message.channel.server&.member(data['author']['id'].to_i, false)
1318+
member&.update_data(data['member'])
1319+
end
13101320

13111321
# Dispatch a ChannelCreateEvent for channels we don't have cached
13121322
if message.channel.private? && @pm_channels[message.channel.recipient.id].nil?
@@ -1330,18 +1340,27 @@ def handle_dispatch(type, data)
13301340
when :MESSAGE_UPDATE
13311341
update_message(data)
13321342

1343+
if !should_parse_self && profile.id == data['author']['id'].to_i
1344+
debug('Ignored message from the current bot')
1345+
return
1346+
end
1347+
13331348
message = Message.new(data, self)
13341349

13351350
event = MessageUpdateEvent.new(message, self)
13361351
raise_event(event)
13371352

1338-
return if message.from_bot? && !should_parse_self
1339-
1340-
unless message.author
1353+
if data['author'].nil?
13411354
LOGGER.debug("Edited a message with nil author! Content: #{message.content.inspect}, channel: #{message.channel.inspect}")
13421355
return
13431356
end
13441357

1358+
# Update the existing member if it exists in the cache.
1359+
if data['member']
1360+
member = message.channel.server&.member(data['author']['id'].to_i, false)
1361+
member&.update_data(data['member'])
1362+
end
1363+
13451364
event = MessageEditEvent.new(message, self)
13461365
raise_event(event)
13471366
when :MESSAGE_DELETE
@@ -1379,6 +1398,12 @@ def handle_dispatch(type, data)
13791398

13801399
return if profile.id == data['user_id'].to_i && !should_parse_self
13811400

1401+
if data['member']
1402+
server = self.server(data['guild_id'].to_i)
1403+
1404+
server&.cache_member(Member.new(data['member'], server, self))
1405+
end
1406+
13821407
event = ReactionAddEvent.new(data, self)
13831408
raise_event(event)
13841409
when :MESSAGE_REACTION_REMOVE
@@ -1559,6 +1584,10 @@ def handle_dispatch(type, data)
15591584
event = ServerEmojiUpdateEvent.new(server, old_emoji_data[e], new_emoji_data[e], self)
15601585
raise_event(event)
15611586
end
1587+
when :APPLICATION_COMMAND_PERMISSIONS_UPDATE
1588+
event = ApplicationCommandPermissionsUpdateEvent.new(data, self)
1589+
1590+
raise_event(event)
15621591
when :INTERACTION_CREATE
15631592
event = InteractionCreateEvent.new(data, self)
15641593
raise_event(event)

lib/discordrb/cache.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def request_chunks(id)
199199
# @return [String] Only the code for the invite.
200200
def resolve_invite_code(invite)
201201
invite = invite.code if invite.is_a? Discordrb::Invite
202-
invite = invite[invite.rindex('/') + 1..] if invite.start_with?('http', 'discord.gg')
202+
invite = invite[(invite.rindex('/') + 1)..] if invite.start_with?('http', 'discord.gg')
203203
invite
204204
end
205205

lib/discordrb/commands/parser.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def execute_bare(event)
211211
b_level -= 1
212212
next unless b_level.zero?
213213

214-
nested = @chain[b_start + 1..index - 1]
214+
nested = @chain[(b_start + 1)..(index - 1)]
215215
subchain = CommandChain.new(nested, @bot, true)
216216
result += subchain.execute(event)
217217
end
@@ -245,8 +245,8 @@ def execute_bare(event)
245245
command = command.gsub hacky_delim, @attributes[:chain_delimiter]
246246

247247
first_space = command.index ' '
248-
command_name = first_space ? command[0..first_space - 1] : command
249-
arguments = first_space ? command[first_space + 1..] : ''
248+
command_name = first_space ? command[0..(first_space - 1)] : command
249+
arguments = first_space ? command[(first_space + 1)..] : ''
250250

251251
# Append a previous sign if none is present
252252
arguments += @attributes[:previous] unless arguments.include? @attributes[:previous]
@@ -318,7 +318,7 @@ def divide_chain(chain)
318318
arg.split ' '
319319
end
320320

321-
chain = chain[chain_args_index + 1..]
321+
chain = chain[(chain_args_index + 1)..]
322322
end
323323

324324
[chain_args, chain]

0 commit comments

Comments
 (0)