aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Leon Sandøy <[email protected]>2020-07-15 07:22:59 +0200
committerGravatar Leon Sandøy <[email protected]>2020-07-15 07:22:59 +0200
commit6ccbb944a50058cea74bfdfe855a538b09ab67b7 (patch)
tree29db1c97e75dee852ab33897bb4c1fb55705f2a4
parentRemove caching of last_dm_user. (diff)
Restore DM user caching.
This reverts commit 042f472a
-rw-r--r--bot/cogs/dm_relay.py28
1 files changed, 22 insertions, 6 deletions
diff --git a/bot/cogs/dm_relay.py b/bot/cogs/dm_relay.py
index f62d6105e..9a68b5341 100644
--- a/bot/cogs/dm_relay.py
+++ b/bot/cogs/dm_relay.py
@@ -1,4 +1,5 @@
import logging
+from typing import Optional
import discord
from discord import Color
@@ -7,6 +8,7 @@ from discord.ext.commands import Cog
from bot import constants
from bot.bot import Bot
+from bot.utils import RedisCache
from bot.utils.checks import in_whitelist_check, with_role_check
from bot.utils.messages import send_attachments
from bot.utils.webhooks import send_webhook
@@ -17,6 +19,9 @@ log = logging.getLogger(__name__)
class DMRelay(Cog):
"""Relay direct messages to and from the bot."""
+ # RedisCache[str, t.Union[discord.User.id, discord.Member.id]]
+ dm_cache = RedisCache()
+
def __init__(self, bot: Bot):
self.bot = bot
self.webhook_id = constants.Webhooks.dm_log
@@ -24,11 +29,11 @@ class DMRelay(Cog):
self.bot.loop.create_task(self.fetch_webhook())
@commands.command(aliases=("reply",))
- async def send_dm(self, ctx: commands.Context, member: discord.Member, *, message: str) -> None:
+ async def send_dm(self, ctx: commands.Context, member: Optional[discord.Member], *, message: str) -> None:
"""
Allows you to send a DM to a user from the bot.
- A `member` must be provided.
+ If `member` is not provided, it will send to the last user who DM'd the bot.
This feature should be used extremely sparingly. Use ModMail if you need to have a serious
conversation with a user. This is just for responding to extraordinary DMs, having a little
@@ -36,11 +41,21 @@ class DMRelay(Cog):
NOTE: This feature will be removed if it is overused.
"""
- try:
- await member.send(message)
- await ctx.message.add_reaction("✅")
- return
+ user_id = await self.dm_cache.get("last_user")
+ last_dm_user = ctx.guild.get_member(user_id) if user_id else None
+ try:
+ if member:
+ await member.send(message)
+ await ctx.message.add_reaction("✅")
+ return
+ elif last_dm_user:
+ await last_dm_user.send(message)
+ await ctx.message.add_reaction("✅")
+ return
+ else:
+ log.debug("This bot has never gotten a DM, or the RedisCache has been cleared.")
+ await ctx.message.add_reaction("❌")
except discord.errors.Forbidden:
log.debug("User has disabled DMs.")
await ctx.message.add_reaction("❌")
@@ -68,6 +83,7 @@ class DMRelay(Cog):
username=message.author.display_name,
avatar_url=message.author.avatar_url
)
+ await self.dm_cache.set("last_user", message.author.id)
# Handle any attachments
if message.attachments: