From 97ef716be8d45a5fb916c272040ec7e2b28711f8 Mon Sep 17 00:00:00 2001 From: Sorunome Date: Thu, 21 May 2020 15:01:10 +0000 Subject: [PATCH] add emote rooms and state key room emotes --- lib/src/room.dart | 61 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index 8b80e55..1ca0e70 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -519,21 +519,64 @@ class Room { /// return all current emote packs for this room Map> get emotePacks { final packs = >{}; - final addEmotePack = (String packName, Map content) { - packs[packName] = {}; - content.forEach((key, value) { + final normalizeEmotePackName = (String name) { + name = name.replaceAll(' ', '-'); + name = name.replaceAll(RegExp(r'[^\w-]'), ''); + return name.toLowerCase(); + }; + final addEmotePack = (String packName, Map content, [String packNameOverride]) { + if (!(content['short'] is Map)) { + return; + } + if (content['pack'] is Map && content['pack']['name'] is String) { + packName = content['pack']['name']; + } + if (packNameOverride != null && packNameOverride.isNotEmpty) { + packName = packNameOverride; + } + packName = normalizeEmotePackName(packName); + if (!packs.containsKey(packName)) { + packs[packName] = {}; + } + content['short'].forEach((key, value) { if (key is String && value is String && value.startsWith('mxc://')) { packs[packName][key] = value; } }); }; - final roomEmotes = getState('im.ponies.room_emotes'); - final userEmotes = client.accountData['im.ponies.user_emotes']; - if (roomEmotes != null && roomEmotes.content['short'] is Map) { - addEmotePack('room', roomEmotes.content['short']); + // first add all the room emotes + final allRoomEmotes = states.states['im.ponies.room_emotes']; + if (allRoomEmotes != null) { + for (final entry in allRoomEmotes.entries) { + final stateKey = entry.key; + final event = entry.value; + addEmotePack(stateKey.isEmpty ? 'room' : stateKey, event.content); + } } - if (userEmotes != null && userEmotes.content['short'] is Map) { - addEmotePack('user', userEmotes.content['short']); + // next add all the user emotes + final userEmotes = client.accountData['im.ponies.user_emotes']; + if (userEmotes != null) { + addEmotePack('user', userEmotes.content); + } + // finally add all the external emote rooms + final emoteRooms = client.accountData['im.ponies.emote_rooms']; + if (emoteRooms != null && emoteRooms.content['rooms'] is Map) { + for (final roomEntry in emoteRooms.content['rooms'].entries) { + final roomId = roomEntry.key; + if (roomId == id) { + continue; + } + final room = client.getRoomById(roomId); + if (room != null && roomEntry.value is Map) { + for (final stateKeyEntry in roomEntry.value.entries) { + final stateKey = stateKeyEntry.key; + final event = room.getState('im.ponies.room_emotes', stateKey); + if (event != null && stateKeyEntry.value is Map) { + addEmotePack(room.canonicalAlias.isEmpty ? room.id : canonicalAlias, event.content, stateKeyEntry.value['name']); + } + } + } + } } return packs; }