diff --git a/README.md b/README.md
index 980066ca7e..eef9e3f940 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -24,7 +24,7 @@
-
+
@@ -159,6 +159,13 @@ Discord Advice Center:
+
+
+Blacklight Promotions:
+
+
+
+
Become a sponsor on [Patreon](https://patreon.com/kyber).
diff --git a/bot.py b/bot.py
index 3c6ebe7911..bcf67e5f9a 100644
--- a/bot.py
+++ b/bot.py
@@ -640,6 +640,16 @@ async def get_or_fetch_user(self, id: int) -> discord.User:
"""
return self.get_user(id) or await self.fetch_user(id)
+ @staticmethod
+ async def get_or_fetch_member(guild: discord.Guild, member_id: int) -> typing.Optional[discord.Member]:
+ """
+ Attempt to get a member from cache; on failure fetch from the API.
+
+ Returns:
+ The :obj:`discord.Member` or :obj:`None` to indicate the member could not be found.
+ """
+ return guild.get_member(member_id) or await guild.fetch_member(member_id)
+
async def retrieve_emoji(self) -> typing.Tuple[str, str]:
sent_emoji = self.config["sent_emoji"]
blocked_emoji = self.config["blocked_emoji"]
diff --git a/core/thread.py b/core/thread.py
index 81dc03f44d..00060ab7f5 100644
--- a/core/thread.py
+++ b/core/thread.py
@@ -823,7 +823,13 @@ async def reply(
"""Returns List[user_dm_msg] and thread_channel_msg"""
if not message.content and not message.attachments and not message.stickers:
raise MissingRequiredArgument(DummyParam("msg"))
- if not any(g.get_member(self.id) for g in self.bot.guilds):
+ for guild in self.bot.guilds:
+ try:
+ if await self.bot.get_or_fetch_member(guild, self.id):
+ break
+ except discord.NotFound:
+ pass
+ else:
return await message.channel.send(
embed=discord.Embed(
color=self.bot.error_color,
@@ -995,7 +1001,7 @@ async def send(
attachments.append(attachment)
image_urls = re.findall(
- r"http[s]?:\/\/(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+",
+ r"http[s]?:\/\/(?:[a-zA-Z]|[0-9]|[$\-_@.&+]|[!*(),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+",
message.content,
)