Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
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')
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    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.')
Ejemplo n.º 11
0
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'))
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
    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()
Ejemplo n.º 18
0
 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!")
Ejemplo n.º 19
0
    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)
Ejemplo n.º 20
0
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)
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
0
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)
Ejemplo n.º 23
0
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'))
Ejemplo n.º 24
0
    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')
Ejemplo n.º 25
0
    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)
Ejemplo n.º 26
0
    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)
Ejemplo n.º 27
0
    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)
Ejemplo n.º 28
0
    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)
Ejemplo n.º 29
0
    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
Ejemplo n.º 30
0
    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
        )