Spaces:
Runtime error
Runtime error
import random | |
import json | |
import pypokedex | |
import json | |
import datetime | |
import requests | |
from huggingface_hub import login, HfApi | |
import os | |
hf_token = os.environ["HF_TOKEN"] | |
login(hf_token) | |
hfapi = HfApi() | |
metadata_url = "https://huggingface.co/spaces/panda1835/pokemon-data/raw/main/metadata.json" | |
def read_json_from_url(url): | |
try: | |
response = requests.get(url) | |
response.raise_for_status() # Will raise an HTTPError if the HTTP request returned an unsuccessful status code | |
json_data = response.json() | |
return json_data | |
except requests.RequestException as e: | |
print(f"Error occurred: {e}") | |
return None | |
def read_metadata(): | |
# Open the JSON file and read its contents | |
# with open("metadata.json", "r") as json_file: | |
# metadata = json.load(json_file) | |
metadata = read_json_from_url(metadata_url) | |
# Access the JSON data | |
return metadata | |
def save_metadata(metadata): | |
with open("metadata.json", "w") as json_file: | |
json.dump(metadata, json_file, indent=4) | |
try: | |
hfapi.upload_file( | |
path_or_fileobj="metadata.json", | |
path_in_repo="metadata.json", | |
repo_id="panda1835/pokemon-data", | |
repo_type="space", | |
) | |
return "### Data updated ✅" | |
except Exception as e: | |
return "❌ " + str(e) | |
def get_all_pokemon_dex(): | |
metadata = read_metadata() | |
return list(metadata["pokemon"].keys()) | |
def get_streak(): | |
metadata = read_metadata() | |
return metadata["streak"] | |
def get_total_minifigure(): | |
metadata = read_metadata() | |
return metadata["total_minifigure"] | |
def get_money(): | |
metadata = read_metadata() | |
return metadata["money"] | |
def get_pokemon(): | |
metadata = read_metadata() | |
return metadata["pokemon"] | |
def get_pokemon_by_dex(dex): | |
metadata = read_metadata() | |
return metadata["pokemon"][dex] | |
def get_donation(): | |
metadata = read_metadata() | |
return metadata["donation"] | |
def get_wishlist(): | |
metadata = read_metadata() | |
return metadata["wishlist"] | |
def get_poke_energy(dex): | |
metadata = read_metadata() | |
return metadata["pokemon"][dex]["energy"] | |
def pokemon(dex): | |
pokemon = pypokedex.get(dex=dex) | |
description = pokemon.get_descriptions() | |
try: | |
description = description[list(description.keys())[0]].replace('\n', ' ') | |
except: | |
description = "Not yet understood" | |
name = pokemon.name.capitalize() | |
image = list(pokemon.other_sprites.values())[2].front['default'] | |
try: | |
sprite = pokemon.sprites.front['default'] | |
except: | |
sprite = None | |
return name, description, image, sprite | |
def random_pokemon(): | |
min_dex = 1 | |
max_dex = 1017 | |
all_dex = get_all_pokemon_dex() | |
while True: | |
dex = random.randint(min_dex, max_dex) | |
if dex not in all_dex: | |
name, description, image, sprite = pokemon(dex) | |
break | |
random_pokemon = { | |
dex: { | |
"name": name, | |
"image": image, | |
"sprite": sprite, | |
"description": description, | |
"energy": 0 | |
} | |
} | |
return random_pokemon | |
def add_new_pokemon(new_pokemon): | |
metadata = read_metadata() | |
dex = list(new_pokemon.keys())[0] | |
metadata["pokemon"][dex] = new_pokemon[dex] | |
return metadata | |
def is_lucky(streak): | |
p = (-0.0274 * streak + 30) / 100 | |
# Generate a random number from the Bernoulli distribution | |
random_number = random.choices([0, 1], weights=[1-p, p])[0] | |
return random_number == 1 | |
def lucky_draw(): | |
"""Placeholder | |
0 = 50 energy | |
1 = a new pokemon | |
2 = money | |
3 = minifigure | |
""" | |
metadata = read_metadata() | |
gifts = ['energy', 'pokemon', 'money', 'minifigure'] | |
random_number = random.choices([0, 1, 2, 3], weights=[0.3, 0.3, 0.3, 0.1])[0] | |
gift = gifts[random_number] | |
if gift == 'money': | |
money = random.choices([20000, 50000, 100000], weights=[0.4, 0.4, 0.4])[0] | |
metadata["money"] += money | |
save_metadata(metadata) | |
return ('money', money) | |
elif gift == 'pokemon': | |
new_pokemon = random_pokemon() | |
metadata = add_new_pokemon(new_pokemon) | |
save_metadata(metadata) | |
return ("pokemon", new_pokemon) | |
elif gift == 'energy': | |
all_dex = get_all_pokemon_dex() | |
random_dex = random.choice(all_dex) | |
metadata["pokemon"][random_dex]["energy"] += 50 | |
save_metadata(metadata) | |
return ('energy', random_dex, 50) | |
else: | |
metadata["total_minifigure"] += 1 | |
save_metadata(metadata) | |
return ('minifigure', 'https://u6wdnj9wggobj.vcdn.cloud/media/catalog/product/cache/a237138a07ed0dd2cc8a6fa440635ea6/7/1/71034_3_.jpg') | |
def poke_energy(streak, intensity): | |
return round(7 + streak/60 + intensity) | |
def new_streak(intensity): | |
metadata = read_metadata() | |
metadata["streak"] += 1 | |
streak = metadata["streak"] | |
reward = "" | |
if is_lucky(streak): | |
gift = lucky_draw() | |
if gift[0] == 'money': | |
gift_str = f"{gift[1]} VND" | |
if gift[0] == 'pokemon': | |
new_pokemon = gift[1] | |
dex = list(new_pokemon.keys())[0] | |
gift_str = f"**{new_pokemon[dex]['name']}**" | |
if gift[0] == 'minifigure': | |
gift_str = "a minifigure" | |
if gift[0] == 'energy': | |
gift_str = f"{gift[2]} energy point to {get_pokemon_by_dex(gift[1])['name']}" | |
reward += f"**Lucky*!!!* You are rewarded {gift_str}.\n\n" | |
# Update new reward | |
metadata = read_metadata() | |
all_dex = get_all_pokemon_dex() | |
random_dex = random.choice(all_dex) | |
energy = poke_energy(streak, intensity) | |
metadata["pokemon"][random_dex]["energy"] += energy | |
reward += f"Your **{metadata['pokemon'][random_dex]['name']}** has just got **{energy} EXP**.\n\n" | |
save_metadata(metadata) | |
is_first_day_of_week = datetime.date.today().weekday() == 0 | |
if is_first_day_of_week: | |
new_pokemon = random_pokemon() | |
add_new_pokemon(new_pokemon) | |
dex = list(new_pokemon.keys())[0] | |
reward += f"**{new_pokemon[dex]['name']}** has joined with your family!!!" | |
return reward | |