You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

315 lines
8.3 KiB

import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
import '../controller/message/conversation_controller.dart';
// 完整的IM管理器实现,使用实际的SDK类型和方法
class IMManager {
// 单例模式
static final IMManager _instance = IMManager._internal();
factory IMManager() => _instance;
final storage = GetStorage();
// 静态getter用于instance访问
static IMManager get instance => _instance;
bool _isInitialized = false;
IMManager._internal() {
print('IMManager instance created');
}
/// 初始化IM SDK
Future<bool> initialize(String appKey) async {
try {
if (_isInitialized) {
print('IM SDK already initialized');
return true;
}
// 创建EMOptions实例
final options = EMOptions(
appKey: appKey,
autoLogin: false,
acceptInvitationAlways: false,
);
// 初始化SDK
await EMClient.getInstance.init(options);
_isInitialized = true;
print('IM SDK initialized successfully');
return true;
} catch (e) {
print('Failed to initialize IM SDK: $e');
return false;
}
}
// 注册监听器
void _registerListeners() {
try {
// 消息监听器
// 连接监听器
EMClient.getInstance.addConnectionEventHandler(
'',
EMConnectionEventHandler(
onConnected: () {
print('Connected to IM server');
},
onDisconnected: () {
print('Disconnected from IM server:');
},
onTokenDidExpire: () {
print('IM token about to expire');
},
onUserKickedByOtherDevice: () {
print('User kicked out of IM server');
},
),
);
EMClient.getInstance.chatManager.addEventHandler(
// EMChatEventHandler 对应的 key。
"",
EMChatEventHandler(
onMessagesReceived: (messages) {
// 收到新消息时,更新会话列表
_refreshConversationList();
for (var msg in messages) {
switch (msg.body.type) {
case MessageType.TXT:
{}
break;
case MessageType.IMAGE:
{}
break;
case MessageType.VIDEO:
{}
break;
case MessageType.LOCATION:
{}
break;
case MessageType.VOICE:
{}
break;
case MessageType.FILE:
{}
break;
case MessageType.CUSTOM:
{}
break;
case MessageType.COMBINE:
{}
break;
case MessageType.CMD:
{
// 当前回调中不会有 CMD 类型消息,CMD 类型消息通过 `EMChatEventHandler#onCmdMessagesReceived` 回调接收
}
break;
}
}
},
),
);
} catch (e) {
print('Failed to register listeners: $e');
}
}
/// 登录IM服务
Future<bool> login(String token) async {
try {
if (!_isInitialized) {
print('IM SDK not initialized');
return false;
}
var userId = storage.read('userId');
await EMClient.getInstance.logout();
await EMClient.getInstance.loginWithToken(userId, token);
// 注册监听器
_registerListeners();
print('IM login successful');
return true;
} catch (e) {
print('IM login failed: $e');
return false;
}
}
/// 登出IM服务
Future<bool> logout() async {
try {
await EMClient.getInstance.logout();
print('IM logout successful');
return true;
} catch (e) {
print('IM logout failed: $e');
return false;
}
}
/// 发送文本消息
Future<EMMessage?> sendTextMessage(
String content,
String toChatUsername,
) async {
print('Text message sent');
try {
// 创建文本消息
final message = EMMessage.createTxtSendMessage(
targetId: toChatUsername,
content: content,
);
print('Text message sent successfully');
return await EMClient.getInstance.chatManager.sendMessage(message);
} catch (e) {
print('Failed to send text message: $e');
return null;
}
}
/// 发送语音消息
Future<EMMessage?> sendVoiceMessage(
String filePath,
String toChatUsername,
int duration,
) async {
try {
// 创建图片消息
final message = EMMessage.createVoiceSendMessage(
targetId: toChatUsername,
filePath: filePath,
duration: duration,
);
// 发送消息
await EMClient.getInstance.chatManager.sendMessage(message);
print('Image message sent successfully');
return message;
} catch (e) {
print('Failed to send image message: $e');
return null;
}
}
/// 发送图片消息
Future<EMMessage?> sendImageMessage(
String imagePath,
String toChatUsername,
) async {
try {
// 创建图片消息
final message = EMMessage.createImageSendMessage(
targetId: toChatUsername,
filePath: imagePath,
sendOriginalImage: false,
);
// 发送消息
await EMClient.getInstance.chatManager.sendMessage(message);
print('Image message sent successfully');
return message;
} catch (e) {
print('Failed to send image message: $e');
return null;
}
}
/// 发送视频消息
Future<EMMessage?> sendVideoMessage(
String videoPath,
String toChatUsername,
int duration,
) async {
try {
print('🎬 [IMManager] 创建视频消息');
print('视频路径: $videoPath');
print('接收用户: $toChatUsername');
print('视频时长: $duration');
// 创建视频消息
final message = EMMessage.createVideoSendMessage(
targetId: toChatUsername,
filePath: videoPath,
duration: duration,
);
print('消息创建成功,消息类型: ${message.body.type}');
print('消息体是否为视频: ${message.body is EMVideoMessageBody}');
// 发送消息
await EMClient.getInstance.chatManager.sendMessage(message);
print('✅ [IMManager] 视频消息发送成功');
return message;
} catch (e) {
print('❌ [IMManager] 发送视频消息失败: $e');
return null;
}
}
/// 获取会话列表
Future<List<EMConversation>> getConversations() async {
return EMClient.getInstance.chatManager.loadAllConversations();
}
/// 获取好有列表
Future<Map<String, EMUserInfo>> getContacts(String userId) async {
return await EMClient.getInstance.userInfoManager.fetchUserInfoById([
userId,
]);
}
/// 获取指定会话的消息记录
Future<List<EMMessage?>> getMessages(
String conversationId, {
int pageSize = 20,
String? startMsgId,
}) async {
EMConversationType convType = EMConversationType.Chat;
EMCursorResult<EMMessage?> cursor = await EMClient.getInstance.chatManager
.fetchHistoryMessagesByOption(
conversationId,
convType,
pageSize: pageSize,
);
return cursor.data;
}
/// 获取用户信息
Future<EMUserInfo?> getUserInfo(String userId) async {
var data = await EMClient.getInstance.userInfoManager.fetchUserInfoById([
userId,
]);
return data[userId];
}
/// 刷新会话列表
void _refreshConversationList() {
try {
// 尝试获取 ConversationController 并刷新会话列表
if (Get.isRegistered<ConversationController>()) {
final conversationController = Get.find<ConversationController>();
conversationController.refreshConversations();
}
} catch (e) {
// ConversationController 可能未注册,忽略错误
if (Get.isLogEnable) {
Get.log('刷新会话列表失败: $e');
}
}
}
/// 清理资源
void dispose() {
try {
EMClient.getInstance.removeConnectionEventHandler("");
} catch (e) {
print('Failed to dispose resources: $e');
}
}
}
// 导出单例实例
final IMManager imManager = IMManager();