From 2314fa0e09d50c9e501cbf320f91e8ffd1b515b0 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Thu, 29 Aug 2019 11:50:57 +0200 Subject: [PATCH] [Event] Remove RawEvent --- lib/famedlysdk.dart | 1 - lib/src/AccountData.dart | 4 +- lib/src/Event.dart | 7 +- lib/src/Presence.dart | 4 +- lib/src/RawEvent.dart | 170 ----------------------------------- lib/src/RoomAccountData.dart | 4 +- lib/src/RoomState.dart | 155 ++++++++++++++++++++++++++------ test/Event_test.dart | 1 - 8 files changed, 138 insertions(+), 208 deletions(-) delete mode 100644 lib/src/RawEvent.dart diff --git a/lib/famedlysdk.dart b/lib/famedlysdk.dart index 1be5324..a9a1a65 100644 --- a/lib/famedlysdk.dart +++ b/lib/famedlysdk.dart @@ -33,7 +33,6 @@ export 'package:famedlysdk/src/utils/MxContent.dart'; export 'package:famedlysdk/src/Client.dart'; export 'package:famedlysdk/src/Connection.dart'; export 'package:famedlysdk/src/Event.dart'; -export 'package:famedlysdk/src/RawEvent.dart'; export 'package:famedlysdk/src/Room.dart'; export 'package:famedlysdk/src/RoomList.dart'; export 'package:famedlysdk/src/RoomState.dart'; diff --git a/lib/src/AccountData.dart b/lib/src/AccountData.dart index ccb9059..b3a0a96 100644 --- a/lib/src/AccountData.dart +++ b/lib/src/AccountData.dart @@ -21,7 +21,7 @@ * along with famedlysdk. If not, see . */ -import 'package:famedlysdk/src/RawEvent.dart'; +import 'package:famedlysdk/src/RoomState.dart'; class AccountData { /// The json payload of the content. The content highly depends on the type. @@ -35,7 +35,7 @@ class AccountData { /// Get a State event from a table row or from the event stream. factory AccountData.fromJson(Map jsonPayload) { final Map content = - RawEvent.getMapFromPayload(jsonPayload['content']); + RoomState.getMapFromPayload(jsonPayload['content']); return AccountData(content: content, typeKey: jsonPayload['type']); } } diff --git a/lib/src/Event.dart b/lib/src/Event.dart index ea15635..25a9d86 100644 --- a/lib/src/Event.dart +++ b/lib/src/Event.dart @@ -26,7 +26,6 @@ import 'package:famedlysdk/src/sync/EventUpdate.dart'; import 'package:famedlysdk/src/utils/ChatTime.dart'; import './Room.dart'; -import './RawEvent.dart'; /// Defines a timeline event for a room. class Event extends RoomState { @@ -66,11 +65,11 @@ class Event extends RoomState { /// Get a State event from a table row or from the event stream. factory Event.fromJson(Map jsonPayload, Room room) { final Map content = - RawEvent.getMapFromPayload(jsonPayload['content']); + RoomState.getMapFromPayload(jsonPayload['content']); final Map unsigned = - RawEvent.getMapFromPayload(jsonPayload['unsigned']); + RoomState.getMapFromPayload(jsonPayload['unsigned']); final Map prevContent = - RawEvent.getMapFromPayload(jsonPayload['prev_content']); + RoomState.getMapFromPayload(jsonPayload['prev_content']); return Event( status: jsonPayload['status'] ?? defaultStatus, content: content, diff --git a/lib/src/Presence.dart b/lib/src/Presence.dart index 2014519..124087a 100644 --- a/lib/src/Presence.dart +++ b/lib/src/Presence.dart @@ -22,7 +22,7 @@ */ import 'package:famedlysdk/src/AccountData.dart'; -import 'package:famedlysdk/src/RawEvent.dart'; +import 'package:famedlysdk/src/RoomState.dart'; class Presence extends AccountData { /// The user who has sent this event if it is not a global account data event. @@ -34,7 +34,7 @@ class Presence extends AccountData { /// Get a State event from a table row or from the event stream. factory Presence.fromJson(Map jsonPayload) { final Map content = - RawEvent.getMapFromPayload(jsonPayload['content']); + RoomState.getMapFromPayload(jsonPayload['content']); return Presence( content: content, typeKey: jsonPayload['type'], diff --git a/lib/src/RawEvent.dart b/lib/src/RawEvent.dart deleted file mode 100644 index 5737588..0000000 --- a/lib/src/RawEvent.dart +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2019 Zender & Kurtz GbR. - * - * Authors: - * Christian Pauly - * Marcel Radzio - * - * This file is part of famedlysdk. - * - * famedlysdk is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * famedlysdk is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with famedlysdk. If not, see . - */ - -import 'dart:convert'; -import 'package:famedlysdk/famedlysdk.dart'; -import 'package:famedlysdk/src/utils/ChatTime.dart'; -import './Room.dart'; - -class RawEvent { - /// The Matrix ID for this event in the format '$localpart:server.abc'. Please not - /// that account data, presence and other events may not have an eventId. - final String eventId; - - /// The json payload of the content. The content highly depends on the type. - final Map content; - - /// The type String of this event. For example 'm.room.message'. - final String typeKey; - - /// The ID of the room this event belongs to. - final String roomId; - - /// The user who has sent this event if it is not a global account data event. - final String senderId; - - User get sender => room.states[senderId]?.asUser ?? User(senderId); - - /// The time this event has received at the server. May be null for events like - /// account data. - final ChatTime time; - - /// Optional additional content for this event. - final Map unsigned; - - /// The room this event belongs to. May be null. - final Room room; - - RawEvent( - {this.content, - this.typeKey, - this.eventId, - this.roomId, - this.senderId, - this.time, - this.unsigned, - this.room}); - - static Map getMapFromPayload(dynamic payload) { - if (payload is String) - try { - return json.decode(payload); - } catch (e) { - return {}; - } - if (payload is Map) return payload; - return {}; - } - - /// Get a State event from a table row or from the event stream. - factory RawEvent.fromJson(Map jsonPayload, Room room) { - final Map content = - getMapFromPayload(jsonPayload['content']); - final Map unsigned = - getMapFromPayload(jsonPayload['unsigned']); - return RawEvent( - content: content, - typeKey: jsonPayload['type'], - eventId: jsonPayload['event_id'], - roomId: jsonPayload['room_id'], - senderId: jsonPayload['sender'], - time: ChatTime(jsonPayload['origin_server_ts']), - unsigned: unsigned, - room: room); - } - - /// Get the real type. - EventTypes get type { - switch (typeKey) { - case "m.room.avatar": - return EventTypes.RoomAvatar; - case "m.room.name": - return EventTypes.RoomName; - case "m.room.topic": - return EventTypes.RoomTopic; - case "m.room.Aliases": - return EventTypes.RoomAliases; - case "m.room.canonical_alias": - return EventTypes.RoomCanonicalAlias; - case "m.room.create": - return EventTypes.RoomCreate; - case "m.room.join_rules": - return EventTypes.RoomJoinRules; - case "m.room.member": - return EventTypes.RoomMember; - case "m.room.power_levels": - return EventTypes.RoomPowerLevels; - case "m.room.guest_access": - return EventTypes.GuestAccess; - case "m.room.history_visibility": - return EventTypes.HistoryVisibility; - case "m.room.message": - switch (content["msgtype"] ?? "m.text") { - case "m.text": - if (content.containsKey("m.relates_to")) { - return EventTypes.Reply; - } - return EventTypes.Text; - case "m.notice": - return EventTypes.Notice; - case "m.emote": - return EventTypes.Emote; - case "m.image": - return EventTypes.Image; - case "m.video": - return EventTypes.Video; - case "m.audio": - return EventTypes.Audio; - case "m.file": - return EventTypes.File; - case "m.location": - return EventTypes.Location; - } - } - return EventTypes.Unknown; - } -} - -enum EventTypes { - Text, - Emote, - Notice, - Image, - Video, - Audio, - File, - Location, - Reply, - RoomAliases, - RoomCanonicalAlias, - RoomCreate, - RoomJoinRules, - RoomMember, - RoomPowerLevels, - RoomName, - RoomTopic, - RoomAvatar, - GuestAccess, - HistoryVisibility, - Unknown, -} diff --git a/lib/src/RoomAccountData.dart b/lib/src/RoomAccountData.dart index 5b1f416..919dcfa 100644 --- a/lib/src/RoomAccountData.dart +++ b/lib/src/RoomAccountData.dart @@ -23,7 +23,7 @@ import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/src/AccountData.dart'; -import 'package:famedlysdk/src/RawEvent.dart'; +import 'package:famedlysdk/src/RoomState.dart'; class RoomAccountData extends AccountData { /// The user who has sent this event if it is not a global account data event. @@ -39,7 +39,7 @@ class RoomAccountData extends AccountData { factory RoomAccountData.fromJson( Map jsonPayload, Room room) { final Map content = - RawEvent.getMapFromPayload(jsonPayload['content']); + RoomState.getMapFromPayload(jsonPayload['content']); return RoomAccountData( content: content, typeKey: jsonPayload['type'], diff --git a/lib/src/RoomState.dart b/lib/src/RoomState.dart index aa086d6..d1addab 100644 --- a/lib/src/RoomState.dart +++ b/lib/src/RoomState.dart @@ -20,13 +20,41 @@ * You should have received a copy of the GNU General Public License * along with famedlysdk. If not, see . */ + +import 'dart:convert'; import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/src/utils/ChatTime.dart'; - import './Room.dart'; -import './RawEvent.dart'; -class RoomState extends RawEvent { +class RoomState { + /// The Matrix ID for this event in the format '$localpart:server.abc'. Please not + /// that account data, presence and other events may not have an eventId. + final String eventId; + + /// The json payload of the content. The content highly depends on the type. + final Map content; + + /// The type String of this event. For example 'm.room.message'. + final String typeKey; + + /// The ID of the room this event belongs to. + final String roomId; + + /// The user who has sent this event if it is not a global account data event. + final String senderId; + + User get sender => room.states[senderId]?.asUser ?? User(senderId); + + /// The time this event has received at the server. May be null for events like + /// account data. + final ChatTime time; + + /// Optional additional content for this event. + final Map unsigned; + + /// The room this event belongs to. May be null. + final Room room; + /// Optional. The previous content for this state. /// This will be present only for state events appearing in the timeline. /// If this is not a state event, or there is no previous content, this key will be null. @@ -36,37 +64,37 @@ class RoomState extends RawEvent { /// the overwriting semantics for this piece of room state. final String stateKey; - User get stateKeyUser => room.states[stateKey]?.asUser ?? User(stateKey); - RoomState( - {this.prevContent, + {this.content, + this.typeKey, + this.eventId, + this.roomId, + this.senderId, + this.time, + this.unsigned, + this.prevContent, this.stateKey, - dynamic content, - String typeKey, - String eventId, - String roomId, - String senderId, - ChatTime time, - dynamic unsigned, - Room room}) - : super( - content: content, - typeKey: typeKey, - eventId: eventId, - roomId: roomId, - senderId: senderId, - time: time, - unsigned: unsigned, - room: room); + this.room}); + + static Map getMapFromPayload(dynamic payload) { + if (payload is String) + try { + return json.decode(payload); + } catch (e) { + return {}; + } + if (payload is Map) return payload; + return {}; + } /// Get a State event from a table row or from the event stream. factory RoomState.fromJson(Map jsonPayload, Room room) { final Map content = - RawEvent.getMapFromPayload(jsonPayload['content']); + RoomState.getMapFromPayload(jsonPayload['content']); final Map unsigned = - RawEvent.getMapFromPayload(jsonPayload['unsigned']); + RoomState.getMapFromPayload(jsonPayload['unsigned']); final Map prevContent = - RawEvent.getMapFromPayload(jsonPayload['prev_content']); + RoomState.getMapFromPayload(jsonPayload['prev_content']); return RoomState( stateKey: jsonPayload['state_key'], prevContent: prevContent, @@ -107,4 +135,79 @@ class RoomState extends RawEvent { time: time, unsigned: unsigned, room: room); + + /// Get the real type. + EventTypes get type { + switch (typeKey) { + case "m.room.avatar": + return EventTypes.RoomAvatar; + case "m.room.name": + return EventTypes.RoomName; + case "m.room.topic": + return EventTypes.RoomTopic; + case "m.room.Aliases": + return EventTypes.RoomAliases; + case "m.room.canonical_alias": + return EventTypes.RoomCanonicalAlias; + case "m.room.create": + return EventTypes.RoomCreate; + case "m.room.join_rules": + return EventTypes.RoomJoinRules; + case "m.room.member": + return EventTypes.RoomMember; + case "m.room.power_levels": + return EventTypes.RoomPowerLevels; + case "m.room.guest_access": + return EventTypes.GuestAccess; + case "m.room.history_visibility": + return EventTypes.HistoryVisibility; + case "m.room.message": + switch (content["msgtype"] ?? "m.text") { + case "m.text": + if (content.containsKey("m.relates_to")) { + return EventTypes.Reply; + } + return EventTypes.Text; + case "m.notice": + return EventTypes.Notice; + case "m.emote": + return EventTypes.Emote; + case "m.image": + return EventTypes.Image; + case "m.video": + return EventTypes.Video; + case "m.audio": + return EventTypes.Audio; + case "m.file": + return EventTypes.File; + case "m.location": + return EventTypes.Location; + } + } + return EventTypes.Unknown; + } +} + +enum EventTypes { + Text, + Emote, + Notice, + Image, + Video, + Audio, + File, + Location, + Reply, + RoomAliases, + RoomCanonicalAlias, + RoomCreate, + RoomJoinRules, + RoomMember, + RoomPowerLevels, + RoomName, + RoomTopic, + RoomAvatar, + GuestAccess, + HistoryVisibility, + Unknown, } diff --git a/test/Event_test.dart b/test/Event_test.dart index 980b589..3d32bf4 100644 --- a/test/Event_test.dart +++ b/test/Event_test.dart @@ -24,7 +24,6 @@ import 'dart:convert'; import 'package:famedlysdk/famedlysdk.dart'; -import 'package:famedlysdk/src/RawEvent.dart'; import 'package:famedlysdk/src/RoomState.dart'; import 'package:flutter_test/flutter_test.dart';