Files

91 lines
2.8 KiB
Dart

import 'admin_rights.dart';
// #***! расширенная карточка чата
class ChatInfo {
final Map<String, dynamic> raw;
final List<int> participantIds;
final Set<int> adminIds;
final int? owner;
const ChatInfo({
required this.raw,
required this.participantIds,
required this.adminIds,
required this.owner,
});
factory ChatInfo.fromMap(Map<String, dynamic> map) {
return ChatInfo(
raw: map,
participantIds: _idKeys(map['participants']),
adminIds: _idKeys(map['adminParticipants']).toSet(),
owner: map['owner'] as int?,
);
}
bool isAdmin(int id) => adminIds.contains(id);
bool isOwner(int id) => owner != null && id == owner;
bool option(String name) {
final opts = raw['options'];
return opts is Map && opts[name] == true;
}
bool canSeeInviteLink(int id) =>
isAdmin(id) || isOwner(id) || option('MEMBERS_CAN_SEE_PRIVATE_LINK');
bool get isPublic => raw['access'] == 'PUBLIC';
bool canSeeLink(int id) => isPublic || canSeeInviteLink(id);
String? adminAlias(int id) {
final entry = _adminEntry(id);
if (entry == null) return null;
final alias = entry['alias'];
if (alias is String && alias.trim().isNotEmpty) return alias.trim();
return null;
}
AdminRights rightsOf(int id) {
if (isOwner(id)) {
return const AdminRights(AdminRights.ownerBits);
}
final permissions = _adminEntry(id)?['permissions'];
return AdminRights(permissions is int ? permissions : 0);
}
bool can(int id, AdminRight right) =>
isOwner(id) || (isAdmin(id) && rightsOf(id).has(right));
Map<dynamic, dynamic>? _adminEntry(int id) {
final source = raw['adminParticipants'];
if (source is! Map) return null;
final entry = source[id.toString()] ?? source[id];
return entry is Map ? entry : null;
}
int? get participantsCount => raw['participantsCount'] as int?;
int? get blockedParticipantsCount => raw['blockedParticipantsCount'] as int?;
// #***! счётчик заявок на вступление, приходит в объекте чата
int get pendingJoinRequestsCount =>
(raw['pendingJoinRequestsCount'] as int?) ?? 0;
String? get link => raw['link'] as String?;
bool get joinRequests => option('JOIN_REQUEST');
bool get commentsEnabled => option('COMMENTS');
String? get title => raw['title'] as String?;
String? get iconUrl => raw['baseIconUrl'] as String?;
AdminChatKind get adminKind =>
raw['type'] == 'CHANNEL' ? AdminChatKind.channel : AdminChatKind.group;
String? get description => raw['description'] as String?;
static List<int> _idKeys(Object? source) {
if (source is! Map) return const [];
final out = <int>[];
for (final key in source.keys) {
final id = key is int ? key : int.tryParse(key.toString());
if (id != null) out.add(id);
}
return out;
}
}