{"version":3,"file":"userstate-tracker.mjs","names":[],"sources":["../../src/mixins/userstate-tracker.ts"],"sourcesContent":["import EventEmitter from \"eventemitter3\";\n\nimport type { ClientMixin } from \"./base-mixin\";\nimport type { ChatClient } from \"~/client/client\";\nimport type {\n  GlobalUserState,\n  GlobaluserstateMessage,\n} from \"~/message/twitch-types/globaluserstate\";\nimport type { PrivmsgMessage } from \"~/message/twitch-types/privmsg\";\nimport type {\n  UserState,\n  UserstateMessage,\n} from \"~/message/twitch-types/userstate\";\n\nexport interface UserStateTrackerEvents {\n  newGlobalState: (newState: GlobalUserState) => void;\n  newChannelState: (channelLogin: string, newState: UserState) => void;\n}\n\n/**\n * Tracks the state of the logged in user (the bot) in all channels the bot operates in\n */\nexport class UserStateTracker\n  extends EventEmitter<UserStateTrackerEvents>\n  implements ClientMixin\n{\n  public globalState?: GlobalUserState;\n  public channelStates: Record<string, UserState> = {};\n  private readonly client: ChatClient;\n\n  public constructor(client: ChatClient) {\n    super();\n    this.client = client;\n  }\n\n  public getChannelState(channelName: string): UserState | undefined {\n    return this.channelStates[channelName];\n  }\n\n  public getGlobalState(): GlobalUserState | undefined {\n    return this.globalState;\n  }\n\n  public applyToClient(client: ChatClient): void {\n    client.on(\"USERSTATE\", this.onUserstateMessage.bind(this));\n    client.on(\"GLOBALUSERSTATE\", this.onGlobaluserstateMessage.bind(this));\n    client.on(\"PRIVMSG\", this.onPrivmsgMessage.bind(this));\n  }\n\n  private onUserstateMessage(message: UserstateMessage): void {\n    const newState = message.extractUserState();\n    this.channelStates[message.channel.login] = newState;\n    this.emit(\"newChannelState\", message.channel.login, newState);\n  }\n\n  private onGlobaluserstateMessage(message: GlobaluserstateMessage): void {\n    this.globalState = message.extractGlobalUserState();\n    this.emit(\"newGlobalState\", this.globalState);\n  }\n\n  private onPrivmsgMessage(message: PrivmsgMessage): void {\n    if (message.sender.login !== this.client.configuration.username) {\n      return;\n    }\n\n    const channelState = this.channelStates[message.channel.login];\n    if (channelState != null) {\n      const newState = Object.assign(\n        {},\n        channelState,\n        // eslint-disable-next-line ts/no-deprecated\n        message.extractUserState(),\n      );\n      this.channelStates[message.channel.login] = newState;\n      this.emit(\"newChannelState\", message.channel.login, newState);\n    }\n  }\n}\n"],"mappings":";;;;;AAsBA,IAAa,mBAAb,cACU,aAEV;CACE;CACA,gBAAkD,EAAE;CACpD;CAEA,YAAmB,QAAoB;AACrC,SAAO;AACP,OAAK,SAAS;;CAGhB,gBAAuB,aAA4C;AACjE,SAAO,KAAK,cAAc;;CAG5B,iBAAqD;AACnD,SAAO,KAAK;;CAGd,cAAqB,QAA0B;AAC7C,SAAO,GAAG,aAAa,KAAK,mBAAmB,KAAK,KAAK,CAAC;AAC1D,SAAO,GAAG,mBAAmB,KAAK,yBAAyB,KAAK,KAAK,CAAC;AACtE,SAAO,GAAG,WAAW,KAAK,iBAAiB,KAAK,KAAK,CAAC;;CAGxD,mBAA2B,SAAiC;EAC1D,MAAM,WAAW,QAAQ,kBAAkB;AAC3C,OAAK,cAAc,QAAQ,QAAQ,SAAS;AAC5C,OAAK,KAAK,mBAAmB,QAAQ,QAAQ,OAAO,SAAS;;CAG/D,yBAAiC,SAAuC;AACtE,OAAK,cAAc,QAAQ,wBAAwB;AACnD,OAAK,KAAK,kBAAkB,KAAK,YAAY;;CAG/C,iBAAyB,SAA+B;AACtD,MAAI,QAAQ,OAAO,UAAU,KAAK,OAAO,cAAc,SACrD;EAGF,MAAM,eAAe,KAAK,cAAc,QAAQ,QAAQ;AACxD,MAAI,gBAAgB,MAAM;GACxB,MAAM,WAAW,OAAO,OACtB,EAAE,EACF,cAEA,QAAQ,kBAAkB,CAC3B;AACD,QAAK,cAAc,QAAQ,QAAQ,SAAS;AAC5C,QAAK,KAAK,mBAAmB,QAAQ,QAAQ,OAAO,SAAS"}