no message
This commit is contained in:
		
							parent
							
								
									fb56f7747a
								
							
						
					
					
						commit
						a3752065fa
					
				| @ -38,13 +38,23 @@ android { | |||||||
| 
 | 
 | ||||||
|     defaultConfig { |     defaultConfig { | ||||||
|         minSdkVersion 21 |         minSdkVersion 21 | ||||||
|  |         ndk { | ||||||
|  |             abiFilters "arm64-v8a","x86" // 根据需要添加其他 ABI | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     compileOptions { |     compileOptions { | ||||||
|         sourceCompatibility JavaVersion.VERSION_1_8 |         sourceCompatibility JavaVersion.VERSION_1_8 | ||||||
|         targetCompatibility JavaVersion.VERSION_1_8 |         targetCompatibility JavaVersion.VERSION_1_8 | ||||||
|     } |     } | ||||||
|  |     sourceSets { | ||||||
|  |         main { | ||||||
|  |             jniLibs.srcDirs = ['libs/jni'] | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| dependencies { | dependencies { | ||||||
|     implementation 'io.openim:core-sdk:3.8.1@aar' |     implementation fileTree(dir: 'libs', include: ['*.jar']) | ||||||
| } | } | ||||||
| @ -1,5 +1,6 @@ | |||||||
|  | #Tue Nov 12 14:22:37 CST 2024 | ||||||
| distributionBase=GRADLE_USER_HOME | distributionBase=GRADLE_USER_HOME | ||||||
| distributionPath=wrapper/dists | distributionPath=wrapper/dists | ||||||
|  | distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.4-bin.zip | ||||||
| zipStoreBase=GRADLE_USER_HOME | zipStoreBase=GRADLE_USER_HOME | ||||||
| zipStorePath=wrapper/dists | zipStorePath=wrapper/dists | ||||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip |  | ||||||
|  | |||||||
| @ -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.IMManager; | ||||||
| import io.openim.flutter_openim_sdk.manager.MessageManager; | import io.openim.flutter_openim_sdk.manager.MessageManager; | ||||||
| import io.openim.flutter_openim_sdk.manager.UserManager; | import io.openim.flutter_openim_sdk.manager.UserManager; | ||||||
| 
 | import io.openim.flutter_openim_sdk.manager.ChannelManager; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * FlutterOpenimSdkPlugin |  * FlutterOpenimSdkPlugin | ||||||
| @ -42,6 +42,7 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler, | |||||||
|     private static MessageManager messageManager; |     private static MessageManager messageManager; | ||||||
|     private static ConversationManager conversationManager; |     private static ConversationManager conversationManager; | ||||||
|     private static GroupManager groupManager; |     private static GroupManager groupManager; | ||||||
|  |     private static ChannelManager channelManager; | ||||||
|     private static Activity activity; |     private static Activity activity; | ||||||
|     private static Context context; |     private static Context context; | ||||||
|     private ConnectivityListener connectivityListener; |     private ConnectivityListener connectivityListener; | ||||||
| @ -55,6 +56,8 @@ public class FlutterOpenimSdkPlugin implements FlutterPlugin, MethodCallHandler, | |||||||
|         FlutterOpenimSdkPlugin.messageManager = new MessageManager(); |         FlutterOpenimSdkPlugin.messageManager = new MessageManager(); | ||||||
|         FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); |         FlutterOpenimSdkPlugin.conversationManager = new ConversationManager(); | ||||||
|         FlutterOpenimSdkPlugin.groupManager = new GroupManager(); |         FlutterOpenimSdkPlugin.groupManager = new GroupManager(); | ||||||
|  |         FlutterOpenimSdkPlugin.channelManager = new ChannelManager(); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -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") | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -27,6 +27,7 @@ public class MessageManager extends BaseManager { | |||||||
|                 jsonValue(methodCall, "message"), |                 jsonValue(methodCall, "message"), | ||||||
|                 value(methodCall, "userID"), |                 value(methodCall, "userID"), | ||||||
|                 value(methodCall, "groupID"), |                 value(methodCall, "groupID"), | ||||||
|  |                 value(methodCall, "channelID"), | ||||||
|                 jsonValue(methodCall, "offlinePushInfo"), |                 jsonValue(methodCall, "offlinePushInfo"), | ||||||
|                 value(methodCall, "isOnlineOnly") |                 value(methodCall, "isOnlineOnly") | ||||||
|         ); |         ); | ||||||
| @ -89,6 +90,7 @@ public class MessageManager extends BaseManager { | |||||||
|                 value(methodCall, "operationID"), |                 value(methodCall, "operationID"), | ||||||
|                 jsonValue(methodCall, "message"), |                 jsonValue(methodCall, "message"), | ||||||
|                 value(methodCall, "groupID"), |                 value(methodCall, "groupID"), | ||||||
|  |                 value(methodCall, "channelID"), | ||||||
|                 value(methodCall, "senderID") |                 value(methodCall, "senderID") | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| @ -339,6 +341,7 @@ public class MessageManager extends BaseManager { | |||||||
|                 jsonValue(methodCall, "message"), |                 jsonValue(methodCall, "message"), | ||||||
|                 value(methodCall, "userID"), |                 value(methodCall, "userID"), | ||||||
|                 value(methodCall, "groupID"), |                 value(methodCall, "groupID"), | ||||||
|  |                 value(methodCall, "channelId"), | ||||||
|                 jsonValue(methodCall, "offlinePushInfo"), |                 jsonValue(methodCall, "offlinePushInfo"), | ||||||
|                 value(methodCall, "isOnlineOnly") |                 value(methodCall, "isOnlineOnly") | ||||||
|         ); |         ); | ||||||
|  | |||||||
							
								
								
									
										101
									
								
								ios/Classes/Module/ChannelManager.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								ios/Classes/Module/ChannelManager.swift
									
									
									
									
									
										Normal file
									
								
							| @ -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) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -65,7 +65,7 @@ public class MessageManager: BaseServiceManager { | |||||||
|     func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ |     func sendMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
|         let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) |         let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) | ||||||
|         Open_im_sdkSendMessage(sendMsgProgressListener, methodCall[string: "operationID"], methodCall[jsonString: "message"], methodCall[string: "userID"], |         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){ |     func revokeMessage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
| @ -95,7 +95,7 @@ public class MessageManager: BaseServiceManager { | |||||||
|      |      | ||||||
|     func insertGroupMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ |     func insertGroupMessageToLocalStorage(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
|         Open_im_sdkInsertGroupMessageToLocalStorage(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[jsonString: "message"], |         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){ |     func markMessagesAsReadByMsgID(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
| @ -227,7 +227,7 @@ public class MessageManager: BaseServiceManager { | |||||||
|      |      | ||||||
|     func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ |     func sendMessageNotOss(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
|         let sendMsgProgressListener: SendMsgProgressListener = SendMsgProgressListener(channel: channel,result: result,methodCall: methodCall) |         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){ |     func createImageMessageByURL(methodCall: FlutterMethodCall, result: @escaping FlutterResult){ | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { | |||||||
|     let messageManager: MessageManager |     let messageManager: MessageManager | ||||||
|     let groupManager: GroupManager |     let groupManager: GroupManager | ||||||
|     let userManger: UserManager |     let userManger: UserManager | ||||||
|  |     let channelManger: ChannelManager | ||||||
| 
 | 
 | ||||||
|     init(channel: FlutterMethodChannel) { |     init(channel: FlutterMethodChannel) { | ||||||
|         self.imManager = IMMananger(channel: channel) |         self.imManager = IMMananger(channel: channel) | ||||||
| @ -15,6 +16,7 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { | |||||||
|         self.friendshipManager = FriendshipManager(channel: channel) |         self.friendshipManager = FriendshipManager(channel: channel) | ||||||
|         self.messageManager = MessageManager(channel: channel) |         self.messageManager = MessageManager(channel: channel) | ||||||
|         self.groupManager = GroupManager(channel: channel) |         self.groupManager = GroupManager(channel: channel) | ||||||
|  |         self.channelManager = ChannelManager(channel: channel) | ||||||
|         self.userManger = UserManager(channel: channel) |         self.userManger = UserManager(channel: channel) | ||||||
|     } |     } | ||||||
|      |      | ||||||
| @ -37,6 +39,8 @@ public class SwiftFlutterOpenimSdkPlugin: NSObject, FlutterPlugin { | |||||||
|             friendshipManager.handleMethod(call: call, result: result) |             friendshipManager.handleMethod(call: call, result: result) | ||||||
|         case "groupManager": |         case "groupManager": | ||||||
|             groupManager.handleMethod(call: call, result: result) |             groupManager.handleMethod(call: call, result: result) | ||||||
|  |         case "channelManager": | ||||||
|  |             channelManager.handleMethod(call: call, result: result) | ||||||
|         case "userManager": |         case "userManager": | ||||||
|             userManger.handleMethod(call: call, result: result) |             userManger.handleMethod(call: call, result: result) | ||||||
|         default: |         default: | ||||||
|  | |||||||
| @ -17,10 +17,15 @@ A new Flutter project. | |||||||
|   s.dependency 'Flutter' |   s.dependency 'Flutter' | ||||||
|   s.platform = :ios, '11.0' |   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.static_framework = true | ||||||
|   s.library = 'resolv' |   s.library = 'resolv' | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|   # s.vendored_frameworks = 'Framework/*.xcframework' |   # s.vendored_frameworks = 'Framework/*.xcframework' | ||||||
|   # Flutter.framework does not contain a i386 slice. |   # Flutter.framework does not contain a i386 slice. | ||||||
|   s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' } |   s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386 arm64' } | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ export 'src/listener/conversation_listener.dart'; | |||||||
| export 'src/listener/custom_business_listener.dart'; | export 'src/listener/custom_business_listener.dart'; | ||||||
| export 'src/listener/friendship_listener.dart'; | export 'src/listener/friendship_listener.dart'; | ||||||
| export 'src/listener/group_listener.dart'; | export 'src/listener/group_listener.dart'; | ||||||
|  | export 'src/listener/channel_listener.dart'; | ||||||
| export 'src/listener/listener_for_service.dart'; | export 'src/listener/listener_for_service.dart'; | ||||||
| export 'src/listener/msg_send_progress_listener.dart'; | export 'src/listener/msg_send_progress_listener.dart'; | ||||||
| export 'src/listener/upload_file_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_conversation_manager.dart'; | ||||||
| export 'src/manager/im_friendship_manager.dart'; | export 'src/manager/im_friendship_manager.dart'; | ||||||
| export 'src/manager/im_group_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_manager.dart'; | ||||||
| export 'src/manager/im_message_manager.dart'; | export 'src/manager/im_message_manager.dart'; | ||||||
| export 'src/manager/im_user_manager.dart'; | export 'src/manager/im_user_manager.dart'; | ||||||
| export 'src/models/conversation_info.dart'; | export 'src/models/conversation_info.dart'; | ||||||
| export 'src/models/group_info.dart'; | export 'src/models/group_info.dart'; | ||||||
|  | export 'src/models/channel_info.dart'; | ||||||
| export 'src/models/init_config.dart'; | export 'src/models/init_config.dart'; | ||||||
| export 'src/models/message.dart'; | export 'src/models/message.dart'; | ||||||
| export 'src/models/notification_info.dart'; | export 'src/models/notification_info.dart'; | ||||||
|  | |||||||
| @ -12,4 +12,8 @@ class ConversationType { | |||||||
| 
 | 
 | ||||||
|   /// Notification |   /// Notification | ||||||
|   static const notification = 4; |   static const notification = 4; | ||||||
|  | 
 | ||||||
|  |   /// Super channel chat | ||||||
|  |   static const superChannel = 11; | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ class ListenerType { | |||||||
|   static const connectListener = 'connectListener'; |   static const connectListener = 'connectListener'; | ||||||
|   static const userListener = 'userListener'; |   static const userListener = 'userListener'; | ||||||
|   static const groupListener = 'groupListener'; |   static const groupListener = 'groupListener'; | ||||||
|  |   static const channelListener = 'channelListener'; | ||||||
|   static const advancedMsgListener = 'advancedMsgListener'; |   static const advancedMsgListener = 'advancedMsgListener'; | ||||||
|   static const conversationListener = 'conversationListener'; |   static const conversationListener = 'conversationListener'; | ||||||
|   static const friendListener = 'friendListener'; |   static const friendListener = 'friendListener'; | ||||||
|  | |||||||
							
								
								
									
										60
									
								
								lib/src/listener/channel_listener.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								lib/src/listener/channel_listener.dart
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										323
									
								
								lib/src/manager/im_channel_manager.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								lib/src/manager/im_channel_manager.dart
									
									
									
									
									
										Normal file
									
								
							| @ -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<List<ChannelMembersInfo>> getChannelMembersInfo({ | ||||||
|  |     required String channelID, | ||||||
|  |     required List<String> 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<List<ChannelMembersInfo>> 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<List<dynamic>> 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<List<ChannelInfo>> getJoinedChannelList({String? operationID}) => _channel | ||||||
|  |   //     .invokeMethod( | ||||||
|  |   //         'getJoinedChannelList', | ||||||
|  |   //         _buildParam({ | ||||||
|  |   //           'operationID': Utils.checkOperationID(operationID), | ||||||
|  |   //         })) | ||||||
|  |   //     .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); | ||||||
|  |   // | ||||||
|  |   // Future<List<ChannelInfo>> 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<List<dynamic>> 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<bool> 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<List<ChannelInfo>> getChannelsInfo({ | ||||||
|  |     required List<String> 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<dynamic> 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<dynamic> 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<List<ChannelInfo>> searchChannels({ | ||||||
|  |   //   List<String> 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<List<ChannelMembersInfo>> getChannelMemberListByJoinTime({ | ||||||
|  |   //   required String channelID, | ||||||
|  |   //   int offset = 0, | ||||||
|  |   //   int count = 0, | ||||||
|  |   //   int joinTimeBegin = 0, | ||||||
|  |   //   int joinTimeEnd = 0, | ||||||
|  |   //   List<String> 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<List<ChannelMembersInfo>> searchChannelMembers({ | ||||||
|  |   //   required String channelID, | ||||||
|  |   //   List<String> 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<List<dynamic>> searchChannelMembersListMap({ | ||||||
|  |   //   required String channelID, | ||||||
|  |   //   List<String> 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<dynamic> setChannelMemberInfo({ | ||||||
|  |   //   required SetChannelMemberInfo channelMembersInfo, | ||||||
|  |   //   String? operationID, | ||||||
|  |   // }) => | ||||||
|  |   //     _channel.invokeMethod( | ||||||
|  |   //         'setChannelMemberInfo', | ||||||
|  |   //         _buildParam({ | ||||||
|  |   //           'info': channelMembersInfo.toJson(), | ||||||
|  |   //           'operationID': Utils.checkOperationID(operationID), | ||||||
|  |   //         })); | ||||||
|  | 
 | ||||||
|  |   Future<dynamic> getUsersInChannel( | ||||||
|  |     String channelID, | ||||||
|  |     List<String> userIDs, { | ||||||
|  |     String? operationID, | ||||||
|  |   }) => | ||||||
|  |       _channel.invokeMethod( | ||||||
|  |           'getUsersInChannel', | ||||||
|  |           _buildParam({ | ||||||
|  |             'channelID': channelID, | ||||||
|  |             'userIDs': userIDs, | ||||||
|  |             'operationID': Utils.checkOperationID(operationID), | ||||||
|  |           })); | ||||||
|  | 
 | ||||||
|  |   static Map _buildParam(Map<String, dynamic> param) { | ||||||
|  |     param["ManagerName"] = "channelManager"; | ||||||
|  |     param = Utils.cleanMap(param); | ||||||
|  |     log('param: $param'); | ||||||
|  | 
 | ||||||
|  |     return param; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -6,6 +6,9 @@ import 'package:flutter/services.dart'; | |||||||
| import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; | import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; | ||||||
| import 'package:flutter_openim_sdk/src/logger.dart'; | import 'package:flutter_openim_sdk/src/logger.dart'; | ||||||
| 
 | 
 | ||||||
|  | import '../models/channel_info.dart'; | ||||||
|  | import 'im_channel_manager.dart'; | ||||||
|  | 
 | ||||||
| class IMManager { | class IMManager { | ||||||
|   MethodChannel _channel; |   MethodChannel _channel; | ||||||
|   late ConversationManager conversationManager; |   late ConversationManager conversationManager; | ||||||
| @ -13,6 +16,7 @@ class IMManager { | |||||||
|   late MessageManager messageManager; |   late MessageManager messageManager; | ||||||
|   late GroupManager groupManager; |   late GroupManager groupManager; | ||||||
|   late UserManager userManager; |   late UserManager userManager; | ||||||
|  |   late ChannelManager channelManager; | ||||||
| 
 | 
 | ||||||
|   late OnConnectListener _connectListener; |   late OnConnectListener _connectListener; | ||||||
|   OnListenerForService? _listenerForService; |   OnListenerForService? _listenerForService; | ||||||
| @ -29,6 +33,7 @@ class IMManager { | |||||||
|     friendshipManager = FriendshipManager(_channel); |     friendshipManager = FriendshipManager(_channel); | ||||||
|     messageManager = MessageManager(_channel); |     messageManager = MessageManager(_channel); | ||||||
|     groupManager = GroupManager(_channel); |     groupManager = GroupManager(_channel); | ||||||
|  |     channelManager = ChannelManager(_channel); | ||||||
|     userManager = UserManager(_channel); |     userManager = UserManager(_channel); | ||||||
|     _addNativeCallback(_channel); |     _addNativeCallback(_channel); | ||||||
|   } |   } | ||||||
| @ -123,7 +128,44 @@ class IMManager { | |||||||
|               groupManager.listener.joinedGroupDeleted(i); |               groupManager.listener.joinedGroupDeleted(i); | ||||||
|               break; |               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 type = call.arguments['type']; | ||||||
|           // var id = call.arguments['data']['id']; |           // var id = call.arguments['data']['id']; | ||||||
|           switch (type) { |           switch (type) { | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ class MessageManager { | |||||||
|     required OfflinePushInfo offlinePushInfo, |     required OfflinePushInfo offlinePushInfo, | ||||||
|     String? userID, |     String? userID, | ||||||
|     String? groupID, |     String? groupID, | ||||||
|  |     String? channelID, | ||||||
|     bool isOnlineOnly = false, |     bool isOnlineOnly = false, | ||||||
|     String? operationID, |     String? operationID, | ||||||
|   }) => |   }) => | ||||||
| @ -47,6 +48,7 @@ class MessageManager { | |||||||
|                 'offlinePushInfo': offlinePushInfo.toJson(), |                 'offlinePushInfo': offlinePushInfo.toJson(), | ||||||
|                 'userID': userID ?? '', |                 'userID': userID ?? '', | ||||||
|                 'groupID': groupID ?? '', |                 'groupID': groupID ?? '', | ||||||
|  |                 'channelID': channelID ?? '', | ||||||
|                 'isOnlineOnly': isOnlineOnly, |                 'isOnlineOnly': isOnlineOnly, | ||||||
|                 'operationID': Utils.checkOperationID(operationID), |                 'operationID': Utils.checkOperationID(operationID), | ||||||
|               })) |               })) | ||||||
| @ -130,6 +132,7 @@ class MessageManager { | |||||||
|   /// [message] Message content |   /// [message] Message content | ||||||
|   Future<Message> insertGroupMessageToLocalStorage({ |   Future<Message> insertGroupMessageToLocalStorage({ | ||||||
|     String? groupID, |     String? groupID, | ||||||
|  |     String? channelID, | ||||||
|     String? senderID, |     String? senderID, | ||||||
|     Message? message, |     Message? message, | ||||||
|     String? operationID, |     String? operationID, | ||||||
| @ -140,6 +143,7 @@ class MessageManager { | |||||||
|               _buildParam({ |               _buildParam({ | ||||||
|                 "message": message?.toJson(), |                 "message": message?.toJson(), | ||||||
|                 "groupID": groupID, |                 "groupID": groupID, | ||||||
|  |                 "channelID": channelID, | ||||||
|                 "senderID": senderID, |                 "senderID": senderID, | ||||||
|                 "operationID": Utils.checkOperationID(operationID), |                 "operationID": Utils.checkOperationID(operationID), | ||||||
|               })) |               })) | ||||||
| @ -674,6 +678,7 @@ class MessageManager { | |||||||
|     required OfflinePushInfo offlinePushInfo, |     required OfflinePushInfo offlinePushInfo, | ||||||
|     String? userID, |     String? userID, | ||||||
|     String? groupID, |     String? groupID, | ||||||
|  |     String? channelID, | ||||||
|     bool isOnlineOnly = false, |     bool isOnlineOnly = false, | ||||||
|     String? operationID, |     String? operationID, | ||||||
|   }) => |   }) => | ||||||
| @ -685,6 +690,7 @@ class MessageManager { | |||||||
|                 'offlinePushInfo': offlinePushInfo.toJson(), |                 'offlinePushInfo': offlinePushInfo.toJson(), | ||||||
|                 'userID': userID ?? '', |                 'userID': userID ?? '', | ||||||
|                 'groupID': groupID ?? '', |                 'groupID': groupID ?? '', | ||||||
|  |                 'channelID': channelID ?? '', | ||||||
|                 'isOnlineOnly': isOnlineOnly, |                 'isOnlineOnly': isOnlineOnly, | ||||||
|                 'operationID': Utils.checkOperationID(operationID), |                 'operationID': Utils.checkOperationID(operationID), | ||||||
|               })) |               })) | ||||||
|  | |||||||
							
								
								
									
										165
									
								
								lib/src/models/channel_info.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								lib/src/models/channel_info.dart
									
									
									
									
									
										Normal file
									
								
							| @ -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<String, dynamic> 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<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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<String, dynamic> 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<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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; | ||||||
|  | } | ||||||
| @ -15,6 +15,9 @@ class ConversationInfo { | |||||||
|   // Group ID in case of a group chat |   // Group ID in case of a group chat | ||||||
|   String? groupID; |   String? groupID; | ||||||
| 
 | 
 | ||||||
|  |   // Channel ID in case of a channel chat | ||||||
|  |   String? channelID; | ||||||
|  | 
 | ||||||
|   // Display name or nickname |   // Display name or nickname | ||||||
|   String? showName; |   String? showName; | ||||||
| 
 | 
 | ||||||
| @ -69,6 +72,7 @@ class ConversationInfo { | |||||||
|     this.conversationType, |     this.conversationType, | ||||||
|     this.userID, |     this.userID, | ||||||
|     this.groupID, |     this.groupID, | ||||||
|  |     this.channelID, | ||||||
|     this.showName, |     this.showName, | ||||||
|     this.faceURL, |     this.faceURL, | ||||||
|     this.recvMsgOpt, |     this.recvMsgOpt, | ||||||
| @ -91,6 +95,7 @@ class ConversationInfo { | |||||||
|     conversationType = json['conversationType']; |     conversationType = json['conversationType']; | ||||||
|     userID = json['userID']; |     userID = json['userID']; | ||||||
|     groupID = json['groupID']; |     groupID = json['groupID']; | ||||||
|  |     channelID = json['channelID']; | ||||||
|     showName = json['showName']; |     showName = json['showName']; | ||||||
|     faceURL = json['faceURL']; |     faceURL = json['faceURL']; | ||||||
|     recvMsgOpt = json['recvMsgOpt']; |     recvMsgOpt = json['recvMsgOpt']; | ||||||
| @ -122,6 +127,7 @@ class ConversationInfo { | |||||||
|     data['conversationType'] = this.conversationType; |     data['conversationType'] = this.conversationType; | ||||||
|     data['userID'] = this.userID; |     data['userID'] = this.userID; | ||||||
|     data['groupID'] = this.groupID; |     data['groupID'] = this.groupID; | ||||||
|  |     data['channelID'] = this.channelID; | ||||||
|     data['showName'] = this.showName; |     data['showName'] = this.showName; | ||||||
|     data['faceURL'] = this.faceURL; |     data['faceURL'] = this.faceURL; | ||||||
|     data['recvMsgOpt'] = this.recvMsgOpt; |     data['recvMsgOpt'] = this.recvMsgOpt; | ||||||
| @ -147,6 +153,10 @@ class ConversationInfo { | |||||||
|   // Check if it's a group chat |   // Check if it's a group chat | ||||||
|   bool get isGroupChat => conversationType == ConversationType.group || conversationType == ConversationType.superGroup; |   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) |   // Check if it's a valid conversation (not in a group if isNotInGroup is true) | ||||||
|   bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!); |   bool get isValid => isSingleChat || (isGroupChat && !isNotInGroup!); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -42,6 +42,9 @@ class Message { | |||||||
|   /// Group ID. |   /// Group ID. | ||||||
|   String? groupID; |   String? groupID; | ||||||
| 
 | 
 | ||||||
|  |   /// Channel ID. | ||||||
|  |   String? channelID; | ||||||
|  | 
 | ||||||
|   /// Message localEx. |   /// Message localEx. | ||||||
|   String? localEx; |   String? localEx; | ||||||
| 
 | 
 | ||||||
| @ -137,6 +140,7 @@ class Message { | |||||||
|     this.senderNickname, |     this.senderNickname, | ||||||
|     this.senderFaceUrl, |     this.senderFaceUrl, | ||||||
|     this.groupID, |     this.groupID, | ||||||
|  |     this.channelID, | ||||||
|     this.localEx, |     this.localEx, | ||||||
|     this.seq, |     this.seq, | ||||||
|     this.isRead, |     this.isRead, | ||||||
| @ -179,6 +183,7 @@ class Message { | |||||||
|     senderNickname = json['senderNickname']; |     senderNickname = json['senderNickname']; | ||||||
|     senderFaceUrl = json['senderFaceUrl']; |     senderFaceUrl = json['senderFaceUrl']; | ||||||
|     groupID = json['groupID']; |     groupID = json['groupID']; | ||||||
|  |     channelID = json['channelID']; | ||||||
|     localEx = json['localEx']; |     localEx = json['localEx']; | ||||||
|     seq = json['seq']; |     seq = json['seq']; | ||||||
|     isRead = json['isRead']; |     isRead = json['isRead']; | ||||||
| @ -224,6 +229,7 @@ class Message { | |||||||
|     data['senderNickname'] = this.senderNickname; |     data['senderNickname'] = this.senderNickname; | ||||||
|     data['senderFaceUrl'] = this.senderFaceUrl; |     data['senderFaceUrl'] = this.senderFaceUrl; | ||||||
|     data['groupID'] = this.groupID; |     data['groupID'] = this.groupID; | ||||||
|  |     data['channelID'] = this.channelID; | ||||||
|     data['localEx'] = this.localEx; |     data['localEx'] = this.localEx; | ||||||
|     data['seq'] = this.seq; |     data['seq'] = this.seq; | ||||||
|     data['isRead'] = this.isRead; |     data['isRead'] = this.isRead; | ||||||
| @ -275,6 +281,7 @@ class Message { | |||||||
|     senderNickname = message.senderNickname; |     senderNickname = message.senderNickname; | ||||||
|     senderFaceUrl = message.senderFaceUrl; |     senderFaceUrl = message.senderFaceUrl; | ||||||
|     groupID = message.groupID; |     groupID = message.groupID; | ||||||
|  |     channelID = message.channelID; | ||||||
|     // content = message.content; |     // content = message.content; | ||||||
|     seq = message.seq; |     seq = message.seq; | ||||||
|     isRead = message.isRead; |     isRead = message.isRead; | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| import '../../flutter_openim_sdk.dart'; | import '../../flutter_openim_sdk.dart'; | ||||||
|  | import 'channel_info.dart'; | ||||||
| 
 | 
 | ||||||
| /// OA notification | /// OA notification | ||||||
| class OANotification { | class OANotification { | ||||||
| @ -454,3 +455,254 @@ class GroupMemberInfoChangedNotification { | |||||||
|     return data; |     return data; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ///todo 所有的聊天的操作者都没有,暂时没有处理 | ||||||
|  | /// 聊天室事件通知 | ||||||
|  | class ChannelNotification { | ||||||
|  |   /// 聊天室信息 | ||||||
|  |   ChannelInfo? Channel; | ||||||
|  | 
 | ||||||
|  |   /// 当前事件操作者信息 | ||||||
|  |   ChannelMembersInfo? opUser; | ||||||
|  | 
 | ||||||
|  |   /// 聊天室拥有者信息 | ||||||
|  |   ChannelMembersInfo? ChannelOwnerUser; | ||||||
|  | 
 | ||||||
|  |   /// 产生影响的聊天室成员列表 | ||||||
|  |   List<ChannelMembersInfo>? memberList; | ||||||
|  | 
 | ||||||
|  |   ChannelNotification({ | ||||||
|  |     this.Channel, | ||||||
|  |     this.opUser, | ||||||
|  |     this.ChannelOwnerUser, | ||||||
|  |     this.memberList, | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   ChannelNotification.fromJson(Map<String, dynamic> 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 = <ChannelMembersInfo>[]; | ||||||
|  |       json['memberList'].forEach((v) { | ||||||
|  |         memberList!.add(ChannelMembersInfo.fromJson(v)); | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Map<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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<ChannelMembersInfo>? kickedUserList; | ||||||
|  | 
 | ||||||
|  |   KickedChannelMemeberNotification( | ||||||
|  |       {this.Channel, this.opUser, this.kickedUserList}); | ||||||
|  | 
 | ||||||
|  |   KickedChannelMemeberNotification.fromJson(Map<String, dynamic> json) { | ||||||
|  |     Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; | ||||||
|  |     opUser = json['opUser'] != null | ||||||
|  |         ? ChannelMembersInfo.fromJson(json['opUser']) | ||||||
|  |         : null; | ||||||
|  |     if (json['kickedUserList'] != null) { | ||||||
|  |       kickedUserList = <ChannelMembersInfo>[]; | ||||||
|  |       json['kickedUserList'].forEach((v) { | ||||||
|  |         kickedUserList!.add(ChannelMembersInfo.fromJson(v)); | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Map<String, dynamic> toJson() { | ||||||
|  |     final Map<String, dynamic> data = new Map<String, dynamic>(); | ||||||
|  |     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<String, dynamic> json) { | ||||||
|  |     Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; | ||||||
|  |     quitUser = json['quitUser'] != null | ||||||
|  |         ? ChannelMembersInfo.fromJson(json['quitUser']) | ||||||
|  |         : null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Map<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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<String, dynamic> json) { | ||||||
|  |     Channel = json['channel'] != null ? ChannelInfo.fromJson(json['channel']) : null; | ||||||
|  |     entrantUser = json['entrantUser'] != null | ||||||
|  |         ? ChannelMembersInfo.fromJson(json['entrantUser']) | ||||||
|  |         : null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Map<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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<String, dynamic> 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<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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<String, dynamic> 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<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								lib/src/models/set_channel_member_info.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								lib/src/models/set_channel_member_info.dart
									
									
									
									
									
										Normal file
									
								
							| @ -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<String, dynamic> json) | ||||||
|  |       : channelID = json['channelID'], | ||||||
|  |         userID = json['userID'], | ||||||
|  |         roleLevel = json['roleLevel'], | ||||||
|  |         nickname = json['nickname'], | ||||||
|  |         faceURL = json['faceURL'], | ||||||
|  |         ex = json['ex']; | ||||||
|  | 
 | ||||||
|  |   Map<String, dynamic> toJson() { | ||||||
|  |     final data = Map<String, dynamic>(); | ||||||
|  |     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}'; | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -47,6 +47,8 @@ class ConversationReq { | |||||||
|   final bool? isMsgDestruct; |   final bool? isMsgDestruct; | ||||||
|   final int? msgDestructTime; |   final int? msgDestructTime; | ||||||
|   final int? groupAtType; |   final int? groupAtType; | ||||||
|  |   final String? channelID; | ||||||
|  |   final int? channelAtType; | ||||||
| 
 | 
 | ||||||
|   ConversationReq({ |   ConversationReq({ | ||||||
|     this.userID, |     this.userID, | ||||||
| @ -59,6 +61,8 @@ class ConversationReq { | |||||||
|     this.isMsgDestruct, |     this.isMsgDestruct, | ||||||
|     this.msgDestructTime, |     this.msgDestructTime, | ||||||
|     this.groupAtType, |     this.groupAtType, | ||||||
|  |     this.channelID, | ||||||
|  |     this.channelAtType, | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   ConversationReq.fromJson(Map<String, dynamic> json) |   ConversationReq.fromJson(Map<String, dynamic> json) | ||||||
| @ -71,8 +75,11 @@ class ConversationReq { | |||||||
|         burnDuration = json['burnDuration'], |         burnDuration = json['burnDuration'], | ||||||
|         isMsgDestruct = json['isMsgDestruct'], |         isMsgDestruct = json['isMsgDestruct'], | ||||||
|         msgDestructTime = json['msgDestructTime'], |         msgDestructTime = json['msgDestructTime'], | ||||||
|  |         channelID=json['channelID'], | ||||||
|  |         channelAtType = json['channelAtType'], | ||||||
|         groupAtType = json['groupAtType']; |         groupAtType = json['groupAtType']; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|   Map<String, dynamic> toJson() { |   Map<String, dynamic> toJson() { | ||||||
|     final data = <String, dynamic>{}; |     final data = <String, dynamic>{}; | ||||||
|     data['userID'] = userID; |     data['userID'] = userID; | ||||||
| @ -85,7 +92,8 @@ class ConversationReq { | |||||||
|     data['isMsgDestruct'] = isMsgDestruct; |     data['isMsgDestruct'] = isMsgDestruct; | ||||||
|     data['msgDestructTime'] = msgDestructTime; |     data['msgDestructTime'] = msgDestructTime; | ||||||
|     data['groupAtType'] = groupAtType; |     data['groupAtType'] = groupAtType; | ||||||
| 
 |     data['channelID'] = channelID; | ||||||
|  |     data['channelAtType'] = channelAtType; | ||||||
|     return data; |     return data; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user