async def list_of_birds(self, ctx, state: str = "blank"): logger.info("command: list") state = state.upper() if state not in states: logger.info("invalid state") await ctx.send( f"**Sorry, `{state}` is not a valid state.**\n*Valid States:* `{', '.join(map(str, list(states.keys())))}`" ) return state_birdlist = sorted( build_id_list(user_id=ctx.author.id, state=state, media="images")) state_songlist = sorted( build_id_list(user_id=ctx.author.id, state=state, media="songs")) birdLists = self.broken_join(state_birdlist) songLists = self.broken_join(state_songlist) if ctx.author.dm_channel is None: await ctx.author.create_dm() await ctx.author.dm_channel.send(f"**The {state} bird list:**") for birds in birdLists: await ctx.author.dm_channel.send(f"```\n{birds}```") await ctx.author.dm_channel.send(f"**The {state} bird songs:**") for birds in songLists: await ctx.author.dm_channel.send(f"```\n{birds}```") await ctx.send( f"The `{state}` bird list has **{len(state_birdlist)}** birds.\n" + f"The `{state}` bird list has **{len(state_songlist)}** songs.\n" + "*A full list of birds has been sent to you via DMs.*")
async def send_bird_( self, ctx, media_type: Optional[str], filters: Filter, taxon_str: str = "", role_str: str = "", retries=0, ): media_type = ("images" if media_type in ("images", "image", "i", "p") else ("songs" if media_type in ("songs", "song", "s", "a") else None)) if not media_type: raise GenericError("Invalid media type", code=990) if media_type == "songs" and filters.vc: current_voice = database.get(f"voice.server:{ctx.guild.id}") if current_voice is not None and current_voice.decode( "utf-8") != str(ctx.channel.id): logger.info("already vc race") await ctx.send("**The voice channel is currently in use!**") return if taxon_str: taxon = taxon_str.split(" ") else: taxon = [] if role_str: roles = role_str.split(" ") else: roles = [] logger.info( "bird: " + database.hget(f"channel:{ctx.channel.id}", "bird").decode("utf-8")) currently_in_race = bool( database.exists(f"race.data:{ctx.channel.id}")) answered = int(database.hget(f"channel:{ctx.channel.id}", "answered")) logger.info(f"answered: {answered}") # check to see if previous bird was answered if answered: # if yes, give a new bird session_increment(ctx, "total", 1) logger.info(f"filters: {filters}; taxon: {taxon}; roles: {roles}") if not currently_in_race and retries == 0: await ctx.send( "**Recognized arguments:** " + f"*Active Filters*: `{'`, `'.join(filters.display())}`, " + f"*Taxons*: `{'None' if taxon_str == '' else taxon_str}`, " + f"*Detected State*: `{'None' if role_str == '' else role_str}`" ) find_custom_role = { i if i.startswith("CUSTOM:") else "" for i in roles } find_custom_role.discard("") if (database.exists(f"race.data:{ctx.channel.id}") and len(find_custom_role) == 1): custom_role = find_custom_role.pop() roles.remove(custom_role) roles.append("CUSTOM") user_id = custom_role.split(":")[1] birds = build_id_list(user_id=user_id, taxon=taxon, state=roles, media=media_type) else: birds = build_id_list(user_id=ctx.author.id, taxon=taxon, state=roles, media=media_type) if not birds: logger.info("no birds for taxon/state") await ctx.send( "**Sorry, no birds could be found for the taxon/state combo.**\n*Please try again*" ) return currentBird = random.choice(birds) self.increment_bird_frequency(ctx, currentBird) prevB = database.hget(f"channel:{ctx.channel.id}", "prevB").decode("utf-8") while currentBird == prevB and len(birds) > 1: currentBird = random.choice(birds) database.hset(f"channel:{ctx.channel.id}", "prevB", str(currentBird)) database.hset(f"channel:{ctx.channel.id}", "bird", str(currentBird)) logger.info("currentBird: " + str(currentBird)) database.hset(f"channel:{ctx.channel.id}", "answered", "0") await send_bird( ctx, currentBird, media_type, filters, on_error=self.error_handle(ctx, media_type, filters, taxon_str, role_str, retries), message=( SONG_MESSAGE if media_type == "songs" else BIRD_MESSAGE) if not currently_in_race else "*Here you go!*", ) else: # if no, give the same bird await ctx.send( f"**Active Filters**: `{'`, `'.join(filters.display())}`") await send_bird( ctx, database.hget(f"channel:{ctx.channel.id}", "bird").decode("utf-8"), media_type, filters, on_error=self.error_handle(ctx, media_type, filters, taxon_str, role_str, retries), message=( SONG_MESSAGE if media_type == "songs" else BIRD_MESSAGE) if not currently_in_race else "*Here you go!*", )
async def bird_taxons(self, ctx, taxon: str = "blank", state: str = "NATS"): logger.info("command: taxons") taxon = taxon.lower() state = state.upper() if taxon not in taxons: logger.info("invalid taxon") await ctx.send( f"**Sorry, `{taxon}` is not a valid taxon.**\n*Valid taxons:* `{', '.join(map(str, list(taxons.keys())))}`" ) return if state not in states: logger.info("invalid state") await ctx.send( f"**Sorry, `{state}` is not a valid state.**\n*Valid States:* `{', '.join(map(str, list(states.keys())))}`" ) return bird_list = sorted( build_id_list(user_id=ctx.author.id, taxon=taxon, state=state, media="images")) song_bird_list = sorted( build_id_list(user_id=ctx.author.id, taxon=taxon, state=state, media="songs")) if not bird_list and not song_bird_list: logger.info("no birds for taxon/state") await ctx.send( "**Sorry, no birds could be found for the taxon/state combo.**\n*Please try again*" ) return birdLists = self.broken_join(bird_list) songLists = self.broken_join(song_bird_list) if ctx.author.dm_channel is None: await ctx.author.create_dm() await ctx.author.dm_channel.send( f"**The `{taxon}` in the `{state}` bird list:**") for birds in birdLists: await ctx.author.dm_channel.send(f"```\n{birds}```") await ctx.author.dm_channel.send( f"**The `{taxon}` in the `{state}` bird songs:**") for birds in songLists: await ctx.author.dm_channel.send(f"```\n{birds}```") await ctx.send( f"The `{taxon}` in the `{state}` bird list has **{len(bird_list)}** birds.\n" + f"The `{taxon}` in the `{state}` bird list has **{len(song_bird_list)}** songs.\n" + "*A full list of birds has been sent to you via DMs.*")