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())