summaryrefslogtreecommitdiff
path: root/codenames
diff options
context:
space:
mode:
authorAda Lovelace <alovelace@evroc.com>2026-04-21 12:45:34 +0000
committerAda Lovelace <alovelace@evroc.com>2026-04-21 12:45:34 +0000
commite196af69f3c2bcc3a045af375c8baba38607afeb (patch)
tree118a9038bde09f3cd4b4ccbb7049f9a2c3c958be /codenames
Hackathon StarterkitHEADmain
Diffstat (limited to 'codenames')
-rw-r--r--codenames/v1/admin_connect.py708
-rw-r--r--codenames/v1/admin_pb2.py89
-rw-r--r--codenames/v1/admin_pb2.pyi208
-rw-r--r--codenames/v1/bot_connect.py318
-rw-r--r--codenames/v1/bot_pb2.py62
-rw-r--r--codenames/v1/bot_pb2.pyi134
-rw-r--r--codenames/v1/game_connect.py1033
-rw-r--r--codenames/v1/game_pb2.py106
-rw-r--r--codenames/v1/game_pb2.pyi273
-rw-r--r--codenames/v1/ssh_keys_connect.py188
-rw-r--r--codenames/v1/ssh_keys_pb2.py47
-rw-r--r--codenames/v1/ssh_keys_pb2.pyi41
-rw-r--r--codenames/v1/types_pb2.py67
-rw-r--r--codenames/v1/types_pb2.pyi217
14 files changed, 3491 insertions, 0 deletions
diff --git a/codenames/v1/admin_connect.py b/codenames/v1/admin_connect.py
new file mode 100644
index 0000000..fc7d0ee
--- /dev/null
+++ b/codenames/v1/admin_connect.py
@@ -0,0 +1,708 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: codenames/v1/admin.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import codenames.v1.admin_pb2 as codenames_dot_v1_dot_admin__pb2
+
+
+class AdminService(Protocol):
+ async def get_config(self, request: codenames_dot_v1_dot_admin__pb2.GetConfigRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.GetConfigResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def update_config(self, request: codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def create_team(self, request: codenames_dot_v1_dot_admin__pb2.CreateTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.CreateTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_teams(self, request: codenames_dot_v1_dot_admin__pb2.ListTeamsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListTeamsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def update_team(self, request: codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def create_team_token(self, request: codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def revoke_team_token(self, request: codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_team_tokens(self, request: codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_s_s_h_key_submissions(self, request: codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def kill_game(self, request: codenames_dot_v1_dot_admin__pb2.KillGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.KillGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class AdminServiceASGIApplication(ConnectASGIApplication[AdminService]):
+ def __init__(self, service: AdminService | AsyncGenerator[AdminService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/codenames.v1.AdminService/GetConfig": Endpoint.unary(
+ method=MethodInfo(
+ name="GetConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.GetConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_config,
+ ),
+ "/codenames.v1.AdminService/UpdateConfig": Endpoint.unary(
+ method=MethodInfo(
+ name="UpdateConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.update_config,
+ ),
+ "/codenames.v1.AdminService/CreateTeam": Endpoint.unary(
+ method=MethodInfo(
+ name="CreateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.create_team,
+ ),
+ "/codenames.v1.AdminService/ListTeams": Endpoint.unary(
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_teams,
+ ),
+ "/codenames.v1.AdminService/UpdateTeam": Endpoint.unary(
+ method=MethodInfo(
+ name="UpdateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.update_team,
+ ),
+ "/codenames.v1.AdminService/CreateTeamToken": Endpoint.unary(
+ method=MethodInfo(
+ name="CreateTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.create_team_token,
+ ),
+ "/codenames.v1.AdminService/RevokeTeamToken": Endpoint.unary(
+ method=MethodInfo(
+ name="RevokeTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.revoke_team_token,
+ ),
+ "/codenames.v1.AdminService/ListTeamTokens": Endpoint.unary(
+ method=MethodInfo(
+ name="ListTeamTokens",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_team_tokens,
+ ),
+ "/codenames.v1.AdminService/ListSSHKeySubmissions": Endpoint.unary(
+ method=MethodInfo(
+ name="ListSSHKeySubmissions",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_s_s_h_key_submissions,
+ ),
+ "/codenames.v1.AdminService/KillGame": Endpoint.unary(
+ method=MethodInfo(
+ name="KillGame",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ output=codenames_dot_v1_dot_admin__pb2.KillGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.kill_game,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.AdminService"
+
+
+class AdminServiceClient(ConnectClient):
+ async def get_config(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.GetConfigResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.GetConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def update_config(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def create_team(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.CreateTeamResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_teams(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListTeamsResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def update_team(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def create_team_token(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def revoke_team_token(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="RevokeTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_team_tokens(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeamTokens",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_s_s_h_key_submissions(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListSSHKeySubmissions",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def kill_game(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.KillGameResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="KillGame",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ output=codenames_dot_v1_dot_admin__pb2.KillGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+class AdminServiceSync(Protocol):
+ def get_config(self, request: codenames_dot_v1_dot_admin__pb2.GetConfigRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.GetConfigResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def update_config(self, request: codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def create_team(self, request: codenames_dot_v1_dot_admin__pb2.CreateTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.CreateTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_teams(self, request: codenames_dot_v1_dot_admin__pb2.ListTeamsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListTeamsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def update_team(self, request: codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def create_team_token(self, request: codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def revoke_team_token(self, request: codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_team_tokens(self, request: codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_s_s_h_key_submissions(self, request: codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def kill_game(self, request: codenames_dot_v1_dot_admin__pb2.KillGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_admin__pb2.KillGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class AdminServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: AdminServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/codenames.v1.AdminService/GetConfig": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.GetConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_config,
+ ),
+ "/codenames.v1.AdminService/UpdateConfig": EndpointSync.unary(
+ method=MethodInfo(
+ name="UpdateConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.update_config,
+ ),
+ "/codenames.v1.AdminService/CreateTeam": EndpointSync.unary(
+ method=MethodInfo(
+ name="CreateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.create_team,
+ ),
+ "/codenames.v1.AdminService/ListTeams": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_teams,
+ ),
+ "/codenames.v1.AdminService/UpdateTeam": EndpointSync.unary(
+ method=MethodInfo(
+ name="UpdateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.update_team,
+ ),
+ "/codenames.v1.AdminService/CreateTeamToken": EndpointSync.unary(
+ method=MethodInfo(
+ name="CreateTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.create_team_token,
+ ),
+ "/codenames.v1.AdminService/RevokeTeamToken": EndpointSync.unary(
+ method=MethodInfo(
+ name="RevokeTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.revoke_team_token,
+ ),
+ "/codenames.v1.AdminService/ListTeamTokens": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListTeamTokens",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_team_tokens,
+ ),
+ "/codenames.v1.AdminService/ListSSHKeySubmissions": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListSSHKeySubmissions",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_s_s_h_key_submissions,
+ ),
+ "/codenames.v1.AdminService/KillGame": EndpointSync.unary(
+ method=MethodInfo(
+ name="KillGame",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ output=codenames_dot_v1_dot_admin__pb2.KillGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.kill_game,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.AdminService"
+
+
+class AdminServiceClientSync(ConnectClientSync):
+ def get_config(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.GetConfigResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.GetConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.GetConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def update_config(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateConfig",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateConfigRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateConfigResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def create_team(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.CreateTeamResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_teams(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListTeamsResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def update_team(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UpdateTeam",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.UpdateTeamRequest,
+ output=codenames_dot_v1_dot_admin__pb2.UpdateTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def create_team_token(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.CreateTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def revoke_team_token(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="RevokeTeamToken",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenRequest,
+ output=codenames_dot_v1_dot_admin__pb2.RevokeTeamTokenResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_team_tokens(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeamTokens",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListTeamTokensRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListTeamTokensResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_s_s_h_key_submissions(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListSSHKeySubmissions",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsRequest,
+ output=codenames_dot_v1_dot_admin__pb2.ListSSHKeySubmissionsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def kill_game(
+ self,
+ request: codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_admin__pb2.KillGameResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="KillGame",
+ service_name="codenames.v1.AdminService",
+ input=codenames_dot_v1_dot_admin__pb2.KillGameRequest,
+ output=codenames_dot_v1_dot_admin__pb2.KillGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
diff --git a/codenames/v1/admin_pb2.py b/codenames/v1/admin_pb2.py
new file mode 100644
index 0000000..402fe87
--- /dev/null
+++ b/codenames/v1/admin_pb2.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: codenames/v1/admin.proto
+# Protobuf Python Version: 7.34.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 34,
+ 1,
+ '',
+ 'codenames/v1/admin.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x63odenames/v1/admin.proto\x12\x0c\x63odenames.v1\"\x87\x02\n\rDynamicConfig\x12-\n\x12tournament_enabled\x18\x01 \x01(\x08R\x11tournamentEnabled\x12)\n\x11max_games_per_bot\x18\x02 \x01(\x05R\x0emaxGamesPerBot\x12\x45\n\x0f\x64ictionary_size\x18\x03 \x01(\x0e\x32\x1c.codenames.v1.DictionarySizeR\x0e\x64ictionarySize\x12U\n\x15\x63lue_validation_level\x18\x04 \x01(\x0e\x32!.codenames.v1.ClueValidationLevelR\x13\x63lueValidationLevel\"!\n\x0fKillGameRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\"\x12\n\x10KillGameResponse\"\x12\n\x10GetConfigRequest\"H\n\x11GetConfigResponse\x12\x33\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1b.codenames.v1.DynamicConfigR\x06\x63onfig\"\xfc\x02\n\x13UpdateConfigRequest\x12\x32\n\x12tournament_enabled\x18\x01 \x01(\x08H\x00R\x11tournamentEnabled\x88\x01\x01\x12.\n\x11max_games_per_bot\x18\x02 \x01(\x05H\x01R\x0emaxGamesPerBot\x88\x01\x01\x12J\n\x0f\x64ictionary_size\x18\x03 \x01(\x0e\x32\x1c.codenames.v1.DictionarySizeH\x02R\x0e\x64ictionarySize\x88\x01\x01\x12Z\n\x15\x63lue_validation_level\x18\x04 \x01(\x0e\x32!.codenames.v1.ClueValidationLevelH\x03R\x13\x63lueValidationLevel\x88\x01\x01\x42\x15\n\x13_tournament_enabledB\x14\n\x12_max_games_per_botB\x12\n\x10_dictionary_sizeB\x18\n\x16_clue_validation_level\"K\n\x14UpdateConfigResponse\x12\x33\n\x06\x63onfig\x18\x01 \x01(\x0b\x32\x1b.codenames.v1.DynamicConfigR\x06\x63onfig\"X\n\x0e\x43ontestantTeam\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x18\n\x05vm_ip\x18\x03 \x01(\tH\x00R\x04vmIp\x88\x01\x01\x42\x08\n\x06_vm_ip\"G\n\x0cTeamTokenRef\x12\x1d\n\ntoken_hash\x18\x01 \x01(\tR\ttokenHash\x12\x18\n\x07revoked\x18\x02 \x01(\x08R\x07revoked\"L\n\x11\x43reateTeamRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x13\n\x05vm_ip\x18\x03 \x01(\tR\x04vmIp\"\\\n\x12\x43reateTeamResponse\x12\x30\n\x04team\x18\x01 \x01(\x0b\x32\x1c.codenames.v1.ContestantTeamR\x04team\x12\x14\n\x05token\x18\x02 \x01(\tR\x05token\"r\n\x11UpdateTeamRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\x12\x17\n\x04name\x18\x02 \x01(\tH\x00R\x04name\x88\x01\x01\x12\x18\n\x05vm_ip\x18\x03 \x01(\tH\x01R\x04vmIp\x88\x01\x01\x42\x07\n\x05_nameB\x08\n\x06_vm_ip\"F\n\x12UpdateTeamResponse\x12\x30\n\x04team\x18\x01 \x01(\x0b\x32\x1c.codenames.v1.ContestantTeamR\x04team\"\x12\n\x10ListTeamsRequest\"G\n\x11ListTeamsResponse\x12\x32\n\x05teams\x18\x01 \x03(\x0b\x32\x1c.codenames.v1.ContestantTeamR\x05teams\"1\n\x16\x43reateTeamTokenRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\"/\n\x17\x43reateTeamTokenResponse\x12\x14\n\x05token\x18\x01 \x01(\tR\x05token\"7\n\x16RevokeTeamTokenRequest\x12\x1d\n\ntoken_hash\x18\x01 \x01(\tR\ttokenHash\"3\n\x17RevokeTeamTokenResponse\x12\x18\n\x07success\x18\x01 \x01(\x08R\x07success\"0\n\x15ListTeamTokensRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\"L\n\x16ListTeamTokensResponse\x12\x32\n\x06tokens\x18\x01 \x03(\x0b\x32\x1a.codenames.v1.TeamTokenRefR\x06tokens\"\xf3\x01\n\x10SSHKeySubmission\x12\x0e\n\x02id\x18\x01 \x01(\x03R\x02id\x12\'\n\x0f\x63ontestant_name\x18\x02 \x01(\tR\x0e\x63ontestantName\x12\x17\n\x07team_id\x18\x03 \x01(\tR\x06teamId\x12\x1b\n\tteam_name\x18\x04 \x01(\tR\x08teamName\x12$\n\x0essh_public_key\x18\x05 \x01(\tR\x0csshPublicKey\x12\'\n\x0fkey_fingerprint\x18\x06 \x01(\tR\x0ekeyFingerprint\x12!\n\x0csubmitted_at\x18\x07 \x01(\tR\x0bsubmittedAt\"7\n\x1cListSSHKeySubmissionsRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\"a\n\x1dListSSHKeySubmissionsResponse\x12@\n\x0bsubmissions\x18\x01 \x03(\x0b\x32\x1e.codenames.v1.SSHKeySubmissionR\x0bsubmissions*\x83\x01\n\x0e\x44ictionarySize\x12\x1f\n\x1b\x44ICTIONARY_SIZE_UNSPECIFIED\x10\x00\x12\x19\n\x15\x44ICTIONARY_SIZE_SMALL\x10\x01\x12\x1a\n\x16\x44ICTIONARY_SIZE_MEDIUM\x10\x02\x12\x19\n\x15\x44ICTIONARY_SIZE_LARGE\x10\x03*\xa8\x01\n\x13\x43lueValidationLevel\x12%\n!CLUE_VALIDATION_LEVEL_UNSPECIFIED\x10\x00\x12$\n CLUE_VALIDATION_LEVEL_PERMISSIVE\x10\x01\x12\"\n\x1e\x43LUE_VALIDATION_LEVEL_STANDARD\x10\x02\x12 \n\x1c\x43LUE_VALIDATION_LEVEL_STRICT\x10\x03\x32\xfd\x06\n\x0c\x41\x64minService\x12L\n\tGetConfig\x12\x1e.codenames.v1.GetConfigRequest\x1a\x1f.codenames.v1.GetConfigResponse\x12U\n\x0cUpdateConfig\x12!.codenames.v1.UpdateConfigRequest\x1a\".codenames.v1.UpdateConfigResponse\x12O\n\nCreateTeam\x12\x1f.codenames.v1.CreateTeamRequest\x1a .codenames.v1.CreateTeamResponse\x12L\n\tListTeams\x12\x1e.codenames.v1.ListTeamsRequest\x1a\x1f.codenames.v1.ListTeamsResponse\x12O\n\nUpdateTeam\x12\x1f.codenames.v1.UpdateTeamRequest\x1a .codenames.v1.UpdateTeamResponse\x12^\n\x0f\x43reateTeamToken\x12$.codenames.v1.CreateTeamTokenRequest\x1a%.codenames.v1.CreateTeamTokenResponse\x12^\n\x0fRevokeTeamToken\x12$.codenames.v1.RevokeTeamTokenRequest\x1a%.codenames.v1.RevokeTeamTokenResponse\x12[\n\x0eListTeamTokens\x12#.codenames.v1.ListTeamTokensRequest\x1a$.codenames.v1.ListTeamTokensResponse\x12p\n\x15ListSSHKeySubmissions\x12*.codenames.v1.ListSSHKeySubmissionsRequest\x1a+.codenames.v1.ListSSHKeySubmissionsResponse\x12I\n\x08KillGame\x12\x1d.codenames.v1.KillGameRequest\x1a\x1e.codenames.v1.KillGameResponseB\x97\x01\n\x10\x63om.codenames.v1B\nAdminProtoP\x01Z&codenames/gen/codenames/v1;codenamesv1\xa2\x02\x03\x43XX\xaa\x02\x0c\x43odenames.V1\xca\x02\x0c\x43odenames\\V1\xe2\x02\x18\x43odenames\\V1\\GPBMetadata\xea\x02\rCodenames::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'codenames.v1.admin_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\020com.codenames.v1B\nAdminProtoP\001Z&codenames/gen/codenames/v1;codenamesv1\242\002\003CXX\252\002\014Codenames.V1\312\002\014Codenames\\V1\342\002\030Codenames\\V1\\GPBMetadata\352\002\rCodenames::V1'
+ _globals['_DICTIONARYSIZE']._serialized_start=2274
+ _globals['_DICTIONARYSIZE']._serialized_end=2405
+ _globals['_CLUEVALIDATIONLEVEL']._serialized_start=2408
+ _globals['_CLUEVALIDATIONLEVEL']._serialized_end=2576
+ _globals['_DYNAMICCONFIG']._serialized_start=43
+ _globals['_DYNAMICCONFIG']._serialized_end=306
+ _globals['_KILLGAMEREQUEST']._serialized_start=308
+ _globals['_KILLGAMEREQUEST']._serialized_end=341
+ _globals['_KILLGAMERESPONSE']._serialized_start=343
+ _globals['_KILLGAMERESPONSE']._serialized_end=361
+ _globals['_GETCONFIGREQUEST']._serialized_start=363
+ _globals['_GETCONFIGREQUEST']._serialized_end=381
+ _globals['_GETCONFIGRESPONSE']._serialized_start=383
+ _globals['_GETCONFIGRESPONSE']._serialized_end=455
+ _globals['_UPDATECONFIGREQUEST']._serialized_start=458
+ _globals['_UPDATECONFIGREQUEST']._serialized_end=838
+ _globals['_UPDATECONFIGRESPONSE']._serialized_start=840
+ _globals['_UPDATECONFIGRESPONSE']._serialized_end=915
+ _globals['_CONTESTANTTEAM']._serialized_start=917
+ _globals['_CONTESTANTTEAM']._serialized_end=1005
+ _globals['_TEAMTOKENREF']._serialized_start=1007
+ _globals['_TEAMTOKENREF']._serialized_end=1078
+ _globals['_CREATETEAMREQUEST']._serialized_start=1080
+ _globals['_CREATETEAMREQUEST']._serialized_end=1156
+ _globals['_CREATETEAMRESPONSE']._serialized_start=1158
+ _globals['_CREATETEAMRESPONSE']._serialized_end=1250
+ _globals['_UPDATETEAMREQUEST']._serialized_start=1252
+ _globals['_UPDATETEAMREQUEST']._serialized_end=1366
+ _globals['_UPDATETEAMRESPONSE']._serialized_start=1368
+ _globals['_UPDATETEAMRESPONSE']._serialized_end=1438
+ _globals['_LISTTEAMSREQUEST']._serialized_start=1440
+ _globals['_LISTTEAMSREQUEST']._serialized_end=1458
+ _globals['_LISTTEAMSRESPONSE']._serialized_start=1460
+ _globals['_LISTTEAMSRESPONSE']._serialized_end=1531
+ _globals['_CREATETEAMTOKENREQUEST']._serialized_start=1533
+ _globals['_CREATETEAMTOKENREQUEST']._serialized_end=1582
+ _globals['_CREATETEAMTOKENRESPONSE']._serialized_start=1584
+ _globals['_CREATETEAMTOKENRESPONSE']._serialized_end=1631
+ _globals['_REVOKETEAMTOKENREQUEST']._serialized_start=1633
+ _globals['_REVOKETEAMTOKENREQUEST']._serialized_end=1688
+ _globals['_REVOKETEAMTOKENRESPONSE']._serialized_start=1690
+ _globals['_REVOKETEAMTOKENRESPONSE']._serialized_end=1741
+ _globals['_LISTTEAMTOKENSREQUEST']._serialized_start=1743
+ _globals['_LISTTEAMTOKENSREQUEST']._serialized_end=1791
+ _globals['_LISTTEAMTOKENSRESPONSE']._serialized_start=1793
+ _globals['_LISTTEAMTOKENSRESPONSE']._serialized_end=1869
+ _globals['_SSHKEYSUBMISSION']._serialized_start=1872
+ _globals['_SSHKEYSUBMISSION']._serialized_end=2115
+ _globals['_LISTSSHKEYSUBMISSIONSREQUEST']._serialized_start=2117
+ _globals['_LISTSSHKEYSUBMISSIONSREQUEST']._serialized_end=2172
+ _globals['_LISTSSHKEYSUBMISSIONSRESPONSE']._serialized_start=2174
+ _globals['_LISTSSHKEYSUBMISSIONSRESPONSE']._serialized_end=2271
+ _globals['_ADMINSERVICE']._serialized_start=2579
+ _globals['_ADMINSERVICE']._serialized_end=3472
+# @@protoc_insertion_point(module_scope)
diff --git a/codenames/v1/admin_pb2.pyi b/codenames/v1/admin_pb2.pyi
new file mode 100644
index 0000000..5cc0705
--- /dev/null
+++ b/codenames/v1/admin_pb2.pyi
@@ -0,0 +1,208 @@
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class DictionarySize(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ DICTIONARY_SIZE_UNSPECIFIED: _ClassVar[DictionarySize]
+ DICTIONARY_SIZE_SMALL: _ClassVar[DictionarySize]
+ DICTIONARY_SIZE_MEDIUM: _ClassVar[DictionarySize]
+ DICTIONARY_SIZE_LARGE: _ClassVar[DictionarySize]
+
+class ClueValidationLevel(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ CLUE_VALIDATION_LEVEL_UNSPECIFIED: _ClassVar[ClueValidationLevel]
+ CLUE_VALIDATION_LEVEL_PERMISSIVE: _ClassVar[ClueValidationLevel]
+ CLUE_VALIDATION_LEVEL_STANDARD: _ClassVar[ClueValidationLevel]
+ CLUE_VALIDATION_LEVEL_STRICT: _ClassVar[ClueValidationLevel]
+DICTIONARY_SIZE_UNSPECIFIED: DictionarySize
+DICTIONARY_SIZE_SMALL: DictionarySize
+DICTIONARY_SIZE_MEDIUM: DictionarySize
+DICTIONARY_SIZE_LARGE: DictionarySize
+CLUE_VALIDATION_LEVEL_UNSPECIFIED: ClueValidationLevel
+CLUE_VALIDATION_LEVEL_PERMISSIVE: ClueValidationLevel
+CLUE_VALIDATION_LEVEL_STANDARD: ClueValidationLevel
+CLUE_VALIDATION_LEVEL_STRICT: ClueValidationLevel
+
+class DynamicConfig(_message.Message):
+ __slots__ = ("tournament_enabled", "max_games_per_bot", "dictionary_size", "clue_validation_level")
+ TOURNAMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
+ MAX_GAMES_PER_BOT_FIELD_NUMBER: _ClassVar[int]
+ DICTIONARY_SIZE_FIELD_NUMBER: _ClassVar[int]
+ CLUE_VALIDATION_LEVEL_FIELD_NUMBER: _ClassVar[int]
+ tournament_enabled: bool
+ max_games_per_bot: int
+ dictionary_size: DictionarySize
+ clue_validation_level: ClueValidationLevel
+ def __init__(self, tournament_enabled: _Optional[bool] = ..., max_games_per_bot: _Optional[int] = ..., dictionary_size: _Optional[_Union[DictionarySize, str]] = ..., clue_validation_level: _Optional[_Union[ClueValidationLevel, str]] = ...) -> None: ...
+
+class KillGameRequest(_message.Message):
+ __slots__ = ("id",)
+ ID_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ def __init__(self, id: _Optional[str] = ...) -> None: ...
+
+class KillGameResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class GetConfigRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class GetConfigResponse(_message.Message):
+ __slots__ = ("config",)
+ CONFIG_FIELD_NUMBER: _ClassVar[int]
+ config: DynamicConfig
+ def __init__(self, config: _Optional[_Union[DynamicConfig, _Mapping]] = ...) -> None: ...
+
+class UpdateConfigRequest(_message.Message):
+ __slots__ = ("tournament_enabled", "max_games_per_bot", "dictionary_size", "clue_validation_level")
+ TOURNAMENT_ENABLED_FIELD_NUMBER: _ClassVar[int]
+ MAX_GAMES_PER_BOT_FIELD_NUMBER: _ClassVar[int]
+ DICTIONARY_SIZE_FIELD_NUMBER: _ClassVar[int]
+ CLUE_VALIDATION_LEVEL_FIELD_NUMBER: _ClassVar[int]
+ tournament_enabled: bool
+ max_games_per_bot: int
+ dictionary_size: DictionarySize
+ clue_validation_level: ClueValidationLevel
+ def __init__(self, tournament_enabled: _Optional[bool] = ..., max_games_per_bot: _Optional[int] = ..., dictionary_size: _Optional[_Union[DictionarySize, str]] = ..., clue_validation_level: _Optional[_Union[ClueValidationLevel, str]] = ...) -> None: ...
+
+class UpdateConfigResponse(_message.Message):
+ __slots__ = ("config",)
+ CONFIG_FIELD_NUMBER: _ClassVar[int]
+ config: DynamicConfig
+ def __init__(self, config: _Optional[_Union[DynamicConfig, _Mapping]] = ...) -> None: ...
+
+class ContestantTeam(_message.Message):
+ __slots__ = ("id", "name", "vm_ip")
+ ID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ VM_IP_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ name: str
+ vm_ip: str
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., vm_ip: _Optional[str] = ...) -> None: ...
+
+class TeamTokenRef(_message.Message):
+ __slots__ = ("token_hash", "revoked")
+ TOKEN_HASH_FIELD_NUMBER: _ClassVar[int]
+ REVOKED_FIELD_NUMBER: _ClassVar[int]
+ token_hash: str
+ revoked: bool
+ def __init__(self, token_hash: _Optional[str] = ..., revoked: _Optional[bool] = ...) -> None: ...
+
+class CreateTeamRequest(_message.Message):
+ __slots__ = ("id", "name", "vm_ip")
+ ID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ VM_IP_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ name: str
+ vm_ip: str
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., vm_ip: _Optional[str] = ...) -> None: ...
+
+class CreateTeamResponse(_message.Message):
+ __slots__ = ("team", "token")
+ TEAM_FIELD_NUMBER: _ClassVar[int]
+ TOKEN_FIELD_NUMBER: _ClassVar[int]
+ team: ContestantTeam
+ token: str
+ def __init__(self, team: _Optional[_Union[ContestantTeam, _Mapping]] = ..., token: _Optional[str] = ...) -> None: ...
+
+class UpdateTeamRequest(_message.Message):
+ __slots__ = ("team_id", "name", "vm_ip")
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ VM_IP_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ name: str
+ vm_ip: str
+ def __init__(self, team_id: _Optional[str] = ..., name: _Optional[str] = ..., vm_ip: _Optional[str] = ...) -> None: ...
+
+class UpdateTeamResponse(_message.Message):
+ __slots__ = ("team",)
+ TEAM_FIELD_NUMBER: _ClassVar[int]
+ team: ContestantTeam
+ def __init__(self, team: _Optional[_Union[ContestantTeam, _Mapping]] = ...) -> None: ...
+
+class ListTeamsRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class ListTeamsResponse(_message.Message):
+ __slots__ = ("teams",)
+ TEAMS_FIELD_NUMBER: _ClassVar[int]
+ teams: _containers.RepeatedCompositeFieldContainer[ContestantTeam]
+ def __init__(self, teams: _Optional[_Iterable[_Union[ContestantTeam, _Mapping]]] = ...) -> None: ...
+
+class CreateTeamTokenRequest(_message.Message):
+ __slots__ = ("team_id",)
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ def __init__(self, team_id: _Optional[str] = ...) -> None: ...
+
+class CreateTeamTokenResponse(_message.Message):
+ __slots__ = ("token",)
+ TOKEN_FIELD_NUMBER: _ClassVar[int]
+ token: str
+ def __init__(self, token: _Optional[str] = ...) -> None: ...
+
+class RevokeTeamTokenRequest(_message.Message):
+ __slots__ = ("token_hash",)
+ TOKEN_HASH_FIELD_NUMBER: _ClassVar[int]
+ token_hash: str
+ def __init__(self, token_hash: _Optional[str] = ...) -> None: ...
+
+class RevokeTeamTokenResponse(_message.Message):
+ __slots__ = ("success",)
+ SUCCESS_FIELD_NUMBER: _ClassVar[int]
+ success: bool
+ def __init__(self, success: _Optional[bool] = ...) -> None: ...
+
+class ListTeamTokensRequest(_message.Message):
+ __slots__ = ("team_id",)
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ def __init__(self, team_id: _Optional[str] = ...) -> None: ...
+
+class ListTeamTokensResponse(_message.Message):
+ __slots__ = ("tokens",)
+ TOKENS_FIELD_NUMBER: _ClassVar[int]
+ tokens: _containers.RepeatedCompositeFieldContainer[TeamTokenRef]
+ def __init__(self, tokens: _Optional[_Iterable[_Union[TeamTokenRef, _Mapping]]] = ...) -> None: ...
+
+class SSHKeySubmission(_message.Message):
+ __slots__ = ("id", "contestant_name", "team_id", "team_name", "ssh_public_key", "key_fingerprint", "submitted_at")
+ ID_FIELD_NUMBER: _ClassVar[int]
+ CONTESTANT_NAME_FIELD_NUMBER: _ClassVar[int]
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ TEAM_NAME_FIELD_NUMBER: _ClassVar[int]
+ SSH_PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
+ KEY_FINGERPRINT_FIELD_NUMBER: _ClassVar[int]
+ SUBMITTED_AT_FIELD_NUMBER: _ClassVar[int]
+ id: int
+ contestant_name: str
+ team_id: str
+ team_name: str
+ ssh_public_key: str
+ key_fingerprint: str
+ submitted_at: str
+ def __init__(self, id: _Optional[int] = ..., contestant_name: _Optional[str] = ..., team_id: _Optional[str] = ..., team_name: _Optional[str] = ..., ssh_public_key: _Optional[str] = ..., key_fingerprint: _Optional[str] = ..., submitted_at: _Optional[str] = ...) -> None: ...
+
+class ListSSHKeySubmissionsRequest(_message.Message):
+ __slots__ = ("team_id",)
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ def __init__(self, team_id: _Optional[str] = ...) -> None: ...
+
+class ListSSHKeySubmissionsResponse(_message.Message):
+ __slots__ = ("submissions",)
+ SUBMISSIONS_FIELD_NUMBER: _ClassVar[int]
+ submissions: _containers.RepeatedCompositeFieldContainer[SSHKeySubmission]
+ def __init__(self, submissions: _Optional[_Iterable[_Union[SSHKeySubmission, _Mapping]]] = ...) -> None: ...
diff --git a/codenames/v1/bot_connect.py b/codenames/v1/bot_connect.py
new file mode 100644
index 0000000..4ac205d
--- /dev/null
+++ b/codenames/v1/bot_connect.py
@@ -0,0 +1,318 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: codenames/v1/bot.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import codenames.v1.bot_pb2 as codenames_dot_v1_dot_bot__pb2
+
+
+class BotService(Protocol):
+ async def game_started(self, request: codenames_dot_v1_dot_bot__pb2.GameStartedRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GameStartedResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def give_clue(self, request: codenames_dot_v1_dot_bot__pb2.GiveClueRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GiveClueResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def make_guess(self, request: codenames_dot_v1_dot_bot__pb2.MakeGuessRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.MakeGuessResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def game_ended(self, request: codenames_dot_v1_dot_bot__pb2.GameEndedRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GameEndedResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class BotServiceASGIApplication(ConnectASGIApplication[BotService]):
+ def __init__(self, service: BotService | AsyncGenerator[BotService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/codenames.v1.BotService/GameStarted": Endpoint.unary(
+ method=MethodInfo(
+ name="GameStarted",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameStartedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.game_started,
+ ),
+ "/codenames.v1.BotService/GiveClue": Endpoint.unary(
+ method=MethodInfo(
+ name="GiveClue",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GiveClueResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.give_clue,
+ ),
+ "/codenames.v1.BotService/MakeGuess": Endpoint.unary(
+ method=MethodInfo(
+ name="MakeGuess",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ output=codenames_dot_v1_dot_bot__pb2.MakeGuessResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.make_guess,
+ ),
+ "/codenames.v1.BotService/GameEnded": Endpoint.unary(
+ method=MethodInfo(
+ name="GameEnded",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameEndedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.game_ended,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.BotService"
+
+
+class BotServiceClient(ConnectClient):
+ async def game_started(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GameStartedResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GameStarted",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameStartedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def give_clue(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GiveClueResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GiveClue",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GiveClueResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def make_guess(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.MakeGuessResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="MakeGuess",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ output=codenames_dot_v1_dot_bot__pb2.MakeGuessResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def game_ended(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GameEndedResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GameEnded",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameEndedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+class BotServiceSync(Protocol):
+ def game_started(self, request: codenames_dot_v1_dot_bot__pb2.GameStartedRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GameStartedResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def give_clue(self, request: codenames_dot_v1_dot_bot__pb2.GiveClueRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GiveClueResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def make_guess(self, request: codenames_dot_v1_dot_bot__pb2.MakeGuessRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.MakeGuessResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def game_ended(self, request: codenames_dot_v1_dot_bot__pb2.GameEndedRequest, ctx: RequestContext) -> codenames_dot_v1_dot_bot__pb2.GameEndedResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class BotServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: BotServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/codenames.v1.BotService/GameStarted": EndpointSync.unary(
+ method=MethodInfo(
+ name="GameStarted",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameStartedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.game_started,
+ ),
+ "/codenames.v1.BotService/GiveClue": EndpointSync.unary(
+ method=MethodInfo(
+ name="GiveClue",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GiveClueResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.give_clue,
+ ),
+ "/codenames.v1.BotService/MakeGuess": EndpointSync.unary(
+ method=MethodInfo(
+ name="MakeGuess",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ output=codenames_dot_v1_dot_bot__pb2.MakeGuessResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.make_guess,
+ ),
+ "/codenames.v1.BotService/GameEnded": EndpointSync.unary(
+ method=MethodInfo(
+ name="GameEnded",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameEndedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.game_ended,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.BotService"
+
+
+class BotServiceClientSync(ConnectClientSync):
+ def game_started(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GameStartedResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GameStarted",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameStartedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameStartedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def give_clue(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GiveClueResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GiveClue",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GiveClueRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GiveClueResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def make_guess(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.MakeGuessResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="MakeGuess",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.MakeGuessRequest,
+ output=codenames_dot_v1_dot_bot__pb2.MakeGuessResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def game_ended(
+ self,
+ request: codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_bot__pb2.GameEndedResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GameEnded",
+ service_name="codenames.v1.BotService",
+ input=codenames_dot_v1_dot_bot__pb2.GameEndedRequest,
+ output=codenames_dot_v1_dot_bot__pb2.GameEndedResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
diff --git a/codenames/v1/bot_pb2.py b/codenames/v1/bot_pb2.py
new file mode 100644
index 0000000..f7d5576
--- /dev/null
+++ b/codenames/v1/bot_pb2.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: codenames/v1/bot.proto
+# Protobuf Python Version: 7.34.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 34,
+ 1,
+ '',
+ 'codenames/v1/bot.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from codenames.v1 import types_pb2 as codenames_dot_v1_dot_types__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x63odenames/v1/bot.proto\x12\x0c\x63odenames.v1\x1a\x18\x63odenames/v1/types.proto\"\xd1\x01\n\x12GameStartedRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\x12\x15\n\x06\x62ot_id\x18\x02 \x01(\tR\x05\x62otId\x12/\n\tyour_team\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x08yourTeam\x12/\n\tyour_role\x18\x04 \x01(\x0e\x32\x12.codenames.v1.RoleR\x08yourRole\x12)\n\x05\x62oard\x18\x05 \x01(\x0b\x32\x13.codenames.v1.BoardR\x05\x62oard\"\x15\n\x13GameStartedResponse\"\xed\x02\n\x0fGiveClueRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\x12\x15\n\x06\x62ot_id\x18\x02 \x01(\tR\x05\x62otId\x12\x35\n\x0c\x63urrent_team\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x0b\x63urrentTeam\x12I\n\x15moves_since_last_turn\x18\x04 \x03(\x0b\x32\x16.codenames.v1.GameMoveR\x12movesSinceLastTurn\x12$\n\x0ered_cards_left\x18\x05 \x01(\x05R\x0credCardsLeft\x12&\n\x0f\x62lue_cards_left\x18\x06 \x01(\x05R\rblueCardsLeft\x12\x1f\n\x0b\x63lue_number\x18\x07 \x01(\x05R\nclueNumber\x12\x39\n\x0b\x62ot_context\x18\x08 \x01(\x0b\x32\x18.codenames.v1.BotContextR\nbotContext\"Y\n\x10GiveClueResponse\x12;\n\tgive_clue\x18\x01 \x01(\x0b\x32\x1c.codenames.v1.GiveClueActionH\x00R\x08giveClueB\x08\n\x06\x61\x63tion\":\n\x0eGiveClueAction\x12\x12\n\x04word\x18\x01 \x01(\tR\x04word\x12\x14\n\x05\x63ount\x18\x02 \x01(\x05R\x05\x63ount\"\x98\x03\n\x10MakeGuessRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\x12\x15\n\x06\x62ot_id\x18\x02 \x01(\tR\x05\x62otId\x12\x35\n\x0c\x63urrent_team\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x0b\x63urrentTeam\x12I\n\x15moves_since_last_turn\x18\x04 \x03(\x0b\x32\x16.codenames.v1.GameMoveR\x12movesSinceLastTurn\x12&\n\x04\x63lue\x18\x05 \x01(\x0b\x32\x12.codenames.v1.ClueR\x04\x63lue\x12!\n\x0cguesses_made\x18\x06 \x01(\x05R\x0bguessesMade\x12+\n\x11guesses_remaining\x18\x07 \x01(\x05R\x10guessesRemaining\x12\x1f\n\x0b\x63lue_number\x18\x08 \x01(\x05R\nclueNumber\x12\x39\n\x0b\x62ot_context\x18\t \x01(\x0b\x32\x18.codenames.v1.BotContextR\nbotContext\"\x97\x01\n\x11MakeGuessResponse\x12>\n\nguess_word\x18\x01 \x01(\x0b\x32\x1d.codenames.v1.GuessWordActionH\x00R\tguessWord\x12\x38\n\x08\x65nd_turn\x18\x02 \x01(\x0b\x32\x1b.codenames.v1.EndTurnActionH\x00R\x07\x65ndTurnB\x08\n\x06\x61\x63tion\"%\n\x0fGuessWordAction\x12\x12\n\x04word\x18\x01 \x01(\tR\x04word\"\x0f\n\rEndTurnAction\"T\n\nBotContext\x12\'\n\x0f\x63urrent_strikes\x18\x01 \x01(\x05R\x0e\x63urrentStrikes\x12\x1d\n\nlast_error\x18\x02 \x01(\tR\tlastError\"\x8a\x03\n\x10GameEndedRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\x12\x15\n\x06\x62ot_id\x18\x02 \x01(\tR\x05\x62otId\x12*\n\x06winner\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x06winner\x12$\n\x0ered_cards_left\x18\x04 \x01(\x05R\x0credCardsLeft\x12&\n\x0f\x62lue_cards_left\x18\x05 \x01(\x05R\rblueCardsLeft\x12\x1f\n\x0btotal_moves\x18\x06 \x01(\x05R\ntotalMoves\x12?\n\x0fremaining_moves\x18\x07 \x03(\x0b\x32\x16.codenames.v1.GameMoveR\x0eremainingMoves\x12:\n\nend_reason\x18\x08 \x01(\x0e\x32\x1b.codenames.v1.GameEndReasonR\tendReason\x12.\n\x13\x64isqualified_bot_id\x18\t \x01(\tR\x11\x64isqualifiedBotId\"\x13\n\x11GameEndedResponse2\xc7\x02\n\nBotService\x12R\n\x0bGameStarted\x12 .codenames.v1.GameStartedRequest\x1a!.codenames.v1.GameStartedResponse\x12I\n\x08GiveClue\x12\x1d.codenames.v1.GiveClueRequest\x1a\x1e.codenames.v1.GiveClueResponse\x12L\n\tMakeGuess\x12\x1e.codenames.v1.MakeGuessRequest\x1a\x1f.codenames.v1.MakeGuessResponse\x12L\n\tGameEnded\x12\x1e.codenames.v1.GameEndedRequest\x1a\x1f.codenames.v1.GameEndedResponseB\x95\x01\n\x10\x63om.codenames.v1B\x08\x42otProtoP\x01Z&codenames/gen/codenames/v1;codenamesv1\xa2\x02\x03\x43XX\xaa\x02\x0c\x43odenames.V1\xca\x02\x0c\x43odenames\\V1\xe2\x02\x18\x43odenames\\V1\\GPBMetadata\xea\x02\rCodenames::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'codenames.v1.bot_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\020com.codenames.v1B\010BotProtoP\001Z&codenames/gen/codenames/v1;codenamesv1\242\002\003CXX\252\002\014Codenames.V1\312\002\014Codenames\\V1\342\002\030Codenames\\V1\\GPBMetadata\352\002\rCodenames::V1'
+ _globals['_GAMESTARTEDREQUEST']._serialized_start=67
+ _globals['_GAMESTARTEDREQUEST']._serialized_end=276
+ _globals['_GAMESTARTEDRESPONSE']._serialized_start=278
+ _globals['_GAMESTARTEDRESPONSE']._serialized_end=299
+ _globals['_GIVECLUEREQUEST']._serialized_start=302
+ _globals['_GIVECLUEREQUEST']._serialized_end=667
+ _globals['_GIVECLUERESPONSE']._serialized_start=669
+ _globals['_GIVECLUERESPONSE']._serialized_end=758
+ _globals['_GIVECLUEACTION']._serialized_start=760
+ _globals['_GIVECLUEACTION']._serialized_end=818
+ _globals['_MAKEGUESSREQUEST']._serialized_start=821
+ _globals['_MAKEGUESSREQUEST']._serialized_end=1229
+ _globals['_MAKEGUESSRESPONSE']._serialized_start=1232
+ _globals['_MAKEGUESSRESPONSE']._serialized_end=1383
+ _globals['_GUESSWORDACTION']._serialized_start=1385
+ _globals['_GUESSWORDACTION']._serialized_end=1422
+ _globals['_ENDTURNACTION']._serialized_start=1424
+ _globals['_ENDTURNACTION']._serialized_end=1439
+ _globals['_BOTCONTEXT']._serialized_start=1441
+ _globals['_BOTCONTEXT']._serialized_end=1525
+ _globals['_GAMEENDEDREQUEST']._serialized_start=1528
+ _globals['_GAMEENDEDREQUEST']._serialized_end=1922
+ _globals['_GAMEENDEDRESPONSE']._serialized_start=1924
+ _globals['_GAMEENDEDRESPONSE']._serialized_end=1943
+ _globals['_BOTSERVICE']._serialized_start=1946
+ _globals['_BOTSERVICE']._serialized_end=2273
+# @@protoc_insertion_point(module_scope)
diff --git a/codenames/v1/bot_pb2.pyi b/codenames/v1/bot_pb2.pyi
new file mode 100644
index 0000000..8faaae0
--- /dev/null
+++ b/codenames/v1/bot_pb2.pyi
@@ -0,0 +1,134 @@
+from codenames.v1 import types_pb2 as _types_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class GameStartedRequest(_message.Message):
+ __slots__ = ("game_id", "bot_id", "your_team", "your_role", "board")
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ YOUR_TEAM_FIELD_NUMBER: _ClassVar[int]
+ YOUR_ROLE_FIELD_NUMBER: _ClassVar[int]
+ BOARD_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ bot_id: str
+ your_team: _types_pb2.Team
+ your_role: _types_pb2.Role
+ board: _types_pb2.Board
+ def __init__(self, game_id: _Optional[str] = ..., bot_id: _Optional[str] = ..., your_team: _Optional[_Union[_types_pb2.Team, str]] = ..., your_role: _Optional[_Union[_types_pb2.Role, str]] = ..., board: _Optional[_Union[_types_pb2.Board, _Mapping]] = ...) -> None: ...
+
+class GameStartedResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class GiveClueRequest(_message.Message):
+ __slots__ = ("game_id", "bot_id", "current_team", "moves_since_last_turn", "red_cards_left", "blue_cards_left", "clue_number", "bot_context")
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ CURRENT_TEAM_FIELD_NUMBER: _ClassVar[int]
+ MOVES_SINCE_LAST_TURN_FIELD_NUMBER: _ClassVar[int]
+ RED_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ BLUE_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ CLUE_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ BOT_CONTEXT_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ bot_id: str
+ current_team: _types_pb2.Team
+ moves_since_last_turn: _containers.RepeatedCompositeFieldContainer[_types_pb2.GameMove]
+ red_cards_left: int
+ blue_cards_left: int
+ clue_number: int
+ bot_context: BotContext
+ def __init__(self, game_id: _Optional[str] = ..., bot_id: _Optional[str] = ..., current_team: _Optional[_Union[_types_pb2.Team, str]] = ..., moves_since_last_turn: _Optional[_Iterable[_Union[_types_pb2.GameMove, _Mapping]]] = ..., red_cards_left: _Optional[int] = ..., blue_cards_left: _Optional[int] = ..., clue_number: _Optional[int] = ..., bot_context: _Optional[_Union[BotContext, _Mapping]] = ...) -> None: ...
+
+class GiveClueResponse(_message.Message):
+ __slots__ = ("give_clue",)
+ GIVE_CLUE_FIELD_NUMBER: _ClassVar[int]
+ give_clue: GiveClueAction
+ def __init__(self, give_clue: _Optional[_Union[GiveClueAction, _Mapping]] = ...) -> None: ...
+
+class GiveClueAction(_message.Message):
+ __slots__ = ("word", "count")
+ WORD_FIELD_NUMBER: _ClassVar[int]
+ COUNT_FIELD_NUMBER: _ClassVar[int]
+ word: str
+ count: int
+ def __init__(self, word: _Optional[str] = ..., count: _Optional[int] = ...) -> None: ...
+
+class MakeGuessRequest(_message.Message):
+ __slots__ = ("game_id", "bot_id", "current_team", "moves_since_last_turn", "clue", "guesses_made", "guesses_remaining", "clue_number", "bot_context")
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ CURRENT_TEAM_FIELD_NUMBER: _ClassVar[int]
+ MOVES_SINCE_LAST_TURN_FIELD_NUMBER: _ClassVar[int]
+ CLUE_FIELD_NUMBER: _ClassVar[int]
+ GUESSES_MADE_FIELD_NUMBER: _ClassVar[int]
+ GUESSES_REMAINING_FIELD_NUMBER: _ClassVar[int]
+ CLUE_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ BOT_CONTEXT_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ bot_id: str
+ current_team: _types_pb2.Team
+ moves_since_last_turn: _containers.RepeatedCompositeFieldContainer[_types_pb2.GameMove]
+ clue: _types_pb2.Clue
+ guesses_made: int
+ guesses_remaining: int
+ clue_number: int
+ bot_context: BotContext
+ def __init__(self, game_id: _Optional[str] = ..., bot_id: _Optional[str] = ..., current_team: _Optional[_Union[_types_pb2.Team, str]] = ..., moves_since_last_turn: _Optional[_Iterable[_Union[_types_pb2.GameMove, _Mapping]]] = ..., clue: _Optional[_Union[_types_pb2.Clue, _Mapping]] = ..., guesses_made: _Optional[int] = ..., guesses_remaining: _Optional[int] = ..., clue_number: _Optional[int] = ..., bot_context: _Optional[_Union[BotContext, _Mapping]] = ...) -> None: ...
+
+class MakeGuessResponse(_message.Message):
+ __slots__ = ("guess_word", "end_turn")
+ GUESS_WORD_FIELD_NUMBER: _ClassVar[int]
+ END_TURN_FIELD_NUMBER: _ClassVar[int]
+ guess_word: GuessWordAction
+ end_turn: EndTurnAction
+ def __init__(self, guess_word: _Optional[_Union[GuessWordAction, _Mapping]] = ..., end_turn: _Optional[_Union[EndTurnAction, _Mapping]] = ...) -> None: ...
+
+class GuessWordAction(_message.Message):
+ __slots__ = ("word",)
+ WORD_FIELD_NUMBER: _ClassVar[int]
+ word: str
+ def __init__(self, word: _Optional[str] = ...) -> None: ...
+
+class EndTurnAction(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class BotContext(_message.Message):
+ __slots__ = ("current_strikes", "last_error")
+ CURRENT_STRIKES_FIELD_NUMBER: _ClassVar[int]
+ LAST_ERROR_FIELD_NUMBER: _ClassVar[int]
+ current_strikes: int
+ last_error: str
+ def __init__(self, current_strikes: _Optional[int] = ..., last_error: _Optional[str] = ...) -> None: ...
+
+class GameEndedRequest(_message.Message):
+ __slots__ = ("game_id", "bot_id", "winner", "red_cards_left", "blue_cards_left", "total_moves", "remaining_moves", "end_reason", "disqualified_bot_id")
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ WINNER_FIELD_NUMBER: _ClassVar[int]
+ RED_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ BLUE_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ TOTAL_MOVES_FIELD_NUMBER: _ClassVar[int]
+ REMAINING_MOVES_FIELD_NUMBER: _ClassVar[int]
+ END_REASON_FIELD_NUMBER: _ClassVar[int]
+ DISQUALIFIED_BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ bot_id: str
+ winner: _types_pb2.Team
+ red_cards_left: int
+ blue_cards_left: int
+ total_moves: int
+ remaining_moves: _containers.RepeatedCompositeFieldContainer[_types_pb2.GameMove]
+ end_reason: _types_pb2.GameEndReason
+ disqualified_bot_id: str
+ def __init__(self, game_id: _Optional[str] = ..., bot_id: _Optional[str] = ..., winner: _Optional[_Union[_types_pb2.Team, str]] = ..., red_cards_left: _Optional[int] = ..., blue_cards_left: _Optional[int] = ..., total_moves: _Optional[int] = ..., remaining_moves: _Optional[_Iterable[_Union[_types_pb2.GameMove, _Mapping]]] = ..., end_reason: _Optional[_Union[_types_pb2.GameEndReason, str]] = ..., disqualified_bot_id: _Optional[str] = ...) -> None: ...
+
+class GameEndedResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
diff --git a/codenames/v1/game_connect.py b/codenames/v1/game_connect.py
new file mode 100644
index 0000000..ba66acc
--- /dev/null
+++ b/codenames/v1/game_connect.py
@@ -0,0 +1,1033 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: codenames/v1/game.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import codenames.v1.game_pb2 as codenames_dot_v1_dot_game__pb2
+
+
+class GameService(Protocol):
+ async def create_game(self, request: codenames_dot_v1_dot_game__pb2.CreateGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.CreateGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_game(self, request: codenames_dot_v1_dot_game__pb2.GetGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_games(self, request: codenames_dot_v1_dot_game__pb2.ListGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_active_games(self, request: codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_game_moves(self, request: codenames_dot_v1_dot_game__pb2.GetGameMovesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetGameMovesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def register_bot(self, request: codenames_dot_v1_dot_game__pb2.RegisterBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.RegisterBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_bots(self, request: codenames_dot_v1_dot_game__pb2.ListBotsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListBotsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def unregister_bot(self, request: codenames_dot_v1_dot_game__pb2.UnregisterBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.UnregisterBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_bot_games(self, request: codenames_dot_v1_dot_game__pb2.GetBotGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetBotGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_bot(self, request: codenames_dot_v1_dot_game__pb2.GetBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_leaderboard(self, request: codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_teams(self, request: codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def get_team(self, request: codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_bots_by_team(self, request: codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_games_by_bot(self, request: codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class GameServiceASGIApplication(ConnectASGIApplication[GameService]):
+ def __init__(self, service: GameService | AsyncGenerator[GameService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/codenames.v1.GameService/CreateGame": Endpoint.unary(
+ method=MethodInfo(
+ name="CreateGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.CreateGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.create_game,
+ ),
+ "/codenames.v1.GameService/GetGame": Endpoint.unary(
+ method=MethodInfo(
+ name="GetGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_game,
+ ),
+ "/codenames.v1.GameService/ListGames": Endpoint.unary(
+ method=MethodInfo(
+ name="ListGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_games,
+ ),
+ "/codenames.v1.GameService/ListActiveGames": Endpoint.unary(
+ method=MethodInfo(
+ name="ListActiveGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_active_games,
+ ),
+ "/codenames.v1.GameService/GetGameMoves": Endpoint.unary(
+ method=MethodInfo(
+ name="GetGameMoves",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameMovesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_game_moves,
+ ),
+ "/codenames.v1.GameService/RegisterBot": Endpoint.unary(
+ method=MethodInfo(
+ name="RegisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.RegisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.register_bot,
+ ),
+ "/codenames.v1.GameService/ListBots": Endpoint.unary(
+ method=MethodInfo(
+ name="ListBots",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_bots,
+ ),
+ "/codenames.v1.GameService/UnregisterBot": Endpoint.unary(
+ method=MethodInfo(
+ name="UnregisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.UnregisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.unregister_bot,
+ ),
+ "/codenames.v1.GameService/GetBotGames": Endpoint.unary(
+ method=MethodInfo(
+ name="GetBotGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_bot_games,
+ ),
+ "/codenames.v1.GameService/GetBot": Endpoint.unary(
+ method=MethodInfo(
+ name="GetBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_bot,
+ ),
+ "/codenames.v1.GameService/GetLeaderboard": Endpoint.unary(
+ method=MethodInfo(
+ name="GetLeaderboard",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_leaderboard,
+ ),
+ "/codenames.v1.GameService/ListTeams": Endpoint.unary(
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_teams,
+ ),
+ "/codenames.v1.GameService/GetTeam": Endpoint.unary(
+ method=MethodInfo(
+ name="GetTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.get_team,
+ ),
+ "/codenames.v1.GameService/ListBotsByTeam": Endpoint.unary(
+ method=MethodInfo(
+ name="ListBotsByTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_bots_by_team,
+ ),
+ "/codenames.v1.GameService/ListGamesByBot": Endpoint.unary(
+ method=MethodInfo(
+ name="ListGamesByBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_games_by_bot,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.GameService"
+
+
+class GameServiceClient(ConnectClient):
+ async def create_game(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.CreateGameResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.CreateGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_game(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetGameResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListGamesResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_active_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListActiveGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_game_moves(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetGameMovesResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetGameMoves",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameMovesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def register_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.RegisterBotResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="RegisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.RegisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_bots(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListBotsResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListBots",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def unregister_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.UnregisterBotResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UnregisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.UnregisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_bot_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetBotGamesResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetBotGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetBotResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_leaderboard(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetLeaderboard",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_teams(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def get_team(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_bots_by_team(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListBotsByTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_games_by_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListGamesByBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+class GameServiceSync(Protocol):
+ def create_game(self, request: codenames_dot_v1_dot_game__pb2.CreateGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.CreateGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_game(self, request: codenames_dot_v1_dot_game__pb2.GetGameRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetGameResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_games(self, request: codenames_dot_v1_dot_game__pb2.ListGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_active_games(self, request: codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_game_moves(self, request: codenames_dot_v1_dot_game__pb2.GetGameMovesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetGameMovesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def register_bot(self, request: codenames_dot_v1_dot_game__pb2.RegisterBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.RegisterBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_bots(self, request: codenames_dot_v1_dot_game__pb2.ListBotsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListBotsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def unregister_bot(self, request: codenames_dot_v1_dot_game__pb2.UnregisterBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.UnregisterBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_bot_games(self, request: codenames_dot_v1_dot_game__pb2.GetBotGamesRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetBotGamesResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_bot(self, request: codenames_dot_v1_dot_game__pb2.GetBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_leaderboard(self, request: codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_teams(self, request: codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def get_team(self, request: codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_bots_by_team(self, request: codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_games_by_bot(self, request: codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest, ctx: RequestContext) -> codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class GameServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: GameServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/codenames.v1.GameService/CreateGame": EndpointSync.unary(
+ method=MethodInfo(
+ name="CreateGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.CreateGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.create_game,
+ ),
+ "/codenames.v1.GameService/GetGame": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_game,
+ ),
+ "/codenames.v1.GameService/ListGames": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_games,
+ ),
+ "/codenames.v1.GameService/ListActiveGames": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListActiveGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_active_games,
+ ),
+ "/codenames.v1.GameService/GetGameMoves": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetGameMoves",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameMovesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_game_moves,
+ ),
+ "/codenames.v1.GameService/RegisterBot": EndpointSync.unary(
+ method=MethodInfo(
+ name="RegisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.RegisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.register_bot,
+ ),
+ "/codenames.v1.GameService/ListBots": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListBots",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_bots,
+ ),
+ "/codenames.v1.GameService/UnregisterBot": EndpointSync.unary(
+ method=MethodInfo(
+ name="UnregisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.UnregisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.unregister_bot,
+ ),
+ "/codenames.v1.GameService/GetBotGames": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetBotGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_bot_games,
+ ),
+ "/codenames.v1.GameService/GetBot": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_bot,
+ ),
+ "/codenames.v1.GameService/GetLeaderboard": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetLeaderboard",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_leaderboard,
+ ),
+ "/codenames.v1.GameService/ListTeams": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_teams,
+ ),
+ "/codenames.v1.GameService/GetTeam": EndpointSync.unary(
+ method=MethodInfo(
+ name="GetTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.get_team,
+ ),
+ "/codenames.v1.GameService/ListBotsByTeam": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListBotsByTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_bots_by_team,
+ ),
+ "/codenames.v1.GameService/ListGamesByBot": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListGamesByBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_games_by_bot,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.GameService"
+
+
+class GameServiceClientSync(ConnectClientSync):
+ def create_game(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.CreateGameResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="CreateGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.CreateGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.CreateGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_game(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetGameResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetGame",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListGamesResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_active_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListActiveGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListActiveGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListActiveGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_game_moves(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetGameMovesResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetGameMoves",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetGameMovesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetGameMovesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def register_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.RegisterBotResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="RegisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.RegisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.RegisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_bots(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListBotsResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListBots",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def unregister_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.UnregisterBotResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="UnregisterBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.UnregisterBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.UnregisterBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_bot_games(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetBotGamesResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetBotGames",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotGamesRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotGamesResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetBotResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_leaderboard(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetLeaderboard",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GetLeaderboardRequest,
+ output=codenames_dot_v1_dot_game__pb2.GetLeaderboardResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_teams(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeams",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceListTeamsResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def get_team(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="GetTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.GameServiceGetTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_bots_by_team(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListBotsByTeam",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListBotsByTeamRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListBotsByTeamResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_games_by_bot(
+ self,
+ request: codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListGamesByBot",
+ service_name="codenames.v1.GameService",
+ input=codenames_dot_v1_dot_game__pb2.ListGamesByBotRequest,
+ output=codenames_dot_v1_dot_game__pb2.ListGamesByBotResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
diff --git a/codenames/v1/game_pb2.py b/codenames/v1/game_pb2.py
new file mode 100644
index 0000000..61b93c8
--- /dev/null
+++ b/codenames/v1/game_pb2.py
@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: codenames/v1/game.proto
+# Protobuf Python Version: 7.34.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 34,
+ 1,
+ '',
+ 'codenames/v1/game.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from codenames.v1 import types_pb2 as codenames_dot_v1_dot_types__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63odenames/v1/game.proto\x12\x0c\x63odenames.v1\x1a\x18\x63odenames/v1/types.proto\"\xb9\x01\n\x11\x43reateGameRequest\x12\x14\n\x05words\x18\x01 \x03(\tR\x05words\x12#\n\rred_spymaster\x18\x02 \x01(\tR\x0credSpymaster\x12\x1f\n\x0bred_guesser\x18\x03 \x01(\tR\nredGuesser\x12%\n\x0e\x62lue_spymaster\x18\x04 \x01(\tR\rblueSpymaster\x12!\n\x0c\x62lue_guesser\x18\x05 \x01(\tR\x0b\x62lueGuesser\"-\n\x12\x43reateGameResponse\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\")\n\x0eGetGameRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\"9\n\x0fGetGameResponse\x12&\n\x04game\x18\x01 \x01(\x0b\x32\x12.codenames.v1.GameR\x04game\"e\n\x10ListGamesRequest\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x12\x16\n\x06offset\x18\x02 \x01(\x05R\x06offset\x12#\n\rinclude_board\x18\x03 \x01(\x08R\x0cincludeBoard\"^\n\x11ListGamesResponse\x12(\n\x05games\x18\x01 \x03(\x0b\x32\x12.codenames.v1.GameR\x05games\x12\x1f\n\x0btotal_count\x18\x02 \x01(\x05R\ntotalCount\"=\n\x16ListActiveGamesRequest\x12#\n\rinclude_board\x18\x01 \x01(\x08R\x0cincludeBoard\"C\n\x17ListActiveGamesResponse\x12(\n\x05games\x18\x01 \x03(\x0b\x32\x12.codenames.v1.GameR\x05games\".\n\x13GetGameMovesRequest\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\"D\n\x14GetGameMovesResponse\x12,\n\x05moves\x18\x01 \x03(\x0b\x32\x16.codenames.v1.GameMoveR\x05moves\"K\n\x12RegisterBotRequest\x12!\n\x0cidentity_key\x18\x01 \x01(\tR\x0bidentityKey\x12\x12\n\x04port\x18\x02 \x01(\x05R\x04port\":\n\x13RegisterBotResponse\x12#\n\x03\x62ot\x18\x01 \x01(\x0b\x32\x11.codenames.v1.BotR\x03\x62ot\"\x11\n\x0fListBotsRequest\"9\n\x10ListBotsResponse\x12%\n\x04\x62ots\x18\x01 \x03(\x0b\x32\x11.codenames.v1.BotR\x04\x62ots\"-\n\x14UnregisterBotRequest\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\"\x17\n\x15UnregisterBotResponse\"+\n\x12GetBotGamesRequest\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\"0\n\x13GetBotGamesResponse\x12\x19\n\x08game_ids\x18\x01 \x03(\tR\x07gameIds\"R\n\rGetBotRequest\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\x12*\n\x11skip_active_games\x18\x02 \x01(\x08R\x0fskipActiveGames\"5\n\x0eGetBotResponse\x12#\n\x03\x62ot\x18\x01 \x01(\x0b\x32\x11.codenames.v1.BotR\x03\x62ot\"g\n\x15GetLeaderboardRequest\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x12\x38\n\x07sort_by\x18\x02 \x01(\x0e\x32\x1f.codenames.v1.LeaderboardSortByR\x06sortBy\"D\n\x16GetLeaderboardResponse\x12*\n\x04\x62ots\x18\x01 \x03(\x0b\x32\x16.codenames.v1.BotStatsR\x04\x62ots\"\xf1\x01\n\x08\x42otStats\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\x12!\n\x0cidentity_key\x18\x02 \x01(\tR\x0bidentityKey\x12\x1d\n\nelo_rating\x18\x03 \x01(\x05R\teloRating\x12!\n\x0cgames_played\x18\x04 \x01(\x05R\x0bgamesPlayed\x12\x12\n\x04wins\x18\x05 \x01(\x05R\x04wins\x12\x16\n\x06losses\x18\x06 \x01(\x05R\x06losses\x12$\n\x0ep99_latency_ms\x18\x07 \x01(\x05R\x0cp99LatencyMs\x12\x17\n\x07team_id\x18\x08 \x01(\tR\x06teamId\"\x98\x02\n\x08TeamInfo\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x13\n\x05vm_ip\x18\x03 \x01(\tR\x04vmIp\x12\x1b\n\tbot_count\x18\x04 \x01(\x05R\x08\x62otCount\x12,\n\x12total_games_played\x18\x05 \x01(\x05R\x10totalGamesPlayed\x12 \n\x0ctop_bot_rank\x18\x06 \x01(\x05R\ntopBotRank\x12\x1e\n\x0btop_bot_elo\x18\x07 \x01(\x05R\ttopBotElo\x12(\n\x10top_bot_identity\x18\x08 \x01(\tR\x0etopBotIdentity\x12\x1c\n\ntop_bot_id\x18\t \x01(\tR\x08topBotId\"\x1d\n\x1bGameServiceListTeamsRequest\"L\n\x1cGameServiceListTeamsResponse\x12,\n\x05teams\x18\x01 \x03(\x0b\x32\x16.codenames.v1.TeamInfoR\x05teams\"4\n\x19GameServiceGetTeamRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\"H\n\x1aGameServiceGetTeamResponse\x12*\n\x04team\x18\x01 \x01(\x0b\x32\x16.codenames.v1.TeamInfoR\x04team\"0\n\x15ListBotsByTeamRequest\x12\x17\n\x07team_id\x18\x01 \x01(\tR\x06teamId\"?\n\x16ListBotsByTeamResponse\x12%\n\x04\x62ots\x18\x01 \x03(\x0b\x32\x11.codenames.v1.BotR\x04\x62ots\"\xbf\x01\n\x15ListGamesByBotRequest\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\x12\x14\n\x05limit\x18\x02 \x01(\x05R\x05limit\x12\x16\n\x06offset\x18\x03 \x01(\x05R\x06offset\x12#\n\rinclude_board\x18\x04 \x01(\x08R\x0cincludeBoard\x12<\n\x0brole_filter\x18\x05 \x01(\x0e\x32\x1b.codenames.v1.BotRoleFilterR\nroleFilter\"c\n\x16ListGamesByBotResponse\x12(\n\x05games\x18\x01 \x03(\x0b\x32\x12.codenames.v1.GameR\x05games\x12\x1f\n\x0btotal_count\x18\x02 \x01(\x05R\ntotalCount*\x81\x01\n\x11LeaderboardSortBy\x12#\n\x1fLEADERBOARD_SORT_BY_UNSPECIFIED\x10\x00\x12\"\n\x1eLEADERBOARD_SORT_BY_ELO_RATING\x10\x01\x12#\n\x1fLEADERBOARD_SORT_BY_P99_LATENCY\x10\x02*l\n\rBotRoleFilter\x12\x1f\n\x1b\x42OT_ROLE_FILTER_UNSPECIFIED\x10\x00\x12\x1d\n\x19\x42OT_ROLE_FILTER_SPYMASTER\x10\x01\x12\x1b\n\x17\x42OT_ROLE_FILTER_GUESSER\x10\x02\x32\x96\n\n\x0bGameService\x12O\n\nCreateGame\x12\x1f.codenames.v1.CreateGameRequest\x1a .codenames.v1.CreateGameResponse\x12\x46\n\x07GetGame\x12\x1c.codenames.v1.GetGameRequest\x1a\x1d.codenames.v1.GetGameResponse\x12L\n\tListGames\x12\x1e.codenames.v1.ListGamesRequest\x1a\x1f.codenames.v1.ListGamesResponse\x12^\n\x0fListActiveGames\x12$.codenames.v1.ListActiveGamesRequest\x1a%.codenames.v1.ListActiveGamesResponse\x12U\n\x0cGetGameMoves\x12!.codenames.v1.GetGameMovesRequest\x1a\".codenames.v1.GetGameMovesResponse\x12R\n\x0bRegisterBot\x12 .codenames.v1.RegisterBotRequest\x1a!.codenames.v1.RegisterBotResponse\x12I\n\x08ListBots\x12\x1d.codenames.v1.ListBotsRequest\x1a\x1e.codenames.v1.ListBotsResponse\x12X\n\rUnregisterBot\x12\".codenames.v1.UnregisterBotRequest\x1a#.codenames.v1.UnregisterBotResponse\x12R\n\x0bGetBotGames\x12 .codenames.v1.GetBotGamesRequest\x1a!.codenames.v1.GetBotGamesResponse\x12\x43\n\x06GetBot\x12\x1b.codenames.v1.GetBotRequest\x1a\x1c.codenames.v1.GetBotResponse\x12[\n\x0eGetLeaderboard\x12#.codenames.v1.GetLeaderboardRequest\x1a$.codenames.v1.GetLeaderboardResponse\x12\x62\n\tListTeams\x12).codenames.v1.GameServiceListTeamsRequest\x1a*.codenames.v1.GameServiceListTeamsResponse\x12\\\n\x07GetTeam\x12\'.codenames.v1.GameServiceGetTeamRequest\x1a(.codenames.v1.GameServiceGetTeamResponse\x12[\n\x0eListBotsByTeam\x12#.codenames.v1.ListBotsByTeamRequest\x1a$.codenames.v1.ListBotsByTeamResponse\x12[\n\x0eListGamesByBot\x12#.codenames.v1.ListGamesByBotRequest\x1a$.codenames.v1.ListGamesByBotResponseB\x96\x01\n\x10\x63om.codenames.v1B\tGameProtoP\x01Z&codenames/gen/codenames/v1;codenamesv1\xa2\x02\x03\x43XX\xaa\x02\x0c\x43odenames.V1\xca\x02\x0c\x43odenames\\V1\xe2\x02\x18\x43odenames\\V1\\GPBMetadata\xea\x02\rCodenames::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'codenames.v1.game_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\020com.codenames.v1B\tGameProtoP\001Z&codenames/gen/codenames/v1;codenamesv1\242\002\003CXX\252\002\014Codenames.V1\312\002\014Codenames\\V1\342\002\030Codenames\\V1\\GPBMetadata\352\002\rCodenames::V1'
+ _globals['_LEADERBOARDSORTBY']._serialized_start=2724
+ _globals['_LEADERBOARDSORTBY']._serialized_end=2853
+ _globals['_BOTROLEFILTER']._serialized_start=2855
+ _globals['_BOTROLEFILTER']._serialized_end=2963
+ _globals['_CREATEGAMEREQUEST']._serialized_start=68
+ _globals['_CREATEGAMEREQUEST']._serialized_end=253
+ _globals['_CREATEGAMERESPONSE']._serialized_start=255
+ _globals['_CREATEGAMERESPONSE']._serialized_end=300
+ _globals['_GETGAMEREQUEST']._serialized_start=302
+ _globals['_GETGAMEREQUEST']._serialized_end=343
+ _globals['_GETGAMERESPONSE']._serialized_start=345
+ _globals['_GETGAMERESPONSE']._serialized_end=402
+ _globals['_LISTGAMESREQUEST']._serialized_start=404
+ _globals['_LISTGAMESREQUEST']._serialized_end=505
+ _globals['_LISTGAMESRESPONSE']._serialized_start=507
+ _globals['_LISTGAMESRESPONSE']._serialized_end=601
+ _globals['_LISTACTIVEGAMESREQUEST']._serialized_start=603
+ _globals['_LISTACTIVEGAMESREQUEST']._serialized_end=664
+ _globals['_LISTACTIVEGAMESRESPONSE']._serialized_start=666
+ _globals['_LISTACTIVEGAMESRESPONSE']._serialized_end=733
+ _globals['_GETGAMEMOVESREQUEST']._serialized_start=735
+ _globals['_GETGAMEMOVESREQUEST']._serialized_end=781
+ _globals['_GETGAMEMOVESRESPONSE']._serialized_start=783
+ _globals['_GETGAMEMOVESRESPONSE']._serialized_end=851
+ _globals['_REGISTERBOTREQUEST']._serialized_start=853
+ _globals['_REGISTERBOTREQUEST']._serialized_end=928
+ _globals['_REGISTERBOTRESPONSE']._serialized_start=930
+ _globals['_REGISTERBOTRESPONSE']._serialized_end=988
+ _globals['_LISTBOTSREQUEST']._serialized_start=990
+ _globals['_LISTBOTSREQUEST']._serialized_end=1007
+ _globals['_LISTBOTSRESPONSE']._serialized_start=1009
+ _globals['_LISTBOTSRESPONSE']._serialized_end=1066
+ _globals['_UNREGISTERBOTREQUEST']._serialized_start=1068
+ _globals['_UNREGISTERBOTREQUEST']._serialized_end=1113
+ _globals['_UNREGISTERBOTRESPONSE']._serialized_start=1115
+ _globals['_UNREGISTERBOTRESPONSE']._serialized_end=1138
+ _globals['_GETBOTGAMESREQUEST']._serialized_start=1140
+ _globals['_GETBOTGAMESREQUEST']._serialized_end=1183
+ _globals['_GETBOTGAMESRESPONSE']._serialized_start=1185
+ _globals['_GETBOTGAMESRESPONSE']._serialized_end=1233
+ _globals['_GETBOTREQUEST']._serialized_start=1235
+ _globals['_GETBOTREQUEST']._serialized_end=1317
+ _globals['_GETBOTRESPONSE']._serialized_start=1319
+ _globals['_GETBOTRESPONSE']._serialized_end=1372
+ _globals['_GETLEADERBOARDREQUEST']._serialized_start=1374
+ _globals['_GETLEADERBOARDREQUEST']._serialized_end=1477
+ _globals['_GETLEADERBOARDRESPONSE']._serialized_start=1479
+ _globals['_GETLEADERBOARDRESPONSE']._serialized_end=1547
+ _globals['_BOTSTATS']._serialized_start=1550
+ _globals['_BOTSTATS']._serialized_end=1791
+ _globals['_TEAMINFO']._serialized_start=1794
+ _globals['_TEAMINFO']._serialized_end=2074
+ _globals['_GAMESERVICELISTTEAMSREQUEST']._serialized_start=2076
+ _globals['_GAMESERVICELISTTEAMSREQUEST']._serialized_end=2105
+ _globals['_GAMESERVICELISTTEAMSRESPONSE']._serialized_start=2107
+ _globals['_GAMESERVICELISTTEAMSRESPONSE']._serialized_end=2183
+ _globals['_GAMESERVICEGETTEAMREQUEST']._serialized_start=2185
+ _globals['_GAMESERVICEGETTEAMREQUEST']._serialized_end=2237
+ _globals['_GAMESERVICEGETTEAMRESPONSE']._serialized_start=2239
+ _globals['_GAMESERVICEGETTEAMRESPONSE']._serialized_end=2311
+ _globals['_LISTBOTSBYTEAMREQUEST']._serialized_start=2313
+ _globals['_LISTBOTSBYTEAMREQUEST']._serialized_end=2361
+ _globals['_LISTBOTSBYTEAMRESPONSE']._serialized_start=2363
+ _globals['_LISTBOTSBYTEAMRESPONSE']._serialized_end=2426
+ _globals['_LISTGAMESBYBOTREQUEST']._serialized_start=2429
+ _globals['_LISTGAMESBYBOTREQUEST']._serialized_end=2620
+ _globals['_LISTGAMESBYBOTRESPONSE']._serialized_start=2622
+ _globals['_LISTGAMESBYBOTRESPONSE']._serialized_end=2721
+ _globals['_GAMESERVICE']._serialized_start=2966
+ _globals['_GAMESERVICE']._serialized_end=4268
+# @@protoc_insertion_point(module_scope)
diff --git a/codenames/v1/game_pb2.pyi b/codenames/v1/game_pb2.pyi
new file mode 100644
index 0000000..c5c59c8
--- /dev/null
+++ b/codenames/v1/game_pb2.pyi
@@ -0,0 +1,273 @@
+from codenames.v1 import types_pb2 as _types_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class LeaderboardSortBy(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ LEADERBOARD_SORT_BY_UNSPECIFIED: _ClassVar[LeaderboardSortBy]
+ LEADERBOARD_SORT_BY_ELO_RATING: _ClassVar[LeaderboardSortBy]
+ LEADERBOARD_SORT_BY_P99_LATENCY: _ClassVar[LeaderboardSortBy]
+
+class BotRoleFilter(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ BOT_ROLE_FILTER_UNSPECIFIED: _ClassVar[BotRoleFilter]
+ BOT_ROLE_FILTER_SPYMASTER: _ClassVar[BotRoleFilter]
+ BOT_ROLE_FILTER_GUESSER: _ClassVar[BotRoleFilter]
+LEADERBOARD_SORT_BY_UNSPECIFIED: LeaderboardSortBy
+LEADERBOARD_SORT_BY_ELO_RATING: LeaderboardSortBy
+LEADERBOARD_SORT_BY_P99_LATENCY: LeaderboardSortBy
+BOT_ROLE_FILTER_UNSPECIFIED: BotRoleFilter
+BOT_ROLE_FILTER_SPYMASTER: BotRoleFilter
+BOT_ROLE_FILTER_GUESSER: BotRoleFilter
+
+class CreateGameRequest(_message.Message):
+ __slots__ = ("words", "red_spymaster", "red_guesser", "blue_spymaster", "blue_guesser")
+ WORDS_FIELD_NUMBER: _ClassVar[int]
+ RED_SPYMASTER_FIELD_NUMBER: _ClassVar[int]
+ RED_GUESSER_FIELD_NUMBER: _ClassVar[int]
+ BLUE_SPYMASTER_FIELD_NUMBER: _ClassVar[int]
+ BLUE_GUESSER_FIELD_NUMBER: _ClassVar[int]
+ words: _containers.RepeatedScalarFieldContainer[str]
+ red_spymaster: str
+ red_guesser: str
+ blue_spymaster: str
+ blue_guesser: str
+ def __init__(self, words: _Optional[_Iterable[str]] = ..., red_spymaster: _Optional[str] = ..., red_guesser: _Optional[str] = ..., blue_spymaster: _Optional[str] = ..., blue_guesser: _Optional[str] = ...) -> None: ...
+
+class CreateGameResponse(_message.Message):
+ __slots__ = ("game_id",)
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ def __init__(self, game_id: _Optional[str] = ...) -> None: ...
+
+class GetGameRequest(_message.Message):
+ __slots__ = ("game_id",)
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ def __init__(self, game_id: _Optional[str] = ...) -> None: ...
+
+class GetGameResponse(_message.Message):
+ __slots__ = ("game",)
+ GAME_FIELD_NUMBER: _ClassVar[int]
+ game: _types_pb2.Game
+ def __init__(self, game: _Optional[_Union[_types_pb2.Game, _Mapping]] = ...) -> None: ...
+
+class ListGamesRequest(_message.Message):
+ __slots__ = ("limit", "offset", "include_board")
+ LIMIT_FIELD_NUMBER: _ClassVar[int]
+ OFFSET_FIELD_NUMBER: _ClassVar[int]
+ INCLUDE_BOARD_FIELD_NUMBER: _ClassVar[int]
+ limit: int
+ offset: int
+ include_board: bool
+ def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ..., include_board: _Optional[bool] = ...) -> None: ...
+
+class ListGamesResponse(_message.Message):
+ __slots__ = ("games", "total_count")
+ GAMES_FIELD_NUMBER: _ClassVar[int]
+ TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
+ games: _containers.RepeatedCompositeFieldContainer[_types_pb2.Game]
+ total_count: int
+ def __init__(self, games: _Optional[_Iterable[_Union[_types_pb2.Game, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ...
+
+class ListActiveGamesRequest(_message.Message):
+ __slots__ = ("include_board",)
+ INCLUDE_BOARD_FIELD_NUMBER: _ClassVar[int]
+ include_board: bool
+ def __init__(self, include_board: _Optional[bool] = ...) -> None: ...
+
+class ListActiveGamesResponse(_message.Message):
+ __slots__ = ("games",)
+ GAMES_FIELD_NUMBER: _ClassVar[int]
+ games: _containers.RepeatedCompositeFieldContainer[_types_pb2.Game]
+ def __init__(self, games: _Optional[_Iterable[_Union[_types_pb2.Game, _Mapping]]] = ...) -> None: ...
+
+class GetGameMovesRequest(_message.Message):
+ __slots__ = ("game_id",)
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ def __init__(self, game_id: _Optional[str] = ...) -> None: ...
+
+class GetGameMovesResponse(_message.Message):
+ __slots__ = ("moves",)
+ MOVES_FIELD_NUMBER: _ClassVar[int]
+ moves: _containers.RepeatedCompositeFieldContainer[_types_pb2.GameMove]
+ def __init__(self, moves: _Optional[_Iterable[_Union[_types_pb2.GameMove, _Mapping]]] = ...) -> None: ...
+
+class RegisterBotRequest(_message.Message):
+ __slots__ = ("identity_key", "port")
+ IDENTITY_KEY_FIELD_NUMBER: _ClassVar[int]
+ PORT_FIELD_NUMBER: _ClassVar[int]
+ identity_key: str
+ port: int
+ def __init__(self, identity_key: _Optional[str] = ..., port: _Optional[int] = ...) -> None: ...
+
+class RegisterBotResponse(_message.Message):
+ __slots__ = ("bot",)
+ BOT_FIELD_NUMBER: _ClassVar[int]
+ bot: _types_pb2.Bot
+ def __init__(self, bot: _Optional[_Union[_types_pb2.Bot, _Mapping]] = ...) -> None: ...
+
+class ListBotsRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class ListBotsResponse(_message.Message):
+ __slots__ = ("bots",)
+ BOTS_FIELD_NUMBER: _ClassVar[int]
+ bots: _containers.RepeatedCompositeFieldContainer[_types_pb2.Bot]
+ def __init__(self, bots: _Optional[_Iterable[_Union[_types_pb2.Bot, _Mapping]]] = ...) -> None: ...
+
+class UnregisterBotRequest(_message.Message):
+ __slots__ = ("bot_id",)
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ def __init__(self, bot_id: _Optional[str] = ...) -> None: ...
+
+class UnregisterBotResponse(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class GetBotGamesRequest(_message.Message):
+ __slots__ = ("bot_id",)
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ def __init__(self, bot_id: _Optional[str] = ...) -> None: ...
+
+class GetBotGamesResponse(_message.Message):
+ __slots__ = ("game_ids",)
+ GAME_IDS_FIELD_NUMBER: _ClassVar[int]
+ game_ids: _containers.RepeatedScalarFieldContainer[str]
+ def __init__(self, game_ids: _Optional[_Iterable[str]] = ...) -> None: ...
+
+class GetBotRequest(_message.Message):
+ __slots__ = ("bot_id", "skip_active_games")
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ SKIP_ACTIVE_GAMES_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ skip_active_games: bool
+ def __init__(self, bot_id: _Optional[str] = ..., skip_active_games: _Optional[bool] = ...) -> None: ...
+
+class GetBotResponse(_message.Message):
+ __slots__ = ("bot",)
+ BOT_FIELD_NUMBER: _ClassVar[int]
+ bot: _types_pb2.Bot
+ def __init__(self, bot: _Optional[_Union[_types_pb2.Bot, _Mapping]] = ...) -> None: ...
+
+class GetLeaderboardRequest(_message.Message):
+ __slots__ = ("limit", "sort_by")
+ LIMIT_FIELD_NUMBER: _ClassVar[int]
+ SORT_BY_FIELD_NUMBER: _ClassVar[int]
+ limit: int
+ sort_by: LeaderboardSortBy
+ def __init__(self, limit: _Optional[int] = ..., sort_by: _Optional[_Union[LeaderboardSortBy, str]] = ...) -> None: ...
+
+class GetLeaderboardResponse(_message.Message):
+ __slots__ = ("bots",)
+ BOTS_FIELD_NUMBER: _ClassVar[int]
+ bots: _containers.RepeatedCompositeFieldContainer[BotStats]
+ def __init__(self, bots: _Optional[_Iterable[_Union[BotStats, _Mapping]]] = ...) -> None: ...
+
+class BotStats(_message.Message):
+ __slots__ = ("bot_id", "identity_key", "elo_rating", "games_played", "wins", "losses", "p99_latency_ms", "team_id")
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ IDENTITY_KEY_FIELD_NUMBER: _ClassVar[int]
+ ELO_RATING_FIELD_NUMBER: _ClassVar[int]
+ GAMES_PLAYED_FIELD_NUMBER: _ClassVar[int]
+ WINS_FIELD_NUMBER: _ClassVar[int]
+ LOSSES_FIELD_NUMBER: _ClassVar[int]
+ P99_LATENCY_MS_FIELD_NUMBER: _ClassVar[int]
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ identity_key: str
+ elo_rating: int
+ games_played: int
+ wins: int
+ losses: int
+ p99_latency_ms: int
+ team_id: str
+ def __init__(self, bot_id: _Optional[str] = ..., identity_key: _Optional[str] = ..., elo_rating: _Optional[int] = ..., games_played: _Optional[int] = ..., wins: _Optional[int] = ..., losses: _Optional[int] = ..., p99_latency_ms: _Optional[int] = ..., team_id: _Optional[str] = ...) -> None: ...
+
+class TeamInfo(_message.Message):
+ __slots__ = ("id", "name", "vm_ip", "bot_count", "total_games_played", "top_bot_rank", "top_bot_elo", "top_bot_identity", "top_bot_id")
+ ID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ VM_IP_FIELD_NUMBER: _ClassVar[int]
+ BOT_COUNT_FIELD_NUMBER: _ClassVar[int]
+ TOTAL_GAMES_PLAYED_FIELD_NUMBER: _ClassVar[int]
+ TOP_BOT_RANK_FIELD_NUMBER: _ClassVar[int]
+ TOP_BOT_ELO_FIELD_NUMBER: _ClassVar[int]
+ TOP_BOT_IDENTITY_FIELD_NUMBER: _ClassVar[int]
+ TOP_BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ name: str
+ vm_ip: str
+ bot_count: int
+ total_games_played: int
+ top_bot_rank: int
+ top_bot_elo: int
+ top_bot_identity: str
+ top_bot_id: str
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., vm_ip: _Optional[str] = ..., bot_count: _Optional[int] = ..., total_games_played: _Optional[int] = ..., top_bot_rank: _Optional[int] = ..., top_bot_elo: _Optional[int] = ..., top_bot_identity: _Optional[str] = ..., top_bot_id: _Optional[str] = ...) -> None: ...
+
+class GameServiceListTeamsRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class GameServiceListTeamsResponse(_message.Message):
+ __slots__ = ("teams",)
+ TEAMS_FIELD_NUMBER: _ClassVar[int]
+ teams: _containers.RepeatedCompositeFieldContainer[TeamInfo]
+ def __init__(self, teams: _Optional[_Iterable[_Union[TeamInfo, _Mapping]]] = ...) -> None: ...
+
+class GameServiceGetTeamRequest(_message.Message):
+ __slots__ = ("team_id",)
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ def __init__(self, team_id: _Optional[str] = ...) -> None: ...
+
+class GameServiceGetTeamResponse(_message.Message):
+ __slots__ = ("team",)
+ TEAM_FIELD_NUMBER: _ClassVar[int]
+ team: TeamInfo
+ def __init__(self, team: _Optional[_Union[TeamInfo, _Mapping]] = ...) -> None: ...
+
+class ListBotsByTeamRequest(_message.Message):
+ __slots__ = ("team_id",)
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ team_id: str
+ def __init__(self, team_id: _Optional[str] = ...) -> None: ...
+
+class ListBotsByTeamResponse(_message.Message):
+ __slots__ = ("bots",)
+ BOTS_FIELD_NUMBER: _ClassVar[int]
+ bots: _containers.RepeatedCompositeFieldContainer[_types_pb2.Bot]
+ def __init__(self, bots: _Optional[_Iterable[_Union[_types_pb2.Bot, _Mapping]]] = ...) -> None: ...
+
+class ListGamesByBotRequest(_message.Message):
+ __slots__ = ("bot_id", "limit", "offset", "include_board", "role_filter")
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ LIMIT_FIELD_NUMBER: _ClassVar[int]
+ OFFSET_FIELD_NUMBER: _ClassVar[int]
+ INCLUDE_BOARD_FIELD_NUMBER: _ClassVar[int]
+ ROLE_FILTER_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ limit: int
+ offset: int
+ include_board: bool
+ role_filter: BotRoleFilter
+ def __init__(self, bot_id: _Optional[str] = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ..., include_board: _Optional[bool] = ..., role_filter: _Optional[_Union[BotRoleFilter, str]] = ...) -> None: ...
+
+class ListGamesByBotResponse(_message.Message):
+ __slots__ = ("games", "total_count")
+ GAMES_FIELD_NUMBER: _ClassVar[int]
+ TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int]
+ games: _containers.RepeatedCompositeFieldContainer[_types_pb2.Game]
+ total_count: int
+ def __init__(self, games: _Optional[_Iterable[_Union[_types_pb2.Game, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ...
diff --git a/codenames/v1/ssh_keys_connect.py b/codenames/v1/ssh_keys_connect.py
new file mode 100644
index 0000000..adbaa6b
--- /dev/null
+++ b/codenames/v1/ssh_keys_connect.py
@@ -0,0 +1,188 @@
+# -*- coding: utf-8 -*-
+# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
+# source: codenames/v1/ssh_keys.proto
+
+from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
+from typing import Protocol
+
+from connectrpc.client import ConnectClient, ConnectClientSync
+from connectrpc.code import Code
+from connectrpc.compression import Compression
+from connectrpc.errors import ConnectError
+from connectrpc.interceptor import Interceptor, InterceptorSync
+from connectrpc.method import IdempotencyLevel, MethodInfo
+from connectrpc.request import Headers, RequestContext
+from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
+import codenames.v1.ssh_keys_pb2 as codenames_dot_v1_dot_ssh__keys__pb2
+
+
+class SSHKeyService(Protocol):
+ async def submit_s_s_h_key(self, request: codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest, ctx: RequestContext) -> codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+ async def list_teams_for_key_submission(self, request: codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest, ctx: RequestContext) -> codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class SSHKeyServiceASGIApplication(ConnectASGIApplication[SSHKeyService]):
+ def __init__(self, service: SSHKeyService | AsyncGenerator[SSHKeyService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ service=service,
+ endpoints=lambda svc: {
+ "/codenames.v1.SSHKeyService/SubmitSSHKey": Endpoint.unary(
+ method=MethodInfo(
+ name="SubmitSSHKey",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.submit_s_s_h_key,
+ ),
+ "/codenames.v1.SSHKeyService/ListTeamsForKeySubmission": Endpoint.unary(
+ method=MethodInfo(
+ name="ListTeamsForKeySubmission",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=svc.list_teams_for_key_submission,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.SSHKeyService"
+
+
+class SSHKeyServiceClient(ConnectClient):
+ async def submit_s_s_h_key(
+ self,
+ request: codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="SubmitSSHKey",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ async def list_teams_for_key_submission(
+ self,
+ request: codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse:
+ return await self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeamsForKeySubmission",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+
+class SSHKeyServiceSync(Protocol):
+ def submit_s_s_h_key(self, request: codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest, ctx: RequestContext) -> codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+ def list_teams_for_key_submission(self, request: codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest, ctx: RequestContext) -> codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse:
+ raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
+
+
+class SSHKeyServiceWSGIApplication(ConnectWSGIApplication):
+ def __init__(self, service: SSHKeyServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None, compressions: Iterable[Compression] | None = None) -> None:
+ super().__init__(
+ endpoints={
+ "/codenames.v1.SSHKeyService/SubmitSSHKey": EndpointSync.unary(
+ method=MethodInfo(
+ name="SubmitSSHKey",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.submit_s_s_h_key,
+ ),
+ "/codenames.v1.SSHKeyService/ListTeamsForKeySubmission": EndpointSync.unary(
+ method=MethodInfo(
+ name="ListTeamsForKeySubmission",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ function=service.list_teams_for_key_submission,
+ ),
+ },
+ interceptors=interceptors,
+ read_max_bytes=read_max_bytes,
+ compressions=compressions,
+ )
+
+ @property
+ def path(self) -> str:
+ """Returns the URL path to mount the application to when serving multiple applications."""
+ return "/codenames.v1.SSHKeyService"
+
+
+class SSHKeyServiceClientSync(ConnectClientSync):
+ def submit_s_s_h_key(
+ self,
+ request: codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="SubmitSSHKey",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.SubmitSSHKeyResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
+
+ def list_teams_for_key_submission(
+ self,
+ request: codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ *,
+ headers: Headers | Mapping[str, str] | None = None,
+ timeout_ms: int | None = None,
+ ) -> codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse:
+ return self.execute_unary(
+ request=request,
+ method=MethodInfo(
+ name="ListTeamsForKeySubmission",
+ service_name="codenames.v1.SSHKeyService",
+ input=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionRequest,
+ output=codenames_dot_v1_dot_ssh__keys__pb2.ListTeamsForKeySubmissionResponse,
+ idempotency_level=IdempotencyLevel.UNKNOWN,
+ ),
+ headers=headers,
+ timeout_ms=timeout_ms,
+ )
diff --git a/codenames/v1/ssh_keys_pb2.py b/codenames/v1/ssh_keys_pb2.py
new file mode 100644
index 0000000..2375f2a
--- /dev/null
+++ b/codenames/v1/ssh_keys_pb2.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: codenames/v1/ssh_keys.proto
+# Protobuf Python Version: 7.34.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 34,
+ 1,
+ '',
+ 'codenames/v1/ssh_keys.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1b\x63odenames/v1/ssh_keys.proto\x12\x0c\x63odenames.v1\"}\n\x13SubmitSSHKeyRequest\x12\'\n\x0f\x63ontestant_name\x18\x01 \x01(\tR\x0e\x63ontestantName\x12\x17\n\x07team_id\x18\x02 \x01(\tR\x06teamId\x12$\n\x0essh_public_key\x18\x03 \x01(\tR\x0csshPublicKey\"?\n\x14SubmitSSHKeyResponse\x12\'\n\x0fkey_fingerprint\x18\x01 \x01(\tR\x0ekeyFingerprint\"\"\n ListTeamsForKeySubmissionRequest\"0\n\nTeamOption\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\"S\n!ListTeamsForKeySubmissionResponse\x12.\n\x05teams\x18\x01 \x03(\x0b\x32\x18.codenames.v1.TeamOptionR\x05teams2\xe4\x01\n\rSSHKeyService\x12U\n\x0cSubmitSSHKey\x12!.codenames.v1.SubmitSSHKeyRequest\x1a\".codenames.v1.SubmitSSHKeyResponse\x12|\n\x19ListTeamsForKeySubmission\x12..codenames.v1.ListTeamsForKeySubmissionRequest\x1a/.codenames.v1.ListTeamsForKeySubmissionResponseB\x99\x01\n\x10\x63om.codenames.v1B\x0cSshKeysProtoP\x01Z&codenames/gen/codenames/v1;codenamesv1\xa2\x02\x03\x43XX\xaa\x02\x0c\x43odenames.V1\xca\x02\x0c\x43odenames\\V1\xe2\x02\x18\x43odenames\\V1\\GPBMetadata\xea\x02\rCodenames::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'codenames.v1.ssh_keys_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\020com.codenames.v1B\014SshKeysProtoP\001Z&codenames/gen/codenames/v1;codenamesv1\242\002\003CXX\252\002\014Codenames.V1\312\002\014Codenames\\V1\342\002\030Codenames\\V1\\GPBMetadata\352\002\rCodenames::V1'
+ _globals['_SUBMITSSHKEYREQUEST']._serialized_start=45
+ _globals['_SUBMITSSHKEYREQUEST']._serialized_end=170
+ _globals['_SUBMITSSHKEYRESPONSE']._serialized_start=172
+ _globals['_SUBMITSSHKEYRESPONSE']._serialized_end=235
+ _globals['_LISTTEAMSFORKEYSUBMISSIONREQUEST']._serialized_start=237
+ _globals['_LISTTEAMSFORKEYSUBMISSIONREQUEST']._serialized_end=271
+ _globals['_TEAMOPTION']._serialized_start=273
+ _globals['_TEAMOPTION']._serialized_end=321
+ _globals['_LISTTEAMSFORKEYSUBMISSIONRESPONSE']._serialized_start=323
+ _globals['_LISTTEAMSFORKEYSUBMISSIONRESPONSE']._serialized_end=406
+ _globals['_SSHKEYSERVICE']._serialized_start=409
+ _globals['_SSHKEYSERVICE']._serialized_end=637
+# @@protoc_insertion_point(module_scope)
diff --git a/codenames/v1/ssh_keys_pb2.pyi b/codenames/v1/ssh_keys_pb2.pyi
new file mode 100644
index 0000000..3459a42
--- /dev/null
+++ b/codenames/v1/ssh_keys_pb2.pyi
@@ -0,0 +1,41 @@
+from google.protobuf.internal import containers as _containers
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class SubmitSSHKeyRequest(_message.Message):
+ __slots__ = ("contestant_name", "team_id", "ssh_public_key")
+ CONTESTANT_NAME_FIELD_NUMBER: _ClassVar[int]
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ SSH_PUBLIC_KEY_FIELD_NUMBER: _ClassVar[int]
+ contestant_name: str
+ team_id: str
+ ssh_public_key: str
+ def __init__(self, contestant_name: _Optional[str] = ..., team_id: _Optional[str] = ..., ssh_public_key: _Optional[str] = ...) -> None: ...
+
+class SubmitSSHKeyResponse(_message.Message):
+ __slots__ = ("key_fingerprint",)
+ KEY_FINGERPRINT_FIELD_NUMBER: _ClassVar[int]
+ key_fingerprint: str
+ def __init__(self, key_fingerprint: _Optional[str] = ...) -> None: ...
+
+class ListTeamsForKeySubmissionRequest(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class TeamOption(_message.Message):
+ __slots__ = ("id", "name")
+ ID_FIELD_NUMBER: _ClassVar[int]
+ NAME_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ name: str
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ...) -> None: ...
+
+class ListTeamsForKeySubmissionResponse(_message.Message):
+ __slots__ = ("teams",)
+ TEAMS_FIELD_NUMBER: _ClassVar[int]
+ teams: _containers.RepeatedCompositeFieldContainer[TeamOption]
+ def __init__(self, teams: _Optional[_Iterable[_Union[TeamOption, _Mapping]]] = ...) -> None: ...
diff --git a/codenames/v1/types_pb2.py b/codenames/v1/types_pb2.py
new file mode 100644
index 0000000..f57b25d
--- /dev/null
+++ b/codenames/v1/types_pb2.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# NO CHECKED-IN PROTOBUF GENCODE
+# source: codenames/v1/types.proto
+# Protobuf Python Version: 7.34.1
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import runtime_version as _runtime_version
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+_runtime_version.ValidateProtobufRuntimeVersion(
+ _runtime_version.Domain.PUBLIC,
+ 7,
+ 34,
+ 1,
+ '',
+ 'codenames/v1/types.proto'
+)
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x63odenames/v1/types.proto\x12\x0c\x63odenames.v1\"b\n\x04\x43\x61rd\x12\x12\n\x04word\x18\x01 \x01(\tR\x04word\x12*\n\x04type\x18\x02 \x01(\x0e\x32\x16.codenames.v1.CardTypeR\x04type\x12\x1a\n\x08revealed\x18\x03 \x01(\x08R\x08revealed\"1\n\x05\x42oard\x12(\n\x05\x63\x61rds\x18\x01 \x03(\x0b\x32\x12.codenames.v1.CardR\x05\x63\x61rds\"0\n\x04\x43lue\x12\x12\n\x04word\x18\x01 \x01(\tR\x04word\x12\x14\n\x05\x63ount\x18\x02 \x01(\x05R\x05\x63ount\"\xa6\x05\n\x04Game\x12\x17\n\x07game_id\x18\x01 \x01(\tR\x06gameId\x12)\n\x05\x62oard\x18\x02 \x01(\x0b\x32\x13.codenames.v1.BoardR\x05\x62oard\x12\x35\n\x0c\x63urrent_team\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x0b\x63urrentTeam\x12-\n\x05state\x18\x04 \x01(\x0e\x32\x17.codenames.v1.GameStateR\x05state\x12$\n\x0ered_cards_left\x18\x05 \x01(\x05R\x0credCardsLeft\x12&\n\x0f\x62lue_cards_left\x18\x06 \x01(\x05R\rblueCardsLeft\x12:\n\x0c\x63urrent_clue\x18\x07 \x01(\x0b\x32\x12.codenames.v1.ClueH\x00R\x0b\x63urrentClue\x88\x01\x01\x12!\n\x0cguesses_made\x18\x08 \x01(\x05R\x0bguessesMade\x12/\n\x06winner\x18\t \x01(\x0e\x32\x12.codenames.v1.TeamH\x01R\x06winner\x88\x01\x01\x12:\n\nend_reason\x18\n \x01(\x0e\x32\x1b.codenames.v1.GameEndReasonR\tendReason\x12.\n\x13\x64isqualified_bot_id\x18\x0b \x01(\tR\x11\x64isqualifiedBotId\x12#\n\rred_spymaster\x18\x0c \x01(\tR\x0credSpymaster\x12\x1f\n\x0bred_guesser\x18\r \x01(\tR\nredGuesser\x12%\n\x0e\x62lue_spymaster\x18\x0e \x01(\tR\rblueSpymaster\x12!\n\x0c\x62lue_guesser\x18\x0f \x01(\tR\x0b\x62lueGuesserB\x0f\n\r_current_clueB\t\n\x07_winner\"\xd0\x02\n\x08GameMove\x12\x1f\n\x0bmove_number\x18\x01 \x01(\x05R\nmoveNumber\x12\x1f\n\x0b\x63lue_number\x18\x02 \x01(\x05R\nclueNumber\x12&\n\x04team\x18\x03 \x01(\x0e\x32\x12.codenames.v1.TeamR\x04team\x12!\n\x0cperformed_at\x18\x04 \x01(\tR\x0bperformedAt\x12\x38\n\nclue_given\x18\x05 \x01(\x0b\x32\x17.codenames.v1.ClueGivenH\x00R\tclueGiven\x12;\n\x0b\x63\x61rd_reveal\x18\x06 \x01(\x0b\x32\x18.codenames.v1.CardRevealH\x00R\ncardReveal\x12\x38\n\nturn_ended\x18\x07 \x01(\x0b\x32\x17.codenames.v1.TurnEndedH\x00R\tturnEndedB\x06\n\x04move\"3\n\tClueGiven\x12&\n\x04\x63lue\x18\x01 \x01(\x0b\x32\x12.codenames.v1.ClueR\x04\x63lue\"T\n\nCardReveal\x12\x1a\n\x08position\x18\x01 \x01(\x05R\x08position\x12*\n\x04type\x18\x02 \x01(\x0e\x32\x16.codenames.v1.CardTypeR\x04type\"\x0b\n\tTurnEnded\"\xbc\x03\n\x03\x42ot\x12\x15\n\x06\x62ot_id\x18\x01 \x01(\tR\x05\x62otId\x12!\n\x0cidentity_key\x18\x02 \x01(\tR\x0bidentityKey\x12\x19\n\x08\x62\x61se_url\x18\x03 \x01(\tR\x07\x62\x61seUrl\x12#\n\rregistered_at\x18\x04 \x01(\tR\x0cregisteredAt\x12&\n\x0flast_updated_at\x18\x05 \x01(\tR\rlastUpdatedAt\x12!\n\x0c\x61\x63tive_games\x18\x06 \x03(\tR\x0b\x61\x63tiveGames\x12\x1d\n\nelo_rating\x18\x07 \x01(\x05R\teloRating\x12!\n\x0cgames_played\x18\x08 \x01(\x05R\x0bgamesPlayed\x12\x12\n\x04wins\x18\t \x01(\x05R\x04wins\x12\x16\n\x06losses\x18\n \x01(\x05R\x06losses\x12\x17\n\x07team_id\x18\x0b \x01(\tR\x06teamId\x12\x12\n\x04port\x18\x0c \x01(\x05R\x04port\x12,\n\x05state\x18\r \x01(\x0e\x32\x16.codenames.v1.BotStateR\x05state\x12\'\n\x0funregistered_at\x18\x0e \x01(\tR\x0eunregisteredAt*9\n\x04Team\x12\x14\n\x10TEAM_UNSPECIFIED\x10\x00\x12\x0c\n\x08TEAM_RED\x10\x01\x12\r\n\tTEAM_BLUE\x10\x02*{\n\x08\x43\x61rdType\x12\x19\n\x15\x43\x41RD_TYPE_UNSPECIFIED\x10\x00\x12\x11\n\rCARD_TYPE_RED\x10\x01\x12\x12\n\x0e\x43\x41RD_TYPE_BLUE\x10\x02\x12\x15\n\x11\x43\x41RD_TYPE_NEUTRAL\x10\x03\x12\x16\n\x12\x43\x41RD_TYPE_ASSASSIN\x10\x04*p\n\tGameState\x12\x1a\n\x16GAME_STATE_UNSPECIFIED\x10\x00\x12\x18\n\x14GAME_STATE_SPYMASTER\x10\x01\x12\x17\n\x13GAME_STATE_GUESSING\x10\x02\x12\x14\n\x10GAME_STATE_ENDED\x10\x03*\xe7\x01\n\rGameEndReason\x12\x1f\n\x1bGAME_END_REASON_UNSPECIFIED\x10\x00\x12\x1a\n\x16GAME_END_REASON_NORMAL\x10\x01\x12$\n GAME_END_REASON_RED_DISQUALIFIED\x10\x02\x12%\n!GAME_END_REASON_BLUE_DISQUALIFIED\x10\x03\x12/\n+GAME_END_REASON_FAILED_GAME_START_NOTIFYING\x10\x04\x12\x1b\n\x17GAME_END_REASON_ABORTED\x10\x05*\xad\x01\n\x0bGuessResult\x12\x1c\n\x18GUESS_RESULT_UNSPECIFIED\x10\x00\x12\x18\n\x14GUESS_RESULT_CORRECT\x10\x01\x12\x16\n\x12GUESS_RESULT_WRONG\x10\x02\x12\x18\n\x14GUESS_RESULT_NEUTRAL\x10\x03\x12\x19\n\x15GUESS_RESULT_ASSASSIN\x10\x04\x12\x19\n\x15GUESS_RESULT_END_TURN\x10\x05*B\n\x04Role\x12\x14\n\x10ROLE_UNSPECIFIED\x10\x00\x12\x12\n\x0eROLE_SPYMASTER\x10\x01\x12\x10\n\x0cROLE_GUESSER\x10\x02*x\n\x08\x42otState\x12\x19\n\x15\x42OT_STATE_UNSPECIFIED\x10\x00\x12\x18\n\x14\x42OT_STATE_REGISTERED\x10\x01\x12\x1b\n\x17\x42OT_STATE_UNREGISTERING\x10\x02\x12\x1a\n\x16\x42OT_STATE_UNREGISTERED\x10\x03\x42\x97\x01\n\x10\x63om.codenames.v1B\nTypesProtoP\x01Z&codenames/gen/codenames/v1;codenamesv1\xa2\x02\x03\x43XX\xaa\x02\x0c\x43odenames.V1\xca\x02\x0c\x43odenames\\V1\xe2\x02\x18\x43odenames\\V1\\GPBMetadata\xea\x02\rCodenames::V1b\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'codenames.v1.types_pb2', _globals)
+if not _descriptor._USE_C_DESCRIPTORS:
+ _globals['DESCRIPTOR']._loaded_options = None
+ _globals['DESCRIPTOR']._serialized_options = b'\n\020com.codenames.v1B\nTypesProtoP\001Z&codenames/gen/codenames/v1;codenamesv1\242\002\003CXX\252\002\014Codenames.V1\312\002\014Codenames\\V1\342\002\030Codenames\\V1\\GPBMetadata\352\002\rCodenames::V1'
+ _globals['_TEAM']._serialized_start=1862
+ _globals['_TEAM']._serialized_end=1919
+ _globals['_CARDTYPE']._serialized_start=1921
+ _globals['_CARDTYPE']._serialized_end=2044
+ _globals['_GAMESTATE']._serialized_start=2046
+ _globals['_GAMESTATE']._serialized_end=2158
+ _globals['_GAMEENDREASON']._serialized_start=2161
+ _globals['_GAMEENDREASON']._serialized_end=2392
+ _globals['_GUESSRESULT']._serialized_start=2395
+ _globals['_GUESSRESULT']._serialized_end=2568
+ _globals['_ROLE']._serialized_start=2570
+ _globals['_ROLE']._serialized_end=2636
+ _globals['_BOTSTATE']._serialized_start=2638
+ _globals['_BOTSTATE']._serialized_end=2758
+ _globals['_CARD']._serialized_start=42
+ _globals['_CARD']._serialized_end=140
+ _globals['_BOARD']._serialized_start=142
+ _globals['_BOARD']._serialized_end=191
+ _globals['_CLUE']._serialized_start=193
+ _globals['_CLUE']._serialized_end=241
+ _globals['_GAME']._serialized_start=244
+ _globals['_GAME']._serialized_end=922
+ _globals['_GAMEMOVE']._serialized_start=925
+ _globals['_GAMEMOVE']._serialized_end=1261
+ _globals['_CLUEGIVEN']._serialized_start=1263
+ _globals['_CLUEGIVEN']._serialized_end=1314
+ _globals['_CARDREVEAL']._serialized_start=1316
+ _globals['_CARDREVEAL']._serialized_end=1400
+ _globals['_TURNENDED']._serialized_start=1402
+ _globals['_TURNENDED']._serialized_end=1413
+ _globals['_BOT']._serialized_start=1416
+ _globals['_BOT']._serialized_end=1860
+# @@protoc_insertion_point(module_scope)
diff --git a/codenames/v1/types_pb2.pyi b/codenames/v1/types_pb2.pyi
new file mode 100644
index 0000000..1bc2f3c
--- /dev/null
+++ b/codenames/v1/types_pb2.pyi
@@ -0,0 +1,217 @@
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from collections.abc import Iterable as _Iterable, Mapping as _Mapping
+from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
+
+DESCRIPTOR: _descriptor.FileDescriptor
+
+class Team(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ TEAM_UNSPECIFIED: _ClassVar[Team]
+ TEAM_RED: _ClassVar[Team]
+ TEAM_BLUE: _ClassVar[Team]
+
+class CardType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ CARD_TYPE_UNSPECIFIED: _ClassVar[CardType]
+ CARD_TYPE_RED: _ClassVar[CardType]
+ CARD_TYPE_BLUE: _ClassVar[CardType]
+ CARD_TYPE_NEUTRAL: _ClassVar[CardType]
+ CARD_TYPE_ASSASSIN: _ClassVar[CardType]
+
+class GameState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ GAME_STATE_UNSPECIFIED: _ClassVar[GameState]
+ GAME_STATE_SPYMASTER: _ClassVar[GameState]
+ GAME_STATE_GUESSING: _ClassVar[GameState]
+ GAME_STATE_ENDED: _ClassVar[GameState]
+
+class GameEndReason(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ GAME_END_REASON_UNSPECIFIED: _ClassVar[GameEndReason]
+ GAME_END_REASON_NORMAL: _ClassVar[GameEndReason]
+ GAME_END_REASON_RED_DISQUALIFIED: _ClassVar[GameEndReason]
+ GAME_END_REASON_BLUE_DISQUALIFIED: _ClassVar[GameEndReason]
+ GAME_END_REASON_FAILED_GAME_START_NOTIFYING: _ClassVar[GameEndReason]
+ GAME_END_REASON_ABORTED: _ClassVar[GameEndReason]
+
+class GuessResult(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ GUESS_RESULT_UNSPECIFIED: _ClassVar[GuessResult]
+ GUESS_RESULT_CORRECT: _ClassVar[GuessResult]
+ GUESS_RESULT_WRONG: _ClassVar[GuessResult]
+ GUESS_RESULT_NEUTRAL: _ClassVar[GuessResult]
+ GUESS_RESULT_ASSASSIN: _ClassVar[GuessResult]
+ GUESS_RESULT_END_TURN: _ClassVar[GuessResult]
+
+class Role(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ ROLE_UNSPECIFIED: _ClassVar[Role]
+ ROLE_SPYMASTER: _ClassVar[Role]
+ ROLE_GUESSER: _ClassVar[Role]
+
+class BotState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+ __slots__ = ()
+ BOT_STATE_UNSPECIFIED: _ClassVar[BotState]
+ BOT_STATE_REGISTERED: _ClassVar[BotState]
+ BOT_STATE_UNREGISTERING: _ClassVar[BotState]
+ BOT_STATE_UNREGISTERED: _ClassVar[BotState]
+TEAM_UNSPECIFIED: Team
+TEAM_RED: Team
+TEAM_BLUE: Team
+CARD_TYPE_UNSPECIFIED: CardType
+CARD_TYPE_RED: CardType
+CARD_TYPE_BLUE: CardType
+CARD_TYPE_NEUTRAL: CardType
+CARD_TYPE_ASSASSIN: CardType
+GAME_STATE_UNSPECIFIED: GameState
+GAME_STATE_SPYMASTER: GameState
+GAME_STATE_GUESSING: GameState
+GAME_STATE_ENDED: GameState
+GAME_END_REASON_UNSPECIFIED: GameEndReason
+GAME_END_REASON_NORMAL: GameEndReason
+GAME_END_REASON_RED_DISQUALIFIED: GameEndReason
+GAME_END_REASON_BLUE_DISQUALIFIED: GameEndReason
+GAME_END_REASON_FAILED_GAME_START_NOTIFYING: GameEndReason
+GAME_END_REASON_ABORTED: GameEndReason
+GUESS_RESULT_UNSPECIFIED: GuessResult
+GUESS_RESULT_CORRECT: GuessResult
+GUESS_RESULT_WRONG: GuessResult
+GUESS_RESULT_NEUTRAL: GuessResult
+GUESS_RESULT_ASSASSIN: GuessResult
+GUESS_RESULT_END_TURN: GuessResult
+ROLE_UNSPECIFIED: Role
+ROLE_SPYMASTER: Role
+ROLE_GUESSER: Role
+BOT_STATE_UNSPECIFIED: BotState
+BOT_STATE_REGISTERED: BotState
+BOT_STATE_UNREGISTERING: BotState
+BOT_STATE_UNREGISTERED: BotState
+
+class Card(_message.Message):
+ __slots__ = ("word", "type", "revealed")
+ WORD_FIELD_NUMBER: _ClassVar[int]
+ TYPE_FIELD_NUMBER: _ClassVar[int]
+ REVEALED_FIELD_NUMBER: _ClassVar[int]
+ word: str
+ type: CardType
+ revealed: bool
+ def __init__(self, word: _Optional[str] = ..., type: _Optional[_Union[CardType, str]] = ..., revealed: _Optional[bool] = ...) -> None: ...
+
+class Board(_message.Message):
+ __slots__ = ("cards",)
+ CARDS_FIELD_NUMBER: _ClassVar[int]
+ cards: _containers.RepeatedCompositeFieldContainer[Card]
+ def __init__(self, cards: _Optional[_Iterable[_Union[Card, _Mapping]]] = ...) -> None: ...
+
+class Clue(_message.Message):
+ __slots__ = ("word", "count")
+ WORD_FIELD_NUMBER: _ClassVar[int]
+ COUNT_FIELD_NUMBER: _ClassVar[int]
+ word: str
+ count: int
+ def __init__(self, word: _Optional[str] = ..., count: _Optional[int] = ...) -> None: ...
+
+class Game(_message.Message):
+ __slots__ = ("game_id", "board", "current_team", "state", "red_cards_left", "blue_cards_left", "current_clue", "guesses_made", "winner", "end_reason", "disqualified_bot_id", "red_spymaster", "red_guesser", "blue_spymaster", "blue_guesser")
+ GAME_ID_FIELD_NUMBER: _ClassVar[int]
+ BOARD_FIELD_NUMBER: _ClassVar[int]
+ CURRENT_TEAM_FIELD_NUMBER: _ClassVar[int]
+ STATE_FIELD_NUMBER: _ClassVar[int]
+ RED_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ BLUE_CARDS_LEFT_FIELD_NUMBER: _ClassVar[int]
+ CURRENT_CLUE_FIELD_NUMBER: _ClassVar[int]
+ GUESSES_MADE_FIELD_NUMBER: _ClassVar[int]
+ WINNER_FIELD_NUMBER: _ClassVar[int]
+ END_REASON_FIELD_NUMBER: _ClassVar[int]
+ DISQUALIFIED_BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ RED_SPYMASTER_FIELD_NUMBER: _ClassVar[int]
+ RED_GUESSER_FIELD_NUMBER: _ClassVar[int]
+ BLUE_SPYMASTER_FIELD_NUMBER: _ClassVar[int]
+ BLUE_GUESSER_FIELD_NUMBER: _ClassVar[int]
+ game_id: str
+ board: Board
+ current_team: Team
+ state: GameState
+ red_cards_left: int
+ blue_cards_left: int
+ current_clue: Clue
+ guesses_made: int
+ winner: Team
+ end_reason: GameEndReason
+ disqualified_bot_id: str
+ red_spymaster: str
+ red_guesser: str
+ blue_spymaster: str
+ blue_guesser: str
+ def __init__(self, game_id: _Optional[str] = ..., board: _Optional[_Union[Board, _Mapping]] = ..., current_team: _Optional[_Union[Team, str]] = ..., state: _Optional[_Union[GameState, str]] = ..., red_cards_left: _Optional[int] = ..., blue_cards_left: _Optional[int] = ..., current_clue: _Optional[_Union[Clue, _Mapping]] = ..., guesses_made: _Optional[int] = ..., winner: _Optional[_Union[Team, str]] = ..., end_reason: _Optional[_Union[GameEndReason, str]] = ..., disqualified_bot_id: _Optional[str] = ..., red_spymaster: _Optional[str] = ..., red_guesser: _Optional[str] = ..., blue_spymaster: _Optional[str] = ..., blue_guesser: _Optional[str] = ...) -> None: ...
+
+class GameMove(_message.Message):
+ __slots__ = ("move_number", "clue_number", "team", "performed_at", "clue_given", "card_reveal", "turn_ended")
+ MOVE_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ CLUE_NUMBER_FIELD_NUMBER: _ClassVar[int]
+ TEAM_FIELD_NUMBER: _ClassVar[int]
+ PERFORMED_AT_FIELD_NUMBER: _ClassVar[int]
+ CLUE_GIVEN_FIELD_NUMBER: _ClassVar[int]
+ CARD_REVEAL_FIELD_NUMBER: _ClassVar[int]
+ TURN_ENDED_FIELD_NUMBER: _ClassVar[int]
+ move_number: int
+ clue_number: int
+ team: Team
+ performed_at: str
+ clue_given: ClueGiven
+ card_reveal: CardReveal
+ turn_ended: TurnEnded
+ def __init__(self, move_number: _Optional[int] = ..., clue_number: _Optional[int] = ..., team: _Optional[_Union[Team, str]] = ..., performed_at: _Optional[str] = ..., clue_given: _Optional[_Union[ClueGiven, _Mapping]] = ..., card_reveal: _Optional[_Union[CardReveal, _Mapping]] = ..., turn_ended: _Optional[_Union[TurnEnded, _Mapping]] = ...) -> None: ...
+
+class ClueGiven(_message.Message):
+ __slots__ = ("clue",)
+ CLUE_FIELD_NUMBER: _ClassVar[int]
+ clue: Clue
+ def __init__(self, clue: _Optional[_Union[Clue, _Mapping]] = ...) -> None: ...
+
+class CardReveal(_message.Message):
+ __slots__ = ("position", "type")
+ POSITION_FIELD_NUMBER: _ClassVar[int]
+ TYPE_FIELD_NUMBER: _ClassVar[int]
+ position: int
+ type: CardType
+ def __init__(self, position: _Optional[int] = ..., type: _Optional[_Union[CardType, str]] = ...) -> None: ...
+
+class TurnEnded(_message.Message):
+ __slots__ = ()
+ def __init__(self) -> None: ...
+
+class Bot(_message.Message):
+ __slots__ = ("bot_id", "identity_key", "base_url", "registered_at", "last_updated_at", "active_games", "elo_rating", "games_played", "wins", "losses", "team_id", "port", "state", "unregistered_at")
+ BOT_ID_FIELD_NUMBER: _ClassVar[int]
+ IDENTITY_KEY_FIELD_NUMBER: _ClassVar[int]
+ BASE_URL_FIELD_NUMBER: _ClassVar[int]
+ REGISTERED_AT_FIELD_NUMBER: _ClassVar[int]
+ LAST_UPDATED_AT_FIELD_NUMBER: _ClassVar[int]
+ ACTIVE_GAMES_FIELD_NUMBER: _ClassVar[int]
+ ELO_RATING_FIELD_NUMBER: _ClassVar[int]
+ GAMES_PLAYED_FIELD_NUMBER: _ClassVar[int]
+ WINS_FIELD_NUMBER: _ClassVar[int]
+ LOSSES_FIELD_NUMBER: _ClassVar[int]
+ TEAM_ID_FIELD_NUMBER: _ClassVar[int]
+ PORT_FIELD_NUMBER: _ClassVar[int]
+ STATE_FIELD_NUMBER: _ClassVar[int]
+ UNREGISTERED_AT_FIELD_NUMBER: _ClassVar[int]
+ bot_id: str
+ identity_key: str
+ base_url: str
+ registered_at: str
+ last_updated_at: str
+ active_games: _containers.RepeatedScalarFieldContainer[str]
+ elo_rating: int
+ games_played: int
+ wins: int
+ losses: int
+ team_id: str
+ port: int
+ state: BotState
+ unregistered_at: str
+ def __init__(self, bot_id: _Optional[str] = ..., identity_key: _Optional[str] = ..., base_url: _Optional[str] = ..., registered_at: _Optional[str] = ..., last_updated_at: _Optional[str] = ..., active_games: _Optional[_Iterable[str]] = ..., elo_rating: _Optional[int] = ..., games_played: _Optional[int] = ..., wins: _Optional[int] = ..., losses: _Optional[int] = ..., team_id: _Optional[str] = ..., port: _Optional[int] = ..., state: _Optional[_Union[BotState, str]] = ..., unregistered_at: _Optional[str] = ...) -> None: ...