Files
featherVoice/TUIKit/TUIVoiceToTextPlugin/UI/DataProvider/TUIVoiceToTextDataProvider.m

147 lines
5.1 KiB
Mathematica
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// TUIVoiceToTextDataProvider.m
// TUIVoiceToText
//
// Created by xia on 2023/8/17.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUIVoiceToTextDataProvider.h"
#import <TIMCommon/NSString+TUIEmoji.h>
#import <TUICore/TUICore.h>
#import <TUICore/TUILogin.h>
#import "TUIVoiceToTextConfig.h"
#pragma GCC diagnostic ignored "-Wundeclared-selector"
static NSString *const kKeyVoiceToText = @"voice_to_text";
static NSString *const kKeyVoiceToTextViewStatus = @"voice_to_text_view_status";
@interface TUIVoiceToTextDataProvider () <TUINotificationProtocol, V2TIMAdvancedMsgListener>
@end
@implementation TUIVoiceToTextDataProvider
#pragma mark - Public
+ (void)convertMessage:(TUIMessageCellData *)data completion:(TUIVoiceToTextCompletion _Nullable)completion {
V2TIMMessage *msg = data.innerMessage;
if (msg.elemType != V2TIM_ELEM_TYPE_SOUND) {
if (completion) {
completion(-1, @"element is not sound type", data, TUIVoiceToTextViewStatusHidden, @"");
}
return;
}
if (msg.status != V2TIM_MSG_STATUS_SEND_SUCC) {
if (completion) {
completion(-2, @"sound message is not sent successfully", data, TUIVoiceToTextViewStatusHidden, @"");
}
return;
}
V2TIMSoundElem *soundElem = msg.soundElem;
if (soundElem == nil) {
if (completion) {
completion(-3, @"soundElem is nil", data, TUIVoiceToTextViewStatusHidden, @"");
}
return;
}
// Loading converted text from localCustomData firstly.
NSString *convertedText = [self getConvertedText:msg];
if (convertedText.length > 0) {
[self saveConvertedResult:msg text:convertedText status:TUIVoiceToTextViewStatusShown];
if (completion) {
completion(0, @"", data, TUIVoiceToTextViewStatusShown, convertedText);
}
return;
}
// Try to request from server secondly.
[self saveConvertedResult:msg text:@"" status:TUIVoiceToTextViewStatusLoading];
if (completion) {
completion(0, @"", data, TUIVoiceToTextViewStatusLoading, @"");
}
[soundElem convertVoiceToText:@""
completion:^(int code, NSString *desc, NSString *result) {
TUIVoiceToTextViewStatus status;
if (code == 0 && result.length > 0) {
status = TUIVoiceToTextViewStatusShown;
} else {
status = TUIVoiceToTextViewStatusHidden;
}
[self saveConvertedResult:msg text:result status:status];
if (completion) {
completion(code, desc, data, status, result);
}
}];
}
+ (void)saveConvertedResult:(V2TIMMessage *)message text:(NSString *)text status:(TUIVoiceToTextViewStatus)status {
if (text.length > 0) {
[self saveToLocalCustomDataOfMessage:message key:kKeyVoiceToText value:text];
}
[self saveToLocalCustomDataOfMessage:message key:kKeyVoiceToTextViewStatus value:@(status)];
}
+ (void)saveToLocalCustomDataOfMessage:(V2TIMMessage *)message key:(NSString *)key value:(id)value {
if (key.length == 0 || value == nil) {
return;
}
NSData *customData = message.localCustomData;
NSMutableDictionary *dict = [[TUITool jsonData2Dictionary:customData] mutableCopy];
if (dict == nil) {
dict = [[NSMutableDictionary alloc] init];
}
dict[key] = value;
[message setLocalCustomData:[TUITool dictionary2JsonData:dict]];
}
+ (BOOL)shouldShowConvertedText:(V2TIMMessage *)message {
if (message.localCustomData.length == 0) {
return NO;
}
NSDictionary *dict = [TUITool jsonData2Dictionary:message.localCustomData];
TUIVoiceToTextViewStatus status;
if ([dict.allKeys containsObject:kKeyVoiceToTextViewStatus]) {
status = [dict[kKeyVoiceToTextViewStatus] integerValue];
} else {
status = TUIVoiceToTextViewStatusHidden;
}
NSArray *hiddenStatus = @[ @(TUIVoiceToTextViewStatusUnknown), @(TUIVoiceToTextViewStatusHidden) ];
return ![hiddenStatus containsObject:@(status)] || status == TUIVoiceToTextViewStatusLoading;
}
+ (NSString *)getConvertedText:(V2TIMMessage *)message {
BOOL hasRiskContent = message.hasRiskContent;
if (hasRiskContent){
return TIMCommonLocalizableString(TUIKitMessageTypeSecurityStrikeTranslate);
}
if (message.localCustomData.length == 0) {
return nil;
}
NSDictionary *dict = [TUITool jsonData2Dictionary:message.localCustomData];
if ([dict.allKeys containsObject:kKeyVoiceToText]) {
return dict[kKeyVoiceToText];
}
return nil;
}
+ (TUIVoiceToTextViewStatus)getConvertedTextStatus:(V2TIMMessage *)message {
BOOL hasRiskContent = message.hasRiskContent;
if (hasRiskContent){
return TUIVoiceToTextViewStatusSecurityStrike;
}
if (message.localCustomData.length == 0) {
return TUIVoiceToTextViewStatusUnknown;
}
NSDictionary *dict = [TUITool jsonData2Dictionary:message.localCustomData];
if ([dict.allKeys containsObject:kKeyVoiceToTextViewStatus]) {
return [dict[kKeyVoiceToTextViewStatus] integerValue];
}
return TUIVoiceToTextViewStatusUnknown;
}
@end