User

August 30, 2026 ยท View on GitHub


Info

Fetch user info from the server.

  • Endpoint Type: Request -> Response
  • Source: User
  • Target: Server
  • Required Scopes: tachyon.lobby

Request

JSONSchema
{
    "title": "UserInfoRequest",
    "tachyon": {
        "source": "user",
        "target": "server",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "request" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/info" },
        "data": {
            "title": "UserInfoRequestData",
            "type": "object",
            "properties": { "userId": { "$ref": "#/definitions/userId" } },
            "required": ["userId"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "request",
    "messageId": "Lorem nulla sed aute",
    "commandId": "user/info",
    "data": {
        "userId": "351"
    }
}

TypeScript Definition

export type UserId = string;

export interface UserInfoRequest {
    type: "request";
    messageId: string;
    commandId: "user/info";
    data: UserInfoRequestData;
}
export interface UserInfoRequestData {
    userId: UserId;
}

Response

JSONSchema
{
    "title": "UserInfoResponse",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "anyOf": [
        {
            "title": "UserInfoOkResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/info" },
                "status": { "const": "success" },
                "data": {
                    "$ref": "#/definitions/user",
                    "title": "UserInfoOkResponseData"
                }
            },
            "required": ["type", "messageId", "commandId", "status", "data"]
        },
        {
            "title": "UserInfoFailResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/info" },
                "status": { "const": "failed" },
                "reason": {
                    "enum": [
                        "unknown_user",
                        "internal_error",
                        "unauthorized",
                        "invalid_request",
                        "command_unimplemented"
                    ]
                },
                "details": { "type": "string" }
            },
            "required": ["type", "messageId", "commandId", "status", "reason"]
        }
    ]
}

Example
{
    "type": "response",
    "messageId": "ex pariatur deserunt mollit ad",
    "commandId": "user/info",
    "status": "success",
    "data": {
        "userId": "351",
        "username": "enim ad in minim est",
        "displayName": "culpa exercitation Lorem cillum fugiat",
        "clanBaseData": null,
        "countryCode": "incididunt dolore est enim",
        "status": "offline",
        "rating": {
            "value": -90001225.47149658
        },
        "roles": [
            "contributor",
            "tournament_winner",
            "admin",
            "tournament_caster",
            "moderator"
        ]
    }
}

TypeScript Definition

export type UserId = string;
export type ClanId = string;

export interface UserInfoOkResponse {
    type: "response";
    messageId: string;
    commandId: "user/info";
    status: "success";
    data: UserInfoOkResponseData;
}
export interface UserInfoOkResponseData {
    userId: UserId;
    username: string;
    displayName: string;
    clanBaseData:
        | ({
              clanId: ClanId;
          } & ClanUpdateableBaseData)
        | null;
    countryCode?: string;
    status: "offline" | "menu" | "playing" | "lobby";
    rating?: {
        value: number;
    };
    roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
}
export interface ClanUpdateableBaseData {
    name: string;
    tag: string;
    language: string;
}

Possible Failed Reasons: unknown_user, internal_error, unauthorized, invalid_request, command_unimplemented


Report

Issue a single moderation report on one or more users.

  • Endpoint Type: Request -> Response
  • Source: User
  • Target: Server
  • Required Scopes: tachyon.lobby

Request

JSONSchema
{
    "title": "UserReportRequest",
    "tachyon": {
        "source": "user",
        "target": "server",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "request" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/report" },
        "data": {
            "title": "UserReportRequestData",
            "type": "object",
            "properties": {
                "userIds": {
                    "type": "array",
                    "items": { "$ref": "#/definitions/userId" }
                },
                "reason": {
                    "type": "object",
                    "properties": { "type": { "type": "string" } },
                    "required": ["type"]
                },
                "message": { "type": "string" }
            },
            "required": ["userIds", "reason"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "request",
    "messageId": "consequat",
    "commandId": "user/report",
    "data": {
        "userIds": [],
        "reason": {
            "type": "incididunt dolor nisi sunt"
        }
    }
}

TypeScript Definition

export type UserId = string;

export interface UserReportRequest {
    type: "request";
    messageId: string;
    commandId: "user/report";
    data: UserReportRequestData;
}
export interface UserReportRequestData {
    userIds: UserId[];
    reason: {
        type: string;
    };
    message?: string;
}

Response

JSONSchema
{
    "title": "UserReportResponse",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "anyOf": [
        {
            "title": "UserReportOkResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/report" },
                "status": { "const": "success" }
            },
            "required": ["type", "messageId", "commandId", "status"]
        },
        {
            "title": "UserReportFailResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/report" },
                "status": { "const": "failed" },
                "reason": {
                    "enum": [
                        "unknown_user",
                        "internal_error",
                        "unauthorized",
                        "invalid_request",
                        "command_unimplemented"
                    ]
                },
                "details": { "type": "string" }
            },
            "required": ["type", "messageId", "commandId", "status", "reason"]
        }
    ]
}

Example
{
    "type": "response",
    "messageId": "ea ut anim occaecat",
    "commandId": "user/report",
    "status": "success"
}

TypeScript Definition

export interface UserReportOkResponse {
    type: "response";
    messageId: string;
    commandId: "user/report";
    status: "success";
}

Possible Failed Reasons: unknown_user, internal_error, unauthorized, invalid_request, command_unimplemented


Self

Sent by the server to inform the client of its own user state. This event should be sent to a user when they login.

  • Endpoint Type: Event
  • Source: Server
  • Target: User
  • Required Scopes: tachyon.lobby

Event

JSONSchema
{
    "title": "UserSelfEvent",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "event" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/self" },
        "data": {
            "title": "UserSelfEventData",
            "type": "object",
            "properties": { "user": { "$ref": "#/definitions/privateUser" } },
            "required": ["user"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "event",
    "messageId": "veniam ut ad cillum quis",
    "commandId": "user/self",
    "data": {
        "user": {
            "userId": "351",
            "username": "amet qui cillum occaecat",
            "displayName": "Lorem pariatur anim minim in",
            "clanBaseData": {
                "clanId": "12345",
                "name": "in ut d",
                "tag": "enim",
                "language": "consequat eu culpa voluptate Lorem"
            },
            "countryCode": "adipisicing dolor sint eiusmod cillum",
            "status": "offline",
            "party": {
                "id": "1882f6b2e3a4d14f24acb7aa",
                "members": [
                    {
                        "userId": "351",
                        "joinedAt": 1705432698000000
                    },
                    {
                        "userId": "351",
                        "joinedAt": 1705432698000000
                    },
                    {
                        "userId": "351",
                        "joinedAt": 1705432698000000
                    },
                    {
                        "userId": "351",
                        "joinedAt": 1705432698000000
                    }
                ],
                "maxMembers": 35542220,
                "invited": [
                    {
                        "userId": "351",
                        "invitedAt": 1705432698000000
                    },
                    {
                        "userId": "351",
                        "invitedAt": 1705432698000000
                    },
                    {
                        "userId": "351",
                        "invitedAt": 1705432698000000
                    }
                ]
            },
            "invitedToParties": [],
            "friendIds": [],
            "outgoingFriendRequest": [
                {
                    "to": {},
                    "sentAt": {}
                },
                {
                    "to": {},
                    "sentAt": {}
                },
                {
                    "to": {},
                    "sentAt": {}
                },
                {
                    "to": {},
                    "sentAt": {}
                },
                {
                    "to": {},
                    "sentAt": {}
                }
            ],
            "incomingFriendRequest": [
                {
                    "from": {},
                    "sentAt": {}
                },
                {
                    "from": {},
                    "sentAt": {}
                },
                {
                    "from": {},
                    "sentAt": {}
                },
                {
                    "from": {},
                    "sentAt": {}
                },
                {
                    "from": {},
                    "sentAt": {}
                }
            ],
            "ignoreIds": [],
            "currentBattle": {
                "battleId": "75bfc493-2b9d-495d-a453-06722fdca2ea",
                "username": "amet nulla",
                "password": "quis eiusmod in ut veniam",
                "ips": [
                    "38c9:73c9:bfd1:63bc:f84a:6005:cd0c:8549",
                    "15.28.128.124",
                    "44.32.74.70"
                ],
                "port": 19974,
                "engine": {
                    "version": "deserunt esse"
                },
                "game": {
                    "springName": "labore in"
                },
                "map": {
                    "springName": "quis in veniam sed"
                }
            },
            "currentLobby": null,
            "clanInvites": [
                "12345",
                "12345",
                "12345",
                "12345"
            ],
            "matchmaking": {
                "state": "no_matchmaking"
            }
        }
    }
}

TypeScript Definition

export type PrivateUser = User & {
    party: PartyState | null;
    invitedToParties: PartyState[];
    friendIds: UserId[];
    outgoingFriendRequest: {
        to: UserId;
        sentAt: UnixTime;
    }[];
    incomingFriendRequest: {
        from: UserId;
        sentAt: UnixTime;
    }[];
    ignoreIds: UserId[];
    currentBattle?: PrivateBattle;
    currentLobby: LobbyId | null;
    clanInvites: ClanId[];
    matchmaking:
        | {
              state: "no_matchmaking";
          }
        | {
              state: "queuing";
              queues: [
                  {
                      id: string;
                      version: string;
                  },
                  ...{
                      id: string;
                      version: string;
                  }[]
              ];
          }
        | {
              state: "found";
              queue: {
                  id: string;
                  version: string;
                  timeoutAt: UnixTime;
                  hasAlreadyReadied: boolean;
              };
              otherQueues: {
                  id: string;
                  version: string;
              }[];
          };
};
export type UserId = string;
export type ClanId = string;
export type PartyId = string;
export type UnixTime = number;
export type BattleId = string;
export type LobbyId = string;

export interface UserSelfEvent {
    type: "event";
    messageId: string;
    commandId: "user/self";
    data: UserSelfEventData;
}
export interface UserSelfEventData {
    user: PrivateUser;
}
export interface User {
    userId: UserId;
    username: string;
    displayName: string;
    clanBaseData:
        | ({
              clanId: ClanId;
          } & ClanUpdateableBaseData)
        | null;
    countryCode?: string;
    status: "offline" | "menu" | "playing" | "lobby";
    rating?: {
        value: number;
    };
    roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
}
export interface ClanUpdateableBaseData {
    name: string;
    tag: string;
    language: string;
}
export interface PartyState {
    id: PartyId;
    members: {
        userId: UserId;
        joinedAt: UnixTime;
    }[];
    maxMembers: number;
    invited: {
        userId: UserId;
        invitedAt: UnixTime;
    }[];
}
export interface PrivateBattle {
    battleId: BattleId;
    username: string;
    password: string;
    ips: string[];
    port: number;
    engine: {
        version: string;
    };
    game: {
        springName: string;
    };
    map: {
        springName: string;
    };
}

SubscribeUpdates

Ask the server to send updates about theses users. A maximum of 100 userIds can be subscribed to at any given time.

  • Endpoint Type: Request -> Response
  • Source: User
  • Target: Server
  • Required Scopes: tachyon.lobby

Request

JSONSchema
{
    "title": "UserSubscribeUpdatesRequest",
    "tachyon": {
        "source": "user",
        "target": "server",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "request" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/subscribeUpdates" },
        "data": {
            "title": "UserSubscribeUpdatesRequestData",
            "type": "object",
            "properties": {
                "userIds": {
                    "type": "array",
                    "items": { "$ref": "#/definitions/userId" },
                    "minItems": 1,
                    "maxItems": 100
                }
            },
            "required": ["userIds"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "request",
    "messageId": "aute mollit proident sunt dolore",
    "commandId": "user/subscribeUpdates",
    "data": {
        "userIds": [
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351"
        ]
    }
}

TypeScript Definition

export type UserId = string;

export interface UserSubscribeUpdatesRequest {
    type: "request";
    messageId: string;
    commandId: "user/subscribeUpdates";
    data: UserSubscribeUpdatesRequestData;
}
export interface UserSubscribeUpdatesRequestData {
    userIds: [UserId, ...UserId[]];
}

Response

JSONSchema
{
    "title": "UserSubscribeUpdatesResponse",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "anyOf": [
        {
            "title": "UserSubscribeUpdatesOkResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/subscribeUpdates" },
                "status": { "const": "success" }
            },
            "required": ["type", "messageId", "commandId", "status"]
        },
        {
            "title": "UserSubscribeUpdatesFailResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/subscribeUpdates" },
                "status": { "const": "failed" },
                "reason": {
                    "enum": [
                        "subscription_limit_reached",
                        "internal_error",
                        "unauthorized",
                        "invalid_request",
                        "command_unimplemented"
                    ]
                },
                "details": { "type": "string" }
            },
            "required": ["type", "messageId", "commandId", "status", "reason"]
        }
    ]
}

Example
{
    "type": "response",
    "messageId": "ullamco eiusmod cillum Excepteur",
    "commandId": "user/subscribeUpdates",
    "status": "success"
}

TypeScript Definition

export interface UserSubscribeUpdatesOkResponse {
    type: "response";
    messageId: string;
    commandId: "user/subscribeUpdates";
    status: "success";
}

Possible Failed Reasons: subscription_limit_reached, internal_error, unauthorized, invalid_request, command_unimplemented


UnsubscribeUpdates

Ask the server to stop sending user updates for the given set of userId. This should always succeed.

  • Endpoint Type: Request -> Response
  • Source: User
  • Target: Server
  • Required Scopes: tachyon.lobby

Request

JSONSchema
{
    "title": "UserUnsubscribeUpdatesRequest",
    "tachyon": {
        "source": "user",
        "target": "server",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "request" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/unsubscribeUpdates" },
        "data": {
            "title": "UserUnsubscribeUpdatesRequestData",
            "type": "object",
            "properties": {
                "userIds": {
                    "type": "array",
                    "items": { "$ref": "#/definitions/userId" },
                    "minItems": 1,
                    "maxItems": 100
                }
            },
            "required": ["userIds"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "request",
    "messageId": "commodo aute eiusmod adipisicing anim",
    "commandId": "user/unsubscribeUpdates",
    "data": {
        "userIds": [
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351",
            "351"
        ]
    }
}

TypeScript Definition

export type UserId = string;

export interface UserUnsubscribeUpdatesRequest {
    type: "request";
    messageId: string;
    commandId: "user/unsubscribeUpdates";
    data: UserUnsubscribeUpdatesRequestData;
}
export interface UserUnsubscribeUpdatesRequestData {
    userIds: [UserId, ...UserId[]];
}

Response

JSONSchema
{
    "title": "UserUnsubscribeUpdatesResponse",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "anyOf": [
        {
            "title": "UserUnsubscribeUpdatesOkResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/unsubscribeUpdates" },
                "status": { "const": "success" }
            },
            "required": ["type", "messageId", "commandId", "status"]
        },
        {
            "title": "UserUnsubscribeUpdatesFailResponse",
            "type": "object",
            "properties": {
                "type": { "const": "response" },
                "messageId": { "type": "string" },
                "commandId": { "const": "user/unsubscribeUpdates" },
                "status": { "const": "failed" },
                "reason": {
                    "enum": [
                        "internal_error",
                        "unauthorized",
                        "invalid_request",
                        "command_unimplemented"
                    ]
                },
                "details": { "type": "string" }
            },
            "required": ["type", "messageId", "commandId", "status", "reason"]
        }
    ]
}

Example
{
    "type": "response",
    "messageId": "minim adipisicing",
    "commandId": "user/unsubscribeUpdates",
    "status": "success"
}

TypeScript Definition

export interface UserUnsubscribeUpdatesOkResponse {
    type: "response";
    messageId: string;
    commandId: "user/unsubscribeUpdates";
    status: "success";
}

Possible Failed Reasons: internal_error, unauthorized, invalid_request, command_unimplemented


Updated

Sent by the server to inform the client of user state changes. User objects should be full when first sent, then only updates gets sent.

  • Endpoint Type: Event
  • Source: Server
  • Target: User
  • Required Scopes: tachyon.lobby

Event

JSONSchema
{
    "title": "UserUpdatedEvent",
    "tachyon": {
        "source": "server",
        "target": "user",
        "scopes": ["tachyon.lobby"]
    },
    "type": "object",
    "properties": {
        "type": { "const": "event" },
        "messageId": { "type": "string" },
        "commandId": { "const": "user/updated" },
        "data": {
            "title": "UserUpdatedEventData",
            "type": "object",
            "properties": {
                "users": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "userId": { "$ref": "#/definitions/userId" },
                            "username": { "type": "string" },
                            "displayName": { "type": "string" },
                            "clanBaseData": {
                                "anyOf": [
                                    {
                                        "allOf": [
                                            {
                                                "type": "object",
                                                "properties": {
                                                    "clanId": {
                                                        "$ref": "#/definitions/clanId"
                                                    }
                                                },
                                                "required": ["clanId"]
                                            },
                                            {
                                                "$ref": "#/definitions/clanUpdateableBaseData"
                                            }
                                        ]
                                    },
                                    { "type": "null" }
                                ]
                            },
                            "countryCode": { "type": "string" },
                            "status": {
                                "enum": ["offline", "menu", "playing", "lobby"]
                            },
                            "rating": {
                                "type": "object",
                                "properties": {
                                    "value": {
                                        "description": "Key is omitted when the player isn't rated yet.",
                                        "type": "number"
                                    }
                                },
                                "required": ["value"]
                            },
                            "roles": {
                                "type": "array",
                                "items": {
                                    "enum": [
                                        "contributor",
                                        "admin",
                                        "moderator",
                                        "tournament_winner",
                                        "tournament_caster"
                                    ]
                                },
                                "uniqueItems": true
                            }
                        }
                    }
                }
            },
            "required": ["users"]
        }
    },
    "required": ["type", "messageId", "commandId", "data"]
}

Example
{
    "type": "event",
    "messageId": "ad",
    "commandId": "user/updated",
    "data": {
        "users": [
            {
                "reprehenderit_1": -69989050,
                "eiusmod_9_1": 27231049.53765869,
                "exd": true,
                "Excepteurc1": true,
                "mollit_b": false,
                "voluptate8a3": 84426176.54800415,
                "userId": "351",
                "status": "lobby",
                "rating": {
                    "value": -7566881.17980957
                }
            },
            {
                "displayName": "dolore laboris non pariatur"
            },
            {
                "do_afe": 77962529,
                "cupidatat__6": 47290003.299713135,
                "countryCode": "id",
                "rating": {
                    "value": 40300142.765045166
                }
            },
            {
                "adipisicing_8e1": 97860765,
                "labore_3f7": -1436126.2321472168,
                "nisie79": "nostrud Lorem laborum tempor magna",
                "ipsum_286": "nulla quis anim esse",
                "userId": "351",
                "roles": [
                    "moderator"
                ]
            }
        ]
    }
}

TypeScript Definition

export type UserId = string;
export type ClanId = string;

export interface UserUpdatedEvent {
    type: "event";
    messageId: string;
    commandId: "user/updated";
    data: UserUpdatedEventData;
}
export interface UserUpdatedEventData {
    users: {
        userId?: UserId;
        username?: string;
        displayName?: string;
        clanBaseData?:
            | ({
                  clanId: ClanId;
              } & ClanUpdateableBaseData)
            | null;
        countryCode?: string;
        status?: "offline" | "menu" | "playing" | "lobby";
        rating?: {
            value: number;
        };
        roles?: ("contributor" | "admin" | "moderator" | "tournament_winner" | "tournament_caster")[];
    }[];
}
export interface ClanUpdateableBaseData {
    name: string;
    tag: string;
    language: string;
}