From df6a1569badad62c1aef5acd05a24c256635eff6 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 13:51:12 -0500 Subject: [PATCH 01/13] fix: improve chat regex matching --- .../twitch4j/chat/events/channel/IRCMessageEvent.java | 4 ++-- .../java/com/github/twitch4j/common/util/TwitchUtils.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java b/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java index 7d255a77e..41d96c6b7 100644 --- a/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java +++ b/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java @@ -25,8 +25,8 @@ @EqualsAndHashCode(callSuper = false) public class IRCMessageEvent extends TwitchEvent { - private static final Pattern MESSAGE_PATTERN = Pattern.compile("^(?:@(?.+?)\\s)?(?.+?)\\s(?[A-Z0-9]+)\\s?(?:#(?.*?)\\s?)?(?[:\\-+](?.+))?$"); - private static final Pattern WHISPER_PATTERN = Pattern.compile("^(?:@(?.+?)\\s)?:(?.+?)!.+?\\s(?[A-Z0-9]+)\\s(?:(?.*?)\\s?)??(?[:\\-+](?.+))$"); + private static final Pattern MESSAGE_PATTERN = Pattern.compile("^(?:@(?\\S+?)\\s)?(?\\S+?)\\s(?[A-Z0-9]+)\\s?(?:#(?\\S*?)\\s?)?(?[:\\-+](?.+))?$"); + private static final Pattern WHISPER_PATTERN = Pattern.compile("^(?:@(?\\S+?)\\s)?:(?\\S+?)!.+?\\s(?[A-Z0-9]+)\\s(?:(?\\S*?)\\s?)??(?[:\\-+](?.+))$"); private static final Pattern CLIENT_PATTERN = Pattern.compile("^:(.*?)!(.*?)@(.*?).tmi.twitch.tv$"); @Unofficial diff --git a/common/src/main/java/com/github/twitch4j/common/util/TwitchUtils.java b/common/src/main/java/com/github/twitch4j/common/util/TwitchUtils.java index b4de11403..f004bc891 100644 --- a/common/src/main/java/com/github/twitch4j/common/util/TwitchUtils.java +++ b/common/src/main/java/com/github/twitch4j/common/util/TwitchUtils.java @@ -152,10 +152,10 @@ public static Map parseBadges(String raw) { if (StringUtils.isBlank(raw)) return map; // Fix Whitespaces - raw = raw.replace("\\s", " "); + raw = EscapeUtils.unescapeTagValue(raw); - for (String tag : raw.split(",")) { - String[] val = tag.split("/"); + for (String tag : StringUtils.split(raw, ',')) { + String[] val = StringUtils.split(tag, "/", 2); final String key = val[0]; String value = (val.length > 1) ? val[1] : null; map.put(key, value); From 9ff23dcf911383ce1e0b22a7d20b2855c74a76b5 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 14:20:29 -0500 Subject: [PATCH 02/13] chore: add unit tests for parseBadges --- .../twitch4j/common/util/TwitchUtilsTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 common/src/test/java/com/github/twitch4j/common/util/TwitchUtilsTest.java diff --git a/common/src/test/java/com/github/twitch4j/common/util/TwitchUtilsTest.java b/common/src/test/java/com/github/twitch4j/common/util/TwitchUtilsTest.java new file mode 100644 index 000000000..daec34173 --- /dev/null +++ b/common/src/test/java/com/github/twitch4j/common/util/TwitchUtilsTest.java @@ -0,0 +1,41 @@ +package com.github.twitch4j.common.util; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static com.github.twitch4j.common.util.TwitchUtils.parseBadges; +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonMap; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Tag("unittest") +class TwitchUtilsTest { + + @Test + @DisplayName("Tests TwitchUtils.parseBadges") + void badgesParseTest() { + assertEquals(emptyMap(), parseBadges(null)); + assertEquals(emptyMap(), parseBadges("")); + assertEquals(emptyMap(), parseBadges(" ")); + + assertEquals(singletonMap("subscriber", "15"), parseBadges("subscriber/15")); + assertEquals(singletonMap("subscriber", "15/3"), parseBadges("subscriber/15/3")); + assertEquals(singletonMap("a b", "c d"), parseBadges("a\\sb/c\\sd")); + + assertEquals(mapOf("subscriber", "18", "no_audio", "1"), parseBadges("subscriber/18,no_audio/1")); + assertEquals(mapOf("subscriber", "19", "no_audio", null), parseBadges("subscriber/19,no_audio/")); + assertEquals(mapOf("follower", "20", "no_video", null), parseBadges("follower/20,no_video")); + } + + private static Map mapOf(K key1, V value1, K key2, V value2) { + Map map = new HashMap<>(); + map.put(key1, value1); + map.put(key2, value2); + return map; + } + +} From ebe237c6cc1bb9ec8caa72bf6d4efa3de1f456ad Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 14:41:43 -0500 Subject: [PATCH 03/13] chore: add unit test for whisper parsing --- .../events/channel/IRCMessageEventTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java new file mode 100644 index 000000000..4483902ba --- /dev/null +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -0,0 +1,35 @@ +package com.github.twitch4j.chat.events.channel; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@Tag("unittest") +public class IRCMessageEventTest { + + @Test + @DisplayName("Test that whispers are parsed by IRCMessageEvent") + void parseWhisper() { + IRCMessageEvent e = build("@badges=;color=;display-name=HexaFice;emotes=;message-id=103;thread-id=142621956_149223493;turbo=0;user-id=142621956;user-type= " + + ":hexafice!hexafice@hexafice.tmi.twitch.tv WHISPER twitch4j :test 123"); + + assertEquals("test 123", e.getMessage().orElse(null)); + assertEquals("WHISPER", e.getCommandType()); + assertEquals("142621956", e.getUserId()); + assertEquals("hexafice", e.getUserName()); + assertEquals("HexaFice", e.getTagValue("display-name").orElse(null)); + assertEquals("twitch4j", e.getChannelName().orElse(null)); + assertTrue(e.getBadges() == null || e.getBadges().isEmpty()); + assertTrue(e.getBadgeInfo() == null || e.getBadgeInfo().isEmpty()); + } + + private static IRCMessageEvent build(String raw) { + return new IRCMessageEvent(raw, Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet()); + } + +} From c5c158cb4d30f753a1d0686da73bbff7838e0092 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 14:52:10 -0500 Subject: [PATCH 04/13] chore: add unit test for privmsg parsing --- .../events/channel/IRCMessageEventTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 4483902ba..d0d1ef120 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -1,5 +1,6 @@ package com.github.twitch4j.chat.events.channel; +import com.github.twitch4j.common.enums.CommandPermission; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -12,6 +13,25 @@ @Tag("unittest") public class IRCMessageEventTest { + @Test + @DisplayName("Test that normal messages are parsed by IRCMessageEvent") + void parseMessage() { + IRCMessageEvent e = build("@badge-info=;badges=broadcaster/1;client-nonce=459e3142897c7a22b7d275178f2259e0;color=#0000FF;display-name=lovingt3s;emote-only=1;emotes=62835:0-10;first-msg=0;flags=;" + + "id=885196de-cb67-427a-baa8-82f9b0fcd05f;mod=0;room-id=713936733;subscriber=0;tmi-sent-ts=1643904084794;turbo=0;user-id=713936733;user-type= " + + ":lovingt3s!lovingt3s@lovingt3s.tmi.twitch.tv PRIVMSG #lovingt3s :bleedPurple"); + + assertEquals("bleedPurple", e.getMessage().orElse(null)); + assertEquals("lovingt3s", e.getChannelName().orElse(null)); + assertEquals("713936733", e.getChannelId()); + assertEquals("713936733", e.getUserId()); + assertEquals("lovingt3s", e.getUserName()); + assertEquals("PRIVMSG", e.getCommandType()); + assertTrue(e.getClientPermissions().contains(CommandPermission.BROADCASTER)); + assertEquals("885196de-cb67-427a-baa8-82f9b0fcd05f", e.getMessageId().orElse(null)); + assertEquals("459e3142897c7a22b7d275178f2259e0", e.getNonce().orElse(null)); + assertEquals("62835:0-10", e.getTagValue("emotes").orElse(null)); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() { From eba647d41d69606999eb6197c58ed838b57dadbd Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:00:55 -0500 Subject: [PATCH 05/13] chore: add unit test for clearmsg parsing --- .../chat/events/channel/IRCMessageEventTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index d0d1ef120..c18ef7e41 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -13,6 +13,18 @@ @Tag("unittest") public class IRCMessageEventTest { + @Test + @DisplayName("Tests that CLEARMSG is parsed by IRCMessageEvent") + void parseMessageDeletion() { + IRCMessageEvent e = build("@login=foo;room-id=;target-msg-id=94e6c7ff-bf98-4faa-af5d-7ad633a158a9;tmi-sent-ts=1642720582342 :tmi.twitch.tv CLEARMSG #bar :what a great day"); + + assertEquals("foo", e.getUserName()); + assertEquals("bar", e.getChannelName().orElse(null)); + assertEquals("CLEARMSG", e.getCommandType()); + assertEquals("what a great day", e.getMessage().orElse(null)); + assertEquals("94e6c7ff-bf98-4faa-af5d-7ad633a158a9", e.getTagValue("target-msg-id").orElse(null)); + } + @Test @DisplayName("Test that normal messages are parsed by IRCMessageEvent") void parseMessage() { From 5375f6e53d4aa5a0059e4c70546c20df338e159d Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:05:59 -0500 Subject: [PATCH 06/13] chore: add unit test for clearchat parsing --- .../chat/events/channel/IRCMessageEventTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index c18ef7e41..6eb041c80 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -13,6 +13,16 @@ @Tag("unittest") public class IRCMessageEventTest { + @Test + @DisplayName("Tests that CLEARCHAT is parsed by IRCMessageEvent") + void parseChatClear() { + IRCMessageEvent e = build("@room-id=12345678;tmi-sent-ts=1642715756806 :tmi.twitch.tv CLEARCHAT #dallas"); + + assertEquals("CLEARCHAT", e.getCommandType()); + assertEquals("dallas", e.getChannelName().orElse(null)); + assertEquals("12345678", e.getChannelId()); + } + @Test @DisplayName("Tests that CLEARMSG is parsed by IRCMessageEvent") void parseMessageDeletion() { From 494af671685d2cc32f707f518631e7c0bda6b21b Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:12:34 -0500 Subject: [PATCH 07/13] chore: add unit test for globaluserstate parsing --- .../chat/events/channel/IRCMessageEventTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 6eb041c80..35d05390c 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -35,6 +35,18 @@ void parseMessageDeletion() { assertEquals("94e6c7ff-bf98-4faa-af5d-7ad633a158a9", e.getTagValue("target-msg-id").orElse(null)); } + @Test + @DisplayName("Tests that GLOBALUSERSTATE is parsed by IRCMessageEvent") + void parseGlobalUserState() { + IRCMessageEvent e = build("@badge-info=subscriber/8;badges=subscriber/6;color=#0D4200;display-name=dallas;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;turbo=0;user-id=12345678;user-type=admin " + + ":tmi.twitch.tv GLOBALUSERSTATE"); + + assertEquals("GLOBALUSERSTATE", e.getCommandType()); + assertEquals("12345678", e.getUserId()); + assertEquals("dallas", e.getTagValue("display-name").orElse(null)); + assertEquals("0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239", e.getTagValue("emote-sets").orElse(null)); + } + @Test @DisplayName("Test that normal messages are parsed by IRCMessageEvent") void parseMessage() { From a0a259a0e8d2d52a1548985c8724187d44183a19 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:15:50 -0500 Subject: [PATCH 08/13] fix: use display name when login and client are missing --- .../github/twitch4j/chat/events/channel/IRCMessageEvent.java | 4 +++- .../twitch4j/chat/events/channel/IRCMessageEventTest.java | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java b/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java index 41d96c6b7..455fd4d77 100644 --- a/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java +++ b/chat/src/main/java/com/github/twitch4j/chat/events/channel/IRCMessageEvent.java @@ -232,7 +232,9 @@ public String getUserName() { return tags.get("login"); } - return getClientName().orElse(null); + return getClientName() + .filter(StringUtils::isNotBlank) + .orElseGet(() -> getTagValue("display-name").orElse(null)); } /** diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 35d05390c..a25417051 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -44,6 +44,7 @@ void parseGlobalUserState() { assertEquals("GLOBALUSERSTATE", e.getCommandType()); assertEquals("12345678", e.getUserId()); assertEquals("dallas", e.getTagValue("display-name").orElse(null)); + assertEquals("dallas", e.getUserName()); assertEquals("0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239", e.getTagValue("emote-sets").orElse(null)); } From 1aeb6f9b3bdb65e69c5574925bdad709c98529a9 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:21:04 -0500 Subject: [PATCH 09/13] chore: add unit test for notice parsing --- .../chat/events/channel/IRCMessageEventTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index a25417051..fb13d8a99 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -67,6 +67,17 @@ void parseMessage() { assertEquals("62835:0-10", e.getTagValue("emotes").orElse(null)); } + @Test + @DisplayName("Tests that NOTICE is parsed by IRCMessageEvent") + void parseNotice() { + IRCMessageEvent e = build("@msg-id=delete_message_success :tmi.twitch.tv NOTICE #bar :The message from foo is now deleted."); + + assertEquals("NOTICE", e.getCommandType()); + assertEquals("bar", e.getChannelName().orElse(null)); + assertEquals("delete_message_success", e.getTags().get("msg-id")); + assertEquals("The message from foo is now deleted.", e.getMessage().orElse(null)); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() { From c3872439ba4c456cba7c7b053943e9c6e79e2472 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 15:25:47 -0500 Subject: [PATCH 10/13] chore: add unit test for reconnect parsing --- .../twitch4j/chat/events/channel/IRCMessageEventTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index fb13d8a99..825f102fb 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -78,6 +78,13 @@ void parseNotice() { assertEquals("The message from foo is now deleted.", e.getMessage().orElse(null)); } + @Test + @DisplayName("Tests that RECONNECT is parsed by IRCMessageEvent") + void parseReconnect() { + IRCMessageEvent e = build(":tmi.twitch.tv RECONNECT"); + assertEquals("RECONNECT", e.getCommandType()); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() { From df93636370f671e127e584ea93dbfe30b8ce5960 Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 16:41:01 -0500 Subject: [PATCH 11/13] chore: add unit test for roomstate parsing --- .../chat/events/channel/IRCMessageEventTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 825f102fb..75afc98fa 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -85,6 +85,17 @@ void parseReconnect() { assertEquals("RECONNECT", e.getCommandType()); } + @Test + @DisplayName("Tests that ROOMSTATE is parsed by IRCMessageEvent") + void parseRoomState() { + IRCMessageEvent e = build("@emote-only=0;followers-only=-1;r9k=0;rituals=0;room-id=12345678;slow=0;subs-only=0 :tmi.twitch.tv ROOMSTATE #bar"); + assertEquals("ROOMSTATE", e.getCommandType()); + assertEquals("bar", e.getChannelName().orElse(null)); + assertEquals("12345678", e.getChannelId()); + assertEquals("0", e.getTags().get("emote-only")); + assertEquals("-1", e.getTags().get("followers-only")); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() { From 4be9022f5d75e134210d4c97128e27683096bfca Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 17:35:55 -0500 Subject: [PATCH 12/13] chore: add unit test for usernotice parsing --- .../events/channel/IRCMessageEventTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 75afc98fa..4254f6dab 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -96,6 +96,23 @@ void parseRoomState() { assertEquals("-1", e.getTags().get("followers-only")); } + @Test + @DisplayName("Tests that USERNOTICE is parsed by IRCMessageEvent") + void parseUserNotice() { + IRCMessageEvent e = build("@badge-info=;badges=staff/1,premium/1;color=#0000FF;display-name=TWW2;emotes=;id=e9176cd8-5e22-4684-ad40-ce53c2561c5e;login=tww2;mod=0;msg-id=subgift;" + + "msg-param-months=1;msg-param-recipient-display-name=Mr_Woodchuck;msg-param-recipient-id=55554444;msg-param-recipient-name=mr_woodchuck;msg-param-sub-plan-name=House\\sof\\sNyoro~n;msg-param-sub-plan=1000;" + + "room-id=12345678;subscriber=0;system-msg=TWW2\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sMr_Woodchuck!;tmi-sent-ts=1521159445153;turbo=0;user-id=87654321;user-type=staff :tmi.twitch.tv USERNOTICE #forstycup"); + + assertEquals("USERNOTICE", e.getCommandType()); + assertEquals("12345678", e.getChannelId()); + assertEquals("forstycup", e.getChannelName().orElse(null)); + assertEquals("87654321", e.getUserId()); + assertEquals("TWW2 gifted a Tier 1 sub to Mr_Woodchuck!", e.getTagValue("system-msg").orElse(null)); + assertEquals("TWW2", e.getTagValue("display-name").orElse(null)); + assertEquals("tww2", e.getUserName()); + assertEquals("subgift", e.getTagValue("msg-id").orElse(null)); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() { From ac306fed8b9d4f295a765e0acdcdee3a1f9d574a Mon Sep 17 00:00:00 2001 From: Sidd Date: Sat, 30 Jul 2022 19:09:34 -0500 Subject: [PATCH 13/13] chore: add unit test for userstate parsing --- .../chat/events/channel/IRCMessageEventTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java index 4254f6dab..d0c651124 100644 --- a/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java +++ b/chat/src/test/java/com/github/twitch4j/chat/events/channel/IRCMessageEventTest.java @@ -113,6 +113,19 @@ void parseUserNotice() { assertEquals("subgift", e.getTagValue("msg-id").orElse(null)); } + @Test + @DisplayName("Tests that USERSTATE is parsed by IRCMessageEevent") + void parseUserState() { + IRCMessageEvent e = build("@badge-info=;badges=staff/1;color=#0D4200;display-name=ronni;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;mod=1;subscriber=1;turbo=1;user-type=staff " + + ":tmi.twitch.tv USERSTATE #dallas"); + + assertEquals("USERSTATE", e.getCommandType()); + assertEquals("dallas", e.getChannelName().orElse(null)); + assertEquals("ronni", e.getUserName()); + assertEquals("0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239", e.getTagValue("emote-sets").orElse(null)); + assertTrue(e.getClientPermissions().contains(CommandPermission.TWITCHSTAFF)); + } + @Test @DisplayName("Test that whispers are parsed by IRCMessageEvent") void parseWhisper() {