TUIC2CChatViewController_Minimalist.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // TUIC2CChatViewController_Minimalist.m
  3. // TXIMSDK_TUIKit_iOS
  4. //
  5. // Created by kayev on 2021/6/17.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. #import "TUIC2CChatViewController_Minimalist.h"
  9. #import "TUIBaseChatViewController_Minimalist+ProtectedAPI.h"
  10. #import "TUIChatConfig.h"
  11. #import "TUICloudCustomDataTypeCenter.h"
  12. #import "TUILinkCellData.h"
  13. #import "TUIMessageController_Minimalist.h"
  14. #import "TUIMessageDataProvider.h"
  15. #define kC2CTypingTime 30.0
  16. @interface TUIC2CChatViewController_Minimalist ()
  17. // If one sendTypingBaseCondation is satisfied, sendTypingBaseCondationInVC is used until the current session exits
  18. @property(nonatomic, assign) BOOL sendTypingBaseCondationInVC;
  19. @end
  20. @implementation TUIC2CChatViewController_Minimalist
  21. - (void)dealloc {
  22. self.sendTypingBaseCondationInVC = NO;
  23. }
  24. - (void)viewDidLoad {
  25. [super viewDidLoad];
  26. // Do any additional setup after loading the view.
  27. self.sendTypingBaseCondationInVC = NO;
  28. }
  29. #pragma mark - Override Methods
  30. - (NSString *)forwardTitleWithMyName:(NSString *)nameStr {
  31. NSString *title = [NSString stringWithFormat:TIMCommonLocalizableString(TUIKitRelayChatHistoryForSomebodyFormat), self.conversationData.title, nameStr];
  32. return rtlString(title);
  33. }
  34. - (void)inputControllerDidInputAt:(TUIInputController_Minimalist *)inputController {
  35. [super inputControllerDidInputAt:inputController];
  36. NSAttributedString *spaceString = [[NSAttributedString alloc]
  37. initWithString:@"@"
  38. attributes:@{NSFontAttributeName : kTUIInputNoramlFont, NSForegroundColorAttributeName : kTUIInputNormalTextColor}];
  39. [self.inputController.inputBar addWordsToInputBar:spaceString];
  40. }
  41. - (void)inputControllerBeginTyping:(TUIInputController_Minimalist *)inputController {
  42. [super inputControllerBeginTyping:inputController];
  43. [self sendTypingMsgByStatus:YES];
  44. }
  45. - (void)inputControllerEndTyping:(TUIInputController_Minimalist *)inputController {
  46. [super inputControllerEndTyping:inputController];
  47. [self sendTypingMsgByStatus:NO];
  48. }
  49. - (BOOL)sendTypingBaseCondation {
  50. if (self.sendTypingBaseCondationInVC) {
  51. return YES;
  52. }
  53. if ([self.messageController isKindOfClass:TUIMessageController_Minimalist.class]) {
  54. TUIMessageController_Minimalist *vc = (TUIMessageController_Minimalist *)self.messageController;
  55. NSDictionary *messageFeatureDic = (id)[vc.C2CIncomingLastMsg parseCloudCustomData:messageFeature];
  56. if (messageFeatureDic && [messageFeatureDic isKindOfClass:[NSDictionary class]] && [messageFeatureDic.allKeys containsObject:@"needTyping"] &&
  57. [messageFeatureDic.allKeys containsObject:@"version"]) {
  58. BOOL needTyping = NO;
  59. BOOL versionControl = NO;
  60. BOOL timeControl = NO;
  61. if ([messageFeatureDic[@"needTyping"] intValue] == 1) {
  62. needTyping = YES;
  63. }
  64. if ([messageFeatureDic[@"version"] intValue] == 1) {
  65. versionControl = YES;
  66. }
  67. CFTimeInterval current = [NSDate.new timeIntervalSince1970];
  68. long currentTimeFloor = floor(current);
  69. long otherSideTimeFloor = floor([vc.C2CIncomingLastMsg.timestamp timeIntervalSince1970]);
  70. long interval = currentTimeFloor - otherSideTimeFloor;
  71. if (interval <= kC2CTypingTime) {
  72. timeControl = YES;
  73. }
  74. if (needTyping && versionControl && timeControl) {
  75. self.sendTypingBaseCondationInVC = YES;
  76. return YES;
  77. }
  78. }
  79. }
  80. return NO;
  81. }
  82. - (void)sendTypingMsgByStatus:(BOOL)editing {
  83. // switch control
  84. if (![TUIChatConfig defaultConfig].enableTypingStatus) {
  85. return;
  86. }
  87. if (![self sendTypingBaseCondation]) {
  88. return;
  89. }
  90. NSError *error = nil;
  91. NSDictionary *param = @{
  92. BussinessID : BussinessID_Typing,
  93. @"typingStatus" : editing ? @1 : @0,
  94. @"version" : @1,
  95. @"userAction" : @14,
  96. @"actionParam" : editing ? @"EIMAMSG_InputStatus_Ing" : @"EIMAMSG_InputStatus_End",
  97. };
  98. NSData *data = [NSJSONSerialization dataWithJSONObject:param options:0 error:&error];
  99. V2TIMMessage *msg = [TUIMessageDataProvider getCustomMessageWithJsonData:data];
  100. [msg setIsExcludedFromContentModeration:YES];
  101. TUISendMessageAppendParams *appendParams = [[TUISendMessageAppendParams alloc] init];
  102. appendParams.isSendPushInfo = NO;
  103. appendParams.isOnlineUserOnly = YES;
  104. appendParams.priority = V2TIM_PRIORITY_DEFAULT;
  105. [TUIMessageDataProvider sendMessage:msg
  106. toConversation:self.conversationData
  107. appendParams:appendParams
  108. Progress:^(uint32_t progress) {
  109. }
  110. SuccBlock:^{
  111. NSLog(@"success");
  112. }
  113. FailBlock:^(int code, NSString *desc) {
  114. NSLog(@"Fail");
  115. }];
  116. }
  117. @end