103 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			103 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;
 | |
|     final bundles = data.bundles ??= [];
 | |
|     for (final bundle in bundles) {
 | |
|       if (bundle.name == name) {
 | |
|         bundle.priority = priority;
 | |
|         foundBundle = true;
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|     if (!foundBundle) {
 | |
|       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!;
 | |
|   }
 | |
| }
 |