mirror of
https://github.com/tommyxchow/frosty.git
synced 2025-08-06 17:48:14 +08:00

* Use adaptive refresh indicators * Add new message count indicator in chat * Sync pubspec.lock * Initial migration to material 3 * Restore default bottom sheet style * Remove FrostyListTile and reset styles * Use "Clear" button for all search history * Add `require_trailing_commas` lint rule * Exclude generated files from linter * Use ListView for safe area support in bottom sheet * Add initial dark theme * Make sizing and units consistent * Update onbaording spacings & copy * Migrate to default material 3 buttons * Add headers to chat details bottom sheet * Simplify token log in method * Use bottom sheet for account options * Remove `AnimateScale` widget * Tweak search paddings * Update message spacing divisions * Upgrade packages * Update message spacing divisions * Regenerate splash screens * Update Inter & add google fonts * Add initial material 3 themes * Use adaptive alert dialogs * Revert to oultined inputs * Fix tooltip message * Revert add google_fonts * Improve themes and various styling * Convert categories grid to list * Tweak stream card thumbnail radii * Tweak settings headers * Left align floating snackbars * Tweak search header padding * Fix profile pics occasionally not rounded * Use profile pic for settings button if logged in * Redesign sleep timer * Use divider theme and reduce thickness * Use 0 letter spacing for tab bar titles * Redesign category streams list * Add border to tooltips * Increase category card font weight * Use outlined icon btton for chat user modal * Reduce profile pic radius in search results * Fix scrolll to top button safe area * Add support for reply threads * Reduce tooltip and snackbar border thickness * Rebuild reply threads on new messages * Upgrade packages (iOS) * Reduce font weight for all chat alerts * Use tabbars for pageview * Add dividers everywhere * Revert "Add dividers everywhere" This reverts commit 5f0d349fdbb0afad313cfb88e8c359714b3ea87a. * Remove fill from inputs * Add dividers to settings * Use segmented button for settings list * Add scrollbar to lists with scrollcontroller * Redesign badge/emote tooltip * Remove outline from chat user modal buttons * Remove divider from reply thread * Use tap for chatters list and increase font weight * Constrain emote tooltip width
76 lines
2.3 KiB
Dart
76 lines
2.3 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:frosty/models/badges.dart';
|
|
import 'package:frosty/models/emotes.dart';
|
|
import 'package:http/http.dart';
|
|
|
|
/// The BTTV service for making API calls.
|
|
class BTTVApi {
|
|
final Client _client;
|
|
|
|
const BTTVApi(this._client);
|
|
|
|
/// Returns a map of global BTTV emotes to their URL.
|
|
Future<List<Emote>> getEmotesGlobal() async {
|
|
final url = Uri.parse('https://api.betterttv.net/3/cached/emotes/global');
|
|
|
|
final response = await _client.get(url);
|
|
if (response.statusCode == 200) {
|
|
final decoded = jsonDecode(response.body) as List;
|
|
final emotes = decoded.map((emote) => EmoteBTTV.fromJson(emote)).toList();
|
|
|
|
return emotes
|
|
.map((emote) => Emote.fromBTTV(emote, EmoteType.bttvGlobal))
|
|
.toList();
|
|
} else {
|
|
return Future.error('Failed to get BTTV global emotes');
|
|
}
|
|
}
|
|
|
|
/// Returns a map of a channel's BTTV emotes to their URL.
|
|
Future<List<Emote>> getEmotesChannel({required String id}) async {
|
|
final url =
|
|
Uri.parse('https://api.betterttv.net/3/cached/users/twitch/$id');
|
|
|
|
final response = await _client.get(url);
|
|
if (response.statusCode == 200) {
|
|
final decoded = jsonDecode(response.body);
|
|
final result = EmoteBTTVChannel.fromJson(decoded);
|
|
|
|
final emoteToUrl = <Emote>[];
|
|
emoteToUrl.addAll(
|
|
result.channelEmotes
|
|
.map((emote) => Emote.fromBTTV(emote, EmoteType.bttvChannel)),
|
|
);
|
|
emoteToUrl.addAll(
|
|
result.sharedEmotes
|
|
.map((emote) => Emote.fromBTTV(emote, EmoteType.bttvShared)),
|
|
);
|
|
|
|
return emoteToUrl;
|
|
} else {
|
|
return Future.error('Failed to get BTTV channel emotes');
|
|
}
|
|
}
|
|
|
|
/// Returns a map of username to their BTTV badge.
|
|
Future<Map<String, ChatBadge>> getBadges() async {
|
|
final url = Uri.parse('https://api.betterttv.net/3/cached/badges');
|
|
|
|
final response = await _client.get(url);
|
|
if (response.statusCode == 200) {
|
|
final badges = jsonDecode(response.body) as List;
|
|
|
|
final badgeObjects =
|
|
badges.map((badge) => BadgeInfoBTTV.fromJson(badge)).toList();
|
|
|
|
return {
|
|
for (final badge in badgeObjects)
|
|
badge.providerId: ChatBadge.fromBTTV(badge),
|
|
};
|
|
} else {
|
|
return Future.error('Failed to get BTTV badges');
|
|
}
|
|
}
|
|
}
|