Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions commet/lib/client/components/emoticon/emoji_pack.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ abstract class EmoticonPack {
String get identifier;
String get attribution;
String get displayName;
String get ownerId;
String get ownerDisplayName;

Stream<int> get onEmoticonAdded;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,18 @@ import 'package:flutter/material.dart';
/// Manages custom emoticon packs from the matrix user account state
class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
static const roomEmotesStateKey = "im.ponies.room_emotes";
static const emoteRoomsStateKey = "im.ponies.emote_rooms";
static const globalEmoteRoomsStateKey = "im.ponies.emote_rooms";

@override
bool get canCreatePack => ownedPacks.isEmpty;

@override
MatrixClient client;

String get ownerId => client.identifier;

String get ownerDisplayName => client.self?.displayName ?? client.identifier;

MatrixEmoticonStateManager state;

final NotifyingList<EmoticonPack> _packs =
Expand Down Expand Up @@ -63,6 +67,11 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {

for (var key in newState.keys) {
var s = newState[key];
if (s is! Map<String, dynamic>) continue;
if (s.isEmpty) {
_packs.removeWhere((element) => element.identifier == key);
continue;
}

var existing =
_packs.where((element) => element.identifier == key).firstOrNull;
Expand Down Expand Up @@ -156,10 +165,11 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
List<EmoticonPack> globalPacks() {
var matrixClient = client.getMatrixClient();

if (!matrixClient.accountData.containsKey(emoteRoomsStateKey)) return [];
if (!matrixClient.accountData.containsKey(globalEmoteRoomsStateKey))
return [];

var rooms = matrixClient.accountData[emoteRoomsStateKey]!.content['rooms']
as Map<String, Object?>;
var rooms = matrixClient.accountData[globalEmoteRoomsStateKey]!
.content['rooms'] as Map<String, Object?>;

var packs = List<EmoticonPack>.empty(growable: true);

Expand All @@ -168,6 +178,9 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
var space = client.getSpace(roomId);

if (room == null && space == null) continue;
if (rooms[roomId] is! Map<String, dynamic>) {
continue;
}

var packKeys = rooms[roomId] as Map<String, dynamic>;

Expand Down Expand Up @@ -200,16 +213,8 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
return packs;
}

Map<String, dynamic> getState(String packKey) {
return client
.getMatrixClient()
.accountData['im.ponies.user_emotes']
?.content ??
{};
}

Future<void> deleteEmoticon(String packKey, String emoteName) async {
var content = getState(packKey);
var content = state.getState(packKey);

if (content.containsKey('images')) {
var images = content['images'] as Map<String, dynamic>;
Expand All @@ -222,7 +227,7 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {

Future<void> renameEmoticon(
String packKey, String emoteName, String newName) async {
var content = getState(packKey);
var content = state.getState(packKey);

if (content.containsKey('images')) {
var images = content['images'] as Map<String, dynamic>;
Expand All @@ -242,7 +247,7 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {

Future<void> setEmoticonUsages(
String packKey, String emoteName, List<String>? usages) async {
var content = getState(packKey);
var content = state.getState(packKey);

if (content.containsKey('images')) {
var images = content['images'] as Map<String, dynamic>;
Expand All @@ -266,7 +271,7 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
}

Future<void> setPackUsages(String packKey, List<String>? usages) async {
var content = getState(packKey);
var content = state.getState(packKey);

var pack = content['pack'] as Map<String, dynamic>?;

Expand All @@ -283,7 +288,7 @@ class MatrixEmoticonComponent extends EmoticonComponent<MatrixClient> {
String emoteName,
Uint8List data,
) async {
var content = getState(packKey);
var content = state.getState(packKey);

Uri url = await client.getMatrixClient().uploadContent(data);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import 'package:commet/client/components/emoticon/emoticon.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_emoticon.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_emoticon_component.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_room_emoticon_component.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_space_emoticon_component.dart';
import 'package:commet/client/matrix/extensions/matrix_client_extensions.dart';
import 'package:commet/client/matrix/matrix_mxc_image_provider.dart';
import 'package:commet/utils/notifying_list.dart';
import 'package:flutter/widgets.dart';
Expand Down Expand Up @@ -134,7 +136,8 @@ class MatrixEmoticonPack implements EmoticonPack {
}

List? _getUsage() {
var info = component.getState(identifier)['pack'] as Map<String, dynamic>?;
var info =
component.state.getState(identifier)['pack'] as Map<String, dynamic>?;
if (info == null) return null;

var usage = info.tryGet("usage") as List?;
Expand Down Expand Up @@ -176,9 +179,19 @@ class MatrixEmoticonPack implements EmoticonPack {

@override
Future<void> markAsGlobal(bool isGlobal) async {
late Room room;
if (component is MatrixRoomEmoticonComponent) {
await (component as MatrixRoomEmoticonComponent)
.markAsGlobal(isGlobal, identifier);
room = (component as MatrixRoomEmoticonComponent).room.matrixRoom;
} else if (component is MatrixSpaceEmoticonComponent) {
room = (component as MatrixSpaceEmoticonComponent).space.matrixRoom;
} else {
return;
}

if (isGlobal) {
return room.client.addEmoticonRoomPack(room.id, identifier);
} else {
return room.client.removeEmoticonRoomPack(room.id, identifier);
}
}

Expand Down Expand Up @@ -250,4 +263,10 @@ class MatrixEmoticonPack implements EmoticonPack {
Emoticon? getByShortcode(String shortcode) {
return shortcodeToEmoticon[shortcode];
}

@override
String get ownerId => component.ownerId;

@override
String get ownerDisplayName => component.ownerDisplayName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,25 @@ class MatrixRoomEmoticonComponent extends MatrixEmoticonComponent

@override
List<EmoticonPack> get availableEmoji =>
_getAvailablePacks(includeUnicode: true);
_getAvailablePacks(includeUnicode: true)
.where((element) => element.emoji.isNotEmpty)
.toList();

@override
List<EmoticonPack> get availableStickers =>
_getAvailablePacks(includeUnicode: false);
_getAvailablePacks(includeUnicode: false)
.where((element) => element.stickers.isNotEmpty)
.toList();

@override
bool get canCreatePack => room.permissions.canEditRoomEmoticons;

@override
String get ownerId => room.identifier;

@override
String get ownerDisplayName => room.displayName;

@override
List<EmoticonPack> get availablePacks {
List<EmoticonPack> packs = List.from(ownedPacks, growable: true);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:commet/client/components/emoticon/emoticon_component.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_emoticon_component.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_emoticon_state_manager.dart';
import 'package:commet/client/matrix/extensions/matrix_client_extensions.dart';
import 'package:commet/client/matrix/matrix_client.dart';
import 'package:commet/client/matrix/matrix_space.dart';

Expand All @@ -12,8 +13,20 @@ class MatrixSpaceEmoticonComponent extends MatrixEmoticonComponent
@override
bool get canCreatePack => space.permissions.canEditRoomEmoticons;

@override
String get ownerId => space.identifier;

@override
String get ownerDisplayName => space.displayName;

MatrixSpaceEmoticonComponent(
MatrixClient client,
this.space,
) : super(client, MatrixEmoticonRoomStateManager(space.matrixRoom));

@override
bool isGloballyAvailable(String packId) {
return space.matrixRoom.client
.isEmoticonPackGloballyAvailable(space.matrixRoom.id, packId);
}
}
27 changes: 15 additions & 12 deletions commet/lib/client/matrix/extensions/matrix_client_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ extension MatrixExtensions on Client {

Future<void> addEmoticonRoomPack(String roomId, String packKey) async {
var state = BasicEvent(
type: MatrixEmoticonComponent.roomEmotesStateKey, content: {});
type: MatrixEmoticonComponent.globalEmoteRoomsStateKey, content: {});

if (accountData.containsKey(MatrixEmoticonComponent.roomEmotesStateKey)) {
state = accountData[MatrixEmoticonComponent.roomEmotesStateKey]!;
if (accountData
.containsKey(MatrixEmoticonComponent.globalEmoteRoomsStateKey)) {
state = accountData[MatrixEmoticonComponent.globalEmoteRoomsStateKey]!;
}

if (!state.content.containsKey("rooms")) {
Expand All @@ -68,16 +69,17 @@ extension MatrixExtensions on Client {
var roomPacks = rooms[roomId] as Map;
roomPacks[packKey] = {};

await setAccountData(
userID!, MatrixEmoticonComponent.roomEmotesStateKey, state.content);
await setAccountData(userID!,
MatrixEmoticonComponent.globalEmoteRoomsStateKey, state.content);
}

Future<void> removeEmoticonRoomPack(String roomId, String packKey) async {
var state = BasicEvent(
type: MatrixEmoticonComponent.roomEmotesStateKey, content: {});
type: MatrixEmoticonComponent.globalEmoteRoomsStateKey, content: {});

if (accountData.containsKey(MatrixEmoticonComponent.roomEmotesStateKey)) {
state = accountData[MatrixEmoticonComponent.roomEmotesStateKey]!;
if (accountData
.containsKey(MatrixEmoticonComponent.globalEmoteRoomsStateKey)) {
state = accountData[MatrixEmoticonComponent.globalEmoteRoomsStateKey]!;
}

if (!state.content.containsKey("rooms")) {
Expand All @@ -92,17 +94,18 @@ extension MatrixExtensions on Client {
var roomPacks = rooms[roomId] as Map;
roomPacks.remove(packKey);

await setAccountData(
userID!, MatrixEmoticonComponent.roomEmotesStateKey, state.content);
await setAccountData(userID!,
MatrixEmoticonComponent.globalEmoteRoomsStateKey, state.content);
}

bool isEmoticonPackGloballyAvailable(String roomId, String packKey) {
if (!accountData.containsKey(MatrixEmoticonComponent.roomEmotesStateKey)) {
if (!accountData
.containsKey(MatrixEmoticonComponent.globalEmoteRoomsStateKey)) {
return false;
}

var state =
accountData[MatrixEmoticonComponent.roomEmotesStateKey]!.content;
accountData[MatrixEmoticonComponent.globalEmoteRoomsStateKey]!.content;
if (!state.containsKey("rooms")) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:commet/client/components/emoticon/emoji_pack.dart';
import 'package:commet/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:tiamat/tiamat.dart' as tiamat;
Expand Down Expand Up @@ -40,7 +41,16 @@ class _AccountEmojiViewState extends State<AccountEmojiView> {
),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 0, 0),
child: tiamat.Text.labelEmphasised(pack.displayName),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
tiamat.Text.labelEmphasised(pack.displayName),
tiamat.Text.labelLow(preferences.developerMode
? "${pack.ownerDisplayName} - (${pack.ownerId})"
: pack.ownerDisplayName),
],
),
),
],
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,16 +401,18 @@ class _EmojiPackEditorState extends State<EmojiPackEditor> {
sizeFactor: CommonAnimations.easeOut(animation),
child: Padding(
padding: const EdgeInsets.fromLTRB(8, 2, 9, 2),
child: EmojiEditor(widget.pack.emotes[index],
deleteEmoji: () => deleteEmoji(index),
editable: widget.editable,
setIsEmoji: (value) => widget.pack
.markEmoticonAsEmoji(
widget.pack.emotes[index], value),
setIsSticker: (value) => widget.pack
.markEmoticonAsSticker(
widget.pack.emotes[index], value),
renameEmoji: (name) => renameEmoji(index, name)),
child: index >= widget.pack.emotes.length
? Container()
: EmojiEditor(widget.pack.emotes[index],
deleteEmoji: () => deleteEmoji(index),
editable: widget.editable,
setIsEmoji: (value) => widget.pack
.markEmoticonAsEmoji(
widget.pack.emotes[index], value),
setIsSticker: (value) => widget.pack
.markEmoticonAsSticker(
widget.pack.emotes[index], value),
renameEmoji: (name) => renameEmoji(index, name)),
),
);
},
Expand Down
6 changes: 6 additions & 0 deletions commet/lib/utils/emoji/unicode_emoji.dart
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,12 @@ class UnicodeEmoticonPack implements EmoticonPack {
Emoticon? getByShortcode(String shortcode) {
return _emojiByShortcode?.tryGet(shortcode);
}

@override
String get ownerDisplayName => "";

@override
String get ownerId => "";
}

class UnicodeEmoticon extends Emoticon {
Expand Down