聊天室
更新时间: 2023/10/17 03:52:33
聊天室功能概述
聊天室简介
聊天室是一种比群组更加松散、开放的形态,类似于一个广场,没有严格的准入机制,用户进出自由,一般来说也没有太固定的成员组织架构。典型的应用场景即我们非常熟悉的娱乐直播、教育直播内的聊天室。聊天室是一项付费拓展能力,需要在选购IM基础功能的情况下增购。
聊天室特点
- 进入聊天室时必须建立新的连接,退出聊天室或者被踢会断开连接,在聊天室中掉线会有自动重连,开发者需要监听聊天室连接状态来做出正确的界面表现。
- 支持聊天人数无上限。
- 支持同时进入多个聊天室,会建立多个连接。
- 不支持多端进入同一个聊天室,后进入的客户端会将前一个踢掉。
- 断开聊天室连接后,服务器不会再推送该聊天室的消息给此用户。
- 聊天室成员分固定成员和游客两种类型。
- 目前服务器控制最多支持同时进入10个聊天室,超过10个服务器会将之前登录的聊天室踢出一个
所有的聊天室的事件和回调都不在主线程,如果需要处理界面元素,需要抛任务到主线程。
初始化与清理
使用聊天室功能时必须调用 NIMChatRoom.ChatRoomApi.Init()
进行初始化,退出使用聊天室功能时需调用 NIMChatRoom.ChatRoomApi.Cleanup()
进行清理工作。且两者必须配对使用,避免造成不必要的异常。
建议 全局只调用一次 NIMChatRoom.ChatRoomApi.Cleanup()
。
C#private bool InitSDK()
{
//create a NIMConfig object if need
var config = new NimUtility.NimConfig();
config.AppKey = "YOUR APP KEY";
config.CommonSetting = new NimUtility.SdkCommonSetting
{
MaxLoginRetry = 3,//relogin times
PredownloadAttachmentThumbnail = true, //auto download the thumbnails for the image message
PreloadImageQuality = 100, // the quality of the image thumbnail
PreloadImageResize = "100x100", //the size of the image thumbnail
SyncSessionAck = true,
CustomTimeout = 15,// login timeout,seconds
};
//the appDataPath must be writable and readable.Normally,you can use `Application.persistentDataPath` to save log files and cache files.
//the appInstallPath is invalid,you should set `string.Empty` for it
//the config can be null.
//you should call `Init` before you call `login`.
string appDataPath = Path.Combine(Application.persistentDataPath, "Sample");
bool result = NIM.ClientAPI.Init(appDataPath, string.Empty, config);
if (!result)
{
Debug.LogError($"NIM.ClientAPI.Init failed");
return false;
}
Debug.Log($"NIM.ClientAPI.Init success!!");
//Next,you should initialize chat room plugin.
var chatRoomConfig = new NIMChatRoom.NIMChatRoomConfig();
chatRoomConfig.AppKey = "YOUR APP KEY";
NIMChatRoom.ChatRoomApi.Init(chatRoomConfig);
return true;
}
聊天室事件通知
聊天室的登录、登出,收到消息等等操作都是通过监听全局事件来通知给调用者。必须在调用登录操作之前,先监听所有的聊天室事件通知。建议在初始化完成后就注册事件监听。退出聊天室之后,如果想要进入同一个聊天室,需要等待该聊天室退出结束之后才能再次进入。
登录聊天室事件
在开发者调用登录聊天室接口后,通过此事件通知开发者登录进度和结果。登录步骤按本地服务初始,连接服务器中,服务器连接完成,登录鉴权中,登录鉴权完成五个步骤顺序进行,当登录鉴权成功后,可以获取得到当前聊天室的信息和本人在聊天室中的成员信息。
NIMChatRoomLoginStep
枚举说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomLoginStepInit | 1 | 本地服务初始化 |
kNIMChatRoomLoginStepServerConnecting | 2 | 服务器连接中 |
kNIMChatRoomLoginStepServerConnectOver | 3 | 服务器连接结束,连接结果error_code |
kNIMChatRoomLoginStepRoomAuthing | 4 | 聊天室鉴权中 |
kNIMChatRoomLoginStepRoomAuthOver | 5 | 聊天室鉴权结束,鉴权结果见error_code, error_code非408则需要开发者重新请求聊天室登录信息 |
- API 原型
public static event ChatRoomLoginDelegate LoginHandler;
- 示例
void OnLoginHandler(NIMChatRoomLoginStep loginStep, ResponseCode errorCode, ChatRoomInfo roomInfo, MemberInfo memberInfo)
{
//roomInfo,memberInfo有可能是null,需要判断是否为null,否则直接使用会导致NullReferenceException,从而导致回调线程异常,使其无法工作。
if (loginStep == NIMChatRoom.NIMChatRoomLoginStep.kNIMChatRoomLoginStepRoomAuthOver
&& errorCode == NIM.ResponseCode.kNIMResSuccess)
{
//进入聊天室成功
}
if (errorCode != NIM.ResponseCode.kNIMResSuccess)
{
//进入聊天室出错
}
}
//监听登录事件
NIMChatRoom.ChatRoomApi.LoginHandler += OnLoginHandler;
//取消监听
NIMChatRoom.ChatRoomApi.LoginHandler -= OnLoginHandler;
退出聊天室事件
通知已经退出聊天室,除了主动退出聊天室之外,还包括被多端、主播和管理员踢出,以及聊天室被关闭或者被解散也会收到离开聊天室的通知。收到该通知后,该聊天不再自动重连进入聊天室。重新登录需要重新获取token
NIMChatRoomExitReason
枚举参数说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomExitReasonExit | 0 | 自行退出,重登前需要重新请求登录 |
kNIMChatRoomExitReasonRoomInvalid | 1 | 聊天室已经被解散,重登前需要重新请求登录 |
kNIMChatRoomExitReasonKickByManager | 2 | 被管理员踢出,重登前需要重新请求登录 |
kNIMChatRoomExitReasonKickByMultiSpot | 3 | 多端登录被踢 |
kNIMChatRoomExitReasonIllegalState | 4 | 当前链接状态异常 |
kNIMChatRoomExitReasonBeBlacklisted | 5 | 被管理员加入黑名单 |
- API 原型
public static event ExitChatRoomDelegate ExitHandler;
- 示例
void OnExitHandler(long roomId, ResponseCode errorCode, NIMChatRoomExitReason reason)
{
...
}
//监听事件
NIM.NIMChatRoom.ChatRoomApi.ExitHandler += OnExitHandler;
//取消监听
NIM.NIMChatRoom.ChatRoomApi.ExitHandler -= OnExitHandler;
聊天室连接状态更改通知
网络出现波动导致聊天室断开连接时,会通知开发者聊天室的连接状态。SDK 会监听网络状况,自动重连。
NIMChatRoomLinkCondition
枚举参数说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomLinkConditionAlive | 0 | 连接正常 |
kNIMChatRoomLinkConditionDeadAndRetry | 1 | 连接失败,尝试重连,断网之后会通知此状态,等网络恢复会重新通知登录事件LoginHandler 。 |
kNIMChatRoomLinkConditionDead | 2 | 开发者需要重新申请聊天室登录信息 |
- API 原型
public static event LinkStateChangedDelegate LinkStateChanged;
- 示例
void OnLinkStateChanged(long roomId, NIMChatRoomLinkCondition state)
{
...
}
//监听事件
NIM.NIMChatRoom.ChatRoomApi.LinkStateChanged += OnLinkStateChanged;
//取消监听
NIM.NIMChatRoom.ChatRoomApi.LinkStateChanged -= OnLinkStateChanged;
接收消息事件
收到一条聊天室消息,消息内容为Message
。多个聊天室的消息都是通过该事件通知,开发者通过区分roomId
来区分各自的聊天室。所有的聊天室消息本地都不做存储。
NIMChatRoomMsgType
枚举说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomMsgTypeText | 0 | 文本类型消息 |
kNIMChatRoomMsgTypeImage | 1 | 图片类型消息 |
kNIMChatRoomMsgTypeAudio | 2 | 声音类型消息 |
kNIMChatRoomMsgTypeVideo | 3 | 视频类型消息 |
kNIMChatRoomMsgTypeLocation | 4 | 位置类型消息 |
kNIMChatRoomMsgTypeNotification | 5 | 活动室通知 |
kNIMChatRoomMsgTypeFile | 6 | 文件类型消息 |
kNIMChatRoomMsgTypeTips | 10 | 提醒类型消息 |
kNIMChatRoomMsgTypeRobot | 11 | 波特机器人消息 |
kNIMChatRoomMsgTypeCustom | 100 | 自定义消息 |
kNIMChatRoomMsgTypeUnknown | 1000 | 未知类型消息,作为默认值 |
Message
重要参数说明
类型 | 参数 | 说明 |
---|---|---|
long | RoomId | 消息所属的聊天室id(服务器填充) |
string | SenderId | 消息发送者 |
long | TimeStamp | 消息发送的时间戳(毫秒)(服务器填充) |
NIMChatRoomClientType | SenderClientType | 消息发送方客户端类型,发送方不需要填写(服务器填充) |
string | SenderNickName | 消息发送者昵称(服务器填充) |
string | SenderAvator | 消息发送者头像(服务器填充) |
string | SenderExtension | 消息发送者身份扩展字段(服务器填充) |
NIMChatRoomMsgType | MessageType | 消息类型,详见NIMChatRoomMsgType |
string | MessageAttachment | 消息内容,长度限制2048,如果约定的是json字符串,必须为可以解析为json的非格式化的字符串,除文本消息外,其他图片、语音、视频、地理位置、自定义消息都需要是目前约定好的json串,此内容是透传内容,本质上是IM 消息的附件内容。参考发送消息的相应类型消息 |
string | ClientMsgId | 客户端消息id,发送方填写 |
bool | resend_flag | 消息是否需要重发,true:需要,false:不需要,默认是false(暂不支持) |
string | Extension | 第三方扩展字段, 长度限制4096, 必须为可以解析为Json的非格式化的字符串 |
bool | AntiSpamEnabled | 是否需要过易盾反垃圾,true:需要,false:不需要,默认false |
string | AntiSpamContent | (可选)开发者自定义的反垃圾字段,长度限制:5000字符 |
string | LocalResourcePath | 媒体文件本地绝对路径(客户端)(暂不支持) |
string | LocalResourceId | 本地媒体文件ID(客户端)(暂不支持) |
- API 原型
public static event ReceiveMessageDelegate ReceiveMessageHandler;
- 示例
void OnRecvMessage(long roomId, Message message)
{
...
}
//监听事件
NIM.NIMChatRoom.ChatRoomApi.ReceiveMessageHandler += OnRecvMessage;
//取消监听
NIM.NIMChatRoom.ChatRoomApi.ReceiveMessageHandler -= OnRecvMessage;
发送消息结果通知
通过该事件,用户可以知道消息发送成功与否。
- API 原型
public static event SendMessageDelegate SendMessageHandler;
- 示例
void OnSendMessageResult(long roomId, ResponseCode code, Message message)
{
...
}
//监听事件
NIM.NIMChatRoom.ChatRoomApi.SendMessageHandler += OnSendMessageResult;
//取消监听
NIM.NIMChatRoom.ChatRoomApi.SendMessageHandler -= OnSendMessageResult;
收到聊天室通知消息事件
聊天室的所有通知消息都通过该事件接收。包括成员进入/离开聊天室,禁言/解除禁言,加黑/取消加黑等等,详见Notification
说明。
Notification
参数说明
类型 | 参数 | 说明 |
---|---|---|
NIMChatRoomNotificationId | Type | 通知类型,详见NIMChatRoomNotificationId |
Notification.Data | InnerData | 通知内容 |
NIMChatRoomNotificationId
枚举说明
枚举值 | 说明 |
---|---|
kNIMChatRoomNotificationIdMemberIn | 成员进入聊天室 |
kNIMChatRoomNotificationIdMemberExit | 成员离开聊天室 |
kNIMChatRoomNotificationIdAddBlack | 成员被加入黑名单 |
kNIMChatRoomNotificationIdRemoveBlack | 成员被取消黑名单 |
kNIMChatRoomNotificationIdAddMute | 成员被禁言 |
kNIMChatRoomNotificationIdRemoveMute | 成员被取消禁言 |
kNIMChatRoomNotificationIdAddManager | 设置为管理员 |
kNIMChatRoomNotificationIdRemoveManager | 被取消管理员 |
kNIMChatRoomNotificationIdAddFixed | 设置为聊天室固定成员 |
kNIMChatRoomNotificationIdRemoveFixed | 被取消聊天室固定成员 |
kNIMChatRoomNotificationIdClosed | 聊天室被关闭了 |
kNIMChatRoomNotificationIdInfoUpdated | 聊天室信息更新 |
kNIMChatRoomNotificationIdMemberKicked | 成员被踢出聊天室 |
kNIMChatRoomNotificationIdMemberTempMute | 临时禁言 |
kNIMChatRoomNotificationIdMemberTempUnMute | 解除临时禁言 |
kNIMChatRoomNotificationIdMyRoleUpdated | 成员主动更新了聊天室内的角色信息(仅指nick/avator/ext) |
kNIMChatRoomNotificationIdRoomMuted | 聊天室被禁言了,只有管理员可以发言,其他人都处于禁言状态 |
kNIMChatRoomNotificationIdRoomDeMuted | 聊天室解除全体禁言状态 |
再来看下``Notification.Data`参数说明
类型 | 参数 | 说明 |
---|---|---|
string | Extension | 上层开发自定义的事件通知扩展字段, 必须为可以解析为Json的非格式化的字符串 |
string | OperatorId | 操作者的账号id |
string | OperatorNick | 操作者昵称 |
string[] | TargetAccountsNick | 被操作者的nick列表 |
string[] | TargetIdCollection | 操作者的账号id列表 |
long | MuteDuration | 当通知为临时禁言相关时有该值,禁言时代表本次禁言的时长(秒),取消禁言时代表本次剩余禁言时长(秒) |
int | Muted | 当通知类型为成员进入时有该值,代表是否禁言状态,1:是 缺省或0:不是 |
int | TempMuted | 当通知类型为成员进入言时有该值,代表临时禁言状态 |
long | TempMutedDuration | 当通知类型为成员进入时,代表临时禁言时长(秒),其他通知不带此数据 |
- API 原型
public static event ReceiveNotificationDelegate ReceiveNotificationHandler;
- 示例
void OnReceiveNotificationHandler(long roomId, Notification notification)
{
...
}
//监听事件
NIM.NIMChatRoom.ChatRoomApi.ReceiveNotificationHandler += OnReceiveNotificationHandler;
//取消监听
NIM.NIMChatRoom.ChatRoomApi.ReceiveNotificationHandler -= OnReceiveNotificationHandler;
进入聊天室
获取token
聊天室依赖IM,进入聊天室前,需要通过调用IM模块接口获取进入聊天室的授权信息,在开发者调用登录聊天室接口时将此授权信息传入接口。聊天室可以同时登录多个,每个聊天室都要各自根据roomId
请求授权信息.
注意:这里调用的是 IM SDK 模块的接口
- API 原型
public static void RequestLoginInfo(long roomId, RequestChatRoomLoginInfoDelegate cb,string json_ext="");
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
cb | 结果通知回调 |
json_ext | 扩展信息,预留 |
- API 示例
//以测试房间号3001为例
long roomId = 3001;
string _token = "";
NIM.Plugin.ChatRoom.RequestLoginInfo(roomId, (response, authResult) =>
{
if (response == NIM.ResponseCode.kNIMResSuccess)
{
_token = authResult; //此token即为所需要的授权信息
//如果在直接调用NIMChatRoom.ChatRoomApi.Login,尽量请抛一个异步任务去操作,如下;
Loom.QueueOnMainThread (() => {
LoginData loginData = new LoginData();
loginData.Nick = "nickName";
loginData.Icon = "https://xxxx.png";//图片url
loginData.Extension = "{\"myExt\:\"111\"}";
loginData.NotifyExtension = "{\"myNotifyExt\:\"2222\"}";
NIMChatRoom.ChatRoomApi.Login(roomId,_token,loginData);
});
}
});
以上示例代码中的Loom
指Loom.cs
,是一个开源脚本,可以帮助开发者在 Unity 开发中便捷地调用主线程。Loom.cs 的 github 仓库地址:https://github.com/ufz-vislab/unity/blob/master/Misc/Loom.cs
登录聊天室
进入聊天室时,可以通过LoginData
设置本人在聊天室的昵称,头像,以及传递通知信息和扩展信息等。登录过程通过登录聊天室事件通知开发者。
LoginData
参数说明
类型 | 参数 | 说明 |
---|---|---|
string | Nick | 进入聊天室后展示的昵称,选填 |
string | Icon | 进入聊天室的头像,填头像的url,选填 |
string | Extension | 扩展字段信息,必须是json字符串,选填 |
string | NotifyExtension | 进入聊天室通知扩展字段,必须是json字符串,选填 |
- API 原型
public static void Login(long roomId, string request, LoginData loginData = null);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
request | 通过接口获取token获取的授权信息,必填 |
loginData | 进入聊天室时附带的个人信息,选填 |
- 示例
离开聊天室
离开聊天室,会断开聊天室对应的链接,并不再收到该聊天室的任何消息。如果用户要离开聊天室,可以手动调用离开聊天室接口。
- API 原型
public static void Exit(long roomId);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.Exit(roomId);
发送消息
先创建消息内容Message,然后通过NIMChatRoom.ChatRoomApi.SendMessage
接口。发送结果通过发送消息结果通知给用户。可发送多种类型消息,包括文本,图片,语音,视频,地理位置等等各种自定义消息,具体消息内容可参见IM的消息收发。本地没有保存消息历史记录,可以查询云端历史消息记录。
- 为保证用户体验(如避免服务器过载),目前针对消息接收,有两套流控机制。第一套针对普通消息,聊天室用户每秒至多可接收20条,超过部分会因为流控随机丢弃。第二套针对高优先级消息,每秒至多接收10条,超过部分无法保证不丢失。
- 为避免丢失重要消息(通常为服务端消息),可将发送聊天室消息的 HighPriority 参数设置为 true 实现高优先级接收服务端消息,进而保证高优先级消息流控上限内(每秒10条)的重要消息不丢失。详情请参见发送聊天室消息中的 HighPriority 参数说明。
- 1秒内默认最多可调用该接口100次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。
- API 原型
public static void SendMessage(long roomId, Message msg);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
msg | 消息内容 详见Message |
- 示例
Message createMessage(long room_id)
{
Message msg = new Message();
msg.MessageType = NIMChatRoomMsgType.kNIMChatRoomMsgTypeText;
msg.AntiSpamEnabled = false;
msg.AntiSpamContent = "";
msg.MessageAttachment = "这是一条测试消息";
msg.ClientMsgId = "nsgid"; //生成唯一的的消息id
return msg;
}
//以测试房间号3001为例
long roomId = 3001;
Message msg = createMessage(roomId);
NIMChatRoom.ChatRoomApi.SendMessage(roomId,msg);
查询云端历史消息记录
SDK支持查询在云端的聊天室历史消息记录。
- API 原型
public static void QueryMessageHistoryOnline(long roomId, long startTimeStamp, int count, QueryMessageHistoryResultDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
startTimeStamp | 查询起始时间戳(毫秒) |
count | 查询数量,必须为大于0的值 |
cb | 结果回调通知 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
long startTimetag = 1520391909233;//13位时间戳(毫秒)
NIMChatRoom.ChatRoomApi.QueryMessageHistoryOnline(roomId,startTimetag,20,(roomId,code,messages)=>
{
...
});
聊天室管理
获取聊天室信息
进入聊天室的事件中会有聊天室的信息,此外还能通过单独的接口获取聊天室信息。SDK 本地不缓存聊天室信息,只提供向服务器查询的接口,因此接口调用遵循服务器接口使用频率限制。
ChatRoomInfo
重要参数说明
类型 | 参数 | 说明 |
---|---|---|
long | RoomId | 聊天室id,即房间号 |
string | RoomName | 聊天室名称,管理员可以更新此信息 |
string | Announcement | 聊天室公告 |
string | BroadcastUrl | 视频直播流地址 |
string | CreatorId | 聊天室创建者账号id |
int | Valid | 聊天室有效标记,1:有效,0: 无效 |
string | Extension | 第三方扩展字段, 必须为可以解析为Json的非格式化的字符串, 长度4k |
int | OnlineMembersCount | 在线人数 |
bool | IsMuted | 聊天室禁言标志,1:禁言 0:不禁言 |
- API 原型
public static void GetRoomInfo(long roomId, GetRoomInfoDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
cb | 结果回调通知 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.GetRoomInfo(roomId, (room_Id, errorCode, info) =>
{
...
});
更新聊天室信息
SDK支持更新聊天室信息,仅管理员拥有此权限。目前只支持更新ChatRoomInfo 的RoomName
,Announcement
,BroadcastUrl
,Extension
四个属性。同时,在更新时可以设置是否在聊天室内广播通知。
- API 原型
public static void UpdateRoomInfo(long roomId, ChatRoomInfo info, UpdateRoomInfoDelegate cb, bool notify, string notify_ext);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填 |
info | 聊天室更新信息 |
cb | 结果回调通知 |
notify | 是否聊天室内广播通知,true:通知,此时notify_ext 不为空 false:不通知 |
notify_ext | 通知中的自定义字段,长度限制2048 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
var ri = new ChatRoomInfo
{
RoomId = roomId,
Announcement ="聊天室公告",
RoomName = "newName",
BroadcastUrl = "http://xxxxx",
Extension = "{\"test"\:\"1111\"}", //自定义扩展字串
};
NIMChatRoom.ChatRoomApi.UpdateRoomInfo(roomId, ri,(room_Id, errorCode) =>
{
...
},false,null);
获取聊天室成员列表
该接口可以获取固定成员信息、仅在线的固定成员信息及游客信息 MemberInfo,其中的扩展字段由该用户进入聊天室时填写。 固定成员有四种类型,分别是创建者,管理员,普通用户,受限用户。禁言用户和黑名单用户都属于受限用户。本地不缓存成员列表信息,均直接从云端获取。
MemberInfo
重要参数说明
类型 | 参数 | 说明 |
---|---|---|
long | RoomId | 聊天室id,即房间号 |
string | MemberId | 成员账号 |
ChatRoomMemberType | MemberType | 成员类型,-1:受限用户; 0:普通;1:创建者;2:管理员 ,详见ChatRoomMemberType |
int | Level | 成员级别: >=0,表示用户开发者可以自定义的级别 |
string | CreatorId | 聊天室创建者账号id |
string | Nick | 聊天室内的昵称字段,可以由用户进聊天室时提交 |
string | MemberIcon | 聊天室内的头像,可以由用户进聊天室时提交 |
string | Extension | 第三方扩展字段, 必须为可以解析为Json的非格式化的字符串, 长度4k |
NIMChatRoomOnlineState | OnlineState | 成员是否处于在线状态, 仅特殊成员才可能离线, 对游客/匿名用户而言只能是在线,0:离线 1: 在线 |
NIMChatRoomGuestFlag | GuestFlag | 是否是普通游客类型,0:不是游客,1:是游客; 游客身份在聊天室中没有持久化, 只有在线时才会有内存状态 |
long | JoinTimeStamp | 进入聊天室的时间戳(毫秒),对于离线成员该字段为空 |
bool | IsInBlacklist | 是否在黑名单 1:是 0:否 |
bool | IsMuted | 是否被禁言 1:是 0:否 |
bool | IsValid | 是否有效 1:是 0:否 |
bool | TempMuted | 是否被临时禁言 1:是 0:否 |
long | TempMuteRestDuration | 临时禁言剩余时长,单位秒 |
long | UpdateTimetag | 固定成员的记录更新时间戳,用于固定成员列表的排列查询 |
NIMChatRoomGetMemberType
枚举说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomGetMemberTypeSolid | 0 | 固定成员,包括创建者,管理员,普通等级用户,受限用户(禁言+黑名单),即使非在线也可以在列表中看到,有数量限制 |
kNIMChatRoomGetMemberTypeTemp | 1 | 非固定成员,又称临时成员,只有在线时才能在列表中看到,数量无上限 |
成员类型ChatRoomMemberType
枚举说明
枚举 | 值 | 说明 |
---|---|---|
Restricted | -1 | 受限制成员 |
Normal | 0 | 普通成员 |
Creator | 1 | 创建者 |
Manager | 2 | 管理员 |
- API 原型
public static void QueryMembersOnline(long roomId, NIMChatRoomGetMemberType memberType, long timeOffset, int limit, QueryMembersResultDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
memberType | 成员类型 |
timeOffset | 距离当前时间的时间戳 |
limit | 查询数量 |
cb | 结果回调通知 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
long timeOffset = 0;//距离当前时间的时间戳
NIMChatRoom.ChatRoomApi.QueryMembersOnline(roomId,NIMChatRoomGetMemberType.kNIMChatRoomGetMemberTypeSolid,timeOffset,20, (room_Id, errorCode, members) =>
{
...
});
获取指定聊天室成员信息
该接口可以获取指定多个账号的成员信息MemberInfo,从云端获取。
- API 原型
public static void QueryMemberInfosByIdCollection(long roomId, string[] idCollection, QueryMembersResultDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
idCollection | 成员id集合 |
cb | 结果回调通知 |
- 示例
//以测试房间号3001,聊天室成员test1,test2为例
long roomId = 3001;
string[] ids = new string[] ();
ids.add("test1");
ids.add("test2");
NIMChatRoom.ChatRoomApi.QueryMemberInfosByIdCollection(roomId,ids, (room_Id, errorCode, members) =>
{
...
});
更新自己的聊天室信息
目前支持更新本人聊天室成员信息。目前只支持昵称,头像和扩展字段的更新。可以设置更新是否通知,如果设置通知,则通过收到聊天室通知消息事件通知给用户。
- API 原型
public static void UpdateMyRoleInfo(long roomId, MemberInfo info, UpdateMyRoleDelegate cb, bool notify, string notify_ext,string jsonExt = null);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
MemberInfo | 成员信息,将需要修改的字段修改为新的字段,目前只支持更新 MemberInfo 的 Nick , MemberIcon ,Extension 三个属性。详见MemberInfo |
cb | 结果回调通知 |
notify | 是否聊天室内广播通知,true:通知,此时notify_ext 不为空 false:不通知 |
notify_ext | 通知中的自定义字段,长度限制2048 |
jsonExt | 预留字段 |
- 示例
//以测试房间号3001,聊天室成员test1,test2为例
long roomId = 3001;
var ri = new MemberInfo
{
RoomId = roomId,
Nick = "newNick",
MemberIcon = "http://xxxx/newIcon.png",
Extension = null,
};
NIMChatRoom.ChatRoomApi.UpdateMyRoleInfo(roomId,ri, (room_Id, errorCode) =>
{
...
},false,null);
聊天室权限管理
设置成员身份标识
设置/取消管理员时, 服务器会通过收到聊天室通知消息事件通知给用户。通知类型查看说明。如果游客被设为管理员,再被取消管理员,该成员不再变为游客,而成为普通成员。
NIMChatRoomMemberAttribute
枚举说明
枚举 | 值 | 说明 |
---|---|---|
kNIMChatRoomMemberAttributeAdminister | 1 | 管理员(固定成员),仅创建者拥有操作提升权限 |
kNIMChatRoomMemberAttributeNomalSold | 2 | 普通成员,操作者必须是创建者或管理员 |
kNIMChatRoomMemberAttributeBlackList | -1 | 黑名单成员,操作者必须是创建者或管理员 |
kNIMChatRoomMemberAttributeMuteList | -2 | 被永久禁言成员,操作者必须是创建者或管理员 |
MemberProperty
参数说明
类型 | 参数 | 说明 |
---|---|---|
string | MemberId | 成员账号id |
NIMChatRoomMemberAttribute | Attribute | 成员身份标识,详见NIMChatRoomMemberAttribute |
bool | Optional | 对应设置成员身份标识,1:设置 0:取消设置 |
int | Level | 用户等级,对Optional= 1 or 2时才有效 |
JsonExtension | NotifyExtension | 操作产生的通知事件中开发者自定义的扩展字段,需要是json字符串 |
- API 原型
public static void SetMemberPropertyOnline(long roomId, MemberProperty property, SetMemberPropertyDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
property | 成员属性信息,详见MemberProperty |
cb | 操作结果回调 |
- 示例
//以测试房间号3001,聊天室成员test1为例
long roomId = 3001;
//设置/取消管理员
var ri = new MemberProperty
{
RoomId = roomId,
MemberId = "test1",
Attribute = NIMChatRoomMemberAttribute.kNIMChatRoomMemberAttributeAdminister,
Optional = true,//如果ri.Optional设置为false,则为取消管理员
};
NIMChatRoom.ChatRoomApi.SetMemberPropertyOnline(roomId,ri, (room_Id, errorCode,memberInfo) =>
{
...
});
//设置/取消永久禁言
var prop = new MemberProperty
{
RoomId = roomId,
MemberId = "test1",
Attribute = NIMChatRoomMemberAttribute.kNIMChatRoomMemberAttributeMuteList,
Optional = true,//如果ri.Optional设置为false,则为取消禁言
};
NIMChatRoom.ChatRoomApi.SetMemberPropertyOnline(roomId,prop, (room_Id, errorCode,memberInfo) =>
{
...
});
临时禁言成员
此接口提供临时禁言/解除临时禁言成员的功能。如果需要永久禁言,请通过设置成员身份标识接口将用户设置为禁言用户。 如果禁言时长时间到了,自动取消禁言。设置临时禁言成功后的通知消息中,包含的时长是禁言剩余时长。若设置禁言时长为0,表示取消临时禁言。若第一次设置的禁言时长还没结束,又设置第二次临时禁言,以第二次设置的时间开始计时。
- API 原型
public static void TempMuteMember(long roomId, string accid, long duration, TempMuteMemberDelegate cb, bool notify, string notify_ext);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
accid | 成员账号,必填) |
duration | 临时禁言时长(秒),解禁填0 |
cb | 操作结果回调 |
notify | 是否聊天室内广播通知 |
notify_ext | 通知中的自定义字段,长度限制2048 |
- 示例
//以测试房间号3001,聊天室成员test1为例,禁言60秒
long roomId = 3001;
NIMChatRoom.ChatRoomApi.TempMuteMember(roomId,"test1", 60,(room_Id, errorCode,memberInfo) =>
{
...
},false,null);
踢出在线成员
踢出成员。仅管理员可以踢;如目标是管理员仅创建者可以踢。可以添加被踢通知扩展字段,这个字段会放到被踢通知的扩展字段中。被踢出聊天室的通知通过聊天室通知事件下发给开发者。
- API 原型
public static void RemoveMember(long roomId, string memberId, string notify, RemoveMemberDelegate cb);
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
memberId | 成员账号) |
notify | 放到事件通知中的扩展字段 |
cb | 操作结果回调 |
- 示例
//以测试房间号3001,聊天室成员test1为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.RemoveMember(roomId,"test1","notify" ,(room_Id, errorCode) =>
{
...
});
聊天室队列服务
聊天室提供队列服务,针对直播连麦场景使用。
新加(更新)麦序队列元素
聊天室队列服务:加入或者更新队列元素(聊天室管理员权限).当 element_key
不存在时候,调用该接口,表示加入新元素。
当 element_key
已存在的时候,调用该接口,表示修改对应 element_key
的 elemnet_value
。
- API 原型
public static void QueueOfferAsync(long roomId, string element_key, string elemnet_value, ChatRoomQueueOfferDelegate cb, string json_extension = "");
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
element_key | 新元素的唯一key,长度限制128字节 |
elemnet_value | 新元素内容,长度限制4096字节 |
cb | 操作结果回调 |
json_extension | 扩展参数,预留 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.QueueOfferAsync(roomId,"key1","value1", (room_Id, errorCode) =>
{
...
},null);
取出麦序队列元素
element_key
是唯一键,element_key
若为空, 则表示取出头元素。若不为空, 则表示取出指定元素。操作成功后,在回调通知中result
获得该元素的key和value。
- API 原型
public static void QueuePollAsync(long roomId, string element_key, ChatRoomQueuePollDelegate cb, string json_extension = "");
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
element_key | 元素的唯一key,长度限制128字节 |
cb | 操作结果回调 |
json_extension | 扩展参数,预留 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.QueuePollAsync(roomId,"key1",(room_Id, errorCode,result) =>
{
//result:获取的队列元素的json字符串,如{"key":"key1","value":"value1"}
...
},null);
获取所有队列元素
排序列出所有队列元素,在result返回队列元素的json数组。
- API 原型
public static void QueueListAsync(long roomId, ChatRoomQueueListDelegate cb, string json_extension = "");
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
cb | 操作结果回调 |
json_extension | 扩展参数,预留 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.QueueListAsync(roomId,(room_Id, errorCode,result) =>
{
//result:获取的队列元素的json数组,如[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"}]
...
},null);
删除麦序队列
将整个麦序队列删除,需要管理员权限。
- API 原型
public static void QueueDropAsync(long roomId, ChatRoomQueueDropDelegate cb, string json_extension = "");
- 参数说明
参数 | 说明 |
---|---|
roomId | 聊天室id,即房间号, 必填) |
cb | 操作结果回调 |
json_extension | 扩展参数,预留 |
- 示例
//以测试房间号3001为例
long roomId = 3001;
NIMChatRoom.ChatRoomApi.QueueDropAsync(roomId,(room_Id, errorCode) =>
{
...
},null);
清理聊天室
聊天室资源清理。全局只调用一次。在NIM.ClientApi.Cleanup
之前调用。
- API 原型
public static void Cleanup();
- 示例
private void OnApplicationQuit()
{
//You Must call logout and cleanup resources for IM SDK.
//In this,you should call synchronous method.
// `Cleanup` should be called once only
//Firstly,you should exit chat room.
NIMChatRoom.ChatRoomApi.Exit(CHATROOM_ID);
NIM.ClientAPI.Logout(NIMLogoutType.kNIMLogoutAppExit);
//Cleanup chat room plugin and then cleanup IM resources.
NIMChatRoom.ChatRoomApi.Cleanup();
NIM.ClientAPI.Cleanup();
}