You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			101 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!;
 | 
						|
  }
 | 
						|
}
 |