Skip to content

Commit 78915f3

Browse files
committed
api: Add update_message_flags events
1 parent 7834dce commit 78915f3

File tree

3 files changed

+190
-1
lines changed

3 files changed

+190
-1
lines changed

lib/api/model/events.dart

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ sealed class Event {
4040
case 'message': return MessageEvent.fromJson(json);
4141
case 'update_message': return UpdateMessageEvent.fromJson(json);
4242
case 'delete_message': return DeleteMessageEvent.fromJson(json);
43+
case 'update_message_flags':
44+
switch (json['op'] as String) {
45+
case 'add': return UpdateMessageFlagsAddEvent.fromJson(json);
46+
case 'remove': return UpdateMessageFlagsRemoveEvent.fromJson(json);
47+
default: return UnexpectedEvent.fromJson(json);
48+
}
4349
case 'reaction': return ReactionEvent.fromJson(json);
4450
case 'heartbeat': return HeartbeatEvent.fromJson(json);
4551
// TODO add many more event types
@@ -439,13 +445,122 @@ class DeleteMessageEvent extends Event {
439445
Map<String, dynamic> toJson() => _$DeleteMessageEventToJson(this);
440446
}
441447

442-
/// As in [DeleteMessageEvent.messageType].
448+
/// As in [DeleteMessageEvent.messageType]
449+
/// or [UpdateMessageFlagsMessageDetail.type].
443450
@JsonEnum(fieldRename: FieldRename.snake)
444451
enum MessageType {
445452
stream,
446453
private;
447454
}
448455

456+
/// A Zulip event of type `update_message_flags`.
457+
///
458+
/// For the corresponding API docs, see subclasses.
459+
sealed class UpdateMessageFlagsEvent extends Event {
460+
@override
461+
@JsonKey(includeToJson: true)
462+
String get type => 'update_message_flags';
463+
464+
String get op;
465+
466+
@JsonKey(unknownEnumValue: MessageFlag.unknown)
467+
final MessageFlag flag;
468+
final List<int> messages;
469+
final bool all;
470+
471+
UpdateMessageFlagsEvent({
472+
required super.id,
473+
required this.flag,
474+
required this.messages,
475+
required this.all,
476+
});
477+
}
478+
479+
/// An [UpdateMessageFlagsEvent] with op `add`: https://zulip.com/api/get-events#update_message_flags-add
480+
@JsonSerializable(fieldRename: FieldRename.snake)
481+
class UpdateMessageFlagsAddEvent extends UpdateMessageFlagsEvent {
482+
@override
483+
String get op => 'add';
484+
485+
UpdateMessageFlagsAddEvent({
486+
required super.id,
487+
required super.flag,
488+
required super.messages,
489+
required super.all,
490+
});
491+
492+
factory UpdateMessageFlagsAddEvent.fromJson(Map<String, dynamic> json) =>
493+
_$UpdateMessageFlagsAddEventFromJson(json);
494+
495+
@override
496+
Map<String, dynamic> toJson() => _$UpdateMessageFlagsAddEventToJson(this);
497+
}
498+
499+
/// An [UpdateMessageFlagsEvent] with op `remove`: https://zulip.com/api/get-events#update_message_flags-remove
500+
@JsonSerializable(fieldRename: FieldRename.snake)
501+
class UpdateMessageFlagsRemoveEvent extends UpdateMessageFlagsEvent {
502+
@override
503+
String get op => 'remove';
504+
505+
final Map<int, UpdateMessageFlagsMessageDetail>? messageDetails;
506+
507+
UpdateMessageFlagsRemoveEvent({
508+
required super.id,
509+
required super.flag,
510+
required super.messages,
511+
required super.all,
512+
required this.messageDetails,
513+
});
514+
515+
factory UpdateMessageFlagsRemoveEvent.fromJson(Map<String, dynamic> json) {
516+
final result = _$UpdateMessageFlagsRemoveEventFromJson(json);
517+
// Crunchy-shell validation
518+
if (
519+
result.flag == MessageFlag.read
520+
&& true // (we assume `event_types` has `message` and `update_message_flags`)
521+
) {
522+
result.messageDetails as Map<int, UpdateMessageFlagsMessageDetail>;
523+
}
524+
return result;
525+
}
526+
527+
@override
528+
Map<String, dynamic> toJson() => _$UpdateMessageFlagsRemoveEventToJson(this);
529+
}
530+
531+
/// As in [UpdateMessageFlagsRemoveEvent.messageDetails].
532+
@JsonSerializable(fieldRename: FieldRename.snake)
533+
class UpdateMessageFlagsMessageDetail {
534+
final MessageType type;
535+
final bool? mentioned;
536+
final List<int>? userIds;
537+
final int? streamId;
538+
final String? topic;
539+
540+
UpdateMessageFlagsMessageDetail({
541+
required this.type,
542+
required this.mentioned,
543+
required this.userIds,
544+
required this.streamId,
545+
required this.topic,
546+
});
547+
548+
factory UpdateMessageFlagsMessageDetail.fromJson(Map<String, dynamic> json) {
549+
final result = _$UpdateMessageFlagsMessageDetailFromJson(json);
550+
// Crunchy-shell validation
551+
switch (result.type) {
552+
case MessageType.stream:
553+
result.streamId as int;
554+
result.topic as String;
555+
case MessageType.private:
556+
result.userIds as List<int>;
557+
}
558+
return result;
559+
}
560+
561+
Map<String, dynamic> toJson() => _$UpdateMessageFlagsMessageDetailToJson(this);
562+
}
563+
449564
/// A Zulip event of type `reaction`, with op `add` or `remove`.
450565
///
451566
/// See:

lib/api/model/events.g.dart

Lines changed: 71 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/model/store.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ class PerAccountStore extends ChangeNotifier {
309309
} else if (event is DeleteMessageEvent) {
310310
assert(debugLog("server event: delete_message ${event.messageIds}"));
311311
// TODO handle
312+
} else if (event is UpdateMessageFlagsEvent) {
313+
assert(debugLog("server event: update_message_flags/${event.op} ${event.flag.toJson()}"));
314+
// TODO handle
312315
} else if (event is ReactionEvent) {
313316
assert(debugLog("server event: reaction/${event.op}"));
314317
for (final view in _messageListViews) {

0 commit comments

Comments
 (0)