File size: 6,244 Bytes
5546580
 
 
c41bcc3
5654dca
 
 
3d72860
c41bcc3
 
 
cbfd6cc
c41bcc3
 
89a3df9
c41bcc3
 
 
 
2a9e01b
 
81ba37f
249ac1a
c41bcc3
b939335
c41bcc3
 
5546580
c41bcc3
 
 
744e267
866f5c8
c41bcc3
 
744e267
c41bcc3
cc2fbe1
 
6de149e
 
c41bcc3
 
 
eb409dd
2998219
6de149e
da77733
c41bcc3
 
 
 
 
 
476cf97
bc0d1ce
249ac1a
8d9310f
bc0d1ce
9650ea7
 
 
 
6de149e
9650ea7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc0d1ce
 
 
 
c141883
bc0d1ce
 
c141883
 
 
 
ac1b5ab
c141883
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc0d1ce
282fda9
da77733
c41bcc3
 
 
282fda9
da77733
c41bcc3
ba577dd
c41bcc3
da77733
282fda9
 
 
 
da77733
 
 
c41bcc3
282fda9
 
2a9e01b
c41bcc3
 
 
da77733
ac1b5ab
 
bc0d1ce
5546580
 
c41bcc3
5546580
 
 
 
 
 
 
c41bcc3
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import discord
import os
import threading
import gradio as gr
import requests
import json
import random
import time
import re
from discord import Embed, Color
from discord.ext import commands
# restart #unstick #revert
from gradio_client import Client
from PIL import Image
#from ratelimiter import RateLimiter
#
from datetime import datetime
from pytz import timezone
#
import asyncio



zurich_tz = timezone("Europe/Zurich")

def convert_to_timezone(dt, tz):
    return dt.astimezone(tz).strftime("%Y-%m-%d %H:%M:%S %Z")

DFIF_TOKEN = os.getenv('HF_TOKEN')
df = Client("huggingface-projects/IF", DFIF_TOKEN)
sdlu = Client("huggingface-projects/stable-diffusion-latent-upscaler", DFIF_TOKEN)

DISCORD_TOKEN = os.environ.get("GRADIOTEST_TOKEN", None)
intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix='!', intents=intents)


#----------------------------------------------------------------------------------------------------------------------------------------------

@bot.event
async def on_ready():
    print('Logged on as', bot.user)
    bot.log_channel = bot.get_channel(1100458786826747945) # 1100458786826747945 = bot-test, 1107006391547342910 = lunarbot server

#---------------------------------------------------------------------------------------------------------------------------------------------- 
# Stage 1
@bot.command()
async def deepfloydif(ctx, *, prompt: str):
    try:
        prompt = prompt.strip()[:100]  # Limit the prompt length to 100 characters
        prompt = re.sub(r'[^\w\s]', '', prompt)  # Remove special characters

        def check_reaction(reaction, user):
            return user == ctx.author and str(reaction.emoji) in ['1️⃣', '2️⃣', '3️⃣', '4️⃣']   

        await ctx.message.add_reaction('👍')
        
        number_of_images = 4
        current_time = int(time.time())
        random.seed(current_time)
        seed = random.randint(0, 2**32 - 1)
        stage_1_results, stage_1_param_path, stage_1_result_path = df.predict(prompt, "blur", seed, number_of_images, 7.0, 'smart100', 50, api_name="/generate64")
        png_files = [f for f in os.listdir(stage_1_results) if f.endswith('.png')]

        if png_files:
            first_png = png_files[0]
            second_png = png_files[1]
            third_png = png_files[2]
            fourth_png = png_files[3]

            first_png_path = os.path.join(stage_1_results, first_png)
            second_png_path = os.path.join(stage_1_results, second_png)
            third_png_path = os.path.join(stage_1_results, third_png)
            fourth_png_path = os.path.join(stage_1_results, fourth_png)

            img1 = Image.open(first_png_path)
            img2 = Image.open(second_png_path)
            img3 = Image.open(third_png_path)
            img4 = Image.open(fourth_png_path)

            combined_image = Image.new('RGB', (img1.width * 2, img1.height * 2))

            combined_image.paste(img1, (0, 0))
            combined_image.paste(img2, (img1.width, 0))
            combined_image.paste(img3, (0, img1.height))
            combined_image.paste(img4, (img1.width, img1.height))

            combined_image_path = os.path.join(stage_1_results, 'combined_image.png')
            combined_image.save(combined_image_path)

            # Trigger the second stage prediction
            #await dfif2(ctx, stage_1_result_path)

        with open(combined_image_path, 'rb') as f:
            sent_message = await ctx.reply('Here is the combined image. React with the image number you want to upscale!', file=discord.File(f, 'combined_image.png'))

        # bot reacts with appropriate emojis to the post, both showing the user what options they have,
        # as well as showing which post to react to.
        for emoji in ['1️⃣', '2️⃣', '3️⃣', '4️⃣']:
            await sent_message.add_reaction(emoji)            

        reaction, user = await bot.wait_for('reaction_add', check=check_reaction)
        if str(reaction.emoji) == '1️⃣':
            await ctx.reply("Upscaling the first image...")
            index = 0
            await dfif2(ctx, index, stage_1_result_path)
        elif str(reaction.emoji) == '2️⃣':
            await ctx.reply("Upscaling the second image...")
            index = 1
            await dfif2(ctx, index, stage_1_result_path)            
        elif str(reaction.emoji) == '3️⃣':
            await ctx.reply("Upscaling the third image...")
            index = 2
            await dfif2(ctx, index, stage_1_result_path)            
        elif str(reaction.emoji) == '4️⃣':
            await ctx.reply("Upscaling the fourth image...")
            index = 3
            await dfif2(ctx, index, stage_1_result_path)            

    #deepfloydif try/except
    except Exception as e:
        print(f"Error: {e}")
        await ctx.reply('An error occurred while processing your request. Please wait 5 seconds before retrying.')

#----------------------------------------------------------------------------------------------------------------------------
# Stage 2
async def dfif2(ctx, index: int, stage_1_result_path):
    try:
        selected_index_for_stage_2 = index
        seed_2 = 0
        guidance_scale_2 = 4
        custom_timesteps_2 = 'smart50'
        number_of_inference_steps_2 = 50
        result_path = df.predict(stage_1_result_path, selected_index_for_stage_2, seed_2, 
                                 guidance_scale_2, custom_timesteps_2, number_of_inference_steps_2, api_name='/upscale256')
    
        
        with open(result_path, 'rb') as f:
            await ctx.reply('Here is the result of the second stage', file=discord.File(f, 'result.png'))
    
    except Exception as e:
        print(f"Error: {e}")
        await ctx.reply('An error occurred while processing stage 2 upscaling. Please try again later.')
#----------------------------------------------------------------------------------------------------------------------------


        

def run_bot():
    bot.run(DISCORD_TOKEN)

threading.Thread(target=run_bot).start()

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()