SDK 文档

服务端 API

文档中心 > 即时通信 IM > 最佳实践 > 实现群组成员禁言/取消禁言

实现群组成员禁言/取消禁言

最近更新时间:2021-04-15 15:47:55

您可以对群内某一成员或全体成员禁言并配置禁言时长,在禁言期间被禁言成员不能在当前群内发送消息,该操作只针对当前群有效。禁言期间,被禁言成员退群后重新加入该群禁言依旧有效,直至禁言时间结束或被取消禁言。
本文主要介绍 Web 和小程序端 SDK 中如何对群成员禁言/取消禁言。

使用限制

  • 群组类型限制

    好友工作群(Work 或旧版的 Private) 陌生人交友群(Public) 临时会议群(Meeting 或旧版的 ChatRoom) 直播群(AvChatRoom)
    不支持 支持 支持 支持
  • 成员角色限制

    成员角色 权限
    App 管理员 支持对当前 SDKAppID 下所有群内的所有成员进行禁言/取消禁言操作
    群主 支持对当前群内的管理员和普通成员进行禁言/取消禁言操作
    群管理员 支持对当前群内的普通成员进行禁言/取消禁言操作
    普通成员 无禁言权限

操作步骤

步骤1:确认操作权限

  1. 调用 getGroupProfile 接口查看所在群组类型,确认是否支持禁言/取消禁言操作。
    注意:

    若为群组类型为 Private 或 Work(好友工作群)则不支持禁言。

  2. 调用 getGroupMemberProfile 接口查看指定的 userID 在当前群的成员角色,确认是否有权限进行禁言/取消禁言操作。

步骤2:禁言/取消禁言群成员

禁言/取消禁言单个用户

App 管理员、群主或群管理员调用接口 setGroupMemberMuteTime 可禁言/取消禁言指定群组内的指定成员,单次调用仅支持禁言/取消禁言单个群成员。
请求参数如下表所示。

名称 类型 描述
groupID String 群 ID
userID String 群成员 ID
muteTime Number 禁言时长,单位为秒。设置为0,表示取消禁言

请求示例如下:

let promise = tim.setGroupMemberMuteTime({
 groupID: 'group1',
 userID: 'user1',
 muteTime: 1000
});

禁言/取消禁言全体成员

注意:

使用该功能需将 SDK 升级至2.6.2及以上版本。全体禁言或取消全体禁言,暂无相关的群提示消息下发。

App 管理员或群主调用 updateGroupProfile 接口可禁言/取消禁言指定群的全体管理员和普通成员。
请求参数如下表所示。

名称 类型 描述
groupID String 群 ID
muteAllMembers Boolean 设置禁言,true 表示全体禁言,false 表示取消全体禁言

请求示例如下:

let promise = tim.updateGroupProfile({
 groupID: 'group1',
 muteAllMembers:true, // true 全体禁言,false 取消全体禁言
});
promise.then(function(imResponse) {
 console.log(imResponse.data.group) // 修改成功后的群组详细资料
}).catch(function(imError) {
 console.warn('updateGroupProfile error:', imError); // 修改群组资料失败的相关信息
});

步骤3:监听处理 TIM.EVENT.MESSAGE_RECEIVED 事件

禁言后,该群成员收到的被禁言 群提示消息,可通过遍历 event.data 获取相关数据并渲染到页面。

说明:

在收到禁言/取消禁言的相关通知时,建议您自行实现 disable/enable 输入框或输入区域的状态。

tim.on(TIM.EVENT.MESSAGE_RECEIVED, function(event) {
  // 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面
  // event.name - TIM.EVENT.MESSAGE_RECEIVED
  // event.data - 存储 Message 对象的数组 - [Message]
  const length = event.data.length;
  let message;
  for (let i = 0; i < length; i++) {
    message = event.data[i];
    switch (message.type) {
      // 禁言用户 A,用户 A 会收到被禁言的群提示消息
      case TIM.TYPES.MSG_GRP_TIP:
        this._handleGroupTip(message);
        break;
      case TIM.TYPES.MSG_TEXT: // 文本消息,更多消息类型请参考 Message
        break;
      default:
        break;
    }
  }
});

_handleGroupTip(message) {
  switch (message.payload.operationType) {
    case TIM.TYPES.GRP_TIP_MBR_PROFILE_UPDATED: // 群成员资料变更,例如:群成员被禁言
      const memberList = message.payload.memberList;
      for (let member of memberList) {
        console.log(`${member.userID} 被禁言${member.muteTime}秒`);
      }
      break;
    case TIM.TYPES.GRP_TIP_MBR_JOIN: // 有成员加群
      break;
    case TIM.TYPES.GRP_TIP_MBR_QUIT: // 有群成员退群
      break;
    case TIM.TYPES.GRP_TIP_MBR_KICKED_OUT: // 有群成员被踢出群
      break;
    case TIM.TYPES.GRP_TIP_GRP_PROFILE_UPDATED: // 群组资料变更
      break;
    default:
      break;
  }
}

步骤4:判断禁言状态

  • 2.6.2及以上版本 SDK,调用 getGroupMemberList 接口可以拉取群成员禁言截止时间戳(muteUntil),您根据该值即可判断群成员是否被禁言,以及禁言的剩余时间。取消禁言后,该群成员的 GroupMember.muteUntil * 1000 <= Date.now()。

    // 从v2.6.2 起,getGroupMemberList 接口支持拉取群成员禁言截止时间戳。
    let promise = tim.getGroupMemberList({ groupID: 'group1', count: 30, offset:0 }); // 从0开始拉取30个群成员
    promise.then(function(imResponse) {
    console.log(imResponse.data.memberList); // 群成员列表
    for (let groupMember of imResponse.data.memberList) {
     if (groupMember.muteUntil * 1000  > Date.now()) {
       console.log(`${groupMember.userID} 禁言中`);
     } else {
       console.log(`${groupMember.userID} 未被禁言`);
     }
    }
    }).catch(function(imError) {
    console.warn('getGroupMemberProfile error:', imError);
    });
  • 2.6.2以下版本 SDK, 调用 getGroupMemberProfile 接口可以查询群成员禁言截止时间戳(muteUntil)等详细资料。

目录