aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/moderation/voice_gate.py38
1 files changed, 27 insertions, 11 deletions
diff --git a/bot/exts/moderation/voice_gate.py b/bot/exts/moderation/voice_gate.py
index 0cbce6a51..9d51d37f5 100644
--- a/bot/exts/moderation/voice_gate.py
+++ b/bot/exts/moderation/voice_gate.py
@@ -40,6 +40,12 @@ VOICE_PING = (
"If you don't yet qualify, you'll be told why!"
)
+VOICE_PING_DM = (
+ "Wondering why you can't talk in the voice channels? "
+ "Use the `!voiceverify` command in {channel_mention} to verify. "
+ "If you don't yet qualify, you'll be told why!"
+)
+
class VoiceGate(Cog):
"""Voice channels verification management."""
@@ -75,7 +81,7 @@ class VoiceGate(Cog):
log.trace(f"Voice gate reminder message for user {member_id} was already removed")
@redis_cache.atomic_transaction
- async def _ping_newcomer(self, member: discord.Member) -> bool:
+ async def _ping_newcomer(self, member: discord.Member) -> tuple:
"""
See if `member` should be sent a voice verification notification, and send it if so.
@@ -87,23 +93,28 @@ class VoiceGate(Cog):
"""
if await self.redis_cache.contains(member.id):
log.trace("User already in cache. Ignore.")
- return False
+ return False, None
log.trace("User not in cache and is in a voice channel.")
verified = any(Roles.voice_verified == role.id for role in member.roles)
if verified:
log.trace("User is verified, add to the cache and ignore.")
await self.redis_cache.set(member.id, NO_MSG)
- return False
+ return False, None
log.trace("User is unverified. Send ping.")
+
await self.bot.wait_until_guild_available()
voice_verification_channel = self.bot.get_channel(Channels.voice_gate)
- message = await voice_verification_channel.send(f"Hello, {member.mention}! {VOICE_PING}")
- await self.redis_cache.set(member.id, message.id)
+ try:
+ message = await member.send(VOICE_PING_DM.format(channel_mention=voice_verification_channel.mention))
+ except discord.Forbidden:
+ log.trace("DM failed for Voice ping message. Sending in channel.")
+ message = await voice_verification_channel.send(f"Hello, {member.mention}! {VOICE_PING}")
- return True
+ await self.redis_cache.set(member.id, message.id)
+ return True, message.channel
@command(aliases=('voiceverify',))
@has_no_roles(Roles.voice_verified)
@@ -144,8 +155,13 @@ class VoiceGate(Cog):
color=Colour.red()
)
log.warning(f"Got response code {e.status} while trying to get {ctx.author.id} Metricity data.")
-
- await ctx.author.send(embed=embed)
+ try:
+ await ctx.author.send(embed=embed)
+ except discord.Forbidden:
+ log.info("Could not send user DM. Sending in voice-verify channel and scheduling delete.")
+ message = await ctx.send(embed=embed)
+ await asyncio.sleep(GateConf.voice_ping_delete_delay)
+ await message.delete()
return
checks = {
@@ -239,11 +255,11 @@ class VoiceGate(Cog):
# To avoid race conditions, checking if the user should receive a notification
# and sending it if appropriate is delegated to an atomic helper
- notification_sent = await self._ping_newcomer(member)
+ notification_sent, message_channel = await self._ping_newcomer(member)
- # Schedule the notification to be deleted after the configured delay, which is
+ # Schedule the channel ping notification to be deleted after the configured delay, which is
# again delegated to an atomic helper
- if notification_sent:
+ if notification_sent and isinstance(message_channel, discord.TextChannel):
await asyncio.sleep(GateConf.voice_ping_delete_delay)
await self._delete_ping(member.id)