ctfy.sdk.resources.teams

client.teams — public team discovery + profile reads.

 1"""``client.teams`` — public team discovery + profile reads."""
 2
 3from __future__ import annotations
 4
 5import builtins
 6
 7from ctfy.sdk._helpers import _extract_items, _raise_for_status
 8from ctfy.sdk.base import BaseHttpClient
 9from ctfy.server.models import ProfileStats, TeamAchievement, TeamDetail, TeamInfo
10
11
12class TeamsResource:
13    """Public team list, detail, profile visualizations and unlock feed."""
14
15    def __init__(self, http: BaseHttpClient) -> None:
16        self._http = http
17
18    def list(self, offset: int = 0, limit: int = 50) -> builtins.list[TeamInfo]:
19        resp = self._http.request("GET", "/teams", params={"offset": offset, "limit": limit})
20        _raise_for_status(resp)
21        return _extract_items(resp.json(), TeamInfo)
22
23    def get(self, team_id: str) -> TeamDetail:
24        resp = self._http.request("GET", f"/teams/{team_id}")
25        _raise_for_status(resp)
26        return TeamDetail.model_validate(resp.json())
27
28    def profile_stats(self, team_id: str) -> ProfileStats:
29        """Activity calendar, per-tag radar, difficulty bar, solve trend
30        — every visualization on the team profile page."""
31        resp = self._http.request("GET", f"/teams/{team_id}/profile-stats")
32        _raise_for_status(resp)
33        return ProfileStats.model_validate(resp.json())
34
35    def achievements(
36        self, team_id: str, offset: int = 0, limit: int = 50
37    ) -> builtins.list[TeamAchievement]:
38        """The team's public unlock list (secret badges hidden)."""
39        resp = self._http.request(
40            "GET",
41            f"/teams/{team_id}/achievements",
42            params={"offset": offset, "limit": limit},
43        )
44        _raise_for_status(resp)
45        return [TeamAchievement.model_validate(a) for a in resp.json()["items"]]
class TeamsResource:
13class TeamsResource:
14    """Public team list, detail, profile visualizations and unlock feed."""
15
16    def __init__(self, http: BaseHttpClient) -> None:
17        self._http = http
18
19    def list(self, offset: int = 0, limit: int = 50) -> builtins.list[TeamInfo]:
20        resp = self._http.request("GET", "/teams", params={"offset": offset, "limit": limit})
21        _raise_for_status(resp)
22        return _extract_items(resp.json(), TeamInfo)
23
24    def get(self, team_id: str) -> TeamDetail:
25        resp = self._http.request("GET", f"/teams/{team_id}")
26        _raise_for_status(resp)
27        return TeamDetail.model_validate(resp.json())
28
29    def profile_stats(self, team_id: str) -> ProfileStats:
30        """Activity calendar, per-tag radar, difficulty bar, solve trend
31        — every visualization on the team profile page."""
32        resp = self._http.request("GET", f"/teams/{team_id}/profile-stats")
33        _raise_for_status(resp)
34        return ProfileStats.model_validate(resp.json())
35
36    def achievements(
37        self, team_id: str, offset: int = 0, limit: int = 50
38    ) -> builtins.list[TeamAchievement]:
39        """The team's public unlock list (secret badges hidden)."""
40        resp = self._http.request(
41            "GET",
42            f"/teams/{team_id}/achievements",
43            params={"offset": offset, "limit": limit},
44        )
45        _raise_for_status(resp)
46        return [TeamAchievement.model_validate(a) for a in resp.json()["items"]]

Public team list, detail, profile visualizations and unlock feed.

TeamsResource(http: ctfy.sdk.base.BaseHttpClient)
16    def __init__(self, http: BaseHttpClient) -> None:
17        self._http = http
def list( self, offset: int = 0, limit: int = 50) -> list[ctfy.server.models.TeamInfo]:
19    def list(self, offset: int = 0, limit: int = 50) -> builtins.list[TeamInfo]:
20        resp = self._http.request("GET", "/teams", params={"offset": offset, "limit": limit})
21        _raise_for_status(resp)
22        return _extract_items(resp.json(), TeamInfo)
def get(self, team_id: str) -> ctfy.server.models.TeamDetail:
24    def get(self, team_id: str) -> TeamDetail:
25        resp = self._http.request("GET", f"/teams/{team_id}")
26        _raise_for_status(resp)
27        return TeamDetail.model_validate(resp.json())
def profile_stats(self, team_id: str) -> ctfy.server.models.ProfileStats:
29    def profile_stats(self, team_id: str) -> ProfileStats:
30        """Activity calendar, per-tag radar, difficulty bar, solve trend
31        — every visualization on the team profile page."""
32        resp = self._http.request("GET", f"/teams/{team_id}/profile-stats")
33        _raise_for_status(resp)
34        return ProfileStats.model_validate(resp.json())

Activity calendar, per-tag radar, difficulty bar, solve trend — every visualization on the team profile page.

def achievements( self, team_id: str, offset: int = 0, limit: int = 50) -> list[ctfy.server.models.TeamAchievement]:
36    def achievements(
37        self, team_id: str, offset: int = 0, limit: int = 50
38    ) -> builtins.list[TeamAchievement]:
39        """The team's public unlock list (secret badges hidden)."""
40        resp = self._http.request(
41            "GET",
42            f"/teams/{team_id}/achievements",
43            params={"offset": offset, "limit": limit},
44        )
45        _raise_for_status(resp)
46        return [TeamAchievement.model_validate(a) for a in resp.json()["items"]]

The team's public unlock list (secret badges hidden).