Game-Creator / app.py
Omnibus's picture
Update app.py
df5c2e7
import gradio as gr
import diff
import os
from PIL import Image
import uuid
import random
import bg
from rembg import remove as rm
import datetime
from huggingface_hub import (HfApi,file_exists)
import uuid
import json
import requests
uid=uuid.uuid4()
proc1=diff
proc2=diff
this_url='https://omnibus-game-test.hf.space/'
save_data='https://huggingface.co/datasets/Omnibus/game-data-1/raw/main/'
token_self = os.environ['HF_TOKEN']
api=HfApi(token=token_self)
sky = "https://huggingface.co/spaces/Omnibus/game-test/resolve/main/assets/sky.png"
star = 'https://huggingface.co/spaces/Omnibus/game-test/resolve/main/assets/star.png'
bomb = 'https://huggingface.co/spaces/Omnibus/game-test/resolve/main/assets/bomb.png'
platform = 'https://huggingface.co/spaces/Omnibus/game-test/resolve/main/assets/platform.png'
dude = 'https://huggingface.co/spaces/Omnibus/game-test/resolve/main/assets/dude.png'
get_window_url_params = """
function(text_input, url_params) {
console.log(text_input, url_params);
const params = new URLSearchParams(window.location.search);
url_params = Object.fromEntries(params);
return [text_input, url_params];
}
"""
def game_fn(sky=sky,star=star,bomb=bomb,platform=platform,dude=dude):
html_mod=f"""
<div id="my_game" style="height:600px;width:100%">
<iframe
id="myIframe"
src="https://omnibus-game-test.hf.space/file=game.html?sky={sky}&platform={platform}&star={star}&bomb={bomb}&dude={dude}"
frameborder="0"
width="100%"
height="100%"
></iframe>
</div>"""
return gr.HTML.update(f'{html_mod}')
def update_game(inp):
return game_fn(sky=sky)
def sky_fn(inp):
uid=uuid.uuid4()
rand = random.randint(1,200)
for i in range(rand):
inp+=" "
#uid=uuid.uuid4()
output=proc1.send_it(inp,5,1)
print(output)
outp=Image.open(output[0])
width, height = outp.size
rat = width/height
if width > height:
outrs = outp.resize((600*rat,600))
elif width < height:
outrs = outp.resize((800,800*rat))
else:
outrs = outp.resize((800,536))
outrs.save(f"{uid}_sky.png")
out = os.path.abspath(f"{uid}_sky.png")
#out = os.path.abspath(outp)
out_url = f'https://omnibus-game-test.hf.space/file={out}'
return outp,out_url,inp,rand
def star_fn(inp):
uid=uuid.uuid4()
rand = random.randint(1,200)
for i in range(rand):
inp+=" "
#uid=uuid.uuid4()
output=proc2.send_it(inp,5,1)
outp=Image.open(output[0])
out=rm(outp)
outrs = out.resize((36,36))
outrs.save(f"{uid}_star.png")
out_file = os.path.abspath(f"{uid}_star.png")
out_url = f'https://omnibus-game-test.hf.space/file={out_file}'
return out,out_url,inp,rand
def enemy_fn(inp):
uid=uuid.uuid4()
rand = random.randint(1,200)
for i in range(rand):
inp+=" "
#uid=uuid.uuid4()
output=proc2.send_it(inp,5,1)
outp=Image.open(output[0])
out=rm(outp)
outrs = out.resize((24,24))
outrs.save(f"{uid}_enemy.png")
out_file = os.path.abspath(f"{uid}_enemy.png")
out_url = f'https://omnibus-game-test.hf.space/file={out_file}'
return out,out_url,inp,rand
def save_game(name,score,sky_im,star_im,enemy_im,sky_p,star_p,enemy_p,background_s,star_s,enemy_s):
sky_im=sky_im.split("app/",1)[1]
star_im=star_im.split("app/",1)[1]
#sky_im=sky_im.split("app/",1)[1]
print(star_im)
user_repo=save_data.split('datasets/',1)[1].split('/raw',1)[0]
timestamp=str(datetime.datetime.now())
timename=timestamp.replace(" ","--").replace(":","-").replace(".","-")
if name != "":
if file_exists(f"{user_repo}", f"games/{name}.omnigame",repo_type="dataset"):
return "Game Saved with this Name. Choose a different Name."
else:
game=name
else:
game=timename
#out_lod=[]
try:
r = requests.get(f'{save_data}game_data.json')
lod = json.loads(r.text)
#out_lod.append(lod)
except:
lod=[]
pass
try:
api.upload_file(
path_or_fileobj=sky_im,
path_in_repo=f"{save_data.split('main/',1)[1]}/images/background/{game}-background_img.png",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
except Exception as e:
print (e)
pass
try:
api.upload_file(
path_or_fileobj=star_im,
path_in_repo=f"{save_data.split('main/',1)[1]}/images/star/{game}-star_img.png",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
except Exception as e:
print (e)
pass
try:
api.upload_file(
path_or_fileobj=enemy_im.split("app/",1)[1],
path_in_repo=f"{save_data.split('main/',1)[1]}/images/enemy/{game}-enemy_img.png",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
except Exception as e:
print (e)
pass
try:
api.upload_file(
path_or_fileobj="assets/platform.png",
path_in_repo=f"{save_data.split('main/',1)[1]}/images/platform/{game}-platform_img.png",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
except Exception as e:
print (e)
pass
try:
api.upload_file(
path_or_fileobj="assets/dude.png",
path_in_repo=f"{save_data.split('main/',1)[1]}/images/dude/{game}-dude_img.png",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
except Exception as e:
print (e)
pass
block = {'index': len(lod) + 1,
'timestamp': timestamp,
'game_name': game,
'score': score,
'background_p': sky_p,
'star_p': star_p,
'enemy_p': enemy_p,
'background_s': background_s,
'star_s': star_s,
'enemy_s': enemy_s,
'background_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/background/{game}-background_img.png',
'star_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/star/{game}-star_img.png',
'enemy_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/enemy/{game}-enemy_img.png',
'platform_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/platform/{game}-platform_img.png',
'dude_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/dude/{game}-dude_img.png',
}
print(block)
lod.append(block)
json_object = json.dumps(lod, indent=4)
with open("tmp1.json", "w") as outfile:
outfile.write(json_object)
try:
api.upload_file(
path_or_fileobj="tmp1.json",
path_in_repo=f"{save_data.split('main/',1)[1]}/game_data.json",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
os.remove("tmp1.json")
print("success")
except Exception as e:
print (e)
return f'Error Saving Game: {e}'
game_box=[]
block2 = {'game_name': game,
'score':score,
'timestamp': timestamp,
'background_p': sky_p,
'star_p': star_p,
'enemy_p': enemy_p,
'background_s': background_s,
'star_s': star_s,
'enemy_s': enemy_s,
'background_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/background/{game}-background_img.png',
'star_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/star/{game}-star_img.png',
'enemy_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/enemy/{game}-enemy_img.png',
'platform_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/platform/{game}-platform_img.png',
'dude_url': f'https://huggingface.co/datasets/{user_repo}/resolve/main/images/dude/{game}-dude_img.png',
}
print(block)
game_box.append(block2)
json_object = json.dumps(game_box, indent=4)
with open("tmp2.json", "w") as outfile:
outfile.write(json_object)
try:
api.upload_file(
path_or_fileobj="tmp2.json",
path_in_repo=f"{save_data.split('main/',1)[1]}/games/{game}.omnigame",
repo_id=save_data.split('datasets/',1)[1].split('/raw',1)[0],
token=token_self,
repo_type="dataset",
)
os.remove("tmp2.json")
print("success")
game_url=f'{this_url}?game={game}'
except Exception as e:
print (e)
return f'Error Saving Game: {e}'
return f"Game Saved<br>URL: <a href={game_url}>{game_url}</a>"
def predict(text, url_params):
load_game=url_params.get('game')
print (f'load_game::{load_game}')
if load_game != None:
try:
r = requests.get(f'{save_data}games/{load_game}.omnigame')
lod = json.loads(r.text)
game_html=game_fn(lod[0]['background_url'],lod[0]['star_url'],lod[0]['enemy_url'])
#out_lod.append(lod)
print (lod)
print (game_html)
return "" + text + "",game_html
except Exception as e:
print(f"cannot load game. Error::{e}")
pass
else:
pass
return ["" + text + "", ""]
def get_high_score():
try:
r = requests.get(f'{save_data}game_data.json')
lod = json.loads(r.text)
high_score=[0,0,0]
sort_score=[0,0,0]
#print(sort_score)
for ea in lod:
try:
if ea['score'] != "":
if int(ea['score']) >= int(sort_score[0]):
sort_score[2]=sort_score[1]
high_score[2]=high_score[1]
sort_score[1]=sort_score[0]
high_score[1]=high_score[0]
sort_score[0]=ea['score']
high_score[0]=(f"{ea['score']}<br>{ea['game_name']}<br><br>")
pass
elif int(ea['score']) >= int(sort_score[1]):
sort_score[2]=sort_score[1]
high_score[2]=high_score[1]
sort_score[1]=ea['score']
high_score[1]=(f"{ea['score']}<br>{ea['game_name']}<br><br>")
pass
elif int(ea['score']) >= int(sort_score[2]):
sort_score[2]=ea['score']
high_score[2]=(f"{ea['score']}<br>{ea['game_name']}<br><br>")
pass
except Exception as e:
print(e)
pass
return f"<h3><u>High Score</u></h3><br>{high_score[0]}<br>{high_score[1]}<br>{high_score[2]}<br>"
except Exception as e:
return e
score_js="""
function(text_input) {
console.log(text_input);
const iframe = document.getElementById("myIframe").contentWindow.document.getElementById('my_score').innerHTML;
console.log(iframe);
return [iframe];
}
"""
with gr.Blocks() as app:
with gr.Row():
with gr.Column():
prompt_sky=gr.Textbox(label="Background",value="beautiful landscape, real, 8k")
btn_sky=gr.Button("Make")
out_im_sky=gr.Image(type='filepath')
out_sky_url=gr.Textbox(visible=False)
with gr.Column():
prompt_star=gr.Textbox(label="Star",value="Colorful Star, blank background")
btn_star=gr.Button("Make")
out_im_star=gr.Image(type='filepath')
out_star_url=gr.Textbox(visible=False)
with gr.Column():
prompt_enemy=gr.Textbox(label="Enemy",value="Ball on fire, blank background")
btn_enemy=gr.Button("Make")
out_im_enemy=gr.Image(type='filepath')
out_enemy_url=gr.Textbox(visible=False)
gr.Column()
gr.Column()
with gr.Row():
update_game=gr.Button("Load Game")
#start_prompt=gr.Textbox(value="beautiful landscape, real, 8k",visible=False)
with gr.Row():
with gr.Column(scale=3):
html_game = gr.HTML()
with gr.Column(scale=1):
score_html =gr.HTML()
with gr.Row():
game_name=gr.Textbox(label="Name for Game (optional)")
save_btn=gr.Button("Save")
message=gr.HTML()
with gr.Row(visible=False):
get_score=gr.Button("Get Score")
score=gr.Textbox()
#url_params=gr.Textbox()
with gr.Row(visible=False):
text_input=gr.Textbox()
url_params = gr.JSON({}, visible=True, label="")
acc=gr.Textbox()
with gr.Row(visible=False):
sky_p=gr.Textbox()
star_p=gr.Textbox()
enemy_p=gr.Textbox()
sky_s=gr.Textbox()
star_s=gr.Textbox()
enemy_s=gr.Textbox()
get_high_score_btn=gr.Button()
def return_score(text):
return text
def refresh_frame():
return None
get_high_score_btn.click(get_high_score,None,score_html)
get_score.click(return_score,score,[score],_js=score_js)
save_btn.click(return_score,score,[score],_js=score_js).then(save_game,[game_name,score,out_sky_url,out_star_url,out_enemy_url,sky_p,star_p,enemy_p,sky_s,star_s,enemy_s],message)
update_game.click(refresh_frame,None,html_game).then(game_fn,[out_sky_url,out_star_url,out_enemy_url],html_game).then(get_high_score,None,score_html)
btn_sky.click(sky_fn,prompt_sky,[out_im_sky,out_sky_url,sky_p,sky_s])
btn_star.click(star_fn,prompt_star,[out_im_star,out_star_url,star_p,star_s])
btn_enemy.click(enemy_fn,prompt_enemy,[out_im_enemy,out_enemy_url,enemy_p,enemy_s])
app.load(predict,[text_input,url_params],[text_input,html_game], _js=get_window_url_params)
#app.load(sky_fn,prompt_sky,[out_im_sky,out_sky_url]).then(game_fn,[out_sky_url],html_game)
app.queue(concurrency_count=10).launch()