mirror of
https://gitlab.com/famedly/fluffychat.git
synced 2024-11-24 04:59:26 +01:00
100 lines
2.8 KiB
Dart
100 lines
2.8 KiB
Dart
|
import 'package:matrix/matrix.dart';
|
||
|
|
||
|
class AccountBundles {
|
||
|
String prefix;
|
||
|
List<AccountBundle> bundles;
|
||
|
|
||
|
AccountBundles({this.prefix, this.bundles});
|
||
|
|
||
|
AccountBundles.fromJson(Map<String, dynamic> json)
|
||
|
: prefix = json.tryGet<String>('prefix'),
|
||
|
bundles = json['bundles'] is List
|
||
|
? json['bundles']
|
||
|
.map((b) {
|
||
|
try {
|
||
|
return AccountBundle.fromJson(b);
|
||
|
} catch (_) {
|
||
|
return null;
|
||
|
}
|
||
|
})
|
||
|
.whereType<AccountBundle>()
|
||
|
.toList()
|
||
|
: null;
|
||
|
|
||
|
Map<String, dynamic> toJson() => {
|
||
|
if (prefix != null) 'prefix': prefix,
|
||
|
if (bundles != null) 'bundles': bundles.map((v) => v.toJson()).toList(),
|
||
|
};
|
||
|
}
|
||
|
|
||
|
class AccountBundle {
|
||
|
String name;
|
||
|
int priority;
|
||
|
|
||
|
AccountBundle({this.name, this.priority});
|
||
|
|
||
|
AccountBundle.fromJson(Map<String, dynamic> json)
|
||
|
: name = json.tryGet<String>('name'),
|
||
|
priority = json.tryGet<int>('priority');
|
||
|
|
||
|
Map<String, dynamic> toJson() => <String, dynamic>{
|
||
|
if (name != null) 'name': name,
|
||
|
if (priority != null) 'priority': priority,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
const accountBundlesType = 'im.fluffychat.account_bundles';
|
||
|
|
||
|
extension AccountBundlesExtension on Client {
|
||
|
List<AccountBundle> get accountBundles {
|
||
|
List<AccountBundle> ret;
|
||
|
if (accountData.containsKey(accountBundlesType)) {
|
||
|
ret = AccountBundles.fromJson(accountData[accountBundlesType].content)
|
||
|
.bundles;
|
||
|
}
|
||
|
ret ??= [];
|
||
|
if (ret.isEmpty) {
|
||
|
ret.add(AccountBundle(
|
||
|
name: userID,
|
||
|
priority: 0,
|
||
|
));
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
Future<void> setAccountBundle(String name, [int priority]) async {
|
||
|
final data =
|
||
|
AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {});
|
||
|
var foundBundle = false;
|
||
|
data.bundles ??= [];
|
||
|
for (final bundle in data.bundles) {
|
||
|
if (bundle.name == name) {
|
||
|
bundle.priority = priority;
|
||
|
foundBundle = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (!foundBundle) {
|
||
|
data.bundles.add(AccountBundle(name: name, priority: priority));
|
||
|
}
|
||
|
await setAccountData(userID, accountBundlesType, data.toJson());
|
||
|
}
|
||
|
|
||
|
Future<void> removeFromAccountBundle(String name) async {
|
||
|
if (!accountData.containsKey(accountBundlesType)) {
|
||
|
return; // nothing to do
|
||
|
}
|
||
|
final data =
|
||
|
AccountBundles.fromJson(accountData[accountBundlesType].content);
|
||
|
if (data.bundles == null) return;
|
||
|
data.bundles.removeWhere((b) => b.name == name);
|
||
|
await setAccountData(userID, accountBundlesType, data.toJson());
|
||
|
}
|
||
|
|
||
|
String get sendPrefix {
|
||
|
final data =
|
||
|
AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {});
|
||
|
return data.prefix;
|
||
|
}
|
||
|
}
|