Compare commits

...

5 Commits

Author SHA1 Message Date
gem
74aa08a4b5 chore: bump version to 0.0.42
- Android: sdkcore 1.0.23 → 1.0.24
- iOS: pod version 0.0.17 → 0.0.18, openim_sdk_core_ios 0.17.0 → 0.18.0

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-07 11:37:04 +08:00
gem
39fb9b5cb3 feat(channel): add getChannelHistoryMessages binding
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-07 11:19:10 +08:00
gem
6bcf3de467 no message 2025-12-27 10:43:59 +08:00
gem
c341cb5a7c no message 2025-12-12 16:38:31 +08:00
gem
9b219b92b8 no message 2025-12-11 10:54:08 +08:00
5 changed files with 663 additions and 629 deletions

View File

@@ -1,73 +1,73 @@
group 'io.openim.flutter_openim_sdk' group 'io.openim.flutter_openim_sdk'
version '1.0' version '1.0'
def dir = getCurrentProjectDir() def dir = getCurrentProjectDir()
def getCurrentProjectDir() { def getCurrentProjectDir() {
String result = "" String result = ""
rootProject.allprojects { project -> rootProject.allprojects { project ->
if (project.properties.get("name").toString() == "flutter_openim_sdk") { if (project.properties.get("name").toString() == "flutter_openim_sdk") {
result = project.properties.get("projectDir").toString() result = project.properties.get("projectDir").toString()
} }
} }
return result return result
} }
buildscript { buildscript {
ext.kotlin_version = '2.0.20' ext.kotlin_version = '2.0.20'
repositories { repositories {
maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/central' } maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' } maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google() google()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.3.1' classpath 'com.android.tools.build:gradle:7.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
rootProject.allprojects { rootProject.allprojects {
repositories { repositories {
// 本地 AAR 调试配置 - 使用 rootProject.projectDir 确保路径正确 // 本地 AAR 调试配置 - 使用 rootProject.projectDir 确保路径正确
// maven { url 'file://' + rootProject.projectDir.absolutePath + '/local-maven' } // maven { url 'file://' + rootProject.projectDir.absolutePath + '/local-maven' }
maven { maven {
url 'http://192.168.77.132:8081/repository/mvn2-group' url 'http://192.168.77.132:8081/repository/mvn2-group'
allowInsecureProtocol true allowInsecureProtocol true
} }
google() google()
mavenCentral() mavenCentral()
} }
} }
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
android { android {
namespace 'io.openim.flutter_openim_sdk' namespace 'io.openim.flutter_openim_sdk'
compileSdkVersion 34 compileSdkVersion 34
defaultConfig { defaultConfig {
minSdkVersion 21 minSdkVersion 21
ndk { ndk {
abiFilters "arm64-v8a","x86" // 根据需要添加其他 ABI 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
} }
kotlinOptions { kotlinOptions {
jvmTarget = '1.8' jvmTarget = '1.8'
} }
} }
dependencies { dependencies {
//implementation 'com.openim:sdkcore:1.0.15-local' //implementation 'com.openim:sdkcore:1.0.15-local'
implementation 'com.openim:sdkcore:1.0.19' implementation 'com.openim:sdkcore:1.0.24'
} }

View File

@@ -1,103 +1,113 @@
package io.openim.flutter_openim_sdk.manager; package io.openim.flutter_openim_sdk.manager;
import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel;
import io.openim.flutter_openim_sdk.listener.OnBaseListener; import io.openim.flutter_openim_sdk.listener.OnBaseListener;
import io.openim.flutter_openim_sdk.listener.OnChannelListener; import io.openim.flutter_openim_sdk.listener.OnChannelListener;
import open_im_sdk.Open_im_sdk; import open_im_sdk.Open_im_sdk;
public class ChannelManager extends BaseManager { public class ChannelManager extends BaseManager {
public void setChannelListener(MethodCall methodCall, MethodChannel.Result result) { public void setChannelListener(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.setChannelListener(new OnChannelListener()); Open_im_sdk.setChannelListener(new OnChannelListener());
result.success(null); result.success(null);
} }
public void getChannelMembersInfo(MethodCall methodCall, MethodChannel.Result result) { public void getChannelMembersInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSpecifiedChannelMembersInfo( Open_im_sdk.getSpecifiedChannelMembersInfo(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
jsonValue(methodCall, "userIDList") jsonValue(methodCall, "userIDList")
); );
} }
public void getChannelMemberList(MethodCall methodCall, MethodChannel.Result result) { public void getChannelMemberList(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getChannelMemberList( Open_im_sdk.getChannelMemberList(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
value(methodCall, "filter"), value(methodCall, "filter"),
value(methodCall, "offset"), value(methodCall, "offset"),
value(methodCall, "count") value(methodCall, "count")
); );
} }
public void getChannelsInfo(MethodCall methodCall, MethodChannel.Result result) { public void getChannelsInfo(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getSpecifiedChannelsInfo( Open_im_sdk.getSpecifiedChannelsInfo(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
jsonValue(methodCall, "channelIDList") jsonValue(methodCall, "channelIDList")
); );
} }
public void joinChannel(MethodCall methodCall, MethodChannel.Result result) { public void joinChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.joinChannel( Open_im_sdk.joinChannel(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
value(methodCall, "reason"), value(methodCall, "reason"),
value(methodCall, "joinSource"), value(methodCall, "joinSource"),
value(methodCall, "ex") value(methodCall, "ex")
); );
} }
public void quitChannel(MethodCall methodCall, MethodChannel.Result result) { public void quitChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.quitChannel( Open_im_sdk.quitChannel(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID") value(methodCall, "channelID")
); );
} }
public void changeChannelMute(MethodCall methodCall, MethodChannel.Result result) { public void changeChannelMute(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeChannelMute( Open_im_sdk.changeChannelMute(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
value(methodCall, "mute") value(methodCall, "mute")
); );
} }
public void changeChannelMemberMute(MethodCall methodCall, MethodChannel.Result result) { public void changeChannelMemberMute(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.changeChannelMemberMute( Open_im_sdk.changeChannelMemberMute(
new OnBaseListener(result, methodCall), new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
value(methodCall, "userID"), value(methodCall, "userID"),
int2long(methodCall, "seconds") int2long(methodCall, "seconds")
); );
} }
public void isJoinChannel(MethodCall methodCall, MethodChannel.Result result) { public void isJoinChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.isJoinChannel(new OnBaseListener(result, methodCall), Open_im_sdk.isJoinChannel(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID") value(methodCall, "channelID")
); );
} }
public void getUsersInChannel(MethodCall methodCall, MethodChannel.Result result) { public void getUsersInChannel(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getUsersInChannel(new OnBaseListener(result, methodCall), Open_im_sdk.getUsersInChannel(new OnBaseListener(result, methodCall),
value(methodCall, "operationID"), value(methodCall, "operationID"),
value(methodCall, "channelID"), value(methodCall, "channelID"),
jsonValue(methodCall, "userIDs") jsonValue(methodCall, "userIDs")
); );
} }
public void getChannelHistoryMessages(MethodCall methodCall, MethodChannel.Result result) {
Open_im_sdk.getChannelHistoryMessages(
new OnBaseListener(result, methodCall),
value(methodCall, "operationID"),
value(methodCall, "channelID"),
value(methodCall, "count"),
int2long(methodCall, "sinceSeq")
);
}
} }

View File

@@ -1,101 +1,106 @@
import Foundation import Foundation
import OpenIMCore import OpenIMCore
public class ChannelManager: BaseServiceManager { public class ChannelManager: BaseServiceManager {
public override func registerHandlers() { public override func registerHandlers() {
super.registerHandlers() super.registerHandlers()
// self["changeChannelMemberMute"] = changeChannelMemberMute // self["changeChannelMemberMute"] = changeChannelMemberMute
// self["changeChannelMute"] = changeChannelMute // self["changeChannelMute"] = changeChannelMute
// self["getChannelMemberList"] = getChannelMemberList // self["getChannelMemberList"] = getChannelMemberList
self["getChannelMembersInfo"] = getChannelMembersInfo self["getChannelMembersInfo"] = getChannelMembersInfo
self["getChannelsInfo"] = getChannelsInfo self["getChannelsInfo"] = getChannelsInfo
self["getUsersInChannel"] = getUsersInChannel self["getUsersInChannel"] = getUsersInChannel
self["isJoinChannel"] = isJoinChannel self["getChannelHistoryMessages"] = getChannelHistoryMessages
self["joinChannel"] = joinChannel self["isJoinChannel"] = isJoinChannel
self["quitChannel"] = quitChannel self["joinChannel"] = joinChannel
self["setChannelListener"] = setChannelListener 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 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 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"], // func getChannelMemberList(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
// methodCall[int32: "offset"], methodCall[int32: "count"]) // 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 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 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"], func getUsersInChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
methodCall[jsonString: "userIDs"]) 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 getChannelHistoryMessages(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
} Open_im_sdkGetChannelHistoryMessages(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[int: "count"], methodCall[int64: "sinceSeq"])
}
func joinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string: func isJoinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
"reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"]) Open_im_sdkIsJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"])
} }
func joinChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
func quitChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) { Open_im_sdkJoinChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"], methodCall[string:
Open_im_sdkQuitChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"]) "reason"], methodCall[int32: "joinSource"], methodCall[jsonString: "ex"])
} }
func setChannelListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
Open_im_sdkSetChannelListener(ChannelListener(channel: channel)) func quitChannel(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
callBack(result) Open_im_sdkQuitChannel(BaseCallback(result: result), methodCall[string: "operationID"], methodCall[string: "channelID"])
} }
}
func setChannelListener(methodCall: FlutterMethodCall, result: @escaping FlutterResult) {
public class ChannelListener: NSObject, Open_im_sdk_callbackOnChannelListenerProtocol { Open_im_sdkSetChannelListener(ChannelListener(channel: channel))
callBack(result)
private let channel: FlutterMethodChannel }
}
init(channel: FlutterMethodChannel) {
self.channel = channel public class ChannelListener: NSObject, Open_im_sdk_callbackOnChannelListenerProtocol {
}
private let channel: FlutterMethodChannel
public func onChannelDismissed(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelDismissed", errCode: nil, errMsg: nil, data: s) init(channel: FlutterMethodChannel) {
} self.channel = channel
}
public func onChannelInfoChanged(_ s: String?) {
CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelInfoChanged", errCode: nil, errMsg: nil, data: s) public func onChannelDismissed(_ s: String?) {
} CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelDismissed", 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 onChannelInfoChanged(_ s: String?) {
} CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelInfoChanged", 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 onChannelMemberAdded(_ s: String?) {
} CommonUtil.emitEvent(channel: channel, method: "channelListener", type: "onChannelMemberAdded", 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) 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)
}
}

View File

@@ -1,35 +1,35 @@
# #
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint flutter_openim_sdk.podspec` to validate before publishing. # Run `pod lib lint flutter_openim_sdk.podspec` to validate before publishing.
# #
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = 'flutter_openim_sdk' s.name = 'flutter_openim_sdk'
s.version = '0.0.14' s.version = '0.0.18'
s.summary = 'A new Flutter project.' s.summary = 'A new Flutter project.'
s.description = <<-DESC s.description = <<-DESC
A new Flutter project. A new Flutter project.
DESC DESC
s.homepage = 'http://example.com' s.homepage = 'http://example.com'
s.license = { :file => '../LICENSE' } s.license = { :file => '../LICENSE' }
s.author = { 'Your Company' => 'email@example.com' } s.author = { 'Your Company' => 'email@example.com' }
s.source = { :path => '.' } s.source = { :path => '.' }
s.source_files = 'Classes/**/*' s.source_files = 'Classes/**/*'
s.dependency 'Flutter' s.dependency 'Flutter'
s.platform = :ios, '13.0' s.platform = :ios, '13.0'
#s.ios.vendored_frameworks = 'frameworks/*.xcframework' #s.ios.vendored_frameworks = 'frameworks/*.xcframework'
#s.vendored_frameworks = 'frameworks/*.xcframework' #s.vendored_frameworks = 'frameworks/*.xcframework'
s.dependency 'openim_sdk_core_ios','0.14.0' s.dependency 'openim_sdk_core_ios','0.18.0'
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' }
s.swift_version = '5.0' s.swift_version = '5.0'
s.resource_bundles = {'flutter_openim_sdk_privacy' => ['Resources/PrivacyInfo.xcprivacy']} s.resource_bundles = {'flutter_openim_sdk_privacy' => ['Resources/PrivacyInfo.xcprivacy']}
end end

View File

@@ -1,319 +1,338 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class ChannelManager { class ChannelManager {
MethodChannel _channel; MethodChannel _channel;
late OnChannelListener listener; late OnChannelListener listener;
ChannelManager(this._channel); ChannelManager(this._channel);
/// Channel relationship listener /// Channel relationship listener
Future setChannelListener(OnChannelListener listener) { Future setChannelListener(OnChannelListener listener) {
this.listener = listener; this.listener = listener;
return _channel.invokeMethod('setChannelListener', _buildParam({})); return _channel.invokeMethod('setChannelListener', _buildParam({}));
} }
/// Query channel member information /// Query channel member information
/// [channelID] Channel ID /// [channelID] Channel ID
/// [userIDList] List of user IDs /// [userIDList] List of user IDs
Future<List<ChannelMembersInfo>> getChannelMembersInfo({ Future<List<ChannelMembersInfo>> getChannelMembersInfo({
required String channelID, required String channelID,
required List<String> userIDList, required List<String> userIDList,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getChannelMembersInfo', 'getChannelMembersInfo',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'userIDList': userIDList, 'userIDList': userIDList,
"operationID": Utils.checkOperationID(operationID), "operationID": Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) =>
Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
/// Paginate and retrieve the channel member list /// Paginate and retrieve the channel member list
/// [channelID] Channel ID /// [channelID] Channel ID
/// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin) /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin)
/// [offset] Starting index /// [offset] Starting index
/// [count] Total count /// [count] Total count
Future<List<ChannelMembersInfo>> getChannelMemberList({ Future<List<ChannelMembersInfo>> getChannelMemberList({
required String channelID, required String channelID,
int filter = 0, int filter = 0,
int offset = 0, int offset = 0,
int count = 0, int count = 0,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getChannelMemberList', 'getChannelMemberList',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'filter': filter, 'filter': filter,
'offset': offset, 'offset': offset,
'count': count, 'count': count,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) =>
Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Paginate and retrieve the channel member list as a map // /// Paginate and retrieve the channel member list as a map
// /// [channelID] Channel ID // /// [channelID] Channel ID
// /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin) // /// [filter] Member filter (0: All, 1: Channel owner, 2: Administrator, 3: Regular member, 4: Admin + Regular member, 5: Channel owner + Admin)
// /// [offset] Starting index // /// [offset] Starting index
// /// [count] Total count // /// [count] Total count
// Future<List<dynamic>> getChannelMemberListMap({ // Future<List<dynamic>> getChannelMemberListMap({
// required String channelID, // required String channelID,
// int filter = 0, // int filter = 0,
// int offset = 0, // int offset = 0,
// int count = 0, // int count = 0,
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'getChannelMemberList', // 'getChannelMemberList',
// _buildParam({ // _buildParam({
// 'channelID': channelID, // 'channelID': channelID,
// 'filter': filter, // 'filter': filter,
// 'offset': offset, // 'offset': offset,
// 'count': count, // 'count': count,
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toListMap(value)); // .then((value) => Utils.toListMap(value));
// /// Query the list of joined channels // /// Query the list of joined channels
// Future<List<ChannelInfo>> getJoinedChannelList({String? operationID}) => _channel // Future<List<ChannelInfo>> getJoinedChannelList({String? operationID}) => _channel
// .invokeMethod( // .invokeMethod(
// 'getJoinedChannelList', // 'getJoinedChannelList',
// _buildParam({ // _buildParam({
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
// //
// Future<List<ChannelInfo>> getJoinedChannelListPage({String? operationID, int offset = 0, int count = 40}) => _channel // Future<List<ChannelInfo>> getJoinedChannelListPage({String? operationID, int offset = 0, int count = 40}) => _channel
// .invokeMethod( // .invokeMethod(
// 'getJoinedChannelListPage', // 'getJoinedChannelListPage',
// _buildParam({ // _buildParam({
// 'offset': offset, // 'offset': offset,
// 'count': count, // 'count': count,
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
// /// Query the list of joined channels // /// Query the list of joined channels
// Future<List<dynamic>> getJoinedChannelListMap({String? operationID}) => // Future<List<dynamic>> getJoinedChannelListMap({String? operationID}) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'getJoinedChannelList', // 'getJoinedChannelList',
// _buildParam({ // _buildParam({
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toListMap(value)); // .then((value) => Utils.toListMap(value));
/// Check if the user has joined a channel /// Check if the user has joined a channel
/// [channelID] Channel ID /// [channelID] Channel ID
Future<bool> isJoinedChannel({ Future<bool> isJoinedChannel({
required String channelID, required String channelID,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'isJoinChannel', 'isJoinChannel',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => value == 'true' ? true : false); .then((value) => value == 'true' ? true : false);
/// Query channel information /// Query channel information
Future<List<ChannelInfo>> getChannelsInfo({ Future<List<ChannelInfo>> getChannelsInfo({
required List<String> channelIDList, required List<String> channelIDList,
String? operationID, String? operationID,
}) => }) =>
_channel _channel
.invokeMethod( .invokeMethod(
'getChannelsInfo', 'getChannelsInfo',
_buildParam({ _buildParam({
'channelIDList': channelIDList, 'channelIDList': channelIDList,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})) }))
.then((value) => .then((value) =>
Utils.toList(value, (map) => ChannelInfo.fromJson(map))); Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
/// Apply to join a channel, requiring approval from an administrator or the channel. /// Apply to join a channel, requiring approval from an administrator or the channel.
/// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code /// [joinSource] 2: Invited, 3: Searched, 4: Using a QR code
Future<dynamic> joinChannel( Future<dynamic> joinChannel(
{required String channelID, {required String channelID,
String? reason, String? reason,
String? operationID, String? operationID,
int joinSource = 3, int joinSource = 3,
String? ex}) => String? ex}) =>
_channel.invokeMethod( _channel.invokeMethod(
'joinChannel', 'joinChannel',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'reason': reason, 'reason': reason,
'joinSource': joinSource, 'joinSource': joinSource,
'ex': ex, 'ex': ex,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
/// Exit a channel /// Exit a channel
Future<dynamic> quitChannel({ Future<dynamic> quitChannel({
required String channelID, required String channelID,
String? operationID, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'quitChannel', 'quitChannel',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
// //
// /// Query a channel // /// Query a channel
// /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. // /// [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. // /// [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. // /// [isSearchChannelName] Whether to search by channel name; defaults to false if not set.
// Future<List<ChannelInfo>> searchChannels({ // Future<List<ChannelInfo>> searchChannels({
// List<String> keywordList = const [], // List<String> keywordList = const [],
// bool isSearchChannelID = false, // bool isSearchChannelID = false,
// bool isSearchChannelName = false, // bool isSearchChannelName = false,
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'searchChannels', // 'searchChannels',
// _buildParam({ // _buildParam({
// 'searchParam': { // 'searchParam': {
// 'keywordList': keywordList, // 'keywordList': keywordList,
// 'isSearchChannelID': isSearchChannelID, // 'isSearchChannelID': isSearchChannelID,
// 'isSearchChannelName': isSearchChannelName, // 'isSearchChannelName': isSearchChannelName,
// }, // },
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map))); // .then((value) => Utils.toList(value, (map) => ChannelInfo.fromJson(map)));
// /// Get a channel member list based on join time // /// Get a channel member list based on join time
// Future<List<ChannelMembersInfo>> getChannelMemberListByJoinTime({ // Future<List<ChannelMembersInfo>> getChannelMemberListByJoinTime({
// required String channelID, // required String channelID,
// int offset = 0, // int offset = 0,
// int count = 0, // int count = 0,
// int joinTimeBegin = 0, // int joinTimeBegin = 0,
// int joinTimeEnd = 0, // int joinTimeEnd = 0,
// List<String> filterUserIDList = const [], // List<String> filterUserIDList = const [],
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'getChannelMemberListByJoinTimeFilter', // 'getChannelMemberListByJoinTimeFilter',
// _buildParam({ // _buildParam({
// 'channelID': channelID, // 'channelID': channelID,
// 'offset': offset, // 'offset': offset,
// 'count': count, // 'count': count,
// 'joinTimeBegin': joinTimeBegin, // 'joinTimeBegin': joinTimeBegin,
// 'joinTimeEnd': joinTimeEnd, // 'joinTimeEnd': joinTimeEnd,
// 'excludeUserIDList': filterUserIDList, // 'excludeUserIDList': filterUserIDList,
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); // .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Search for channel members // /// Search for channel members
// /// [channelID] Channel ID // /// [channelID] Channel ID
// /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty. // /// [keywordList] Search keywords; currently, only one keyword is supported, and it cannot be empty.
// /// [isSearchUserID] Whether to search by member ID // /// [isSearchUserID] Whether to search by member ID
// /// [isSearchMemberNickname] Whether to search by member nickname // /// [isSearchMemberNickname] Whether to search by member nickname
// /// [offset] Start index // /// [offset] Start index
// /// [count] Total count to retrieve // /// [count] Total count to retrieve
// Future<List<ChannelMembersInfo>> searchChannelMembers({ // Future<List<ChannelMembersInfo>> searchChannelMembers({
// required String channelID, // required String channelID,
// List<String> keywordList = const [], // List<String> keywordList = const [],
// bool isSearchUserID = false, // bool isSearchUserID = false,
// bool isSearchMemberNickname = false, // bool isSearchMemberNickname = false,
// int offset = 0, // int offset = 0,
// int count = 40, // int count = 40,
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'searchChannelMembers', // 'searchChannelMembers',
// _buildParam({ // _buildParam({
// 'searchParam': { // 'searchParam': {
// 'channelID': channelID, // 'channelID': channelID,
// 'keywordList': keywordList, // 'keywordList': keywordList,
// 'isSearchUserID': isSearchUserID, // 'isSearchUserID': isSearchUserID,
// 'isSearchMemberNickname': isSearchMemberNickname, // 'isSearchMemberNickname': isSearchMemberNickname,
// 'offset': offset, // 'offset': offset,
// 'count': count, // 'count': count,
// }, // },
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map))); // .then((value) => Utils.toList(value, (map) => ChannelMembersInfo.fromJson(map)));
// /// Query a channel // /// Query a channel
// /// [channelID] Channel ID // /// [channelID] Channel ID
// /// [keywordList] Search keyword, currently only supports searching with one keyword, and it cannot be empty // /// [keywordList] Search keyword, currently only supports searching with one keyword, and it cannot be empty
// /// [isSearchUserID] Whether to search member IDs with the keyword // /// [isSearchUserID] Whether to search member IDs with the keyword
// /// [isSearchMemberNickname] Whether to search member nicknames with the keyword // /// [isSearchMemberNickname] Whether to search member nicknames with the keyword
// /// [offset] Starting index // /// [offset] Starting index
// /// [count] Total number to retrieve each time // /// [count] Total number to retrieve each time
// Future<List<dynamic>> searchChannelMembersListMap({ // Future<List<dynamic>> searchChannelMembersListMap({
// required String channelID, // required String channelID,
// List<String> keywordList = const [], // List<String> keywordList = const [],
// bool isSearchUserID = false, // bool isSearchUserID = false,
// bool isSearchMemberNickname = false, // bool isSearchMemberNickname = false,
// int offset = 0, // int offset = 0,
// int count = 40, // int count = 40,
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel // _channel
// .invokeMethod( // .invokeMethod(
// 'searchChannelMembers', // 'searchChannelMembers',
// _buildParam({ // _buildParam({
// 'searchParam': { // 'searchParam': {
// 'channelID': channelID, // 'channelID': channelID,
// 'keywordList': keywordList, // 'keywordList': keywordList,
// 'isSearchUserID': isSearchUserID, // 'isSearchUserID': isSearchUserID,
// 'isSearchMemberNickname': isSearchMemberNickname, // 'isSearchMemberNickname': isSearchMemberNickname,
// 'offset': offset, // 'offset': offset,
// 'count': count, // 'count': count,
// }, // },
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })) // }))
// .then((value) => Utils.toListMap(value)); // .then((value) => Utils.toListMap(value));
// //
// /// Modify the ChannelMemberInfo ex field // /// Modify the ChannelMemberInfo ex field
// Future<dynamic> setChannelMemberInfo({ // Future<dynamic> setChannelMemberInfo({
// required SetChannelMemberInfo channelMembersInfo, // required SetChannelMemberInfo channelMembersInfo,
// String? operationID, // String? operationID,
// }) => // }) =>
// _channel.invokeMethod( // _channel.invokeMethod(
// 'setChannelMemberInfo', // 'setChannelMemberInfo',
// _buildParam({ // _buildParam({
// 'info': channelMembersInfo.toJson(), // 'info': channelMembersInfo.toJson(),
// 'operationID': Utils.checkOperationID(operationID), // 'operationID': Utils.checkOperationID(operationID),
// })); // }));
Future<dynamic> getUsersInChannel( Future<dynamic> getUsersInChannel(
String channelID, String channelID,
List<String> userIDs, { List<String> userIDs, {
String? operationID, String? operationID,
}) => }) =>
_channel.invokeMethod( _channel.invokeMethod(
'getUsersInChannel', 'getUsersInChannel',
_buildParam({ _buildParam({
'channelID': channelID, 'channelID': channelID,
'userIDs': userIDs, 'userIDs': userIDs,
'operationID': Utils.checkOperationID(operationID), 'operationID': Utils.checkOperationID(operationID),
})); }));
static Map _buildParam(Map<String, dynamic> param) { /// Get channel short-term history messages
param["ManagerName"] = "channelManager"; /// [channelID] Channel ID
param = Utils.cleanMap(param); /// [count] Number of messages to retrieve
log('param: $param'); /// [sinceSeq] Internal sequence cursor for pagination (0 for first page)
Future<dynamic> getChannelHistoryMessages({
return param; required String channelID,
} int count = 20,
} int sinceSeq = 0,
String? operationID,
}) =>
_channel.invokeMethod(
'getChannelHistoryMessages',
_buildParam({
'channelID': channelID,
'count': count,
'sinceSeq': sinceSeq,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map<String, dynamic> param) {
param["ManagerName"] = "channelManager";
param = Utils.cleanMap(param);
log('param: $param');
return param;
}
}