NCPushNotification.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. #import "NCPushNotification.h"
  6. @implementation NCPushNotification
  7. NSString * const kNCPNAppKey = @"app";
  8. NSString * const kNCPNAppIdKey = @"spreed";
  9. NSString * const kNCPNTypeKey = @"type";
  10. NSString * const kNCPNSubjectKey = @"subject";
  11. NSString * const kNCPNIdKey = @"id";
  12. NSString * const kNCPNNotifIdKey = @"nid";
  13. NSString * const kNCPNNotifIdsKey = @"nids";
  14. NSString * const kNCPNTypeCallKey = @"call";
  15. NSString * const kNCPNTypeRoomKey = @"room";
  16. NSString * const kNCPNTypeChatKey = @"chat";
  17. NSString * const kNCPNTypeDeleteKey = @"delete";
  18. NSString * const kNCPNTypeDeleteAllKey = @"delete-all";
  19. NSString * const kNCPNTypeDeleteMultipleKey = @"delete-multiple";
  20. NSString * const kNCPNTypeRecording = @"recording";
  21. NSString * const kNCPNTypeFederation = @"remote_talk_share";
  22. NSString * const kNCPNTypeReminder = @"reminder";
  23. NSString * const kNCPNAppIdAdminNotificationKey = @"admin_notification_talk";
  24. NSString * const NCPushNotificationJoinChatNotification = @"NCPushNotificationJoinChatNotification";
  25. NSString * const NCPushNotificationJoinAudioCallAcceptedNotification = @"NCPushNotificationJoinAudioCallAcceptedNotification";
  26. NSString * const NCPushNotificationJoinVideoCallAcceptedNotification = @"NCPushNotificationJoinVideoCallAcceptedNotification";
  27. + (instancetype)pushNotificationFromDecryptedString:(NSString *)decryptedString withAccountId:(NSString *)accountId
  28. {
  29. if (!decryptedString) {
  30. return nil;
  31. }
  32. NSData *data = [decryptedString dataUsingEncoding:NSUTF8StringEncoding];
  33. id jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
  34. NSString *app = [jsonDict objectForKey:kNCPNAppKey];
  35. if (![app isEqualToString:kNCPNAppIdKey]) {
  36. return [self nonTalkPushNotification:jsonDict withAccountId:accountId];
  37. }
  38. NCPushNotification *pushNotification = [[NCPushNotification alloc] init];
  39. pushNotification.app = app;
  40. pushNotification.subject = [jsonDict objectForKey:kNCPNSubjectKey];
  41. pushNotification.roomToken = [jsonDict objectForKey:kNCPNIdKey];
  42. pushNotification.notificationId = [[jsonDict objectForKey:kNCPNNotifIdKey] integerValue];
  43. NSString *type = [jsonDict objectForKey:kNCPNTypeKey];
  44. pushNotification.type = NCPushNotificationTypeUnknown;
  45. if ([type isEqualToString:kNCPNTypeCallKey]) {
  46. pushNotification.type = NCPushNotificationTypeCall;
  47. } else if ([type isEqualToString:kNCPNTypeRoomKey]) {
  48. pushNotification.type = NCPushNotificationTypeRoom;
  49. } else if ([type isEqualToString:kNCPNTypeChatKey]) {
  50. pushNotification.type = NCPushNotificationTypeChat;
  51. } else if ([type isEqualToString:kNCPNTypeRecording]) {
  52. pushNotification.type = NCPushNotificationTypeRecording;
  53. } else if ([type isEqualToString:kNCPNTypeFederation]) {
  54. pushNotification.type = NCPUshNotificationTypeFederation;
  55. } else if ([type isEqualToString:kNCPNTypeReminder]) {
  56. pushNotification.type = NCPushNotificationTypeReminder;
  57. }
  58. pushNotification.accountId = accountId;
  59. pushNotification.jsonString = decryptedString;
  60. return pushNotification;
  61. }
  62. + (instancetype)nonTalkPushNotification:(id)jsonNotification withAccountId:(NSString *)accountId
  63. {
  64. NCPushNotification *pushNotification = [[NCPushNotification alloc] init];
  65. if ([jsonNotification objectForKey:kNCPNTypeDeleteKey]) {
  66. pushNotification.notificationId = [[jsonNotification objectForKey:kNCPNNotifIdKey] integerValue];
  67. pushNotification.type = NCPushNotificationTypeDelete;
  68. } else if ([jsonNotification objectForKey:kNCPNTypeDeleteAllKey]) {
  69. pushNotification.type = NCPushNotificationTypeDeleteAll;
  70. } else if ([jsonNotification objectForKey:kNCPNTypeDeleteMultipleKey]) {
  71. pushNotification.notificationIds = [jsonNotification objectForKey:kNCPNNotifIdsKey];
  72. pushNotification.type = NCPushNotificationTypeDeleteMultiple;
  73. } else {
  74. NSString *app = [jsonNotification objectForKey:kNCPNAppKey];
  75. if (![app isEqualToString:kNCPNAppIdAdminNotificationKey]) {
  76. return nil;
  77. }
  78. pushNotification.subject = [jsonNotification objectForKey:kNCPNSubjectKey];
  79. pushNotification.notificationId = [[jsonNotification objectForKey:kNCPNNotifIdKey] integerValue];
  80. pushNotification.type = NCPushNotificationTypeAdminNotification;
  81. }
  82. pushNotification.accountId = accountId;
  83. return pushNotification;
  84. }
  85. - (NSString *)bodyForRemoteAlerts
  86. {
  87. switch (_type) {
  88. case NCPushNotificationTypeCall:
  89. return [NSString stringWithFormat:@"📞 %@", _subject];
  90. break;
  91. case NCPushNotificationTypeRoom:
  92. return [NSString stringWithFormat:@"🔔 %@", _subject];
  93. break;
  94. case NCPushNotificationTypeChat:
  95. return [NSString stringWithFormat:@"💬 %@", _subject];
  96. break;
  97. default:
  98. return _subject;
  99. break;
  100. }
  101. }
  102. @end