pokemon-habit / utils.py
panda1835's picture
Update utils.py
058b8c2
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 get_pokemon_info(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 get_evolution_chain(dex):
# Fetch the Pokémon species data for Ivysaur
pokemon = pypokedex.get(dex=dex)
name = pokemon.name
species_url = f"https://pokeapi.co/api/v2/pokemon-species/{name}"
species_response = requests.get(species_url)
species_data = json.loads(species_response.text)
# Extract the evolution chain URL
evolution_chain_url = species_data['evolution_chain']['url']
# Fetch the evolution chain data
evolution_chain_response = requests.get(evolution_chain_url)
evolution_chain_data = json.loads(evolution_chain_response.text)
# Parse the evolution chain data and get the full list of evolutions
evolution_list = []
chain = evolution_chain_data['chain']
try:
while chain:
species_name = chain['species']['name']
evolution_list.append(pypokedex.get(name=species_name).dex)
if chain.get('evolves_to') != []:
chain = chain.get('evolves_to')[0]
else:
break
except Exception as e:
evolution_list = [name]
print(str(e))
return evolution_list
def can_evolve(dex, energy):
metadata = read_metadata()
if metadata["pokemon"][dex]["max_energy"] <= energy:
return True
else:
return False
def evolve_to(dex):
evolution_chain = get_evolution_chain(dex)
print(evolution_chain)
# If fully evolved
if dex == evolution_chain[-1]:
return None
else:
evolve_dex = evolution_chain[evolution_chain.index(dex) + 1]
name, description, image, sprite = get_pokemon_info(evolve_dex)
return {
evolve_dex: {
"name": name,
"image": image,
"sprite": sprite,
"description": description,
"energy": 0,
"max_energy": 100 + 20*(evolution_chain.index(dex) + 1),
"visible": True
}
}
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 not in the team and the first level
if (dex not in all_dex) and (dex == get_evolution_chain(dex)[0]):
name, description, image, sprite = get_pokemon_info(dex)
break
random_pokemon = {
dex: {
"name": name,
"image": image,
"sprite": sprite,
"description": description,
"energy": 0,
"max_energy": 100,
"visible": True
}
}
return random_pokemon
def add_new_pokemon(new_pokemon):
metadata = read_metadata()
metadata["pokemon"].update(new_pokemon)
save_metadata(metadata)
return metadata
def is_lucky(streak):
if (streak == 2) or (streak == 3):
return True
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']
if (metadata["streak"] == 2) or (metadata["streak"] == 3):
random_number = 1
else:
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*2)
def new_streak(intensity):
metadata = read_metadata()
metadata["streak"] += 1
streak = metadata["streak"]
save_metadata(metadata)
reward = ""
date1 = datetime.datetime.today()
date2 = datetime.datetime.strptime(metadata["last_streak_day"], "%d/%m/%Y")
delta = date1 - date2
distance = delta.days
if (distance >= 3):
metadata = {
"streak": 0,
"total_minifigure": 0,
"donation": [
{
"wildact": {
"donation_link": "https://www.wildact-vn.org/en/support-us/donate/",
"image": "https://a-us.storyblok.com/f/1014782/567x567/7338612d04/wa_logo-2023-vn.png"
}
}
],
"last_streak_day": datetime.datetime.today().strftime("%d/%m/%Y"),
"money": 0,
"pokemon": {
"4": {
"name": "Charmander",
"image": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/4.png",
"sprite": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png",
"description": "Obviously prefers hot places. When it rains, steam is said to spout from the tip of its tail.",
"energy": 0,
"max_energy": 100,
"visible": True
}
},
"wishlist": [
"https://u6wdnj9wggobj.vcdn.cloud/media/catalog/product/cache/a237138a07ed0dd2cc8a6fa440635ea6/7/6/76414_copy_0.jpg",
"https://u6wdnj9wggobj.vcdn.cloud/media/catalog/product/cache/a237138a07ed0dd2cc8a6fa440635ea6/6/0/60302_7_.jpg"
]
}
save_metadata(metadata)
return "# 🔥🔥🔥 YOU SKIP 1 DAYYYYYY. EVERYTHING IS BURNTTTTTT. ALL YOUR FRIENDS ARE VANISHINGGGGG 🔥🔥🔥"
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 awarded {gift_str} 🎁.\n\n \n\n"
# Update new reward
metadata = read_metadata()
all_dex = get_all_pokemon_dex()
while True:
random_dex = all_dex[random.randint(0, len(all_dex) - 1)]
if metadata["pokemon"][random_dex]["visible"] == True:
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 \n\n"
if can_evolve(random_dex, metadata["pokemon"][random_dex]["energy"]):
metadata["pokemon"][random_dex]["visible"] = False
evolve_pokemon = evolve_to(int(random_dex))
if evolve_pokemon: # if not None, aka get max level
evolve_dex = list(evolve_pokemon.keys())[0]
metadata["pokemon"].update(evolve_pokemon)
reward += f"Your **{metadata['pokemon'][random_dex]['name']}** has just evolved into **{metadata['pokemon'][evolve_dex]['name']}**. Hoorayyyyy!!! 🥳.\n\n \n\n"
break
metadata["last_streak_day"] = datetime.datetime.today().strftime("%d/%m/%Y")
save_metadata(metadata)
is_first_day_of_week = datetime.date.today().weekday() == 0
if is_first_day_of_week:
while True: # Random pokemon not in the list
new_pokemon = random_pokemon()
dex = list(new_pokemon.keys())[0]
if str(dex) not in get_all_pokemon_dex():
break
add_new_pokemon(new_pokemon)
reward += f"**{new_pokemon[dex]['name']}** has joined with your family!!!"
return reward