Commit 4b292cab by hweeeeeei

添加接口:主动退出会话

parent bc4eb4f3
...@@ -235,6 +235,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -235,6 +235,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.notIn(ImConversationMembers::getId, imClientSender.getId()) .notIn(ImConversationMembers::getId, imClientSender.getId())
); );
...@@ -360,6 +362,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -360,6 +362,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.notIn(ImConversationMembers::getId, imClientSender.getId()) .notIn(ImConversationMembers::getId, imClientSender.getId())
); );
...@@ -456,12 +460,151 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -456,12 +460,151 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception { public ApiResult<Boolean> leaveConversation(ImClientLeaveConversation imClientToConversation) throws Exception {
return null;
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImConversation imConversationById = imConversationService.getById(imClientToConversation.getConversationId());
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.orderByAsc(ImConversationMembers::getCreateTime)
.notIn(ImConversationMembers::getId, imClientSender.getId())
);
if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
throw new Exception("deleteImConversationMembers");
}
// 判断用户是否在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, imClientSender.getId())
);
// 将client从会话移除
boolean b = imConversationMembersService.deleteImConversationMembers(members.getId());
if (!b) {
throw new Exception("deleteImConversationMembers");
}
// ws 退出事件通知给群内其他人 ----------
// 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
content.put("type", -1012); // xx主动退出会话
try {
String asString = JSON_MAPPER.writeValueAsString(content);
imMessage.setContent(asString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystem(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imClientToConversation.getConversationId());
boolean save = imMessageService.save(imMessage);
if (!save) {
throw new Exception("deleteImConversationMembers");
}
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
}
// 判断是否为群主
if (imConversationById == null || !imConversationById.getCreator().equals(imClientSender.getId())) {
// return ApiResult.result(false);
}
return ApiResult.ok();
} }
@Override @Override
public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate imConversationNameUpdate) throws Exception { public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate imConversationNameUpdate) throws Exception {
return null;
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
ImConversation imConversationById = imConversationService.getById(imConversationNameUpdate.getConversationId());
// 判断是否为群主
if (imConversationById == null || !imConversationById.getCreator().equals(imClientSender.getId())) {
return ApiResult.result(false);
}
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imConversationNameUpdate.getConversationId())
.notIn(ImConversationMembers::getId, imClientSender.getId())
);
imConversationById.setName(imConversationNameUpdate.getName());
boolean b = imConversationService.updateById(imConversationById);
if (b) {
//TODO 下发群名称变动事件
return ApiResult.ok();
} else {
return ApiResult.fail();
}
} }
@Override @Override
...@@ -483,6 +626,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -483,6 +626,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda() new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imConversationAttrUpdate.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imConversationAttrUpdate.getConversationId())
.notIn(ImConversationMembers::getId, imClientSender.getId()) .notIn(ImConversationMembers::getId, imClientSender.getId())
); );
...@@ -500,6 +644,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -500,6 +644,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
boolean b = imConversationService.updateById(imConversationById); boolean b = imConversationService.updateById(imConversationById);
if (b) { if (b) {
//TODO 下发群变动事件
return ApiResult.ok(); return ApiResult.ok();
} else { } else {
......
# wecloud-im 前端Websocket对接文档 # wecloud-im 前端Websocket对接文档
...@@ -207,6 +207,8 @@ wss://ws.im199.com/ws?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ3ZWI ...@@ -207,6 +207,8 @@ wss://ws.im199.com/ws?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJ3ZWI
- xx已接收某消息 -1009 - xx已接收某消息 -1009
- xx已读某条消息 -1010 - xx已读某条消息 -1010
- 你被xx拉入新会话 -1011 - 你被xx拉入新会话 -1011
- 主动退出会话 -1012
- 成为新群主 -1013
以上基础平台固定类型均使用负数,所有正数留给自定义扩展类型使用,0 作为「没有类型」被保留起来。 以上基础平台固定类型均使用负数,所有正数留给自定义扩展类型使用,0 作为「没有类型」被保留起来。
...@@ -450,6 +452,85 @@ websocket是异步的 有可能你很快速的发送了几条消息,服务器响 ...@@ -450,6 +452,85 @@ websocket是异步的 有可能你很快速的发送了几条消息,服务器响
- xx已读某条消息 -1010 - xx已读某条消息 -1010
- 你被xx拉入新会话 -1011 - 你被xx拉入新会话 -1011
- xx主动退出会话 -1012
- xx成为新群主 -1013
### 下发 xx成为新群主
"cmd":5
该event事件消息类型需要已读和已接收回执,该消息会存入离线消息列表和消息历史记录列表
```json
{
"cmd":5,
"code":200,
"msg":"成功",
"data":{
"msgId":1427109835333308416,
"createTime":1629086007054,
"sender":"aaaaa1",
"content":{
"type":-1013
},
"event":true,
"conversationId":1427109730563788800
},
"reqId":null
}
```
**参数描述**
| 字段名 | 字段类型 | 是否可空 | 说明 |
| ------ | -------- | -------- | ----------------- |
| sender | String | 否 | 新群主的client ID |
| | | | |
### 下发 xx主动退出会话
"cmd":5
该event事件消息类型需要已读和已接收回执,该消息会存入离线消息列表和消息历史记录列表
```json
{
"cmd":5,
"code":200,
"msg":"成功",
"data":{
"msgId":1427109835333308416,
"createTime":1629086007054,
"sender":"aaaaa1",
"content":{
"type":-1012
},
"event":true,
"conversationId":1427109730563788800
},
"reqId":null
}
```
**参数描述**
| 字段名 | 字段类型 | 是否可空 | 说明 |
| ------ | -------- | -------- | --------------- |
| sender | String | 否 | 退出的client ID |
| | | | |
### 下发 xx被xx移出会话 ### 下发 xx被xx移出会话
...@@ -471,6 +552,7 @@ type为-1008 ...@@ -471,6 +552,7 @@ type为-1008
"data":{ "data":{
"msgId":1427109835333308416, "msgId":1427109835333308416,
"createTime":1629086007054, "createTime":1629086007054,
"sender":"aaaaa1",
"content":{ "content":{
"operator":"aaaaa1", "operator":"aaaaa1",
"passivityOperator":"aaaaa2", "passivityOperator":"aaaaa2",
...@@ -513,6 +595,7 @@ type为-1007 ...@@ -513,6 +595,7 @@ type为-1007
"data":{ "data":{
"msgId":1427109835333308416, "msgId":1427109835333308416,
"createTime":1629086007054, "createTime":1629086007054,
"sender":"aaaaa1",
"content":{ "content":{
"operator":"aaaaa1", "operator":"aaaaa1",
"passivityOperator":"aaaaa2", "passivityOperator":"aaaaa2",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment