TUIC2CChatViewController.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. //
  2. // TUIC2CChatViewController.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.h"
  9. #import "TUIBaseChatViewController+ProtectedAPI.h"
  10. #import "TUIChatConfig.h"
  11. #import "TUICloudCustomDataTypeCenter.h"
  12. #import "TUILinkCellData.h"
  13. #import "TUIMessageController.h"
  14. #import "TUIMessageDataProvider.h"
  15. #define kC2CTypingTime 3000.0
  16. @interface TUIC2CChatViewController ()
  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
  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. // notify
  29. NSDictionary *param = @{TUICore_TUIChatNotify_ChatVC_ViewDidLoadSubKey_UserID: self.conversationData.userID ? : @""};
  30. [TUICore notifyEvent:TUICore_TUIChatNotify
  31. subKey:TUICore_TUIChatNotify_ChatVC_ViewDidLoadSubKey
  32. object:nil
  33. param:param];
  34. }
  35. #pragma mark - Override Methods
  36. - (void)inputControllerDidInputAt:(TUIInputController *)inputController {
  37. [super inputControllerDidInputAt:inputController];
  38. NSAttributedString *spaceString = [[NSAttributedString alloc]
  39. initWithString:@"@"
  40. attributes:@{NSFontAttributeName : kTUIInputNoramlFont, NSForegroundColorAttributeName : kTUIInputNormalTextColor}];
  41. [self.inputController.inputBar addWordsToInputBar:spaceString];
  42. }
  43. - (NSString *)forwardTitleWithMyName:(NSString *)nameStr {
  44. NSString *title = [NSString stringWithFormat:TIMCommonLocalizableString(TUIKitRelayChatHistoryForSomebodyFormat), self.conversationData.title, nameStr];
  45. return rtlString(title);
  46. }
  47. - (void)inputController:(TUIInputController *)inputController didSelectMoreCell:(TUIInputMoreCell *)cell {
  48. [super inputController:inputController didSelectMoreCell:cell];
  49. }
  50. - (void)inputControllerBeginTyping:(TUIInputController *)inputController {
  51. [super inputControllerBeginTyping:inputController];
  52. [self sendTypingMsgByStatus:YES];
  53. }
  54. - (void)inputControllerEndTyping:(TUIInputController *)inputController {
  55. [super inputControllerEndTyping:inputController];
  56. [self sendTypingMsgByStatus:NO];
  57. }
  58. - (BOOL)sendTypingBaseCondation {
  59. if (self.sendTypingBaseCondationInVC) {
  60. return YES;
  61. }
  62. if ([self.messageController isKindOfClass:TUIMessageController.class]) {
  63. TUIMessageController *vc = (TUIMessageController *)self.messageController;
  64. NSDictionary *messageFeatureDic = (id)[vc.C2CIncomingLastMsg parseCloudCustomData:messageFeature];
  65. if (messageFeatureDic && [messageFeatureDic isKindOfClass:[NSDictionary class]] && [messageFeatureDic.allKeys containsObject:@"needTyping"] &&
  66. [messageFeatureDic.allKeys containsObject:@"version"]) {
  67. BOOL needTyping = NO;
  68. BOOL versionControl = NO;
  69. BOOL timeControl = NO;
  70. if ([messageFeatureDic[@"needTyping"] intValue] == 1) {
  71. needTyping = YES;
  72. }
  73. if ([messageFeatureDic[@"version"] intValue] == 1) {
  74. versionControl = YES;
  75. }
  76. CFTimeInterval current = [NSDate.new timeIntervalSince1970];
  77. long currentTimeFloor = floor(current);
  78. long otherSideTimeFloor = floor([vc.C2CIncomingLastMsg.timestamp timeIntervalSince1970]);
  79. long interval = currentTimeFloor - otherSideTimeFloor;
  80. if (interval <= kC2CTypingTime) {
  81. timeControl = YES;
  82. }
  83. if (needTyping && versionControl && timeControl) {
  84. self.sendTypingBaseCondationInVC = YES;
  85. return YES;
  86. }
  87. }
  88. }
  89. return NO;
  90. }
  91. - (void)sendTypingMsgByStatus:(BOOL)editing {
  92. // switch control
  93. if (![TUIChatConfig defaultConfig].enableTypingStatus) {
  94. return;
  95. }
  96. //注释下面的代码, 低端机过不了判断
  97. // if (![self sendTypingBaseCondation]) {
  98. // return;
  99. // }
  100. NSError *error = nil;
  101. NSDictionary *param = @{
  102. BussinessID : BussinessID_Typing,
  103. @"typingStatus" : editing ? @1 : @0,
  104. @"version" : @1,
  105. @"userAction" : @14,
  106. @"actionParam" : editing ? @"EIMAMSG_InputStatus_Ing" : @"EIMAMSG_InputStatus_End",
  107. };
  108. NSData *data = [NSJSONSerialization dataWithJSONObject:param options:0 error:&error];
  109. V2TIMMessage *msg = [TUIMessageDataProvider getCustomMessageWithJsonData:data];
  110. [msg setIsExcludedFromContentModeration:YES];
  111. TUISendMessageAppendParams *appendParams = [[TUISendMessageAppendParams alloc] init];
  112. appendParams.isSendPushInfo = NO;
  113. appendParams.isOnlineUserOnly = YES;
  114. appendParams.priority = V2TIM_PRIORITY_DEFAULT;
  115. [TUIMessageDataProvider sendMessage:msg
  116. toConversation:self.conversationData
  117. appendParams:appendParams
  118. Progress:^(uint32_t progress) {
  119. }
  120. SuccBlock:^{
  121. NSLog(@"success");
  122. }
  123. FailBlock:^(int code, NSString *desc) {
  124. NSLog(@"Fail");
  125. }];
  126. }
  127. @end