Spaces:
Sleeping
Sleeping
File size: 4,794 Bytes
700b1d7 c01a950 3f11bbc 6fb9e78 4f29568 700b1d7 6fb9e78 c139e5d 6fb9e78 700b1d7 4f29568 700b1d7 c01a950 4f29568 6fb9e78 4f29568 3f11bbc 6fb9e78 3f11bbc 6fb9e78 3f11bbc 6fb9e78 3f11bbc 6fb9e78 3f11bbc 4f29568 6fb9e78 df4f8e3 16cc397 c3bfb7c 16cc397 c3bfb7c df4f8e3 4f29568 16cc397 3f11bbc df4f8e3 16cc397 df4f8e3 16cc397 df4f8e3 16cc397 700b1d7 4f29568 3f11bbc 6fb9e78 dda26c7 6fb9e78 700b1d7 2e5687d 700b1d7 6fb9e78 7678033 6fb9e78 c01a950 6fb9e78 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
import discord
from discord import app_commands
import os
import requests
import asyncio
import aiohttp # Use aiohttp for asynchronous HTTP requests
# --- Environment Variables & Setup ---
DISCORD_BOT_TOKEN = os.getenv("DISCORD_BOT_TOKEN")
GLIF_API_TOKEN = os.getenv("GLIF_API_TOKEN")
GLIF_API_URL = "https://simple-api.glif.app"
# Check if tokens are set
if not DISCORD_BOT_TOKEN or not GLIF_API_TOKEN:
raise ValueError(
"Both DISCORD_BOT_TOKEN and GLIF_API_TOKEN must be set as environment variables in the Hugging Face Space's settings."
)
# --- Discord Bot Setup ---
intents = discord.Intents.default()
# intents.message_content = True # If you need message content intent
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
# --- Asynchronous GLIF API Interaction with aiohttp ---
async def generate_image_async(prompt, aspect_ratio):
"""
Generates an image using the GLIF API asynchronously.
Args:
prompt: The text prompt for image generation.
aspect_ratio: The desired aspect ratio (e.g., "1:1", "16:9").
Returns:
The URL of the generated image, or an error message if the API request failed.
"""
payload = {
"id": "cm3ugmzv2002gnckiosrwk6xi", # Your GLIF model ID
"inputs": [prompt, aspect_ratio],
}
headers = {"Authorization": f"Bearer {GLIF_API_TOKEN}"}
async with aiohttp.ClientSession() as session:
try:
async with session.post(
GLIF_API_URL, json=payload, headers=headers, timeout=15
) as response: # Increased timeout to 15 seconds
response.raise_for_status()
response_data = await response.json()
if "output" in response_data:
return response_data["output"]
elif "error" in response_data:
return f"Error: {response_data['error']}"
else:
return "Error: Unexpected response from GLIF API."
except asyncio.TimeoutError:
return "Error: GLIF API request timed out."
except aiohttp.ClientError as e:
return f"API request failed: {e}"
@tree.command(
name="generate", description="Generates an image based on a text prompt"
)
@app_commands.choices(
aspect_ratio=[
app_commands.Choice(name="1:1 (Square)", value="1:1"),
app_commands.Choice(name="9:16 (Vertical)", value="9:16"),
app_commands.Choice(name="16:9 (Horizontal)", value="16:9"),
app_commands.Choice(name="4:5 (Portrait)", value="4:5"),
app_commands.Choice(name="5:4 (Landscape)", value="5:4"),
app_commands.Choice(name="3:4 (Portrait)", value="3:4"),
app_commands.Choice(name="4:3 (Landscape)", value="4:3"),
]
)
async def generate_command(
interaction: discord.Interaction,
prompt: str,
aspect_ratio: app_commands.Choice[str],
):
"""Generates an image based on the user's prompt and aspect ratio."""
print(f"Received /generate command from {interaction.user.name}") # Debug print
try:
await interaction.response.defer(ephemeral=False) # Added ephemeral=False, visible to everyone
print("Interaction deferred") # Debug print
image_url_or_error = await generate_image_async(
prompt, aspect_ratio.value
)
print(f"GLIF API response: {image_url_or_error}") # Debug print
if image_url_or_error.startswith("http"):
await interaction.followup.send(
f"Here's your generated image based on the prompt '{prompt}' with aspect ratio {aspect_ratio.name}:\n{image_url_or_error}"
)
else:
await interaction.followup.send(
f"Sorry, I couldn't generate an image. {image_url_or_error}"
)
print("Followup sent") # Debug print
except Exception as e:
print(f"An error occurred: {e}") # More specific error
await interaction.followup.send("An error occurred while processing your request.")
@tree.command(name="hello", description="Says hello!")
async def hello_command(interaction):
await interaction.response.send_message("Hello there!")
# --- Bot Initialization and Event Loop ---
async def on_ready():
await tree.sync()
print("Bot is ready!")
print(f"Guilds: {client.guilds}")
client.event(on_ready)
async def main():
print("Inside main()")
async with client:
print("Starting client...")
await client.start(DISCORD_BOT_TOKEN)
print("Bot has started.")
# Keep the main function alive:
while True:
await asyncio.sleep(60) # Sleep for 60 seconds
if __name__ == "__main__":
print("Running main()")
asyncio.run(main()) |