File size: 4,352 Bytes
62b3eea
cfdf3bc
62b3eea
273f76c
 
 
4e6be8d
a5a667b
5784cf3
 
7b96f10
83e7365
5784cf3
273f76c
 
62b3eea
7b96f10
de7f21d
1638084
de7f21d
cfdf3bc
 
 
 
7b96f10
 
 
cfdf3bc
7b96f10
 
 
 
 
024e4ed
033e6c5
 
024e4ed
cfdf3bc
de7f21d
273f76c
 
de7f21d
8e9bd24
d79f5f2
273f76c
11254d8
 
9acbebf
11254d8
57e2032
11254d8
57e2032
11254d8
 
 
 
 
 
 
57e2032
11254d8
57e2032
11254d8
 
 
 
 
 
273f76c
b002f06
39977eb
e3d42b8
b002f06
11254d8
 
b002f06
11254d8
 
273f76c
013e105
00cd8e1
 
 
9dae054
013e105
 
 
 
 
 
 
 
de7f21d
013e105
 
 
 
 
 
 
11254d8
 
273f76c
2bbbf6e
 
 
 
9dae054
273f76c
d79f5f2
 
26e6bb5
2bbbf6e
 
 
26ab58a
106b011
d79f5f2
5784cf3
4f341ae
7b96f10
 
 
bd68530
00cd8e1
26ab58a
07dc7e1
 
106b011
26ab58a
07dc7e1
83e7365
273f76c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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.utils import (
    get_content,
    render_player_data,
    save_latest_player_data,
)

seafoam = Seafoam()


def get_player_info(player_backend_user_id):
    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(),
        )
        new_player.add_badge("participation_star")
        new_player.update_rewards_status("participation_star", target="is_issued", value=True)
        new_player.update_rewards_status("participation_star", target="is_completed", value=True)

        return new_player.to_dict()


# start of gradio interface
with gr.Blocks(theme=seafoam, css=get_content("css/style.css")) as demo:
    player_info = gr.State()

    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):
            with gr.Column(elem_id="adventure_container"):
                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
    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],
    )

    pull_newest_player_data.submit(
        save_latest_player_data,
        None,
        update_status,
        api_name="pull_newest_player_data",
    )

if __name__ == "__main__":
    demo.launch()