1+ import 'dart:async' ;
12import 'dart:typed_data' ;
23
34import 'package:dart_mappable/dart_mappable.dart' ;
@@ -8,21 +9,42 @@ part 'user.mapper.dart';
89
910@MappableClass (includeCustomMappers: [Base64Uint8ListHook ()])
1011final class SetonixUser with SetonixUserMappable {
11- final Uint8List ? publicKey ;
12+ final String ? fingerprint ;
1213 final String name;
14+ final bool onWhitelist;
15+ final DateTime ? createdAt, updatedAt, lastLogin;
1316
1417 const SetonixUser ({
15- this .publicKey ,
18+ this .fingerprint ,
1619 required this .name,
20+ this .onWhitelist = false ,
21+ this .createdAt,
22+ this .updatedAt,
23+ this .lastLogin,
24+ });
25+ }
26+
27+ abstract class UserService {
28+ FutureOr <SetonixUser ?> getUser (String fingerprint);
29+ FutureOr <SetonixUser ?> getUserFromName (String name);
30+ FutureOr <bool > updateUser (
31+ String fingerprint, {
32+ String ? name,
33+ bool ? onWhitelist,
34+ DateTime ? lastLogin,
1735 });
1836}
1937
2038final class UserManager {
2139 final Map <Channel , SetonixUser > _users = {};
2240 final String guestPrefix;
41+ final UserService ? service;
2342 int _nextGuestId = 1 ;
2443
25- UserManager ([this .guestPrefix = SetonixConfig .defaultGuestPrefix]);
44+ UserManager ({
45+ this .service,
46+ this .guestPrefix = SetonixConfig .defaultGuestPrefix,
47+ });
2648
2749 bool containsUserName (String name) =>
2850 _users.values.any ((u) => u.name == name);
@@ -53,12 +75,42 @@ final class UserManager {
5375 return name;
5476 }
5577
56- bool addUser (Channel channel, [Uint8List ? publicKey, String ? name]) {
78+ Future <bool > addUser (Channel channel,
79+ [String ? fingerprint, String ? name]) async {
80+ SetonixUser ? user;
81+ if (fingerprint != null ) user = await service? .getUser (fingerprint);
5782 name ?? = _generateGuestName ();
5883 if (containsUserName (name)) {
5984 return false ;
6085 }
61- _users[channel] = SetonixUser (publicKey: publicKey, name: name);
86+ if (user == null ) {
87+ user = SetonixUser (
88+ fingerprint: fingerprint,
89+ name: name,
90+ );
91+ if (fingerprint != null ) {
92+ await service? .updateUser (fingerprint, name: name, onWhitelist: false );
93+ }
94+ }
95+ _users[channel] = user;
96+ return true ;
97+ }
98+
99+ Future <bool > changeName (Channel channel, String newName) async {
100+ if (containsUserName (newName)) {
101+ return false ;
102+ }
103+ final user = _users[channel];
104+ if (user == null ) {
105+ return false ;
106+ }
107+ final fingerprint = user.fingerprint;
108+ final result = fingerprint == null
109+ ? null
110+ : await service? .updateUser (fingerprint, name: newName);
111+ if (result == false ) return false ;
112+ final updatedUser = user.copyWith (name: newName);
113+ _users[channel] = updatedUser;
62114 return true ;
63115 }
64116}
0 commit comments