show the right anilist staff and keep it within the field limit

Staff sorted by ROLE come in alphabetical order of role, so /anilist manga
listed 25 assistants and editors for One Piece, which went over the
1024 characters an embed field can hold, and /anilist anime found no
director for long series. Sort by relevance instead, keep only creators
for manga and directors for anime, one per line, and stop before the
field limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
leanderandClaude Opus 5.5 committed 2026-11-01 20:46:11 +01:00
1 parent 562c30f45e
commit b67381976c
1 file changed
+39 -25
+39 -25
View File
@@ -8,6 +8,9 @@ from discord.ext import commands
from cogs.utils import embed_templates from cogs.utils import embed_templates
from cogs.utils import misc_utils from cogs.utils import misc_utils
# Anilist roles of the people who made a manga, as opposed to assistants, editors and translators
MANGA_CREATOR_ROLES = ("Story & Art", "Story", "Art", "Original Story", "Original Creator")
class Anime(commands.Cog): class Anime(commands.Cog):
"""View information about different media on Anilist""" """View information about different media on Anilist"""
@@ -148,6 +151,36 @@ class Anime(commands.Cog):
} }
return statuses.get(status, status) return statuses.get(status, status)
def construct_staff_string(self, staff: list[dict], roles: tuple[str, ...]) -> str:
"""
Lists the staff members with one of the given roles, one per line.
Details in parentheses are ignored, so "Director (eps 1-278)" counts as "Director".
Stops before going over the 1024 characters an embed field can hold
Parameters
----------
staff (list[dict]): The staff edges returned from the Anilist API
roles (tuple[str, ...]): The roles to include
Returns
----------
(str): The constructed string. Empty if nobody has one of the roles
"""
lines = []
for staff_member in staff:
if staff_member["role"].split(" (")[0] not in roles:
continue
name = staff_member["node"]["name"]
full_name = f"{name['full']} ({name['native']})" if name["native"] else name["full"]
line = f"[{full_name}]({staff_member['node']['siteUrl']})"
if len("\n".join([*lines, line])) > 1024:
break
lines.append(line)
return "\n".join(lines)
def get_status_stat(self, statuses: list[dict], status: str, stat: str = "count") -> int: def get_status_stat(self, statuses: list[dict], status: str, stat: str = "count") -> int:
""" """
Gets a statistic for one list status from a user's Anilist statistics Gets a statistic for one list status from a user's Anilist statistics
@@ -719,14 +752,13 @@ class Anime(commands.Cog):
siteUrl siteUrl
} }
} }
staff (sort: ROLE) { staff (sort: RELEVANCE) {
edges { edges {
role role
node { node {
siteUrl siteUrl
name { name {
first full
last
native native
} }
} }
@@ -764,17 +796,7 @@ class Anime(commands.Cog):
genres = ", ".join(data["genres"]) genres = ", ".join(data["genres"])
studios_string = self.construct_favorite_entity_string(data["studios"]["nodes"], studio=True) studios_string = self.construct_favorite_entity_string(data["studios"]["nodes"], studio=True)
staff = data["staff"]["edges"] director_string = self.construct_staff_string(data["staff"]["edges"], ("Director",))
director_string = ""
for staff_member in staff:
if staff_member["role"] == "Director":
director_first_name = staff_member["node"]["name"]["first"]
director_last_name = staff_member["node"]["name"]["last"]
director_native_name = staff_member["node"]["name"]["native"]
director_url = staff_member["node"]["siteUrl"]
director_string += (
f"[{director_first_name} {director_last_name} " + f"({director_native_name})]({director_url})"
)
episodes = data["episodes"] episodes = data["episodes"]
duration = data["duration"] duration = data["duration"]
@@ -874,14 +896,13 @@ class Anime(commands.Cog):
english english
native native
} }
staff(sort: ROLE) { staff(sort: RELEVANCE) {
edges { edges {
role role
node { node {
siteUrl siteUrl
name { name {
first full
last
native native
} }
} }
@@ -918,14 +939,7 @@ class Anime(commands.Cog):
description = self.remove_html(data["description"]) if data.get("description") else "" description = self.remove_html(data["description"]) if data.get("description") else ""
genres = ", ".join(data["genres"]) genres = ", ".join(data["genres"])
staff = data["staff"]["edges"] staff_string = self.construct_staff_string(data["staff"]["edges"], MANGA_CREATOR_ROLES)
staff_string = ""
for staff_member in staff:
staff_first_name = staff_member["node"]["name"]["first"]
staff_last_name = staff_member["node"]["name"]["last"]
staff_native_name = staff_member["node"]["name"]["native"]
staff_url = staff_member["node"]["siteUrl"]
staff_string += f"[{staff_first_name} {staff_last_name} ({staff_native_name})]({staff_url})\n"
chapters = data["chapters"] chapters = data["chapters"]
volumes = data["volumes"] volumes = data["volumes"]