11import re
2+ from asyncio import sleep
23from random import randint
34
5+ import humanize
46from 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