From dbfd3537fe596f3f8535837471d853f920981aef Mon Sep 17 00:00:00 2001 From: jerick Date: Tue, 25 Nov 2025 15:48:56 -0500 Subject: [PATCH] Saving player data to json file --- .gitignore | 3 +- __pycache__/config.cpython-313.pyc | Bin 456 -> 456 bytes cogs/__pycache__/commands.cpython-313.pyc | Bin 3966 -> 3396 bytes cogs/commands.py | 42 +++++------ config.py | 4 +- services/__pycache__/torn_api.cpython-313.pyc | Bin 1565 -> 3745 bytes services/torn_api.py | 68 ++++++++++++++++-- 7 files changed, 82 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 8965cc5..4f1cc74 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.venv -temp.md \ No newline at end of file +temp.md +*data \ No newline at end of file diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc index a6db65d1a25867fa2fcea2da440ca9d9a4f33116..0ad30fd015356c1a877a96d6d316cbd9b886d491 100644 GIT binary patch delta 40 vcmX@Xe1e(xGcPX}0}!0zRLc~d$Q#BXdxL=?^Y}T2joD_5jN+3QF{%Lo+e!-P delta 40 vcmX@Xe1e(xGcPX}0}$M2R?8Hd$Q#CS{2T*A=EvWh8?((A86_q!VpIbF?CcBq diff --git a/cogs/__pycache__/commands.cpython-313.pyc b/cogs/__pycache__/commands.cpython-313.pyc index 006efa9ba7bbda53c4edebff930da4c9e23a7f43..c61d92a7f21e4adcc64c0963aafeef444e9c52b8 100644 GIT binary patch delta 1120 zcmb_b&rcIU6rSmBx4)*VE)4s#xDZ49>twdJfceIE#k?PknlWau2hP*T ziJ_VcoU}IW2g(qcfve0Clo@4pB1LnQ+#Ds6c1}9XvmiYx8V@8*H;N_ln1ZAmIYS>> zJ)h1MSIE|=xCbTYnH>~y*@Ib<0FDszios!u`v6!2wok9-^O~;fG)GC2Fi%z+9aqd2 zZxoFgSI+qH$N)L3&l0l>o`SDptRcoNA^zO=DI|OlBAa8ivG@JA8iHaWrH+&@ZC9cp zBrTMzqr1ud0O%TTBBhCv2dzoM^o&pRzzvu<&DI79+JXszeceaUb`U1I+3gTVu>h&< zrZ(R$5xEThM+q*c-G=Cp@E=te{i6!)w(4M^h47L*okHMq1g&)nf9gb2+WmjgzD+$s z?jMtXydh3n!epoXw;Mv%LfJaX9?3u35K4iZPG&Iui5O86 zB1Vys`8}+17pOxvr}-(kZdUo583Ay-<&ErkBMoowzQ^mGfh`7b;+_Nd_>Ms9%uHq3abwyGho_u|^j|Ag3e^?uI;Ou5lBu61W{-goegx8I WF!zHSg=x4kwi&C%egcY}>%Re7dL%ml delta 1795 zcmb7FU2IcT96$HFA9ww@qi|PHFHJUgyLKOtmVnA&qZ`}UFuSQ44lP}K+f~+Eytf@; z(bVWm5fj=}v-^2}sxk7{^phKp3CE#|f2aU}AzCr&LM+ zJa7StbOMPwjZL%2%j3&OH1{eKr$y#2+K8BLh@_IquoBfEZjZ_7$b3jvM1W%C`W?6l5SZLk`>Gv;_?o zu-||Rdkt9%U=rqmdL&sCV~~cuI0AcNnr%Z;w1UR%Et;oL(R}o!EA8h4ZS_tI52=wY%0>ABN{HiF;R#Z*UF^;R`xB7G03l z9WVvmKBt9bEuBb0d1yWZFN2N^F5y|XTPKxpQeI-*ZlQbZ*r6px6y6X{EDAccATP=b zOLn*ov@D~-kaS4UL1F>UmyVf4MkS$l)qz3~aXGD`&g+DhR@I#iv>+>@Sw;O-I}n3u zWv*jMok&Epnoh@Jp=9_R43|)3O()JJqB;Rn)v3sQMmejK4L&-2;h&{ikh4a)nr=Uy zNDsFzcyHt8J_V)PB0ToH;4SbQ-&5tiHO`x3?pSx$ImdE$p}V}>SLOV*EbA|`{yNM3 zB0O8QocWX~4SebQ!nek+@2mD4uJsI6dWOC`Q0dBOfl2g?Q1E8?JNwvb*3eNh_`@*IDDl3MZD` zFRW`-Za6obty^uEGZ!=YnUY$yx@y+0inVLyeAU`lJ}_Ffj^48Ib=H3Q#KjY(eWmaU z{b8asyUMH)tC_XY^`qeB(p`ss(iv9;Gnv^NgTwF0r*umlhvk#jq_OWB4 z4bYYv<@kYeRH+=b$9BVCaa5yh^+O-Vp=4XNy}<$ zxQA2mhN^nB_!rCfk3cIpX+V1#l6wS(VH-f$00SGK|95f#bLG32Jq6Dn0K!I?zX1zE BnbQCO diff --git a/cogs/commands.py b/cogs/commands.py index 1da96a5..7946083 100644 --- a/cogs/commands.py +++ b/cogs/commands.py @@ -1,6 +1,6 @@ from discord.ext import commands -from services.torn_api import fetch_enemy_members -from services.ffscouter import fetch_batch_stats +from services.torn_api import update_enemy_faction, update_friendly_faction + class HitCommands(commands.Cog): def __init__(self, bot, enrolled_attackers, enemy_queue): @@ -26,29 +26,19 @@ class HitCommands(commands.Cog): self.enrolled_attackers.remove(user_id) await ctx.send(f"{ctx.author.mention} has been removed from the rotation.") + @commands.command() - async def stats(self, ctx): - members = await fetch_enemy_members() - if not members: - await ctx.send("No active members found.") - return + async def update_enemy(self, ctx): + success = await update_enemy_faction() + if success: + await ctx.send("Enemy faction data updated with estimated stats!") + else: + await ctx.send("Failed to update enemy faction data.") - ids = [m["id"] for m in members if m.get("status", {}).get("state") in ("Okay", "Idle")] - ff_map = await fetch_batch_stats(ids) - - lines = [] - for m in members: - pid = str(m["id"]) - est = ff_map.get(pid, {}).get("bs_estimate_human", "?") - if m.get("status", {}).get("state") not in ("Okay", "Idle"): - continue - lines.append(f"**{m['name']}** (ID:{pid}) | Lv {m['level']} | Estimated BS: {est}") - - chunk = "" - for line in lines: - if len(chunk) + len(line) > 1900: - await ctx.send(chunk) - chunk = "" - chunk += line + "\n" - if chunk: - await ctx.send(chunk) + @commands.command() + async def update_friendly(self, ctx): + success = await update_friendly_faction() + if success: + await ctx.send("Friendly faction data updated with estimated stats!") + else: + await ctx.send("Failed to update friendly faction data.") \ No newline at end of file diff --git a/config.py b/config.py index 67a5122..98f8668 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,7 @@ # Torn API TORN_API_KEY = "9VLK0Wte1BwXOheB" -ENEMY_FACTION_ID = 52935 -YOUR_FACTION_ID = 654321 +ENEMY_FACTION_ID = 55325 +YOUR_FACTION_ID = 52935 ALLOWED_CHANNEL_ID = 1442876328536707316 # FFScouter API diff --git a/services/__pycache__/torn_api.cpython-313.pyc b/services/__pycache__/torn_api.cpython-313.pyc index c0256b16cfa9c52acaf8f690bcba4c4ec3efc5b6..582c96e674b80cfd65e805028bce005b00bd1506 100644 GIT binary patch literal 3745 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 L;T(!- diff --git a/services/torn_api.py b/services/torn_api.py index 7ce297c..cfbbd0e 100644 --- a/services/torn_api.py +++ b/services/torn_api.py @@ -1,12 +1,68 @@ +# services/torn_api.py import aiohttp -from config import TORN_API_KEY, ENEMY_FACTION_ID +import json +from pathlib import Path +from config import TORN_API_KEY, ENEMY_FACTION_ID, YOUR_FACTION_ID +from .ffscouter import fetch_batch_stats + +ENEMY_FILE = Path("data/enemy_faction.json") +FRIENDLY_FILE = Path("data/friendly_faction.json") + + +async def fetch_and_save_faction(faction_id: int, file_path: Path) -> bool: + """ + Fetches faction members from Torn, fetches their estimated BS from FFScouter, + and saves everything to a JSON file. + """ + url = f"https://api.torn.com/v2/faction/{faction_id}?selections=members&key={TORN_API_KEY}" -async def fetch_enemy_members(): - url = f"https://api.torn.com/v2/faction/{ENEMY_FACTION_ID}?selections=members&key={TORN_API_KEY}" async with aiohttp.ClientSession() as session: async with session.get(url) as resp: if resp.status != 200: - print("Torn faction fetch error:", resp.status) - return [] + print(f"Torn faction fetch error: {resp.status}") + return False data = await resp.json() - return data.get("members", []) + + members_list = data.get("members", []) + if not members_list: + return False + + # Build list of IDs (Torn uses 'id', not 'player_id') + member_ids = [info.get("id") for info in members_list if "id" in info] + if not member_ids: + return False + + # Fetch batch FFScouter stats + ff_data = await fetch_batch_stats(member_ids) # returns dict keyed by player_id + + # Build final faction data + faction_data = [] + for info in members_list: + pid = info.get("id") + if pid is None: + continue + + est = ff_data.get(str(pid), {}).get("bs_estimate_human", "?") + member = { + "id": pid, + "name": info.get("name", "Unknown"), + "level": info.get("level", 0), + "estimate": est + } + faction_data.append(member) + + # Save to file + file_path.parent.mkdir(exist_ok=True, parents=True) # ensure folder exists + with open(file_path, "w", encoding="utf-8") as f: + json.dump(faction_data, f, indent=2) + + return True + + +# Wrappers for clarity +async def update_enemy_faction() -> bool: + return await fetch_and_save_faction(ENEMY_FACTION_ID, ENEMY_FILE) + + +async def update_friendly_faction() -> bool: + return await fetch_and_save_faction(YOUR_FACTION_ID, FRIENDLY_FILE)