async def on_member_remove(member): # Log left/kicked/banned members guild = member.guild if not guild_config.getlog(guild, 'usrlog'): return member_stalker.update('first_join', member) member_stalker.update('last_roles', member) now = datetime.utcnow() lastseen = member_stalker.get('last_seen', member) if lastseen is not None: lastseenmsg = ( f'This user was last seen on `{lastseen.strftime("%d/%m/%Y %H:%M:%S")}` ' f'({max(0, (now-lastseen).days)} days ago)') else: lastseenmsg = 'This user has not spoken to my knowledge.' embed = dc.Embed( color=dc.Color.red(), timestamp=now, description=f':red_circle: **{member}** has left **{guild}**!\n' f'The guild now has {guild.member_count} members!\n{lastseenmsg}') embed.set_author(name=f'A user left or got bucked off.') embed.set_thumbnail(url=member.avatar_url) embed.add_field( name='**Roles Snagged:**', value=(', '.join(f'`{guild.get_role(role).name}`' for role in member_stalker.get('last_roles', member)) or None), inline=False) embed.add_field(name='**User ID:**', value=f'`{member.id}`') await guild_config.log(guild, 'usrlog', embed=embed)
async def on_member_update(bfr, aft): # Log role and nickname changes guild = bfr.guild if not guild_config.getlog(guild, 'msglog'): return if bfr.nick != aft.nick: embed = dc.Embed( color=dc.Color.magenta(), timestamp=datetime.utcnow(), description= f'**{bfr}** had their nickname changed to **{aft.nick}**', ) embed.set_author(name='Nickname Update:', icon_url=aft.avatar_url) embed.add_field(name='**User ID:**', value=f'`{aft.id}`', inline=False) await guild_config.log(guild, 'msglog', embed=embed) if bfr.roles != aft.roles: embed = dc.Embed( color=dc.Color.teal(), timestamp=datetime.utcnow(), description=f'**{bfr}** had the following roles changed:', ) embed.set_author(name='Role Update:', icon_url=aft.avatar_url) rolesprev, rolesnext = set(bfr.roles), set(aft.roles) embed.add_field(name='**Roles Added:**', value=', '.join(f'`{role.name}`' for role in rolesnext - rolesprev) or None, inline=False) embed.add_field(name='**Roles Removed:**', value=', '.join(f'`{role.name}`' for role in rolesprev - rolesnext) or None, inline=False) embed.add_field(name='**User ID:**', value=f'`{aft.id}`', inline=False) await guild_config.log(guild, 'msglog', embed=embed)
async def on_message_delete(msg): # Log deleted messages if msg.guild is None: return guild = msg.channel.guild if not guild_config.getlog(guild, 'msglog'): return embed = dc.Embed( color=dc.Color.darker_grey(), timestamp=msg.created_at, description=msg.content, ) embed.set_author( name=f'@{msg.author} deleted a message in #{msg.channel}:', icon_url=msg.author.avatar_url, ) embed.add_field(name='**Message ID:**', value=f'`{msg.id}`') embed.add_field(name='**User ID:**', value=f'`{msg.author.id}`') if msg.attachments: # att_channel = bot.get_channel(att_chid) embed.add_field( name='**Attachments:**', value='\n'.join(att.url for att in msg.attachments), inline=False, ) await guild_config.log(guild, 'msglog', embed=embed)
async def on_member_ban(guild, user): # Log member full bans if not guild_config.getlog(guild, 'modlog'): return async for entry in guild.audit_logs(limit=256, action=dc.AuditLogAction.ban): if entry.target.id == user.id: break else: await guild_config.log( guild, f'The last ban of {user} `{user.id}` could not be found in the audit log.', ) return author = entry.user embed = dc.Embed( color=author.color, timestamp=datetime.utcnow(), description=f'**{author}** has full banned :hammer: **{user}**!') embed.set_author(name=f'Good riddance.', icon_url=author.avatar_url) embed.set_thumbnail(url=user.avatar_url) embed.add_field( name='**Reason:**', value=entry.reason or 'None specified.', inline=False, ) embed.add_field( name='**Roles Snagged:**', value=(', '.join(f'`{guild.get_role(role).name}`' for role in member_stalker.get('last_roles', user)) or None), inline=False) embed.add_field(name='**User ID:**', value=f'`{user.id}`') await guild_config.log(guild, 'modlog', embed=embed)
async def special_mod_command_purge(ctx, limit: int = 10): await ctx.message.delete() if limit < 1: await ctx.send('D--> You foolish creature.') return msgs = await ctx.channel.purge(limit=limit) embed = dc.Embed( color=dc.Color(0x303EBB), timestamp=ctx.message.created_at, description= f'D--> I shall show you my magneighficent STRENGTH, **#{ctx.channel}**!' ) embed.set_author( name='D--> 「ザ・ハンド」!!', icon_url=url_bank.okuyasu_icon, ) embed.set_image(url=url_bank.za_hando) await ctx.channel.send(embed=embed) if not guild_config.getlog(ctx.guild, 'msglog'): # Log immediately after. return user_msgs = Counter(msg.author for msg in msgs) log_embed = dc.Embed( color=dc.Color.blue(), timestamp=ctx.message.created_at, description='\n'.join(f'**@{user}**: {count} messages' for user, count in user_msgs.items()), ) log_embed.set_author( name=f'{ctx.channel} has been purged:', icon_url=url_bank.okuyasu_icon, ) await guild_config.log(ctx.guild, 'msglog', embed=log_embed)
async def raidban(ctx, *args): if not args: return members = [] for arg in args: member = await commands.UserConverter().convert(ctx, arg) members.append(f'`{member}`') await ctx.guild.ban( member, reason='Banned by anti-raid command.', delete_message_days=1, ) desc = f'D--> The aberrants listed below have been STRONGLY executed:\n{", ".join(members)}' embed = dc.Embed( color=ctx.author.color, timestamp=ctx.message.created_at, # description=desc, ) embed.set_author( name=f'{ctx.author} used raidban command in #{ctx.channel}:', icon_url=ctx.author.avatar_url, ) await guild_config.log(ctx.guild, 'modlog', desc, embed=embed) await ctx.message.delete() if ctx.channel.id != guild_config.getlog(ctx.guild, 'modlog'): await ctx.send(desc)
async def role_mute_revoke(self, ctx, member: dc.Member, *, reason=''): if not member: return if member.id == self.bot.user.id: await ctx.send('<:professionalism:778997791829000203>') return for role in member.roles: if ctx.channel.overwrites_for(role).pair()[1].send_messages: await member.remove_roles(role) break else: await ctx.send(response_bank.channel_unban_role_error) return self.remove((ctx.guild.id, member.id, role.id)) if guild_config.getlog(ctx.guild, 'modlog'): embed = dc.Embed( color=ctx.author.color, timestamp=ctx.message.created_at, description= f'{member.mention} has been unbanned in **#{ctx.channel}**') embed.add_field(name='**Role Revoked:**', value=f'`{role}`') embed.add_field(name='**Reason:**', value=reason or 'None specified.') embed.add_field(name='**User ID:**', value=member.id, inline=False) embed.set_author( name=f'@{ctx.author} Undid Channel Ban:', icon_url=ctx.author.avatar_url, ) await guild_config.log(ctx.guild, 'modlog', embed=embed)
async def on_message(self, msg): if msg.author.id == CONST_ADMINS[1]: channel = msg.channel if (channel.id == guild_config.getlog(msg.guild, 'modlog') or channel.category_id == 360676396172836867): return with open(_response_pool, 'a', encoding='utf-8') as respfile: respfile.write(msg.clean_content.strip() + '\n')
async def role_mute_apply(self, ctx, member: dc.Member, length: _parse_length = None, *, reason='None specified.'): # ALRIGHT HUNGOVER WIZARD OF CHAOS CODE IN THE HIZ-OUSE # WE GONNA WRITE SOME MOTHERFUCKING BAN COMMANDS; INITIALIZE THAT SHIT if not member: # WE'RE GRABBING A MEMBER WE GIVE NO SHITS return if member.id == bot.user.id: await ctx.send('<:professionalism:778997791829000203>') return src_perms = ctx.author.guild_permissions tgt_perms = member.guild_permissions if ((not src_perms.manage_nicknames and tgt_perms.manage_roles) or (not src_perms.manage_channels and tgt_perms.manage_nicknames)): await ctx.send(response_bank.channel_ban_deny_horizontal) return # WE'RE GONNA FIND THE FIRST F*****G ROLE THAT HAS NO PERMS IN THIS CHANNEL # AND GUESS HOW WE DO THAT? THAT'S RIGHT, CURSED IF STATEMENT for role in ctx.guild.roles: if ctx.channel.overwrites_for(role).pair( )[1].send_messages: # BOOM LOOK AT THAT SHIT SUCK MY DICK await member.add_roles(role) break else: await ctx.send(response_bank.channel_ban_role_error) return lenstr = 'Until further notice.' if length is None else f'{length} hour(s).' if length is not None: self.push((ctx.guild.id, member.id, role.id), datetime.utcnow() + timedelta(hours=length)) await ctx.message.delete() await ctx.send( response_bank.channel_ban_confirm.format( member=member.mention, length=lenstr, reason=reason, )) # OH BUT NOW SOMEONES GONNA WHINE THAT WE DIDNT LOG IT? HOLD YOUR ASS TIGHT BECAUSE WE'RE ABOUT TO if guild_config.getlog( ctx.guild, 'modlog'): # OHHHHHHH! HE DID IT! THE F*****G MADMAN! embed = dc.Embed( color=ctx.author.color, timestamp=ctx.message.created_at, description= f'{member.mention} has been banned in **#{ctx.channel}**') embed.add_field(name='**Role Granted:**', value=f'`{role}`') embed.add_field(name='**Duration:**', value=lenstr) embed.add_field(name='**Reason:**', value=reason) embed.add_field(name='**User ID:**', value=member.id, inline=False) embed.set_author( name=f'@{ctx.author} Issued Channel Ban:', icon_url=ctx.author.avatar_url, ) await guild_config.log(ctx.guild, 'modlog', embed=embed)
async def on_member_unban(guild, user): # Log member full ban appeals if not guild_config.getlog(guild, 'modlog'): return embed = dc.Embed(color=dc.Color.dark_teal(), timestamp=datetime.utcnow(), description=f'**{user}** has been unbanned :angel:!') embed.set_author(name='Parole has been granted.') embed.set_thumbnail(url=user.avatar_url) embed.add_field(name='**User ID:**', value=f'`{user.id}`') await guild_config.log(guild, 'modlog', embed=embed)
async def manage_mutelist(self): now = datetime.utcnow() while self.data and self.data[0][0] <= now: _, (guild_id, member_id, role_id) = heappop(self.data) guild = self.bot.get_guild(guild_id) if guild is None: continue try: member = await guild.fetch_member(member_id) except (dc.Forbidden, dc.HTTPException) as exc: continue if (role := guild.get_role(role_id)) is None: if guild_config.getlog(guild, 'modlog'): await guild_config.log( guild, 'modlog', response_bank.manage_mutelist_role_error.format( role=role)) continue try: await member.remove_roles(role, reason='Channel mute timeout') except (dc.Forbidden, dc.HTTPException) as exc: if guild_config.getlog(guild, 'modlog'): await guild_config.log( guild, 'modlog', response_bank.manage_mutelist_unban_error.format( member=member, role=role)) else: if guild_config.getlog(guild, 'modlog'): embed = dc.Embed( color=guild.get_member(bot.user.id).color, timestamp=now, description= f'{member.mention} reached timeout for **{role}**.') embed.add_field(name='**User ID:**', value=member.id) embed.set_author( name=f'@{bot.user} Undid Channel Ban:', icon_url=bot.user.avatar_url, ) await guild_config.log(guild, 'modlog', embed=embed)
async def on_voice_state_update(member, bfr, aft): # Log when a member joins and leaves VC guild = member.guild if not guild_config.getlog(guild, 'msglog'): return changelog = None if bfr.channel != aft.channel: if bfr.channel == None: changelog = f':loud_sound: **{member}** has joined **{aft.channel}**' elif aft.channel == None: changelog = f':loud_sound: **{member}** has left **{bfr.channel}**' if changelog is not None: embed = dc.Embed(color=dc.Color.blurple(), description=changelog) await guild_config.log(guild, 'msglog', embed=embed)
async def on_message(msg): # Message posted event if msg.guild is None: return member_stalker.update('last_seen', msg) ctx = await bot.get_context(msg) if ctx.valid: if guild_config.getcmd(ctx): await bot.process_commands(msg) elif guild_config.getcmd( ctx) and msg.content.strip().lower() in query_bank.affirmation: await msg.channel.send(response_bank.affirmation_response) elif (msg.channel.id in guild_config.getlog(msg.guild, 'autoreact') and any( any(map(att.url.lower().endswith, image_exts)) for att in msg.attachments)): await msg.add_reaction('❤️')
async def on_member_join(member): # Log joined members guild = member.guild if not guild_config.getlog(guild, 'usrlog'): return member_stalker.update('first_join', member) await member_stalker.load_roles(member) embed = dc.Embed( color=dc.Color.green(), timestamp=datetime.utcnow(), description= f':green_circle: {member.mention}: ``{member}`` has joined **{guild}**!\n' f'The guild now has {guild.member_count} members!\n' f'This account was created on `{member.created_at.strftime("%d/%m/%Y %H:%M:%S")}`' ) embed.set_author(name=f'A user has joined the server!') embed.set_thumbnail(url=member.avatar_url) embed.add_field(name='**User ID**', value=f'`{member.id}`') await guild_config.log(guild, 'usrlog', embed=embed)
async def on_message_edit(bfr, aft): # Log edited messages if bfr.author == bot.user or bfr.content == aft.content: return guild = bfr.guild if not guild_config.getlog(guild, 'msglog'): return if len(bfr.content) <= 1024: bfrmsg = bfr.content long_edit = False else: bfrmsg = '`D--> The pre-edit message is too long to contain.`' long_edit = True with open('tmpmsg.txt', 'w') as bfrfile: bfrfile.write(bfr.content) if len(aft.content) <= 1024: aftmsg = aft.content else: aftmsg = f'`D--> The post-edit message is too long, use this:` {aft.jump_url}' embed = dc.Embed(color=dc.Color.gold(), timestamp=aft.edited_at) embed.set_author( name=f'@{bfr.author} edited a message in #{bfr.channel}:', icon_url=bfr.author.avatar_url, ) embed.add_field(name='**Before:**', value=bfrmsg, inline=False) embed.add_field(name='**After:**', value=aftmsg, inline=False) embed.add_field(name='**Message ID:**', value=f'`{aft.id}`') embed.add_field(name='**User ID:**', value=f'`{bfr.author.id}`') if long_edit: with open('tmpmsg.txt', 'r') as bfrfile: await guild_config.log( guild, 'msglog', embed=embed, file=dc.File(bfrfile, f'{bfr.id}-old.txt'), ) else: await guild_config.log(guild, 'msglog', embed=embed)
async def on_user_update(bfr, aft): # Log avatar, name, discrim changes for guild in bot.guilds: if not (guild_config.getlog(guild, 'msglog') and guild.get_member(bfr.id)): continue changelog = [] if bfr.name != aft.name: changelog.append(( 'Username Update:', f'**Old Username:** {bfr}\n**New Username:** {aft}', )) if bfr.discriminator != aft.discriminator: changelog.append(( 'Discriminator Update:', f'{bfr} had their discriminator changed from ' f'{bfr.discriminator} to {aft.discriminator}', )) await aio.sleep(0) if bfr.avatar != aft.avatar: changelog.append( ('Avatar Update:', f'{bfr} has changed their avatar to:')) for ctype, desc in changelog: embed = dc.Embed( color=dc.Color.purple(), timestamp=datetime.utcnow(), description=desc, ) if ctype.startswith('Avatar'): embed.set_author(name=ctype, icon_url=await grab_avatar(bfr)) embed.set_thumbnail(url=await grab_avatar(aft)) else: embed.set_author(name=ctype, icon_url=aft.avatar_url) embed.add_field(name='**User ID:**', value=f'`{aft.id}`', inline=False) await guild_config.log(guild, 'msglog', embed=embed)