File size: 5,025 Bytes
4f69797
 
e444e3b
9227ae5
e444e3b
 
 
 
 
9227ae5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59c23dd
e444e3b
9227ae5
 
 
 
 
 
 
 
 
 
 
59c23dd
385222f
9227ae5
59c23dd
 
 
 
 
 
 
 
 
9227ae5
385222f
e444e3b
385222f
 
 
e444e3b
9227ae5
 
385222f
59c23dd
 
9227ae5
 
 
4b5f2cf
 
 
 
9227ae5
 
4b5f2cf
 
 
9227ae5
 
59c23dd
9227ae5
59c23dd
 
9227ae5
 
 
 
59c23dd
e444e3b
9227ae5
 
 
59c23dd
 
e444e3b
 
 
 
9227ae5
 
59c23dd
 
9227ae5
59c23dd
 
e444e3b
9227ae5
4b5f2cf
9227ae5
e444e3b
59c23dd
385222f
 
 
 
 
 
 
039d478
385222f
 
 
59c23dd
e444e3b
59c23dd
55c3782
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
import os
os.system("pip install gradio==3.46.0")
import gradio as gr
import pandas as pd
import random
import json

with open('pokemon.json', 'r') as f:
    pokemons = json.load(f)
pokemons_types = ["λͺ¨λ“  νƒ€μž…"] + sorted(set([t for poke in pokemons for t in poke['types']]))
df = pd.DataFrame(pokemons)
GEN_RANGE = {
    "λͺ¨λ“  μ„ΈλŒ€": [1, 1017],
    "1μ„ΈλŒ€": [1, 151],
    "2μ„ΈλŒ€": [152, 251],
    "3μ„ΈλŒ€": [252, 386],
    "4μ„ΈλŒ€": [387, 493],
    "5μ„ΈλŒ€": [494, 649],
    "6μ„ΈλŒ€": [650, 721],
    "7μ„ΈλŒ€": [722, 809],
    "8μ„ΈλŒ€": [810, 905],
    "9μ„ΈλŒ€": [906, 1017]
}

USERS = ["June", "Sean", "Woojoo", "Taejoo", "Dummy"]
QUESTION_TEMPLATE = {"question": "λ‹€μŒ 포켓λͺ¬μ˜ 이름은 λ­˜κΉŒμš”?![]({img_url})", "answer": "{name}"}

def get_question_answer(pokemons_set):
    chosen = random.choice(pokemons_set)
    name = chosen['name']
    image_path = chosen['image_path']
    answer.value = QUESTION_TEMPLATE['answer'].format(name=name)
    img_url = f"https://huggingface.co/spaces/yoon-gu/pokemon/resolve/main/{image_path}"
    q = QUESTION_TEMPLATE["question"].format(img_url=img_url)
    a = QUESTION_TEMPLATE['answer'].format(name=name)
    return q, a

info = {u: {"done" : True, "score": 0, "count": 0} for u in USERS}

MD = """# 포켓λͺ¬ ν€΄μ¦ˆ
## μ‚¬μš©λ°©λ²•

1. μ‚¬μš©μžλ₯Ό μ„ νƒν•˜μ„Έμš”.
2. 총 ν€΄μ¦ˆ 개수λ₯Ό μ„ νƒν•˜μ„Έμš”.
3. 포켓λͺ¬ μ„ΈλŒ€λ₯Ό μ„ νƒν•˜μ„Έμš”.
4. 포켓λͺ¬ νƒ€μž…μ„ μ„ νƒν•˜μ„Έμš”.

## 점수판
{content}
"""

with gr.Blocks() as demo:
    if os.path.exists('info.json'):
        with open('info.json', 'r') as f:
            info = json.load(f)
    answer = gr.State(value="")
    with gr.Row():
        with gr.Column():
            markdown = gr.Markdown(MD.format(content='\n'.join([f"- {u}({v['score']:3.1f}점)" for u, v in info.items()])))
            user = gr.Radio(USERS, value="Dummy", label="μ‚¬μš©μž", info="당신은 λˆ„κ΅¬μ‹ κ°€μš”?")
            quiz_count = gr.Radio([10, 20, 30], value=10, label="총 ν€΄μ¦ˆ 개수", info="ν€΄μ¦ˆλ₯Ό λͺ‡ 개 ν’€ μ˜ˆμ •μΈκ°€μš”?")
        with gr.Column():
            with gr.Row():
                generation = gr.Dropdown(
                            [f"{k}μ„ΈλŒ€" for k in range(1, 10)] + ["λͺ¨λ“  μ„ΈλŒ€"],
                            value="λͺ¨λ“  μ„ΈλŒ€",
                            label="포켓λͺ¬ μ„ΈλŒ€",
                            info="μ›ν•˜λŠ” 포켓λͺ¬ μ„ΈλŒ€λ₯Ό μ„ νƒν•˜μ„Έμš”."
                        )
                poke_types = gr.Dropdown(
                            pokemons_types, value="λͺ¨λ“  νƒ€μž…",
                            label="포켓λͺ¬ νƒ€μž…",
                            info="μ›ν•˜λŠ” 포켓λͺ¬ νƒ€μž…μ„ μ„ νƒν•˜μ„Έμš”."
                    )
            chatbot = gr.Chatbot(bubble_full_width=False)
            msg = gr.Textbox(value="ν€΄μ¦ˆ μ‹œμž‘", label="λ‹΅")

    def respond(user, quiz_count, gen, types, message, chat_history, request: gr.Request):
        done = info[user]['done']
        start, end = GEN_RANGE[gen]
        sdf = df[start:end]
        pokemons_set = sdf[sdf['types'].apply(lambda x: (types in x)) | (types == "λͺ¨λ“  νƒ€μž…")]
        pokemons_set = pokemons_set.to_dict("records")
        if done:
            if "ν€΄μ¦ˆ μ‹œμž‘" == message:
                q, a = get_question_answer(pokemons_set)
                bot_message = f"ν€΄μ¦ˆλ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.\n{q}"
                answer.value = a
                info[user]['done'] = False
                info[user]['count'] = 0
            else:
                bot_message = "ν€΄μ¦ˆλ₯Ό μ‹œμž‘ν•˜κ³  μ‹ΆμœΌμ‹œλ©΄, **ν€΄μ¦ˆ μ‹œμž‘**이라고 λ§μ”€ν•΄μ£Όμ„Έμš”."
        else:
            if answer.value == message:
                q, a = get_question_answer(pokemons_set)
                answer.value = a
                info[user]['score'] += 1
                info[user]['count'] += 1
                bot_message = f"πŸŽ‰μ •λ‹΅μž…λ‹ˆλ‹€! λ‹€μŒ λ¬Έμ œμž…λ‹ˆλ‹€.\n{q}"
                if quiz_count == info[user]['count']:
                    bot_message = f"λͺ¨λ“  ν€΄μ¦ˆλ₯Ό λ‹€ ν’€μ—ˆμŠ΅λ‹ˆλ‹€. μ μˆ˜λŠ” {info[user]['score']}점 μž…λ‹ˆλ‹€."
            else:
                bot_message = f"***{message}***!? 🧐 λ‹€μ‹œ ν•œλ²ˆ μƒκ°ν•΄λ³΄μ„Έμš”."
                info[user]['score'] -= 0.1

        chat_history.append((message, bot_message))
        print(info)
        with open('info.json', 'w') as f:
            json.dump(info, f, ensure_ascii=False, indent=4)
        with open('info.json', 'r') as f:
            info_ = json.load(f)
            from pprint import pprint
            pprint(info_)
        return "", chat_history, MD.format(content='\n'.join([f"- {u}({v['score']:3.1f}점)" for u, v in info.items()]))
    
    demo.load(lambda : MD.format(content='\n'.join([f"- {u}({v['score']:3.1f}점)" for u, v in info.items()])),
              inputs=None,
              outputs=markdown)
    msg.submit(respond, [user, quiz_count, generation, poke_types, msg, chatbot], [msg, chatbot, markdown])

demo.queue(concurrency_count=1)
demo.launch()