export interface ClientMessage { uuid: string target: string method: string args: { [key: string]: string } } export interface LobbyEvents { 'newGame': (author: IUser, game: IGameListing) => void; } type TeamEvents = { team_addPlayer: { gameObject: string, data: IPlayer }, test: { bite: number, data: IPlayer } } type TE = { [T in keyof TeamEvents]: { event: T } & TeamEvents[T] } type ChildEvents = TE export interface GameEvents { "createTeam": (author: IUser, team: ITeam) => void "removeTeam": (author: IUser, team: ITeam) => void "createPlayer": (author: IUser, player: IPlayer) => void "removePlayer": (author: IUser, player: IPlayer, reason: string) => void "childEvent": (event: ChildEvents[keyof ChildEvents]) => void } export interface IGameObject { readonly uuid: string } export interface IUser { readonly username: string readonly image: string } export interface IPlayer extends IGameObject { } export interface ITeam extends IGameObject { } export interface IGameListing extends IGameObject { readonly players: IUser[] readonly started: boolean readonly owner: string readonly rules: {} }