From a46a0ffaf6abbd4ec80d8e10cd08a2f5840025c4 Mon Sep 17 00:00:00 2001 From: DroidDevelopment Date: Wed, 16 Oct 2024 16:50:00 -0400 Subject: [PATCH 01/10] Update ban command. --- lib/discordrb/api/server.rb | 13 +++++++------ lib/discordrb/data/server.rb | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/discordrb/api/server.rb b/lib/discordrb/api/server.rb index 9b383299e..06b906743 100644 --- a/lib/discordrb/api/server.rb +++ b/lib/discordrb/api/server.rb @@ -200,17 +200,18 @@ def bans(token, server_id, limit = nil, before = nil, after = nil) ) end - # Ban a user from a server and delete their messages from the last message_days days + # Ban a user from a server and delete their messages from seconds. # https://discord.com/developers/docs/resources/guild#create-guild-ban - def ban_user(token, server_id, user_id, message_days, reason = nil) - reason = URI.encode_www_form_component(reason) if reason + def ban_user(token, server_id, user_id, message_seconds, reason = nil) Discordrb::API.request( :guilds_sid_bans_uid, server_id, :put, - "#{Discordrb::API.api_base}/guilds/#{server_id}/bans/#{user_id}?delete_message_days=#{message_days}&reason=#{reason}", - nil, - Authorization: token + "#{Discordrb::API.api_base}/guilds/#{server_id}/bans/#{user_id}", + { delete_message_seconds: message_seconds }.to_json, + Authorization: token, + content_type: :json, + 'X-Audit-Log-Reason': reason ) end diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index 2569ee3e6..794d4fb57 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -610,9 +610,9 @@ def bans(limit: nil, before_id: nil, after_id: nil) # Bans a user from this server. # @param user [User, String, Integer] The user to ban. - # @param message_days [Integer] How many days worth of messages sent by the user should be deleted. + # @param message_seconds [Integer] How many days seconds of messages sent by the user should be deleted. # @param reason [String] The reason the user is being banned. - def ban(user, message_days = 0, reason: nil) + def ban(user, message_seconds = 0, reason: nil) API::Server.ban_user(@bot.token, @id, user.resolve_id, message_days, reason) end From 7dc0d2353dbd006d809515cce42120ae3fabfdc8 Mon Sep 17 00:00:00 2001 From: DroidDevelopment Date: Wed, 16 Oct 2024 16:57:41 -0400 Subject: [PATCH 02/10] Fix typo. --- lib/discordrb/data/server.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index 794d4fb57..a5589738d 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -610,10 +610,10 @@ def bans(limit: nil, before_id: nil, after_id: nil) # Bans a user from this server. # @param user [User, String, Integer] The user to ban. - # @param message_seconds [Integer] How many days seconds of messages sent by the user should be deleted. + # @param message_seconds [Integer] How many seconds of messages sent by the user should be deleted. # @param reason [String] The reason the user is being banned. def ban(user, message_seconds = 0, reason: nil) - API::Server.ban_user(@bot.token, @id, user.resolve_id, message_days, reason) + API::Server.ban_user(@bot.token, @id, user.resolve_id, message_seconds, reason) end # Unbans a previously banned user from this server. From 98eeebd82ae0eb3b9ea56aa5e95130c007ba9181 Mon Sep 17 00:00:00 2001 From: DroidDevelopment Date: Wed, 16 Oct 2024 17:09:52 -0400 Subject: [PATCH 03/10] Update user abstraction. --- lib/discordrb/data/member.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/discordrb/data/member.rb b/lib/discordrb/data/member.rb index f2cc80b2f..2147d9fe5 100644 --- a/lib/discordrb/data/member.rb +++ b/lib/discordrb/data/member.rb @@ -247,10 +247,10 @@ def server_unmute end # Bans this member from the server. - # @param message_days [Integer] How many days worth of messages sent by the member should be deleted. + # @param message_seconds [Integer] How many seconds worth of messages sent by the member should be deleted. # @param reason [String] The reason this member is being banned. - def ban(message_days = 0, reason: nil) - server.ban(@user, message_days, reason: reason) + def ban(message_seconds = 0, reason: nil) + server.ban(@user, message_seconds, reason: reason) end # Unbans this member from the server. From 423a4add46ca96748bccab316e03bc8a11de8dbe Mon Sep 17 00:00:00 2001 From: DroidDevelopment Date: Sat, 19 Oct 2024 20:10:17 -0400 Subject: [PATCH 04/10] Revert previous changes, and make message seconds parameter optional. --- lib/discordrb/data/member.rb | 11 +++++++++-- lib/discordrb/data/server.rb | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/discordrb/data/member.rb b/lib/discordrb/data/member.rb index 2147d9fe5..4e915c28d 100644 --- a/lib/discordrb/data/member.rb +++ b/lib/discordrb/data/member.rb @@ -247,10 +247,17 @@ def server_unmute end # Bans this member from the server. + # @param message_days [Integer] How many days worth of messages sent by the member should be deleted. This will be deprecated in 4.0. # @param message_seconds [Integer] How many seconds worth of messages sent by the member should be deleted. # @param reason [String] The reason this member is being banned. - def ban(message_seconds = 0, reason: nil) - server.ban(@user, message_seconds, reason: reason) + def ban(message_days = 0, message_seconds: nil, reason: nil) + delete_messages = if message_days != 0 && message_days + message_days * 86_400 + else + message_seconds || 0 + end + + server.ban(@user, delete_messages, reason: reason) end # Unbans this member from the server. diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index a5589738d..4078815fb 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -610,10 +610,17 @@ def bans(limit: nil, before_id: nil, after_id: nil) # Bans a user from this server. # @param user [User, String, Integer] The user to ban. + # @param message_days [Integer] How many days worth of messages sent by the user should be deleted. This will be deprecated in 4.0. # @param message_seconds [Integer] How many seconds of messages sent by the user should be deleted. # @param reason [String] The reason the user is being banned. - def ban(user, message_seconds = 0, reason: nil) - API::Server.ban_user(@bot.token, @id, user.resolve_id, message_seconds, reason) + def ban(user, message_days = 0, message_seconds: nil, reason: nil) + delete_messages = if message_days != 0 && message_days + message_days * 86_400 + else + message_seconds || 0 + end + + API::Server.ban_user(@bot.token, @id, user.resolve_id, delete_messages, reason) end # Unbans a previously banned user from this server. From d2eebc1497a54512b278d4980b40436e95192d8a Mon Sep 17 00:00:00 2001 From: DroidDevelopment Date: Fri, 1 Nov 2024 20:24:07 -0400 Subject: [PATCH 05/10] Update documentation wording. --- lib/discordrb/api/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discordrb/api/server.rb b/lib/discordrb/api/server.rb index 06b906743..135ea0c9b 100644 --- a/lib/discordrb/api/server.rb +++ b/lib/discordrb/api/server.rb @@ -200,7 +200,7 @@ def bans(token, server_id, limit = nil, before = nil, after = nil) ) end - # Ban a user from a server and delete their messages from seconds. + # Ban a user from a server and delete their messages up to a given amount of time. # https://discord.com/developers/docs/resources/guild#create-guild-ban def ban_user(token, server_id, user_id, message_seconds, reason = nil) Discordrb::API.request( From 68d923789d1be356b09cfb9ba16b65fba9ce3cc8 Mon Sep 17 00:00:00 2001 From: Droid Date: Fri, 1 Nov 2024 20:49:58 -0400 Subject: [PATCH 06/10] Update Member Comments. --- lib/discordrb/data/member.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discordrb/data/member.rb b/lib/discordrb/data/member.rb index 4e915c28d..35c639da6 100644 --- a/lib/discordrb/data/member.rb +++ b/lib/discordrb/data/member.rb @@ -247,7 +247,7 @@ def server_unmute end # Bans this member from the server. - # @param message_days [Integer] How many days worth of messages sent by the member should be deleted. This will be deprecated in 4.0. + # @param message_days [Integer] How many days worth of messages sent by the member should be deleted. This parameter is deprecated and will be removed in 4.0. # @param message_seconds [Integer] How many seconds worth of messages sent by the member should be deleted. # @param reason [String] The reason this member is being banned. def ban(message_days = 0, message_seconds: nil, reason: nil) From 6fcb85a6d801ae655f6d300ee4695b63cc9dd309 Mon Sep 17 00:00:00 2001 From: Droid Date: Fri, 1 Nov 2024 20:50:40 -0400 Subject: [PATCH 07/10] Update Server Comments. --- lib/discordrb/data/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index 4078815fb..c1df15591 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -610,7 +610,7 @@ def bans(limit: nil, before_id: nil, after_id: nil) # Bans a user from this server. # @param user [User, String, Integer] The user to ban. - # @param message_days [Integer] How many days worth of messages sent by the user should be deleted. This will be deprecated in 4.0. + # @param message_days [Integer] How many days worth of messages sent by the user should be deleted. This is deprecated and will be removed in 4.0. # @param message_seconds [Integer] How many seconds of messages sent by the user should be deleted. # @param reason [String] The reason the user is being banned. def ban(user, message_days = 0, message_seconds: nil, reason: nil) From 413d489a2f07383bd2c2680c3b2bf4b662db27f7 Mon Sep 17 00:00:00 2001 From: Droid Date: Sun, 16 Feb 2025 22:40:33 -0500 Subject: [PATCH 08/10] Bulk Banning --- lib/discordrb/api/server.rb | 15 +++++++++++ lib/discordrb/commands/command_bot.rb | 2 +- lib/discordrb/data/server.rb | 36 +++++++++++++++++++++++++++ lib/discordrb/errors.rb | 3 +++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/discordrb/api/server.rb b/lib/discordrb/api/server.rb index 135ea0c9b..f59317e29 100644 --- a/lib/discordrb/api/server.rb +++ b/lib/discordrb/api/server.rb @@ -570,4 +570,19 @@ def add_member(token, server_id, user_id, access_token, nick = nil, roles = [], Authorization: token ) end + + # Ban multiple users in one go + # https://discord.com/developers/docs/resources/guild#bulk-guild-ban + def bulk_ban(token, server_id, users, message_seconds, reason = nil) + Discordrb::API.request( + :guilds_sid_bulk_bans, + server_id, + :post, + "#{Discordrb::API.api_base}/guilds/#{server_id}/bulk-ban", + { user_ids: users, delete_message_seconds: message_seconds }.compact.to_json, + content_type: :json, + Authorization: token, + 'X-Audit-Log-Reason': reason + ) + end end diff --git a/lib/discordrb/commands/command_bot.rb b/lib/discordrb/commands/command_bot.rb index ddf68ea37..2f315628b 100644 --- a/lib/discordrb/commands/command_bot.rb +++ b/lib/discordrb/commands/command_bot.rb @@ -274,7 +274,7 @@ def arg_check(args, types = nil, server = nil) rescue ArgumentError nil end - elsif types[i] == TrueClass || types[i] == FalseClass + elsif [TrueClass, FalseClass].include?(types[i]) if arg.casecmp('true').zero? || arg.downcase.start_with?('y') true elsif arg.casecmp('false').zero? || arg.downcase.start_with?('n') diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index 8a6f2a062..2bfb24d2c 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -630,6 +630,20 @@ def unban(user, reason = nil) API::Server.unban_user(@bot.token, @id, user.resolve_id, reason) end + # Ban up to 200 users from this server in one go. + # @param users [Array] Array of up to 200 users to ban. + # @param message_seconds [Integer] How many seconds of messages sent by the users should be deleted. + # @param reason [String] The reason these users are being banned. + # @return [nil, BulkBan] nil if only a single user was provided or a bulk ban object otherwise. + def bulk_ban(users, message_seconds: 0, reason: nil) + raise ArgumentError, 'Can only ban between 1 and 200 users!' unless users.size.between?(1, 200) + + return ban(users.first, 0, message_seconds: message_seconds, reason: reason) if users.size == 1 + + response = API::Server.bulk_ban(@bot.token, @id, users.map(&:resolve_id), message_seconds, reason) + BulkBan.new(JSON.parse(response), self, reason) + end + # Kicks a user from this server. # @param user [User, String, Integer] The user to kick. # @param reason [String] The reason the user is being kicked. @@ -1019,4 +1033,26 @@ def remove(reason = nil) alias_method :unban, :remove alias_method :lift, :remove end + + # A bulk ban entry on a server + class BulkBan + # @return [Server] The server this bulk ban belongs to. + attr_reader :server + + # @return [String, nil] The reason these users were banned. + attr_reader :reason + + # @return [Array] Array of IDs of banned users. + attr_reader :banned_users + + # @return [Array] Array of IDs of users who couldn't be banned. + attr_reader :failed_users + + def initialize(data, server, reason) + @server = server + @reason = reason + @banned_users = data['banned_users'].map(&:resolve_id) + @failed_users = data['failed_users'].map(&:resolve_id) + end + end end diff --git a/lib/discordrb/errors.rb b/lib/discordrb/errors.rb index c5fd1f96b..ee9b56006 100644 --- a/lib/discordrb/errors.rb +++ b/lib/discordrb/errors.rb @@ -174,6 +174,9 @@ def self.error_class_for(code) # Unauthorized Unauthorized = Unauthorised = Code(40_001) + # Unable to bulk ban any members + UnableToBulkBanMembers = Code(500_000) + # Missing Access MissingAccess = Code(50_001) From 873524241ffea8ea1d4d8a055cf7d64e3a5a2146 Mon Sep 17 00:00:00 2001 From: Droid Date: Sun, 16 Feb 2025 22:51:38 -0500 Subject: [PATCH 09/10] Remove #compact --- lib/discordrb/api/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discordrb/api/server.rb b/lib/discordrb/api/server.rb index f59317e29..857fd26f0 100644 --- a/lib/discordrb/api/server.rb +++ b/lib/discordrb/api/server.rb @@ -579,7 +579,7 @@ def bulk_ban(token, server_id, users, message_seconds, reason = nil) server_id, :post, "#{Discordrb::API.api_base}/guilds/#{server_id}/bulk-ban", - { user_ids: users, delete_message_seconds: message_seconds }.compact.to_json, + { user_ids: users, delete_message_seconds: message_seconds }.to_json, content_type: :json, Authorization: token, 'X-Audit-Log-Reason': reason From 9ea6b53b501a3f2d844132f5edb82b22da1ca798 Mon Sep 17 00:00:00 2001 From: Droid Date: Sat, 22 Feb 2025 18:13:39 -0500 Subject: [PATCH 10/10] Hide constructor for bulk bans. --- lib/discordrb/data/server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/discordrb/data/server.rb b/lib/discordrb/data/server.rb index 2bfb24d2c..0e82b2020 100644 --- a/lib/discordrb/data/server.rb +++ b/lib/discordrb/data/server.rb @@ -1048,6 +1048,7 @@ class BulkBan # @return [Array] Array of IDs of users who couldn't be banned. attr_reader :failed_users + # @!visibility private def initialize(data, server, reason) @server = server @reason = reason