From 6d15de707a756a246caf3dbd018a05afdd6fb178 Mon Sep 17 00:00:00 2001 From: Tommy Chow Date: Sun, 25 May 2025 19:07:57 -0700 Subject: [PATCH] fix some channels missing 7tv emotes (#444) * remove bang operator * handle 7tv emotes that are being processed --- lib/apis/seventv_api.dart | 1 + lib/models/emotes.dart | 15 ++++++++------- lib/models/emotes.g.dart | 4 +--- lib/models/events.g.dart | 21 ++++++--------------- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/lib/apis/seventv_api.dart b/lib/apis/seventv_api.dart index 68e85846..1b93df5f 100644 --- a/lib/apis/seventv_api.dart +++ b/lib/apis/seventv_api.dart @@ -42,6 +42,7 @@ class SevenTVApi { emoteSetId, emotes .map((emote) => Emote.from7TV(emote, EmoteType.sevenTVChannel)) + .where((emote) => emote.url.isNotEmpty) .toList() ); } else { diff --git a/lib/models/emotes.dart b/lib/models/emotes.dart index 0024d07f..47954092 100644 --- a/lib/models/emotes.dart +++ b/lib/models/emotes.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:frosty/constants.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -127,7 +128,7 @@ class EmoteFFZ { class Emote7TV { final String id; final String name; - final Emote7TVData? data; + final Emote7TVData data; const Emote7TV( this.id, @@ -267,10 +268,10 @@ class Emote { factory Emote.from7TV(Emote7TV emote, EmoteType type) { final emoteData = emote.data; - final url = emoteData!.host.url; + final url = emoteData.host.url; - // Flutter doesn't support AVIF yet. - final file = emoteData.host.files.lastWhere( + // TODO: Remove if/when Flutter natively supports AVIF. + final file = emoteData.host.files.lastWhereOrNull( (file) => file.format != 'AVIF', ); @@ -280,10 +281,10 @@ class Emote { return Emote( name: emote.name, realName: emote.name != emoteData.name ? emoteData.name : null, - width: emoteData.host.files.first.width, - height: emoteData.host.files.first.height, + width: emoteData.host.files.firstOrNull?.width, + height: emoteData.host.files.firstOrNull?.height, zeroWidth: isZeroWidth, - url: 'https:$url/${file.name}', + url: file != null ? 'https:$url/${file.name}' : '', type: type, ownerDisplayName: emoteData.owner?.displayName, ownerUsername: emoteData.owner?.username, diff --git a/lib/models/emotes.g.dart b/lib/models/emotes.g.dart index f23b87ce..15d2cb72 100644 --- a/lib/models/emotes.g.dart +++ b/lib/models/emotes.g.dart @@ -63,9 +63,7 @@ EmoteFFZ _$EmoteFFZFromJson(Map json) => EmoteFFZ( Emote7TV _$Emote7TVFromJson(Map json) => Emote7TV( json['id'] as String, json['name'] as String, - json['data'] == null - ? null - : Emote7TVData.fromJson(json['data'] as Map), + Emote7TVData.fromJson(json['data'] as Map), ); Owner7TV _$Owner7TVFromJson(Map json) => Owner7TV( diff --git a/lib/models/events.g.dart b/lib/models/events.g.dart index 02ea3d4a..229ca03e 100644 --- a/lib/models/events.g.dart +++ b/lib/models/events.g.dart @@ -12,21 +12,12 @@ SevenTVEvent _$SevenTVEventFromJson(Map json) => SevenTVEvent( d: SevenTVEventData.fromJson(json['d'] as Map), ); -Map _$SevenTVEventToJson(SevenTVEvent instance) { - final val = { - 'op': instance.op, - }; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('t', instance.t); - val['d'] = instance.d; - return val; -} +Map _$SevenTVEventToJson(SevenTVEvent instance) => + { + 'op': instance.op, + if (instance.t case final value?) 't': value, + 'd': instance.d, + }; SevenTVEventData _$SevenTVEventDataFromJson(Map json) => SevenTVEventData(