File size: 12,930 Bytes
5546580
 
 
11ad260
5654dca
 
 
c7a9a19
11ad260
 
 
e142d00
11ad260
 
 
 
 
 
 
 
2998219
51967cf
 
 
9650ea7
11ad260
b56f69c
 
11ad260
c378b04
9650ea7
d7fdc0e
11ad260
 
d7fdc0e
11ad260
9650ea7
 
b76c726
11ad260
 
 
 
b76c726
 
ad3f8da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b76c726
ad3f8da
 
 
11ad260
b56f69c
0ea249e
 
b76c726
b7e73d9
b76c726
b7e73d9
b76c726
 
 
 
0c7af3c
 
b76c726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3721ac7
65ace7e
 
 
 
 
3721ac7
 
 
 
 
 
 
 
 
 
 
65ace7e
 
 
 
 
 
3721ac7
 
 
 
 
 
 
65ace7e
3721ac7
 
 
65ace7e
 
 
 
 
 
3721ac7
 
 
 
 
 
 
 
 
 
 
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
 
 
 
 
 
0fd1dfe
51967cf
ab6fd0b
fe7da19
 
0fd1dfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
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
#---------------------------------------------------------------------------------------------------------------------------------------------
async def safetychecks(ctx):
    try:
        if ctx.author.bot:
            print(f"Error: The bot is not allowed to use its own commands.")
            return False
    
        #βœ… check if the bot is offline 
        offline_bot_role_id = 1103676632667017266
        bot_member = ctx.guild.get_member(bot.user.id)
        if any(role.id == offline_bot_role_id for role in bot_member.roles):
            print(f"Error: The bot is offline or under maintenance. (Remove the offline-bot role to bring it online)")
            await ctx.message.reply(f"<@811235357663297546> testing ping, SC failed somewhere")            
            return False
    
        #βœ… check if the command is in the allowed channel(s)
        channel_id = 1100458786826747945
        if ctx.channel.id != 1100458786826747945:
            print(f"Error: This is not a permitted channel for that command. ({ctx.channel} is the correct channel)")
            return False
            
        #βœ… check if the user has the required role(s)   
        guild_id = 879548962464493619
        required_role_id = 900063512829755413  # @verified for now
        guild = bot.get_guild(guild_id)
        required_role = guild.get_role(required_role_id)
        if required_role not in ctx.author.roles:
            print(f"Error: The user does not have the required role to use that command. ({required_role} is the correct role)")        
            return False
    
        return True

    except Exception as e:
        print(f"Error: safetychecks failed somewhere, command will not continue.")
        await ctx.message.reply(f"<@811235357663297546> SC failed somewhere")
#---------------------------------------------------------------------------------------------------------------------------------------------- 
# jojo
@bot.command()
async def jojo(ctx):
    # img + face    βœ…
    # img + no face βœ…
    # no image      βœ…
    # no generation βœ…
    # responsive?   βœ…
    # ratelimits?   ❌
    # safety checks?❌
    # bot no crash  ❌

    if await safetychecks(ctx):
        try:    
            await ctx.message.add_reaction('πŸ€–') 
            thread = await ctx.message.create_thread(name=f'{ctx.author} Jojo Thread')         
            if ctx.message.attachments:
                await thread.send(f'{ctx.author.mention}Generating images in thread, can take ~1 minute...yare yare, daze ...')  
                
                attachment = ctx.message.attachments[0]
                style = 'JoJo'
                im = jojogan.predict(attachment.url, style)
                #await ctx.message.reply(f'Here is the {style} version of it', file=discord.File(im))
        
                await thread.send(f'{ctx.author.mention}Here is the {style} version of it', file=discord.File(im))
                await ctx.message.add_reaction('βœ…') # img + face    
            else: # no image
                await thread.send(f"{ctx.author.mention}No attachments to be found...Can't animify dat! Try sending me an image πŸ˜‰")
                await ctx.message.add_reaction('❌')             
        except Exception as e: # no generation / img + no face
            print(f"Error: {e}")
            await thread.send(f"{ctx.author.mention}Error: {e}")
            await ctx.message.add_reaction('❌')            
        
#---------------------------------------------------------------------------------------------------------------------------------------------- 
# Disney
@bot.command()
async def disney(ctx):
    
    if ctx.message.attachments:
        thread = await ctx.message.create_thread(name=f'{ctx.author} Disney Thread... ') 
        await thread.send(f'{ctx.author.mention}Generating images in thread, can take ~1 minute...')  
        
        attachment = ctx.message.attachments[0]
        style = 'Disney'
        im = jojogan.predict(attachment.url, style)

        await thread.send(f'Here is the {style} version of it', file=discord.File(im))
    else:
        await ctx.message.reply("No attachments to be found...Can't animify dat! Try sending me an image πŸ˜‰") 
        
#---------------------------------------------------------------------------------------------------------------------------------------------- 
# Spider-Verse
@bot.command()
async def spiderverse(ctx):
    
    if ctx.message.attachments:
        thread = await ctx.message.create_thread(name=f'{ctx.author} Spider-Verse Thread... ') 
        await thread.send(f'{ctx.author.mention}Generating images in thread, can take ~1 minute...')  
        
        attachment = ctx.message.attachments[0]
        style = 'Spider-Verse'
        im = jojogan.predict(attachment.url, style)

        await thread.send(f'Here is the {style} version of it', file=discord.File(im))
    else:
        await ctx.message.reply("No attachments to be found...Can't animify dat! Try sending me an image πŸ˜‰") 
        
#---------------------------------------------------------------------------------------------------------------------------------------------- 
# sketch
@bot.command()
async def sketch(ctx):
    
    if ctx.message.attachments:
        thread = await ctx.message.create_thread(name=f'{ctx.author} Sketch Thread... ') 
        await thread.send(f'{ctx.author.mention}Generating images in thread, can take ~1 minute...')  
        
        attachment = ctx.message.attachments[0]
        style = 'sketch'
        im = jojogan.predict(attachment.url, style)

        await thread.send(f'Here is the {style} version of it', file=discord.File(im))
    else:
        await ctx.message.reply("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 



    
    if emoji == 'πŸ‘':
        if reaction.message.attachments:
            if user.id == reaction.message.mentions[0].id:  # all we care about is upscaling whatever image this is 
                
                # 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

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