From a3752065fa6916dfe4d2d86d6e783dae5f1c478b Mon Sep 17 00:00:00 2001 From: cpdl Date: Sun, 17 Nov 2024 18:31:14 +0800 Subject: [PATCH] no message --- android/build.gradle | 12 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../FlutterOpenimSdkPlugin.java | 5 +- .../listener/OnChannelListener.java | 32 ++ .../manager/ChannelManager.java | 103 ++++++ .../manager/MessageManager.java | 3 + ios/Classes/Module/ChannelManager.swift | 101 ++++++ ios/Classes/Module/MessageManager.swift | 6 +- ios/Classes/SwiftFlutterOpenimSdkPlugin.swift | 6 +- ios/flutter_openim_sdk.podspec | 7 +- lib/flutter_openim_sdk.dart | 3 + lib/src/enum/conversation_type.dart | 4 + lib/src/enum/listener_type.dart | 1 + lib/src/listener/channel_listener.dart | 60 ++++ lib/src/manager/im_channel_manager.dart | 323 ++++++++++++++++++ lib/src/manager/im_manager.dart | 44 ++- lib/src/manager/im_message_manager.dart | 6 + lib/src/models/channel_info.dart | 165 +++++++++ lib/src/models/conversation_info.dart | 10 + lib/src/models/message.dart | 7 + lib/src/models/notification_info.dart | 252 ++++++++++++++ lib/src/models/set_channel_member_info.dart | 41 +++ lib/src/models/update_req.dart | 10 +- 23 files changed, 1194 insertions(+), 10 deletions(-) create mode 100644 android/src/main/java/io/openim/flutter_openim_sdk/listener/OnChannelListener.java create mode 100644 android/src/main/java/io/openim/flutter_openim_sdk/manager/ChannelManager.java create mode 100644 ios/Classes/Module/ChannelManager.swift create mode 100644 lib/src/listener/channel_listener.dart create mode 100644 lib/src/manager/im_channel_manager.dart create mode 100644 lib/src/models/channel_info.dart create mode 100644 lib/src/models/set_channel_member_info.dart diff --git a/android/build.gradle b/android/build.gradle index 8da3636..d255fbf 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -38,13 +38,23 @@ android { defaultConfig { minSdkVersion 21 + ndk { + abiFilters "arm64-v8a","x86" // 根据需要添加其他 ABI + } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + sourceSets { + main { + jniLibs.srcDirs = ['libs/jni'] + } + + } + } dependencies { - implementation 'io.openim:core-sdk:3.8.1@aar' + implementation fileTree(dir: 'libs', include: ['*.jar']) } \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c9d085..7ccd2f1 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue Nov 12 14:22:37 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java index 10b60e9..e55ca77 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/FlutterOpenimSdkPlugin.java @@ -24,7 +24,7 @@ import io.openim.flutter_openim_sdk.manager.GroupManager; import io.openim.flutter_openim_sdk.manager.IMManager; import io.openim.flutter_openim_sdk.manager.MessageManager; import io.openim.flutter_openim_sdk.manager.UserManager; - +import io.openim.flutter_openim_sdk.manager.ChannelManager; /** * FlutterOpenimSdkPlugin @@ -42,6 +42,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler, private static MessageManager messageManager; private static ConversationManager conversationManager; private static GroupManager groupManager; + private static ChannelManager channelManager; private static Activity activity; private static Context context; private ConnectivityListener connectivityListener; @@ -55,6 +56,8 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler, FlutterOpenimSdkPlugin.messageManager = new MessageManager(); FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); FlutterOpenimSdkPlugin.groupManager = new GroupManager(); + FlutterOpenimSdkPlugin.channelManager = new ChannelManager(); + } diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnChannelListener.java b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnChannelListener.java new file mode 100644 index 0000000..0760ef4 --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/listener/OnChannelListener.java @@ -0,0 +1,32 @@ +package io.openim.flutter_openim_sdk.listener; + +import io.openim.flutter_openim_sdk.util.CommonUtil; + +public class OnChannelListener implements open_im_sdk_callback.OnChannelListener { + + @Override + public void onChannelDismissed(String s) { + CommonUtil.emitEvent("channelListener", "onChannelDismissed", s); + } + + @Override + public void onChannelInfoChanged(String s) { + CommonUtil.emitEvent("channelListener", "onChannelInfoChanged", s); + } + + @Override + public void onChannelMemberAdded(String s) { + CommonUtil.emitEvent("channelListener", "onChannelMemberAdded", s); + } + + @Override + public void onChannelMemberDeleted(String s) { + CommonUtil.emitEvent("channelListener", "onChannelMemberDeleted", s); + } + + @Override + public void onChannelMemberInfoChanged(String s) { + CommonUtil.emitEvent("channelListener", "onChannelMemberInfoChanged", s); + } + +} diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/ChannelManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ChannelManager.java new file mode 100644 index 0000000..96ba9c8 --- /dev/null +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/ChannelManager.java @@ -0,0 +1,103 @@ +package io.openim.flutter_openim_sdk.manager; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.openim.flutter_openim_sdk.listener.OnBaseListener; +import io.openim.flutter_openim_sdk.listener.OnChannelListener; +import open_im_sdk.Open_im_sdk; + +public class ChannelManager extends BaseManager { + + public void setChannelListener(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.setChannelListener(new OnChannelListener()); + + result.success(null); + } + + + public void getChannelMembersInfo(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getSpecifiedChannelMembersInfo( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + jsonValue(methodCall, "userIDList") + ); + } + + public void getChannelMemberList(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getChannelMemberList( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + value(methodCall, "filter"), + value(methodCall, "offset"), + value(methodCall, "count") + ); + } + + + public void getChannelsInfo(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getSpecifiedChannelsInfo( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + jsonValue(methodCall, "channelIDList") + ); + } + + public void joinChannel(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.joinChannel( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + value(methodCall, "reason"), + value(methodCall, "joinSource"), + value(methodCall, "ex") + ); + } + + public void quitChannel(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.quitChannel( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID") + ); + } + + + + public void changeChannelMute(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.changeChannelMute( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + value(methodCall, "mute") + ); + } + + public void changeChannelMemberMute(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.changeChannelMemberMute( + new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + value(methodCall, "userID"), + int2long(methodCall, "seconds") + ); + } + + + + public void isJoinChannel(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.isJoinChannel(new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID") + ); + } + + public void getUsersInChannel(MethodCall methodCall, MethodChannel.Result result) { + Open_im_sdk.getUsersInChannel(new OnBaseListener(result, methodCall), + value(methodCall, "operationID"), + value(methodCall, "channelID"), + jsonValue(methodCall, "userIDs") + ); + } +} \ No newline at end of file diff --git a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java index ffdd01d..ffdcfaf 100644 --- a/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java +++ b/android/src/main/java/io/openim/flutter_openim_sdk/manager/MessageManager.java @@ -27,6 +27,7 @@ public class MessageManager extends BaseManager { jsonValue(methodCall, "message"), value(methodCall, "userID"), value(methodCall, "groupID"), + value(methodCall, "channelID"), jsonValue(methodCall, "offlinePushInfo"), value(methodCall, "isOnlineOnly") ); @@ -89,6 +90,7 @@ public class MessageManager extends BaseManager { value(methodCall, "operationID"), jsonValue(methodCall, "message"), value(methodCall, "groupID"), + value(methodCall, "channelID"), value(methodCall, "senderID") ); } @@ -339,6 +341,7 @@ public class MessageManager extends BaseManager { jsonValue(methodCall, "message"), value(methodCall, "userID"), value(methodCall, "groupID"), + value(methodCall, "channelId"), jsonValue(methodCall, "offlinePushInfo"), value(methodCall, "isOnlineOnly") ); diff --git a/ios/Classes/Module/ChannelManager.swift b/ios/Classes/Module/ChannelManager.swift new file mode 100644 index 0000000..7130d37 --- /dev/null +++ b/ios/Classes/Module/ChannelManager.swift @@ -0,0 +1,101 @@ +import Foundation +import OpenIMCore + +public class ChannelManager: BaseServiceManager { + + public override func registerHandlers() { + super.registerHandlers() + + // self["changeChannelMemberMute"] = changeChannelMemberMute + // self["changeChannelMute"] = changeChannelMute + + // self["getChannelMemberList"] = getChannelMemberList + + + self["getChannelMembersInfo"] = getChannelMembersInfo + self["getChannelsInfo"] = getChannelsInfo + + + self["getUsersInChannel"] = getUsersInChannel + self["isJoinChannel"] = isJoinChannel + self["joinChannel"] = joinChannel + self["quitChannel"] = quitChannel + self["setChannelListener"] = setChannelListener + + } + +// func changeChannelMemberMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { +// Open_im_sdkChangeChannelMemberMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string:"userID"], methodCall[int:"seconds"]) +// } +// +// func changeChannelMute(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { +// Open_im_sdkChangeChannelMute(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[bool: "mute"]) +// } +// +// func getChannelMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { +// Open_im_sdkGetChannelMemberList(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[int32: "filter"], +// methodCall[int32: "offset"], methodCall[int32: "count"]) +// } + + func getChannelMembersInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetSpecifiedChannelMembersInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[jsonString: "userIDList"]) + } + + func getChannelsInfo(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetSpecifiedChannelsInfo(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "channelIDList"]) + } + + func getUsersInChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkGetUsersInChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], + methodCall[jsonString: "userIDs"]) + } + + func isJoinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkIsJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"]) + } + + func joinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string: + "reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"]) + } + + + func quitChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkQuitChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"]) + } + + func setChannelListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { + Open_im_sdkSetChannelListener(ChannelListener(channel: channel)) + callBack(result) + } +} + +public class ChannelListener: NSObject, Open_im_sdk_callbackOnChannelListenerProtocol { + + private let channel: FlutterMethodChannel + + init(channel: FlutterMethodChannel) { + self.channel = channel + } + + public func onChannelDismissed(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelDismissed", errCode: nil, errMsg: nil, data: s) + } + + public func onChannelInfoChanged(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelInfoChanged", errCode: nil, errMsg: nil, data: s) + } + + public func onChannelMemberAdded(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberAdded", errCode: nil, errMsg: nil, data: s) + } + + public func onChannelMemberDeleted(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberDeleted", errCode: nil, errMsg: nil, data: s) + } + + public func onChannelMemberInfoChanged(_ s: String?) { + CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberInfoChanged", errCode: nil, errMsg: nil, data: s) + } + +} diff --git a/ios/Classes/Module/MessageManager.swift b/ios/Classes/Module/MessageManager.swift index e2b28f1..ab4d9be 100644 --- a/ios/Classes/Module/MessageManager.swift +++ b/ios/Classes/Module/MessageManager.swift @@ -65,7 +65,7 @@ public class MessageManager: BaseServiceManager { func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], - methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) + methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) } func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -95,7 +95,7 @@ public class MessageManager: BaseServiceManager { func insertGroupMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ Open_im_sdkInsertGroupMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], - methodCall[string: "groupID"], methodCall[string: "senderID"]) + methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[string: "senderID"]) } func markMessagesAsReadByMsgID(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ @@ -227,7 +227,7 @@ public class MessageManager: BaseServiceManager { func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) - Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) + Open_im_sdkSendMessageNotOss(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], methodCall[string: "groupID"], methodCall[string: "channelID"],methodCall[jsonString: "offlinePushInfo"], methodCall[bool: "isOnlineOnly"]) } func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ diff --git a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift index 00cc6e0..ac53135 100644 --- a/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift +++ b/ios/Classes/SwiftFlutterOpenimSdkPlugin.swift @@ -8,13 +8,15 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { let messageManager: MessageManager let groupManager: GroupManager let userManger: UserManager - + let channelManger: ChannelManager + init(channel: FlutterMethodChannel) { self.imManager = IMMananger(channel: channel) self.conversationManager = ConversationManager(channel: channel) self.friendshipManager = FriendshipManager(channel: channel) self.messageManager = MessageManager(channel: channel) self.groupManager = GroupManager(channel: channel) + self.channelManager = ChannelManager(channel: channel) self.userManger = UserManager(channel: channel) } @@ -37,6 +39,8 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { friendshipManager.handleMethod(call: call, result: result) case "groupManager": groupManager.handleMethod(call: call, result: result) + case "channelManager": + channelManager.handleMethod(call: call, result: result) case "userManager": userManger.handleMethod(call: call, result: result) default: diff --git a/ios/flutter_openim_sdk.podspec b/ios/flutter_openim_sdk.podspec index 2aae01d..7b7722e 100644 --- a/ios/flutter_openim_sdk.podspec +++ b/ios/flutter_openim_sdk.podspec @@ -17,10 +17,15 @@ A new Flutter project. s.dependency 'Flutter' s.platform = :ios, '11.0' - s.dependency 'OpenIMSDKCore','3.8.1' + #s.ios.vendored_frameworks = 'frameworks/*.xcframework' + s.vendored_frameworks = 'frameworks/*.xcframework' + #s.dependency 'OpenIMSDKCore','3.8.1' s.static_framework = true s.library = 'resolv' + + + # s.vendored_frameworks = 'Framework/*.xcframework' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' } diff --git a/lib/flutter_openim_sdk.dart b/lib/flutter_openim_sdk.dart index 88185c1..8237dbb 100644 --- a/lib/flutter_openim_sdk.dart +++ b/lib/flutter_openim_sdk.dart @@ -17,6 +17,7 @@ export 'src/listener/conversation_listener.dart'; export 'src/listener/custom_business_listener.dart'; export 'src/listener/friendship_listener.dart'; export 'src/listener/group_listener.dart'; +export 'src/listener/channel_listener.dart'; export 'src/listener/listener_for_service.dart'; export 'src/listener/msg_send_progress_listener.dart'; export 'src/listener/upload_file_listener.dart'; @@ -24,11 +25,13 @@ export 'src/listener/user_listener.dart'; export 'src/manager/im_conversation_manager.dart'; export 'src/manager/im_friendship_manager.dart'; export 'src/manager/im_group_manager.dart'; +export 'src/manager/im_channel_manager.dart'; export 'src/manager/im_manager.dart'; export 'src/manager/im_message_manager.dart'; export 'src/manager/im_user_manager.dart'; export 'src/models/conversation_info.dart'; export 'src/models/group_info.dart'; +export 'src/models/channel_info.dart'; export 'src/models/init_config.dart'; export 'src/models/message.dart'; export 'src/models/notification_info.dart'; diff --git a/lib/src/enum/conversation_type.dart b/lib/src/enum/conversation_type.dart index aef93fd..1d2b0fe 100644 --- a/lib/src/enum/conversation_type.dart +++ b/lib/src/enum/conversation_type.dart @@ -12,4 +12,8 @@ class ConversationType { /// Notification static const notification = 4; + + /// Super channel chat + static const superChannel = 11; + } diff --git a/lib/src/enum/listener_type.dart b/lib/src/enum/listener_type.dart index 294d7f1..1ffcb88 100644 --- a/lib/src/enum/listener_type.dart +++ b/lib/src/enum/listener_type.dart @@ -4,6 +4,7 @@ class ListenerType { static const connectListener = 'connectListener'; static const userListener = 'userListener'; static const groupListener = 'groupListener'; + static const channelListener = 'channelListener'; static const advancedMsgListener = 'advancedMsgListener'; static const conversationListener = 'conversationListener'; static const friendListener = 'friendListener'; diff --git a/lib/src/listener/channel_listener.dart b/lib/src/listener/channel_listener.dart new file mode 100644 index 0000000..8b07168 --- /dev/null +++ b/lib/src/listener/channel_listener.dart @@ -0,0 +1,60 @@ +import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; + +import '../models/channel_info.dart'; + +/// Channel Listener +class OnChannelListener { + + Function(ChannelInfo info)? onChannelDismissed; + Function(ChannelInfo info)? onChannelInfoChanged; + Function(ChannelMembersInfo info)? onChannelMemberAdded; + Function(ChannelMembersInfo info)? onChannelMemberDeleted; + Function(ChannelMembersInfo info)? onChannelMemberInfoChanged; + Function(ChannelInfo info)? onJoinedChannelAdded; + Function(ChannelInfo info)? onJoinedChannelDeleted; + + OnChannelListener({ + this.onChannelDismissed, + this.onChannelInfoChanged, + this.onChannelMemberAdded, + this.onChannelMemberDeleted, + this.onChannelMemberInfoChanged, + this.onJoinedChannelAdded, + this.onJoinedChannelDeleted, + }); + + + void channelDismissed(ChannelInfo info) { + onChannelDismissed?.call(info); + } + + /// Channel information changed + void channelInfoChanged(ChannelInfo info) { + onChannelInfoChanged?.call(info); + } + + /// Channel member added + void channelMemberAdded(ChannelMembersInfo info) { + onChannelMemberAdded?.call(info); + } + + /// Channel member deleted + void channelMemberDeleted(ChannelMembersInfo info) { + onChannelMemberDeleted?.call(info); + } + + /// Channel member information changed + void channelMemberInfoChanged(ChannelMembersInfo info) { + onChannelMemberInfoChanged?.call(info); + } + + /// Joined channel added + void joinedChannelAdded(ChannelInfo info) { + onJoinedChannelAdded?.call(info); + } + + /// Joined channel deleted + void joinedChannelDeleted(ChannelInfo info) { + onJoinedChannelDeleted?.call(info); + } +} diff --git a/lib/src/manager/im_channel_manager.dart b/lib/src/manager/im_channel_manager.dart new file mode 100644 index 0000000..5a3375d --- /dev/null +++ b/lib/src/manager/im_channel_manager.dart @@ -0,0 +1,323 @@ +import 'dart:developer'; + +import 'package:flutter/services.dart'; +import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; +import 'package:flutter_openim_sdk/src/models/set_channel_member_info.dart'; + +import '../listener/channel_listener.dart'; +import '../models/channel_info.dart'; + +class ChannelManager { + MethodChannel _channel; + late OnChannelListener listener; + + ChannelManager(this._channel); + + /// Channel relationship listener + Future setChannelListener(OnChannelListener listener) { + this.listener = listener; + return _channel.invokeMethod('setChannelListener', _buildParam({})); + } + + /// Query channel member information + /// [channelID] Channel ID + /// [userIDList] List of user IDs + Future> getChannelMembersInfo({ + required String channelID, + required List userIDList, + String? operationID, + }) => + _channel + .invokeMethod( + 'getChannelMembersInfo', + _buildParam({ + 'channelID': channelID, + 'userIDList': userIDList, + "operationID": Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); + + /// Paginate and retrieve the channel member list + /// [channelID] Channel ID + /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin) + /// [offset] Starting index + /// [count] Total count + Future> getChannelMemberList({ + required String channelID, + int filter = 0, + int offset = 0, + int count = 0, + String? operationID, + }) => + _channel + .invokeMethod( + 'getChannelMemberList', + _buildParam({ + 'channelID': channelID, + 'filter': filter, + 'offset': offset, + 'count': count, + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); + + // /// Paginate and retrieve the channel member list as a map + // /// [channelID] Channel ID + // /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin) + // /// [offset] Starting index + // /// [count] Total count + // Future> getChannelMemberListMap({ + // required String channelID, + // int filter = 0, + // int offset = 0, + // int count = 0, + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'getChannelMemberList', + // _buildParam({ + // 'channelID': channelID, + // 'filter': filter, + // 'offset': offset, + // 'count': count, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toListMap(value)); + + // /// Query the list of joined channels + // Future> getJoinedChannelList({String? operationID}) => _channel + // .invokeMethod( + // 'getJoinedChannelList', + // _buildParam({ + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); + // + // Future> getJoinedChannelListPage({String? operationID, int offset = 0, int count = 40}) => _channel + // .invokeMethod( + // 'getJoinedChannelListPage', + // _buildParam({ + // 'offset': offset, + // 'count': count, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); + + // /// Query the list of joined channels + // Future> getJoinedChannelListMap({String? operationID}) => + // _channel + // .invokeMethod( + // 'getJoinedChannelList', + // _buildParam({ + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toListMap(value)); + + /// Check if the user has joined a channel + /// [channelID] Channel ID + Future isJoinedChannel({ + required String channelID, + String? operationID, + }) => + _channel + .invokeMethod( + 'isJoinChannel', + _buildParam({ + 'channelID': channelID, + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => value == 'true' ? true : false); + + /// Query channel information + Future> getChannelsInfo({ + required List channelIDList, + String? operationID, + }) => + _channel + .invokeMethod( + 'getChannelsInfo', + _buildParam({ + 'channelIDList': channelIDList, + 'operationID': Utils.checkOperationID(operationID), + })) + .then((value) => + Utils.toList(value, (map) => ChannelInfo.fromJson(map))); + + /// Apply to join a channel, requiring approval from an administrator or the channel. + /// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code + Future joinChannel( + {required String channelID, + String? reason, + String? operationID, + int joinSource = 3, + String? ex}) => + _channel.invokeMethod( + 'joinChannel', + _buildParam({ + 'channelID': channelID, + 'reason': reason, + 'joinSource': joinSource, + 'ex': ex, + 'operationID': Utils.checkOperationID(operationID), + })); + + /// Exit a channel + Future quitChannel({ + required String channelID, + String? operationID, + }) => + _channel.invokeMethod( + 'quitChannel', + _buildParam({ + 'channelID': channelID, + 'operationID': Utils.checkOperationID(operationID), + })); + + // + // /// Query a channel + // /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. + // /// [isSearchChannelID] Whether to search by channel ID (Note: cannot set both to false at the same time); defaults to false if not set. + // /// [isSearchChannelName] Whether to search by channel name; defaults to false if not set. + // Future> searchChannels({ + // List keywordList = const [], + // bool isSearchChannelID = false, + // bool isSearchChannelName = false, + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'searchChannels', + // _buildParam({ + // 'searchParam': { + // 'keywordList': keywordList, + // 'isSearchChannelID': isSearchChannelID, + // 'isSearchChannelName': isSearchChannelName, + // }, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); + + // /// Get a channel member list based on join time + // Future> getChannelMemberListByJoinTime({ + // required String channelID, + // int offset = 0, + // int count = 0, + // int joinTimeBegin = 0, + // int joinTimeEnd = 0, + // List filterUserIDList = const [], + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'getChannelMemberListByJoinTimeFilter', + // _buildParam({ + // 'channelID': channelID, + // 'offset': offset, + // 'count': count, + // 'joinTimeBegin': joinTimeBegin, + // 'joinTimeEnd': joinTimeEnd, + // 'excludeUserIDList': filterUserIDList, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); + + // /// Search for channel members + // /// [channelID] Channel ID + // /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. + // /// [isSearchUserID] Whether to search by member ID + // /// [isSearchMemberNickname] Whether to search by member nickname + // /// [offset] Start index + // /// [count] Total count to retrieve + // Future> searchChannelMembers({ + // required String channelID, + // List keywordList = const [], + // bool isSearchUserID = false, + // bool isSearchMemberNickname = false, + // int offset = 0, + // int count = 40, + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'searchChannelMembers', + // _buildParam({ + // 'searchParam': { + // 'channelID': channelID, + // 'keywordList': keywordList, + // 'isSearchUserID': isSearchUserID, + // 'isSearchMemberNickname': isSearchMemberNickname, + // 'offset': offset, + // 'count': count, + // }, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); + + // /// Query a channel + // /// [channelID] Channel ID + // /// [keywordList] Search keyword, currently only supports searching with one keyword, and it cannot be empty + // /// [isSearchUserID] Whether to search member IDs with the keyword + // /// [isSearchMemberNickname] Whether to search member nicknames with the keyword + // /// [offset] Starting index + // /// [count] Total number to retrieve each time + // Future> searchChannelMembersListMap({ + // required String channelID, + // List keywordList = const [], + // bool isSearchUserID = false, + // bool isSearchMemberNickname = false, + // int offset = 0, + // int count = 40, + // String? operationID, + // }) => + // _channel + // .invokeMethod( + // 'searchChannelMembers', + // _buildParam({ + // 'searchParam': { + // 'channelID': channelID, + // 'keywordList': keywordList, + // 'isSearchUserID': isSearchUserID, + // 'isSearchMemberNickname': isSearchMemberNickname, + // 'offset': offset, + // 'count': count, + // }, + // 'operationID': Utils.checkOperationID(operationID), + // })) + // .then((value) => Utils.toListMap(value)); + // + // /// Modify the ChannelMemberInfo ex field + // Future setChannelMemberInfo({ + // required SetChannelMemberInfo channelMembersInfo, + // String? operationID, + // }) => + // _channel.invokeMethod( + // 'setChannelMemberInfo', + // _buildParam({ + // 'info': channelMembersInfo.toJson(), + // 'operationID': Utils.checkOperationID(operationID), + // })); + + Future getUsersInChannel( + String channelID, + List userIDs, { + String? operationID, + }) => + _channel.invokeMethod( + 'getUsersInChannel', + _buildParam({ + 'channelID': channelID, + 'userIDs': userIDs, + 'operationID': Utils.checkOperationID(operationID), + })); + + static Map _buildParam(Map param) { + param["ManagerName"] = "channelManager"; + param = Utils.cleanMap(param); + log('param: $param'); + + return param; + } +} diff --git a/lib/src/manager/im_manager.dart b/lib/src/manager/im_manager.dart index 322f6a4..262aa47 100644 --- a/lib/src/manager/im_manager.dart +++ b/lib/src/manager/im_manager.dart @@ -6,6 +6,9 @@ import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/src/logger.dart'; +import '../models/channel_info.dart'; +import 'im_channel_manager.dart'; + class IMManager { MethodChannel _channel; late ConversationManager conversationManager; @@ -13,6 +16,7 @@ class IMManager { late MessageManager messageManager; late GroupManager groupManager; late UserManager userManager; + late ChannelManager channelManager; late OnConnectListener _connectListener; OnListenerForService? _listenerForService; @@ -29,6 +33,7 @@ class IMManager { friendshipManager = FriendshipManager(_channel); messageManager = MessageManager(_channel); groupManager = GroupManager(_channel); + channelManager = ChannelManager(_channel); userManager = UserManager(_channel); _addNativeCallback(_channel); } @@ -123,7 +128,44 @@ class IMManager { groupManager.listener.joinedGroupDeleted(i); break; } - } else if (call.method == ListenerType.advancedMsgListener) { + } else if (call.method == ListenerType.channelListener) { + String type = call.arguments['type']; + dynamic data = call.arguments['data']; + switch (type) { + + case 'onChannelDismissed': + final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map)); + channelManager.listener.channelDismissed(i); + break; + case 'onChannelInfoChanged': + final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map)); + channelManager.listener.channelInfoChanged(i); + break; + case 'onChannelMemberAdded': + final i = Utils.toObj( + data, (map) => ChannelMembersInfo.fromJson(map)); + channelManager.listener.channelMemberAdded(i); + break; + case 'onChannelMemberDeleted': + final i = Utils.toObj( + data, (map) => ChannelMembersInfo.fromJson(map)); + channelManager.listener.channelMemberDeleted(i); + break; + case 'onChannelMemberInfoChanged': + final i = Utils.toObj( + data, (map) => ChannelMembersInfo.fromJson(map)); + channelManager.listener.channelMemberInfoChanged(i); + break; + case 'onJoinedChannelAdded': + final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map)); + channelManager.listener.joinedChannelAdded(i); + break; + case 'onJoinedChannelDeleted': + final i = Utils.toObj(data, (map) => ChannelInfo.fromJson(map)); + channelManager.listener.joinedChannelDeleted(i); + break; + } + }else if (call.method == ListenerType.advancedMsgListener) { var type = call.arguments['type']; // var id = call.arguments['data']['id']; switch (type) { diff --git a/lib/src/manager/im_message_manager.dart b/lib/src/manager/im_message_manager.dart index eb04f9d..3f3a10d 100644 --- a/lib/src/manager/im_message_manager.dart +++ b/lib/src/manager/im_message_manager.dart @@ -36,6 +36,7 @@ class MessageManager { required OfflinePushInfo offlinePushInfo, String? userID, String? groupID, + String? channelID, bool isOnlineOnly = false, String? operationID, }) => @@ -47,6 +48,7 @@ class MessageManager { 'offlinePushInfo': offlinePushInfo.toJson(), 'userID': userID ?? '', 'groupID': groupID ?? '', + 'channelID': channelID ?? '', 'isOnlineOnly': isOnlineOnly, 'operationID': Utils.checkOperationID(operationID), })) @@ -130,6 +132,7 @@ class MessageManager { /// [message] Message content Future insertGroupMessageToLocalStorage({ String? groupID, + String? channelID, String? senderID, Message? message, String? operationID, @@ -140,6 +143,7 @@ class MessageManager { _buildParam({ "message": message?.toJson(), "groupID": groupID, + "channelID": channelID, "senderID": senderID, "operationID": Utils.checkOperationID(operationID), })) @@ -674,6 +678,7 @@ class MessageManager { required OfflinePushInfo offlinePushInfo, String? userID, String? groupID, + String? channelID, bool isOnlineOnly = false, String? operationID, }) => @@ -685,6 +690,7 @@ class MessageManager { 'offlinePushInfo': offlinePushInfo.toJson(), 'userID': userID ?? '', 'groupID': groupID ?? '', + 'channelID': channelID ?? '', 'isOnlineOnly': isOnlineOnly, 'operationID': Utils.checkOperationID(operationID), })) diff --git a/lib/src/models/channel_info.dart b/lib/src/models/channel_info.dart new file mode 100644 index 0000000..e037e45 --- /dev/null +++ b/lib/src/models/channel_info.dart @@ -0,0 +1,165 @@ +import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; + +/// Channel Information +class ChannelInfo { + /// Channel ID + String channelID; + + /// Channel Name + String? channelName; + + /// Channel Announcement + String? notification; + + /// Channel Introduction + String? introduction; + + /// Channel Avatar + String? faceURL; + + /// Creation Time + int? createTime; + + /// Number of Channel Members + int? memberCount; + + /// Channel Status: 0 - Normal, 1 - Blocked, 2 - Dissolved, 3 - Muted + int? status; + + /// Creator's ID + String? creatorUserID; + + /// Channel Type [ChannelType] + int? channelType; + + /// Extra Information + String? ex; + + + ChannelInfo({ + required this.channelID, + this.channelName, + this.notification, + this.introduction, + this.faceURL, + this.createTime, + this.memberCount, + this.status, + this.creatorUserID, + this.channelType, + this.ex, + }); + + ChannelInfo.fromJson(Map json) : channelID = json['channelID'] { + channelName = json['channelName']; + notification = json['notification']; + introduction = json['introduction']; + faceURL = json['faceURL']; + createTime = json['createTime']; + memberCount = json['memberCount']; + status = json['status']; + creatorUserID = json['creatorUserID']; + channelType = json['channelType']; + ex = json['ex']; + } + + Map toJson() { + final data = Map(); + data['channelID'] = this.channelID; + data['channelName'] = this.channelName; + data['notification'] = this.notification; + data['introduction'] = this.introduction; + data['faceURL'] = this.faceURL; + data['createTime'] = this.createTime; + data['memberCount'] = this.memberCount; + data['status'] = this.status; + data['creatorUserID'] = this.creatorUserID; + data['channelType'] = this.channelType; + data['ex'] = this.ex; + return data; + } + + /// Corresponding Conversation Type for Channel Type + int get sessionType => ConversationType.superChannel; + + @override + bool operator ==(Object other) => + identical(this, other) || other is ChannelInfo && runtimeType == other.runtimeType && channelID == other.channelID; + + @override + int get hashCode => channelID.hashCode; +} + +/// Channel Member Information +class ChannelMembersInfo { + /// Channel ID + String? channelID; + + /// User ID + String? userID; + + /// Nickname + String? nickname; + + /// Avatar + String? faceURL; + + /// Role [ChannelRoleLevel] + int? roleLevel; + + /// Join Time + int? joinTime; + + /// Extra Information + String? ex; + + /// Mute End Time (seconds) + int? muteEndTime; + + ChannelMembersInfo({ + this.channelID, + this.userID, + this.roleLevel, + this.joinTime, + this.nickname, + this.faceURL, + this.ex, + this.muteEndTime, + }); + + ChannelMembersInfo.fromJson(Map json) { + channelID = json['channelID']; + userID = json['userID']; + roleLevel = json['roleLevel']; + joinTime = json['joinTime']; + nickname = json['nickname']; + faceURL = json['faceURL']; + ex = json['ex']; + muteEndTime = json['muteEndTime']; + } + + Map toJson() { + final data = Map(); + data['channelID'] = this.channelID; + data['userID'] = this.userID; + data['roleLevel'] = this.roleLevel; + data['joinTime'] = this.joinTime; + data['nickname'] = this.nickname; + data['faceURL'] = this.faceURL; + data['ex'] = this.ex; + data['muteEndTime'] = this.muteEndTime; + + return data; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is ChannelMembersInfo && + runtimeType == other.runtimeType && + channelID == other.channelID && + userID == other.userID; + + @override + int get hashCode => channelID.hashCode ^ userID.hashCode; +} diff --git a/lib/src/models/conversation_info.dart b/lib/src/models/conversation_info.dart index db3732f..7d3d26e 100644 --- a/lib/src/models/conversation_info.dart +++ b/lib/src/models/conversation_info.dart @@ -15,6 +15,9 @@ class ConversationInfo { // Group ID in case of a group chat String? groupID; + // Channel ID in case of a channel chat + String? channelID; + // Display name or nickname String? showName; @@ -69,6 +72,7 @@ class ConversationInfo { this.conversationType, this.userID, this.groupID, + this.channelID, this.showName, this.faceURL, this.recvMsgOpt, @@ -91,6 +95,7 @@ class ConversationInfo { conversationType = json['conversationType']; userID = json['userID']; groupID = json['groupID']; + channelID = json['channelID']; showName = json['showName']; faceURL = json['faceURL']; recvMsgOpt = json['recvMsgOpt']; @@ -122,6 +127,7 @@ class ConversationInfo { data['conversationType'] = this.conversationType; data['userID'] = this.userID; data['groupID'] = this.groupID; + data['channelID'] = this.channelID; data['showName'] = this.showName; data['faceURL'] = this.faceURL; data['recvMsgOpt'] = this.recvMsgOpt; @@ -147,6 +153,10 @@ class ConversationInfo { // Check if it's a group chat bool get isGroupChat => conversationType == ConversationType.group || conversationType == ConversationType.superGroup; + // Check if it's a channel chat + bool get isChannelChat => conversationType == ConversationType.superChannel; + + // Check if it's a valid conversation (not in a group if isNotInGroup is true) bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!); diff --git a/lib/src/models/message.dart b/lib/src/models/message.dart index 592a110..8130d86 100644 --- a/lib/src/models/message.dart +++ b/lib/src/models/message.dart @@ -42,6 +42,9 @@ class Message { /// Group ID. String? groupID; + /// Channel ID. + String? channelID; + /// Message localEx. String? localEx; @@ -137,6 +140,7 @@ class Message { this.senderNickname, this.senderFaceUrl, this.groupID, + this.channelID, this.localEx, this.seq, this.isRead, @@ -179,6 +183,7 @@ class Message { senderNickname = json['senderNickname']; senderFaceUrl = json['senderFaceUrl']; groupID = json['groupID']; + channelID = json['channelID']; localEx = json['localEx']; seq = json['seq']; isRead = json['isRead']; @@ -224,6 +229,7 @@ class Message { data['senderNickname'] = this.senderNickname; data['senderFaceUrl'] = this.senderFaceUrl; data['groupID'] = this.groupID; + data['channelID'] = this.channelID; data['localEx'] = this.localEx; data['seq'] = this.seq; data['isRead'] = this.isRead; @@ -275,6 +281,7 @@ class Message { senderNickname = message.senderNickname; senderFaceUrl = message.senderFaceUrl; groupID = message.groupID; + channelID = message.channelID; // content = message.content; seq = message.seq; isRead = message.isRead; diff --git a/lib/src/models/notification_info.dart b/lib/src/models/notification_info.dart index 085d5d8..2ecc5e6 100644 --- a/lib/src/models/notification_info.dart +++ b/lib/src/models/notification_info.dart @@ -1,4 +1,5 @@ import '../../flutter_openim_sdk.dart'; +import 'channel_info.dart'; /// OA notification class OANotification { @@ -454,3 +455,254 @@ class GroupMemberInfoChangedNotification { return data; } } + + + +///todo 所有的聊天的操作者都没有,暂时没有处理 +/// 聊天室事件通知 +class ChannelNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 当前事件操作者信息 + ChannelMembersInfo? opUser; + + /// 聊天室拥有者信息 + ChannelMembersInfo? ChannelOwnerUser; + + /// 产生影响的聊天室成员列表 + List? memberList; + + ChannelNotification({ + this.Channel, + this.opUser, + this.ChannelOwnerUser, + this.memberList, + }); + + ChannelNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + opUser = json['opUser'] != null + ? ChannelMembersInfo.fromJson(json['opUser']) + : null; + ChannelOwnerUser = json['channelOwnerUser'] != null + ? ChannelMembersInfo.fromJson(json['channelOwnerUser']) + : null; + if (json['memberList'] != null) { + memberList = []; + json['memberList'].forEach((v) { + memberList!.add(ChannelMembersInfo.fromJson(v)); + }); + } + } + + Map toJson() { + final data = Map(); + if (this.Channel != null) { + data['channel'] = this.Channel!.toJson(); + } + if (this.opUser != null) { + data['opUser'] = this.opUser!.toJson(); + } + if (this.ChannelOwnerUser != null) { + data['channelOwnerUser'] = this.ChannelOwnerUser!.toJson(); + } + if (this.memberList != null) { + data['memberList'] = this.memberList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + + +/// 组踢出成员通知 +class KickedChannelMemeberNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 操作者信息 + ChannelMembersInfo? opUser; + + /// 被踢出聊天室的成员信息列表 + List? kickedUserList; + + KickedChannelMemeberNotification( + {this.Channel, this.opUser, this.kickedUserList}); + + KickedChannelMemeberNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + opUser = json['opUser'] != null + ? ChannelMembersInfo.fromJson(json['opUser']) + : null; + if (json['kickedUserList'] != null) { + kickedUserList = []; + json['kickedUserList'].forEach((v) { + kickedUserList!.add(ChannelMembersInfo.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + if (this.Channel != null) { + data['channel'] = this.Channel!.toJson(); + } + if (this.opUser != null) { + data['opUser'] = this.opUser!.toJson(); + } + if (this.kickedUserList != null) { + data['kickedUserList'] = + this.kickedUserList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +/// 退出聊天室通知 +class QuitChannelNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 退聊天室的成员信息 + ChannelMembersInfo? quitUser; + + QuitChannelNotification({this.Channel, this.quitUser}); + + QuitChannelNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + quitUser = json['quitUser'] != null + ? ChannelMembersInfo.fromJson(json['quitUser']) + : null; + } + + Map toJson() { + final data = Map(); + if (this.Channel != null) { + data['channel'] = this.Channel!.toJson(); + } + if (this.quitUser != null) { + data['quitUser'] = this.quitUser!.toJson(); + } + return data; + } +} + +/// 进聊天室通知 +class EnterChannelNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 进入聊天室的成员信息 + ChannelMembersInfo? entrantUser; + + EnterChannelNotification({this.Channel, this.entrantUser}); + + EnterChannelNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + entrantUser = json['entrantUser'] != null + ? ChannelMembersInfo.fromJson(json['entrantUser']) + : null; + } + + Map toJson() { + final data = Map(); + if (this.Channel != null) { + data['channel'] = this.Channel!.toJson(); + } + if (this.entrantUser != null) { + data['quitUser'] = this.entrantUser!.toJson(); + } + return data; + } +} + + +/// 禁言成员通知 +class MuteChannelMemberNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 操作者信息 + ChannelMembersInfo? opUser; + + /// 被禁言的成员信息 + ChannelMembersInfo? mutedUser; + + /// 禁言时间s + int? mutedSeconds; + + MuteChannelMemberNotification({ + this.Channel, + this.opUser, + this.mutedUser, + this.mutedSeconds, + }); + + MuteChannelMemberNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + opUser = json['opUser'] != null + ? ChannelMembersInfo.fromJson(json['opUser']) + : null; + mutedUser = json['mutedUser'] != null + ? ChannelMembersInfo.fromJson(json['mutedUser']) + : null; + mutedSeconds = json['mutedSeconds']; + } + + Map toJson() { + final data = Map(); + if (this.Channel != null) { + data['channel'] = this.Channel!.toJson(); + } + if (this.opUser != null) { + data['opUser'] = this.opUser!.toJson(); + } + if (this.mutedUser != null) { + data['mutedUser'] = this.mutedUser!.toJson(); + } + data['mutedSeconds'] = this.mutedSeconds; + return data; + } +} + +/// 聊天室成员信息发送变化通知 +class ChannelMemberInfoChangedNotification { + /// 聊天室信息 + ChannelInfo? Channel; + + /// 操作者信息 + ChannelMembersInfo? opUser; + + /// 资料发生改变的成员 + ChannelMembersInfo? changedUser; + + ChannelMemberInfoChangedNotification({ + this.Channel, + this.opUser, + this.changedUser, + }); + + ChannelMemberInfoChangedNotification.fromJson(Map json) { + Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; + opUser = json['opUser'] != null + ? ChannelMembersInfo.fromJson(json['opUser']) + : null; + changedUser = json['changedUser'] != null + ? ChannelMembersInfo.fromJson(json['changedUser']) + : null; + } + + Map toJson() { + final data = Map(); + if (this.Channel != null) { + data['Channel'] = this.Channel!.toJson(); + } + if (this.opUser != null) { + data['opUser'] = this.opUser!.toJson(); + } + if (this.changedUser != null) { + data['changedUser'] = this.changedUser!.toJson(); + } + return data; + } +} diff --git a/lib/src/models/set_channel_member_info.dart b/lib/src/models/set_channel_member_info.dart new file mode 100644 index 0000000..47a8bd3 --- /dev/null +++ b/lib/src/models/set_channel_member_info.dart @@ -0,0 +1,41 @@ +class SetChannelMemberInfo { + SetChannelMemberInfo({ + required this.channelID, + required this.userID, + this.roleLevel, + this.nickname, + this.faceURL, + this.ex, + }); + + final String channelID; + final String userID; + final int? roleLevel; + final String? nickname; + final String? faceURL; + final String? ex; + + SetChannelMemberInfo.fromJson(Map json) + : channelID = json['channelID'], + userID = json['userID'], + roleLevel = json['roleLevel'], + nickname = json['nickname'], + faceURL = json['faceURL'], + ex = json['ex']; + + Map toJson() { + final data = Map(); + data['channelID'] = channelID; + data['userID'] = userID; + data['roleLevel'] = roleLevel; + data['nickname'] = nickname; + data['faceURL'] = faceURL; + data['ex'] = ex; + return data; + } + + @override + String toString() { + return 'SetChannelMemberInfo{channelID: $channelID, userID: $userID, roleLevel: $roleLevel, nickname: $nickname, faceURL: $faceURL, ex: $ex}'; + } +} diff --git a/lib/src/models/update_req.dart b/lib/src/models/update_req.dart index 2dd4b42..75d46fe 100644 --- a/lib/src/models/update_req.dart +++ b/lib/src/models/update_req.dart @@ -47,6 +47,8 @@ class ConversationReq { final bool? isMsgDestruct; final int? msgDestructTime; final int? groupAtType; + final String? channelID; + final int? channelAtType; ConversationReq({ this.userID, @@ -59,6 +61,8 @@ class ConversationReq { this.isMsgDestruct, this.msgDestructTime, this.groupAtType, + this.channelID, + this.channelAtType, }); ConversationReq.fromJson(Map json) @@ -71,8 +75,11 @@ class ConversationReq { burnDuration = json['burnDuration'], isMsgDestruct = json['isMsgDestruct'], msgDestructTime = json['msgDestructTime'], + channelID=json['channelID'], + channelAtType = json['channelAtType'], groupAtType = json['groupAtType']; + Map toJson() { final data = {}; data['userID'] = userID; @@ -85,7 +92,8 @@ class ConversationReq { data['isMsgDestruct'] = isMsgDestruct; data['msgDestructTime'] = msgDestructTime; data['groupAtType'] = groupAtType; - + data['channelID'] = channelID; + data['channelAtType'] = channelAtType; return data; } }