File size: 4,840 Bytes
9cf96c4
 
 
 
 
4b6b17e
9cf96c4
 
 
4b6b17e
9cf96c4
 
 
 
e5419b0
9cf96c4
4b6b17e
 
 
 
 
 
 
 
 
 
cc78e99
4b6b17e
 
 
 
 
 
 
cc78e99
4b6b17e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9cf96c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ac2b5f
9cf96c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6ac2b5f
9cf96c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# This code is based on the following example:
# https://discordpy.readthedocs.io/en/stable/quickstart.html#a-minimal-bot

import os
import discord
from discord import app_commands
from discord.ext import commands
from threading import Thread
import json
import horde



intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='>', intents=intents)
tree = bot.tree

@tree.command(name="hello", description="Sends a greeting!")
async def hello(interaction: discord.Interaction):
    await interaction.response.send_message(f"Hello, {interaction.user.mention}!")

@tree.command(name="greet", description="Greets the specified user")
async def greet(interaction: discord.Interaction, name: str):
    await interaction.response.send_message(f"Hello, {name}!")

@tree.command(name="get-kudos", description="The amount of Kudos this user has.")
async def getKudos(interaction: discord.Interaction):
    details = horde.getUserDetails()
    if "kudos" not in details:
        await interaction.response.send_message(f'Error: {details["code"]} {details["reason"]}')
        return
    await interaction.response.send_message(f'The amount of Kudos this user has is {details["kudos"]}')

@tree.command(name="generate-status", description="Retrieve the status of an Asynchronous generation request.")
async def generateStatus(interaction: discord.Interaction, id: str):
    details = horde.generateCheck(id)
    if "kudos" not in details:
        await interaction.response.send_message(f'Error: {details["code"]} {details["reason"]}')
        return
    if bool(details["is_possible"]) == False:
        await interaction.response.send_message("This generation is impossible.")
        return
    if bool(details["faulted"]) == True:
        await interaction.response.send_message("This generation is faulted.")
        return
    if bool(details["done"]) == True:
        generationDetail = horde.generateStatus(id)
        if "generations" not in generationDetail:
            await interaction.response.send_message(f'Error: {details["code"]} {details["reason"]}')
        for i in range(len(generationDetail["generations"])):
            await interaction.response.send_message(generationDetail["generations"][i]["img"])
        return
    if int(details["processing"]) > 0:
        total = int(details["finished"]) + int(details["processing"]) + int(details["queue_position"]) + int(details["restarted"]) + int(details["waiting"])
        await interaction.response.send_message(f'Processing image: {details["processing"]}/{total}')
        return
    await interaction.response.send_message(f'Position in queue: {details["queue_position"]}, wait time: {details["wait_time"]}s')

@bot.command()
async def ping(ctx):
    await ctx.send('pong')

@bot.event
async def on_ready():
    print('We have logged in as {0.user}'.format(bot))


@bot.event
async def on_message(message):
    if message.author == bot.user:
        return

    if message.content == 'ping':
        await message.channel.send('pong')

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

async def sendMessageToChannelHelper(data):
    channel = await bot.fetch_channel(os.environ.get("CHANNEL_ID"))
    # 创建一个 embed 对象
    mTitle = "Empty Title"
    if "id" in data:
        mTitle = data["id"]
    if "log_tag" in data:
        mTitle = data["log_tag"]
    mDescription = "Empty Description"
    if "model" in data:
        mDescription = data["model"]
    if "log_message" in data:
        mDescription = data["log_message"]
    mColor = 0x00ff00
    if ("log_tag" in data or "log_message" in data) and (data["log_level"] == "assert" or data["log_level"] == "error"):
        mColor = 0xff0000
    embed = discord.Embed(title=mTitle, description=mDescription, color=mColor)
    # 将 fields 数据加入 embed
    for field in data:
        if field == "img":
            embed.set_image(url=data[field])
        else:
            embed.add_field(name=field, value=data[field], inline=True)
    # 发送 embed 消息
    await channel.send(embed=embed)

def sendMessageToChannel(data):
    bot.loop.create_task(sendMessageToChannelHelper(data))

def run():
    try:
      token = os.environ.get("TOKEN") or ""
      if token == "":
        raise Exception("Please add your token to the Secrets pane.")
      bot.run(token)
    except discord.HTTPException as e:
        if e.status == 429:
            print(
                "The Discord servers denied the connection for making too many requests"
            )
            print(
                "Get help from https://stackoverflow.com/questions/66724687/in-discord-py-how-to-solve-the-error-for-toomanyrequests"
            )
        else:
            raise e

def discord_bot():
    print("Running discord_bot")
    run()