async def help_embed(self, msg, commands) -> EmbedWrapper: prefix = await self.bot.database.get_prefix(msg) idx = list(self.bot.commands.keys()).index('help') embed_var = EmbedWrapper(discord.Embed( description='current prefix: [{}]'.format(prefix), color=colors[idx]), embed_type='HELP', marks=EmbedWrapper.INFO) footer = ("React with command's emoji for details or type " + '"{}command help" in the chat.'.format( prefix)) embed_var.set_footer(text=footer) i = 0 for k, v in commands.items(): if i == idx: i += 1 if k == 'help': continue embed_var.add_field( name='{}{}'.format(prefix, k), value='{} {}'.format(v.description, emojis[i]), inline=False) i += 1 txt = '' for i in embed_var.marks: txt += '{}{}-\u3000{}\n'.format( i, '\u3000' * (3 - len(i)), embed_var.mark_info(i)) txt += '(Marks shown in the top right corner of the embed)' embed_var.add_field(name='* Marks', value=txt, inline=False) return embed_var
async def starting_embed(self, title, msg): embed_var = EmbedWrapper(discord.Embed( color=random_color(), description='* {}\n* {}\n{}'.format( 'Reply with a role to add it to the message.', 'You can add multiple at once, separated with ";".', 'Example: "role1;role2;role3"')), embed_type='ROLES', marks=EmbedWrapper.NOT_DELETABLE) if title is not None: embed_var.title = title return embed_var
async def execute_command(self, msg): args = msg.content.split() if len(args) < 2: await msg.channel.send(text='Please add a name for the event!', delete_after=5) return events = await self.show_server_events(msg) if args[1] in ['stop', 'remove', 'end', 'cancel']: if len(args) < 3: await msg.channel.send( text='Which event do you want to delete?', delete_after=5) return e = msg.content.replace('{} {} '.format(args[0], args[1]), '', 1) if e not in events.keys(): await msg.channel.send(text='No such event.', delete_after=5) else: await self.remove_server_event(msg, e, events[e]) return if args[1] in ['show', 'events', 'see'] and len(args) == 2: if events is None: await msg.channel.send(text='No scheduled events.', delete_after=5) return embed_var = EmbedWrapper(discord.Embed(title='Scheduled events', color=random_color()), embed_type='EVENT', marks=EmbedWrapper.INFO) for k, v in events.items(): embed_var.add_field(name=k, value=v) await msg.channel.send(embed=embed_var, reactions=waste_basket) return name = msg.content.replace('{} '.format(args[0]), '', 1) if events is not None and name in events.keys(): await msg.channel.send( text='Event with this name already exists in this server.', delete_after=5) return embed_var = EmbedWrapper(discord.Embed( title=name, description='date:\ntime:\nchannel: {}\ntext:\ntags:'.format( msg.channel.id), color=random_color()), embed_type='EVENT', marks=EmbedWrapper.INFO) embed_var.set_footer( text=('* Add options by replying "<opt> <value>" ' + '\n* Multiple options can be added at one,' + ' separated with ";".\n' + '* Date should be given in day and month format.\n' + '* Time should be given in hours and minutes format.\n' '* Name can also be changed.\n' + '* Channel should be given with its name.\n' '* After adding desired options (date and time are ' + 'mandatory) reply "commit" to start the event.\n' + 'Example:\n"date 27. 7.; time 16:00; text Test text; "' + 'name new_name; tags test_tags; channel general; commit".')) await msg.channel.send(embed=embed_var)
async def on_dm_reaction(self, payload): # check if rps dm message, then get channel id from # which the rps game was started # then send new embed to that channel and wait for another # opponent to join if (payload.emoji.name not in rps_emojis or payload.event_type != 'REACTION_ADD'): return user = self.bot.client.get_user(int(payload.user_id)) if user is None: return reaction_msg = await user.fetch_message(payload.message_id) if reaction_msg is None or not reaction_msg.is_rps: return # edit chosen emoji to embed's title embed = reaction_msg.embeds[0] embed.title = payload.emoji.name embed.mark(embed.ENDED) await reaction_msg.edit(text=reaction_msg.content, embed=embed) # get channel id, message id from embed's footer info = embed.footer.text channel = None try: channel = self.bot.client.get_channel(int(info)) if channel is None: raise ValueError user = channel.guild.get_member(payload.user_id) if user is None: raise ValueError except ValueError: return # create game embed and send it to channel where game was started new_embed = EmbedWrapper(discord.Embed( title='{} is waiting for an opponent'.format( user.name if not user.nick else user.nick), color=random_color()), embed_type=self.embed_type, marks=EmbedWrapper.NOT_DELETABLE) # if user has nickname set up use nickname, else use username new_embed.description = 'React with {}, {} or {} to join!'.format( rps_emojis[0], rps_emojis[1], rps_emojis[2]) new_embed.set_footer( text='{}{}'.format(payload.message_id, user.id), icon_url=None if not user.avatar_url else user.avatar_url) # add users profile picture to the embed await channel.send(embed=new_embed, reactions=rps_emojis)
async def execute_command(self, msg, user=None): # show leaderboard if user is None: args = msg.content.split() if len(args) > 1 and (args[1] == 'leaderboard' or args[1] == 'lb'): await self.show_leaderboard(msg) return user = msg.author # send dm to the user who started the game and # wait for him to react with one of the options dm = await user.create_dm() dm_embed = EmbedWrapper(discord.Embed( description='React with your weapon of choice!', color=random_color()), embed_type=self.embed_type, marks=EmbedWrapper.NOT_DELETABLE) dm_embed.set_footer(text=msg.channel.id) await dm.send(embed=dm_embed, reactions=rps_emojis)
async def show_leaderboard(self, msg): # show guild members that played rps in order # best to worst if self.bot.database.connected is False: await msg.channel.send(text='No database connection.', delete_after=5) return cursor = self.bot.database.cnx.cursor(buffered=True) cursor.execute( "SELECT * FROM rock_paper_scissors WHERE guild_id = '{}'".format( msg.guild.id)) fetched = cursor.fetchall() if fetched is None or fetched is []: await msg.channel.send(text='No availible leaderboard.', delete_after=5) return embed_var = EmbedWrapper(discord.Embed(title='Leaderboard', color=random_color()), embed_type=self.embed_type, marks=EmbedWrapper.INFO) users = {} for i in fetched: user = msg.guild.get_member(int(i[1])) if user is None: continue users[user] = i[2] users = { k: v for k, v in sorted( users.items(), key=lambda item: item[1], reverse=True) } i = 1 for u, w in users.items(): if i > 10: break name = u.name if not u.nick else u.nick embed_var.add_field(name='{}. {}'.format(i, name), value=w, inline=False) i += 1 await msg.channel.send(embed=embed_var, reactions=waste_basket)
async def send_event(self, channel_id, event, text, tags): # send scheduled event at the right time # timed by threading.Timer() channel = self.bot.client.get_channel(int(channel_id)) if channel is None: return embed_var = EmbedWrapper(discord.Embed(title=event, color=random_color(), description=text), embed_type="EVENT", marks=EmbedWrapper.INFO) await channel.send(text=None if len(tags) < 1 else tags, embed=embed_var)
async def game_results(self, user1, user2, emoji1, emoji2, msg): # find the winner of the game # edit the existing game message accordingly user_names = [user1.name, user2.name] if user1.nick: user_names[0] = user1.nick if user2.nick: user_names[1] = user2.nick # if same reactions -> draw if emoji1 == emoji2: new_embed = EmbedWrapper( discord.Embed(title='{} draws against {}!'.format( user_names[0], user_names[1])), embed_type=self.embed_type, marks=EmbedWrapper.ENDED) await msg.edit(embed=new_embed) return info = {} # get winner if ((emoji1 == rps_emojis[0] and emoji2 == rps_emojis[2]) or (emoji1 == rps_emojis[1] and emoji2 == rps_emojis[0]) or (emoji1 == rps_emojis[2] and emoji2 == rps_emojis[1])): info['winner_name'] = user_names[0] info['winner_id'] = user1.id info['winner_emoji'] = emoji1 info['winner_avatar_url'] = user1.avatar_url info['loser_name'] = user_names[1] info['loser_emoji'] = emoji2 else: info['winner_name'] = user_names[1] info['winner_id'] = user2.id info['winner_emoji'] = emoji2 info['winner_avatar_url'] = user2.avatar_url info['loser_name'] = user_names[0] info['loser_emoji'] = emoji1 new_embed = await self.add_winner(msg.embeds[0], msg, info) new_embed.mark(new_embed.ENDED) await msg.edit(embed=new_embed)
def starting_embed(self, question): poll_embed = EmbedWrapper(discord.Embed( title='Q:\u2000' + question, color=random_color(), description='* {}\n* {}\n* {}\n* {}\n* {}\n{}'.format( 'Reply to this message to add a response.', 'Reply "remove <idx>" to remove response with index <idx>.', 'Reply "fix" to disable adding or removing responses.', 'Reply "end" to finish the poll.', 'Multiple options can be added at once, separated with ";".\n', 'Example: "response1; response2; remove 0; response3;fix"')), embed_type='POLL', marks=EmbedWrapper.NOT_DELETABLE) return poll_embed
async def create_embed(self, msg, user): # build the embed with user info embed_var = EmbedWrapper(discord.Embed( title=user.name if not user.nick else user.nick, color=random_color()), embed_type="USER", marks=EmbedWrapper.INFO) # if user has nickname set up add nickname # else only username # add if user is bot if user.bot: embed_var.title += ' [bot]' # add user's avatar picture to the embed if user.avatar_url: embed_var.set_thumbnail(url=user.avatar_url) embed_var.add_field( name='Joined server', value=str(user.joined_at).split()[0], inline=False ) rps_wins = await self.add_rps_wins(msg, user) if rps_wins is not None: embed_var.add_field( name=rps_wins[0], value=rps_wins[1], inline=False) roles = 'everyone' for i in user.roles: if str(i.name) != '@everyone': roles += ',\n' + str(i.name) embed_var.add_field( name='Roles', value=roles, inline=False ) return embed_var
async def commit_event(self, msg, args): embed_var = msg.embeds[0] info = embed_var.description.split('\n') if info[0] == 'date:' or info[1] == 'time:': await msg.channel.send(text='Date and time need to be set!', delete_after=5) return info = [(info[0].replace('date: ', '', 1) + ',' + info[1].replace('time: ', '', 1)), info[2].replace('channel: ', '', 1), embed_var.title.replace('Event: ', '', 1), info[3].replace('text: ', '', 1).replace('text:', '', 1), info[4].replace('tags: ', '', 1).replace('tags:', '', 1)] await self.schedule_event(info) self.event_to_database(info) embed_var.title = embed_var.title.replace('Event:', 'Event(commited):', 1) embed_var.set_footer(text='') embed_var = EmbedWrapper(embed_var, embed_type="EVENT", marks=EmbedWrapper.ENDED) await msg.edit(embed=embed_var, reactions=waste_basket)
async def create_config_embed(self, msg): embed_var = EmbedWrapper(discord.Embed( title=msg.guild.name, description="Server configurations", color=colors[list(self.bot.commands.keys()).index('config')]), embed_type='CONFIG', marks=['I']) if (msg.guild.icon_url): embed_var.set_thumbnail(url=msg.guild.icon_url) prefix = await self.bot.database.get_prefix(msg) embed_var.add_field( name='Prefix', value='[{}]'.format(prefix), inline=False) wlcm = await self.bot.database.get_welcome(msg) embed_var.add_field( name='Welcome_text', value='None' if wlcm is None else wlcm, inline=False) cmds = await self.bot.database.roles_for_all_commands(msg) embed_var.add_field( name='Roles that can use commands', value='None' if cmds is None else cmds, inline=False) embed_var.set_footer( text='React with {} to see server info.'.format( emojis[list(self.bot.commands.keys()).index('server')])) return embed_var
async def create_additional_help(self, info, msg, prefix) -> EmbedWrapper: """Return command's information in an embed.""" idx = list(self.commands.keys()).index(info[0]) embed_var = EmbedWrapper(discord.Embed(title='{}{}'.format( prefix, info[0]), description=info[1], color=colors[idx]), embed_type='HELP', marks=EmbedWrapper.INFO) embed_var.add_field(name='Additional info', value=info[2], inline=False) embed_var.add_field(name='Required permissions for bot', value='[{}]'.format(', '.join(info[3])), inline=False) roles = await self.database.get_required_roles(msg, info[0]) if roles is None: embed_var.add_field(name='Required permissions for user', value='[{}]'.format(', '.join(info[4])), inline=False) else: embed_var.add_field(name='Roles that can use the command', value='[{}]'.format(', '.join(roles)), inline=False) embed_var.add_field(name='Allowed channel types', value='[{}]'.format(', '.join(info[5])), inline=False) return embed_var
async def create_info_embed(self, msg): # build embed with server info embed_var = EmbedWrapper(discord.Embed( title=msg.guild.name, description="Server information", color=colors[list(self.bot.commands.keys()).index('server')]), embed_type="SERVER", marks=EmbedWrapper.INFO) # check if guild has description if (msg.guild.description): embed_var.description = msg.guild.description # add guild's icon to the embed # count total and online members embed_var.add_field(name='Total members', value=msg.guild.member_count, inline=False) embed_var.add_field(name='Online members', value=self.get_online_members(msg), inline=False) owner = await msg.guild.fetch_member(str(msg.guild.owner_id)) # add owner # add both his nickname and username (if has nickname set up) if owner.nick: owner = '{nick}\n({user})'.format(nick=owner.nick, user=owner) embed_var.add_field(name='Owner', value=owner, inline=False) # add rules channel info if it is set up if msg.guild.rules_channel: embed_var.add_field(name='Rules channel', value=msg.guild.rules_channel, inline=False) # check for afk channel if msg.guild.afk_channel: embed_var.add_field( name='AFK channel', value="{channel}\n~timeout: {timeout} min".format( channel=msg.guild.afk_channel, timeout=msg.guild.afk_timeout // 60), inline=False) if msg.guild.icon_url: embed_var.set_thumbnail(url=msg.guild.icon_url) embed_var.set_footer( text='React with {} to see server configurations.'.format(emojis[ list(self.bot.commands.keys()).index('config')])) return embed_var