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 = ( "
" + 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()