Ejemplo n.º 1
0
 async def names(self, user: discord.Member):
     """Show previous names/nicknames of a user"""
     server = user.server
     names = self.past_names[
         user.id] if user.id in self.past_names else None
     try:
         nicks = self.past_nicknames[server.id][user.id]
         nicks = [escape_mass_mentions(nick) for nick in nicks]
     except:
         nicks = None
     msg = ""
     if names:
         names = [escape_mass_mentions(name) for name in names]
         msg += "**Past 20 names**:\n"
         msg += ", ".join(names)
     if nicks:
         if msg:
             msg += "\n\n"
         msg += "**Past 20 nicknames**:\n"
         msg += ", ".join(nicks)
     if msg:
         await self.bot.say(msg)
     else:
         await self.bot.say("That user doesn't have any recorded name or "
                            "nickname change.")
Ejemplo n.º 2
0
 def sanitize(s: str, type: str) -> str:
     """Sanitize discord message"""
     if type == "plain":
         return escape_mass_mentions(s)
     elif type == "inline":
         return s.replace("`", "'")
     elif type == "box":
         return s.replace("```", "'''")
Ejemplo n.º 3
0
    async def get_reactions(self, message, exclude_self=True):
        title = message.channel.name
        description = message.content

        out = [
            bold('Channel: {}'.format(title)),
            escape_mass_mentions(description)
        ]

        server = message.server

        total_count = 0

        reaction_votes = []

        for reaction in message.reactions:
            if reaction.custom_emoji:
                # <:emoji_name:emoji_id>
                emoji = '<:{}:{}>'.format(
                    reaction.emoji.name,
                    reaction.emoji.id)
            else:
                emoji = reaction.emoji

            reaction_users = await self.bot.get_reaction_users(reaction)
            valid_users = []
            for u in reaction_users:
                if exclude_self and u == self.bot.user:
                    continue
                valid_users.append(u)

            valid_users = sorted(valid_users, key=lambda u: u.display_name.lower())
            user_ids = [u.id for u in valid_users]
            members = []
            for uid in user_ids:
                member = server.get_member(uid)
                if member:
                    members.append(member)
                    total_count += 1
            users_str = ', '.join([m.display_name for m in members])
            count = len(valid_users)
            reaction_votes.append({
                "emoji": emoji,
                "count": count,
                "users_str": users_str
            })

        for v in reaction_votes:
            emoji = v['emoji']
            count = v['count']
            ratio = count / total_count
            users_str = v['users_str']
            value = '{}: **{}** ({:.2%}): {}'.format(emoji, count, ratio, users_str)
            out.append(value)


        return out
Ejemplo n.º 4
0
    async def choose(self, *choices):
        """Chooses between choices.

        To denote multiple choices, you should use double quotes.
        """
        choices = [escape_mass_mentions(c) for c in choices]
        if len(choices) < 2:
            await self.bot.say('Not enough choices to pick from.')
        else:
            await self.bot.say(choice(choices))
Ejemplo n.º 5
0
 def elaborate_payload(self, payload, truncate=50, escape=True):
     shortened = []
     for p in payload:
         if escape:
             p = (p.replace("`", "\\`").replace("*", "\\*").replace(
                 "_", "\\_").replace("~", "\\~"))
             p = escape_mass_mentions(p)
         if len(p) < truncate:
             shortened.append(p)
         else:
             shortened.append(p[:truncate] + "...")
     return shortened
Ejemplo n.º 6
0
 def elaborate_payload(self, payload, truncate=50, escape=True):
     shortened = []
     for p in payload:
         if escape:
             p = (p.replace("`", "\\`")
                   .replace("*", "\\*")
                   .replace("_", "\\_")
                   .replace("~", "\\~"))
             p = escape_mass_mentions(p)
         if len(p) < truncate:
             shortened.append(p)
         else:
             shortened.append(p[:truncate] + "...")
     return shortened
Ejemplo n.º 7
0
    async def names(self, ctx, user: discord.Member):
        """Montre les anciens noms/surnoms d'un user"""
        server = user.server
        author = ctx.message.author
        names = self.past_names[
            user.id] if user.id in self.past_names else None
        try:
            nicks = self.past_nicknames[server.id][user.id]
            nicks = [escape_mass_mentions(nick) for nick in nicks]
        except:
            nicks = None
        msg = ""
        if names:
            names = [escape_mass_mentions(name) for name in names]
            msg += "**Les 20 derniers noms**:\n"
            msg += ", ".join(names)
        if nicks:
            if msg:
                msg += "\n\n"
            msg += "**Les 20 derniers surnoms**:\n"
            msg += ", ".join(nicks)
        log_msg = "{}({}) a demandé des infos sur les noms et surnoms de {}({})".format(
            author.name,
            author.id,
            user.name,
            user.id,
        )
        if msg:

            await self.bot.say(
                msg, delete_after=self.settings[server.id]["delete_delay"])
        else:
            await self.bot.say(
                "Ce user n'a aucun nom passé enregistré ou "
                "surnom changé.",
                delete_after=self.settings[server.id]["delete_delay"])
        logger.info(log_msg)
Ejemplo n.º 8
0
 async def names(self, user : discord.Member):
     """Show previous names/nicknames of a user"""
     server = user.server
     names = self.past_names[user.id] if user.id in self.past_names else None
     try:
         nicks = self.past_nicknames[server.id][user.id]
         nicks = [escape_mass_mentions(nick) for nick in nicks]
     except:
         nicks = None
     msg = ""
     if names:
         names = [escape_mass_mentions(name) for name in names]
         msg += "**Past 20 names**:\n"
         msg += ", ".join(names)
     if nicks:
         if msg:
             msg += "\n\n"
         msg += "**Past 20 nicknames**:\n"
         msg += ", ".join(nicks)
     if msg:
         await self.bot.say(msg)
     else:
         await self.bot.say("That user doesn't have any recorded name or "
                            "nickname change.")
Ejemplo n.º 9
0
    async def rm_get(self,
                     ctx,
                     channel: discord.Channel,
                     message_id,
                     exclude_self=True):
        """Display list of reactions added by users."""
        message = await self.bot.get_message(channel, message_id)

        if message is None:
            await self.bot.say("Cannot find that message id.")
            return

        title = message.channel.name
        description = message.content

        out = [
            bold('Channel: {}'.format(title)),
            escape_mass_mentions(description)
        ]

        for reaction in message.reactions:
            if reaction.custom_emoji:
                # <:emoji_name:emoji_id>
                emoji = '<:{}:{}>'.format(reaction.emoji.name,
                                          reaction.emoji.id)
            else:
                emoji = reaction.emoji

            reaction_users = await self.bot.get_reaction_users(reaction)
            valid_users = []
            for u in reaction_users:
                if exclude_self and u == self.bot.user:
                    continue
                valid_users.append(u)
                valid_users = sorted(valid_users,
                                     key=lambda u: u.display_name.lower())
            users_str = ', '.join([u.display_name for u in valid_users])
            count = len(valid_users)
            value = '{}: {}: {}'.format(emoji, count, users_str)

            out.append(value)

        for page in pagify('\n'.join(out), shorten_by=24):
            await self.bot.say(page)
Ejemplo n.º 10
0
    async def uinfo(self, ctx, *, user: discord.Member = None):
        """Shows users's informations"""
        author = ctx.message.author
        server = ctx.message.server
        channel = ctx.message.channel

        if not user:
            user = author

        has_permissions = channel.permissions_for(author).manage_messages
        if not has_permissions:
            return

        roles = [x.name for x in user.roles if x.name != "@everyone"]

        joined_at = user.joined_at
        since_created = (ctx.message.timestamp - user.created_at).days
        since_joined = (ctx.message.timestamp - joined_at).days
        user_joined = joined_at.strftime("%d %b %Y %H:%M")
        user_created = user.created_at.strftime("%d %b %Y %H:%M")
        voicechan = user.voice.voice_channel
        member_number = sorted(server.members,
                               key=lambda m: m.joined_at).index(user) + 1

        created_on = "{}\n({} days ago)".format(user_created, since_created)
        joined_on = "{}\n({} days ago)".format(user_joined, since_joined)

        game = "Chilling in {} status".format(user.status)

        names = self.past_names[
            user.id] if user.id in self.past_names else None
        try:
            nicks = self.past_nicknames[server.id][user.id]
            nicks = [escape_mass_mentions(nick) for nick in nicks]
        except:
            nicks = None
        nameslist = ""
        if names:
            names = [escape_mass_mentions(name) for name in names]
            nameslist += "**Past 20 names**:\n"
            nameslist += ", ".join(names)
        if nicks:
            if nameslist:
                nameslist += "\n\n"
            nameslist += "**Past 20 nicknames**:\n"
            nameslist += ", ".join(nicks)
        if nameslist:
            prevnames = nameslist
        else:
            prevnames = "That user doesn't have any recorded name or nickname change."

        if voicechan is None:
            curvoice = "None"
        else:
            curvoice = voicechan

        if user.game is None:
            pass
        elif user.game.url is None:
            game = "Playing {}".format(user.game)
        else:
            game = "Streaming: [{}]({})".format(user.game, user.game.url)

        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"

        data = discord.Embed(description=game, colour=user.colour)
        data.add_field(name="Joined Discord on", value=created_on)
        data.add_field(name="Joined this server on", value=joined_on)
        data.add_field(name="Roles", value=roles, inline=False)
        data.add_field(name="Past names", value=prevnames, inline=False)
        data.add_field(name="Current voice channel",
                       value=str(voicechan),
                       inline=False)
        data.set_footer(text="Member #{} | User ID:{}"
                        "".format(member_number, user.id))

        name = str(user)
        name = " ~ ".join((name, user.nick)) if user.nick else name

        if user.avatar_url:
            data.set_author(name=name,
                            url=user.avatar_url.replace(".webp", ".png"))
            data.set_thumbnail(url=user.avatar_url)
        else:
            data.set_author(name=name)

        try:
            await self.bot.say(embed=data)
        except discord.HTTPException:
            await self.bot.say("I need the `Embed links` permission "
                               "to send this")