parent
9d5a93cfae
commit
f89e97feb8
3 changed files with 249 additions and 0 deletions
@ -0,0 +1,241 @@ |
|||||||
|
import os, logging |
||||||
|
DEBUG = os.environ.get('DEBUG') |
||||||
|
logging.basicConfig( |
||||||
|
#filename='protovax.log', encoding='utf-8', |
||||||
|
format='[%(asctime)s] %(levelname)s %(module)s/%(funcName)s - %(message)s', |
||||||
|
level=logging.DEBUG if DEBUG else logging.INFO) |
||||||
|
|
||||||
|
import requests |
||||||
|
import random |
||||||
|
import json |
||||||
|
import base64 |
||||||
|
import time |
||||||
|
import re |
||||||
|
from io import BytesIO |
||||||
|
from telethon import TelegramClient, events |
||||||
|
|
||||||
|
import secrets |
||||||
|
|
||||||
|
PROTOSPACE = -1001298858490 |
||||||
|
JASON = 172033414 |
||||||
|
|
||||||
|
client = TelegramClient('data/dreamer.session', secrets.TG_API_ID, secrets.TG_API_HASH) |
||||||
|
|
||||||
|
def snap_size(size): |
||||||
|
VALID_SIZES = [512, 576, 640, 704, 768, 832, 896, 960, 1024] |
||||||
|
for s in VALID_SIZES: |
||||||
|
if s >= size: |
||||||
|
return s |
||||||
|
|
||||||
|
def dreamer(prompt, steps=30, seed=1234, height=512, width=512): |
||||||
|
url = secrets.DREAM_API |
||||||
|
|
||||||
|
#sd_settings_json = '{"fn_index":12,"data":["","","None","None",30,"Euler a",false,false,1,1,7,-1,-1,0,0,0,false,512,512,false,false,0.7,"None",false,"Seed","","Steps","",true,false,false,null,"",null,"",""],"session_hash":"qpydye2zzsh"}' |
||||||
|
sd_settings_json = '{"fn_index":12,"data":["","","None","None",30,"Euler a",false,false,1,1,7,-1,-1,0,0,0,false,512,512,false,false,0.7,"None",false,false,null,"","Seed","","Nothing","",true,false,null,"",""],"session_hash":"qpydye2zzsh"}' |
||||||
|
|
||||||
|
sd_settings = json.loads(sd_settings_json) |
||||||
|
sd_settings['data'][0] = prompt |
||||||
|
sd_settings['data'][4] = steps |
||||||
|
sd_settings['data'][11] = seed |
||||||
|
sd_settings['data'][17] = snap_size(height) |
||||||
|
sd_settings['data'][18] = snap_size(width) |
||||||
|
|
||||||
|
if width > 512 or height > 512: |
||||||
|
# highres fix |
||||||
|
sd_settings['data'][19] = True |
||||||
|
|
||||||
|
logging.info('Dreaming of: %s', prompt) |
||||||
|
|
||||||
|
try: |
||||||
|
res = requests.post(url, json=sd_settings, timeout=40) |
||||||
|
res.raise_for_status() |
||||||
|
res = res.json() |
||||||
|
return res |
||||||
|
except BaseException as e: |
||||||
|
logging.error('Problem dreaming {}: {} - {}'.format(url, e.__class__.__name__, str(e))) |
||||||
|
return None |
||||||
|
|
||||||
|
async def message_handler(event): |
||||||
|
text = event.raw_text |
||||||
|
chat = event.chat_id |
||||||
|
|
||||||
|
sender = await event.get_sender() |
||||||
|
if not event.sender: |
||||||
|
return |
||||||
|
|
||||||
|
if event.message.fwd_from: |
||||||
|
return |
||||||
|
|
||||||
|
name = getattr(sender, 'first_name', None) |
||||||
|
if not name: |
||||||
|
return |
||||||
|
|
||||||
|
command = '' |
||||||
|
data = '' |
||||||
|
reply = '' |
||||||
|
reply_file = None |
||||||
|
|
||||||
|
if text.startswith('! '): |
||||||
|
text = text[2:] |
||||||
|
elif text.startswith('!'): |
||||||
|
text = text[1:] |
||||||
|
else: |
||||||
|
return |
||||||
|
|
||||||
|
if ' ' in text: |
||||||
|
command = text.split(' ', 1)[0] |
||||||
|
data = text.split(' ', 1)[1] |
||||||
|
else: |
||||||
|
command = text |
||||||
|
|
||||||
|
command = command.lower() |
||||||
|
|
||||||
|
|
||||||
|
#!dream |
||||||
|
if command == 'dream': |
||||||
|
logging.info('Chat: {:<14} | ID: {:<6} | User: {} {} | Command: {} | Data: {}'.format(chat, event.id, name, sender.id, command, data or 'None')) |
||||||
|
|
||||||
|
if not reply and chat == PROTOSPACE: |
||||||
|
reply = '> please join {} to dream'.format(secrets.PROTODREAM_URL) |
||||||
|
|
||||||
|
#if not reply and sender.id == JASON: |
||||||
|
# reply = '> no.' |
||||||
|
|
||||||
|
to_send = '' |
||||||
|
if not reply and data: |
||||||
|
to_send = data |
||||||
|
|
||||||
|
if not reply and not to_send and event.message.is_reply: |
||||||
|
reply_msg = await event.get_reply_message() |
||||||
|
to_send = reply_msg.raw_text |
||||||
|
|
||||||
|
if not reply and '> ' in to_send: |
||||||
|
reply = '> sounds like a bad !dream' |
||||||
|
|
||||||
|
if not reply and len(to_send) > 500: |
||||||
|
reply = '> impressive. very nice. let\'s see Paul Allen\'s prompt.' |
||||||
|
|
||||||
|
if not reply and not to_send: |
||||||
|
reply = '> usage: !dream [prompt] [options]' |
||||||
|
reply += '\n> or reply to a someone with !dream' |
||||||
|
reply += '\n> default options:' |
||||||
|
reply += '\n> steps:30 (20-40)' |
||||||
|
reply += '\n> height:512 (512-1024)' |
||||||
|
reply += '\n> width:512 (512-1024)' |
||||||
|
reply += '\n> seed:number' |
||||||
|
reply += '\n> favourites: https://t.me/+UyMF3ArBe4pmYzQ5' |
||||||
|
|
||||||
|
if not reply: |
||||||
|
settings = { |
||||||
|
'steps': 30, |
||||||
|
'height': 512, |
||||||
|
'width': 512, |
||||||
|
'seed': random.randint(11111, 19999), |
||||||
|
} |
||||||
|
|
||||||
|
maximums = { |
||||||
|
'steps': 40, |
||||||
|
'height': 1024, |
||||||
|
'width': 1024, |
||||||
|
} |
||||||
|
|
||||||
|
minimums = { |
||||||
|
'steps': 20, |
||||||
|
'height': 512, |
||||||
|
'width': 512, |
||||||
|
} |
||||||
|
|
||||||
|
for match in re.findall('((\w+)[:=](\d+))', to_send): |
||||||
|
whole = match[0] |
||||||
|
setting = match[1] |
||||||
|
value = int(match[2]) |
||||||
|
|
||||||
|
to_send = to_send.replace(whole, '').replace(' ', ' ') |
||||||
|
|
||||||
|
if setting in maximums and value > maximums[setting]: |
||||||
|
reply = '> {} should be <= {}'.format(setting, maximums[setting]) |
||||||
|
break |
||||||
|
|
||||||
|
if setting in minimums and value < minimums[setting]: |
||||||
|
reply = '> {} should be >= {}'.format(setting, minimums[setting]) |
||||||
|
break |
||||||
|
|
||||||
|
if setting in settings: |
||||||
|
settings[setting] = value |
||||||
|
|
||||||
|
|
||||||
|
if not reply: |
||||||
|
try: |
||||||
|
to_send = to_send.replace('@', '') |
||||||
|
to_send = to_send.replace('!', '') |
||||||
|
to_send = to_send.strip() |
||||||
|
prompt = to_send |
||||||
|
|
||||||
|
if len(str(settings['seed'])) == 4: |
||||||
|
enhancements1 = [ |
||||||
|
', fantasy, intricate, elegant, digital painting, concept art, sharp focus, illustration by greg rutkowski, 4k', |
||||||
|
', synthwave style, artstation, detailed, award winning, dramatic lighting, miami vice, oil on canvas', |
||||||
|
', highly detailed painting by dustin nguyen, akihiko yoshida, greg tocchini, 4 k, trending on artstation, 8 k', |
||||||
|
', cinematic lighting, insanely detailed, intricate, artstation, cgsociety, painted by simon stalenhag, concept art, illustration, sharp focus', |
||||||
|
', photorealistic, highly detailed, illustration, lifelike, highly detailed, intricate, octane render, sharp focus, cyberpunk', |
||||||
|
', by ghibli, makoto shinkai, bright and transparent animation style, anime art wallpaper 4 k, trending on artstation', |
||||||
|
', painterly, sharp focus, illustration, art by lois royo', |
||||||
|
', in the style of gta cover art, by stephen bliss, trending on artstation, pixiv, 8 k', |
||||||
|
', d & d, fantasy concept art, octane render, 8 k', |
||||||
|
', peter mohrbacher, charlie bowater, artstation, craig mullins, cinematic, digital painting, deviantart, cinematic lighting, 4 k', |
||||||
|
', tristan eaton, victo ngai, maxfield parrish, artgerm, koons, ryden, intricated details', |
||||||
|
', by soul bass, kawase hasui, moebius and edward hopper, colorful flat surreal design, xray hd, 8 k', |
||||||
|
', manga cover art, detailed color portrait, artstation trending, 8 k', |
||||||
|
', a hacker hologram by penny patricia poppycock, pixabay contest winner, holography, irridescent, photoillustration, maximalist vaporwave - n 9', |
||||||
|
', breathtaking, epic, stunning, gorgeous, much detail, much wow, cgsociety, wlop, pixiv, behance, deviantart, masterpiece', |
||||||
|
', sharp focus, dynamic lighting, elegant, harmony, beauty, masterpiece, by roberto ferry, illustration, blue background', |
||||||
|
', ultradetailed environment, sharp focus, cinematic lighting, by alphonse maria mucha and kim jung gi', |
||||||
|
', concept art by jama jurabaev, cinematic shot, trending on artstation, high quality, brush stroke, hyperspace, vibrant colors', |
||||||
|
', hyper detailed, sharp focus, bokeh, unreal engine, ray tracing, cute, fantasy, sci fi, purple lights, tiny, small', |
||||||
|
', fancy, ultra detailed, brush strokes, digital painting, cinematic, yoshitaka amano, andy warhol, ultra realistic', |
||||||
|
', by tsuyoshi nagano, illustration, cinematic lighting, hyperdetailed, 8 k, symmetrical, frostbite 3 engine, cryengine, dof, trending on artstation, digital art, crepuscular ray', |
||||||
|
', retrowave, tonal separation, black background, neon, black, glitch, strong contrast, pinterest, trending on artstation', |
||||||
|
', basic background, krenz cushart, mucha, ghibli, by joaquin sorolla rhads leyendecker, by ohara koson', |
||||||
|
] |
||||||
|
|
||||||
|
if ',' not in prompt: |
||||||
|
prompt += enhancements1[settings['seed'] % len(enhancements1)] |
||||||
|
elif str(settings['seed'])[0] == '1': |
||||||
|
pass |
||||||
|
|
||||||
|
start = time.time() |
||||||
|
dream_res = dreamer(prompt, **settings) |
||||||
|
finish = time.time() |
||||||
|
|
||||||
|
url_enc = dream_res['data'][0][0] |
||||||
|
b64_str = url_enc[22:] |
||||||
|
|
||||||
|
reply_file = base64.decodebytes(bytes(b64_str, 'utf-8')) |
||||||
|
|
||||||
|
latency = finish - start |
||||||
|
reply = '> generated "{}" for {} in {} s with seed:{} steps:{}'.format( |
||||||
|
to_send, |
||||||
|
name, |
||||||
|
str(latency)[:3], |
||||||
|
settings['seed'], |
||||||
|
settings['steps'] |
||||||
|
) |
||||||
|
|
||||||
|
except BaseException as e: |
||||||
|
logging.exception(e) |
||||||
|
reply = '> error' |
||||||
|
|
||||||
|
await event.reply(reply, file=reply_file, link_preview=False) |
||||||
|
|
||||||
|
|
||||||
|
@client.on(events.MessageEdited) |
||||||
|
async def message_edited(event): |
||||||
|
await message_handler(event) |
||||||
|
|
||||||
|
@client.on(events.NewMessage) |
||||||
|
async def new_message(event): |
||||||
|
await message_handler(event) |
||||||
|
|
||||||
|
|
||||||
|
client.start() |
||||||
|
client.run_until_disconnected() |
@ -0,0 +1,6 @@ |
|||||||
|
TG_API_ID = '' |
||||||
|
TG_API_HASH = '' |
||||||
|
|
||||||
|
DREAM_API = '' |
||||||
|
|
||||||
|
PROTODREAM_URL = '' |
Loading…
Reference in new issue