Skip to content

Commit f53b913

Browse files
AmbratolmAmbratolm
authored andcommitted
Farm: Enhanced logging w/ timeout/kick/ban events.
1 parent fd16285 commit f53b913

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

bot/cogs/game_cogs/farm_cog.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import re
2+
from asyncio import sleep
23
from random import randint
34

5+
import humanize
46
from discord import (
57
Attachment,
8+
AuditLogAction,
69
Embed,
710
Guild,
811
HTTPException,
@@ -122,7 +125,31 @@ async def on_member_remove(self, member: Member):
122125
member.guild.get_channel(log_room.channel_id) if log_room else None
123126
)
124127
if log_channel and isinstance(log_channel, TextChannel):
125-
await log_channel.send(f"🔴 {member.mention} left.")
128+
await sleep(1) # Wait for audit log to update
129+
action_taken = False
130+
# Check for kick
131+
async for entry in member.guild.audit_logs(
132+
limit=5, action=AuditLogAction.kick
133+
):
134+
if entry.target and entry.target.id == member.id:
135+
await log_channel.send(
136+
f"👢 {member.name} was kicked by {entry.user.mention} for reason: {entry.reason or '_No reason provided_'}"
137+
)
138+
action_taken = True
139+
break
140+
# Check for ban if not kicked
141+
if not action_taken:
142+
async for entry in member.guild.audit_logs(
143+
limit=5, action=AuditLogAction.ban
144+
):
145+
if entry.target and entry.target.id == member.id:
146+
await log_channel.send(
147+
f"🔨 {member.name} was banned by {entry.user.mention} for reason: {entry.reason or '_No reason provided_'}"
148+
)
149+
action_taken = True
150+
break
151+
if not action_taken:
152+
await log_channel.send(f"🔴 {member.mention} left.")
126153

127154
db = self.bot.get_db(member.guild)
128155
actor = db.find_one(Actor, Actor.id == member.id)
@@ -131,6 +158,50 @@ async def on_member_remove(self, member: Member):
131158
actor.is_member = False
132159
db.save(actor)
133160

161+
# ----------------------------------------------------------------------------------------------------
162+
# * On Member Update
163+
# ----------------------------------------------------------------------------------------------------
164+
@Cog.listener()
165+
async def on_member_update(self, before: Member, after: Member):
166+
log_room = self.load_room(id=FarmCog.__name__, guild=after.guild)
167+
if not log_room:
168+
return
169+
170+
log_channel = after.guild.get_channel(log_room.channel_id)
171+
if not (log_channel and isinstance(log_channel, TextChannel)):
172+
return
173+
174+
# Check for timeout added
175+
if not before.is_timed_out() and after.is_timed_out() and after.timed_out_until:
176+
entry = None
177+
await sleep(1) # Wait for audit log to update
178+
async for e in after.guild.audit_logs(
179+
limit=5, action=AuditLogAction.member_update
180+
):
181+
if (
182+
e.target
183+
and e.target.id == after.id
184+
and e.changes.after.timed_out_until is not None
185+
):
186+
entry = e
187+
break
188+
189+
moderator = entry.user.mention if entry and entry.user else "Unknown"
190+
reason = (
191+
entry.reason or "_No reason provided_"
192+
if entry
193+
else "_No reason provided_"
194+
)
195+
196+
time_left = humanize.naturaldelta(after.timed_out_until - utils.utcnow())
197+
await log_channel.send(
198+
f"🔇 {after.mention} timed out by {moderator} for **{time_left}** for reason: {reason}"
199+
)
200+
201+
# Check for timeout removed
202+
elif before.is_timed_out() and not after.is_timed_out():
203+
await log_channel.send(f"🔊 {after.mention}'s timeout removed.")
204+
134205
# ----------------------------------------------------------------------------------------------------
135206
# * On Message
136207
# ----------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)