add SREBOT, SHARED, TSSBOT contents (fixup for #1223)

PR #1223 only staged the deletions of the old paths because the new
top-level directories were still untracked when the commit was authored.
This commit adds the actual restructured tree: SREBOT/ (existing bot),
SHARED/ (vromfs, data_parser, ICONS/MAPS/FONTS, DAGOR_FILES,
update_game_files), and TSSBOT/ (skeleton).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
FURRO404
2026-05-13 23:17:02 -07:00
commit 2b399fdb81
186 changed files with 96596 additions and 0 deletions
+123
View File
@@ -0,0 +1,123 @@
"""
Diagnostic: figure out why /meta shows no points per player.
Compares Guild_Metas userIDs against the uid keys returned by
obtain_clan_new_points() for the guild's bound squadron, and reports each
plausible failure mode (missing Guilds row, empty API response, uid format
mismatch, squadron-name mismatch).
Usage (on the server):
cd ~/SREBOT/SREBOT_MEOW
source .venv/bin/activate
python scripts/diag_meta_points.py 1378960248118841507
"""
from __future__ import annotations
import asyncio
import sys
from pathlib import Path
import aiosqlite
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from BOT.game_api import ClanInfoError, obtain_clan_new_points
from BOT.utils import STORAGE_DIR
async def diag(guild_id: str) -> None:
meta_db = STORAGE_DIR / "Meta.db"
print(f"== Meta.db: {meta_db} (exists={meta_db.exists()})")
if not meta_db.exists():
print("Meta.db missing — wrong STORAGE_DIR?")
return
async with aiosqlite.connect(meta_db) as db:
cur = await db.execute(
"SELECT squadron_name, squadron_clanID FROM Guilds WHERE guild_id=?",
(guild_id,),
)
guilds_row = await cur.fetchone()
print(f"== Guilds row for {guild_id}: {guilds_row}")
cur = await db.execute(
"SELECT COUNT(*) FROM Guild_Metas WHERE guild_id=?", (guild_id,)
)
gm_count_row = await cur.fetchone()
gm_count = gm_count_row[0] if gm_count_row else 0
print(f"== Guild_Metas count for {guild_id}: {gm_count}")
cur = await db.execute(
"SELECT userID, nick, clanName FROM Guild_Metas "
"WHERE guild_id=? ORDER BY nick LIMIT 5",
(guild_id,),
)
gm_rows = await cur.fetchall()
print("== Guild_Metas sample:")
for uid, nick, clan in gm_rows:
print(f" uid={uid!r} type={type(uid).__name__} nick={nick!r} clan={clan!r}")
if not guilds_row:
print("\nNo Guilds row — /meta-management was never run for this guild.")
return
sq_name = guilds_row[0]
print(f"\n== Calling obtain_clan_new_points({sq_name!r})...")
try:
members, total = await obtain_clan_new_points(sq_name)
except ClanInfoError as e:
print(f" ClanInfoError: {e}")
return
except Exception as e:
print(f" {type(e).__name__}: {e}")
return
print(f"== API returned: {len(members)} members, total_score={total}")
if not members:
print(" Empty members dict — JWT was likely refreshed; rerun the script.")
return
sample = list(members.items())[:3]
print("== API sample:")
for uid, info in sample:
print(f" uid={uid!r} type={type(uid).__name__} info={info}")
gm_rows_list = list(gm_rows)
if gm_rows_list:
gm_uid = gm_rows_list[0][0]
print(
f"\n== Membership test for first Guild_Metas uid {gm_uid!r}:\n"
f" raw in api_map -> {gm_uid in members}\n"
f" str(uid) in api_map -> {str(gm_uid) in members}"
)
api_uids = set(members.keys())
gm_uids_all = set()
async with aiosqlite.connect(meta_db) as db:
cur = await db.execute(
"SELECT userID FROM Guild_Metas WHERE guild_id=?", (guild_id,)
)
gm_uids_all = {str(r[0]) for r in await cur.fetchall()}
api_uids_str = {str(u) for u in api_uids}
overlap = gm_uids_all & api_uids_str
only_gm = gm_uids_all - api_uids_str
only_api = api_uids_str - gm_uids_all
print(
f"\n== Set overlap (str-cast both sides):\n"
f" in both: {len(overlap)}\n"
f" only in Guild_Metas: {len(only_gm)} (left squadron / wrong sq_name?)\n"
f" only in API: {len(only_api)} (never bulk-added)"
)
def main() -> None:
if len(sys.argv) != 2:
print("Usage: python scripts/diag_meta_points.py <guild_id>")
sys.exit(2)
asyncio.run(diag(sys.argv[1]))
if __name__ == "__main__":
main()