Added player cache

This commit is contained in:
Cal Corum 2023-10-26 23:27:29 -05:00
parent 1c3e7ef148
commit e77172d1c3
3 changed files with 104 additions and 6 deletions

View File

@ -337,6 +337,15 @@ class Gameplay(commands.Cog):
game_state['pitcher'] = pitcher
game_state['catcher'] = catcher
game_state['channel_id'] = game.channel_id
if curr_play.inning_half == 'Top':
game_state['pitcher']['team'] = home_team
game_state['catcher']['team'] = home_team
game_state['batter']['team'] = away_team
else:
game_state['pitcher']['team'] = away_team
game_state['catcher']['team'] = away_team
game_state['batter']['team'] = home_team
logging.debug(f'game_state: {game_state}')
return game_state

View File

@ -1,3 +1,7 @@
import datetime
from dataclasses import dataclass
from typing import Optional
import requests
import logging
import json
@ -7,11 +11,73 @@ AUTH_TOKEN = {'Authorization': f'Bearer {os.environ.get("API_TOKEN")}'}
DB_URL = 'https://pd.manticorum.com/api'
master_debug = True
alt_database = True
PLAYER_CACHE = {}
if alt_database == 'dev':
DB_URL = 'https://pddev.manticorum.com/api'
@dataclass
class Player:
player_id: int
p_name: str
cost: int
image: str
mlbclub: str
franchise: str
cardset: dict
set_num: int
rarity: dict
pos_1: str
description: str
quantity: Optional[int] = 999
image2: Optional[str] = None
pos_2: Optional[str] = None
pos_3: Optional[str] = None
pos_4: Optional[str] = None
pos_5: Optional[str] = None
pos_6: Optional[str] = None
pos_7: Optional[str] = None
pos_8: Optional[str] = None
headshot: Optional[str] = None
vanity_card: Optional[str] = None
strat_code: Optional[str] = None
bbref_id: Optional[str] = None
fangr_id: Optional[str] = None
mlbplayer: Optional[dict] = None
created: datetime.datetime = datetime.datetime.now()
def to_dict(self):
return {
'player_id': self.player_id,
'p_name': self.p_name,
'cost': self.cost,
'image': self.image,
'mlbclub': self.mlbclub,
'franchise': self.franchise,
'cardset': self.cardset,
'set_num': self.set_num,
'rarity': self.rarity,
'pos_1': self.pos_1,
'description': self.description,
'quantity': self.quantity,
'image2': self.image2,
'pos_2': self.pos_2,
'pos_3': self.pos_3,
'pos_4': self.pos_4,
'pos_5': self.pos_5,
'pos_6': self.pos_6,
'pos_7': self.pos_7,
'pos_8': self.pos_8,
'headshot': self.headshot,
'vanity_card': self.vanity_card,
'strat_code': self.strat_code,
'bbref_id': self.bbref_id,
'fangr_id': self.fangr_id,
'mlbplayer': self.mlbplayer
}
def param_char(other_params):
if other_params:
return '&'
@ -19,7 +85,7 @@ def param_char(other_params):
return '?'
def get_req_url(endpoint: str, api_ver: int = 1, object_id: int = None, params: list = None):
def get_req_url(endpoint: str, api_ver: int = 2, object_id: int = None, params: list = None):
req_url = f'{DB_URL}/v{api_ver}/{endpoint}{"/" if object_id is not None else ""}{object_id if object_id is not None else ""}'
if params:
@ -31,7 +97,7 @@ def get_req_url(endpoint: str, api_ver: int = 1, object_id: int = None, params:
return req_url
async def db_get(endpoint: str, api_ver: int = 1, object_id: int = None, params: list = None, none_okay: bool = True,
async def db_get(endpoint: str, api_ver: int = 2, object_id: int = None, params: list = None, none_okay: bool = True,
timeout: int = 3):
req_url = get_req_url(endpoint, api_ver=api_ver, object_id=object_id, params=params)
log_string = f'get:\n{endpoint} id: {object_id} params: {params}'
@ -71,7 +137,7 @@ async def db_get(endpoint: str, api_ver: int = 1, object_id: int = None, params:
raise ValueError(f'DB: {resp.text}')
async def db_patch(endpoint: str, object_id: int, params: list, api_ver: int = 1, timeout: int = 3):
async def db_patch(endpoint: str, object_id: int, params: list, api_ver: int = 2, timeout: int = 3):
req_url = get_req_url(endpoint, api_ver=api_ver, object_id=object_id, params=params)
log_string = f'patch:\n{endpoint} {params}'
logging.info(log_string) if master_debug else logging.debug(log_string)
@ -102,7 +168,7 @@ async def db_patch(endpoint: str, object_id: int, params: list, api_ver: int = 1
raise ValueError(f'DB: {resp.text}')
async def db_post(endpoint: str, api_ver: int = 1, payload: dict = None, timeout: int = 3):
async def db_post(endpoint: str, api_ver: int = 2, payload: dict = None, timeout: int = 3):
req_url = get_req_url(endpoint, api_ver=api_ver)
log_string = f'post:\n{endpoint} payload: {payload}\ntype: {type(payload)}'
logging.info(log_string) if master_debug else logging.debug(log_string)
@ -133,7 +199,7 @@ async def db_post(endpoint: str, api_ver: int = 1, payload: dict = None, timeout
raise ValueError(f'DB: {resp.text}')
async def db_delete(endpoint: str, object_id: int, api_ver: int = 1, timeout=3):
async def db_delete(endpoint: str, object_id: int, api_ver: int = 2, timeout=3):
req_url = get_req_url(endpoint, api_ver=api_ver, object_id=object_id)
log_string = f'delete:\n{endpoint} {object_id}'
logging.info(log_string) if master_debug else logging.debug(log_string)
@ -182,5 +248,26 @@ def team_hash(team):
return hash_string
async def get_pd_player(player_id, as_dict: Optional[bool] = True):
if player_id in PLAYER_CACHE:
tdelta = datetime.datetime.now() - PLAYER_CACHE[player_id].created
if tdelta.total_seconds() < 1209600:
logging.info(f'this_player: {PLAYER_CACHE[player_id]}')
if as_dict:
return PLAYER_CACHE[player_id].to_dict()
else:
return PLAYER_CACHE[player_id]
else:
logging.error(f'Refreshing player {player_id} in cache...')
this_player = await db_get('players', object_id=player_id)
for bad_key in ['mlbplayer', 'paperdex']:
if bad_key in this_player:
del this_player[bad_key]
logging.debug(f'this_player: {this_player}')
PLAYER_CACHE[player_id] = Player(**this_player)
if as_dict:
return this_player
return PLAYER_CACHE[player_id]

View File

@ -12,7 +12,7 @@ from playhouse.shortcuts import model_to_dict
from dataclasses import dataclass
from helpers import SBA_SEASON, PD_SEASON, get_player_url, get_sheets
from db_calls import db_get
from db_calls import db_get, get_pd_player
db = SqliteDatabase(
'storage/gameplay.db',
@ -786,6 +786,8 @@ def undo_subs(game: StratGame, new_play_num: int):
async def get_player(game, lineup_member) -> dict:
# await asyncio.sleep(0.1)
return await get_pd_player(lineup_member.player_id)
if isinstance(game, Game):
if game.is_pd:
this_card = await db_get(f'cards', object_id=lineup_member.card_id)