File size: 7,878 Bytes
5546580
 
 
11ad260
5654dca
 
 
c7a9a19
11ad260
 
 
0c87424
11ad260
 
 
 
 
 
 
 
2998219
51967cf
 
 
9650ea7
11ad260
b56f69c
 
11ad260
c378b04
9650ea7
d7fdc0e
11ad260
 
d7fdc0e
11ad260
9650ea7
 
11ad260
bc0d1ce
11ad260
 
 
 
bc0d1ce
11ad260
b56f69c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11ad260
 
 
 
88c8e49
27f00c5
 
 
9ac9152
c930197
 
9ac9152
 
c930197
 
27f00c5
9ac9152
 
 
80b1281
 
9ac9152
27f00c5
 
 
 
d7fdc0e
11ad260
27f00c5
32c3761
 
80b1281
 
27f00c5
 
 
 
 
 
80b1281
68e144d
 
27f00c5
 
 
 
 
80b1281
27f00c5
 
80b1281
 
27f00c5
 
 
 
80b1281
27f00c5
 
b6b7b30
11ad260
 
 
 
b053b25
11ad260
 
 
 
80b1281
11ad260
 
 
 
 
 
 
 
 
 
 
80b1281
11ad260
51967cf
deb809f
99e8c21
11ad260
54fa4a1
11ad260
 
83e22db
 
 
11ad260
51967cf
 
 
 
 
 
 
 
deb809f
51967cf
 
 
 
5bb5b3a
51967cf
 
 
80b1281
 
 
 
 
 
 
 
 
 
 
 
 
f85a8ab
80b1281
 
 
 
51967cf
ab6fd0b
fe7da19
 
7fb81a9
 
 
d7fdc0e
11ad260
5546580
 
11ad260
5546580
 
 
 
 
 
 
11ad260
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
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
# test # fix? # unstick
from gradio_client import Client
from PIL import Image
#from ratelimiter import RateLimiter
#
from datetime import datetime
from pytz import timezone
#
import asyncio

import shutil # for doing image movement magic



DFIF_TOKEN = os.getenv('HF_TOKEN')
DISCORD_TOKEN = os.environ.get("GRADIOTEST_TOKEN", None)

df = Client("huggingface-projects/IF", DFIF_TOKEN)
jojogan = Client("akhaliq/JoJoGAN", DFIF_TOKEN)


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

#---------------------------------------------------------------------------------------------------------------------------------------------- 
# jojo
@bot.command
async def jojo(ctx): # needs safety, easier to do safety function since they'll all have similar constraints
    
    await ctx.message.add_reaction('πŸ‘')
    thread = await ctx.message.create_thread(name=f'{ctx.author} Jojo Thread ')
    
    style = None
    style = 'JoJo'

    await thread.send(f'{ctx.author.mention}Generating JoJo image in thread, yare yare daze...')

    if style:
        if ctx.message.attachments:
            attachment = ctx.message.attachments[0]
            im = jojogan.predict(attachment.url, style)
            await ctx.message.reply(f'Here is the {style} version of it', file=discord.File(im))
        else:
            await ctx.message.channel.send("No attachments to be found...Can't animify dat! Try sending me an image πŸ˜‰")
#----------------------------------------------------------------------------------------------------------------------------------------------     
# Stage 1
@bot.command()
async def deepfloydif(ctx, *, prompt: str):
    try:
        try: 
            await ctx.message.add_reaction('πŸ‘')
            thread = await ctx.message.create_thread(name=f'{ctx.author} Image Upscaling Thread ')
            # create thread -> send new message inside thread + combined_image -> add reactions -> dfif2

            #current_time = int(time.time())
            #random.seed(current_time)

            negative_prompt = ''
            seed = random.randint(0, 1000)
            #seed = 1
            number_of_images = 4
            guidance_scale = 7
            custom_timesteps_1 = 'smart50'
            number_of_inference_steps = 50

            await thread.send(f'{ctx.author.mention}Generating images in thread, can take ~1 minute...')
            
        except Exception as e:
            print(f"Error: {e}")
            await ctx.reply('stage 1 error -> pre generation')
            await ctx.message.add_reaction('❌')

        
        try:
            stage_1_results, stage_1_param_path, stage_1_result_path = df.predict(
                prompt, negative_prompt, seed, number_of_images, guidance_scale, custom_timesteps_1, number_of_inference_steps, api_name='/generate64')
            
            partialpath = stage_1_result_path[5:] #magic for later
        except Exception as e:
            print(f"Error: {e}")
            await ctx.reply('stage 1 error -> during generation')
            await ctx.message.add_reaction('❌')            
            
        try:


            png_files = [f for f in os.listdir(stage_1_results) if f.endswith('.png')]
            
            if png_files:
                for i, png_file in enumerate(png_files):
                    png_file_path = os.path.join(stage_1_results, png_file)
                    img = Image.open(png_file_path)
                    image_path = os.path.join(stage_1_results, f'{i+1}{partialpath}.png')
                    img.save(image_path)
                    with open(image_path, 'rb') as f:
                        await thread.send(f'{ctx.author.mention}Image {i+1}', file=discord.File(f, f'{i+1}{partialpath}.png'))
                    await asyncio.sleep(1) 
    
            await thread.send(f'{ctx.author.mention}React with πŸ‘ to the image you want to upscale!')             
        except Exception as e:
            print(f"Error: {e}")
            await ctx.reply('stage 1 error -> posting images in thread')
            await ctx.message.add_reaction('❌')
            
        

    #deepfloydif try/except
    except Exception as e:
        print(f"Error: {e}")
        await ctx.reply('An error occurred in stage 1')
        await ctx.message.add_reaction('❌')

#----------------------------------------------------------------------------------------------------------------------------
# Stage 2
async def dfif2(index: int, stage_1_result_path, thread):
    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 thread.send(f'Here is the upscaled image! :) ', file=discord.File(f, 'result.png'))
            #await ctx.reply('Here is the result of the second stage', file=discord.File(f, 'result.png'))
            #await ctx.message.add_reaction('βœ…') need to fix this
            

        

    except Exception as e:
        print(f"Error: {e}")
        
        #await ctx.reply('An error occured in stage 2') need to fix
        #await ctx.message.add_reaction('❌')
#----------------------------------------------------------------------------------------------------------------------------
@bot.event
async def on_reaction_add(reaction, user):
    # safety checks first
    if user.bot:
        return    
        
    # do they have the required (verified) role?
    guild = reaction.message.guild

    # Check if the user has the desired role
    required_role_id = 897376942817419265  # huggingfolks for now
    required_role = guild.get_role(required_role_id)

    if required_role not in user.roles:
        return    

    emoji = reaction.emoji

    thread = reaction.message.channel
    tbd = reaction.message.content
    #index = 0 decided by index in front of partialpath 


    # magic begins
    attachment = reaction.message.attachments[0]
    image_name = attachment.filename
    # we know image_name will be something like 1tmpgtv4qjix.png
    # remove .png first
    indexpartialpath = image_name[:-4] # should be 1tmpgtv4qjix 
    # extract index as an integer (dfif2 needs integer)
    index = int(indexpartialpath[0]) - 1# should be 1
    # extract partialpath
    partialpath = indexpartialpath[1:] # should be tmpgtv4qjix
    # add /tmp/ to partialpath, save as new variable
    fullpath = "/tmp/" + partialpath # should be /tmp/tmpgtv4qjix
    
    if emoji == 'πŸ‘':
        if reaction.message.attachments:
            if user.id == reaction.message.mentions[0].id:  # all we care about is upscaling whatever image this is 
                stage_1_result_path = fullpath
                index = index
                await dfif2(index, stage_1_result_path, thread)

        

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