Initial Commit

This commit is contained in:
ivan2282
2025-11-15 20:06:40 +03:00
commit 205d11df0d
233 changed files with 52572 additions and 0 deletions

133
lib/models/message.dart Normal file
View File

@@ -0,0 +1,133 @@
class Message {
final String id;
final String text;
final int time;
final int senderId;
final String? status; // EDITED, DELETED, etc.
final int? updateTime; // Время последнего редактирования
final List<Map<String, dynamic>> attaches;
final int? cid; // клиентский id (timestamp)
final Map<String, dynamic>? reactionInfo; // Информация о реакциях
final Map<String, dynamic>? link; // Информация об ответе на сообщение
Message({
required this.id,
required this.text,
required this.time,
required this.senderId,
this.status,
this.updateTime,
this.attaches = const [],
this.cid,
this.reactionInfo,
this.link,
});
factory Message.fromJson(Map<String, dynamic> json) {
int senderId;
if (json['sender'] is int) {
senderId = json['sender'];
} else {
senderId = 0;
}
int time;
if (json['time'] is int) {
time = json['time'];
} else {
time = 0;
}
return Message(
id:
json['id']?.toString() ??
'local_${DateTime.now().millisecondsSinceEpoch}',
text: json['text'] ?? '',
time: time,
senderId: senderId, // Use the new safe logic
status: json['status'],
updateTime: json['updateTime'],
attaches:
(json['attaches'] as List?)
?.map((e) => (e as Map).cast<String, dynamic>())
.toList() ??
const [],
cid: json['cid'],
reactionInfo: json['reactionInfo'],
link: json['link'],
);
}
Message copyWith({
String? id,
String? text,
int? time,
int? senderId,
String? status,
int? updateTime,
List<Map<String, dynamic>>? attaches,
int? cid,
Map<String, dynamic>? reactionInfo,
Map<String, dynamic>? link,
}) {
return Message(
id: id ?? this.id,
text: text ?? this.text,
time: time ?? this.time,
senderId: senderId ?? this.senderId,
status: status ?? this.status,
updateTime: updateTime ?? this.updateTime,
attaches: attaches ?? this.attaches,
cid: cid ?? this.cid,
reactionInfo: reactionInfo ?? this.reactionInfo,
link: link ?? this.link,
);
}
bool get isEdited => status == 'EDITED';
bool get isDeleted => status == 'DELETED';
bool get isReply => link != null && link!['type'] == 'REPLY';
bool get isForwarded => link != null && link!['type'] == 'FORWARD';
bool canEdit(int currentUserId) {
if (isDeleted) return false;
if (senderId != currentUserId) return false;
if (attaches.isNotEmpty) {
return false; // Нельзя редактировать сообщения с вложениями
}
final now = DateTime.now().millisecondsSinceEpoch;
final messageTime = time;
final hoursSinceCreation = (now - messageTime) / (1000 * 60 * 60);
return hoursSinceCreation <= 24;
}
Map<String, dynamic> toJson() {
return {
'id': id,
'text': text,
'time': time,
'sender': senderId,
'status': status,
'updateTime': updateTime,
'cid': cid,
'attaches': attaches,
'link': link,
'reactionInfo': reactionInfo,
};
}
}