Example #1
0
    async def mass_caps(self, message):
        caps = cm.get_cache(self.bot, message.guild.id, 'masscaps')

        if caps == 0 or caps is None:
            return
        
        exes = await self.bot.db.fetchval("SELECT caps FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
        channel = cm.get_cache(self.bot, message.guild.id, 'automod_actions')
        logchannel = message.guild.get_channel(channel)
        
        if message.mentions == True:
            return
        
        v = CAPS.findall(message.content)
        if len(v) >= len(message.content)*(50/100) and len(message.content) > 5:
            if exes is None:
                await self.bot.db.execute("INSERT INTO autowarns(user_id, guild_id, links, inv, mm, caps) values ($1, $2, $3, $4, $5, $6)", message.author.id, message.guild.id, 0, 0, 0, 1)
            else:
                await self.bot.db.execute("UPDATE autowarns SET caps = caps + 1 WHERE user_id = $1 AND guild_id = $2", message.author.id, message.guild.id)
            exe = await self.bot.db.fetchval("SELECT caps FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
            reason = "AUTOMOD | Mass Caps"
            emj, rsn = await self.automod_punishment(message, delete=True, warn=exe>=2, ban=exe>=3, reason=reason)
            embed = await self.embed(message)
            embed.description = f"{emj} {rsn}"
            embed.add_field(name='Message', value=message.content)
            if logchannel is None:
                return
            try:
                await logchannel.send(embed=embed)
            except Exception as e:
                print(e)
            return True
        return False
Example #2
0
    async def mass_mentions(self, message):
        punishment = cm.get_cache(self.bot, message.guild.id, 'massmentions')
        chech = cm.get_cache(self.bot, message.guild.id, 'mentionslimit')

        if punishment is None or punishment == 0:
            return

        exes = await self.bot.db.fetchval("SELECT mm FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
        channel = cm.get_cache(self.bot, message.guild.id, 'automod_actions')
        logchannel = message.guild.get_channel(channel)  

        if chech == 0 or chech is None:
            chech = 3

        if len(message.mentions) >= chech:
            if exes is None:
                await self.bot.db.execute("INSERT INTO autowarns(user_id, guild_id, links, inv, mm, caps) values ($1, $2, $3, $4, $5, $6)", message.author.id, message.guild.id, 0, 0, 1, 0)
            else:
                await self.bot.db.execute("UPDATE autowarns SET mm = mm + 1 WHERE user_id = $1 AND guild_id = $2", message.author.id, message.guild.id)
            exe = await self.bot.db.fetchval("SELECT mm FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
            reason = 'AUTOMOD | Mass Mentions'
            emj, rsn = await self.automod_punishment(message, delete=True, warn=exe>=2, ban=exe>=3, reason=reason)
            embed = await self.embed(message)
            embed.description = f"{emj} {rsn}"
            embed.add_field(name='Message', value=message.content)
            if logchannel is None:
                return
            try:
                await logchannel.send(embed=embed)
            except Exception as e:
                print(e)
            return True
        return False
Example #3
0
    async def allow_links(self, message):
        link = cm.get_cache(self.bot, message.guild.id, 'links') 

        if link == 0 or link is None:
            return
        
        exes = await self.bot.db.fetchval("SELECT links FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
        channel = cm.get_cache(self.bot, message.guild.id, 'automod_actions')
        logchannel = message.guild.get_channel(channel)  
            
        inv = INVITE.search(message.content)
        if inv:
            return

        links = LINKS.findall(message.content)
        if links:
            reason = "AUTOMOD | Sending Links"
            if exes is None:
                await self.bot.db.execute("INSERT INTO autowarns(user_id, guild_id, links, inv, mm, caps) values ($1, $2, $3, $4, $5, $6)", message.author.id, message.guild.id, 1, 0, 0, 0)
            else:
                await self.bot.db.execute("UPDATE autowarns SET links = links + 1 WHERE user_id = $1 AND guild_id = $2", message.author.id, message.guild.id)
            exe = await self.bot.db.fetchval("SELECT links FROM autowarns WHERE guild_id = $1 AND user_id = $2", message.guild.id, message.author.id)
            emj, rsn = await self.automod_punishment(message, delete=True, warn=exe>=2, ban=exe>=3, reason=reason)
            embed = await self.embed(message)
            embed.description = f'{emj} {rsn}'
            embed.add_field(name='Message', value=message.content)
            if logchannel is None:
                return
            try:
                await logchannel.send(embed=embed)
            except Exception as e:
                print(e)
            return True
        return False
Example #4
0
    async def on_member_unban(self, guild, user):
        await asyncio.sleep(2)

        db_check1 = cm.get_cache(self.bot, guild.id, 'moderation')
        #logchannel = await self.bot.db.fetchval("SELECT channel_id FROM moderation WHERE guild_id = $1", guild.id)
        case = cm.get_cache(self.bot, guild.id, 'case_num')

        channel = self.bot.get_channel(db_check1)

        if db_check1 is None:
            return
        deleted = ""
        reason = ""
        try:
            if guild.me.guild_permissions.view_audit_log:
                async for entry in guild.audit_logs(
                        action=discord.AuditLogAction.unban, limit=50):
                    if entry.target == user:
                        if (datetime.utcnow() -
                                entry.created_at).total_seconds() < 10:
                            deleted += f"{entry.user} ({entry.user.id})"
                            reason += f"{entry.reason}"
        except Exception as e:
            print(e)
            pass

        casenum = case or 1

        embed = discord.Embed(
            color=self.color['logging_color'],
            description=f"{emotes.log_unban} Member unbanned! `[#{casenum}]`",
            timestamp=datetime.utcnow())
        embed.add_field(name="User name",
                        value=f'{user} ({user.id})',
                        inline=False)
        embed.add_field(name="Member created at:",
                        value=default.date(user.created_at),
                        inline=False)
        if deleted:
            embed.add_field(name="Moderator", value=deleted, inline=False)
        if reason:
            embed.add_field(name="Reason:", value=reason, inline=False)
        embed.set_thumbnail(url=user.avatar_url)
        await self.update_query(guildid=guild.id, case=casenum)
        self.bot.case_num[guild.id] += 1
        try:
            await channel.send(embed=embed)
        except Exception as e:
            await self.event_error(error=e,
                                   event='on_member_unban',
                                   guild=guild)
            return
Example #5
0
    async def anti_edit_dehoist(self, before, after):
        if before.bot:
            return

        db_check1 = cm.get_cache(self.bot, before.guild.id, 'antidehoist')

        if db_check1 is None:
            return

        channel = self.bot.get_channel(db_check1['channel'])
        chosen_nick = db_check1['nickname'] or 'z (hoister)'
        case = cm.get_cache(self.bot, before.guild.id, 'case_num')

        if before.nick != after.nick:
            name = after.display_name
            if not name[0].isalnum():
                await asyncio.sleep(60)
                if not name[0].isalnum():
                    try:
                        casenum = case or 1
                        await after.edit(nick=chosen_nick,
                                         reason='Anti dehoist')
                        embed = discord.Embed(
                            color=self.color['logging_color'],
                            description=
                            f"{emotes.log_memberedit} Member dehoisted `[#{casenum}]`",
                            timestamp=datetime.utcnow())
                        embed.add_field(name='User:'******'Previous name:',
                                        value=name,
                                        inline=False)
                        embed.add_field(name='New name:',
                                        value=chosen_nick,
                                        inline=False)
                        embed.set_thumbnail(url=after.avatar_url)
                        if channel:
                            try:
                                await channel.send(embed=embed)
                            except Exception as e:
                                await self.event_error(
                                    error=e,
                                    event='anti_edit_dehoist',
                                    guild=before.guild)
                                return
                            await self.update_query(guildid=before.guild.id,
                                                    case=casenum)
                            self.bot.case_num[before.guild.id] += 1
                    except Exception as e:
                        print(e)
                        pass
Example #6
0
    async def on_voice_state_update(self, member, before, after):

        db_check1 = cm.get_cache(self.bot, member.guild.id, 'moderation')
        #logchannel = await self.bot.db.fetchval("SELECT channel_id FROM moderation WHERE guild_id = $1", member.guild.id)

        case = cm.get_cache(self.bot, member.guild.id, 'case_num')

        channel = self.bot.get_channel(db_check1)

        if db_check1 is None:
            return

        try:
            deleted = ""
            async for entry in member.guild.audit_logs(
                    action=discord.AuditLogAction.member_update, limit=1):
                deleted += f"{entry.user} ({entry.user.id})"
        except Exception as e:
            print(e)
            pass

        casenum = case or 1

        if before.mute != after.mute:
            if after.mute is False:
                mt = "unmuted"
            elif after.mute is True:
                mt = "muted"
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_memberedit} Member was voice {mt}! `[#{casenum}]`",
                timestamp=datetime.utcnow())
            embed.add_field(name="User:"******"Moderator:", value=deleted)
            embed.set_thumbnail(url=member.avatar_url)
            await self.update_query(guildid=member.guild.id, case=casenum)
            self.bot.case_num[member.guild.id] += 1
            try:
                await channel.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_voice_state_update',
                                       guild=before.guild)
                return
Example #7
0
    async def snipe(self, ctx, channel: discord.TextChannel = None):
        """ Get the most recent deleted message
        You can pass in the channel mention/name/id so it'd fetch message in that channel """
        channel = channel or ctx.channel

        check = cm.get_cache(self.bot, channel.id, 'snipes')
        if check is None:
            return await ctx.send(
                f"{emotes.red_mark} Haven't logged anything yet")
        if check['nsfw'] and not channel.is_nsfw():
            return await ctx.send(
                f"{emotes.other_nsfw} This channel needs to be NSFW in order for you to see the sniped content"
            )
        content = check['message']
        if len(content) > 2000:
            content = content[:2000]
            content += '...'

        content = content or "*[Content unavailable]*"
        e = discord.Embed(color=self.color['embed_color'])
        a = ctx.guild.get_member(check['author'])
        if a is None:
            return await ctx.send(f"{emotes.warning} Couldn't get that member."
                                  )
        e.set_author(name=f"Deleted by {a}", icon_url=a.avatar_url)
        e.description = f"{content}"
        e.set_footer(
            text=
            f"Deleted {btime.human_timedelta(check['deleted_at'])} in #{channel.name}"
        )

        await ctx.send(embed=e)
Example #8
0
    async def joinrole_bots(self, ctx, role: discord.Role):
        """ Choose what role will be given to bots"""

        if role.position == ctx.guild.me.top_role.position or role.position > ctx.guild.me.top_role.position:
            return await ctx.send(f"{emotes.red_mark} The role you've tried to setup is higher than my role. Please make sure I'm above the role you're trying to setup.")

        else:
            db_check = await self.bot.db.fetchval("SELECT guild_id FROM joinrole WHERE guild_id = $1", ctx.guild.id)
            cache = cm.get_cache(self.bot, ctx.guild.id, 'joinrole')
            bot_role = await self.bot.db.fetchval("SELECT bots FROM joinrole WHERE guild_id = $1", ctx.guild.id)
                
            if db_check is None:
                await self.bot.db.execute(f"INSERT INTO joinrole(guild_id, bots) VALUES ($1, $2)", ctx.guild.id, role.id)
                if cache:
                    cache['bots'] = role.id
                else:
                    self.bot.joinrole[ctx.guild.id] = {'people': None, 'bots': role.id}
                await ctx.send(f"{emotes.white_mark} **{role.mention}** will be given to bots! Use `{ctx.prefix}joinrole toggle` to **disable** it or `{ctx.prefix}joinrole bots` to change it", delete_after=30)
            if db_check is not None:
                if bot_role is None:
                    await self.bot.db.execute(f"UPDATE joinrole SET bots = $1 WHERE guild_id = $2", role.id, ctx.guild.id)
                    if cache:
                        cache['bots'] = role.id
                    else:
                        self.bot.joinrole[ctx.guild.id] = {'people': None, 'bots': role.id}
                    await ctx.send(f"{emotes.white_mark} **{role.mention}** will be given to bots! Use `{ctx.prefix}joinrole toggle` to disable it or `{ctx.prefix}joinrole bots` to change it", delete_after=30)
                elif bot_role is not None:
                    await self.bot.db.execute(f"UPDATE joinrole SET bots = $1 WHERE guild_id = $2", role.id, ctx.guild.id)
                    if cache:
                        cache['bots'] = role.id
                    else:
                        self.bot.joinrole[ctx.guild.id] = {'people': None, 'bots': role.id}
                    await ctx.send(f"{emotes.white_mark} **{role.mention}** will be given to bots from now one! Use `{ctx.prefix}joinrole toggle` to disable it or `{ctx.prefix}joinrole bots` to change it", delete_after=30)
Example #9
0
    async def anti_join_dehoist(self, member):
        check = cm.get_cache(self.bot, member.guild.id, 'antidehoist')

        if check is None:
            return

        nick = member.display_name
        chosen_nick = check['nickname']
        logchannel = check['channel']
        case = cm.get_cache(self.bot, member.guild.id, 'case_num')
        chosen_nick = chosen_nick or 'z (hoister)'
        if logchannel:
            channel = member.guild.get_channel(logchannel)
        if not nick[0].isalnum():
            await asyncio.sleep(60)
            if not nick[0].isalnum():
                try:
                    casenum = case or 1
                    await member.edit(nick=chosen_nick, reason='Anti dehoist')
                    embed = discord.Embed(
                        color=self.color['logging_color'],
                        description=
                        f"{emotes.log_memberedit} Member dehoisted `[#{casenum}]`",
                        timestamp=datetime.utcnow())
                    embed.add_field(name='User:'******'Previous name:',
                                    value=nick,
                                    inline=False)
                    embed.add_field(name='New name:',
                                    value=chosen_nick,
                                    inline=False)
                    embed.set_thumbnail(url=member.avatar_url)
                    if channel:
                        try:
                            await channel.send(embed=embed)
                        except Exception as e:
                            await self.event_error(error=e,
                                                   event='anti_join_dehoist',
                                                   guild=member.guild)
                            return
                        await self.update_query(guildid=member.guild.id,
                                                case=casenum)
                        self.bot.case_num[member.guild.id] += 1
                except:
                    pass
Example #10
0
    async def bot_check(self, ctx):
        moks = self.bot.get_user(345457928972533773)
        if ctx.author == moks:
            return True

        data = cm.get_cache(self.bot, ctx.author.id, 'blacklisted_users')
        if data:
            return False
        return True
Example #11
0
    async def joinrole_toggle(self, ctx):
        """ Toggle the join role. It is automatically set to `ON` """
        db_check = await self.bot.db.fetchval("SELECT guild_id FROM joinrole WHERE guild_id = $1", ctx.guild.id)
        cache = cm.get_cache(self.bot, ctx.guild.id, 'joinrole')

        if db_check is None:
            return await ctx.send(f"{emotes.red_mark} You don't have any role set yet. Use `{ctx.prefix}joinrole people/bots` to setup the role", delete_after=30)
        if db_check is not None:
            await self.bot.db.execute(f"DELETE FROM joinrole WHERE guild_id = $1", ctx.guild.id)
            self.bot.joinrole.pop(ctx.guild.id)
            await ctx.send(f"{emotes.white_mark} Role on join has been disabled. Use `{ctx.prefix}joinrole people/bots` to enable it back on", delete_after=30)
Example #12
0
    async def log_temp_unmute(self,
                              guild=None,
                              mod=None,
                              member=None,
                              reason=None):
        check = cm.get_cache(self.bot, guild.id, 'moderation')

        if check is None:
            return
        elif check is not None:
            channel = check
            case = cm.get_cache(self.bot, guild.id, 'case_num')
            chan = self.bot.get_channel(channel)

            if case is None:
                await self.bot.db.execute(
                    "INSERT INTO modlog(guild_id, case_num) VALUES ($1, $2)",
                    guild.id, 1)
                self.bot.case_num[guild.id] = 1

            casenum = self.bot.case_num[guild.id]
            e = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_memberedit} **{member}** unmuted `[#{str(casenum)}]`"
            )
            e.add_field(name="Previously muted by:",
                        value=f"{mod} ({mod.id})",
                        inline=False)
            e.add_field(name="Reason:", value=f"{reason}", inline=False)
            e.set_thumbnail(url=member.avatar_url_as(format='png'))
            e.set_footer(text=f"Member ID: {member.id}")

            await chan.send(embed=e)
            await self.bot.db.execute(
                "UPDATE modlog SET case_num = case_num + 1 WHERE guild_id = $1",
                guild.id)
            self.bot.case_num[guild.id] += 1
Example #13
0
    async def automod_check2(self, before, after):
        message = after
        if message.guild is None:
            return
        setting = cm.get_cache(self.bot, message.guild.id, 'automod')
        # setting = await self.bot.db.fetchval("SELECT punishment FROM automods WHERE guild_id = $1", message.guild.id)

        if setting == 0 or setting is None:
            return
        
        member = message.author
        guild = message.guild

        if message.author.bot:
            return
        
        if member.guild_permissions.manage_guild or guild.owner == True:
            return

        if not message.guild.me.guild_permissions.manage_guild:
            self.bot.automod.pop(message.guild.id)
            return await self.bot.db.execute("DELETE FROM automods WHERE guild_id = $1", message.guild.id)

        channels = cm.get_cache(self.bot, message.guild.id, 'whitelisted_channels')
        roles = cm.get_cache(self.bot, message.guild.id, 'whitelisted_roles')
        if channels is not None:
            for res in channels:
                if str(message.channel.id) == str(res):
                    return
        if roles is not None:
            for res in roles:
                role = message.guild.get_role(res)
                if role in message.author.roles:
                    return

        for coro in self.automodactions.copy():
            if await coro(self, message):
                break
Example #14
0
    async def togglemsg_leavebots(self, ctx):
        """ Toggle bot leaves """
        check = cm.get_cache(self.bot, ctx.guild.id, 'leavemsg')

        if check is None:
            await ctx.send(f"{emotes.red_mark} You aren't logging member leaves, please enable that by typing `{ctx.prefix}togglelog leavemsg [channel mention]`")
        elif check['bot_joins'] == False:
            await self.bot.db.execute("UPDATE leavemsg SET bot_join = $1 WHERE guild_id = $2", True, ctx.guild.id)
            self.bot.leavemsg[ctx.guild.id]['bot_joins'] = True
            await ctx.send(f"{emotes.white_mark} Bot leaves will now be logged!")
        elif check['bot_joins'] == True:
            await self.bot.db.execute("UPDATE leavemsg SET bot_join = $1 WHERE guild_id = $2", False, ctx.guild.id)
            self.bot.leavemsg[ctx.guild.id]['bot_joins'] = False
            await ctx.send(f"{emotes.white_mark} Bot leaves won't be logged anymore!")
Example #15
0
    async def on_user_update(self, before, after):
        # Don't listen to bots
        if before.bot:
            return

        for guild in self.bot.guilds:
            if before in guild.members:
                db_check1 = cm.get_cache(self.bot, guild.id, 'memberupdate')

                if db_check1 is None:
                    return

                channel = self.bot.get_channel(db_check1)

                # Avatar changed
                if before.avatar != after.avatar:
                    e = discord.Embed(
                        color=self.color['logging_color'],
                        title=f"{emotes.log_memberedit} Avatar updated",
                        timestamp=datetime.utcnow())
                    #e.set_author(name=after, icon_url=after.avatar_url)
                    e.description = f"**{after.name}** has changed his avatar"
                    e.set_thumbnail(url=after.avatar_url)
                    #e.set_image(url=before.avatar_url)
                    e.set_footer(text=f"User ID: {after.id}")
                    try:
                        await channel.send(embed=e)
                    except Exception as e:
                        await self.event_error(error=e,
                                               event='on_user_update (avatar)',
                                               guild=before.guild)
                        return

                # Username changed
                if before.name != after.name:
                    e = discord.Embed(
                        color=self.color['logging_color'],
                        title=f"{emotes.log_memberedit} Username updated",
                        description=
                        f"**{before.name}** changed his username to **{after.name}**",
                        timestamp=datetime.utcnow())
                    #e.set_author(name=after, icon_url=after.avatar_url)
                    e.set_footer(text=f"User ID: {after.id}")
                    try:
                        await channel.send(embed=e)
                    except Exception as e:
                        await self.event_error(error=e,
                                               event='on_user_update (name)',
                                               guild=before.guild)
                        return
Example #16
0
    async def snipe_messages(self, message):
        await self.bot.wait_until_ready()

        op_out_check = cm.get_cache(self.bot, message.author.id,
                                    'snipes_op_out')

        if op_out_check:
            return

        if message.webhook_id is None:
            self.bot.snipes[message.channel.id] = {
                'message': message.content,
                'deleted_at': datetime.now(),
                'author': message.author.id,
                'nsfw': message.channel.is_nsfw()
            }
Example #17
0
    async def on_member_update(self, before, after):
        if before.bot:
            return

        db_check1 = cm.get_cache(self.bot, before.guild.id, 'memberupdate')

        if db_check1 is None:
            return

        if before.nick is None:
            nick = before.name
        elif before.nick:
            nick = before.nick
        if after.nick is None:
            nicks = after.name
        elif after.nick:
            nicks = after.nick

        channel = self.bot.get_channel(db_check1)

        if before.nick != after.nick:
            try:
                deleted = ""
                async for entry in before.guild.audit_logs(
                        action=discord.AuditLogAction.member_update, limit=1):
                    deleted += f"{entry.user} ({entry.user.id})"
            except Exception as e:
                print(e)
                deleted = ""
            e = discord.Embed(
                color=self.color['logging_color'],
                description=f"{emotes.log_memberedit} Nickname changed",
                timestamp=datetime.utcnow())
            e.set_author(name="Nickname changed", icon_url=before.avatar_url)
            e.add_field(name="User:"******"{after.name}\n({after.id})")
            e.add_field(name="Nickname:", value=f"{nick} → {nicks}")
            if deleted:
                e.add_field(name="Changed by:", value=deleted, inline=False)
            e.set_thumbnail(url=after.avatar_url)
            e.set_footer(text=f'User ID: {after.id}')
            try:
                await channel.send(embed=e)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_member_update',
                                       guild=before.guild)
                return
Example #18
0
    async def on_message_edit(self, before, after):

        if before.guild is None:
            return

        if before.author.bot:
            return

        db_check = cm.get_cache(self.bot, before.guild.id, 'msgedit')

        if db_check is None:
            return

        if before.content == after.content:
            return

        if len(before.content) > 1000:
            msg1 = f"{before.content[:1000]}..."
        elif len(before.content) < 1000:
            msg1 = f"{before.content}"
        if len(after.content) > 1000:
            msg2 = f"{after.content[:1000]}..."
        elif len(after.content) < 1000:
            msg2 = f"{after.content}"

        embed = discord.Embed(
            color=self.color['logging_color'],
            description=
            f"{emotes.log_msgedit} Message edited! [Jump to message]({before.jump_url})",
            timestamp=datetime.utcnow())
        embed.set_author(icon_url=before.author.avatar_url, name=before.author)
        embed.add_field(name="From:", value=f"{msg1}", inline=True)
        embed.add_field(name="To:", value=f"{msg2}", inline=False)
        embed.add_field(name="Channel:",
                        value=f"{before.channel.mention}",
                        inline=True)

        lchannel = before.guild.get_channel(db_check)
        try:
            await lchannel.send(embed=embed)
        except Exception as e:
            await self.event_error(error=e,
                                   event='on_message_edit',
                                   guild=before.guild)
            return
Example #19
0
    async def on_message_delete(self, message):
        if message.author.bot:
            return

        if message.guild is None:
            return

        db_check = cm.get_cache(self.bot, message.guild.id, 'msgdelete')

        if db_check is None:
            return

        channel = message.guild.get_channel(db_check)

        embed = discord.Embed(
            color=self.color['logging_color'],
            description=f"{emotes.log_msgdelete} Message deleted!",
            timestamp=datetime.utcnow())
        embed.set_author(icon_url=message.author.avatar_url,
                         name=message.author)
        msg = ''
        if len(message.content) > 1000:
            msg += f"{message.content[:1000]}..."
        elif message.attachments and len(message.content) < 800:
            msg += f'{message.content}\n\n{message.attachments[0].url}'
        elif message.attachments and len(message.content) > 800:
            msg += f'{message.content[:800]}...' + f'\n\n{message.attachments[0].url}'
        else:
            msg += f'{message.content}'
        if message.attachments:
            attachment_url = message.attachments[0].url
            embed.add_field(name="Message:", value=msg, inline=False)
        else:
            embed.add_field(name="Message:", value=msg, inline=False)
        embed.add_field(name="Channel:", value=message.channel.mention)
        embed.set_footer(text=f"ID: {message.id}")

        try:
            await channel.send(embed=embed)
        except Exception as e:
            await self.event_error(error=e,
                                   event='on_message_delete',
                                   guild=message.guild)
            return
Example #20
0
    async def raid_check(self, member):

        data = cm.get_cache(self.bot, member.guild.id, 'raidmode')
        if data:
            if member.guild.me.guild_permissions.kick_members:
                if data['raidmode'] == True:
                    if data['dm'] == True:
                        try:
                            await member.send(
                                f"{emotes.warning} I'm sorry but **{member.guild.name}** is currently experiencing a raid and have raid-mode enabled. Try joining back later!"
                            )
                        except:
                            pass
                        await member.guild.kick(member,
                                                reason='Anti-raid protection')
                    elif data['dm'] == False:
                        await member.guild.kick(member,
                                                reason='Anti-raid protection')
                elif data['raidmode'] == False:
                    return
        else:
            return
Example #21
0
    async def on_member_join(self, member):
        #print(f'{member} has joined a server ({member.guild}).')

        # ! Join role (Role on join)
        db_check1 = cm.get_cache(self.bot, member.guild.id, 'joinrole')
        # ! Join log (Member join log)
        db_check2 = cm.get_cache(self.bot, member.guild.id, 'joinlog')
        # ! Join message (Welcome msg)
        db_check3 = cm.get_cache(self.bot, member.guild.id, 'joinmsg')
        # ! Temp mute
        temp_mute = await self.bot.db.fetchval(
            "SELECT user_id FROM moddata WHERE user_id = $1 AND guild_id = $2",
            member.id, member.guild.id)

        badges = cm.get_cache(self.bot, f"{member.id}", 'user_badges')

        if db_check1 is not None:
            if member.guild.me.guild_permissions.manage_roles:
                # Role on join
                if member.bot and db_check1['bots'] is not None:
                    role = member.guild.get_role(db_check1['bots'])

                    try:
                        await member.add_roles(role, reason='Autorole')
                    except Exception as e:
                        await self.event_error(
                            error=e,
                            event='on_member_join (bot role)',
                            guild=member.guild)
                        pass
                elif not member.bot and db_check1['people'] is not None:
                    role = member.guild.get_role(db_check1['people'])
                    try:
                        await member.add_roles(role, reason='Autorole')
                    except Exception as e:
                        await self.event_error(
                            error=e,
                            event='on_member_join (people role)',
                            guild=member.guild)
                        pass
                if temp_mute:
                    muterole = discord.utils.find(
                        lambda r: r.name.lower() == "muted",
                        member.guild.roles)
                    if muterole:
                        try:
                            await member.add_roles(
                                muterole, reason='User was muted before')
                        except Exception as e:
                            await self.event_error(
                                error=e,
                                event='on_member_join (anti evading mute)',
                                guild=member.guild)
                            pass
                    else:
                        pass
        if db_check2 is not None:
            # Member join log
            logchannel = self.bot.get_channel(db_check2)
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=f"{emotes.log_memberjoin} New member joined",
                timestamp=datetime.utcnow())
            #embed.set_author(icon_url=member.avatar_url)
            embed.add_field(name="Username:"******"User ID:", value=member.id, inline=True)
            embed.add_field(name="Created at:",
                            value=default.date(member.created_at),
                            inline=False)
            embed.set_thumbnail(url=member.avatar_url)
            if member.guild.id == 671078170874740756 and badges:
                embed.add_field(name='User badges',
                                value=', '.join(badges),
                                inline=False)
            try:
                await logchannel.send(embed=embed)
            except Exception as e:
                await self.event_error(
                    error=e,
                    event='on_member_join (welcome log message)',
                    guild=member.guild)
                pass

        if db_check3 is not None:
            if member.bot and db_check3['bot_joins'] == False:
                return
            elif member.bot and db_check3['bot_joins'] == True:
                pass
            elif db_check3['bot_joins'] is None:
                pass
            if db_check3['message'] and not db_check3['embed']:
                joinmessage = str(db_check3['message'])
                joinmessage = joinmessage.replace("{{member.mention}}",
                                                  member.mention)
                joinmessage = joinmessage.replace("{{member.tag}}",
                                                  str(member))
                joinmessage = joinmessage.replace("{{member.id}}",
                                                  str(member.id))
                joinmessage = joinmessage.replace(
                    "{{member.name}}",
                    discord.utils.escape_markdown(member.name, as_needed=True))
                joinmessage = joinmessage.replace("{{server.name}}",
                                                  member.guild.name)
                joinmessage = joinmessage.replace(
                    "{{server.members}}", str(member.guild.member_count))
            elif db_check3['message'] is None and not db_check3['embed']:
                joinmessage = f"{emotes.joined} {member.mention} joined the server! There are {member.guild.member_count} members in the server now."

            elif db_check3['message'] and db_check3['embed'] == True:
                msg = json.loads(db_check3['message'])
                emb_dict = msg
                emb_dict = self.placeholder_replacer(emb_dict, member)
                if "author" in emb_dict:
                    emb_dict["author"] = self.placeholder_replacer(
                        emb_dict["author"], member)
                if "footer" in emb_dict:
                    emb_dict["footer"] = self.placeholder_replacer(
                        emb_dict["footer"], member)
                if "fields" in emb_dict:
                    for field in emb_dict["fields"]:
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["name"], member)
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["value"], member)
            elif db_check3['message'] is None and db_check3['embed'] == True:
                emb_dict = {
                    "plainText": "{{member.mention}}",
                    "title": "Welcome to {{server.name}}",
                    "description":
                    "You are member #{{server.members}} in this server!",
                    "color": 6215030
                }
                emb_dict = self.placeholder_replacer(emb_dict, member)
                if "author" in emb_dict:
                    emb_dict["author"] = self.placeholder_replacer(
                        emb_dict["author"], member)
                if "footer" in emb_dict:
                    emb_dict["footer"] = self.placeholder_replacer(
                        emb_dict["footer"], member)
                if "fields" in emb_dict:
                    for field in emb_dict["fields"]:
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["name"], member)
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["value"], member)
            # Welcome msg
            welcomechannel = self.bot.get_channel(db_check3['channel'])
            try:
                if db_check3['embed']:
                    try:
                        await welcomechannel.send(
                            content=emb_dict['plainText'],
                            embed=discord.Embed.from_dict(emb_dict),
                            allowed_mentions=discord.AllowedMentions(
                                users=True))
                    except:
                        await welcomechannel.send(
                            embed=discord.Embed.from_dict(emb_dict),
                            allowed_mentions=discord.AllowedMentions(
                                users=True))
                else:
                    await welcomechannel.send(
                        joinmessage,
                        allowed_mentions=discord.AllowedMentions(users=True))
            except Exception as e:
                await self.event_error(
                    error=e,
                    event='on_member_join (welcome message)',
                    guild=member.guild)
                pass
Example #22
0
 async def is_booster(self, user):
     if CacheManager.get_cache(self, user.id, 'boosters'):
         return True
Example #23
0
    async def on_guild_update(self, before, after):
        db_check1 = cm.get_cache(self.bot, before.id, 'moderation')
        #logchannel = await self.bot.db.fetchval("SELECT channel_id FROM moderation WHERE guild_id = $1", before.id)

        if db_check1 is None:
            return

        channels = self.bot.get_channel(db_check1)

        if before.name != after.name:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=f"{emotes.log_guildupdate} Guild name was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(name="Name:",
                            value=f"{before.name} → {after.name}")
            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return

        if before.region != after.region:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_guildupdate} Guild region was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(name="Region:",
                            value=f"{before.region} → {after.region}")

            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return

        if before.afk_channel != after.afk_channel:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_guildupdate} Guild afk channel was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(
                name="AFK Channel:",
                value=f"{before.afk_channel} → {after.afk_channel}")

            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return

        if before.icon_url != after.icon_url:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=f"{emotes.log_guildupdate} Guild icon was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(name="Before:",
                            value=f"[Old icon]({before.icon_url})")
            embed.set_thumbnail(url=after.icon_url)

            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return

        if before.mfa_level != after.mfa_level:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_guildupdate} Guild multifactor authentication (MFA) was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(name="MFA level:",
                            value=f"{before.mfa_level} → {after.mfa_level}")

            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return

        if before.verification_level != after.verification_level:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_guildupdate} Guild verification level was changed!",
                timestamp=datetime.utcnow())
            embed.add_field(
                name="Verfication:",
                value=
                f"{before.verification_level} → {after.verification_level}")

            await channels.send(embed=embed)

        if before.default_notifications != after.default_notifications:
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=
                f"{emotes.log_guildupdate} Guild default notifications were changed!",
                timestamp=datetime.utcnow())
            embed.add_field(
                name="Notifications:",
                value=
                f"{before.default_notifications.name} → {after.default_notifications.name}"
            )

            try:
                await channels.send(embed=embed)
            except Exception as e:
                await self.event_error(error=e,
                                       event='on_guild_update',
                                       guild=before.guild)
                return
Example #24
0
    async def status_log(self, before, after):
        await self.bot.wait_until_ready()

        if before.status == after.status:
            return

        check = cm.get_cache(self.bot, before.id, 'status_op_out')

        if check is None:
            return

        if before.bot:
            return

        idle = discord.Status.idle
        online = discord.Status.online
        dnd = discord.Status.dnd
        offline = discord.Status.offline

        check2 = await self.bot.db.fetchval(
            "SELECT * FROM useractivity WHERE user_id = $1", before.id)

        if before.status != after.status:
            if before.status != offline and after.status == offline:
                if check2:
                    await self.bot.db.execute(
                        "UPDATE useractivity SET activity_title = $1, time = $2 WHERE user_id = $3",
                        str(after.status.name), datetime.now(), before.id)
                elif check2 is None:
                    await self.bot.db.execute(
                        "INSERT INTO useractivity(user_id, activity_title, time) VALUES($1, $2, $3)",
                        before.id, str(after.status.name), datetime.now())

            elif before.status == offline and after.status != offline:
                if check2:
                    await self.bot.db.execute(
                        "UPDATE useractivity SET activity_title = $1, time = $2 WHERE user_id = $3",
                        str(after.status.name), datetime.now(), before.id)
                elif check2 is None:
                    await self.bot.db.execute(
                        "INSERT INTO useractivity(user_id, activity_title, time) VALUES($1, $2, $3)",
                        before.id, str(after.status.name), datetime.now())

            elif before.status != offline and after.status == idle:
                if check2:
                    await self.bot.db.execute(
                        "UPDATE useractivity SET activity_title = $1, time = $2 WHERE user_id = $3",
                        str(after.status.name), datetime.now(), before.id)
                elif check2 is None:
                    await self.bot.db.execute(
                        "INSERT INTO useractivity(user_id, activity_title, time) VALUES($1, $2, $3)",
                        before.id, str(after.status.name), datetime.now())

            elif before.status != offline and after.status == dnd:
                if check2:
                    await self.bot.db.execute(
                        "UPDATE useractivity SET activity_title = $1, time = $2 WHERE user_id = $3",
                        str(after.status.name), datetime.now(), before.id)
                elif check2 is None:
                    await self.bot.db.execute(
                        "INSERT INTO useractivity(user_id, activity_title, time) VALUES($1, $2, $3)",
                        before.id, str(after.status.name), datetime.now())

            elif before.status != offline and after.status == online:
                if check2:
                    await self.bot.db.execute(
                        "UPDATE useractivity SET activity_title = $1, time = $2 WHERE user_id = $3",
                        str(after.status.name), datetime.now(), before.id)
                elif check2 is None:
                    await self.bot.db.execute(
                        "INSERT INTO useractivity(user_id, activity_title, time) VALUES($1, $2, $3)",
                        before.id, str(after.status.name), datetime.now())
Example #25
0
 async def is_admin(self, user):
     if await self.is_owner(user):
         return True
     if CacheManager.get_cache(self, user.id, 'admins'):
         return True
Example #26
0
    async def userinfo(self,
                       ctx,
                       *,
                       user: typing.Union[discord.User, str] = None):
        """ Overview about the information of an user """

        if isinstance(user, discord.User):
            user = user
            color = self.color['embed_color']

        elif isinstance(user, str):
            if not user.isdigit():
                return await ctx.send(
                    f"{emotes.red_mark} Couldn't find that user!")
            else:
                try:
                    user = await self.bot.fetch_user(user)
                    color = self.color['fetch_color']
                except:
                    return await ctx.send(f"{emotes.red_mark} Unknown user!")

        user = user or ctx.author

        badges = {
            'hs_brilliance': f'{emotes.discord_brilliance}',
            'discord_employee': f'{emotes.discord_staff}',
            'discord_partner': f'{emotes.discord_partner}',
            'hs_events': f'{emotes.discord_events}',
            'bug_hunter_lvl1': f'{emotes.discord_bug1}',
            'hs_bravery': f'{emotes.discord_bravery}',
            'hs_balance': f'{emotes.discord_balance}',
            'early_supporter': f'{emotes.discord_early}',
            'bug_hunter_lvl2': f'{emotes.discord_bug2}',
            'verified_dev': f'{emotes.discord_dev}'
        }

        badge_list = []
        flag_vals = UserFlags(
            (await self.bot.http.get_user(user.id))['public_flags'])
        for i in badges.keys():
            if i in [*flag_vals]:
                badge_list.append(badges[i])

        ranks = []
        # with open('db/badges.json', 'r') as f:
        #     data = json.load(f)
        data = self.bot.user_badges

        if cm.get_cache(self.bot, f"{user.id}", 'user_badges'):
            ranks.append(" ".join(data[f"{user.id}"]['Badges']))

        if user.bot:
            bot = "Yes"
        elif not user.bot:
            bot = "No"

        if badge_list:
            discord_badges = ' '.join(badge_list)
        elif not badge_list:
            discord_badges = ''
        medias = ""
        for media in await self.bot.db.fetch(
                "SELECT * FROM media WHERE user_id = $1", user.id):
            if media['media_type'] == "twitch":
                medias += f"{emotes.social_twitch} "
            elif media['media_type'] == "youtube":
                medias += f"{emotes.social_youtube} "
            elif media['media_type'] == "reddit":
                medias += f"{emotes.social_reddit} "
            elif media['media_type'] == "twitter":
                medias += f"{emotes.social_twitter} "
            elif media['media_type'] == "github":
                medias += f"{emotes.social_github} "
            elif media['media_type'] == "steam":
                medias += f"{emotes.social_steam} "
            elif media['media_type'] == "snapchat":
                medias += f"{emotes.social_snapchat} "
            medias += f"[{media['media_type'].title()}]({media['media_link']}) \n"

        if len(medias) > 1024:
            medias = medias[1020]
            medias += '...'

        if ranks:
            acknowledgements = '**Acknowledgements:** ' + ' '.join(ranks)
        else:
            acknowledgements = ''

        usercheck = ctx.guild.get_member(user.id)
        if usercheck:

            if usercheck.nick is None:
                nick = "N/A"
            else:
                nick = usercheck.nick

            status = {
                "online":
                f"{f'{emotes.online_mobile}' if usercheck.is_on_mobile() else f'{emotes.online_status}'}",
                "idle":
                f"{f'{emotes.idle_mobile}' if usercheck.is_on_mobile() else f'{emotes.idle_status}'}",
                "dnd":
                f"{f'{emotes.dnd_mobile}' if usercheck.is_on_mobile() else f'{emotes.dnd_status}'}",
                "offline": f"{emotes.offline_status}"
            }

            if usercheck.activities:
                ustatus = ""
                for activity in usercheck.activities:
                    if activity.type == discord.ActivityType.streaming:
                        ustatus += f"{emotes.streaming_status}"
            else:
                ustatus = f'{status[str(usercheck.status)]}'

            if not ustatus:
                ustatus = f'{status[str(usercheck.status)]}'
            nicks_opout = await self.bot.db.fetchval(
                "SELECT user_id FROM nicks_op_out WHERE user_id = $1",
                usercheck.id)
            if nicks_opout is None:
                nicknames = []
                for nicks, in await self.bot.db.fetch(
                        f"SELECT nickname FROM nicknames WHERE user_id = $1 AND guild_id = $2 ORDER BY time DESC",
                        user.id, ctx.guild.id):
                    nicknames.append(nicks)

                nicknamess = ""
                for nickss in nicknames[:5]:
                    nicknamess += f"{nickss}, "

                if nicknamess == "":
                    lnicks = "N/A"
                else:
                    lnicks = nicknamess[:-2]
            elif nicks_opout is not None:
                lnicks = 'User is opted out.'
            uroles = []
            for role in usercheck.roles:
                if role.is_default():
                    continue
                uroles.append(role.mention)

            uroles.reverse()

            if len(uroles) > 10:
                uroles = [
                    f"{', '.join(uroles[:10])} (+{len(usercheck.roles) - 11})"
                ]

            profile = discord.Profile

            emb = discord.Embed(color=self.color['embed_color'])
            emb.set_author(icon_url=user.avatar_url,
                           name=f"{user}'s information")
            emb.add_field(
                name="__**General Info:**__",
                value=
                f"**Full name:** {user} {discord_badges}\n**User ID:** {user.id}\n**Account created:** {user.created_at.__format__('%A %d %B %Y, %H:%M')}\n**Bot:** {bot}\n**Avatar URL:** [Click here]({user.avatar_url})\n{acknowledgements}",
                inline=False)
            emb.add_field(
                name="__**Activity Status:**__",
                value=
                f"**Status:** {ustatus}\n**Activity status:** {default.member_activity(usercheck)}",
                inline=False)
            emb.add_field(
                name="__**Server Info:**__",
                value=
                f"**Nickname:** {escape_markdown(nick, as_needed=True)}\n**Latest nicknames:** {escape_markdown(lnicks, as_needed=True)}\n**Joined at:** {default.date(usercheck.joined_at)}\n**Roles: ({len(usercheck.roles) - 1}) **"
                + ", ".join(uroles),
                inline=True)
            if user.is_avatar_animated() == False:
                emb.set_thumbnail(url=user.avatar_url_as(format='png'))
            elif user.is_avatar_animated() == True:
                emb.set_thumbnail(url=user.avatar_url_as(format='gif'))
            else:
                emb.set_thumbnail(url=user.avatar_url)
            if medias:
                emb.add_field(name="Linked medias:", value=medias[:-2])

            await ctx.send(embed=emb)

        elif not usercheck:
            emb = discord.Embed(color=color)
            emb.set_author(icon_url=user.avatar_url,
                           name=f"{user}'s information")
            emb.add_field(
                name="__**General Info:**__",
                value=
                f"**Full name:** {user} {discord_badges}\n**User ID:** {user.id}\n**Account created:** {user.created_at.__format__('%A %d %B %Y, %H:%M')}\n**Bot:** {bot}\n**Avatar URL:** [Click here]({user.avatar_url})\n{acknowledgements}",
                inline=False)
            if user.is_avatar_animated() == False:
                emb.set_thumbnail(url=user.avatar_url_as(format='png'))
            elif user.is_avatar_animated() == True:
                emb.set_thumbnail(url=user.avatar_url_as(format='gif'))
            else:
                emb.set_thumbnail(url=user.avatar_url)
            if medias:
                emb.add_field(name="Linked medias:", value=medias[:-2])
            await ctx.send(embed=emb)
Example #27
0
    async def on_guild_join(self, guild):

        # Check if guild is blacklisted before continuing
        reason = await self.bot.db.fetchval(
            "SELECT reason FROM blockedguilds WHERE guild_id = $1", guild.id)
        support = self.bot.support

        # If it is blacklisted, log it.
        data = cm.get_cache(self.bot, guild.id, 'blacklisted_guilds')
        if data:
            try:
                to_send = sorted([
                    chan for chan in guild.channels
                    if chan.permissions_for(guild.me).send_messages
                    and isinstance(chan, discord.TextChannel)
                ],
                                 key=lambda x: x.position)[0]
            except IndexError:
                pass
            reason = ''.join(data)
            e = discord.Embed(
                color=self.color['deny_color'],
                description=
                f"Hello!\nThis server has been blacklisted for: **{reason}**\n\nThus why I'll be leaving this server.\nIf you wish to appeal feel free to join the [support server]({self.bot.support})\nOnly server owner can appeal, unless their account is terminated.",
                timestamp=datetime.utcnow())
            e.set_author(name=f"Blacklist issue occured!",
                         icon_url=self.bot.user.avatar_url)
            e.set_thumbnail(
                url=
                'https://media.discordapp.net/attachments/756847192945459201/783075230922702848/Comp_1.gif?width=461&height=461'
            )
            try:
                await to_send.send(embed=e)
            except:
                pass
            await guild.leave()

            # Send it to the log channel
            chan = self.bot.get_channel(676419533971652633)
            modid = await self.bot.db.fetchval(
                "SELECT dev FROM blockedguilds WHERE guild_id = $1", guild.id)
            mod = self.bot.get_user(modid)
            e = discord.Embed(
                color=self.color['logembed_color'],
                title=f"{emotes.blacklisted} Attempted Invite",
                timestamp=datetime.utcnow(),
                description=
                f"A blacklisted guild attempted to invite me.\n**Guild name:** {guild.name}\n**Guild ID:** {guild.id}\n**Guild Owner:** {guild.owner}\n**Guild size:** {len(guild.members)-1}\n**Blacklisted by:** {mod}\n**Blacklist reason:** {reason}"
            )
            e.set_thumbnail(url=guild.icon_url)
            return await chan.send(embed=e)

        # Guild is not blacklisted!
        # Insert guild's data to the database and cache
        prefix = '-'
        await self.bot.db.execute(
            "INSERT INTO guilds(guild_id, prefix) VALUES ($1, $2)", guild.id,
            prefix)
        await self.bot.db.execute(
            "INSERT INTO raidmode(guild_id, raidmode, dm) VALUES ($1, $2, $3)",
            guild.id, False, True)
        self.bot.prefixes[guild.id] = prefix
        self.bot.raidmode[guild.id] = {'raidmode': False, 'dm': True}

        Zenpa = self.bot.get_user(373863656607318018)
        Moksej = self.bot.get_user(345457928972533773)
        support = self.bot.support
        try:
            to_send = sorted([
                chan for chan in guild.channels
                if chan.permissions_for(guild.me).send_messages
                and isinstance(chan, discord.TextChannel)
            ],
                             key=lambda x: x.position)[0]
        except IndexError:
            pass
        else:
            if to_send.permissions_for(guild.me).embed_links:  # We can embed!
                e = discord.Embed(color=self.color['embed_color'],
                                  title="A cool bot has spawned in!")
                e.description = f"Thank you for adding me to this server! If you'll have any questions you can contact `{Moksej}` or `{Zenpa}`. You can also [join support server]({support})\nTo get started, you can use my commands with my prefix: `{prefix}`, and you can also change the prefix by typing `{prefix}prefix [new prefix]`"
                e.set_thumbnail(
                    url=
                    'https://media.discordapp.net/attachments/756847192945459201/783075230922702848/Comp_1.gif?width=461&height=461'
                )
                try:
                    await to_send.send(embed=e)
                except:
                    pass
            else:  # We were invited without embed perms...
                msg = f"Thank you for adding me to this server! If you'll have any questions you can contact `{Moksej}` or `{Zenpa}`. You can also join support server: {support}\nTo get started, you can use my commands with my prefix: `{prefix}`, and you can also change the prefix by typing `{prefix}prefix [new prefix]`"
                try:
                    await to_send.send(msg)
                except:
                    pass

        # Log the join
        logchannel = self.bot.get_channel(675333016066719744)

        members = len(guild.members)
        bots = len([x for x in guild.members if x.bot])
        tch = len(guild.text_channels)
        vch = len(guild.voice_channels)
        if len(self.bot.guilds) == 100:
            g100 = f'\n\n{emotes.bot_vip} **This is 100th server!**'
        else:
            g100 = ''

        ratio = f'{int(100 / members * bots)}'

        embed = discord.Embed(
            color=self.color['logging_color'],
            title="I've joined a guild",
            description=
            f"I've joined a new guild. Informing you for safety reasons{g100}")
        embed.set_thumbnail(url=guild.icon_url)
        embed.add_field(
            name="__**General Info**__",
            value=
            f"**Guild name:** {guild.name}\n**Guild ID:** {guild.id}\n**Guild owner:** {guild.owner}\n**Guild owner ID:** {guild.owner.id}\n**Guild created:** {default.date(guild.created_at)} ({default.timeago(datetime.utcnow() - guild.created_at)})\n**Member count:** {members-1} (Bots / Users ratio: {ratio}%)\n**Text channels:** {tch}\n**Voice channels:** {vch}",
            inline=False)
        await logchannel.send(embed=embed)
Example #28
0
    async def on_member_remove(self, member):

        await self.bot.db.execute(
            "DELETE FROM warnings WHERE user_id = $1 AND guild_id = $2",
            member.id, member.guild.id)
        await self.bot.db.execute(
            "DELETE FROM autowarns WHERE user_id = $1 AND guild_id = $2",
            member.id, member.guild.id)
        shared_server = len([
            x for x in self.bot.guilds
            if x.id != member.guild.id and x.get_member(member.id)
        ])
        if shared_server == 0:
            await self.bot.db.execute(
                "DELETE FROM useractivity WHERE user_id = $1", member.id)

        db_check1 = cm.get_cache(self.bot, member.guild.id, 'leavemsg')
        db_check2 = cm.get_cache(self.bot, member.guild.id, 'joinlog')

        moderation = cm.get_cache(self.bot, member.guild.id, 'moderation')
        case = cm.get_cache(self.bot, member.guild.id, 'case_num')

        if member == self.bot.user:
            return

        if member.guild.me.guild_permissions.view_audit_log:
            checks = await self.get_audit_logs(
                member.guild, limit=1, action=discord.AuditLogAction.kick)

        if db_check2 is not None:
            # Member leave log
            logchannel = self.bot.get_channel(db_check2)
            embed = discord.Embed(
                color=self.color['logging_color'],
                description=f"{emotes.log_memberleave} Member left",
                timestamp=datetime.utcnow())
            #embed.set_author(icon_url=member.avatar_url)
            embed.add_field(name="Username:"******"{member} ({member.id})",
                            inline=True)
            embed.add_field(name="Created at:",
                            value=default.date(member.created_at),
                            inline=False)
            embed.add_field(name="Joined at:",
                            value=default.date(member.joined_at),
                            inline=False)
            embed.set_thumbnail(url=member.avatar_url)
            try:
                await logchannel.send(embed=embed)
            except Exception as e:
                await self.event_error(
                    error=e,
                    event='on_member_remove (leave log message)',
                    guild=member.guild)
                pass

        if moderation is not None:
            try:
                deleted = ""
                reason = ""
                async for entry in member.guild.audit_logs(
                        limit=1, action=discord.AuditLogAction.kick):
                    if entry.target == member:
                        deleted += f"{entry.user} ({entry.user.id})"
                        reason += f"{entry.reason}"
                    #print(entry)
            except Exception as e:
                print(e)
                pass
            logchannel = self.bot.get_channel(moderation)
            if deleted and (datetime.utcnow() -
                            checks[0].created_at).total_seconds() < 5:

                casenum = cm.get_cache(self.bot, member.guild.id,
                                       'case_num') or 1
                embed = discord.Embed(
                    color=self.color['logging_color'],
                    description=
                    f"{emotes.log_memberleave} Member kicked `[#{casenum}]`",
                    timestamp=datetime.utcnow())
                #embed.set_author(icon_url=member.avatar_url)
                embed.add_field(name="Username:"******"{member} ({member.id})",
                                inline=False)
                embed.add_field(name="Created at:",
                                value=default.date(member.created_at),
                                inline=False)
                embed.add_field(name="Joined at:",
                                value=default.date(member.joined_at),
                                inline=False)
                if deleted:
                    embed.add_field(name='Moderator:',
                                    value=deleted,
                                    inline=False)
                if reason:
                    embed.add_field(name="Reason:", value=reason, inline=False)
                embed.set_thumbnail(url=member.avatar_url)
                await self.update_query(guildid=member.guild.id, case=casenum)
                self.bot.case_num[member.guild.id] += 1
                try:
                    await logchannel.send(embed=embed)
                except Exception as e:
                    await self.event_error(
                        error=e,
                        event='on_member_remove (kick message)',
                        guild=member.guild)
                    pass

            elif deleted and (datetime.utcnow() -
                              checks[0].created_at).total_seconds() > 5:
                pass

        if db_check1 is not None:
            if member.bot and db_check1['bot_joins'] == False:
                return
            elif member.bot and db_check1['bot_joins'] == True:
                pass
            elif db_check1['bot_joins'] is None:
                pass
            if db_check1['message'] and not db_check1['embed']:
                leavemessage = str(db_check1['message'])
                leavemessage = leavemessage.replace("{{member.mention}}",
                                                    member.mention)
                leavemessage = leavemessage.replace("{{member.tag}}",
                                                    str(member))
                leavemessage = leavemessage.replace("{{member.id}}",
                                                    str(member.id))
                leavemessage = leavemessage.replace(
                    "{{member.name}}",
                    discord.utils.escape_markdown(member.name, as_needed=True))
                leavemessage = leavemessage.replace("{{server.name}}",
                                                    member.guild.name)
                leavemessage = leavemessage.replace(
                    "{{server.members}}", str(member.guild.member_count))
            elif db_check1['message'] is None and not db_check1['embed']:
                leavemessage = f"{emotes.left} {member.mention} left the server... There are {member.guild.member_count} members left in the server."
            elif db_check1['message'] and db_check1['embed'] == True:
                msg = json.loads(db_check1['message'])
                emb_dict = msg
                emb_dict = self.placeholder_replacer(emb_dict, member)
                if "author" in emb_dict:
                    emb_dict["author"] = self.placeholder_replacer(
                        emb_dict["author"], member)
                if "footer" in emb_dict:
                    emb_dict["footer"] = self.placeholder_replacer(
                        emb_dict["footer"], member)
                if "fields" in emb_dict:
                    for field in emb_dict["fields"]:
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["name"], member)
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["value"], member)
            elif db_check1['message'] is None and db_check1['embed'] == True:
                emb_dict = {
                    "description":
                    "{{member.name}} left the server! There are now {{server.members}} members left!",
                    "color": 13579316
                }
                emb_dict = self.placeholder_replacer(emb_dict, member)
                if "author" in emb_dict:
                    emb_dict["author"] = self.placeholder_replacer(
                        emb_dict["author"], member)
                if "footer" in emb_dict:
                    emb_dict["footer"] = self.placeholder_replacer(
                        emb_dict["footer"], member)
                if "fields" in emb_dict:
                    for field in emb_dict["fields"]:
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["name"], member)
                        emb_dict["fields"] = self.placeholder_replacer(
                            field["value"], member)
            leavechannel = self.bot.get_channel(db_check1['channel'])
            try:
                if db_check1['embed']:
                    try:
                        await leavechannel.send(
                            content=emb_dict['plainText'],
                            embed=discord.Embed.from_dict(emb_dict),
                            allowed_mentions=discord.AllowedMentions(
                                users=True))
                    except:
                        await leavechannel.send(
                            embed=discord.Embed.from_dict(emb_dict),
                            allowed_mentions=discord.AllowedMentions(
                                users=True))
                else:
                    await leavechannel.send(
                        leavemessage,
                        allowed_mentions=discord.AllowedMentions(users=True))
            except Exception as e:
                await self.event_error(
                    error=e,
                    event='on_member_remove (leave message)',
                    guild=member.guild)
                return
Example #29
0
 async def is_owner(self, user):
     if CacheManager.get_cache(self, user.id, 'devs'):
         return True