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
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
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
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
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
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
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)
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)
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
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
async def on_guild_remove(self, guild): # Delete guild data from the database # await self.bot.db.execute("DELETE FROM automods WHERE guild_id = $1", guild.id) await self.bot.db.execute("DELETE FROM guilds WHERE guild_id = $1", guild.id) cm.delete_cache(self.bot, guild.id) # Log the leave members = len(guild.members) logchannel = self.bot.get_channel(675333016066719744) e = discord.Embed( color=self.color['logging_color'], title='I\'ve left the guild...', description= f"**Guild name:** {guild.name}\n**Member count:** {members}") await logchannel.send(embed=e)
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)
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
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
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!")
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
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() }
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
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
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
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
async def is_admin(self, user): if await self.is_owner(user): return True if CacheManager.get_cache(self, user.id, 'admins'): return True
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
async def is_booster(self, user): if CacheManager.get_cache(self, user.id, 'boosters'): return True
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
async def is_owner(self, user): if CacheManager.get_cache(self, user.id, 'devs'): return True
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)
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)
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
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())