mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-12-08 18:32:32 -05:00
Discord.py dep update 3.1 (#2587)
* Dependency update discord.py==1.0.1 websockets<7 [style] black==19.3b0 [Docs] jinja==2.10.1 urllib3==1.24.2 Changes related to breaking changes from discord.py have also been made to match As of this commit, help formatter is back to discord.py's default
This commit is contained in:
@@ -66,7 +66,7 @@ class Admin(commands.Cog):
|
||||
|
||||
self.__current_announcer = None
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
try:
|
||||
self.__current_announcer.cancel()
|
||||
except AttributeError:
|
||||
|
||||
@@ -20,7 +20,7 @@ class MemberDefaultAuthor(commands.Converter):
|
||||
|
||||
class SelfRole(commands.Converter):
|
||||
async def convert(self, ctx: commands.Context, arg: str) -> discord.Role:
|
||||
admin = ctx.command.instance
|
||||
admin = ctx.command.cog
|
||||
if admin is None:
|
||||
raise commands.BadArgument(_("The Admin cog is not loaded."))
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ from string import Formatter
|
||||
from typing import Generator, Tuple, Iterable, Optional
|
||||
|
||||
import discord
|
||||
from discord.ext.commands.view import StringView, quoted_word
|
||||
from discord.ext.commands.view import StringView
|
||||
from redbot.core import Config, commands, checks
|
||||
from redbot.core.i18n import Translator, cog_i18n
|
||||
from redbot.core.utils.chat_formatting import box
|
||||
@@ -182,7 +182,7 @@ class Alias(commands.Cog):
|
||||
extra = []
|
||||
while not view.eof:
|
||||
prev = view.index
|
||||
word = quoted_word(view)
|
||||
word = view.get_quoted_word(view)
|
||||
if len(word) < view.index - prev:
|
||||
word = "".join((view.buffer[prev], word, view.buffer[view.index - 1]))
|
||||
extra.append(word)
|
||||
@@ -434,6 +434,7 @@ class Alias(commands.Cog):
|
||||
else:
|
||||
await ctx.send(box("\n".join(names), "diff"))
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message: discord.Message):
|
||||
aliases = list(await self.unloaded_global_aliases())
|
||||
if message.guild is not None:
|
||||
|
||||
@@ -54,7 +54,7 @@ class AliasEntry:
|
||||
if bot:
|
||||
ret.has_real_data = True
|
||||
ret.creator = bot.get_user(int(data["creator"]))
|
||||
guild = bot.get_guild(int(data["guild"]))
|
||||
guild = bot.fetch_guild(int(data["guild"]))
|
||||
ret.guild = guild
|
||||
else:
|
||||
ret.guild = data["guild"]
|
||||
|
||||
@@ -3493,6 +3493,7 @@ class Audio(commands.Cog):
|
||||
)
|
||||
return r
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_voice_state_update(self, member, before, after):
|
||||
if after.channel != before.channel:
|
||||
try:
|
||||
@@ -3500,7 +3501,7 @@ class Audio(commands.Cog):
|
||||
except (ValueError, KeyError, AttributeError):
|
||||
pass
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
if not self._cleaned_up:
|
||||
self.session.detach()
|
||||
|
||||
@@ -3515,8 +3516,9 @@ class Audio(commands.Cog):
|
||||
shutdown_lavalink_server()
|
||||
self._cleaned_up = True
|
||||
|
||||
__del__ = __unload
|
||||
__del__ = cog_unload
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_guild_remove(self, guild: discord.Guild):
|
||||
"""
|
||||
This is to clean up players when
|
||||
|
||||
@@ -90,7 +90,7 @@ class Cleanup(commands.Cog):
|
||||
|
||||
collected = []
|
||||
async for message in channel.history(
|
||||
limit=None, before=before, after=after, reverse=False
|
||||
limit=None, before=before, after=after, oldest_first=False
|
||||
):
|
||||
if message.created_at < two_weeks_ago:
|
||||
break
|
||||
@@ -223,7 +223,7 @@ class Cleanup(commands.Cog):
|
||||
author = ctx.author
|
||||
|
||||
try:
|
||||
after = await channel.get_message(message_id)
|
||||
after = await channel.fetch_message(message_id)
|
||||
except discord.NotFound:
|
||||
return await ctx.send(_("Message not found."))
|
||||
|
||||
|
||||
@@ -434,6 +434,7 @@ class CustomCommands(commands.Cog):
|
||||
for p in pagify(text):
|
||||
await ctx.send(box(p, lang="yaml"))
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message):
|
||||
is_private = isinstance(message.channel, discord.abc.PrivateChannel)
|
||||
|
||||
|
||||
@@ -564,12 +564,12 @@ class Downloader(commands.Cog):
|
||||
return
|
||||
|
||||
# Check if in installed cogs
|
||||
cog_name = self.cog_name_from_instance(command.instance)
|
||||
cog_name = self.cog_name_from_instance(command.cog)
|
||||
installed, cog_installable = await self.is_installed(cog_name)
|
||||
if installed:
|
||||
msg = self.format_findcog_info(command_name, cog_installable)
|
||||
else:
|
||||
# Assume it's in a base cog
|
||||
msg = self.format_findcog_info(command_name, command.instance)
|
||||
msg = self.format_findcog_info(command_name, command.cog)
|
||||
|
||||
await ctx.send(box(msg))
|
||||
|
||||
@@ -33,7 +33,7 @@ class Filter(commands.Cog):
|
||||
self.register_task = self.bot.loop.create_task(self.register_filterban())
|
||||
self.pattern_cache = {}
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
self.register_task.cancel()
|
||||
|
||||
@staticmethod
|
||||
@@ -409,6 +409,7 @@ class Filter(commands.Cog):
|
||||
reason,
|
||||
)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message: discord.Message):
|
||||
if isinstance(message.channel, discord.abc.PrivateChannel):
|
||||
return
|
||||
@@ -422,15 +423,18 @@ class Filter(commands.Cog):
|
||||
|
||||
await self.check_filter(message)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message_edit(self, _prior, message):
|
||||
# message content has to change for non-bot's currently.
|
||||
# if this changes, we should compare before passing it.
|
||||
await self.on_message(message)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_update(self, before: discord.Member, after: discord.Member):
|
||||
if before.display_name != after.display_name:
|
||||
await self.maybe_filter_name(after)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_join(self, member: discord.Member):
|
||||
await self.maybe_filter_name(member)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class Image(commands.Cog):
|
||||
self.session = aiohttp.ClientSession()
|
||||
self.imgur_base_url = "https://api.imgur.com/3/"
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
self.session.detach()
|
||||
|
||||
async def initialize(self) -> None:
|
||||
|
||||
@@ -8,7 +8,7 @@ from redbot.core.bot import Red
|
||||
|
||||
class MixinMeta(ABC):
|
||||
"""
|
||||
Metaclass for well behaved type hint detection with composite class.
|
||||
Base class for well behaved type hint detection with composite class.
|
||||
|
||||
Basically, to keep developers sane when not all attributes are defined in each mixin.
|
||||
"""
|
||||
|
||||
@@ -2,7 +2,7 @@ from datetime import datetime
|
||||
from collections import defaultdict, deque
|
||||
|
||||
import discord
|
||||
from redbot.core import i18n, modlog
|
||||
from redbot.core import i18n, modlog, commands
|
||||
from redbot.core.utils.mod import is_mod_or_superior
|
||||
from . import log
|
||||
from .abc import MixinMeta
|
||||
@@ -73,6 +73,7 @@ class Events(MixinMeta):
|
||||
return True
|
||||
return False
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message):
|
||||
author = message.author
|
||||
if message.guild is None or self.bot.user == author:
|
||||
@@ -92,6 +93,7 @@ class Events(MixinMeta):
|
||||
if not deleted:
|
||||
await self.check_mention_spam(message)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_ban(self, guild: discord.Guild, member: discord.Member):
|
||||
if (guild.id, member.id) in self.ban_queue:
|
||||
self.ban_queue.remove((guild.id, member.id))
|
||||
@@ -112,6 +114,7 @@ class Events(MixinMeta):
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_unban(self, guild: discord.Guild, user: discord.User):
|
||||
if (guild.id, user.id) in self.unban_queue:
|
||||
self.unban_queue.remove((guild.id, user.id))
|
||||
@@ -130,8 +133,8 @@ class Events(MixinMeta):
|
||||
except RuntimeError as e:
|
||||
print(e)
|
||||
|
||||
@staticmethod
|
||||
async def on_modlog_case_create(case: modlog.Case):
|
||||
@commands.Cog.listener()
|
||||
async def on_modlog_case_create(self, case: modlog.Case):
|
||||
"""
|
||||
An event for modlog case creation
|
||||
"""
|
||||
@@ -147,8 +150,8 @@ class Events(MixinMeta):
|
||||
msg = await mod_channel.send(case_content)
|
||||
await case.edit({"message": msg})
|
||||
|
||||
@staticmethod
|
||||
async def on_modlog_case_edit(case: modlog.Case):
|
||||
@commands.Cog.listener()
|
||||
async def on_modlog_case_edit(self, case: modlog.Case):
|
||||
"""
|
||||
Event for modlog case edits
|
||||
"""
|
||||
@@ -161,6 +164,7 @@ class Events(MixinMeta):
|
||||
else:
|
||||
await case.message.edit(content=case_content)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_update(self, before: discord.Member, after: discord.Member):
|
||||
if before.name != after.name:
|
||||
async with self.settings.user(before).past_names() as name_list:
|
||||
|
||||
@@ -131,7 +131,7 @@ class KickBanMixin(MixinMeta):
|
||||
)
|
||||
now = datetime.utcnow()
|
||||
if now > unban_time: # Time to unban the user
|
||||
user = await self.bot.get_user_info(uid)
|
||||
user = await self.bot.fetch_user(uid)
|
||||
queue_entry = (guild.id, user.id)
|
||||
self.unban_queue.append(queue_entry)
|
||||
try:
|
||||
@@ -335,7 +335,7 @@ class KickBanMixin(MixinMeta):
|
||||
else:
|
||||
banned.append(user_id)
|
||||
|
||||
user_info = await self.bot.get_user_info(user_id)
|
||||
user_info = await self.bot.fetch_user(user_id)
|
||||
|
||||
try:
|
||||
await modlog.create_case(
|
||||
@@ -508,7 +508,7 @@ class KickBanMixin(MixinMeta):
|
||||
click the user and select 'Copy ID'."""
|
||||
guild = ctx.guild
|
||||
author = ctx.author
|
||||
user = await self.bot.get_user_info(user_id)
|
||||
user = await self.bot.fetch_user(user_id)
|
||||
if not user:
|
||||
await ctx.send(_("Couldn't find a user with that ID!"))
|
||||
return
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from collections import defaultdict
|
||||
from typing import List, Tuple
|
||||
from abc import ABC
|
||||
|
||||
import discord
|
||||
from redbot.core import Config, modlog, commands
|
||||
@@ -18,8 +19,26 @@ _ = T_ = Translator("Mod", __file__)
|
||||
__version__ = "1.0.0"
|
||||
|
||||
|
||||
class CompositeMetaClass(type(commands.Cog), type(ABC)):
|
||||
"""
|
||||
This allows the metaclass used for proper type detection to
|
||||
coexist with discord.py's metaclass
|
||||
"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
@cog_i18n(_)
|
||||
class Mod(ModSettings, Events, KickBanMixin, MoveToCore, MuteMixin, ModInfo, commands.Cog):
|
||||
class Mod(
|
||||
ModSettings,
|
||||
Events,
|
||||
KickBanMixin,
|
||||
MoveToCore,
|
||||
MuteMixin,
|
||||
ModInfo,
|
||||
commands.Cog,
|
||||
metaclass=CompositeMetaClass,
|
||||
):
|
||||
"""Moderation tools."""
|
||||
|
||||
default_global_settings = {"version": ""}
|
||||
@@ -60,7 +79,7 @@ class Mod(ModSettings, Events, KickBanMixin, MoveToCore, MuteMixin, ModInfo, com
|
||||
async def initialize(self):
|
||||
await self._maybe_update_config()
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
self.registration_task.cancel()
|
||||
self.tban_expiry_task.cancel()
|
||||
|
||||
@@ -87,7 +106,7 @@ class Mod(ModSettings, Events, KickBanMixin, MoveToCore, MuteMixin, ModInfo, com
|
||||
|
||||
# TODO: Move this to core.
|
||||
# This would be in .movetocore , but the double-under name here makes that more trouble
|
||||
async def __global_check(self, ctx):
|
||||
async def bot_check(self, ctx):
|
||||
"""Global check to see if a channel or server is ignored.
|
||||
|
||||
Any users who have permission to use the `ignore` or `unignore` commands
|
||||
|
||||
@@ -16,10 +16,12 @@ class MoveToCore(MixinMeta):
|
||||
Mixin for things which should really not be in mod, but have not been moved out yet.
|
||||
"""
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_command_completion(self, ctx: commands.Context):
|
||||
await self._delete_delay(ctx)
|
||||
|
||||
# noinspection PyUnusedLocal
|
||||
@commands.Cog.listener()
|
||||
async def on_command_error(self, ctx: commands.Context, error):
|
||||
await self._delete_delay(ctx)
|
||||
|
||||
|
||||
@@ -8,6 +8,6 @@ async def setup(bot):
|
||||
# the permissions commands themselves have rules added.
|
||||
# Automatic listeners being added in add_cog happen in arbitrary
|
||||
# order, so we want to circumvent that.
|
||||
bot.add_listener(cog.cog_added, "on_cog_add")
|
||||
bot.add_listener(cog.command_added, "on_command_add")
|
||||
bot.add_listener(cog.red_cog_added, "on_cog_add")
|
||||
bot.add_listener(cog.red_command_added, "on_command_add")
|
||||
bot.add_cog(cog)
|
||||
|
||||
@@ -433,20 +433,26 @@ class Permissions(commands.Cog):
|
||||
await self._clear_rules(guild_id=ctx.guild.id)
|
||||
await ctx.tick()
|
||||
|
||||
async def cog_added(self, cog: commands.Cog) -> None:
|
||||
async def red_cog_added(self, cog: commands.Cog) -> None:
|
||||
"""Event listener for `cog_add`.
|
||||
|
||||
This loads rules whenever a new cog is added.
|
||||
|
||||
Do not convert to using Cog.listener decorator !!
|
||||
This *must* be added manually prior to cog load, and removed at unload
|
||||
"""
|
||||
self._load_rules_for(
|
||||
cog_or_command=cog,
|
||||
rule_dict=await self.config.custom(COG, cog.__class__.__name__).all(),
|
||||
)
|
||||
|
||||
async def command_added(self, command: commands.Command) -> None:
|
||||
async def red_command_added(self, command: commands.Command) -> None:
|
||||
"""Event listener for `command_add`.
|
||||
|
||||
This loads rules whenever a new command is added.
|
||||
|
||||
Do not convert to using Cog.listener decorator !!
|
||||
This *must* be added manually prior to cog load, and removed at unload
|
||||
"""
|
||||
self._load_rules_for(
|
||||
cog_or_command=command,
|
||||
@@ -701,9 +707,9 @@ class Permissions(commands.Cog):
|
||||
elif rule is False:
|
||||
cog_or_command.deny_to(model_id, guild_id=guild_id)
|
||||
|
||||
def __unload(self) -> None:
|
||||
self.bot.remove_listener(self.cog_added, "on_cog_add")
|
||||
self.bot.remove_listener(self.command_added, "on_command_add")
|
||||
def cog_unload(self) -> None:
|
||||
self.bot.remove_listener(self.red_cog_added, "on_cog_add")
|
||||
self.bot.remove_listener(self.red_command_added, "on_command_add")
|
||||
self.bot.loop.create_task(self._unload_all_rules())
|
||||
|
||||
async def _unload_all_rules(self) -> None:
|
||||
|
||||
@@ -289,6 +289,7 @@ class Reports(commands.Cog):
|
||||
except discord.NotFound:
|
||||
pass
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_raw_reaction_add(self, payload):
|
||||
"""
|
||||
oh dear....
|
||||
@@ -308,6 +309,7 @@ class Reports(commands.Cog):
|
||||
)
|
||||
self.tunnel_store.pop(t[0], None)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self, message: discord.Message):
|
||||
for k, v in self.tunnel_store.items():
|
||||
topic = _("Re: ticket# {1} in {0.name}").format(*k)
|
||||
|
||||
@@ -614,7 +614,7 @@ class Streams(commands.Cog):
|
||||
chn = self.bot.get_channel(raw_msg["channel"])
|
||||
if chn is not None:
|
||||
try:
|
||||
msg = await chn.get_message(raw_msg["message"])
|
||||
msg = await chn.fetch_message(raw_msg["message"])
|
||||
except discord.HTTPException:
|
||||
pass
|
||||
else:
|
||||
@@ -633,8 +633,8 @@ class Streams(commands.Cog):
|
||||
|
||||
await self.db.streams.set(raw_streams)
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
if self.task:
|
||||
self.task.cancel()
|
||||
|
||||
__del__ = __unload
|
||||
__del__ = cog_unload
|
||||
|
||||
@@ -444,6 +444,7 @@ class Trivia(commands.Cog):
|
||||
break
|
||||
return "\n".join(lines)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_trivia_end(self, session: TriviaSession):
|
||||
"""Event for a trivia session ending.
|
||||
|
||||
@@ -520,7 +521,7 @@ class Trivia(commands.Cog):
|
||||
|
||||
return personal_lists + get_core_lists()
|
||||
|
||||
def __unload(self):
|
||||
def cog_unload(self):
|
||||
for session in self.trivia_sessions:
|
||||
session.force_stop()
|
||||
|
||||
|
||||
@@ -380,7 +380,7 @@ class Warnings(commands.Cog):
|
||||
self.bot.get_all_members(), id=user_warnings[key]["mod"]
|
||||
)
|
||||
if mod is None:
|
||||
mod = await self.bot.get_user_info(user_warnings[key]["mod"])
|
||||
mod = await self.bot.fetch_user(user_warnings[key]["mod"])
|
||||
msg += _(
|
||||
"{num_points} point warning {reason_name} issued by {user} for "
|
||||
"{description}\n"
|
||||
|
||||
Reference in New Issue
Block a user