2023-01-12 06:37:56 +02:00
import json
import requests
import io
2023-03-18 00:04:54 +02:00
import os
2023-01-12 06:37:56 +02:00
import random
import base64
2023-03-18 00:04:54 +02:00
from PIL import Image , PngImagePlugin
from pyrogram import Client , filters
from pyrogram . types import *
2023-03-18 00:24:46 +02:00
from dotenv import load_dotenv
2023-03-18 00:04:54 +02:00
2023-04-22 22:18:10 +03:00
# Done! Congratulations on your new bot. You will find it at
2023-03-18 00:04:54 +02:00
# t.me/gootmornbot
# You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
# Use this token to access the HTTP API:
# Keep your token secure and store it safely, it can be used by anyone to control your bot.
# For a description of the Bot API, see this page: https://core.telegram.org/bots/api
2023-01-12 06:37:56 +02:00
2023-03-18 00:24:46 +02:00
load_dotenv ( )
2023-04-22 22:18:10 +03:00
API_ID = os . environ . get ( " API_ID " , None )
API_HASH = os . environ . get ( " API_HASH " , None )
TOKEN = os . environ . get ( " TOKEN " , None )
SD_URL = os . environ . get ( " SD_URL " , None )
2023-03-18 00:04:54 +02:00
print ( SD_URL )
2023-04-22 22:18:10 +03:00
app = Client ( " stable " , api_id = API_ID , api_hash = API_HASH , bot_token = TOKEN )
2023-01-12 06:37:56 +02:00
2023-03-18 00:04:54 +02:00
2023-04-22 22:15:16 +03:00
def slice_positive_negative ( string ) :
delimiter = " ng "
if delimiter in string :
index = string . index ( delimiter )
positive = string [ : index ] . rstrip ( )
2023-04-22 22:18:10 +03:00
negative = string [ index + len ( delimiter ) : ] . lstrip ( )
2023-04-22 22:15:16 +03:00
return positive , negative
else :
2023-04-22 22:18:10 +03:00
return string , " null " # if we are missing the ng bad thing happen....
2023-01-12 06:37:56 +02:00
2023-03-18 00:04:54 +02:00
2023-01-12 06:37:56 +02:00
@app.on_message ( filters . command ( [ " draw " ] ) )
def draw ( client , message ) :
2023-04-22 22:18:10 +03:00
msgs = message . text . split ( " " , 1 )
2023-01-12 06:37:56 +02:00
if len ( msgs ) == 1 :
2023-04-22 22:18:10 +03:00
message . reply_text (
" Format : \n /draw < text to image > \n ng < negative (optional) > "
)
2023-01-12 06:37:56 +02:00
return
2023-04-22 22:15:16 +03:00
msg = slice_positive_negative ( msgs [ 1 ] )
print ( msg )
payload = {
2023-04-22 22:18:10 +03:00
" prompt " : msg [ 0 ] ,
" negative_prompt " : msg [ 1 ] ,
}
2023-03-18 12:58:05 +02:00
print ( payload )
2023-01-12 06:37:56 +02:00
2023-04-22 22:15:16 +03:00
K = message . reply_text ( " Please Wait 10-15 Second " )
2023-04-22 22:18:10 +03:00
r = requests . post ( url = f " { SD_URL } /sdapi/v1/txt2img " , json = payload ) . json ( )
2023-01-12 06:37:56 +02:00
2023-03-18 00:24:46 +02:00
def genr ( ) :
2023-03-18 00:04:54 +02:00
chars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "
chars1 = " 1234564890 "
gen1 = random . choice ( chars )
gen2 = random . choice ( chars )
gen3 = random . choice ( chars1 )
gen4 = random . choice ( chars )
gen5 = random . choice ( chars )
gen6 = random . choice ( chars )
gen7 = random . choice ( chars1 )
gen8 = random . choice ( chars )
gen9 = random . choice ( chars )
gen10 = random . choice ( chars1 )
return f " { message . from_user . id } -MOE { gen1 } { gen2 } { gen3 } { gen4 } { gen5 } { gen6 } { gen7 } { gen8 } { gen9 } { gen10 } "
2023-04-22 22:18:10 +03:00
2023-03-18 12:58:05 +02:00
word = genr ( )
2023-04-22 22:18:10 +03:00
for i in r [ " images " ] :
2023-01-12 06:37:56 +02:00
image = Image . open ( io . BytesIO ( base64 . b64decode ( i . split ( " , " , 1 ) [ 0 ] ) ) )
png_payload = { " image " : " data:image/png;base64, " + i }
2023-04-22 22:18:10 +03:00
response2 = requests . post ( url = f " { SD_URL } /sdapi/v1/png-info " , json = png_payload )
2023-01-12 06:37:56 +02:00
pnginfo = PngImagePlugin . PngInfo ( )
pnginfo . add_text ( " parameters " , response2 . json ( ) . get ( " info " ) )
2023-04-22 22:18:10 +03:00
image . save ( f " { word } .png " , pnginfo = pnginfo )
2023-01-12 06:37:56 +02:00
message . reply_photo (
photo = f " { word } .png " ,
2023-04-22 22:18:10 +03:00
caption = f " Prompt - ** { msg [ 0 ] } ** \n Negative Prompt - ** { msg [ 1 ] } ** \n **[ { message . from_user . first_name } -Kun](tg://user?id= { message . from_user . id } )** " ,
2023-01-12 06:37:56 +02:00
)
2023-03-18 12:58:05 +02:00
# os.remove(f"{word}.png")
2023-01-12 06:37:56 +02:00
K . delete ( )
2023-03-18 00:04:54 +02:00
@app.on_message ( filters . command ( [ " getmodels " ] ) )
async def get_models ( client , message ) :
2023-04-22 22:18:10 +03:00
response = requests . get ( url = f " { SD_URL } /sdapi/v1/sd-models " )
2023-03-18 00:04:54 +02:00
if response . status_code == 200 :
models_json = response . json ( )
# create buttons for each model name
buttons = [ ]
for model in models_json :
2023-04-22 22:18:10 +03:00
buttons . append (
[
InlineKeyboardButton (
model [ " title " ] , callback_data = model [ " model_name " ]
)
]
)
2023-03-18 00:04:54 +02:00
# send the message
await message . reply_text (
text = " Select a model [checkpoint] to use " ,
2023-04-22 22:18:10 +03:00
reply_markup = InlineKeyboardMarkup ( buttons ) ,
2023-03-18 00:04:54 +02:00
)
2023-04-22 22:18:10 +03:00
2023-03-18 00:04:54 +02:00
@app.on_callback_query ( )
async def process_callback ( client , callback_query ) :
# if a model button is clicked, set sd_model_checkpoint to the selected model's title
sd_model_checkpoint = callback_query . data
# The sd_model_checkpoint needs to be set to the title from /sdapi/v1/sd-models
# post using /sdapi/v1/options
2023-04-22 22:18:10 +03:00
options = { " sd_model_checkpoint " : sd_model_checkpoint }
2023-03-18 00:04:54 +02:00
# post the options
2023-04-22 22:18:10 +03:00
response = requests . post ( url = f " { SD_URL } /sdapi/v1/options " , json = options )
2023-03-18 00:04:54 +02:00
if response . status_code == 200 :
# if the post was successful, send a message
2023-04-22 22:18:10 +03:00
await callback_query . message . reply_text (
" checpoint set to " + sd_model_checkpoint
)
2023-03-18 00:04:54 +02:00
else :
# if the post was unsuccessful, send an error message
await callback_query . message . reply_text ( " Error setting options " )
2023-01-12 06:37:56 +02:00
@app.on_message ( filters . command ( [ " start " ] , prefixes = [ " / " , " ! " ] ) )
async def start ( client , message ) :
2023-03-18 00:04:54 +02:00
# Photo = "https://i.imgur.com/79hHVX6.png"
2023-01-12 06:37:56 +02:00
2023-04-22 22:18:10 +03:00
buttons = [
[
InlineKeyboardButton (
" Add to your group " , url = " https://t.me/gootmornbot?startgroup=true "
)
]
]
2023-03-18 00:04:54 +02:00
await message . reply_text (
# photo=Photo,
2023-04-22 22:18:10 +03:00
text = f " Hello! \n ask me to imagine anything \n \n /draw text to image " ,
reply_markup = InlineKeyboardMarkup ( buttons ) ,
)
2023-01-12 06:37:56 +02:00
app . run ( )