OpenContacts/lib/models/users/user_status.dart

128 lines
4.3 KiB
Dart
Raw Normal View History

import 'dart:convert';
import 'package:contacts_plus_plus/crypto_helper.dart';
import 'package:contacts_plus_plus/models/session_metadata.dart';
import 'package:contacts_plus_plus/models/users/online_status.dart';
import 'package:crypto/crypto.dart';
class UserStatus {
final OnlineStatus onlineStatus;
final DateTime lastStatusChange;
final int currentSessionAccessLevel;
final bool currentSessionHidden;
final bool currentHosting;
final int currentSessionIndex;
final List<SessionMetadata> sessions;
2023-09-29 09:33:43 -04:00
final String appVersion;
final String outputDevice;
final bool isMobile;
final String compatibilityHash;
final String hashSalt;
2023-09-29 09:33:43 -04:00
const UserStatus({
required this.onlineStatus,
required this.lastStatusChange,
required this.currentSessionIndex,
2023-09-29 09:33:43 -04:00
required this.currentSessionAccessLevel,
required this.currentSessionHidden,
required this.currentHosting,
required this.sessions,
2023-09-29 09:33:43 -04:00
required this.appVersion,
required this.outputDevice,
required this.isMobile,
required this.compatibilityHash,
required this.hashSalt,
2023-09-29 09:33:43 -04:00
});
factory UserStatus.initial() => UserStatus.empty().copyWith(
onlineStatus: OnlineStatus.online,
hashSalt: CryptoHelper.cryptoToken(),
outputDevice: "Mobile",
);
2023-09-29 09:33:43 -04:00
factory UserStatus.empty() => UserStatus(
onlineStatus: OnlineStatus.offline,
lastStatusChange: DateTime.now(),
currentSessionAccessLevel: 0,
currentSessionHidden: false,
currentHosting: false,
currentSessionIndex: -1,
sessions: [],
2023-09-29 09:33:43 -04:00
appVersion: "",
outputDevice: "Unknown",
isMobile: false,
compatibilityHash: "",
hashSalt: "",
);
factory UserStatus.fromMap(Map map) {
2023-09-29 09:33:43 -04:00
final statusString = map["onlineStatus"].toString();
final status = OnlineStatus.fromString(statusString);
return UserStatus(
onlineStatus: status,
lastStatusChange: DateTime.parse(map["lastStatusChange"]),
currentSessionAccessLevel: map["currentSessionAccessLevel"] ?? 0,
currentSessionHidden: map["currentSessionHidden"] ?? false,
currentHosting: map["currentHosting"] ?? false,
currentSessionIndex: map["currentSessionIndex"] ?? -1,
sessions: (map["sessions"] as List? ?? []).map((e) => SessionMetadata.fromMap(e)).toList(),
appVersion: map["appVersion"] ?? "",
outputDevice: map["outputDevice"] ?? "Unknown",
isMobile: map["isMobile"] ?? false,
compatibilityHash: map["compatabilityHash"] ?? "",
hashSalt: map["hashSalt"] ?? "",
);
}
Map toMap({bool shallow = false}) {
return {
"onlineStatus": onlineStatus.index,
"lastStatusChange": lastStatusChange.toIso8601String(),
"currentSessionAccessLevel": currentSessionAccessLevel,
"currentSessionHidden": currentSessionHidden,
"currentHosting": currentHosting,
"currentSessionIndex": currentSessionIndex,
"sessions": shallow
2023-09-29 09:33:43 -04:00
? []
: sessions
2023-09-29 09:33:43 -04:00
.map(
(e) => e.toMap(),
)
.toList(),
2023-09-30 06:22:32 -04:00
"appVersion": appVersion,
"outputDevice": outputDevice,
"isMobile": isMobile,
"compatibilityHash": compatibilityHash,
};
}
UserStatus copyWith({
OnlineStatus? onlineStatus,
DateTime? lastStatusChange,
int? currentSessionAccessLevel,
bool? currentSessionHidden,
bool? currentHosting,
int? currentSessionIndex,
List<SessionMetadata>? sessions,
2023-09-30 08:20:08 -04:00
String? appVersion,
String? outputDevice,
bool? isMobile,
String? compatibilityHash,
String? hashSalt,
}) =>
UserStatus(
onlineStatus: onlineStatus ?? this.onlineStatus,
lastStatusChange: lastStatusChange ?? this.lastStatusChange,
currentSessionAccessLevel: currentSessionAccessLevel ?? this.currentSessionAccessLevel,
currentSessionHidden: currentSessionHidden ?? this.currentSessionHidden,
currentHosting: currentHosting ?? this.currentHosting,
currentSessionIndex: currentSessionIndex ?? this.currentSessionIndex,
sessions: sessions ?? this.sessions,
2023-09-30 08:20:08 -04:00
appVersion: appVersion ?? this.appVersion,
outputDevice: outputDevice ?? this.outputDevice,
isMobile: isMobile ?? this.isMobile,
compatibilityHash: compatibilityHash ?? this.compatibilityHash,
hashSalt: hashSalt ?? this.hashSalt,
);
2023-09-29 09:33:43 -04:00
}