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:
Michael H
2019-04-23 21:40:38 -04:00
committed by GitHub
parent 0ff7259bc3
commit ad114295e7
83 changed files with 231 additions and 22307 deletions

View File

@@ -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:

View File

@@ -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."))

View File

@@ -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:

View File

@@ -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"]

View File

@@ -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

View File

@@ -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."))

View File

@@ -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)

View File

@@ -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))

View File

@@ -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)

View File

@@ -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:

View File

@@ -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.
"""

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View File

@@ -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"