SongGuess
    Preparing search index...
    interface IEventListener {
        onMessage?: (
            player: Player,
            msg:
                | { type: "change_username"; username: string }
                | {
                    playlists: {
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                        }[];
                        subtitle?: string;
                    }[];
                    type: "add_playlists";
                }
                | { index: number
                | null; type: "remove_playlist" }
                | {
                    advancedSongFiltering: boolean;
                    audioStartPosition: number;
                    distractionsPreferSameArtist: boolean;
                    endWhenAnswered: boolean;
                    gameMode: "multiple_choice" | "player_picks";
                    playerPickTimeout: number;
                    roundsCount: number;
                    timePerQuestion: number;
                    type: "room_config";
                }
                | { type: "start_game" }
                | { answer?: string; answerIndex?: number; type: "select_answer" }
                | { type: "return_to"; where: "lobby" | "results" }
                | { playerName: string; type: "transfer_host" }
                | {
                    song: {
                        artist: string;
                        audioURL: string;
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                    };
                    startPos: number;
                    type: "player_pick_song";
                }
                | {
                    error?: string;
                    sourceMessage: | {
                        action: "load";
                        audioURL: string;
                        type: "audio_control";
                    }
                    | {
                        action: | "play"
                        | "pause"
                        | "play_countdown_running"
                        | "play_countdown_end";
                        type: "audio_control";
                    }
                    | { type: "change_username"; username: string }
                    | {
                        playlists: {
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: string;
                                audioURL: string;
                                cover: (...) | (...);
                                hrefURL: string;
                                name: string;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "add_playlists";
                    }
                    | { index: number
                    | null; type: "remove_playlist" }
                    | {
                        advancedSongFiltering: boolean;
                        audioStartPosition: number;
                        distractionsPreferSameArtist: boolean;
                        endWhenAnswered: boolean;
                        gameMode: "multiple_choice" | "player_picks";
                        playerPickTimeout: number;
                        roundsCount: number;
                        timePerQuestion: number;
                        type: "room_config";
                    }
                    | { type: "start_game" }
                    | { answer?: string; answerIndex?: number; type: "select_answer" }
                    | { type: "return_to"; where: "lobby" | "results" }
                    | { playerName: string; type: "transfer_host" }
                    | {
                        song: {
                            artist: string;
                            audioURL: string;
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                        };
                        startPos: number;
                        type: "player_pick_song";
                    }
                    | {
                        players: Record<
                            string,
                            {
                                answerData?: {
                                    answer?: (...)
                                    | (...);
                                    answerIndex?: (...) | (...);
                                    answerSpeed: number;
                                    answerTimestamp: number;
                                    questionPoints: number;
                                };
                                color: string;
                                isHost: boolean;
                                isSpectator: boolean;
                                points: number;
                                username: string;
                            },
                        >;
                        state: "lobby"
                        | "results"
                        | "ingame";
                        type: "room_state";
                        uuid: string;
                        version: string;
                    }
                    | {
                        filteredSongsCount: number;
                        playlists?: {
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: ...;
                                audioURL: ...;
                                cover: ...;
                                hrefURL: ...;
                                name: ...;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "update_playlists";
                    }
                    | { countdown: number; type: "countdown" }
                    | {
                        gamePhase: GamePhase;
                        question?:
                            | {
                                answerOptions: string[];
                                correctAnswerIndex?: number;
                                questionType: "multiple_choice";
                                startPos: number;
                            }
                            | {
                                correctAnswer?: {
                                    artist: string;
                                    audioURL: string;
                                    cover: (...)
                                    | (...);
                                    hrefURL: string;
                                    name: string;
                                };
                                pickerId: string;
                                questionCount: number;
                                questionCurrent: number;
                                questionType: "player_picks";
                                startPos: number;
                            };
                        roundCurrent: number;
                        type: "round_state";
                    }
                    | {
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                        }[];
                        type: "update_played_songs";
                    }
                    | {
                        entry: LogEntry;
                        level: "error"
                        | "info"
                        | "warn"
                        | "debug";
                        type: "add_log_message";
                    }
                    | { messages: LoggerStorage; type: "update_log_messages" }
                    | { duration: number; offset: number; type: "progressbar_update" }
                    | { type: "other" };
                    type: "confirmation";
                }
                | { seq: number; type: "ping" }
                | { seq: number; type: "pong" },
        ) => boolean;
        onTick?: () => void;
    }

    Implemented by

    Index

    Properties

    Properties

    onMessage?: (
        player: Player,
        msg:
            | { type: "change_username"; username: string }
            | {
                playlists: {
                    cover: string | null;
                    hrefURL: string;
                    name: string;
                    songs: {
                        artist: string;
                        audioURL: string;
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                    }[];
                    subtitle?: string;
                }[];
                type: "add_playlists";
            }
            | { index: number
            | null; type: "remove_playlist" }
            | {
                advancedSongFiltering: boolean;
                audioStartPosition: number;
                distractionsPreferSameArtist: boolean;
                endWhenAnswered: boolean;
                gameMode: "multiple_choice" | "player_picks";
                playerPickTimeout: number;
                roundsCount: number;
                timePerQuestion: number;
                type: "room_config";
            }
            | { type: "start_game" }
            | { answer?: string; answerIndex?: number; type: "select_answer" }
            | { type: "return_to"; where: "lobby" | "results" }
            | { playerName: string; type: "transfer_host" }
            | {
                song: {
                    artist: string;
                    audioURL: string;
                    cover: string | null;
                    hrefURL: string;
                    name: string;
                };
                startPos: number;
                type: "player_pick_song";
            }
            | {
                error?: string;
                sourceMessage: | {
                    action: "load";
                    audioURL: string;
                    type: "audio_control";
                }
                | {
                    action: | "play"
                    | "pause"
                    | "play_countdown_running"
                    | "play_countdown_end";
                    type: "audio_control";
                }
                | { type: "change_username"; username: string }
                | {
                    playlists: {
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: (...) | (...);
                            hrefURL: string;
                            name: string;
                        }[];
                        subtitle?: string;
                    }[];
                    type: "add_playlists";
                }
                | { index: number
                | null; type: "remove_playlist" }
                | {
                    advancedSongFiltering: boolean;
                    audioStartPosition: number;
                    distractionsPreferSameArtist: boolean;
                    endWhenAnswered: boolean;
                    gameMode: "multiple_choice" | "player_picks";
                    playerPickTimeout: number;
                    roundsCount: number;
                    timePerQuestion: number;
                    type: "room_config";
                }
                | { type: "start_game" }
                | { answer?: string; answerIndex?: number; type: "select_answer" }
                | { type: "return_to"; where: "lobby" | "results" }
                | { playerName: string; type: "transfer_host" }
                | {
                    song: {
                        artist: string;
                        audioURL: string;
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                    };
                    startPos: number;
                    type: "player_pick_song";
                }
                | {
                    players: Record<
                        string,
                        {
                            answerData?: {
                                answer?: (...)
                                | (...);
                                answerIndex?: (...) | (...);
                                answerSpeed: number;
                                answerTimestamp: number;
                                questionPoints: number;
                            };
                            color: string;
                            isHost: boolean;
                            isSpectator: boolean;
                            points: number;
                            username: string;
                        },
                    >;
                    state: "lobby"
                    | "results"
                    | "ingame";
                    type: "room_state";
                    uuid: string;
                    version: string;
                }
                | {
                    filteredSongsCount: number;
                    playlists?: {
                        cover: string
                        | null;
                        hrefURL: string;
                        name: string;
                        songs: {
                            artist: ...;
                            audioURL: ...;
                            cover: ...;
                            hrefURL: ...;
                            name: ...;
                        }[];
                        subtitle?: string;
                    }[];
                    type: "update_playlists";
                }
                | { countdown: number; type: "countdown" }
                | {
                    gamePhase: GamePhase;
                    question?:
                        | {
                            answerOptions: string[];
                            correctAnswerIndex?: number;
                            questionType: "multiple_choice";
                            startPos: number;
                        }
                        | {
                            correctAnswer?: {
                                artist: string;
                                audioURL: string;
                                cover: (...)
                                | (...);
                                hrefURL: string;
                                name: string;
                            };
                            pickerId: string;
                            questionCount: number;
                            questionCurrent: number;
                            questionType: "player_picks";
                            startPos: number;
                        };
                    roundCurrent: number;
                    type: "round_state";
                }
                | {
                    songs: {
                        artist: string;
                        audioURL: string;
                        cover: string
                        | null;
                        hrefURL: string;
                        name: string;
                    }[];
                    type: "update_played_songs";
                }
                | {
                    entry: LogEntry;
                    level: "error"
                    | "info"
                    | "warn"
                    | "debug";
                    type: "add_log_message";
                }
                | { messages: LoggerStorage; type: "update_log_messages" }
                | { duration: number; offset: number; type: "progressbar_update" }
                | { type: "other" };
                type: "confirmation";
            }
            | { seq: number; type: "ping" }
            | { seq: number; type: "pong" },
    ) => boolean

    Handles incoming client messages

    Type Declaration

      • (
            player: Player,
            msg:
                | { type: "change_username"; username: string }
                | {
                    playlists: {
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                        }[];
                        subtitle?: string;
                    }[];
                    type: "add_playlists";
                }
                | { index: number
                | null; type: "remove_playlist" }
                | {
                    advancedSongFiltering: boolean;
                    audioStartPosition: number;
                    distractionsPreferSameArtist: boolean;
                    endWhenAnswered: boolean;
                    gameMode: "multiple_choice" | "player_picks";
                    playerPickTimeout: number;
                    roundsCount: number;
                    timePerQuestion: number;
                    type: "room_config";
                }
                | { type: "start_game" }
                | { answer?: string; answerIndex?: number; type: "select_answer" }
                | { type: "return_to"; where: "lobby" | "results" }
                | { playerName: string; type: "transfer_host" }
                | {
                    song: {
                        artist: string;
                        audioURL: string;
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                    };
                    startPos: number;
                    type: "player_pick_song";
                }
                | {
                    error?: string;
                    sourceMessage: | {
                        action: "load";
                        audioURL: string;
                        type: "audio_control";
                    }
                    | {
                        action: | "play"
                        | "pause"
                        | "play_countdown_running"
                        | "play_countdown_end";
                        type: "audio_control";
                    }
                    | { type: "change_username"; username: string }
                    | {
                        playlists: {
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: string;
                                audioURL: string;
                                cover: (...) | (...);
                                hrefURL: string;
                                name: string;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "add_playlists";
                    }
                    | { index: number
                    | null; type: "remove_playlist" }
                    | {
                        advancedSongFiltering: boolean;
                        audioStartPosition: number;
                        distractionsPreferSameArtist: boolean;
                        endWhenAnswered: boolean;
                        gameMode: "multiple_choice" | "player_picks";
                        playerPickTimeout: number;
                        roundsCount: number;
                        timePerQuestion: number;
                        type: "room_config";
                    }
                    | { type: "start_game" }
                    | { answer?: string; answerIndex?: number; type: "select_answer" }
                    | { type: "return_to"; where: "lobby" | "results" }
                    | { playerName: string; type: "transfer_host" }
                    | {
                        song: {
                            artist: string;
                            audioURL: string;
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                        };
                        startPos: number;
                        type: "player_pick_song";
                    }
                    | {
                        players: Record<
                            string,
                            {
                                answerData?: {
                                    answer?: (...)
                                    | (...);
                                    answerIndex?: (...) | (...);
                                    answerSpeed: number;
                                    answerTimestamp: number;
                                    questionPoints: number;
                                };
                                color: string;
                                isHost: boolean;
                                isSpectator: boolean;
                                points: number;
                                username: string;
                            },
                        >;
                        state: "lobby"
                        | "results"
                        | "ingame";
                        type: "room_state";
                        uuid: string;
                        version: string;
                    }
                    | {
                        filteredSongsCount: number;
                        playlists?: {
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: ...;
                                audioURL: ...;
                                cover: ...;
                                hrefURL: ...;
                                name: ...;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "update_playlists";
                    }
                    | { countdown: number; type: "countdown" }
                    | {
                        gamePhase: GamePhase;
                        question?:
                            | {
                                answerOptions: string[];
                                correctAnswerIndex?: number;
                                questionType: "multiple_choice";
                                startPos: number;
                            }
                            | {
                                correctAnswer?: {
                                    artist: string;
                                    audioURL: string;
                                    cover: (...)
                                    | (...);
                                    hrefURL: string;
                                    name: string;
                                };
                                pickerId: string;
                                questionCount: number;
                                questionCurrent: number;
                                questionType: "player_picks";
                                startPos: number;
                            };
                        roundCurrent: number;
                        type: "round_state";
                    }
                    | {
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                        }[];
                        type: "update_played_songs";
                    }
                    | {
                        entry: LogEntry;
                        level: "error"
                        | "info"
                        | "warn"
                        | "debug";
                        type: "add_log_message";
                    }
                    | { messages: LoggerStorage; type: "update_log_messages" }
                    | { duration: number; offset: number; type: "progressbar_update" }
                    | { type: "other" };
                    type: "confirmation";
                }
                | { seq: number; type: "ping" }
                | { seq: number; type: "pong" },
        ): boolean
      • Parameters

        • player: Player

          the player that sent the message

        • msg:
              | { type: "change_username"; username: string }
              | {
                  playlists: {
                      cover: string | null;
                      hrefURL: string;
                      name: string;
                      songs: {
                          artist: string;
                          audioURL: string;
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                      }[];
                      subtitle?: string;
                  }[];
                  type: "add_playlists";
              }
              | { index: number
              | null; type: "remove_playlist" }
              | {
                  advancedSongFiltering: boolean;
                  audioStartPosition: number;
                  distractionsPreferSameArtist: boolean;
                  endWhenAnswered: boolean;
                  gameMode: "multiple_choice" | "player_picks";
                  playerPickTimeout: number;
                  roundsCount: number;
                  timePerQuestion: number;
                  type: "room_config";
              }
              | { type: "start_game" }
              | { answer?: string; answerIndex?: number; type: "select_answer" }
              | { type: "return_to"; where: "lobby" | "results" }
              | { playerName: string; type: "transfer_host" }
              | {
                  song: {
                      artist: string;
                      audioURL: string;
                      cover: string | null;
                      hrefURL: string;
                      name: string;
                  };
                  startPos: number;
                  type: "player_pick_song";
              }
              | {
                  error?: string;
                  sourceMessage: | {
                      action: "load";
                      audioURL: string;
                      type: "audio_control";
                  }
                  | {
                      action: | "play"
                      | "pause"
                      | "play_countdown_running"
                      | "play_countdown_end";
                      type: "audio_control";
                  }
                  | { type: "change_username"; username: string }
                  | {
                      playlists: {
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                          songs: {
                              artist: string;
                              audioURL: string;
                              cover: (...) | (...);
                              hrefURL: string;
                              name: string;
                          }[];
                          subtitle?: string;
                      }[];
                      type: "add_playlists";
                  }
                  | { index: number
                  | null; type: "remove_playlist" }
                  | {
                      advancedSongFiltering: boolean;
                      audioStartPosition: number;
                      distractionsPreferSameArtist: boolean;
                      endWhenAnswered: boolean;
                      gameMode: "multiple_choice" | "player_picks";
                      playerPickTimeout: number;
                      roundsCount: number;
                      timePerQuestion: number;
                      type: "room_config";
                  }
                  | { type: "start_game" }
                  | { answer?: string; answerIndex?: number; type: "select_answer" }
                  | { type: "return_to"; where: "lobby" | "results" }
                  | { playerName: string; type: "transfer_host" }
                  | {
                      song: {
                          artist: string;
                          audioURL: string;
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                      };
                      startPos: number;
                      type: "player_pick_song";
                  }
                  | {
                      players: Record<
                          string,
                          {
                              answerData?: {
                                  answer?: (...)
                                  | (...);
                                  answerIndex?: (...) | (...);
                                  answerSpeed: number;
                                  answerTimestamp: number;
                                  questionPoints: number;
                              };
                              color: string;
                              isHost: boolean;
                              isSpectator: boolean;
                              points: number;
                              username: string;
                          },
                      >;
                      state: "lobby"
                      | "results"
                      | "ingame";
                      type: "room_state";
                      uuid: string;
                      version: string;
                  }
                  | {
                      filteredSongsCount: number;
                      playlists?: {
                          cover: string
                          | null;
                          hrefURL: string;
                          name: string;
                          songs: {
                              artist: ...;
                              audioURL: ...;
                              cover: ...;
                              hrefURL: ...;
                              name: ...;
                          }[];
                          subtitle?: string;
                      }[];
                      type: "update_playlists";
                  }
                  | { countdown: number; type: "countdown" }
                  | {
                      gamePhase: GamePhase;
                      question?:
                          | {
                              answerOptions: string[];
                              correctAnswerIndex?: number;
                              questionType: "multiple_choice";
                              startPos: number;
                          }
                          | {
                              correctAnswer?: {
                                  artist: string;
                                  audioURL: string;
                                  cover: (...)
                                  | (...);
                                  hrefURL: string;
                                  name: string;
                              };
                              pickerId: string;
                              questionCount: number;
                              questionCurrent: number;
                              questionType: "player_picks";
                              startPos: number;
                          };
                      roundCurrent: number;
                      type: "round_state";
                  }
                  | {
                      songs: {
                          artist: string;
                          audioURL: string;
                          cover: string
                          | null;
                          hrefURL: string;
                          name: string;
                      }[];
                      type: "update_played_songs";
                  }
                  | {
                      entry: LogEntry;
                      level: "error"
                      | "info"
                      | "warn"
                      | "debug";
                      type: "add_log_message";
                  }
                  | { messages: LoggerStorage; type: "update_log_messages" }
                  | { duration: number; offset: number; type: "progressbar_update" }
                  | { type: "other" };
                  type: "confirmation";
              }
              | { seq: number; type: "ping" }
              | { seq: number; type: "pong" }

          the sent message

          • { type: "change_username"; username: string }
            • type: "change_username"
            • username: string

              The new username.

          • {
                playlists: {
                    cover: string | null;
                    hrefURL: string;
                    name: string;
                    songs: {
                        artist: string;
                        audioURL: string;
                        cover: string | null;
                        hrefURL: string;
                        name: string;
                    }[];
                    subtitle?: string;
                }[];
                type: "add_playlists";
            }
            • playlists: {
                  cover: string | null;
                  hrefURL: string;
                  name: string;
                  songs: {
                      artist: string;
                      audioURL: string;
                      cover: string | null;
                      hrefURL: string;
                      name: string;
                  }[];
                  subtitle?: string;
              }[]

              The new playlist to add.

            • type: "add_playlists"
          • { index: number | null; type: "remove_playlist" }
            • index: number | null

              The playlist index to remove.

            • type: "remove_playlist"
          • {
                advancedSongFiltering: boolean;
                audioStartPosition: number;
                distractionsPreferSameArtist: boolean;
                endWhenAnswered: boolean;
                gameMode: "multiple_choice" | "player_picks";
                playerPickTimeout: number;
                roundsCount: number;
                timePerQuestion: number;
                type: "room_config";
            }
            • advancedSongFiltering: boolean

              Whether to perform advanced filtering tactics when generating the songs array. Currently just ignores parens when filtering for identical song names.

            • audioStartPosition: number

              The music start position.

              • 0: start of audio
              • 1: close to middle of audio
              • 2: close to end of audio
              • 3: random of the above

              Used as default value in PlayerPicksGame, used as forced position in MultipleChoiceGame.

            • distractionsPreferSameArtist: boolean

              Whether to prefer distractions by the same artist.

            • endWhenAnswered: boolean

              Whether to directly end the round after all players answered.

            • gameMode: "multiple_choice" | "player_picks"

              The game mode being played.

              • multiple_choice: the server selects random songs from the provided playlist and provides a multiple choice question with distractions.
              • player_picks: a player from the room picks a song for other players to guess each round. other players have to guess the song title by typing.
            • playerPickTimeout: number

              The amount of time a player should have to pick a song.

            • roundsCount: number

              The amount of rounds to play.

            • timePerQuestion: number

              The time per question in each round.

            • type: "room_config"
          • { type: "start_game" }
          • { answer?: string; answerIndex?: number; type: "select_answer" }
            • Optionalanswer?: string

              Provided only for PlayerPicksGame. The string of the song name the player guessed.

            • OptionalanswerIndex?: number

              Provided only for MultipleChoiceGame. The index of the selected answer.

            • type: "select_answer"
          • { type: "return_to"; where: "lobby" | "results" }
            • type: "return_to"
            • where: "lobby" | "results"

              Where to send the player to.

          • { playerName: string; type: "transfer_host" }
            • playerName: string

              The name of the player that should get host.

            • type: "transfer_host"
          • {
                song: {
                    artist: string;
                    audioURL: string;
                    cover: string | null;
                    hrefURL: string;
                    name: string;
                };
                startPos: number;
                type: "player_pick_song";
            }
            • song: {
                  artist: string;
                  audioURL: string;
                  cover: string | null;
                  hrefURL: string;
                  name: string;
              }

              The song the player picked in the choose step.

              • artist: string

                The name of the song artist.

              • audioURL: string

                A URL to the audio file of the song. Currently only audio previews from Apple Music and SoundCloud are allowed.

              • cover: string | null

                Cover URL of the song.

              • hrefURL: string

                The URL users will be redirected to when clicking.

              • name: string

                The name of the song.

            • startPos: number

              The selected start pos for the song.

              RoomConfigMessageSchema.audioStartPosition

            • type: "player_pick_song"
          • {
                error?: string;
                sourceMessage:
                    | { action: "load"; audioURL: string; type: "audio_control" }
                    | {
                        action:
                            | "play"
                            | "pause"
                            | "play_countdown_running"
                            | "play_countdown_end";
                        type: "audio_control";
                    }
                    | { type: "change_username"; username: string }
                    | {
                        playlists: {
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: string;
                                audioURL: string;
                                cover: (...) | (...);
                                hrefURL: string;
                                name: string;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "add_playlists";
                    }
                    | { index: number
                    | null; type: "remove_playlist" }
                    | {
                        advancedSongFiltering: boolean;
                        audioStartPosition: number;
                        distractionsPreferSameArtist: boolean;
                        endWhenAnswered: boolean;
                        gameMode: "multiple_choice" | "player_picks";
                        playerPickTimeout: number;
                        roundsCount: number;
                        timePerQuestion: number;
                        type: "room_config";
                    }
                    | { type: "start_game" }
                    | { answer?: string; answerIndex?: number; type: "select_answer" }
                    | { type: "return_to"; where: "lobby" | "results" }
                    | { playerName: string; type: "transfer_host" }
                    | {
                        song: {
                            artist: string;
                            audioURL: string;
                            cover: string | null;
                            hrefURL: string;
                            name: string;
                        };
                        startPos: number;
                        type: "player_pick_song";
                    }
                    | {
                        players: Record<
                            string,
                            {
                                answerData?: {
                                    answer?: (...)
                                    | (...);
                                    answerIndex?: (...) | (...);
                                    answerSpeed: number;
                                    answerTimestamp: number;
                                    questionPoints: number;
                                };
                                color: string;
                                isHost: boolean;
                                isSpectator: boolean;
                                points: number;
                                username: string;
                            },
                        >;
                        state: "lobby"
                        | "results"
                        | "ingame";
                        type: "room_state";
                        uuid: string;
                        version: string;
                    }
                    | {
                        filteredSongsCount: number;
                        playlists?: {
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                            songs: {
                                artist: ...;
                                audioURL: ...;
                                cover: ...;
                                hrefURL: ...;
                                name: ...;
                            }[];
                            subtitle?: string;
                        }[];
                        type: "update_playlists";
                    }
                    | { countdown: number; type: "countdown" }
                    | {
                        gamePhase: GamePhase;
                        question?:
                            | {
                                answerOptions: string[];
                                correctAnswerIndex?: number;
                                questionType: "multiple_choice";
                                startPos: number;
                            }
                            | {
                                correctAnswer?: {
                                    artist: string;
                                    audioURL: string;
                                    cover: (...)
                                    | (...);
                                    hrefURL: string;
                                    name: string;
                                };
                                pickerId: string;
                                questionCount: number;
                                questionCurrent: number;
                                questionType: "player_picks";
                                startPos: number;
                            };
                        roundCurrent: number;
                        type: "round_state";
                    }
                    | {
                        songs: {
                            artist: string;
                            audioURL: string;
                            cover: string
                            | null;
                            hrefURL: string;
                            name: string;
                        }[];
                        type: "update_played_songs";
                    }
                    | {
                        entry: LogEntry;
                        level: "error"
                        | "info"
                        | "warn"
                        | "debug";
                        type: "add_log_message";
                    }
                    | { messages: LoggerStorage; type: "update_log_messages" }
                    | { duration: number; offset: number; type: "progressbar_update" }
                    | { type: "other" };
                type: "confirmation";
            }
            • Optionalerror?: string

              Optional error message if the requested action could not be performed.

            • sourceMessage:
                  | { action: "load"; audioURL: string; type: "audio_control" }
                  | {
                      action:
                          | "play"
                          | "pause"
                          | "play_countdown_running"
                          | "play_countdown_end";
                      type: "audio_control";
                  }
                  | { type: "change_username"; username: string }
                  | {
                      playlists: {
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                          songs: {
                              artist: string;
                              audioURL: string;
                              cover: (...) | (...);
                              hrefURL: string;
                              name: string;
                          }[];
                          subtitle?: string;
                      }[];
                      type: "add_playlists";
                  }
                  | { index: number
                  | null; type: "remove_playlist" }
                  | {
                      advancedSongFiltering: boolean;
                      audioStartPosition: number;
                      distractionsPreferSameArtist: boolean;
                      endWhenAnswered: boolean;
                      gameMode: "multiple_choice" | "player_picks";
                      playerPickTimeout: number;
                      roundsCount: number;
                      timePerQuestion: number;
                      type: "room_config";
                  }
                  | { type: "start_game" }
                  | { answer?: string; answerIndex?: number; type: "select_answer" }
                  | { type: "return_to"; where: "lobby" | "results" }
                  | { playerName: string; type: "transfer_host" }
                  | {
                      song: {
                          artist: string;
                          audioURL: string;
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                      };
                      startPos: number;
                      type: "player_pick_song";
                  }
                  | {
                      players: Record<
                          string,
                          {
                              answerData?: {
                                  answer?: (...)
                                  | (...);
                                  answerIndex?: (...) | (...);
                                  answerSpeed: number;
                                  answerTimestamp: number;
                                  questionPoints: number;
                              };
                              color: string;
                              isHost: boolean;
                              isSpectator: boolean;
                              points: number;
                              username: string;
                          },
                      >;
                      state: "lobby"
                      | "results"
                      | "ingame";
                      type: "room_state";
                      uuid: string;
                      version: string;
                  }
                  | {
                      filteredSongsCount: number;
                      playlists?: {
                          cover: string
                          | null;
                          hrefURL: string;
                          name: string;
                          songs: {
                              artist: ...;
                              audioURL: ...;
                              cover: ...;
                              hrefURL: ...;
                              name: ...;
                          }[];
                          subtitle?: string;
                      }[];
                      type: "update_playlists";
                  }
                  | { countdown: number; type: "countdown" }
                  | {
                      gamePhase: GamePhase;
                      question?:
                          | {
                              answerOptions: string[];
                              correctAnswerIndex?: number;
                              questionType: "multiple_choice";
                              startPos: number;
                          }
                          | {
                              correctAnswer?: {
                                  artist: string;
                                  audioURL: string;
                                  cover: (...)
                                  | (...);
                                  hrefURL: string;
                                  name: string;
                              };
                              pickerId: string;
                              questionCount: number;
                              questionCurrent: number;
                              questionType: "player_picks";
                              startPos: number;
                          };
                      roundCurrent: number;
                      type: "round_state";
                  }
                  | {
                      songs: {
                          artist: string;
                          audioURL: string;
                          cover: string
                          | null;
                          hrefURL: string;
                          name: string;
                      }[];
                      type: "update_played_songs";
                  }
                  | {
                      entry: LogEntry;
                      level: "error"
                      | "info"
                      | "warn"
                      | "debug";
                      type: "add_log_message";
                  }
                  | { messages: LoggerStorage; type: "update_log_messages" }
                  | { duration: number; offset: number; type: "progressbar_update" }
                  | { type: "other" }

              The message that is being confirmed.

            • type: "confirmation"
          • { seq: number; type: "ping" }
            • seq: number

              The sequence number the pong should respond with

            • type: "ping"
          • { seq: number; type: "pong" }
            • seq: number

              The sequence number asked for in the ping packet.

            • type: "pong"

        Returns boolean

        whether the message was handled by this listener.

    onTick?: () => void

    Called every time the tick loop of ValidRoom is run.