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

    Implemented by

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

    Handles incoming client messages

    Type Declaration

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

        • player: Player

          the player that sent the message

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

          the sent message

          • {
                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, SoundCloud and YT 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"
          • { 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: "start_game" }
          • {
                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"
          • { type: "change_username"; username: string }
            • type: "change_username"
            • username: string

              The new username.

          • {
                advancedSongFiltering: boolean;
                allowChangingAnswer: boolean;
                audioStartPosition: number | null;
                distractionsPreferSameArtist: boolean;
                endWhenAnswered: boolean;
                gameMode: "multiple_choice" | "player_picks";
                multipleChoiceAnswersCount: number;
                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.

            • allowChangingAnswer: boolean

              Whether to allow changing answer in multiple choice.

            • audioStartPosition: number | null

              The music start position for a game.

              Must be a float between

              • 0.0: start of audio

              and

              • 1.0: close to end of audio (audio duration minus max play time determined by config + round padding)

              Can be null to use random position (multiple choice) / let picker decide (player picks)

            • 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.
            • multipleChoiceAnswersCount: number

              The amount of multiple choice answers to add.

            • 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"
          • { playerName: string; type: "transfer_host" }
            • playerName: string

              The name of the player that should get host.

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

              Where to send the player to.

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

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

            • sourceMessage:
                  | { duration: number; offset: number; type: "progressbar_update" }
                  | {
                      song: {
                          artist: string;
                          audioURL: string;
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                      };
                      startPos: number;
                      type: "player_pick_song";
                  }
                  | { answer?: string; answerIndex?: number; type: "select_answer" }
                  | { type: "start_game" }
                  | {
                      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" }
                  | { type: "change_username"; username: string }
                  | {
                      advancedSongFiltering: boolean;
                      allowChangingAnswer: boolean;
                      audioStartPosition: number | null;
                      distractionsPreferSameArtist: boolean;
                      endWhenAnswered: boolean;
                      gameMode: "multiple_choice" | "player_picks";
                      multipleChoiceAnswersCount: number;
                      playerPickTimeout: number;
                      roundsCount: number;
                      timePerQuestion: number;
                      type: "room_config";
                  }
                  | { playerName: string; type: "transfer_host" }
                  | { type: "return_to"; where: "lobby" | "results" }
                  | {
                      entry: LogEntry;
                      level: "error" | "info" | "warn" | "debug";
                      type: "add_log_message";
                  }
                  | { messages: LoggerStorage; type: "update_log_messages" }
                  | {
                      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";
                  }
                  | { action: "load"; audioURL: string; type: "audio_control" }
                  | {
                      action:
                          | "play"
                          | "pause"
                          | "play_countdown_running"
                          | "play_countdown_end";
                      type: "audio_control";
                  }
                  | { countdown: number; type: "countdown" }
                  | {
                      songs: {
                          artist: string;
                          audioURL: string;
                          cover: string | null;
                          hrefURL: string;
                          name: string;
                      }[];
                      type: "update_played_songs";
                  }
                  | {
                      filteredSongsCount: number;
                      playlists?: {
                          cover: string
                          | null;
                          hrefURL: string;
                          name: string;
                          songs: {
                              artist: ...;
                              audioURL: ...;
                              cover: ...;
                              hrefURL: ...;
                              name: ...;
                          }[];
                          subtitle?: string;
                      }[];
                      type: "update_playlists";
                  }
                  | {
                      players: Record<
                          string,
                          {
                              answerData?: {
                                  answer?: (...)
                                  | (...);
                                  answerIndex?: (...) | (...);
                                  answerSpeed?: (...) | (...);
                                  answerTimestamp?: (...) | (...);
                                  questionPoints: number;
                              };
                              color: string;
                              hasPicked?: boolean;
                              isHost: boolean;
                              isSpectator: boolean;
                              points: number;
                              username: string;
                              uuid: string;
                          },
                      >;
                      state: "lobby"
                      | "results"
                      | "ingame";
                      type: "room_state";
                      uuid: string;
                  }
                  | { 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.