From 9c5a5a41ca2e0266e863309ca31ca0d34ab0b4f9 Mon Sep 17 00:00:00 2001 From: Andrei Stoica Date: Mon, 29 Jan 2024 10:19:06 -0500 Subject: [PATCH] proflie meta and games --- sqitch/deploy/profile-game.sql | 2 +- sqitch/deploy/profile-meta.sql | 1 + sqitch/verify/profile-meta.sql | 2 +- src/extract.py | 119 ++++++++++++++++++++++++++++++++- 4 files changed, 121 insertions(+), 3 deletions(-) diff --git a/sqitch/deploy/profile-game.sql b/sqitch/deploy/profile-game.sql index 712a651..84ccad9 100644 --- a/sqitch/deploy/profile-game.sql +++ b/sqitch/deploy/profile-game.sql @@ -7,7 +7,7 @@ BEGIN; leetifyUserId TEXT, ctLeetifyRating NUMERIC, ctLeetifyRatingRounds NUMERIC, - dataSource NUMERIC, + dataSource TEXT, elo NUMERIC, gameFinishedAt TIMESTAMP, gameId TEXT, diff --git a/sqitch/deploy/profile-meta.sql b/sqitch/deploy/profile-meta.sql index 91583ff..ed49588 100644 --- a/sqitch/deploy/profile-meta.sql +++ b/sqitch/deploy/profile-meta.sql @@ -4,6 +4,7 @@ BEGIN; CREATE TABLE IF NOT EXISTS data.profile_meta ( + name TEXT, steam64Id TEXT, isCollector BOOL, isLeetifyStaff BOOL, diff --git a/sqitch/verify/profile-meta.sql b/sqitch/verify/profile-meta.sql index 36484f7..9ad428b 100644 --- a/sqitch/verify/profile-meta.sql +++ b/sqitch/verify/profile-meta.sql @@ -2,7 +2,7 @@ BEGIN; -SELECT steam64Id, isCollector, isLeetifyStaff, +SELECT name, steam64Id, isCollector, isLeetifyStaff, isProPlan, leetifyUserId, faceitNickname FROM data.profile_meta WHERE FALSE; diff --git a/src/extract.py b/src/extract.py index f265370..afcf639 100644 --- a/src/extract.py +++ b/src/extract.py @@ -1,5 +1,12 @@ -import psycopg2 as pg +from .leetify import Leetify from os import environ as env +from .transform import ( + meta_from_profile, + games_from_profile, + player_stats_from_game, +) +import psycopg2 as pg +from typing import Tuple def connect(): @@ -10,3 +17,113 @@ def connect(): host=env.get("POSTGRES_HOST"), port=env.get("POSTGRES_PORT"), ) + + +def vals_in_order(data: dict, keys: list): + vals = [data[key] for key in keys] + return vals + + +def dict_to_col_val(data: dict) -> Tuple[list, list]: + cols = [] + vals = [] + for k, v in data.items(): + cols.append(k) + vals.append(v) + + return cols, vals + + +def dict_to_sql_str(data: dict) -> Tuple[str, str]: + cols, vals = dict_to_col_val(data) + vals = map(str, vals) + + cols = ", ".join(cols) + vals = ", ".join(vals) + + return cols, vals + + +def extract_profile_meta(id, api=Leetify(), conn=None): + if not conn: + conn = connect() + + cols = [ + "name", + "steam64Id", + "isCollector", + "isLeetifyStaff", + "isProPlan", + "leetifyUserId", + "faceitNickname", + ] + profile = api.get_profile(id) + meta = meta_from_profile(profile) + vals = vals_in_order(meta, cols) + + with conn.cursor() as curs: + sql = f""" + INSERT INTO data.profile_meta ({', '.join(cols)}) + VALUES ({', '.join(['%s'] * len(vals))}); + """ + curs.execute(sql, vals) + conn.commit() + + +def extract_profile_games(profile, conn=None): + if not conn: + conn = connect() + + cols = [ + "leetifyUserId", + "ctLeetifyRating", + "ctLeetifyRatingRounds", + "dataSource", + "elo", + "gameFinishedAt", + "gameId", + "isCs2", + "mapName", + "matchResult", + "scores", + "skillLevel", + "tLeetifyRating", + "tLeetifyRatingRounds", + "deaths", + "hasBannedPlayer", + "kills", + "partySize", + ] + + games = games_from_profile(profile) + games = map(lambda game: vals_in_order(game, cols), games) + + with conn.cursor() as curs: + curs.executemany( + f""" + INSERT into data.profile_game ({', '.join(cols)}) + VALUES ({', '.join(['%s'] * len(cols))}); + """, + games, + ) + conn.commit() + + +def extract_player_stats(game, conn=None): + if not conn: + conn = connect() + stats = player_stats_from_game(game) + + games = map(dict_to_sql_str, stats) + + with conn.cursor() as curs: + for ( + cols, + vals, + ) in games: + curs.execute( + """INSERT INTO data.player_stats (%s) + VALUES (%s);""", + (cols, vals), + ) + conn.commit()