From 2b1e603124af2171067f8c0e51ace484b9f9d076 Mon Sep 17 00:00:00 2001 From: Jakub Kuczys Date: Wed, 10 Jul 2024 20:36:47 +0200 Subject: [PATCH] Bump d.py version to 2.4.0 (#6401) Co-authored-by: Ryan --- docs/cog_guides/core.rst | 53 ++++++++++++++- redbot/__main__.py | 3 +- redbot/cogs/audio/core/events/dpy.py | 12 ++-- redbot/cogs/filter/filter.py | 17 +++-- redbot/core/_cli.py | 4 +- redbot/core/app_commands/__init__.py | 16 +++++ redbot/core/bot.py | 6 +- redbot/core/core_commands.py | 96 +++++++++++++++++++++------- requirements/base.txt | 2 +- 9 files changed, 173 insertions(+), 36 deletions(-) diff --git a/docs/cog_guides/core.rst b/docs/cog_guides/core.rst index 71bc5113d..5f87e90ee 100644 --- a/docs/cog_guides/core.rst +++ b/docs/cog_guides/core.rst @@ -2867,7 +2867,7 @@ Supports either an attachment or an image URL. **Examples:** - ``[p]set bot avatar`` - With an image attachment, this will set the avatar. - ``[p]set bot avatar`` - Without an attachment, this will show the command help. - - ``[p]set bot avatar https://links.flaree.xyz/k95`` - Sets the avatar to the provided url. + - ``[p]set bot avatar https://avatars.githubusercontent.com/u/23690422`` - Sets the avatar to the provided url. **Arguments:** - ``[url]`` - An image url to be used as an avatar. Leave blank when uploading an attachment. @@ -2895,6 +2895,57 @@ Removes Red's avatar. **Example:** - ``[p]set bot avatar remove`` +.. _core-command-set-bot-banner: + +"""""""""""""" +set bot banner +"""""""""""""" + +.. note:: |owner-lock| + +**Syntax** + +.. code-block:: none + + [p]set bot banner [url] + +**Description** + +Sets Red's banner + +Supports either an attachment or an image URL. + +**Examples:** + - ``[p]set bot banner`` - With an image attachment, this will set the banner. + - ``[p]set bot banner`` - Without an attachment, this will show the command help. + - ``[p]set bot banner https://opengraph.githubassets.com`` - Sets the banner to the provided url. + +**Arguments:** + - ``[url]`` - An image url to be used as an banner. Leave blank when uploading an attachment. + +.. _core-command-set-bot-banner-remove: + +""""""""""""""""""""" +set bot banner remove +""""""""""""""""""""" + +.. note:: |owner-lock| + +**Syntax** + +.. code-block:: none + + [p]set bot banner remove + +.. tip:: Alias: ``set bot banner clear`` + +**Description** + +Removes Red's banner. + +**Example:** + - ``[p]set bot banner remove`` + .. _core-command-set-bot-custominfo: """""""""""""""""" diff --git a/redbot/__main__.py b/redbot/__main__.py index d32e7fd3b..a07eeafe5 100644 --- a/redbot/__main__.py +++ b/redbot/__main__.py @@ -397,7 +397,8 @@ async def run_bot(red: Red, cli_flags: Namespace) -> None: "With that out of the way, depending on who you want to be considered as owner," " you can:\n" "a) pass --team-members-are-owners when launching Red" - " - in this case Red will treat all members of the bot application's team as owners\n" + " - in this case Red will treat members of the bot application's team as owners," + " if their team role is Owner, Admin, or Developer\n" f"b) set owner manually with `redbot --edit {cli_flags.instance_name}`\n" "c) pass owner ID(s) when launching Red with --owner" " (and --co-owner if you need more than one) flag\n" diff --git a/redbot/cogs/audio/core/events/dpy.py b/redbot/cogs/audio/core/events/dpy.py index b4327a70b..7627dc42d 100644 --- a/redbot/cogs/audio/core/events/dpy.py +++ b/redbot/cogs/audio/core/events/dpy.py @@ -40,10 +40,10 @@ HUMANIZED_PERM = { "add_reactions": _("Add Reactions"), "view_audit_log": _("View Audit Log"), "priority_speaker": _("Priority Speaker"), - "stream": _("Go Live"), + "stream": _("Video"), "read_messages": _("Read Text Channels & See Voice Channels"), "send_messages": _("Send Messages"), - "send_tts_messages": _("Send TTS Messages"), + "send_tts_messages": _("Send Text-to-speech Messages"), "manage_messages": _("Manage Messages"), "embed_links": _("Embed Links"), "attach_files": _("Attach Files"), @@ -70,12 +70,16 @@ HUMANIZED_PERM = { "create_private_threads": _("Create Private Threads"), "external_stickers": _("Use External Stickers"), "send_messages_in_threads": _("Send Messages in Threads"), - "start_embedded_activities": _("Start Activities"), - "moderate_members": _("Moderate Member"), + "use_embedded_activities": _("Use Activities"), + "moderate_members": _("Time out members"), + "view_creator_monetization_analytics": _("View Creator Monetization Analytics"), "use_soundboard": _("Use Soundboard"), "create_expressions": _("Create Expressions"), + "create_events": _("Create Events"), "use_external_sounds": _("Use External Sounds"), "send_voice_messages": _("Send Voice Messages"), + "send_polls": _("Create Polls"), + "use_external_apps": _("Use External Apps"), } DANGEROUS_COMMANDS = { diff --git a/redbot/cogs/filter/filter.py b/redbot/cogs/filter/filter.py index 04ba0054e..84a311009 100644 --- a/redbot/cogs/filter/filter.py +++ b/redbot/cogs/filter/filter.py @@ -445,7 +445,6 @@ class Filter(commands.Cog): async def filter_hits( self, - text: str, server_or_channel: Union[ discord.Guild, discord.TextChannel, @@ -453,6 +452,7 @@ class Filter(commands.Cog): discord.StageChannel, discord.Thread, ], + *texts: str, ) -> Set[str]: if isinstance(server_or_channel, discord.Guild): guild = server_or_channel @@ -483,7 +483,8 @@ class Filter(commands.Cog): self.pattern_cache[(guild.id, channel and channel.id)] = pattern if pattern: - hits |= set(pattern.findall(text)) + for text in texts: + hits |= set(pattern.findall(text)) return hits async def check_filter(self, message: discord.Message): @@ -506,7 +507,15 @@ class Filter(commands.Cog): user_count = 0 member_data["filter_count"] = user_count - hits = await self.filter_hits(message.content, message.channel) + texts = [message.content] + poll = message.poll + if poll is not None: + texts.append(poll.question or "") + for answer in poll.answers: + texts.append(answer.text or "") + for attachment in message.attachments: + texts.append(attachment.description or "") + hits = await self.filter_hits(message.channel, *texts) if hits: # modlog doesn't accept PartialMessageable @@ -607,7 +616,7 @@ class Filter(commands.Cog): await set_contextual_locales_from_guild(self.bot, guild) - if await self.filter_hits(member.display_name, member.guild): + if await self.filter_hits(member.guild, member.display_name): name_to_use = guild_data["filter_default_name"] reason = _("Filtered nickname") if member.nick else _("Filtered name") try: diff --git a/redbot/core/_cli.py b/redbot/core/_cli.py index b8dbc65e4..333e78fe7 100644 --- a/redbot/core/_cli.py +++ b/redbot/core/_cli.py @@ -267,11 +267,13 @@ def parse_cli_flags(args): ) parser.add_argument( "--team-members-are-owners", + "--team-developers-are-owners", action="store_true", dest="use_team_features", default=False, help=( - "Treat application team members as owners. " + "Treat application team members as owners, if their team role is Owner, " + "Admin, or Developer. " "This is off by default. Owners can load and run arbitrary code. " "Do not enable if you would not trust all of your team members with " "all of the data on the host machine." diff --git a/redbot/core/app_commands/__init__.py b/redbot/core/app_commands/__init__.py index a4b62e316..6369c3c2a 100644 --- a/redbot/core/app_commands/__init__.py +++ b/redbot/core/app_commands/__init__.py @@ -10,10 +10,12 @@ from discord.app_commands import ( AllChannels as AllChannels, AppCommand as AppCommand, AppCommandChannel as AppCommandChannel, + AppCommandContext as AppCommandContext, AppCommandError as AppCommandError, AppCommandGroup as AppCommandGroup, AppCommandPermissions as AppCommandPermissions, AppCommandThread as AppCommandThread, + AppInstallationType as AppInstallationType, Argument as Argument, BotMissingPermissions as BotMissingPermissions, Command as Command, @@ -45,6 +47,8 @@ from discord.app_commands import ( TranslationContextTypes as TranslationContextTypes, TranslationError as TranslationError, Translator as Translator, + allowed_contexts as allowed_contexts, + allowed_installs as allowed_installs, autocomplete as autocomplete, check as check, CheckFailure as CheckFailure, @@ -54,10 +58,14 @@ from discord.app_commands import ( context_menu as context_menu, default_permissions as default_permissions, describe as describe, + dm_only as dm_only, + guild_install as guild_install, guild_only as guild_only, guilds as guilds, locale_str as locale_str, + private_channel_only as private_channel_only, rename as rename, + user_install as user_install, ) from . import checks as checks @@ -66,10 +74,12 @@ __all__ = ( "AllChannels", "AppCommand", "AppCommandChannel", + "AppCommandContext", "AppCommandError", "AppCommandGroup", "AppCommandPermissions", "AppCommandThread", + "AppInstallationType", "Argument", "BotMissingPermissions", "Command", @@ -101,6 +111,8 @@ __all__ = ( "TranslationContextTypes", "TranslationError", "Translator", + "allowed_contexts", + "allowed_installs", "autocomplete", "check", "CheckFailure", @@ -110,9 +122,13 @@ __all__ = ( "context_menu", "default_permissions", "describe", + "dm_only", + "guild_install", "guild_only", "guilds", "locale_str", + "private_channel_only", "rename", + "user_install", "checks", ) diff --git a/redbot/core/bot.py b/redbot/core/bot.py index 2843099fe..89f711ef0 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -1257,7 +1257,11 @@ class Red( def _setup_owners(self) -> None: if self.application.team: if self._use_team_features: - self.owner_ids.update(m.id for m in self.application.team.members) + self.owner_ids.update( + m.id + for m in self.application.team.members + if m.role in (discord.TeamMemberRole.admin, discord.TeamMemberRole.developer) + ) elif self._owner_id_overwrite is None: self.owner_ids.add(self.application.owner.id) diff --git a/redbot/core/core_commands.py b/redbot/core/core_commands.py index f1a483e55..42aab5221 100644 --- a/redbot/core/core_commands.py +++ b/redbot/core/core_commands.py @@ -2848,21 +2848,12 @@ class Core(commands.commands._RuleDropper, commands.Cog, CoreLogic): ctx.bot.description = description await ctx.tick() - @_set_bot.group(name="avatar", invoke_without_command=True) - @commands.is_owner() - async def _set_bot_avatar(self, ctx: commands.Context, url: str = None): - """Sets [botname]'s avatar - - Supports either an attachment or an image URL. - - **Examples:** - - `[p]set bot avatar` - With an image attachment, this will set the avatar. - - `[p]set bot avatar` - Without an attachment, this will show the command help. - - `[p]set bot avatar https://links.flaree.xyz/k95` - Sets the avatar to the provided url. - - **Arguments:** - - `[url]` - An image url to be used as an avatar. Leave blank when uploading an attachment. - """ + async def _set_bot_image( + self, + image_type: Literal["avatar", "banner"], + ctx: commands.Context, + url: Optional[str] = None, + ): if len(ctx.message.attachments) > 0: # Attachments take priority data = await ctx.message.attachments[0].read() elif url is not None: @@ -2883,20 +2874,49 @@ class Core(commands.commands._RuleDropper, commands.Cog, CoreLogic): try: async with ctx.typing(): - await ctx.bot.user.edit(avatar=data) + if image_type == "avatar": + await ctx.bot.user.edit(avatar=data) + else: + await ctx.bot.user.edit(banner=data) except discord.HTTPException: - await ctx.send( - _( - "Failed. Remember that you can edit my avatar " - "up to two times a hour. The URL or attachment " - "must be a valid image in either JPG, PNG, or GIF format." + if image_type == "avatar": + await ctx.send( + _( + "Failed. Remember that you can edit my avatar " + "up to two times a hour. The URL or attachment " + "must be a valid image in either JPG, PNG, GIF, or WEBP format." + ) + ) + else: + await ctx.send( + _( + "Failed. Remember that you can edit my banner " + "up to two times a hour. The URL or attachment " + "must be a valid image in either JPG, PNG, GIF, or WEBP format." + ) ) - ) except ValueError: - await ctx.send(_("JPG / PNG / GIF format only.")) + await ctx.send(_("JPG / PNG / GIF / WEBP format only.")) else: await ctx.send(_("Done.")) + @_set_bot.group(name="avatar", invoke_without_command=True) + @commands.is_owner() + async def _set_bot_avatar(self, ctx: commands.Context, url: str = None): + """Sets [botname]'s avatar + + Supports either an attachment or an image URL. + + **Examples:** + - `[p]set bot avatar` - With an image attachment, this will set the avatar. + - `[p]set bot avatar` - Without an attachment, this will show the command help. + - `[p]set bot avatar https://avatars.githubusercontent.com/u/23690422` - Sets the avatar to the provided url. + + **Arguments:** + - `[url]` - An image url to be used as an avatar. Leave blank when uploading an attachment. + """ + await self._set_bot_image("avatar", ctx, url) + @_set_bot_avatar.command(name="remove", aliases=["clear"]) @commands.is_owner() async def _set_bot_avatar_remove(self, ctx: commands.Context): @@ -2910,6 +2930,36 @@ class Core(commands.commands._RuleDropper, commands.Cog, CoreLogic): await ctx.bot.user.edit(avatar=None) await ctx.send(_("Avatar removed.")) + @_set_bot.group(name="banner", invoke_without_command=True) + @commands.is_owner() + async def _set_bot_banner(self, ctx: commands.Context, url: str = None): + """Sets [botname]'s banner + + Supports either an attachment or an image URL. + + **Examples:** + - `[p]set bot banner` - With an image attachment, this will set the banner. + - `[p]set bot banner` - Without an attachment, this will show the command help. + - `[p]set bot banner https://opengraph.githubassets.com` - Sets the banner to the provided url. + + **Arguments:** + - `[url]` - An image url to be used as an banner. Leave blank when uploading an attachment. + """ + await self._set_bot_image("banner", ctx, url) + + @_set_bot_banner.command(name="remove", aliases=["clear"]) + @commands.is_owner() + async def _set_bot_banner_remove(self, ctx: commands.Context): + """ + Removes [botname]'s banner. + + **Example:** + - `[p]set bot banner remove` + """ + async with ctx.typing(): + await ctx.bot.user.edit(banner=None) + await ctx.send(_("Banner removed.")) + @_set_bot.command(name="username", aliases=["name"]) @commands.is_owner() async def _set_bot_username(self, ctx: commands.Context, *, username: str): diff --git a/requirements/base.txt b/requirements/base.txt index 8edee2c89..d0e706fae 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -20,7 +20,7 @@ click==8.1.7 # via -r base.in contextlib2==21.6.0 # via schema -discord-py==2.3.2 +discord-py==2.4.0 # via # -r base.in # red-lavalink