feat: animoji реакции

This commit is contained in:
Jganenokk
2026-07-27 15:13:54 +07:00
parent de95fd7c65
commit 8602755a8c
5 changed files with 452 additions and 14 deletions
+13 -3
View File
@@ -2,6 +2,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../api.dart';
import '../../core/protocol/opcode_map.dart';
import '../../core/utils/emoji_keyword_index.dart';
import '../../core/utils/logger.dart';
import '../../models/animoji.dart';
@@ -23,6 +24,7 @@ class AnimojiModule {
static const int _maxRecents = 24;
final Map<int, Animoji> _byId = {};
final Map<String, Animoji> _byEmoji = {};
List<int> _orderedIds = [];
List<int> _recentIds = [];
bool _recentsLoaded = false;
@@ -50,7 +52,7 @@ class AnimojiModule {
Future<void> noteUsed(Animoji animoji) async {
await ensureRecentsLoaded();
_byId[animoji.id] = animoji;
_remember(animoji);
_recentIds.remove(animoji.id);
_recentIds.insert(0, animoji.id);
if (_recentIds.length > _maxRecents) {
@@ -72,6 +74,9 @@ class AnimojiModule {
Animoji? cached(int id) => _byId[id];
Animoji? findByEmoji(String emoji) =>
_byEmoji[EmojiKeywordIndex.normalize(emoji)];
Future<Animoji?> fetchById(int id) async {
final known = _byId[id];
if (known != null) return known;
@@ -84,7 +89,7 @@ class AnimojiModule {
for (final e in list) {
if (e is! Map) continue;
final animoji = Animoji.fromMap(e);
if (animoji != null) _byId[animoji.id] = animoji;
if (animoji != null) _remember(animoji);
}
return _byId[id];
}
@@ -152,7 +157,7 @@ class AnimojiModule {
for (final e in list) {
if (e is! Map) continue;
final animoji = Animoji.fromMap(e);
if (animoji != null) _byId[animoji.id] = animoji;
if (animoji != null) _remember(animoji);
}
}
@@ -160,6 +165,11 @@ class AnimojiModule {
logger.i('Анимодзи: ${_orderedIds.length} доступно для реакций');
}
void _remember(Animoji animoji) {
_byId[animoji.id] = animoji;
_byEmoji[EmojiKeywordIndex.normalize(animoji.emoji)] = animoji;
}
List<int> _dedup(List<int> ids) {
final seen = <int>{};
final result = <int>[];