Spaces:
Sleeping
Sleeping
File size: 4,477 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 c3bfb7c 3f11bbc c3bfb7c 4f29568 3f11bbc 700b1d7 4f29568 3f11bbc 6fb9e78 dda26c7 6fb9e78 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 |
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}"
# --- Discord Slash Commands ---
@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],
):
try:
await interaction.response.defer() # MUST be the first await
# ... rest of your code ...
except Exception as e:
print(e)
"""Generates an image based on the user's prompt and aspect ratio."""
# await interaction.response.defer() # Acknowledge within 3 seconds
# Call the asynchronous image generation function
image_url_or_error = await generate_image_async(
prompt, aspect_ratio.value
)
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}"
)
@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!")
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()) |