Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
 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)
Пример #8
0
 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)
Пример #9
0
 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
Пример #10
0
 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
Пример #11
0
 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)
Пример #12
0
 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
Пример #13
0
 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
Пример #14
0
 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