MESReport / app.py
ChenyuRabbitLove's picture
feat: make load final player data automatically
eb076d0
raw
history blame
4.73 kB
import json
import logging
import gradio as gr
from theme import Seafoam
from utils.mes_player_model import Player
from utils.mes_achievements import Achievement
from utils.mes_player_activity_model import PlayerActivity
from utils.utils import (
get_content,
render_player_data,
save_latest_player_data,
render_finished,
)
seafoam = Seafoam()
def get_player_info(player_backend_user_id):
try:
with open("latest_player_data.json", "r", encoding="utf-8") as file:
player_info = json.load(file)
except FileNotFoundError:
logging.error("No player data found. Loading new player data.")
save_latest_player_data()
with open("latest_player_data.json", "r", encoding="utf-8") as file:
player_info = json.load(file)
if player_backend_user_id in player_info:
return player_info[player_backend_user_id]
else:
logging.info(
f"No data found for player ID {player_backend_user_id}. Initializing new player data."
)
new_player = Player(
player_backend_user_id=player_backend_user_id,
init=True,
available_achievements=Achievement.get_available_achievements(),
)
return new_player.to_dict()
def create_new_player_activity():
return PlayerActivity()
# start of gradio interface
with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
player_info = gr.State()
player_activity_tracker = gr.State(create_new_player_activity)
with gr.Row():
with gr.Column(
scale=1,
elem_classes="gallery_container",
):
pet_description = gr.Markdown("# 夥伴", elem_id="pet_avatar_description")
pet_gallery = gr.Gallery(
[],
label="夥伴",
preview=False,
elem_id="pet_gallery",
columns=30,
height=200,
)
badge_description = gr.Markdown("# 徽章", elem_id="badge_avatar_description")
badge_gallery = gr.Gallery(
[],
label="徽章",
preview=False,
elem_id="badge_gallery",
columns=30,
height=200,
)
with gr.Column(scale=1, elem_id="player_avatar_container"):
avatar = gr.Image(
"avatar/blank_avatar.png",
elem_id="player_avatar",
)
avatar_description = gr.Markdown(
"# 光束守護者", elem_id="player_avatar_description"
)
with gr.Column(scale=1):
adventure_description = gr.Markdown(
"# 冒險階段", elem_id="adventure_description"
)
adventure = gr.Slider(
value=0,
show_label=False,
interactive=False,
elem_id="adventure_slider",
info="",
)
achievements_description = gr.Markdown(
"# 達成成就", elem_id="achievements_description"
)
achievements = gr.HighlightedText(
value=[],
elem_classes="achievements",
color_map={
"完成": "green",
"未完成": "red",
},
)
with gr.Row():
html = (
"<div style='max-width:100%; max-height:360px; overflow:auto'>"
+ get_content("htmls/adventure_blank.html")
)
adventure_log = gr.HTML(html, label="Adventure Log", elem_id="adventure_log")
# handling player info
with gr.Row():
player_backend_id = gr.Textbox("", elem_id="player_backend_id", visible=False)
player_info_query_btn = gr.Button(
"Query", elem_id="trigger_button", visible=False
)
pull_newest_player_data = gr.Textbox("", visible=False)
update_status = gr.Textbox("", visible=False)
# actions when player login
# define args
send_player_login_info = dict(
fn=render_finished,
inputs=[player_activity_tracker, player_info],
outputs=None,
)
player_info_query_btn.click(get_player_info, player_backend_id, player_info).then(
render_player_data,
player_info,
[avatar, pet_gallery, badge_gallery, adventure_log, achievements, adventure],
).then(**send_player_login_info)
pull_newest_player_data.submit(
save_latest_player_data,
None,
update_status,
api_name="pull_newest_player_data",
)
if __name__ == "__main__":
demo.launch()