async def remove_event(self, ctx, *, event_name: str = None): """Removes a currently running event. **Parameters** :key: The event name to remove. **Format** :information_source: `+remove event EVENT_NAME` **Example** :white_check_mark: `+remove event my special event` **Required Permissions** :warning: Manage Server """ if event_name: # Event name provided query = """DELETE FROM events WHERE guild_id = $1 AND event_name = $2 RETURNING id; """ fetch = await self.bot.pool.fetchrow(query, ctx.guild.id, event_name) if fetch: return await ctx.send(f"{event_name} has been removed.") # No event name provided or I didn't understand the name I was given query = """SELECT id, event_name, start FROM events WHERE guild_id = $1 ORDER BY start""" fetch = await self.bot.pool.fetch(query, ctx.guild.id) if len(fetch) == 0 or not fetch: return await ctx.send( "I have no events to remove. You should create one... then remove it." ) elif len(fetch) == 1: query = "DELETE FROM events WHERE id = $1" await ctx.db.execute(query, fetch[0]['id']) return await ctx.send(f"{fetch[0]['event_name']} has been removed." ) table = CLYTable() fmt = f"Events on {ctx.guild}:\n\n" reactions = [] counter = 0 for event in fetch: days_until = event['start'].date() - datetime.datetime.utcnow( ).date() table.add_row([counter, days_until.days, event['event_name']]) counter += 1 reactions.append(f"{counter}\N{combining enclosing keycap}") render = table.events_list() fmt += f'{render}\n\nPlease select the reaction that corresponds with the event you would ' \ f'like to remove.' e = discord.Embed(colour=self.bot.colour, description=fmt) msg = await ctx.send(embed=e) for r in reactions: await msg.add_reaction(r) def check(r, u): return str( r ) in reactions and u.id == ctx.author.id and r.message.id == msg.id try: r, u = await self.bot.wait_for('reaction_add', check=check, timeout=60.0) except asyncio.TimeoutError: await msg.clear_reactions() return await ctx.send( "We'll just hang on to all the events we have for now.") index = reactions.index(str(r)) query = "DELETE FROM events WHERE id = $1" await ctx.db.execute(query, fetch[index]['id']) await msg.delete() ctx.bot.utils.event_config.invalidate(ctx.bot.utils, ctx.guild.id) self.bot.dispatch('event_register') return await ctx.send(f"{fetch[index]['event_name']} has been removed." )
async def edit_event(self, ctx, *, event_name: str = None): """Edit a variety of settings for the current event. **Parameters** :key: Event name **Format** :information_source: `+edit event EVENT_NAME` **Example** :white_check_mark: `+edit event Donation Bot Event` **Required Permissions** :warning: Manage Server """ if event_name: query = """SELECT id FROM events WHERE guild_id = $1 AND event_name = $2""" fetch = await self.bot.pool.fetchrow(query, ctx.guild.id, event_name) if fetch: event_id = fetch['id'] else: # ideally this would just display a list of events and let the user pick, but I # couldn't figure out the proper sequence of if event_name/if event_id return await ctx.send("There is no event on this server with that name. Try `+edit event` " "to pick from a list of events on this server.") else: # No event name provided or I didn't understand the name I was given query = """SELECT id, event_name, start FROM events WHERE guild_id = $1 ORDER BY start""" fetch = await self.bot.pool.fetch(query, ctx.guild.id) if len(fetch) == 0 or not fetch: return await ctx.send("There are no events currently set up on this server. " "Try `+add event`") elif len(fetch) == 1: event_id = fetch[0]['id'] else: table = CLYTable() fmt = f"Events on {ctx.guild}:\n\n" reactions = [] counter = 0 for event in fetch: days_until = event['start'].date() - datetime.datetime.utcnow().date() table.add_row([counter, days_until.days, event['event_name']]) counter += 1 reactions.append(f"{counter}\N{combining enclosing keycap}") render = table.events_list() fmt += f'{render}\n\nPlease select the reaction that corresponds with the event you would ' \ f'like to remove.' e = discord.Embed(colour=self.bot.colour, description=fmt) msg = await ctx.send(embed=e) for r in reactions: await msg.add_reaction(r) def check(r, u): return str(r) in reactions and u.id == ctx.author.id and r.message.id == msg.id try: r, u = await self.bot.wait_for('reaction_add', check=check, timeout=60.0) except asyncio.TimeoutError: await msg.clear_reactions() return await ctx.send("I feel like I'm being ignored. MAybe try again later?") index = reactions.index(str(r)) event_id = fetch[index]['id'] # Now that we have the event_id, let's edit things query = """SELECT event_name, start, finish FROM events WHERE id = $1""" event = await self.bot.pool.fetchrow(query, event_id) def check_author(m): return m.author == ctx.author answer = await ctx.prompt(f"Event Name: **{event['event_name']}**\n" f"Would you like to edit the event name?") if answer: try: await ctx.send('Please enter the new name for this event.') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) new_event_name = response.content except asyncio.TimeoutError: new_event_name = event['event_name'] else: new_event_name = event['event_name'] answer = await ctx.prompt(f"Start Date: **{event['start'].date()}\n" f"Would you like to edit the date?") if answer: try: await ctx.send('Please enter the new start date. (YYYY-MM-DD)') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) new_start_date = await DateConverter().convert(ctx, response.clean_content) except (ValueError, commands.BadArgument): await ctx.send('Date must be in the YYYY-MM-DD format. I\'m going to keep ' 'the current start date and you can change it later if you like.') new_start_date = event['start'].date() except asyncio.TimeoutError: await ctx.send('Seems as though you don\'t really know the answer. I\'m just going ' 'to keep the date I have for now.') new_start_date = event['start'].date() else: new_start_date = event['start'].date() answer = await ctx.prompt(f"Start Time: **{event['start'].time()}\n" f"Would you like to edit the time?") if answer: try: await ctx.send('Please enter the new start time. (Please provide HH:MM in UTC)') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) hour, minute = map(int, response.content.split(':')) if hour < 13: try: await ctx.send('And is that AM or PM?') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) if response.content.lower() == 'pm': hour += 12 except asyncio.TimeoutError: if hour < 6: await ctx.send('Well I\'ll just go with PM then.') hour += 12 else: await ctx.send('I\'m going to assume you want AM.') new_start_time = datetime.time(hour, minute) except asyncio.TimeoutError: await ctx.send('Time\'s up my friend. Start time will remain the same!') new_start_time = event['start'].time() else: new_start_time = event['start'].time() answer = await ctx.prompt(f"End Date: **{event['finish'].date()}\n" f"Would you like to edit the date?") if answer: try: await ctx.send('Please enter the new end date. (YYYY-MM-DD)') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) new_end_date = await DateConverter().convert(ctx, response.clean_content) except (ValueError, commands.BadArgument): await ctx.send('Date must be in the YYYY-MM-DD format. I\'m going to keep ' 'the current end date and you can change it later if you like.') new_end_date = event['finish'].date() except asyncio.TimeoutError: await ctx.send('Seems as though you don\'t really know the answer. I\'m just going ' 'to keep the date I have for now.') new_end_date = event['finish'].date() else: new_end_date = event['finish'].date() answer = await ctx.prompt(f"End Time: **{event['finish'].time()}\n" f"Would you like to edit the time?") if answer: try: await ctx.send('Please enter the new end time. (Please provide HH:MM in UTC)') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) hour, minute = map(int, response.content.split(':')) if hour < 13: try: await ctx.send('And is that AM or PM?') response = await ctx.bot.wait_for('message', check=check_author, timeout=60.0) if response.content.lower() == 'pm': hour += 12 except asyncio.TimeoutError: if hour < 6: await ctx.send('Well I\'ll just go with PM then.') hour += 12 else: await ctx.send('I\'m going to assume you want AM.') new_end_time = datetime.time(hour, minute) except asyncio.TimeoutError: await ctx.send('Time\'s up my friend. Start time will remain the same!') new_end_time = event['finish'].time() else: new_end_time = event['finish'].time() # Assemble answers and update db new_start = datetime.datetime.combine(new_start_date, new_start_time) new_finish = datetime.datetime.combine(new_end_date, new_end_time) query = """UPDATE events SET event_name = $1, start = $2, finish = $3 WHERE id = $4""" await ctx.db.execute(query, new_event_name, new_start, new_finish, event_id) fmt = (f'**Event Info:**\n\n{new_event_name}\n{new_start.strftime("%d %b %Y %H:%M")}\n' f'{new_finish.strftime("%d %b %Y %H:%M")}') e = discord.Embed(colour=discord.Colour.green(), description=fmt) await ctx.send(embed=e) self.bot.dispatch('event_register')