Chat Bot

Documentation for chatbot scripts.

Types

// A list of arguments, so if someone runs "!example 123 abc" this will be ['123', 'abc']. Note that the args are only populated during a chat message, not during a Shout for Subscriptions, Follows, etc.
const args: string[];

// Exactly the same as above, but not as an pre-split array.
const rawArgs: string;
declare global {
  interface SoundApi {
    /* Plays the specified audio url using the provided volume (must be 0-1) */
    public playAudio(audioUrl: string, volume: number = 1): void;

    /* Plays the specified text as a TTS message using the provided volume (must be 0-1) */
    public playTTS(
      audioUrl: string,
      defaultVoice: string = "Brian",
      volume: number = 1
    ): void;
  }
}

const Sound: SoundApi;
declare global {
  // The K:V store, you can use this to store information like points or stats.
  interface ChatBotStore {
    /* Puts a value in the store. */
    public put(key: string, value: any): void;

    /* Returns a value */
    public get(key: string): any;

    /* Returns a value, using the default if it's not present */
    public getOrDefault(key: string, defaultValue: any): any;

    /* Returns whether or not the store contains a key */
    public containsKey(key: string): boolean;
  }
}

const store: ChatBotStore;
declare global {
  interface ChatBotMusic {
    // Null if there is no song playing.
    activePlayback?: ActivePlayback;

    // Not really useful, feel free to poke around though.
    providers: any[];
  }

  interface ActivePlayback {
    serviceId: string;
    serviceName: string;
    accountName?: string;
    accountLink?: string;
    playbackState: PlaybackState;
    currentTrack: MusicTrack;
  }

  enum PlaybackState {
    PLAYING,
    PAUSED,
    INACTIVE,
  }

  interface MusicTrack {
    title: string;
    album?: string;
    albumArtUrl: string; // Can also be base64 data. Be wary.
    link: string;
    artists: string[];
  }
}

const Music: ChatBotMusic;
declare global {
  interface ChatBotKoi {
    public sendChat(
      platform: KoiPlatform, // Must be a signed in platform for this to succeed.
      message: string,
      chatter: KoiChatter,
      replyTarget: string // The event ID, if you want to do a direct reply.
    ): void;

    public upvoteChat( // Not supported by all platforms.
      platform: KoiPlatform, // Must be a signed in platform for this to succeed.
      messageId: string // The event ID.
    ): void;

    public deleteChat( // Not supported by all platforms.
      platform: KoiPlatform, // Must be a signed in platform for this to succeed.
      messageId: string // The event ID.
    ): void;

    history: KoiEvent[];

    // This are for the currently signed in accounts.
    viewers: { [key: KoiPlatform]: KoiUser[] };
    userStates: { [key: KoiPlatform]: KoiUserUpdateEvent[] };
    streamStates: { [key: KoiPlatform]: KoiStreamUpdateEvent[] };
    roomStates: { [key: KoiPlatform]: KoiRoomstateEvent[] };
    features: { [key: KoiPlatform]: KoiIntegrationFeatures[] };
  }

  enum KoiChatter {
    CLIENT, // The streamer's account.
    PUPPET, // Unused, right now this redirects to CLIENT.
    SYSTEM, // The @Casterlabs account.
  }

  enum KoiPlatform {
    CAFFEINE,
    TWITCH,
    TROVO,
    YOUTUBE,
    DELIVE,
    THETA,
    KICK,
    TIKTOK,

    // Coming up.
    YOUNOW,

    // Dead D:
    GLIMESH,
    BRIME,

    // Other
    CASTERLABS_SYSTEM,
    CUSTOM_INTEGRATION,
  }
}

const Koi: ChatBotKoi;

const PLATFORMS: KoiPlatform[]; // All enums.

// The event that triggered this script. Usually a KoiRichMessageEvent, which you can inspect the Java definition here:
// https://github.com/Casterlabs/caffeinated/blob/dev/app/Koi/src/main/java/co/casterlabs/koi/api/types/events/RichMessageEvent.java
// Take note that during Shouts, this will be a SubscriptionEvent, FollowEvent, etc.
const event: KoiEvent;
declare global {
  interface ChatBotFetchAPI {
    public asText(url: string): string;

    public asJson(url: string): object;
  }
}

const fetch: ChatBotFetchAPI;
declare global {
  interface CaffeinatedPlugins {
    public callServiceMethod(
      pluginId: string,
      serviceId: string,
      methodName: string,
      args: any[]
    ): object;
  }
}

const Plugins: CaffeinatedPlugins;