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.")
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("```", "'''")
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
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))
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
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
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)
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.")
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)
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")