Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
 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')
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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('❤️')
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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)