From fcf0a0df19d65877adb1add320bd1e6db2575cc3 Mon Sep 17 00:00:00 2001 From: iChrisIRL <133179360+id3adeye@users.noreply.github.com> Date: Tue, 2 Jun 2026 14:12:41 +1000 Subject: [PATCH 1/2] Support Kick badges_v2 (level badge) --- Moblin/StreamingPlatforms/Kick/KickPusher.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Moblin/StreamingPlatforms/Kick/KickPusher.swift b/Moblin/StreamingPlatforms/Kick/KickPusher.swift index 92cf57d8b..105bc6027 100644 --- a/Moblin/StreamingPlatforms/Kick/KickPusher.swift +++ b/Moblin/StreamingPlatforms/Kick/KickPusher.swift @@ -59,9 +59,15 @@ private class KickBadges { } } +private struct BadgeV2: Decodable { + var image_url: String? + var selected: Bool? +} + private struct Identity: Decodable { var color: String var badges: [Badge] + var badges_v2: [BadgeV2]? } private struct Sender: Decodable { @@ -371,6 +377,11 @@ final class KickPusher: NSObject, @unchecked Sendable { private func handleChatMessageEvent(data: String) throws { let event = try decodeChatMessageEvent(data: data) var badgeUrls: [URL] = [] + for badge in event.sender.identity.badges_v2 ?? [] where badge.selected == true { + if let src = badge.image_url, let badgeUrl = URL(string: src) { + badgeUrls.append(badgeUrl) + } + } for badge in event.sender.identity.badges { if badge.type == BadgeType.subscriber, let months = badge.count { if let badgeUrl = badges.getSubscriberBadgeUrl(months: months) { From c06da84d3f43dccde1c0eff3e9a5cf4f0a3c8921 Mon Sep 17 00:00:00 2001 From: iChrisIRL <133179360+id3adeye@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:15:52 +1000 Subject: [PATCH 2/2] Make Kick badges_v2 fields non-optional --- Moblin/StreamingPlatforms/Kick/KickPusher.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Moblin/StreamingPlatforms/Kick/KickPusher.swift b/Moblin/StreamingPlatforms/Kick/KickPusher.swift index 105bc6027..4de057efc 100644 --- a/Moblin/StreamingPlatforms/Kick/KickPusher.swift +++ b/Moblin/StreamingPlatforms/Kick/KickPusher.swift @@ -60,8 +60,8 @@ private class KickBadges { } private struct BadgeV2: Decodable { - var image_url: String? - var selected: Bool? + var image_url: String + var selected: Bool } private struct Identity: Decodable { @@ -377,8 +377,8 @@ final class KickPusher: NSObject, @unchecked Sendable { private func handleChatMessageEvent(data: String) throws { let event = try decodeChatMessageEvent(data: data) var badgeUrls: [URL] = [] - for badge in event.sender.identity.badges_v2 ?? [] where badge.selected == true { - if let src = badge.image_url, let badgeUrl = URL(string: src) { + for badge in event.sender.identity.badges_v2 ?? [] where badge.selected { + if let badgeUrl = URL(string: badge.image_url) { badgeUrls.append(badgeUrl) } }