async def place(self, ctx: commands.Context, role, *names): event = EventModel.load(ctx.channel.id) if event is None: await ctx.author.send(errors.NONEXISTENT_EVENT) return False if date.is_date_time_expired(event.date, event.time): await ctx.author.send(errors.EXPIRED_EVENT) return False role = role.title() if role and role not in settings.ROLES.ALL: await ctx.author.send(errors.NONEXISTENT_ROLE) return for name in names: members = ctx.channel.guild.fetch_members() member = await members.find( lambda m: utils.fuzzy_string_match(m.display_name, name)) if member is None: await ctx.author.send(errors.NONEXISTENT_MEMBER) return await self.add_member(ctx.channel, event, member, role) utils.log(ctx.author.display_name, "placed player", name, "...") embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(channel=ctx.channel, client=self.bot, embed=embed)
async def create_event(self, ctx: commands.Context, name, date, time, description=""): date = try_parse_day(date) if not is_valid_date_time(date, time): await ctx.author.send(errors.INVALID_DATE.format(date, time)) return if is_date_time_expired(date, time): await ctx.author.send(errors.EXPIRED_DATE.format(date, time)) return event = EventModel(self.bot.user.id, name, date, time, description, ctx.channel.id, 0) event.save() embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(channel=ctx.channel, client=self.bot, embed=embed, new_event=True) await utils.send_announcement( ctx, settings.MESSAGE.NEW_EVENT.format(event.name, event.date, event.time, ctx.channel.mention)) utils.log(ctx.author.display_name, "created event", event.name, "...")
async def edit(self, ctx: commands.Context, *raw_aspects): event = EventModel.load(ctx.channel.id) if event is None: await ctx.author.send(errors.NONEXISTENT_EVENT) return parsed_aspect_dict, invalids = EventAspectParser.parse(raw_aspects) for name, value in parsed_aspect_dict.items(): event.set_attribute(name, value) if len(invalids) > 0: await ctx.author.send(errors.INVALID_ASPECTS + '\n' + '\n'.join(invalids)) if is_date_time_expired(event.date, event.time): await ctx.author.send( errors.EXPIRED_DATE.format(event.date, event.time)) return event.save(append=True) embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(channel=ctx.channel, client=self.bot, embed=embed, new_event=False) utils.log(ctx.author.display_name, "edited event", event.name, "...")
async def spawn(self, ctx): for name in player_names: player_id = player_ids[name] identifier = player_identifiers[name] role = player_roles[name] participant = ParticipantModel(player_id, name, identifier, role, ctx.channel.id) db.insert_participant(participant) embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(ctx.channel, self.bot, embed)
async def handle_event_response(self, user, channel, role): event = EventModel.load(channel.id) if event is None: await user.send(errors.NONEXISTENT_EVENT) return False if date.is_date_time_expired(event.date, event.time): await user.send(errors.EXPIRED_EVENT) return False identifier = utils.extract_identifier(user) if identifier is None: await user.send(errors.NO_VALID_ROLE) print("participant tried to sign up without a role.") return name = user.display_name.title() name = utils.prune_participant_name(name) if not name: # Empty string await user.send(errors.INVALID_NAME) print("participant tried to sign up with a shitty name.") return current_role = "" participant = ParticipantModel.load(channel.id, name) if event.is_locked(): role = settings.ROLES.BACKUP else: if participant is not None: current_role = participant.role if current_role == settings.ROLES.BACKUP: await user.send(errors.BACKUP_SIGN) print("participant tried to sign up but was already backup.") return if current_role == role: return participant = ParticipantModel(user.id, name, identifier, role, channel.id) participant.save() embed = view.create(channel.id, user.guild.emojis, self.bot.user.id) await utils.show_event(channel=channel, client=self.bot, embed=embed) utils.log(user.name, "responded to event...")
async def unlock(self, ctx: commands.Context): event = EventModel.load(ctx.channel.id) if event is None: await ctx.author.send(errors.NONEXISTENT_EVENT) return if event.is_locked(): event.unlock() event.save(append=True) embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(channel=ctx.channel, client=self.bot, embed=embed, new_event=False)
async def refresh(self, ctx: commands.Context): # "re-adds" all members who have reacted to current event event_message = await utils.get_event_message(channel=ctx.channel, client=self.bot) if event_message is None: return reactions = event_message.reactions event = EventModel.load(ctx.channel.id) if event is None: return if is_date_time_expired(event.date, event.time): return checked_members = [] for reaction in reactions: users = await reaction.users().flatten() for user in users: member = ctx.channel.guild.get_member(user.id) if member is None: utils.log( "Player not found when attempting to add from reactions on +refresh" ) return role = settings.ROLES.DECLINED if str( reaction) == settings.DECLINE_REACTION else "" if not user.bot and member not in checked_members: checked_members.append(member) await self.add_member(ctx.channel, event, member, role) embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id) await utils.show_event(channel=ctx.channel, client=self.bot, embed=embed, new_event=False)