import pickBy = require ( "lodash.pickby" ) ; import { ChannelIRCMessage } from "../irc/channel-irc-message" ; import { IRCMessageData } from "../irc/irc-message" ; import { tagParserFor } from "../parser/tag-values" ; export interface RoomState { emoteOnly : boolean ; emoteOnlyRaw : string ; /**
     * followers-only duration in minutes
     */ followersOnlyDuration : number ; followersOnlyDurationRaw : string ; r9k : boolean ; r9kRaw : string ; slowModeDuration : number ; slowModeDurationRaw : string ; subscribersOnly : boolean ; subscribersOnlyRaw : string ; } export function hasAllStateTags ( partialRoomState ) { return ( partialRoomState . emoteOnly != null && partialRoomState . followersOnlyDuration != null && partialRoomState . r9k != null && partialRoomState . slowModeDuration != null && partialRoomState . subscribersOnly != null ) ; } export class RoomstateMessage extends ChannelIRCMessage { public readonly channelID : string ; public readonly emoteOnly : boolean | undefined ; public readonly emoteOnlyRaw : string | undefined ; public readonly followersOnlyDuration : number | undefined ; public readonly followersOnlyDurationRaw : string | undefined ; public readonly r9k : boolean | undefined ; public readonly r9kRaw : string | undefined ; public readonly slowModeDuration : number | undefined ; public readonly slowModeDurationRaw : string | undefined ; public readonly subscribersOnly : boolean | undefined ; public readonly subscribersOnlyRaw : string | undefined ; public constructor ( message ) { super ( message ) ; const tagParser = tagParserFor ( this . ircTags ) ; this . channelID = tagParser . requireString ( "room-id" ) ; this . emoteOnly = tagParser . getBoolean ( "emote-only" ) ; this . emoteOnlyRaw = tagParser . getString ( "emote-only" ) ; this . followersOnlyDuration = tagParser . getInt ( "followers-only" ) ; this . followersOnlyDurationRaw = tagParser . getString ( "followers-only" ) ; this . r9k = tagParser . getBoolean ( "r9k" ) ; this . r9kRaw = tagParser . getString ( "r9k" ) ; this . slowModeDuration = tagParser . getInt ( "slow" ) ; this . slowModeDurationRaw = tagParser . getString ( "slow" ) ; this . subscribersOnly = tagParser . getBoolean ( "subs-only" ) ; this . subscribersOnlyRaw = tagParser . getString ( "subs-only" ) ; } public extractRoomState ( ) { const fullObj = { emoteOnly : this . emoteOnly , emoteOnlyRaw : this . emoteOnlyRaw , followersOnlyDuration : this . followersOnlyDuration , followersOnlyDurationRaw : this . followersOnlyDurationRaw , r9k : this . r9k , r9kRaw : this . r9kRaw , slowModeDuration : this . slowModeDuration , slowModeDurationRaw : this . slowModeDurationRaw , subscribersOnly : this . subscribersOnly , subscribersOnlyRaw : this . subscribersOnlyRaw , } ; return pickBy ( fullObj , ( v ) => v != null ) ; } }