@@ -33,6 +33,12 @@ sealed class Event {
33
33
case 'message' : return MessageEvent .fromJson (json);
34
34
case 'update_message' : return UpdateMessageEvent .fromJson (json);
35
35
case 'delete_message' : return DeleteMessageEvent .fromJson (json);
36
+ case 'reaction' :
37
+ switch (json['op' ] as String ) {
38
+ case 'add' : return ReactionAddEvent .fromJson (json);
39
+ case 'remove' : return ReactionRemoveEvent .fromJson (json);
40
+ default : return UnexpectedEvent .fromJson (json);
41
+ }
36
42
case 'heartbeat' : return HeartbeatEvent .fromJson (json);
37
43
// TODO add many more event types
38
44
default : return UnexpectedEvent .fromJson (json);
@@ -363,6 +369,75 @@ enum MessageType {
363
369
private;
364
370
}
365
371
372
+ /// A Zulip event of type `reaction` .
373
+ abstract class ReactionEvent extends Event {
374
+ @override
375
+ @JsonKey (includeToJson: true )
376
+ String get type => 'reaction' ;
377
+
378
+ String get op;
379
+
380
+ ReactionEvent ({required super .id});
381
+ }
382
+
383
+ /// A [ReactionEvent] with op `add` : https://zulip.com/api/get-events#reaction-add
384
+ @JsonSerializable (fieldRename: FieldRename .snake)
385
+ class ReactionAddEvent extends ReactionEvent {
386
+ @override
387
+ String get op => 'add' ;
388
+
389
+ final String emojiName;
390
+ final String emojiCode;
391
+ final ReactionType reactionType;
392
+ final int userId;
393
+ // final Map<String, dynamic> user; // deprecated; ignore
394
+ final int messageId;
395
+
396
+ ReactionAddEvent ({
397
+ required super .id,
398
+ required this .emojiName,
399
+ required this .emojiCode,
400
+ required this .reactionType,
401
+ required this .userId,
402
+ required this .messageId,
403
+ });
404
+
405
+ factory ReactionAddEvent .fromJson (Map <String , dynamic > json) =>
406
+ _$ReactionAddEventFromJson (json);
407
+
408
+ @override
409
+ Map <String , dynamic > toJson () => _$ReactionAddEventToJson (this );
410
+ }
411
+
412
+ /// A [ReactionEvent] with op `remove` : https://zulip.com/api/get-events#reaction-remove
413
+ @JsonSerializable (fieldRename: FieldRename .snake)
414
+ class ReactionRemoveEvent extends ReactionEvent {
415
+ @override
416
+ String get op => 'remove' ;
417
+
418
+ final String emojiName;
419
+ final String emojiCode;
420
+ final ReactionType reactionType;
421
+ final int userId;
422
+ // final Map<String, dynamic> user; // deprecated; ignore
423
+ final int messageId;
424
+
425
+ ReactionRemoveEvent ({
426
+ required super .id,
427
+ required this .emojiName,
428
+ required this .emojiCode,
429
+ required this .reactionType,
430
+ required this .userId,
431
+ required this .messageId,
432
+ });
433
+
434
+ factory ReactionRemoveEvent .fromJson (Map <String , dynamic > json) =>
435
+ _$ReactionRemoveEventFromJson (json);
436
+
437
+ @override
438
+ Map <String , dynamic > toJson () => _$ReactionRemoveEventToJson (this );
439
+ }
440
+
366
441
@JsonSerializable (fieldRename: FieldRename .snake)
367
442
class HeartbeatEvent extends Event {
368
443
@override
0 commit comments