adjust download method also for games whose seed is unknown before
This commit is contained in:
parent
3a00879e03
commit
71951ac929
1 changed files with 60 additions and 29 deletions
|
@ -2,6 +2,8 @@ import json
|
||||||
from site_api import get, api, replay
|
from site_api import get, api, replay
|
||||||
from database import Game, store, load, commit, conn
|
from database import Game, store, load, commit, conn
|
||||||
from compress import compress_deck, compress_actions, DeckCard, Action
|
from compress import compress_deck, compress_actions, DeckCard, Action
|
||||||
|
from variants import variant_id
|
||||||
|
from hanabi import HanabiInstance, GameState, Action
|
||||||
|
|
||||||
with open('variants.json') as f:
|
with open('variants.json') as f:
|
||||||
variants = json.loads(f.read())
|
variants = json.loads(f.read())
|
||||||
|
@ -31,37 +33,66 @@ def download_games(variant_id, name=None):
|
||||||
# requires seed AND game to already have an entry in database
|
# requires seed AND game to already have an entry in database
|
||||||
# return: (successfully exported game, game without cheat options, null if not exported)
|
# return: (successfully exported game, game without cheat options, null if not exported)
|
||||||
def export_game(game_id) -> [bool, bool]:
|
def export_game(game_id) -> [bool, bool]:
|
||||||
|
with conn.cursor() as cur:
|
||||||
|
cur.execute("SELECT deck_plays, one_extra_card, one_less_card, all_or_nothing, actions FROM games WHERE id = (%s)", (game_id,))
|
||||||
|
res = cur.fetchall()
|
||||||
|
if len(res) == 1:
|
||||||
|
print(res)
|
||||||
|
else:
|
||||||
|
print('game is completely new')
|
||||||
|
# return
|
||||||
|
|
||||||
r = get("export/{}".format(game_id))
|
r = get("export/{}".format(game_id))
|
||||||
if r is None:
|
if r is None:
|
||||||
print("Failed to export game id {}".format(game_id))
|
print("Failed to export game id {}".format(game_id))
|
||||||
return False, None
|
return False, None
|
||||||
assert(r['id'] == game_id)
|
assert(r['id'] == game_id)
|
||||||
deck = compress_deck([DeckCard.from_json(card) for card in r['deck']])
|
# print(r)
|
||||||
with conn.cursor() as cur:
|
|
||||||
cur.execute("UPDATE seeds SET deck=(%s) WHERE seed=(%s);", (deck, r['seed']))
|
|
||||||
try:
|
try:
|
||||||
actions = compress_actions([Action.from_json(a) for a in r['actions']], r['id'])
|
num_players = len(r['players'])
|
||||||
except:
|
seed = r['seed']
|
||||||
print("Unknown action while exporting game id {}".format(game_id))
|
|
||||||
raise
|
|
||||||
return False, None
|
|
||||||
options = r.get('options', {})
|
options = r.get('options', {})
|
||||||
|
var_id = variant_id(options['variant'])
|
||||||
deck_plays = options.get('deckPlays', False)
|
deck_plays = options.get('deckPlays', False)
|
||||||
one_extra_card = options.get('oneExtraCard', False)
|
one_extra_card = options.get('oneExtraCard', False)
|
||||||
one_less_card = options.get('oneLessCard', False)
|
one_less_card = options.get('oneLessCard', False)
|
||||||
all_or_nothing = options.get('allOrNothing', False)
|
all_or_nothing = options.get('allOrNothing', False)
|
||||||
|
actions = [Action.from_json(action) for action in r['actions']]
|
||||||
|
deck = [DeckCard.from_json(card) for card in r['deck']]
|
||||||
|
except KeyError:
|
||||||
|
print('Error parsing JSON when exporting game {}'.format(game_id))
|
||||||
|
|
||||||
|
# need to play through the game once to find out its score
|
||||||
|
game = GameState(HanabiInstance(deck, num_players))
|
||||||
|
for action in actions:
|
||||||
|
game.make_action(action)
|
||||||
|
|
||||||
|
try:
|
||||||
|
compressed_deck = compress_deck(deck)
|
||||||
|
except:
|
||||||
|
print("Failed to compress deck while exporting game {}".format(game_id))
|
||||||
|
raise
|
||||||
|
try:
|
||||||
|
compressed_actions = compress_actions(actions)
|
||||||
|
except:
|
||||||
|
print("Failed to compress actions while exporting game {}".format(game_id))
|
||||||
|
raise
|
||||||
|
|
||||||
with conn.cursor() as cur:
|
with conn.cursor() as cur:
|
||||||
|
# cur.execute("UPDATE seeds SET deck=(%s) WHERE seed=(%s);", (deck, seed))
|
||||||
cur.execute(
|
cur.execute(
|
||||||
"UPDATE games SET "
|
"INSERT INTO games (id, num_players, score, seed, variant_id, deck_plays, one_extra_card, one_less_card, all_or_nothing, actions)"
|
||||||
"deck_plays = (%s),"
|
"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
|
||||||
"one_extra_card = (%s),"
|
(game_id, num_players, game.score, seed, var_id, deck_plays, one_extra_card, one_less_card, all_or_nothing, compressed_actions))
|
||||||
"one_less_card = (%s),"
|
cur.execute(
|
||||||
"all_or_nothing = (%s),"
|
"INSERT INTO seeds (seed, num_players, variant_id, deck)"
|
||||||
"actions = (%s) "
|
"VALUES (%s, %s, %s, %s)"
|
||||||
"WHERE id = (%s);",
|
"ON CONFLICT (seed) DO NOTHING",
|
||||||
(deck_plays, one_extra_card, one_less_card, all_or_nothing, actions, game_id))
|
(seed, num_players, var_id, compressed_deck)
|
||||||
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
return True, not any([deck_plays, one_extra_card, one_less_card, all_or_nothing])
|
return True, not any([deck_plays, one_extra_card, one_less_card, all_or_nothing])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
export_game(913436)
|
export_game(960753)
|
||||||
|
|
Loading…
Reference in a new issue