From 7e2c90381cec10255c0cd18f7e11689d652f016a Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 16 May 2026 11:03:29 -0400 Subject: [PATCH] add quite a few more content types --- lib/models/content/avatar.dart | 14 ++++++++++ lib/models/content/content.dart | 12 +++++++++ lib/models/content/encryption.dart | 23 ++++++++++++++++ lib/models/content/name.dart | 13 +++++++++ lib/models/content/power_levels.dart | 38 ++++++++++++++++++++++++++ lib/models/content/server_acl.dart | 18 +++++++++++++ lib/models/content/topic.dart | 40 ++++++++++++++++++++++++++++ lib/models/event.dart | 2 +- 8 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 lib/models/content/avatar.dart create mode 100644 lib/models/content/encryption.dart create mode 100644 lib/models/content/name.dart create mode 100644 lib/models/content/power_levels.dart create mode 100644 lib/models/content/server_acl.dart create mode 100644 lib/models/content/topic.dart diff --git a/lib/models/content/avatar.dart b/lib/models/content/avatar.dart new file mode 100644 index 0000000..650e2e6 --- /dev/null +++ b/lib/models/content/avatar.dart @@ -0,0 +1,14 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +import "package:nexus/models/info/image.dart"; +part "avatar.freezed.dart"; +part "avatar.g.dart"; + +@freezed +abstract class AvatarContent extends Content with _$AvatarContent { + AvatarContent._(); + const factory AvatarContent({ImageInfo? info, Uri? url}) = _AvatarContent; + + factory AvatarContent.fromJson(Map json) => + _$AvatarContentFromJson(json); +} diff --git a/lib/models/content/content.dart b/lib/models/content/content.dart index beff225..5d3820f 100644 --- a/lib/models/content/content.dart +++ b/lib/models/content/content.dart @@ -1,10 +1,16 @@ import "package:collection/collection.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/avatar.dart"; import "package:nexus/models/content/canonical_alias.dart"; import "package:nexus/models/content/create.dart"; +import "package:nexus/models/content/encryption.dart"; import "package:nexus/models/content/join_rules.dart"; import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/message.dart"; +import "package:nexus/models/content/name.dart"; +import "package:nexus/models/content/power_levels.dart"; +import "package:nexus/models/content/server_acl.dart"; +import "package:nexus/models/content/topic.dart"; class Content { Content(); @@ -22,10 +28,16 @@ class Content { @JsonEnum(valueField: "type") enum EventType { encrypted("m.room.encrypted", Content.fromJson), + encryption("m.room.encryption", EncryptionContent.fromJson), membership("m.room.member", MembershipContent.fromJson), create("m.room.create", CreateContent.fromJson), canonicalAlias("m.room.canonical_alias", CanonicalAliasContent.fromJson), joinRules("m.room.join_rules", JoinRulesContent.fromJson), + powerLevels("m.room.power_levels", PowerLevelsContent.fromJson), + serverACL("m.room.server_acl", ServerACLContent.fromJson), + avatar("m.room.avatar", AvatarContent.fromJson), + topic("m.room.topic", TopicContent.fromJson), + name("m.room.name", NameContent.fromJson), message("m.room.message", MessageContent.fromJson); final String type; diff --git a/lib/models/content/encryption.dart b/lib/models/content/encryption.dart new file mode 100644 index 0000000..0fea339 --- /dev/null +++ b/lib/models/content/encryption.dart @@ -0,0 +1,23 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +part "encryption.freezed.dart"; +part "encryption.g.dart"; + +@freezed +abstract class EncryptionContent extends Content with _$EncryptionContent { + EncryptionContent._(); + const factory EncryptionContent({ + required String algorithm, + + @JsonKey(name: "rotation_period_ms") + @Default(604800000) + int rotationPeriodMS, + + @JsonKey(name: "rotation_period_msgs") + @Default(100) + int rotationPeriodMessages, + }) = _EncryptionContent; + + factory EncryptionContent.fromJson(Map json) => + _$EncryptionContentFromJson(json); +} diff --git a/lib/models/content/name.dart b/lib/models/content/name.dart new file mode 100644 index 0000000..35bac40 --- /dev/null +++ b/lib/models/content/name.dart @@ -0,0 +1,13 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +part "name.freezed.dart"; +part "name.g.dart"; + +@freezed +abstract class NameContent extends Content with _$NameContent { + NameContent._(); + const factory NameContent({required String name}) = _NameContent; + + factory NameContent.fromJson(Map json) => + _$NameContentFromJson(json); +} diff --git a/lib/models/content/power_levels.dart b/lib/models/content/power_levels.dart new file mode 100644 index 0000000..f2ab876 --- /dev/null +++ b/lib/models/content/power_levels.dart @@ -0,0 +1,38 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; + +part "power_levels.freezed.dart"; +part "power_levels.g.dart"; + +@freezed +abstract class PowerLevelsContent extends Content with _$PowerLevelsContent { + PowerLevelsContent._(); + + const factory PowerLevelsContent({ + @Default(IMap.empty()) IMap events, + @Default(IMap.empty()) IMap users, + Notifications? notifications, + @Default(50) int ban, + @Default(0) int eventsDefault, + @Default(0) int invite, + @Default(50) int kick, + @Default(50) int redact, + @Default(50) int stateDefault, + @Default(0) int usersDefault, + }) = _PowerLevelsContent; + + factory PowerLevelsContent.fromJson(Map json) => + _$PowerLevelsContentFromJson(json); +} + +@freezed +abstract class Notifications with _$Notifications { + const factory Notifications({ + @Default(50) int room, + @Default(IMapConst({})) IMap other, + }) = _Notifications; + + factory Notifications.fromJson(Map json) => + _$NotificationsFromJson(json); +} diff --git a/lib/models/content/server_acl.dart b/lib/models/content/server_acl.dart new file mode 100644 index 0000000..6ee5fea --- /dev/null +++ b/lib/models/content/server_acl.dart @@ -0,0 +1,18 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +part "server_acl.freezed.dart"; +part "server_acl.g.dart"; + +@freezed +abstract class ServerACLContent extends Content with _$ServerACLContent { + ServerACLContent._(); + const factory ServerACLContent({ + @Default(IList.empty()) IList allow, + @Default(IList.empty()) IList deny, + @Default(true) allowIpLiterals, + }) = _ServerACLContent; + + factory ServerACLContent.fromJson(Map json) => + _$ServerACLContentFromJson(json); +} diff --git a/lib/models/content/topic.dart b/lib/models/content/topic.dart new file mode 100644 index 0000000..ee561c7 --- /dev/null +++ b/lib/models/content/topic.dart @@ -0,0 +1,40 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +part "topic.freezed.dart"; +part "topic.g.dart"; + +@freezed +abstract class TopicContent extends Content with _$TopicContent { + TopicContent._(); + const factory TopicContent({ + required String topic, + @JsonKey(name: "m.topic") TopicContentBlock? content, + }) = _TopicContent; + + factory TopicContent.fromJson(Map json) => + _$TopicContentFromJson(json); +} + +@freezed +abstract class TopicContentBlock with _$TopicContentBlock { + const factory TopicContentBlock({ + @Default(IList.empty()) + @JsonKey(name: "m.text") + IList representations, + }) = _TopicContentBlock; + + factory TopicContentBlock.fromJson(Map json) => + _$TopicContentBlockFromJson(json); +} + +@freezed +abstract class TextualRepresentation with _$TextualRepresentation { + const factory TextualRepresentation({ + required String body, + @Default("text/plain") String mimetype, + }) = _TextualRepresentation; + + factory TextualRepresentation.fromJson(Map json) => + _$TextualRepresentationFromJson(json); +} diff --git a/lib/models/event.dart b/lib/models/event.dart index 7fbf729..798b505 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -19,7 +19,7 @@ abstract class Event with _$Event { required String roomId, required String eventId, required String sender, - required String type, + required EventType type, String? stateKey, @EpochDateTimeConverter() required DateTime timestamp, IMap? decrypted,