404 lines
12 KiB
Dart
404 lines
12 KiB
Dart
/* MIT License
|
|
*
|
|
* Copyright (C) 2019, 2020, 2021 Famedly GmbH
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
|
|
import 'package:matrix/matrix_api_lite.dart';
|
|
|
|
class SyncUpdate {
|
|
String nextBatch;
|
|
RoomsUpdate? rooms;
|
|
List<Presence>? presence;
|
|
List<BasicEvent>? accountData;
|
|
List<BasicEventWithSender>? toDevice;
|
|
DeviceListsUpdate? deviceLists;
|
|
Map<String, int>? deviceOneTimeKeysCount;
|
|
List<String>? deviceUnusedFallbackKeyTypes;
|
|
|
|
SyncUpdate({
|
|
required this.nextBatch,
|
|
this.rooms,
|
|
this.presence,
|
|
this.accountData,
|
|
this.toDevice,
|
|
this.deviceLists,
|
|
this.deviceOneTimeKeysCount,
|
|
this.deviceUnusedFallbackKeyTypes,
|
|
});
|
|
|
|
SyncUpdate.fromJson(Map<String, Object?> json)
|
|
: nextBatch = json.tryGet<String>('next_batch') ?? '',
|
|
rooms = (() {
|
|
final temp = json.tryGetMap<String, Object?>('rooms');
|
|
return temp != null ? RoomsUpdate.fromJson(temp) : null;
|
|
}()),
|
|
presence = json
|
|
.tryGetMap<String, List<Object?>>('presence')?['events']
|
|
?.map((i) => Presence.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
accountData = json
|
|
.tryGetMap<String, List<Object?>>('account_data')?['events']
|
|
?.map((i) => BasicEvent.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
toDevice = json
|
|
.tryGetMap<String, List<Object?>>('to_device')?['events']
|
|
?.map(
|
|
(i) => BasicEventWithSender.fromJson(i as Map<String, Object?>),
|
|
)
|
|
.toList(),
|
|
deviceLists = (() {
|
|
final temp = json.tryGetMap<String, Object?>('device_lists');
|
|
return temp != null ? DeviceListsUpdate.fromJson(temp) : null;
|
|
}()),
|
|
deviceOneTimeKeysCount =
|
|
json.tryGetMap<String, int>('device_one_time_keys_count'),
|
|
deviceUnusedFallbackKeyTypes =
|
|
json.tryGetList<String>('device_unused_fallback_key_types') ??
|
|
json.tryGetList<String>(
|
|
'org.matrix.msc2732.device_unused_fallback_key_types',
|
|
);
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
data['next_batch'] = nextBatch;
|
|
if (rooms != null) {
|
|
data['rooms'] = rooms!.toJson();
|
|
}
|
|
if (presence != null) {
|
|
data['presence'] = {
|
|
'events': presence!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (accountData != null) {
|
|
data['account_data'] = {
|
|
'events': accountData!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (toDevice != null) {
|
|
data['to_device'] = {
|
|
'events': toDevice!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (deviceLists != null) {
|
|
data['device_lists'] = deviceLists!.toJson();
|
|
}
|
|
if (deviceOneTimeKeysCount != null) {
|
|
data['device_one_time_keys_count'] = deviceOneTimeKeysCount;
|
|
}
|
|
if (deviceUnusedFallbackKeyTypes != null) {
|
|
data['device_unused_fallback_key_types'] = deviceUnusedFallbackKeyTypes;
|
|
data['org.matrix.msc2732.device_unused_fallback_key_types'] =
|
|
deviceUnusedFallbackKeyTypes;
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class RoomsUpdate {
|
|
Map<String, JoinedRoomUpdate>? join;
|
|
Map<String, InvitedRoomUpdate>? invite;
|
|
Map<String, LeftRoomUpdate>? leave;
|
|
Map<String, KnockRoomUpdate>? knock;
|
|
|
|
RoomsUpdate({
|
|
this.join,
|
|
this.invite,
|
|
this.leave,
|
|
this.knock,
|
|
});
|
|
|
|
RoomsUpdate.fromJson(Map<String, Object?> json) {
|
|
join = json.tryGetMap<String, Object?>('join')?.catchMap(
|
|
(k, v) =>
|
|
MapEntry(k, JoinedRoomUpdate.fromJson(v as Map<String, Object?>)),
|
|
);
|
|
invite = json.tryGetMap<String, Object?>('invite')?.catchMap(
|
|
(k, v) => MapEntry(
|
|
k,
|
|
InvitedRoomUpdate.fromJson(v as Map<String, Object?>),
|
|
),
|
|
);
|
|
leave = json.tryGetMap<String, Object?>('leave')?.catchMap(
|
|
(k, v) =>
|
|
MapEntry(k, LeftRoomUpdate.fromJson(v as Map<String, Object?>)),
|
|
);
|
|
knock = json.tryGetMap<String, Object?>('knock')?.catchMap(
|
|
(k, v) =>
|
|
MapEntry(k, KnockRoomUpdate.fromJson(v as Map<String, Object?>)),
|
|
);
|
|
}
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (join != null) {
|
|
data['join'] = join!.map((k, v) => MapEntry(k, v.toJson()));
|
|
}
|
|
if (invite != null) {
|
|
data['invite'] = invite!.map((k, v) => MapEntry(k, v.toJson()));
|
|
}
|
|
if (leave != null) {
|
|
data['leave'] = leave!.map((k, v) => MapEntry(k, v.toJson()));
|
|
}
|
|
if (knock != null) {
|
|
data['knock'] = knock!.map((k, v) => MapEntry(k, v.toJson()));
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
abstract class SyncRoomUpdate {}
|
|
|
|
class JoinedRoomUpdate extends SyncRoomUpdate {
|
|
RoomSummary? summary;
|
|
List<MatrixEvent>? state;
|
|
TimelineUpdate? timeline;
|
|
List<BasicEvent>? ephemeral;
|
|
List<BasicEvent>? accountData;
|
|
UnreadNotificationCounts? unreadNotifications;
|
|
|
|
JoinedRoomUpdate({
|
|
this.summary,
|
|
this.state,
|
|
this.timeline,
|
|
this.ephemeral,
|
|
this.accountData,
|
|
this.unreadNotifications,
|
|
});
|
|
|
|
JoinedRoomUpdate.fromJson(Map<String, Object?> json)
|
|
: summary = json.tryGetFromJson('summary', RoomSummary.fromJson),
|
|
state = json
|
|
.tryGetMap<String, List<Object?>>('state')?['events']
|
|
?.map((i) => MatrixEvent.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
timeline = json.tryGetFromJson('timeline', TimelineUpdate.fromJson),
|
|
ephemeral = json
|
|
.tryGetMap<String, List<Object?>>('ephemeral')?['events']
|
|
?.map((i) => BasicEvent.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
accountData = json
|
|
.tryGetMap<String, List<Object?>>('account_data')?['events']
|
|
?.map((i) => BasicEvent.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
unreadNotifications = json.tryGetFromJson(
|
|
'unread_notifications',
|
|
UnreadNotificationCounts.fromJson,
|
|
);
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (summary != null) {
|
|
data['summary'] = summary!.toJson();
|
|
}
|
|
if (state != null) {
|
|
data['state'] = {
|
|
'events': state!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (timeline != null) {
|
|
data['timeline'] = timeline!.toJson();
|
|
}
|
|
if (ephemeral != null) {
|
|
data['ephemeral'] = {
|
|
'events': ephemeral!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (accountData != null) {
|
|
data['account_data'] = {
|
|
'events': accountData!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (unreadNotifications != null) {
|
|
data['unread_notifications'] = unreadNotifications!.toJson();
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class InvitedRoomUpdate extends SyncRoomUpdate {
|
|
List<StrippedStateEvent>? inviteState;
|
|
|
|
InvitedRoomUpdate({this.inviteState});
|
|
|
|
InvitedRoomUpdate.fromJson(Map<String, Object?> json)
|
|
: inviteState = json
|
|
.tryGetMap<String, List<Object?>>('invite_state')?['events']
|
|
?.map((i) => StrippedStateEvent.fromJson(i as Map<String, Object?>))
|
|
.toList();
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (inviteState != null) {
|
|
data['invite_state'] = {
|
|
'events': inviteState!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class KnockRoomUpdate extends SyncRoomUpdate {
|
|
List<StrippedStateEvent>? knockState;
|
|
|
|
KnockRoomUpdate({this.knockState});
|
|
|
|
KnockRoomUpdate.fromJson(Map<String, Object?> json)
|
|
: knockState = json
|
|
.tryGetMap<String, List<Object?>>('knock_state')?['events']
|
|
?.map((i) => StrippedStateEvent.fromJson(i as Map<String, Object?>))
|
|
.toList();
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (knockState != null) {
|
|
data['knock_state'] = {
|
|
'events': knockState!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class LeftRoomUpdate extends SyncRoomUpdate {
|
|
List<MatrixEvent>? state;
|
|
TimelineUpdate? timeline;
|
|
List<BasicEvent>? accountData;
|
|
|
|
LeftRoomUpdate({
|
|
this.state,
|
|
this.timeline,
|
|
this.accountData,
|
|
});
|
|
|
|
LeftRoomUpdate.fromJson(Map<String, Object?> json)
|
|
: state = json
|
|
.tryGetMap<String, List<Object?>>('state')?['events']
|
|
?.map((i) => MatrixEvent.fromJson(i as Map<String, Object?>))
|
|
.toList(),
|
|
timeline = json.tryGetFromJson('timeline', TimelineUpdate.fromJson),
|
|
accountData = json
|
|
.tryGetMap<String, List<Object?>>('account_data')?['events']
|
|
?.map((i) => BasicEvent.fromJson(i as Map<String, Object?>))
|
|
.toList();
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (state != null) {
|
|
data['state'] = {
|
|
'events': state!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
if (timeline != null) {
|
|
data['timeline'] = timeline!.toJson();
|
|
}
|
|
if (accountData != null) {
|
|
data['account_data'] = {
|
|
'events': accountData!.map((i) => i.toJson()).toList(),
|
|
};
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class TimelineUpdate {
|
|
List<MatrixEvent>? events;
|
|
bool? limited;
|
|
String? prevBatch;
|
|
|
|
TimelineUpdate({
|
|
this.events,
|
|
this.limited,
|
|
this.prevBatch,
|
|
});
|
|
|
|
TimelineUpdate.fromJson(Map<String, Object?> json)
|
|
: events = json
|
|
.tryGetList<Map<String, Object?>>('events')
|
|
?.map((v) => MatrixEvent.fromJson(v))
|
|
.toList(),
|
|
limited = json.tryGet<bool>('limited'),
|
|
prevBatch = json.tryGet<String>('prev_batch');
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (events != null) {
|
|
data['events'] = events!.map((i) => i.toJson()).toList();
|
|
}
|
|
if (limited != null) {
|
|
data['limited'] = limited;
|
|
}
|
|
if (prevBatch != null) {
|
|
data['prev_batch'] = prevBatch;
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class UnreadNotificationCounts {
|
|
int? highlightCount;
|
|
int? notificationCount;
|
|
|
|
UnreadNotificationCounts({
|
|
this.notificationCount,
|
|
this.highlightCount,
|
|
});
|
|
|
|
UnreadNotificationCounts.fromJson(Map<String, Object?> json)
|
|
: highlightCount = json.tryGet<int>('highlight_count'),
|
|
notificationCount = json.tryGet<int>('notification_count');
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (highlightCount != null) {
|
|
data['highlight_count'] = highlightCount;
|
|
}
|
|
if (notificationCount != null) {
|
|
data['notification_count'] = notificationCount;
|
|
}
|
|
return data;
|
|
}
|
|
}
|
|
|
|
class DeviceListsUpdate {
|
|
List<String>? changed;
|
|
List<String>? left;
|
|
|
|
DeviceListsUpdate({
|
|
this.changed,
|
|
this.left,
|
|
});
|
|
|
|
DeviceListsUpdate.fromJson(Map<String, Object?> json)
|
|
: changed = json.tryGetList<String>('changed') ?? [],
|
|
left = json.tryGetList<String>('left') ?? [];
|
|
|
|
Map<String, Object?> toJson() {
|
|
final data = <String, Object?>{};
|
|
if (changed != null) {
|
|
data['changed'] = changed;
|
|
}
|
|
if (left != null) {
|
|
data['left'] = left;
|
|
}
|
|
return data;
|
|
}
|
|
}
|