diff --git a/CHANGELOG.md b/CHANGELOG.md index d6eb7bfea..9cc1ec9e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unversioned +- Minor: Added support for the `submysterygift` message type ID in `UserNoticeMessage`. - Bugfix: `ChatClient#connect()` method now properly resolves if `connect()` is called on a client that is already `ready`. (#218) ## v4.3.0 diff --git a/lib/message/parser/twitch-message.spec.ts b/lib/message/parser/twitch-message.spec.ts index 56d132f61..e11fb1a6f 100644 --- a/lib/message/parser/twitch-message.spec.ts +++ b/lib/message/parser/twitch-message.spec.ts @@ -72,6 +72,18 @@ describe("./message/parser/twitch-message", function () { "turbo=0;user-id=269899575;user-type= :tmi.twitch.tv USERNOTICE #clippyassistant", instanceOf: UsernoticeMessage, }, + { + irc: + "@badge-info=subscriber/12;badges=subscriber/12,premium/1;color=;display-name=yurixxxxx14;" + + "emotes=;flags=;id=99b77ba7-c77f-4d92-ac3a-ad556e921672;login=yurixxxxx14;mod=0;msg-id=submysterygift;" + + "msg-param-mass-gift-count=1;msg-param-origin-id=4e\\sd1\\s19\\sc5\\s33\\s80\\s68\\" + + "s8c\\sdc\\sc9\\s4d\\s96\\s73\\sd0\\sad\\s40\\s52\\sf3\\s19\\s02;" + + "msg-param-sender-count=1;msg-param-sub-plan=1000;room-id=38884180;subscriber=1;" + + "system-msg=yurixxxxx14\\sis\\sgifting\\s1\\sTier\\s1\\sSubs\\sto\\susertag's\\scommunity!" + + "\\sThey've\\sgifted\\sa\\stotal\\sof\\s1\\sin\\sthe\\schannel!;tmi-sent-ts=1633549401426;" + + "user-id=238886165;user-type= :tmi.twitch.tv USERNOTICE #usertag", + instanceOf: UsernoticeMessage, + }, { irc: "@badge-info=;badges=;color=;display-name=receivertest3;emote-sets=0;mod=0;" + diff --git a/lib/message/twitch-types/usernotice.spec.ts b/lib/message/twitch-types/usernotice.spec.ts index 997ba0ef7..d294230bc 100644 --- a/lib/message/twitch-types/usernotice.spec.ts +++ b/lib/message/twitch-types/usernotice.spec.ts @@ -131,6 +131,7 @@ describe("./message/twitch-types/usernotice", function () { shouldShareStreakRaw: "0", subPlanName: "Channel Subscription (faker)", subPlan: "1000", + subPlanRaw: "1000", }); assert.isTrue(msg.isResub()); @@ -196,6 +197,8 @@ describe("./message/twitch-types/usernotice", function () { months: 2, monthsRaw: "2", originID: "da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 af d8 07 09", + originIDRaw: + "da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 af d8 07 09", recipientDisplayName: "qatarking24xd", recipientID: "236653628", recipientUsername: "qatarking24xd", @@ -203,6 +206,36 @@ describe("./message/twitch-types/usernotice", function () { senderCountRaw: "0", subPlanName: "Channel Subscription (xqcow)", subPlan: "1000", + subPlanRaw: "1000", + }); + }); + + it("should be able to parse a masssubgift with message", function () { + const msg = parseTwitchMessage( + "@badge-info=subscriber/12;badges=subscriber/12,premium/1;color=;display-name=realuser;emotes=;flags=;id=99b77ba7-c77f-4d92-ac3a-ad556e921672;login=realuser;mod=0;msg-id=submysterygift;msg-param-mass-gift-count=1;msg-param-origin-id=4e\\sd1\\s19\\sc5\\s33\\s80\\s68\\s8c\\sdc\\sc9\\s4d\\s96\\s73\\sd0\\sad\\s40\\s52\\sf3\\s19\\s02;msg-param-sender-count=1;msg-param-sub-plan=1000;room-id=38244999;subscriber=1;system-msg=realuser\\sis\\sgifting\\s1\\sTier\\s1\\sSubs\\sto\\sbroadcaster's\\scommunity!\\sThey've\\sgifted\\sa\\stotal\\sof\\s1\\sin\\sthe\\schannel!;tmi-sent-ts=1633549401426;user-id=239909999;user-type= :tmi.twitch.tv USERNOTICE #broadcaster" + ) as UsernoticeMessage; + + assert.strictEqual(msg.ircCommand, "USERNOTICE"); + assert.strictEqual(msg.ircParameters[0], "#broadcaster"); + assert.strictEqual(msg.ircTags["msg-param-mass-gift-count"], "1"); + assert.strictEqual( + msg.systemMessage, + "realuser is gifting 1 Tier 1 Subs to broadcaster's community! They've gifted a total of 1 in the channel!" + ); + assert.strictEqual(msg.messageTypeID, "submysterygift"); + + assert.isTrue(msg.isMassSubgift()); + + assert.deepStrictEqual(msg.eventParams, { + massGiftCount: 1, + massGiftCountRaw: "1", + originID: "4e d1 19 c5 33 80 68 8c dc c9 4d 96 73 d0 ad 40 52 f3 19 02", + originIDRaw: + "4e d1 19 c5 33 80 68 8c dc c9 4d 96 73 d0 ad 40 52 f3 19 02", + senderCount: 1, + senderCountRaw: "1", + subPlan: "1000", + subPlanRaw: "1000", }); }); }); diff --git a/lib/message/twitch-types/usernotice.ts b/lib/message/twitch-types/usernotice.ts index cc820eb1c..8f6c3f1d4 100644 --- a/lib/message/twitch-types/usernotice.ts +++ b/lib/message/twitch-types/usernotice.ts @@ -24,6 +24,9 @@ const convertersMap: Record any> = { "msg-param-streak-months": convertToInt, "msg-param-viewerCount": convertToInt, "msg-param-threshold": convertToInt, + "msg-param-mass-gift-count": convertToInt, + "msg-param-origin-id": convertToString, + "msg-param-sub-plan": convertToString, }; export function getCamelCasedName(tagKey: string): string { @@ -123,6 +126,12 @@ export interface SubgiftParameters extends EventParams { } export type AnonSubgiftParameters = SubgiftParameters; +// massgift +export interface MassSubgiftParameters extends EventParams { + massGiftCount: number; + subPlan: string; +} + // anongiftpaidupgrade export type AnonGiftPaidUpgradeParameters = EventParams & { promoGiftTotal?: number; @@ -171,6 +180,10 @@ export type SubgiftUsernoticeMessage = SpecificUsernoticeMessage< "subgift", SubgiftParameters >; +export type MassSubgiftUsernoticeMessage = SpecificUsernoticeMessage< + "submysterygift", + MassSubgiftParameters +>; export type AnonSubgiftUsernoticeMessage = SpecificUsernoticeMessage< "anonsubgift", AnonSubgiftParameters @@ -332,6 +345,10 @@ export class UsernoticeMessage extends ChannelIRCMessage { return this.messageTypeID === "subgift"; } + public isMassSubgift(): this is MassSubgiftParameters { + return this.messageTypeID === "submysterygift"; + } + public isAnonSubgift(): this is AnonSubgiftUsernoticeMessage { return this.messageTypeID === "anonsubgift"; }