Spaces:
Runtime error
Runtime error
Upload 2 files
Browse files
app.py
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import pypokedex
|
3 |
+
import json
|
4 |
+
import utils
|
5 |
+
|
6 |
+
streaks = utils.get_streak()
|
7 |
+
pokemons = utils.get_pokemon()
|
8 |
+
|
9 |
+
def new_streak(intensity):
|
10 |
+
global pokemons
|
11 |
+
pokemons = utils.get_pokemon()
|
12 |
+
|
13 |
+
reward = utils.new_streak(intensity)
|
14 |
+
new_streak = utils.get_streak()
|
15 |
+
return f"{new_streak} streak days", '## ' + '✅ ' * new_streak, reward
|
16 |
+
|
17 |
+
# def update_pokemon_gallery():
|
18 |
+
# pokemon_exps = []
|
19 |
+
|
20 |
+
# pokemons = utils.get_pokemon()
|
21 |
+
# for dex in pokemons.keys():
|
22 |
+
# info = gr.Markdown(f"**EXP**: {utils.get_poke_energy(dex)}")
|
23 |
+
# pokemon_exps.append(info)
|
24 |
+
# return pokemon_exps
|
25 |
+
|
26 |
+
with gr.Blocks() as demo:
|
27 |
+
|
28 |
+
gr.Markdown('<h1 style="text-align: center;">PokeVerse</h1>')
|
29 |
+
reward_md = gr.Markdown()
|
30 |
+
winning_btn = gr.Button("Are you winning today? 💪")
|
31 |
+
intensity = gr.Slider(0, 3, step=1, label="Intensity")
|
32 |
+
streak_md = gr.Markdown(f"{streaks} streak days")
|
33 |
+
streakboard = gr.Markdown('## ' + '✅ ' * streaks)
|
34 |
+
|
35 |
+
gr.Markdown('<h2 style="text-align: center;">My Poke Friends</h2>')
|
36 |
+
|
37 |
+
pokemon_exps = []
|
38 |
+
|
39 |
+
with gr.Row():
|
40 |
+
for dex in pokemons.keys():
|
41 |
+
with gr.Group():
|
42 |
+
with gr.Column(min_width=200) as poke_col:
|
43 |
+
gr.Image(pokemons[dex]['image'], show_label=False)
|
44 |
+
with gr.Accordion(pokemons[dex]['name'], open=False):
|
45 |
+
gr.Markdown(pokemons[dex]['description'])
|
46 |
+
info = gr.Markdown(f"**EXP**: {utils.get_poke_energy(dex)}")
|
47 |
+
pokemon_exps.append(info)
|
48 |
+
|
49 |
+
|
50 |
+
winning_btn.click(new_streak, inputs=[intensity], outputs=[streak_md, streakboard, reward_md])
|
51 |
+
# streak_md.change(update_pokemon_gallery, outputs=pokemon_exps)
|
52 |
+
demo.launch()
|
utils.py
ADDED
@@ -0,0 +1,225 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import random
|
2 |
+
import json
|
3 |
+
import pypokedex
|
4 |
+
import json
|
5 |
+
import datetime
|
6 |
+
import requests
|
7 |
+
from huggingface_hub import login, HfApi
|
8 |
+
import os
|
9 |
+
|
10 |
+
hf_token = os.environ["HF_TOKEN"]
|
11 |
+
|
12 |
+
login(hf_token)
|
13 |
+
|
14 |
+
hfapi = HfApi()
|
15 |
+
|
16 |
+
metadata_url = "https://huggingface.co/spaces/panda1835/pokemon-data/raw/main/metadata.json"
|
17 |
+
|
18 |
+
def read_json_from_url(url):
|
19 |
+
try:
|
20 |
+
response = requests.get(url)
|
21 |
+
response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code
|
22 |
+
json_data = response.json()
|
23 |
+
return json_data
|
24 |
+
except requests.RequestException as e:
|
25 |
+
print(f"Error occurred: {e}")
|
26 |
+
return None
|
27 |
+
|
28 |
+
def read_metadata():
|
29 |
+
# Open the JSON file and read its contents
|
30 |
+
# with open("metadata.json", "r") as json_file:
|
31 |
+
# metadata = json.load(json_file)
|
32 |
+
|
33 |
+
metadata = read_json_from_url(metadata_url)
|
34 |
+
# Access the JSON data
|
35 |
+
return metadata
|
36 |
+
|
37 |
+
def save_metadata(metadata):
|
38 |
+
with open("metadata.json", "w") as json_file:
|
39 |
+
json.dump(metadata, json_file, indent=4)
|
40 |
+
try:
|
41 |
+
hfapi.upload_file(
|
42 |
+
path_or_fileobj="metadata.json",
|
43 |
+
path_in_repo="metadata.json",
|
44 |
+
repo_id="panda1835/pokemon-data",
|
45 |
+
repo_type="space",
|
46 |
+
)
|
47 |
+
return "### Data updated ✅"
|
48 |
+
except Exception as e:
|
49 |
+
return "❌ " + str(e)
|
50 |
+
|
51 |
+
def get_all_pokemon_dex():
|
52 |
+
metadata = read_metadata()
|
53 |
+
return list(metadata["pokemon"].keys())
|
54 |
+
|
55 |
+
def get_streak():
|
56 |
+
metadata = read_metadata()
|
57 |
+
return metadata["streak"]
|
58 |
+
|
59 |
+
def get_total_minifigure():
|
60 |
+
metadata = read_metadata()
|
61 |
+
return metadata["total_minifigure"]
|
62 |
+
|
63 |
+
def get_money():
|
64 |
+
metadata = read_metadata()
|
65 |
+
return metadata["money"]
|
66 |
+
|
67 |
+
def get_pokemon():
|
68 |
+
metadata = read_metadata()
|
69 |
+
return metadata["pokemon"]
|
70 |
+
|
71 |
+
def get_pokemon_by_dex(dex):
|
72 |
+
metadata = read_metadata()
|
73 |
+
return metadata["pokemon"][dex]
|
74 |
+
|
75 |
+
def get_donation():
|
76 |
+
metadata = read_metadata()
|
77 |
+
return metadata["donation"]
|
78 |
+
|
79 |
+
def get_wishlist():
|
80 |
+
metadata = read_metadata()
|
81 |
+
return metadata["wishlist"]
|
82 |
+
|
83 |
+
def get_poke_energy(dex):
|
84 |
+
metadata = read_metadata()
|
85 |
+
return metadata["pokemon"][dex]["energy"]
|
86 |
+
|
87 |
+
def pokemon(dex):
|
88 |
+
pokemon = pypokedex.get(dex=dex)
|
89 |
+
description = pokemon.get_descriptions()
|
90 |
+
try:
|
91 |
+
description = description[list(description.keys())[0]].replace('\n', ' ')
|
92 |
+
except:
|
93 |
+
description = "Not yet understood"
|
94 |
+
name = pokemon.name.capitalize()
|
95 |
+
image = list(pokemon.other_sprites.values())[2].front['default']
|
96 |
+
try:
|
97 |
+
sprite = pokemon.sprites.front['default']
|
98 |
+
except:
|
99 |
+
sprite = None
|
100 |
+
return name, description, image, sprite
|
101 |
+
|
102 |
+
def random_pokemon():
|
103 |
+
min_dex = 1
|
104 |
+
max_dex = 1017
|
105 |
+
|
106 |
+
all_dex = get_all_pokemon_dex()
|
107 |
+
while True:
|
108 |
+
dex = random.randint(min_dex, max_dex)
|
109 |
+
if dex not in all_dex:
|
110 |
+
name, description, image, sprite = pokemon(dex)
|
111 |
+
break
|
112 |
+
|
113 |
+
random_pokemon = {
|
114 |
+
dex: {
|
115 |
+
"name": name,
|
116 |
+
"image": image,
|
117 |
+
"sprite": sprite,
|
118 |
+
"description": description,
|
119 |
+
"energy": 0
|
120 |
+
}
|
121 |
+
}
|
122 |
+
|
123 |
+
return random_pokemon
|
124 |
+
|
125 |
+
def add_new_pokemon(new_pokemon):
|
126 |
+
metadata = read_metadata()
|
127 |
+
dex = list(new_pokemon.keys())[0]
|
128 |
+
metadata["pokemon"][dex] = new_pokemon[dex]
|
129 |
+
return metadata
|
130 |
+
|
131 |
+
def is_lucky(streak):
|
132 |
+
|
133 |
+
p = (-0.0274 * streak + 30) / 100
|
134 |
+
|
135 |
+
# Generate a random number from the Bernoulli distribution
|
136 |
+
random_number = random.choices([0, 1], weights=[1-p, p])[0]
|
137 |
+
|
138 |
+
return random_number == 1
|
139 |
+
|
140 |
+
def lucky_draw():
|
141 |
+
"""Placeholder
|
142 |
+
0 = 50 energy
|
143 |
+
1 = a new pokemon
|
144 |
+
2 = money
|
145 |
+
3 = minifigure
|
146 |
+
"""
|
147 |
+
metadata = read_metadata()
|
148 |
+
gifts = ['energy', 'pokemon', 'money', 'minifigure']
|
149 |
+
random_number = random.choices([0, 1, 2, 3], weights=[0.3, 0.3, 0.3, 0.1])[0]
|
150 |
+
|
151 |
+
gift = gifts[random_number]
|
152 |
+
if gift == 'money':
|
153 |
+
money = random.choices([20000, 50000, 100000], weights=[0.4, 0.4, 0.4])[0]
|
154 |
+
|
155 |
+
metadata["money"] += money
|
156 |
+
save_metadata(metadata)
|
157 |
+
|
158 |
+
return ('money', money)
|
159 |
+
|
160 |
+
elif gift == 'pokemon':
|
161 |
+
new_pokemon = random_pokemon()
|
162 |
+
metadata = add_new_pokemon(new_pokemon)
|
163 |
+
save_metadata(metadata)
|
164 |
+
return ("pokemon", new_pokemon)
|
165 |
+
|
166 |
+
elif gift == 'energy':
|
167 |
+
all_dex = get_all_pokemon_dex()
|
168 |
+
random_dex = random.choice(all_dex)
|
169 |
+
metadata["pokemon"][random_dex]["energy"] += 50
|
170 |
+
save_metadata(metadata)
|
171 |
+
return ('energy', random_dex, 50)
|
172 |
+
|
173 |
+
else:
|
174 |
+
metadata["total_minifigure"] += 1
|
175 |
+
save_metadata(metadata)
|
176 |
+
return ('minifigure', 'https://u6wdnj9wggobj.vcdn.cloud/media/catalog/product/cache/a237138a07ed0dd2cc8a6fa440635ea6/7/1/71034_3_.jpg')
|
177 |
+
|
178 |
+
|
179 |
+
def poke_energy(streak, intensity):
|
180 |
+
return round(7 + streak/60 + intensity)
|
181 |
+
|
182 |
+
def new_streak(intensity):
|
183 |
+
metadata = read_metadata()
|
184 |
+
metadata["streak"] += 1
|
185 |
+
streak = metadata["streak"]
|
186 |
+
reward = ""
|
187 |
+
|
188 |
+
if is_lucky(streak):
|
189 |
+
gift = lucky_draw()
|
190 |
+
if gift[0] == 'money':
|
191 |
+
gift_str = f"{gift[1]} VND"
|
192 |
+
|
193 |
+
if gift[0] == 'pokemon':
|
194 |
+
new_pokemon = gift[1]
|
195 |
+
dex = list(new_pokemon.keys())[0]
|
196 |
+
gift_str = f"**{new_pokemon[dex]['name']}**"
|
197 |
+
|
198 |
+
if gift[0] == 'minifigure':
|
199 |
+
gift_str = "a minifigure"
|
200 |
+
|
201 |
+
if gift[0] == 'energy':
|
202 |
+
gift_str = f"{gift[2]} energy point to {get_pokemon_by_dex(gift[1])['name']}"
|
203 |
+
|
204 |
+
reward += f"**Lucky*!!!* You are rewarded {gift_str}.\n\n"
|
205 |
+
|
206 |
+
# Update new reward
|
207 |
+
metadata = read_metadata()
|
208 |
+
|
209 |
+
all_dex = get_all_pokemon_dex()
|
210 |
+
random_dex = random.choice(all_dex)
|
211 |
+
energy = poke_energy(streak, intensity)
|
212 |
+
metadata["pokemon"][random_dex]["energy"] += energy
|
213 |
+
reward += f"Your **{metadata['pokemon'][random_dex]['name']}** has just got **{energy} EXP**.\n\n"
|
214 |
+
|
215 |
+
save_metadata(metadata)
|
216 |
+
|
217 |
+
is_first_day_of_week = datetime.date.today().weekday() == 0
|
218 |
+
if is_first_day_of_week:
|
219 |
+
new_pokemon = random_pokemon()
|
220 |
+
add_new_pokemon(new_pokemon)
|
221 |
+
dex = list(new_pokemon.keys())[0]
|
222 |
+
reward += f"**{new_pokemon[dex]['name']}** has joined with your family!!!"
|
223 |
+
|
224 |
+
return reward
|
225 |
+
|