async def userinfo(ctx, user: discord.Member): time = user.joined_at corfor1 = time.strftime("%d %b, %Y at %H:%M") time2 = user.created_at corfor2 = time2.strftime("%d %b, %Y at %H:%M") def sort_by_joined_at(member: discord.Member): return member.joined_at memberslist = ctx.guild.members memberslist.sort(key=sort_by_joined_at) joinpos = memberslist.index(user) if user.premium_since is None: boosting = "Nope" else: boosting = "Yes" if user.is_on_mobile(): fro = "Mobile" else: fro = "PC" embed = discord.Embed(description="Nickname: {}".format(user.nick), color=0x000000) embed.set_author(name="Info of {}".format(user), icon_url=user.avatar_url) embed.set_footer(text="Requested by {}".format(ctx.message.author)) embed.add_field(name="Joined on", value="{}".format(corfor1)) embed.add_field(name="Join position", value="{}".format(str(joinpos + 1))) embed.add_field(name="Registered on", value="{}".format(corfor2)) embed.add_field(name="Boosting this guild", value="{}".format(boosting)) embed.add_field(name="Current status", value="{}".format(str(user.status))) embed.add_field(name="Mobile or PC", value="{}".format(fro)) embed.set_thumbnail(url=user.avatar_url) await ctx.send(embed=embed)
async def avatar(self, ctx, member: discord.Member = None): """Changes the bot's avatar to that of the context's attachment.""" async with ctx.typing(): if member is None: attachments = ctx.message.attachments if attachments: avatar = random.choice(attachments) async with self.session.get(avatar.url) as resp: buffer = BytesIO(await resp.read()) content_type = resp.headers['content-type'] ext = mimetypes.guess_extension(content_type) if ext.endswith('jpe'): n_ext = '.jpeg' else: n_ext = ext avatar_file = discord.File(fp=buffer, filename=f'avatar{n_ext}') await self.bot.user.edit(avatar=await resp.read()) await ctx.send('new avatar set to:', file=avatar_file) else: error_d = 'send an avatar idiot' await ctx.send(embed=error_embed(error_d)) else: async with self.session.get( member.avatar_url_as(format='png')) as resp: buffer = BytesIO(await resp.read()) avatar_file = discord.File(fp=buffer, filename='avatar.png') await self.bot.user.edit(avatar=await resp.read()) await ctx.send( f'new avatar set to {member.display_name.lower()}\'s:', file=avatar_file)
async def userinfo(self, ctx, user: discord.Member = None): if user is None: user = ctx.message.author if user.activity is not None: game = user.activity.name else: game = None voice_state = None if not user.voice else user.voice.channel embed = discord.Embed(timestamp=ctx.message.created_at, colour=self.bot.config.color) embed_values = { "User ID": user.id, "Nick": user.nick, "Status": user.status, "On Mobile": user.is_on_mobile(), "In Voice": voice_state, "Game": game, "Highest Role": user.top_role.name, "Account Created": user.created_at.__format__('%A, %d. %B %Y @ %H:%M:%S'), "Join Date": user.joined_at.__format__('%A, %d. %B %Y @ %H:%M:%S') } for n, v in embed_values.items(): embed.add_field(name=n, value=v, inline=True) embed.set_thumbnail(url=user.avatar_url) embed.set_author(name=user.name, icon_url=user.avatar_url) embed.set_footer(text=self.bot.user.name, icon_url=self.bot.user.avatar_url) await ctx.send(embed=embed)
async def userinfo(self, ctx, user: discord.Member = None): """Get a users info.""" if not user: user = ctx.message.author try: playinggame = user.activity.title except: playinggame = None server = ctx.message.guild embed = discord.Embed(color=0xDEADBF) embed.set_author(name=user.name, icon_url=user.avatar_url) embed.add_field(name="ID", value=user.id) embed.add_field(name="Discriminator", value=user.discriminator) embed.add_field(name="Bot", value=str(user.bot)) embed.add_field(name="Created", value=user.created_at.strftime("%d %b %Y %H:%M")) embed.add_field(name="Joined", value=user.joined_at.strftime("%d %b %Y %H:%M")) embed.add_field(name="Animated Avatar", value=str(user.is_avatar_animated())) embed.add_field(name="Playing", value=playinggame) embed.add_field(name="Status", value=user.status) embed.add_field(name="Color", value=str(user.color)) try: roles = [x.name for x in user.roles if x.name != "@everyone"] if roles: roles = sorted(roles, key=[x.name for x in server.role_hierarchy if x.name != "@everyone"].index) roles = ", ".join(roles) else: roles = "None" embed.add_field(name="Roles", value=roles) except: pass await ctx.send(embed=embed)
async def perms(self, ctx, target: discord.Member = None): """Show the allowed and denied permissions for a user""" target = target or ctx.author embed = discord.Embed() ls = sorted([*ctx.channel.permissions_for(target)], key=lambda x: x[1], reverse=True) for key, group in itertools.groupby(ls, lambda x: x[1]): joined = "\n".join([ f"{ctx.tick(g[1])} {discord.utils.escape_markdown(g[0])}" for g in group if g[0] in [ a[0] for a in filter(lambda p: p[1] is True, discord.Permissions(2080898303)) ] ]) embed.add_field(name="_ _", value=joined or "_ _") embed.set_field_at( 0, name=ctx.channel.permissions_for(ctx.author).value, value=embed.fields[0].value, ) embed.set_author(name=target.display_name, icon_url=target.avatar_url_as(static_format="png")) await ctx.send(embed=embed)
async def permissions(self, ctx, user: discord.Member = None, channel: discord.TextChannel = None): """Get a member's permissions in a channel. If not given, user and channel are the command author and channel respectively""" user = user or ctx.author channel = channel or ctx.channel perms = user.permissions_in(channel) newperms = [] for perm in [x for x in perms]: pretty_perm = " ".join(perm[0].split("_")).title() if perm[1]: newperms.append("\U00002705 {}".format(pretty_perm)) else: newperms.append("\U0000274e {}".format(pretty_perm)) permissions_embed = discord.Embed( title=f"{user}'s permissions in #{channel.name}", description="\n".join(newperms), color=discord.Color.blurple(), ) await ctx.send(embed=permissions_embed)
async def avatar(self, ctx, *, member: discord.Member = None): """ ⛩ Show your pfp with different format """ if not member: member = ctx.author embed = discord.Embed( colour=discord.Color.gold(), title=f"{member.name}'s Avatar", description= f"[PNG]({member.avatar_url_as(size=1024, format='png')}) | " f"[JPEG]({member.avatar_url_as(size=1024, format='jpeg')}) | " f"[WEBP]({member.avatar_url_as(size=1024, format='webp')})") embed.set_author(icon_url=ctx.author.avatar_url_as(format="png"), name=ctx.author.name) if member.is_avatar_animated(): embed.description += f" | [GIF]({member.avatar_url_as(size=1024, format='gif')})" embed.set_image( url=f"{member.avatar_url_as(size=1024, format='gif')}") else: embed.set_image( url=f"{member.avatar_url_as(size=1024, format='png')}") return await ctx.send(embed=embed)
def player_draft_card(member: discord.Member, team_role: discord.Role, selecting_string: str = None) -> discord.File: """Generate a player draft card image.""" # get the relevant images and strings team = Team.get_or_except(team_name=team_role.name, guild_id=member.guild.id) team_logo = fetch_image(team.image_url) team_colour = str(team_role.colour) selecting_string = selecting_string if selecting_string else team.name title = f'{selecting_string.upper()} SELECT' player_avatar = fetch_image( str(member.avatar_url_as(format='png', size=256))) name = member.name.upper() summary = get_player_summary(member) wordmark = Image.open('res/pc_wordmark.png') # generate the image width = max( get_text_width(title, 50) + 125, get_text_width(name, 40) + 298, 600) # im = generate_gradient('#4e459d', '#b03045', width, 400) im = generate_gradient(str(team_role.color), '#FFFFFF', width, 400) rectangle(im, 0, 0, width, 90, team_colour) if 'LIGHTNING' in title or 'PLAGUE' in title: text_colour = '#000' wordmark = Image.open('res/pc_wordmark_black.png') else: text_colour = None draw_text(im, title, left=120, top=15, size=50, colour=text_colour) draw_text(im, name, left=293, top=95, size=40, colour=text_colour) draw_text(im, summary, left=293, top=145, size=25, colour=text_colour) paste_image(im, team_logo, left=20, top=10, height=80) paste_image(im, player_avatar, left=23, top=108, height=255) paste_image(im, wordmark, left=5, top=365, height=30) return store_image(im, f'{team_role.name}_selects_{member.name}.png')
async def info(self, ctx, *, member: discord.Member = None): """Shows you info about yourself, or someone else.""" member = member or ctx.author embed = discord.Embed(title='Info') embed.set_author(name=str(member), icon_url=member.avatar_url_as(format='png')) user = await self.get_participant(member.id) badges = [] if user.death is not None: badges.append('\N{COFFIN}') embed.set_footer(text='Dead since').timestamp = user.death if user.masked: badges.append('\N{FACE WITH MEDICAL MASK}') if user.is_infectious(): badges.append('\N{BIOHAZARD SIGN}\ufe0f') if user.healer: badges.append('\N{STAFF OF AESCULAPIUS}\ufe0f') if user.immunocompromised: badges.append('\U0001fa78') if user.immune_until and user.immune_until > ctx.message.created_at: badges.append('\N{FLEXED BICEPS}') if user.pda_cooldown and user.pda_cooldown > ctx.message.created_at: badges.append('\N{HUGGING FACE}') embed.description = f'Sickness: [{user.sickness}/100]' embed.add_field(name='Badges', value=' '.join(badges) or 'None') embed.add_field(name='Backpack', value=' '.join(user.backpack) or 'Empty', inline=False) if user.infected_since and not user.death: embed.set_footer( text='Infected since').timestamp = user.infected_since await ctx.send(embed=embed)
async def vertical(self, ctx, *, member: discord.Member = None): await ctx.trigger_typing() member = member or ctx.author if not ctx.message.attachments: await ctx.trigger_typing() async with aiohttp.ClientSession() as cs: async with cs.get(member.avatar_url_as(format='png', size=1024)) as image: avatar_bytes = await image.read() with Image.open(BytesIO(avatar_bytes)) as image: output_buffer = BytesIO() image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save(output_buffer, 'png') output_buffer.seek(0) await ctx.send( file=discord.File(fp=output_buffer, filename='test.png')) else: atc = ctx.message.attachments[0] try: attachment_bytes = BytesIO() file_format = ctx.message.attachments[0].filename.split('.') await ctx.message.attachments[0].save(attachment_bytes) attachment_bytes.seek(0) with Image.open(attachment_bytes) as image: output_buffer = BytesIO() image = image.transpose(Image.FLIP_TOP_BOTTOM) image.save(output_buffer, atc.filename.split('.')[-1]) output_buffer.seek(0) await ctx.send(file=discord.File( fp=output_buffer, filename=ctx.message.attachments[0].filename)) except ValueError: await ctx.send('That format is not supported.')
async def internal(ctx, member: discord.Member = None): if member == None: member = ctx.author im = Image.open("internal.jpg") im = convert_mode(im) asset = member.avatar_url_as(format=None, static_format='jpg', size=128) data = BytesIO(await asset.read()) pfp = Image.open(data) pfp = pfp.resize((71, 101)) mask_circle(pfp) im.alpha_composite(pfp, dest=(323, 45)) pfp = pfp.resize((71, 101)) mask_circle(pfp) im.alpha_composite(pfp, dest=(323, 311)) pfp = pfp.resize((119, 129)) mask_circle(pfp) im.alpha_composite(pfp, dest=(278, 525)) im.save('internalled.png') await ctx.send(file=discord.File('internalled.png'))
async def get_premium(self, target: discord.Member = None): # bot accounts cannot use the profile function # so look for popular discriminators and animated avatars discriminator = target.discriminator animated = target.is_avatar_animated() discrim_list = [ "0001", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "1337", "1234", "4321", "0666", "6660", "1000", "2000", "3000", "4000", "5000", "6000", "7000", ] if any(discriminator in s for s in discrim_list): return True if animated: return True else: return False
async def leave_notification(member: discord.Member): if member.guild.id == 458765854624972811: with open("logs/members.log", "a") as lf: lf.write( f"{datetime.utcnow().__str__()}-{member.guild.member_count}\n") now = datetime.utcnow() embed = discord.Embed(title="Member has left the server", description=discord.Embed.Empty, colour=0xcd5312) embed = embed.set_thumbnail( url=member.avatar_url_as(static_format="png", size=1024)) embed = embed.add_field(name="Tag", value=f"{member.name}#{member.discriminator}") embed = embed.add_field(name="ID", value=member.id) embed = embed.add_field(name="Nickname", value=member.display_name) embed = embed.add_field(name="Mention", value=member.mention) embed = embed.add_field(name="New Member Count", value=member.guild.member_count) embed = embed.add_field( name="Member since", value=f"{member.joined_at.__str__()} UTC ({now - member.joined_at})" ) embed = embed.set_footer(text=str(now)) await client.get_channel(643340226894233610).send(embed=embed)
async def gen_guild_profile(bot: commands.AutoShardedBot, member: discord.Member) -> Tuple[discord.File, discord.Embed]: name_font = ImageFont.truetype("./utils/src/NotoSans-CondensedBold.ttf", 69) level_font = ImageFont.truetype("./utils/src/NotoSans-CondensedBold.ttf", 42) progress_bar, level, xp, req_xp = await _get_progress_bar(bot, member) pfp_mask = Image.new("L", (256, 256), 0) draw = ImageDraw.Draw(pfp_mask) draw.ellipse((0, 0, 256, 256), fill=255) image = Image.new("RGBA", (1050, 300), (115, 115, 115)) if progress_bar: image.paste(progress_bar, (295, 215)) overlay = Image.open("./utils/src/mbprofile.png") image.paste(overlay, (0, 0), overlay) name_length = ImageDraw.ImageDraw(image).textlength(str(member), font=name_font) xp_length = ImageDraw.ImageDraw(image).textlength(f"{xp}/{req_xp}", font=level_font) / 2 lvl_length = ImageDraw.ImageDraw(image).textlength(f"Level {level}", font=level_font) / 2 text_draw = ImageDraw.Draw(image) text_draw.text((1030 - name_length, 10), str(member), (0, 0, 0), font=name_font) text_draw.text((649 - xp_length, 216), f"{xp}/{req_xp}", (0, 0, 0), font=level_font) text_draw.text((960 - lvl_length, 100), f"Level {level}", (0, 0, 0), font=level_font) pfp_asset = member.avatar_url_as(format="png", static_format="png", size=256) pfp_overlay = Image.open(BytesIO(await pfp_asset.read())) if not pfp_overlay.size[0] == pfp_overlay.size[1] == 256: pfp_overlay = pfp_overlay.resize((256, 256), NEAREST, reducing_gap=3.0) image.paste(pfp_overlay, (24, 20), pfp_mask) b_io = BytesIO() image.save(b_io, format="png") export = discord.File(fp=BytesIO(b_io.getvalue()), filename="profile.jpg") embed = discord.Embed(title=f"{member.display_name}'s Profile", color=discord.Color.blue()) embed.set_image(url="attachment://profile.jpg") return export, embed
async def userinfo(ctx, member:discord.Member): """Info about user""" embed = discord.Embed(title="User Info", color=0xff00ae) embed.add_field(name="Name: ", value=member.name) embed.add_field(name="web status", value=member.web_status) embed.add_field(name="On Mobile? ", value=member.is_on_mobile()) embed.add_field(name="True Mobile Status ", value=member.mobile_status) embed.add_field(name="Status: ", value=member.status) embed.add_field(name="Desktop Status: ", value=member.desktop_status) embed.add_field(name="roles: ", value=member.roles) embed.add_field(name='Joined this Server: ', value=member.joined_at) embed.add_field(name='Nickname', value=member.nick) embed.add_field(name="Highest Role: ", value=member.top_role) embed.add_field(name="Avatar: ", value=member.avatar) embed.add_field(name="Avatar URL: ", value=member.avatar_url) embed.add_field(name="Created At: ", value=member.created_at) embed.add_field(name="Discriminator: ", value=member.discriminator) embed.add_field(name="Bot?", value=member.bot) embed.add_field(name="ID: ", value=member.id) embed.add_field(name="Current Activities", value=member.activities) embed.add_field(name="Mentionable String", value=member.mention) #embed.add_field(name="Name: ", value=member.name) await ctx.send(embed=embed)
async def quote(self, ctx, member: discord.Member, *, quote: str): """ 'Stop believing internet quotes' - God """ daggy = await self.client.fetch_user(self.daggy) member = member or ctx.author async with ctx.typing(): resp = { 'token': dagpi(), 'url': str(member.avatar_url_as(static_format='png')), 'text': quote, 'name': member.display_name } async with aiohttp.ClientSession() as cs: async with cs.post('https://dagpi.tk/api/quote', headers=resp) as r: resp = await r.json() res = resp['url'] embed = discord.Embed(colour=self.client.colour) embed.set_image(url=res) embed.set_footer( text=f"Much thanks to {str(daggy)} for this amazing API!", icon_url=daggy.avatar_url) await ctx.send(embed=embed)
async def avatar(self, ctx, member: discord.Member): url = str(member.avatar_url) filename = url.split("/")[-1] filename = filename.split( "?" )[0] # cleans up the file name so it removes trailing ? symbols and has correct extension async with aiohttp.ClientSession() as image: async with image.get(url) as ava: if ava.status == 200: avatar = await aiofiles.open(pathlib.Path.cwd() / filename, mode="wb") await avatar.write(await ava.read()) await avatar.close() ava_img = pathlib.Path.cwd() / filename if member.is_avatar_animated(): await ctx.send(file=discord.File(ava_img)) else: ava_new = pathlib.Path.cwd() / (filename + ".png") ava_edit = Image.open(ava_img) ava_edit.save(ava_new) await ctx.send(file=discord.File(ava_new)) ava_new.unlink() ava_img.unlink()
async def privatevc_add(self, ctx: Context, *, member: Member): data = await DB.fetch_data(self.bot, ctx.author) if not data: return await ctx.send_error( "You don't have a private Voice Channel!") tc: TextChannel = ctx.guild.get_channel(data["textchannel_id"]) vc: VoiceChannel = ctx.guild.get_channel(data["voicechannel_id"]) if not tc: return await ctx.send_error( "You must run this in the guild your channel is in!") if ctx.channel.id != data["textchannel_id"]: return await ctx.send_error( "You must use this command in your private channel!") if member.permissions_in(tc).read_messages: return await ctx.send_error("That member already has access!") overwrites = { **tc.overwrites, member: PermissionOverwrite(read_messages=True, send_messages=True, connect=True) } await tc.edit(overwrites=overwrites) await vc.edit(overwrites=overwrites) await ctx.reply(f"{member.mention} now has access to your channels!")
async def status(self, ctx, *, member: discord.Member = None): """gib status""" author = ctx.author guild = ctx.guild if not member: member = author status_string = "No Custom Status Dectected" for s in member.activities: if isinstance(s, discord.CustomActivity): status_string = s name = str(member) name = member.nick if member.nick else name embed = discord.Embed() embed.title = name embed.colour = member.colour embed.add_field(name="Custom Status", value=status_string) embed.set_thumbnail(url=member.avatar_url_as(static_format="png")) await ctx.send(embed=embed)
async def leave_notification(member: discord.Member): if member.guild.id == 675545015375888393: with open("logs/members.log", "a") as lf: lf.write( f"{__common__.get_timestamp()}-{member.guild.member_count}\n") now = datetime.utcnow() embed = discord.Embed(title="Member has left the server", description=discord.Embed.Empty, colour=0xcd5312) embed = embed.set_thumbnail( url=member.avatar_url_as(static_format="png", size=1024)) embed = embed.add_field(name="Tag", value=f"{member.name}#{member.discriminator}") embed = embed.add_field(name="ID", value=member.id) embed = embed.add_field(name="Nickname", value=member.display_name) embed = embed.add_field(name="Mention", value=member.mention) embed = embed.add_field(name="New Member Count", value=member.guild.member_count) embed = embed.add_field( name="Member since", value=f"{__common__.get_timestamp(member.joined_at)} UTC " f"({now-member.joined_at})") embed = embed.set_footer(text=str(now)) await client.get_channel(675570198392209428).send(embed=embed)
async def simp(self, ctx: aoi.AoiContext, member: discord.Member = None): await ctx.trigger_typing() member = member or ctx.author # bounds = (496, 145, 679, 178) bounds = (490, 145, 685, 178) target_width = bounds[2] - bounds[0] img_copy: PIL.Image = self.simp_img.copy().convert("RGBA") draw = PIL.ImageDraw.Draw(img_copy) # draw.rectangle(bounds, fill=(0, 200, 0)) name_size, name_height = draw.textsize(member.name, font=self.font) sz = 33 font = self.font while name_size > target_width and sz > 4: sz -= 1 font = _font(sz) name_size, name_height = draw.textsize(member.name, font=font) draw.text((587 - name_size / 2, 162 - name_height / 2), text=member.name, font=font, fill=(0, 0, 0)) av_url = member.avatar_url_as(format="png", size=128) av_buf = io.BytesIO() await av_url.save(av_buf) av_buf.seek(0) av_img = PIL.Image.open(av_buf).convert("RGBA") av_img = av_img.resize((83, 83)) av_fg_img = PIL.Image.new("RGBA", self.simp_img.size) av_fg_img.paste(av_img, (430, 384)) av_fg_img.putalpha(self.av_mask) img_copy = PIL.Image.alpha_composite(img_copy, av_fg_img) buf = io.BytesIO() img_copy.save(buf, "png") await ctx.embed(image=buf)
async def join_notification(member: discord.Member): if member.guild.id == 675545015375888393: with open("logs/members.log", "a") as lf: lf.write( f"{__common__.get_timestamp(member.joined_at)}+{member.guild.member_count}\n" ) embed = discord.Embed(title="Member has joined the server", description=discord.Embed.Empty, colour=0x15a216) embed = embed.set_thumbnail( url=member.avatar_url_as(static_format="png", size=1024)) embed = embed.add_field(name="Tag", value=f"{member.name}#{member.discriminator}") embed = embed.add_field(name="ID", value=member.id) embed = embed.add_field(name="Mention", value=member.mention) embed = embed.add_field(name="New Member Count", value=member.guild.member_count) created_ts = (await client.fetch_user(member.id)).created_at embed = embed.add_field( name="Account Created At", value=f"{__common__.get_timestamp(created_ts)}\n" f"{str(datetime.utcnow()-created_ts)}") embed = embed.set_footer(text=member.joined_at) await client.get_channel(675570198392209428).send(embed=embed)
async def shoot(ctx, member: discord.Member = None): if member == None: member = ctx.author else: im = Image.open('shoot.jpg') asset = member.avatar_url_as(format=None, static_format='jpg', size=128) data = BytesIO(await asset.read()) pfp = Image.open(data) asset2 = ctx.author.avatar_url_as(format=None, static_format='jpg', size=128) data2 = BytesIO(await asset2.read()) pfp2 = Image.open(data2) pfp = pfp.resize((113, 105)) pfp2 = pfp2.resize((102, 88)) im = im.copy() im.paste(pfp, (415, 173)) im.paste(pfp2, (188, 137)) im.save('shot.png') await ctx.send(file=discord.File('shot.png'))
async def history(self, ctx, *, member:discord.Member): """Gets the message history of a member This command can only be used by mods or above. """ for channel in ctx.message.server.channels: perms = member.permissions_in(channel) if perms.read_messages: logs = [] async for message in self.bot.logs_from(channel, limit=1500): if message.author == member: logs.append(message) if len(logs) > 0: await self.bot.whisper('Messages in {0}'.format(channel)) logs.reverse() for message in logs: try: asyncio.sleep(10) await self.bot.whisper(self.format_message(message)) except discord.HTTPException: await self.bot.whisper('An error happened while fetching mentions.') await self.bot.say('Finished searching logs. All found messages should have been PMed')
async def userinfo(self, ctx, user: discord.Member): """Returns information about a user.""" embed = discord.Embed(colour=user.colour) embed.set_author(name=user, icon_url=user.avatar_url) embed.add_field(name="Display name", value=user.display_name) embed.add_field(name="ID", value=user.id) embed.add_field(name="Colour", value=str(user.colour).upper()) embed.add_field( name="Server join date", value=user.joined_at.strftime("%b %-d %Y %-H:%M (UTC)")) embed.add_field( name="Account creation date", value=user.created_at.strftime("%b %-d %Y %-H:%M (UTC)")) if user.bot: value = "Can't determine" elif user.is_avatar_animated(): value = "Rich" else: value = "Probably broke" embed.add_field(name="Socioeconomic status", value=value) await ctx.send(embed=embed)
async def iq(self, ctx, member: discord.Member = None): if member is None: return await ctx.send('A targeted user is required') iq = random.randint(1, 201) # like if its 1-300 would be green, 300-600 would be orange, 600-900 would be red and 900-1000 purple? if not just make it always red :p if iq <= 19: color = discord.Color.green() elif iq <= 59: color = discord.Color(0xf1c40f) elif iq <= 119: color = discord.Color.orange() elif iq <= 200: color = discord.Color.red() else: color = discord.Color.purple() lastmsg = await ctx.history().get(author__id=member.id) embed = discord.Embed(color=color, description=f'{member.mention}\n\n"{lastmsg.clean_content}"\n\n{iq} IQ') embed.set_author(name='� IQ Analyzer �', icon_url=member.avatar_url_as(size=32)) embed.set_footer(text=f'🔮 {lastmsg.created_at.strftime("%d/%m/%Y")}, #{ctx.channel.name} 🔮') if lastmsg.attachments: embed.set_image(url=lastmsg.attachments[0].url) await ctx.send(embed=embed)
async def permissions(self, ctx, *, member: discord.Member = None): member = member or ctx.author perms = [] negperms = [] embed = discord.Embed(colour=self.client.colour).set_author( name=f"{member}'s permissions in {ctx.channel}", icon_url=member.avatar_url) all = dict(member.permissions_in(ctx.channel)).items() for key, value in all: if value: perms.append( f"<:tick:733458499777855538> `{str(key.title()).replace('_', ' ')}`" ) else: negperms.append( f"<:x_:733458444346195990> `{str(key.title()).replace('_', ' ')}`" ) embed2 = discord.Embed(colour=self.client.colour).set_author( name=embed.author.name, icon_url=member.avatar_url) embed.description = '\n'.join(perms) embed2.description = '\n'.join(negperms) source = paginator.EmbedSource([embed, embed2]) await paginator.CatchAllMenu(source=source).start(ctx)
async def user_info(self, ctx: Context, user: Member = None, hidden: bool = False): """ Returns info about a user. """ # Validates hidden input hidden = str(hidden) if user is None: user = ctx.author # User information created = time_since(user.created_at, max_units=3) name = f"{user.name}#{user.discriminator}" if user.nick: name = f"{user.nick} ({name})" # Member information joined = time_since(user.joined_at, precision="days") # You're welcome, Volcyyyyyyyyyyyyyyyy roles = ", ".join(role.mention for role in user.roles if role.name != "@everyone") # Infractions api_response = await self.bot.http_session.get( url=URLs.site_infractions_user.format(user_id=user.id), params={"hidden": hidden}, headers=self.headers) infractions = await api_response.json() infr_total = 0 infr_active = 0 # At least it's readable. for infr in infractions: if infr["active"]: infr_active += 1 infr_total += 1 # Let's build the embed now embed = Embed(title=name, description=textwrap.dedent(f""" **User Information** Created: {created} Profile: {user.mention} ID: {user.id} **Member Information** Joined: {joined} Roles: {roles or None} **Infractions** Total: {infr_total} Active: {infr_active} """)) embed.set_thumbnail(url=user.avatar_url_as(format="png")) embed.colour = user.top_role.colour if roles else Colour.blurple() await ctx.send(embed=embed)
async def _auto_kick(self, member: discord.Member) -> Optional[bool]: global extendedmodlog days = await self.config.guild(member.guild).daythreshold() now = datetime.utcnow() kicked = False real = 100 blacklist = await self.config.guild(member.guild).blacklist() appeal = await self.config.guild(member.guild).appealinvite() bypass_invite = await self.config.guild(member.guild ).bypass_invite_links() botty_invites = await self.config.guild(member.guild ).spammy_invite_links() if member.id in blacklist: log.info( f"{member} has been added to guild blacklist force kicking") real -= 1000 elif (member.is_avatar_animated() or member.activity or [a for a in member.activities if a] or now > member.created_at + timedelta(days=days)): log.info(f"{member} passed kick check will not be kicked ...") return name = member.name guild = member.guild if extendedmodlog is None: extendedmodlog = self.bot.get_cog("ExtendedModLog") if extendedmodlog: invite = await extendedmodlog.get_invite_link(guild) invite = invite.split("\nInvited by: ")[0] else: invite = None if invite: if invite in bypass_invite and member.id not in blacklist: log.info(f"{member} passed kick check will not be kicked ...") return avatar = member.avatar_url_as(static_format="png") ban = 0 diff = now - member.created_at diff = diff.days real -= (16 - diff) * 3 if regex.search(discord_name_re, name, concurrent=True): ban += 20 if regex.search(discord_base_avatar_re, str(avatar), concurrent=True): ban += 20 if invite: if invite in botty_invites: ban += 35 real -= ban if real <= 60: kicked = True queue_entry = (guild.id, member.id) if queue_entry in self.kick_queue: while queue_entry in self.kick_queue: self.kick_queue.remove(queue_entry) if queue_entry not in self.kick_queue: if appeal: await self.send_appeal_info(member, guild, "kick", invite=appeal, is_auto=True) # noinspection PyTypeChecker await self.kick_user( member, ctx=None, reason="Auto removed likely bot account" if member.id not in blacklist else "Forced Kick: User has been added to blacklist", create_modlog_case=True, author=guild.me, time=member.created_at, guild=guild, auto=True, ) if queue_entry in self.kick_queue: while queue_entry in self.kick_queue: self.kick_queue.remove(queue_entry) if kicked: log.info(f"Kicking {member}") return True
async def on_voice_state_update( self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState ) -> None: """Log member voice state changes to the voice log channel.""" if ( member.guild.id != GuildConstant.id or (before.channel and before.channel.id in GuildConstant.modlog_blacklist) ): return if member.id in self._ignored[Event.voice_state_update]: self._ignored[Event.voice_state_update].remove(member.id) return # Exclude all channel attributes except the name. diff = DeepDiff( before, after, exclude_paths=("root.session_id", "root.afk"), exclude_regex_paths=r"root\.channel\.(?!name)", ) # A type change seems to always take precedent over a value change. Furthermore, it will # include the value change along with the type change anyway. Therefore, it's OK to # "overwrite" values_changed; in practice there will never even be anything to overwrite. diff_values = {**diff.get("values_changed", {}), **diff.get("type_changes", {})} icon = Icons.voice_state_blue colour = Colour.blurple() changes = [] for attr, values in diff_values.items(): if not attr: # Not sure why, but it happens. continue old = values["old_value"] new = values["new_value"] attr = attr[5:] # Remove "root." prefix. attr = VOICE_STATE_ATTRIBUTES.get(attr, attr.replace("_", " ").capitalize()) changes.append(f"**{attr}:** `{old}` **→** `{new}`") # Set the embed icon and colour depending on which attribute changed. if any(name in attr for name in ("Channel", "deaf", "mute")): if new is None or new is True: # Left a channel or was muted/deafened. icon = Icons.voice_state_red colour = Colours.soft_red elif old is None or old is True: # Joined a channel or was unmuted/undeafened. icon = Icons.voice_state_green colour = Colours.soft_green if not changes: return message = "\n".join(f"{Emojis.bullet} {item}" for item in sorted(changes)) message = f"{format_user(member)}\n{message}" await self.send_log_message( icon_url=icon, colour=colour, title="Voice state updated", text=message, thumbnail=member.avatar_url_as(static_format="png"), channel_id=Channels.voice_log )