From 82d0666d0061310066df221dae4a7e38f69e281d Mon Sep 17 00:00:00 2001 From: kitten Date: Thu, 2 Jul 2026 09:07:37 +0200 Subject: [PATCH 01/37] add grabbing a player stats --- routes/ranking_grabstats.py | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 routes/ranking_grabstats.py diff --git a/routes/ranking_grabstats.py b/routes/ranking_grabstats.py new file mode 100644 index 0000000..b46f47e --- /dev/null +++ b/routes/ranking_grabstats.py @@ -0,0 +1,72 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session as DBSession +from sqlalchemy import desc +from database import SessionLocal, PlayerRank, EquipmentLast +from fastapi_cache.decorator import cache + +router = APIRouter() + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +@router.get("/leaderboard/getplayerstats/{pid}") +@cache(expire=60) +async def get_player_stats(pid: int, mode: int | None = None, db: DBSession = Depends(get_db)): + try: + query = ( + db.query(PlayerRank, EquipmentLast) + .outerjoin(EquipmentLast, PlayerRank.PId == EquipmentLast.PId) + .filter(PlayerRank.PId == pid) + ) + + if mode is not None: + query = query.filter(PlayerRank.GameMode == mode) + + result = query.first() + + if not result: + raise HTTPException(status_code=404, detail="Player not found") + + player, gear = result + + player_data = { + "PId": player.PId, + "MiiName": player.MiiName, + "Rank": player.Rank, + "GameMode": player.GameMode, + "WinSum": player.WinSum, + "LoseSum": player.LoseSum, + "RankingScore": round(player.RankingScore, 2), + "weapon": gear.weapon if gear else None, + "headgear": gear.Gear_Head if gear else None, + "clothes": gear.Gear_Clothes if gear else None, + "shoes": gear.Gear_Shoes if gear else None, + } + + if player.GameMode == 2: + top_100_query = ( + db.query(PlayerRank.PId) + .order_by(desc(PlayerRank.FesPower)) + .limit(100) + .all() + ) + top_100_tuples = set(top_100_query) + + is_top_100 = (player.PId,) in top_100_tuples + player_data["FesPower"] = player.FesPower + player_data["is_top_100_fes"] = is_top_100 + else: + player_data["FesPower"] = None + player_data["is_top_100_fes"] = False + + return player_data + + except HTTPException as http_ex: + raise http_ex + except Exception as e: + print(f"Error fetching stats for player {pid}: {e}") + return {"error": str(e)} \ No newline at end of file From 3f9cc345c5278bf9ca56973c7c8d0f6700a61a29 Mon Sep 17 00:00:00 2001 From: kitten Date: Thu, 2 Jul 2026 09:11:29 +0200 Subject: [PATCH 02/37] Update main.py --- main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.py b/main.py index 7f31651..3496c9e 100644 --- a/main.py +++ b/main.py @@ -14,6 +14,7 @@ from routes.equipment import equipment_history from routes.equipment import equipment from services.boss_retrieval import process_boss_file from routes import Ranking +from routes import ranking_grabstats from routes import twitter_link from contextlib import asynccontextmanager from datetime import datetime, timedelta, timezone @@ -187,6 +188,7 @@ app.include_router(equipment_history.router, prefix="/api/v1") app.include_router(equipment.router, prefix="/api/v1") app.include_router(Ranking.router, prefix="/api/v1") app.include_router(twitter_link.router, prefix="/api/v1") +app.include_router(ranking_grabstats.router, prefix="/api/v1") def start(): uvicorn.run("main:app", host="0.0.0.0", port=settings.port, reload=False) From 35a6c0db787fec6be0ced767673e9a45bdfde78d Mon Sep 17 00:00:00 2001 From: kitten Date: Thu, 2 Jul 2026 09:13:15 +0200 Subject: [PATCH 03/37] feat: add /leaderboard/getplayerstats/pid?mode (#65) Adds the ability to grab a players stats by pid without them being on the leaderboard. Untested changes. Reviewed-on: https://git.spbr.net/spacebar/SplatNet-Backend/pulls/65 --- main.py | 2 ++ routes/ranking_grabstats.py | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 routes/ranking_grabstats.py diff --git a/main.py b/main.py index 7f31651..3496c9e 100644 --- a/main.py +++ b/main.py @@ -14,6 +14,7 @@ from routes.equipment import equipment_history from routes.equipment import equipment from services.boss_retrieval import process_boss_file from routes import Ranking +from routes import ranking_grabstats from routes import twitter_link from contextlib import asynccontextmanager from datetime import datetime, timedelta, timezone @@ -187,6 +188,7 @@ app.include_router(equipment_history.router, prefix="/api/v1") app.include_router(equipment.router, prefix="/api/v1") app.include_router(Ranking.router, prefix="/api/v1") app.include_router(twitter_link.router, prefix="/api/v1") +app.include_router(ranking_grabstats.router, prefix="/api/v1") def start(): uvicorn.run("main:app", host="0.0.0.0", port=settings.port, reload=False) diff --git a/routes/ranking_grabstats.py b/routes/ranking_grabstats.py new file mode 100644 index 0000000..b46f47e --- /dev/null +++ b/routes/ranking_grabstats.py @@ -0,0 +1,72 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session as DBSession +from sqlalchemy import desc +from database import SessionLocal, PlayerRank, EquipmentLast +from fastapi_cache.decorator import cache + +router = APIRouter() + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +@router.get("/leaderboard/getplayerstats/{pid}") +@cache(expire=60) +async def get_player_stats(pid: int, mode: int | None = None, db: DBSession = Depends(get_db)): + try: + query = ( + db.query(PlayerRank, EquipmentLast) + .outerjoin(EquipmentLast, PlayerRank.PId == EquipmentLast.PId) + .filter(PlayerRank.PId == pid) + ) + + if mode is not None: + query = query.filter(PlayerRank.GameMode == mode) + + result = query.first() + + if not result: + raise HTTPException(status_code=404, detail="Player not found") + + player, gear = result + + player_data = { + "PId": player.PId, + "MiiName": player.MiiName, + "Rank": player.Rank, + "GameMode": player.GameMode, + "WinSum": player.WinSum, + "LoseSum": player.LoseSum, + "RankingScore": round(player.RankingScore, 2), + "weapon": gear.weapon if gear else None, + "headgear": gear.Gear_Head if gear else None, + "clothes": gear.Gear_Clothes if gear else None, + "shoes": gear.Gear_Shoes if gear else None, + } + + if player.GameMode == 2: + top_100_query = ( + db.query(PlayerRank.PId) + .order_by(desc(PlayerRank.FesPower)) + .limit(100) + .all() + ) + top_100_tuples = set(top_100_query) + + is_top_100 = (player.PId,) in top_100_tuples + player_data["FesPower"] = player.FesPower + player_data["is_top_100_fes"] = is_top_100 + else: + player_data["FesPower"] = None + player_data["is_top_100_fes"] = False + + return player_data + + except HTTPException as http_ex: + raise http_ex + except Exception as e: + print(f"Error fetching stats for player {pid}: {e}") + return {"error": str(e)} \ No newline at end of file From 7f187bdad934943744f259edea8ff6006acb503e Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 24 Jun 2026 21:19:39 +0000 Subject: [PATCH 04/37] Update dependency anyio to v4.14.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0a55d4d..acdd105 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.11" dependencies = [ "annotated-doc==0.0.4", "annotated-types==0.7.0", - "anyio==4.14.0", + "anyio==4.14.1", "argon2-cffi==25.1.0", "argon2-cffi-bindings==25.1.0", "certifi==2026.6.17", From 09a2f6f69d96b68bb992b44f205e1d9e4b3faff4 Mon Sep 17 00:00:00 2001 From: kitten Date: Tue, 7 Jul 2026 09:27:13 +0200 Subject: [PATCH 05/37] revert 3fe3913aa243a9b7491b8dd00763d8feaf5bd952 revert fix: accept submissions if validation failed --- judd/routes/post.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/judd/routes/post.js b/judd/routes/post.js index 85d531e..f20a2a3 100644 --- a/judd/routes/post.js +++ b/judd/routes/post.js @@ -40,7 +40,7 @@ router.post('/post', postLimiter, async (request, response, next) => { } } catch (err) { console.error(`Caught error when validating ${pid}:`, err.message || err); - isPidValid = true; + isPidValid = false; } if (!isPidValid) { From aa5e9e5be092add05b499d6d1391afa3ee8c2df4 Mon Sep 17 00:00:00 2001 From: kittentm Date: Thu, 9 Jul 2026 23:01:38 +0200 Subject: [PATCH 06/37] chore: add .venv --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 251ef39..6200a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ fes_boss.yaml node_modules build splatnet_backend.egg-info -venv/* \ No newline at end of file +venv/* +.venv/* \ No newline at end of file From cf9a05855ffa88eb4ba4342dc8f4392933c8e538 Mon Sep 17 00:00:00 2001 From: kittentm Date: Thu, 9 Jul 2026 23:07:16 +0200 Subject: [PATCH 07/37] fix: a rly bad oopsie (untested) --- judd/titles/splatoon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/judd/titles/splatoon.js b/judd/titles/splatoon.js index f75aa19..c910137 100644 --- a/judd/titles/splatoon.js +++ b/judd/titles/splatoon.js @@ -19,7 +19,7 @@ module.exports = { if (parseInt(data.SessionID) > MAX_INT32) sanitizedData.SessionID = 0; - const result = await SplatfestResult.create(sanitizedData); + const result = await SplatfestResult.create(sanitizedData, { ordering: false, ignoreDuplicates: false }); await Equipment.upsert({ PId: sanitizedData.PId, From 3065a4d51edf09a3c0798b8103dde4129b725295 Mon Sep 17 00:00:00 2001 From: kittentm Date: Thu, 9 Jul 2026 23:11:32 +0200 Subject: [PATCH 08/37] chore: fix coc --- code_of_conduct.md | 71 +++++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/code_of_conduct.md b/code_of_conduct.md index b9b2b84..bab5b09 100644 --- a/code_of_conduct.md +++ b/code_of_conduct.md @@ -1,40 +1,65 @@ -# Contributor Covenant Code of Conduct +# Spacebar Network Code of Conduct + +This repository adheres to the official Spacebar Network Code of Conduct ("COC.") These regulations extend to the entire Spacebar network, our official Discord community, and all Git repositories. By choosing to interact with our community, you are entering into a social contract designed to protect the integrity of the project and the well-being of its members. + +> **Note:** If you wish to propose changes or simply view the COC, the primary residence and master copy of this Code of Conduct can be found [here](https://git.spbr.net/spacebar/policy). + +If you intend to contribute code, participate in community discussions, or experience any element of the Spacebar ecosystem, you must strictly abide by the standards and expectations set forth in this Covenant. We believe that a healthy community is built on mutual respect and shared responsibility. Our goal is to foster a space that is welcoming, inclusive, and free from harassment for everyone, regardless of their background or level of experience. Failure to adhere to these principles may result in removal from the network, as we prioritize maintaining a safe and productive environment for all participants. + +--- ## Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +We pledge to make the Spacebar community welcoming, safe, and equitable for all. -## Our Standards +We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant. -Examples of behavior that contributes to creating a positive environment include: +## Encouraged Behaviors -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members +While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language. -Examples of unacceptable behavior by participants include: +With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including: -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +1. Respecting the **purpose of our community**, our activities, and our ways of gathering. +2. Engaging **kindly and honestly** with others. +3. Respecting **different viewpoints** and experiences. +4. **Taking responsibility** for our actions and contributions. +5. Gracefully giving and accepting **constructive feedback**. +6. Committing to **repairing harm** when it occurs. +7. Behaving in other ways that promote and sustain the **well-being of our community**. -## Our Responsibilities +## Restricted Behaviors -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. +We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct. -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop. +2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people. +3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable identities or traits. +4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community. +5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their permission. +6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group. +7. Behaving in other ways that **threaten the well-being** of our community. -## Scope +### Other Restrictions -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. +1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions. +2. **Failing to credit sources.** Not properly crediting the sources of content you contribute. If you are found to be using SDK material, all of your content commited towards Spacebar will be removed. No exceptions. +3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community. +4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors. +5. **Discussion of Piracy, or anything relating.** + +## Reporting an Issue + +When an incident occurs, it is important to report it promptly. To report a possible violation, please contact the Spacebar Maintainers via contacting a SPFN or SPBR developer on the discord server found [here](https://discord.gg/grMSxZf). + +Spacebar moderators take reports seriously and will respond in a timely manner. They will investigate all reports by reviewing logs, messages, or interviewing participants. We aim to keep enforcement actions transparent while prioritizing the safety and confidentiality of those involved. + +--- ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version] +This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/). -[homepage]: https://contributor-covenant.org -[version]: https://contributor-covenant.org/version/1/4/ +Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/) + +For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). \ No newline at end of file From 8b532e831e95480cf8b837771b1bb2d5e15bcb77 Mon Sep 17 00:00:00 2001 From: kittentm Date: Sat, 18 Jul 2026 04:02:05 +0200 Subject: [PATCH 09/37] fix: improve XML parsing --- services/boss_retrieval.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/services/boss_retrieval.py b/services/boss_retrieval.py index 54dc664..3737f76 100644 --- a/services/boss_retrieval.py +++ b/services/boss_retrieval.py @@ -15,29 +15,46 @@ def process_boss_file(): base_url = settings.boss_url.rstrip('/') tasks = [ - {"url": f"{base_url}/zvGSM4kOrXpkKnpT/schdat2?c=JP&l=en", "output": "boss.yaml"}, - {"url": f"{base_url}/zvGSM4kOrXpkKnpT/optdat2?c=US&l=en", "output": "fes_boss.yaml"} + { + "url": f"{base_url}/zvGSM4kOrXpkKnpT/schdat2?c=JP&l=en", + "filename": "VSSetting.byaml", + "output": "boss.yaml" + }, + { + "url": f"{base_url}/zvGSM4kOrXpkKnpT/optdat2?c=US&l=en", + "filename": "Festival.byaml", + "output": "fes_boss.yaml" + } ] try: success_all = True for task in tasks: master_url = task["url"] + target_filename = task["filename"] output_yaml = task["output"] print(f"data get: {master_url}") meta_res = requests.get(master_url, timeout=10) meta_res.raise_for_status() root = ET.fromstring(meta_res.content) - data_url_element = root.find(".//Url") - if data_url_element is None or not data_url_element.text: - print("woops! no tag found in the XML response") + # LMFAO HOW DID THIS FLY UNDER THE RADAR FOR SO LONG + real_data_url = None + for file_element in root.findall(".//File"): + filename_elem = file_element.find("Filename") + if filename_elem is not None and filename_elem.text == target_filename: + url_elem = file_element.find("Url") + if url_elem is not None and url_elem.text: + real_data_url = url_elem.text.strip() + break + + if not real_data_url: + print(f"woops! could not find URL for file '{target_filename}' in the XML response") success_all = False continue - real_data_url = data_url_element.text.strip() - print(f"parsed data url: {real_data_url}") + print(f"parsed data url for {target_filename}: {real_data_url}") res = requests.get(real_data_url, timeout=10) res.raise_for_status() From 8d9909a9ed037fdcb20eacfc14a50b5d4e674bc2 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 18 Jul 2026 02:18:24 +0000 Subject: [PATCH 10/37] Update dependency pg to v8.22.0 --- judd/package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/judd/package-lock.json b/judd/package-lock.json index 4091e11..6ba5877 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -1463,14 +1463,14 @@ } }, "node_modules/pg": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.21.0.tgz", - "integrity": "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.22.0.tgz", + "integrity": "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.13.0", + "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", - "pg-protocol": "^1.14.0", + "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -1497,9 +1497,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.13.0.tgz", - "integrity": "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", + "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", "license": "MIT" }, "node_modules/pg-hstore": { @@ -1533,9 +1533,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", - "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", + "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", "license": "MIT" }, "node_modules/pg-types": { From ac59d976da2fa60f52645cc1baf16fd585072990 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 3 Aug 2026 21:49:09 +0000 Subject: [PATCH 11/37] Update dependency cffi to v2.1.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index acdd105..fd3e347 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ dependencies = [ "argon2-cffi==25.1.0", "argon2-cffi-bindings==25.1.0", "certifi==2026.6.17", - "cffi==2.0.0", + "cffi==2.1.1", "charset-normalizer==3.4.7", "click==8.4.1", "colorama==0.4.6", From 2293547d977d1ed7997a5ca817c8f8dcf1c551cc Mon Sep 17 00:00:00 2001 From: Spacebot Date: Fri, 19 Jun 2026 14:03:13 +0000 Subject: [PATCH 12/37] Update dependency pydantic-settings to v2.14.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fd3e347..f438a16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ dependencies = [ "pycparser==3.0", "pydantic==2.13.4", "pydantic-core==2.46.4", - "pydantic-settings==2.14.1", + "pydantic-settings==2.14.2", "python-dateutil==2.9.0.post0", "python-dotenv==1.2.2", "python-multipart==0.0.32", From 17682b74d17ff36024f531ae44b26e23ca7616bb Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 22 Jul 2026 12:03:50 +0000 Subject: [PATCH 13/37] Update dependency greenlet to v3.5.4 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f438a16..0f71905 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "cryptography==49.0.0", "fastapi==0.137.1", "fastapi-cache2==0.2.2", - "greenlet==3.5.2", + "greenlet==3.5.4", "h11==0.16.0", "httpcore==1.0.9", "httpx==0.28.1", From 6f3bb98524046be5c39d3b3ab602fe941ef88207 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 24 Jun 2026 17:49:19 +0000 Subject: [PATCH 14/37] Update dependency click to v8.4.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0f71905..edca420 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "certifi==2026.6.17", "cffi==2.1.1", "charset-normalizer==3.4.7", - "click==8.4.1", + "click==8.4.2", "colorama==0.4.6", "cryptography==49.0.0", "fastapi==0.137.1", From 0b7b272117eb3830dc91d3e0df8bc9b76023df75 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 29 Jul 2026 17:33:41 +0000 Subject: [PATCH 15/37] Update dependency axios to v1.19.0 --- judd/package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/judd/package-lock.json b/judd/package-lock.json index 6ba5877..a7bf051 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -384,13 +384,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", - "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -998,16 +998,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -1117,9 +1117,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" From d42f74c81cf368b359d7a465103253f5d2debd64 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Fri, 19 Jun 2026 03:03:31 +0000 Subject: [PATCH 16/37] Update actions/checkout action to v7 --- .forgejo/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 6d85c91..396db7d 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -10,7 +10,7 @@ jobs: runs-on: ${{ vars.RUNNER_LABEL }} steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: install docker??? run: | From e37aa0dc37fc6cceb4ac59d3ba53747abb96724e Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 00:18:20 +0000 Subject: [PATCH 17/37] Update dependency annotated-doc to v0.0.5 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index edca420..83884ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ description = "Backend for SplatNet" readme = "README.md" requires-python = ">=3.11" dependencies = [ - "annotated-doc==0.0.4", + "annotated-doc==0.0.5", "annotated-types==0.7.0", "anyio==4.14.1", "argon2-cffi==25.1.0", From 8097e6f2780dc2b39b52a7ad965e8b6b7b0a0ef6 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 02:03:26 +0000 Subject: [PATCH 18/37] Update dependency express-rate-limit to v8.6.2 --- judd/package-lock.json | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/judd/package-lock.json b/judd/package-lock.json index a7bf051..68a5650 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -833,11 +833,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -850,6 +851,29 @@ "express": ">= 4.11" } }, + "node_modules/express-rate-limit/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/express-rate-limit/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/express-subdomain": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/express-subdomain/-/express-subdomain-1.0.6.tgz", From 86792bc48e964d770600f894f181e5100a7f958b Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 02:03:09 +0000 Subject: [PATCH 19/37] Update dependency certifi to v2026.7.22 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 83884ec..ba68d9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ dependencies = [ "anyio==4.14.1", "argon2-cffi==25.1.0", "argon2-cffi-bindings==25.1.0", - "certifi==2026.6.17", + "certifi==2026.7.22", "cffi==2.1.1", "charset-normalizer==3.4.7", "click==8.4.2", From ad0cf396473e3d368d3db9d8a39be8fb2c7a823a Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 01:02:56 +0000 Subject: [PATCH 20/37] Update dependency charset-normalizer to v3.4.9 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ba68d9a..3ee6192 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ dependencies = [ "argon2-cffi-bindings==25.1.0", "certifi==2026.7.22", "cffi==2.1.1", - "charset-normalizer==3.4.7", + "charset-normalizer==3.4.9", "click==8.4.2", "colorama==0.4.6", "cryptography==49.0.0", From a90061f692c97717fc594534ed7de27e815dee03 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 09:48:00 +0000 Subject: [PATCH 21/37] Update dependency starlette to v1.4.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3ee6192..56936c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [ "requests-oauthlib==2.0.0", "six==1.17.0", "sqlalchemy==2.0.51", - "starlette==1.3.1", + "starlette==1.4.0", "tweepy==4.16.0", "typing-extensions==4.15.0", "typing-inspection==0.4.2", From 702abc832d3ea9b9d152c19f2cef9d74ac7d4111 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 06:03:19 +0000 Subject: [PATCH 22/37] Update dependency uvicorn to v0.52.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 56936c8..97dfb13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ dependencies = [ "typing-inspection==0.4.2", "tzdata==2026.2", "urllib3==2.7.0", - "uvicorn==0.49.0", + "uvicorn==0.52.1", "jinja2==3.1.6", ] From ddfacaf4a5dacfcc8311bf3b039b353ca2a0ba30 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 05:03:30 +0000 Subject: [PATCH 23/37] Update dependency cryptography to v50 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 97dfb13..5dddc6d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "charset-normalizer==3.4.9", "click==8.4.2", "colorama==0.4.6", - "cryptography==49.0.0", + "cryptography==50.0.0", "fastapi==0.137.1", "fastapi-cache2==0.2.2", "greenlet==3.5.4", From 4e5d08b7fc87c195b299f2ecfbdfecb07715b26e Mon Sep 17 00:00:00 2001 From: Spacebot Date: Thu, 2 Jul 2026 09:04:25 +0000 Subject: [PATCH 24/37] Update dependency typing-extensions to v4.16.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5dddc6d..7c5b344 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,7 +41,7 @@ dependencies = [ "sqlalchemy==2.0.51", "starlette==1.4.0", "tweepy==4.16.0", - "typing-extensions==4.15.0", + "typing-extensions==4.16.0", "typing-inspection==0.4.2", "tzdata==2026.2", "urllib3==2.7.0", From 014e59b234e557f63b3c6067cd96320da286a06a Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 03:03:37 +0000 Subject: [PATCH 25/37] Update dependency discord.js to v14.27.0 --- judd/package-lock.json | 52 +++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/judd/package-lock.json b/judd/package-lock.json index 68a5650..d2aa1f1 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -68,9 +68,9 @@ } }, "node_modules/@discordjs/rest": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.1.tgz", - "integrity": "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.3.tgz", + "integrity": "sha512-wvOylxNYJkwKjctS/Mn5GP1w9r3/rzyH+ThD1JlAca6zEdlHs8QWBBUQJpU5Q+W6DoIj/Ljh1IPlZs7hTU+UAg==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -78,10 +78,10 @@ "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.5", "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.38.40", + "discord-api-types": "^0.38.50", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", - "undici": "6.24.1" + "undici": "^6.27.0" }, "engines": { "node": ">=18" @@ -102,16 +102,6 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/rest/node_modules/@sapphire/snowflake": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz", - "integrity": "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==", - "license": "MIT", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/@discordjs/util": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz", @@ -234,9 +224,9 @@ } }, "node_modules/@sapphire/snowflake": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", - "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz", + "integrity": "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==", "license": "MIT", "engines": { "node": ">=v14.0.0", @@ -658,33 +648,33 @@ } }, "node_modules/discord-api-types": { - "version": "0.38.47", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.47.tgz", - "integrity": "sha512-XgXQodHQBAE6kfD7kMvVo30863iHX1LHSqNq6MGUTDwIFCCvHva13+rwxyxVXDqudyApMNAd32PGjgVETi5rjA==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" ] }, "node_modules/discord.js": { - "version": "14.26.4", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.26.4.tgz", - "integrity": "sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA==", + "version": "14.27.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.27.0.tgz", + "integrity": "sha512-qHbFlFG2N7y3LjPySYsL6A1+BnX6bkTVgo842EX0CqVPk/KTMwZkojPHEXKsQUpWZNyz5BISNHK1cPpQw0+m4A==", "license": "Apache-2.0", "dependencies": { "@discordjs/builders": "^1.14.1", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", - "@discordjs/rest": "^2.6.1", + "@discordjs/rest": "^2.6.2", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.40", + "@sapphire/snowflake": "3.5.5", + "discord-api-types": "^0.38.49", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", - "undici": "6.24.1" + "undici": "^6.27.0" }, "engines": { "node": ">=18" @@ -2137,9 +2127,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", - "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "license": "MIT", "engines": { "node": ">=18.17" From d81f451963e708f115eb4c086152dfea6e48f1d9 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 05:03:21 +0000 Subject: [PATCH 26/37] Update dependency tzdata to v2026.3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7c5b344..bd5da3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dependencies = [ "tweepy==4.16.0", "typing-extensions==4.16.0", "typing-inspection==0.4.2", - "tzdata==2026.2", + "tzdata==2026.3", "urllib3==2.7.0", "uvicorn==0.52.1", "jinja2==3.1.6", From 0cecc52a557ba492490ef07af25f63d1f0de7326 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 12:18:27 +0000 Subject: [PATCH 27/37] Update dependency fastapi to v0.141.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index bd5da3b..3823149 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "click==8.4.2", "colorama==0.4.6", "cryptography==50.0.0", - "fastapi==0.137.1", + "fastapi==0.141.1", "fastapi-cache2==0.2.2", "greenlet==3.5.4", "h11==0.16.0", From a3571f971df0a82675131016cf3c99ee786073fe Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 12:33:23 +0000 Subject: [PATCH 28/37] Update dependency tweepy to v4.17.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3823149..95a34ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ dependencies = [ "six==1.17.0", "sqlalchemy==2.0.51", "starlette==1.4.0", - "tweepy==4.16.0", + "tweepy==4.17.0", "typing-extensions==4.16.0", "typing-inspection==0.4.2", "tzdata==2026.3", From 2b4e9ae7c02d39e62d3aa7475d282c4e225f43d0 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Wed, 5 Aug 2026 15:47:39 +0000 Subject: [PATCH 29/37] Update dependency starlette to v1.4.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 95a34ca..7020f3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [ "requests-oauthlib==2.0.0", "six==1.17.0", "sqlalchemy==2.0.51", - "starlette==1.4.0", + "starlette==1.4.1", "tweepy==4.17.0", "typing-extensions==4.16.0", "typing-inspection==0.4.2", From b2991915146fa836e40de980ba7335f88797e1d1 Mon Sep 17 00:00:00 2001 From: kittentm Date: Thu, 6 Aug 2026 09:03:52 +0200 Subject: [PATCH 30/37] feat: add team colours & battleResultRate to boss response --- routes/boss.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/routes/boss.py b/routes/boss.py index d003d0f..e3ef57e 100644 --- a/routes/boss.py +++ b/routes/boss.py @@ -47,6 +47,20 @@ async def boss_rotation(request: Request): }) return formatted + def nintydevsuranidiotforusingrgb(color_val): + if not color_val: + return "#000000" + if isinstance(color_val, str): + parts = [float(p.strip()) for p in color_val.split(",") if p.strip()] + elif isinstance(color_val, (list, tuple)): + parts = [float(p) for p in color_val] + else: + return "#000000" + + # trash 4th val + rgb = [round(c * 255) for c in parts[:3]] + return f"#{rgb[0]:02X}{rgb[1]:02X}{rgb[2]:02X}" + with open("boss.yaml", "r", encoding='utf-8') as f: yaml_data = yaml.safe_load(f) @@ -97,14 +111,19 @@ async def boss_rotation(request: Request): fest_result = parse_iso(time_cfg.get("Result")) teams = fes_yaml.get("Teams", []) - team_shortnames = [] + formatted_teams = [] for team in teams: - team_shortnames.append(team.get("ShortName", {})) + raw_color = team.get("Color") + formatted_teams.append({ + "shortName": team.get("ShortName", {}), + "color": nintydevsuranidiotforusingrgb(raw_color) + }) response_data["splatfestivalSplatfest"] = { "stages": format_stages(fes_yaml.get("Stages", [])), "mode": RULE_NAMES.get(fes_yaml.get("Rule"), "TurfWar"), - "teams": team_shortnames, + "teams": formatted_teams, + "battleResultRate": fes_yaml.get("BattleResultRate", {}), "time": { "start": fest_start, "end": fest_end, From c696d306aa2e83a5fea5d1f0d5e9b4f0a65acb53 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Fri, 7 Aug 2026 09:47:49 +0000 Subject: [PATCH 31/37] Update dependency pydantic-settings to v2.15.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7020f3b..0b674f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ dependencies = [ "pycparser==3.0", "pydantic==2.13.4", "pydantic-core==2.46.4", - "pydantic-settings==2.14.2", + "pydantic-settings==2.15.0", "python-dateutil==2.9.0.post0", "python-dotenv==1.2.2", "python-multipart==0.0.32", From 432931aab27e4106d32ac0ff01997adffa9552cd Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 8 Aug 2026 13:20:07 +0000 Subject: [PATCH 32/37] Update dependency starlette to v1.5.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 0b674f2..91acfab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [ "requests-oauthlib==2.0.0", "six==1.17.0", "sqlalchemy==2.0.51", - "starlette==1.4.1", + "starlette==1.5.0", "tweepy==4.17.0", "typing-extensions==4.16.0", "typing-inspection==0.4.2", From d4d6fd3d07fb89b29981092d066977ea7a9d329e Mon Sep 17 00:00:00 2001 From: red binder Date: Sat, 8 Aug 2026 21:17:43 +0200 Subject: [PATCH 33/37] update domain --- judd/routes/post.js | 4 ++-- services/auth.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/judd/routes/post.js b/judd/routes/post.js index f20a2a3..e8c7c00 100644 --- a/judd/routes/post.js +++ b/judd/routes/post.js @@ -34,7 +34,7 @@ router.post('/post', postLimiter, async (request, response, next) => { try { let isPidValid = true; try { - const spfnCheck = await axios.get(`https://account.spfn.net/api/v2/users/${pid}/mii`); + const spfnCheck = await axios.get(`https://account.spbr.net/api/v2/users/${pid}/mii`); if (typeof spfnCheck.data === 'string' && spfnCheck.data.includes('0008')) { isPidValid = false; } @@ -116,4 +116,4 @@ router.post('/post', postLimiter, async (request, response, next) => { return response.send('success'); }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/services/auth.py b/services/auth.py index 1064edc..efd1f49 100644 --- a/services/auth.py +++ b/services/auth.py @@ -2,7 +2,7 @@ import requests from config import settings from argon2 import PasswordHasher -API_URL = "https://account.spfn.net/api/v2" +API_URL = "https://account.spbr.net/api/v2" CLIENT_ID = "splatnet" CLIENT_SECRET = settings.account_client_secret ph = PasswordHasher() @@ -38,4 +38,4 @@ def get_profile(token): response = requests.get(url, headers=headers, timeout=10) - return response.json() if response.ok else None \ No newline at end of file + return response.json() if response.ok else None From 9625b1be621ed9c6a36b426670b28b01ebad4cd1 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 8 Aug 2026 19:33:41 +0000 Subject: [PATCH 34/37] Update dependency pg to v8.23.0 --- judd/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/judd/package-lock.json b/judd/package-lock.json index d2aa1f1..d6335ca 100644 --- a/judd/package-lock.json +++ b/judd/package-lock.json @@ -1477,14 +1477,14 @@ } }, "node_modules/pg": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.22.0.tgz", - "integrity": "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz", + "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==", "license": "MIT", "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", - "pg-protocol": "^1.15.0", + "pg-protocol": "^1.16.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -1547,9 +1547,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", - "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", + "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", "license": "MIT" }, "node_modules/pg-types": { From 2933b3bba0e4737609f74ba84fb903a4291a9c46 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Sat, 8 Aug 2026 19:03:09 +0000 Subject: [PATCH 35/37] Update dependency starlette to v1.6.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 91acfab..74fbd4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ dependencies = [ "requests-oauthlib==2.0.0", "six==1.17.0", "sqlalchemy==2.0.51", - "starlette==1.5.0", + "starlette==1.6.0", "tweepy==4.17.0", "typing-extensions==4.16.0", "typing-inspection==0.4.2", From 03c11b44627d3a4ea669c59135216f210297f64a Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 10 Aug 2026 09:47:35 +0000 Subject: [PATCH 36/37] Update dependency typing-inspection to v0.4.3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 74fbd4f..65e1911 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dependencies = [ "starlette==1.6.0", "tweepy==4.17.0", "typing-extensions==4.16.0", - "typing-inspection==0.4.2", + "typing-inspection==0.4.3", "tzdata==2026.3", "urllib3==2.7.0", "uvicorn==0.52.1", From 54041297e6f5c6941783617e3435713ca4e6be22 Mon Sep 17 00:00:00 2001 From: Spacebot Date: Mon, 10 Aug 2026 13:33:03 +0000 Subject: [PATCH 37/37] Update dependency greenlet to v3.5.5 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 65e1911..6dcb7ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ "cryptography==50.0.0", "fastapi==0.141.1", "fastapi-cache2==0.2.2", - "greenlet==3.5.4", + "greenlet==3.5.5", "h11==0.16.0", "httpcore==1.0.9", "httpx==0.28.1",