Habt ihr irgendwelche Verbesserungsvorschläge, oder ist es gut so?
@bot.command()
@lightbulb.command('dogimg',"Sends a random dom picture")
@lightbulb.implements(lightbulb.SlashCommand)
async def dogimg(ctx: lightbulb.Context) -> None:
async with aiohttp.ClientSession() as session:
async with session.get("https://dog.ceo/api/breeds/image/random") as r:
resp = await r.json()
embed = hikari.Embed(title="Generated Image!", color=0x2ecc71)
embed.set_image(resp['message'])
embed.set_footer(resp['status'])
await ctx.respond(embed=embed)
2 Antworten
Der Code funktioniert. Aber es gibt einige Dinge, die verbessert werden könnten. Zunächst einmal könnte man das Format des Codes verbessern, indem man den Code in mehrere Zeilen unterteilt, um ihn lesbarer zu machen. Dazu könnte man zum Beispiel die verschiedenen Teile des Codes in separate Funktionen aufteilen, um die Lesbarkeit zu verbessern.
Ein weiterer Verbesserungsvorschlag wäre, die Fehlerbehandlung zu verbessern. Im aktuellen Code wird zwar ein Fehler ausgegeben, wenn der API-Aufruf fehlschlägt, aber es wird keine Fehlerbehandlung für den Fall implementiert, dass die API kein Bild liefert. Es wäre also sinnvoll, die Möglichkeit einzubauen, dass der Code in diesem Fall eine alternative Quelle für Bilder nutzen kann.
Schließlich wäre es gut, wenn der Code flexibler wäre und sich leichter anpassen ließe. Zum Beispiel könnte man den Code so schreiben, dass er nicht nur Bilder von Hunden, sondern auch von anderen Tieren liefern kann, indem man die URL der API in einer Variablen speichert, die leicht zu ändern ist. Auf diese Weise könnte man den Code leicht anpassen, um Bilder von anderen Tieren zu liefern, ohne den Code selbst ändern zu müssen.
import aiohttp
from hikari import Embed
# Define a function to make the API call
async def get_random_image(session: aiohttp.ClientSession, animal: str) -> str:
# Make the API call and get the response
async with session.get(f"https://animals.ceo/api/breeds/image/random?type={animal}") as r:
resp = await r.json()
# Check if the response contains an image URL
if 'message' in resp:
# Return the image URL
return resp['message']
else:
# If the response does not contain an image URL, return an empty string
return ""
# Define the dogimg command
@lightbulb.command('dogimg')
@lightbulb.implements(lightbulb.SlashCommand)
async def dogimg(ctx: lightbulb.Context) -> None:
# Create an aiohttp client session
async with aiohttp.ClientSession() as session:
# Get a random image of a dog
image_url = await get_random_image(session, "dog")
# Check if the response contains an image URL
if image_url:
# Create an embed with the image
embed = Embed(title="Generated Image!", color=0x2ecc71)
embed.set_image(image_url)
else:
# If the response does not contain an image URL, create an error message
embed = Embed(title="Error", color=0xff0000)
embed.add_field(name="Reason", value="Failed to get image from API")
# Send the embed in the response
await ctx.respond(embed=embed)
In dem gegebenen Code sieht es so aus, als ob der Befehl "dogimg" ein zufälliges Bild eines Hundes über die API von https://dog.ceo/api/breeds/image/random anzeigt. Hier sind einige mögliche Verbesserungen für den Code:
- In der Funktionsdeklaration sollte der Rückgabetyp von "None" auf "hikari.Message" geändert werden, um anzugeben, dass die Funktion eine Nachricht zurückgibt.
- In dem Satz "embed.set_image(resp['message'])" sollte "resp['message']" durch "resp['message']['url']" ersetzt werden, um den URL-Link des Bildes anstelle des Bildpfads zu verwenden.
- In dem Satz "embed.set_footer(resp['status'])" sollte "resp['status']" durch "f'API response: {resp['status']}'" ersetzt werden, um den API-Status anzugeben, anstatt nur den Status anzuzeigen.
- In dem Satz "await ctx.respond(embed=embed)" sollte "respond" durch "send" ersetzt werden, um die Nachricht zu senden, anstatt sie zu antworten.
- Es könnte auch hilfreich sein, eine Ausnahmebehandlung hinzuzufügen, um sicherzustellen, dass der Code ordnungsgemäß funktioniert, wenn ein Fehler beim Abrufen des Bildes über die API auftritt.
Nachdem die oben genannten Änderungen vorgenommen wurden, könnte der Code wie folgt aussehen:
@bot.command() @lightbulb.command('dogimg', "Sends a random dog picture")