Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wecloud_im_server
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hewei
wecloud_im_server
Commits
094d7b19
Commit
094d7b19
authored
May 07, 2022
by
罗长华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成单聊消息、事件消息发送逻辑
parent
e01365eb
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
553 additions
and
139 deletions
+553
-139
core/src/main/java/com/wecloud/im/mapper/ImConversationMapper.java
+2
-1
core/src/main/java/com/wecloud/im/param/add/ImConversationCreate.java
+2
-2
core/src/main/java/com/wecloud/im/param/add/ServerImConversationCreate.java
+64
-0
core/src/main/java/com/wecloud/im/service/ImConversationService.java
+27
-8
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
+198
-26
core/src/main/java/com/wecloud/im/service/impl/ImMessageServiceImpl.java
+193
-97
im-sdk/src/main/java/com/wecloud/im/sdk/sample/PublishPrivateChatMessageSample.java
+10
-5
im-sdk/src/main/java/com/wecloud/im/sdk/sample/PublishPrivateChatMessageStatusSample.java
+57
-0
No files found.
core/src/main/java/com/wecloud/im/mapper/ImConversationMapper.java
View file @
094d7b19
package
com
.
wecloud
.
im
.
mapper
;
import
java.io.Serializable
;
import
java.util.Collection
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Param
;
...
...
@@ -102,5 +103,5 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
* @Return
*/
List
<
ImConversation
>
getConversationBySenderAndReceivers
(
@Param
(
"senderImClientId"
)
Long
senderImClientId
,
@Param
(
"receiverImClientIds"
)
List
<
Long
>
receiverImClientIds
);
"receiverImClientIds"
)
Collection
<
Long
>
receiverImClientIds
);
}
core/src/main/java/com/wecloud/im/param/add/ImConversationCreate.java
View file @
094d7b19
...
...
@@ -7,10 +7,10 @@ import lombok.Data;
import
lombok.EqualsAndHashCode
;
import
lombok.experimental.Accessors
;
import
javax.validation.constraints.NotNull
;
import
java.util.HashMap
;
import
java.util.List
;
import
javax.validation.constraints.NotNull
;
/**
* 会话表
*
...
...
core/src/main/java/com/wecloud/im/param/add/ServerImConversationCreate.java
0 → 100644
View file @
094d7b19
package
com
.
wecloud
.
im
.
param
.
add
;
import
io.swagger.annotations.ApiModel
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.util.List
;
import
com.wecloud.im.entity.ImApplication
;
import
com.wecloud.im.entity.ImClient
;
import
com.wecloud.im.sdk.enums.ChatTypeEnum
;
import
com.wecloud.imserver.client.model.enums.DeviceTypeEnum
;
/**
*
* @Author luozh
* @Date 2022年05月07日 10:13
* @Version 1.0
*/
@Data
@Accessors
(
chain
=
true
)
@ApiModel
(
value
=
"ImConversationCreate"
)
public
class
ServerImConversationCreate
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 可选 对话的名字,可为群组命名。")
*/
private
String
name
;
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
*/
private
String
attributes
;
/**
* 应用, 前端")
*/
private
ImApplication
application
;
/**
* 创建者 前端请求不传")
*/
private
ImClient
creator
;
/**
* 可选 成员列表
*/
private
List
<
ImClient
>
members
;
/**
* @see com.wecloud.im.sdk.enums.ChatTypeEnum
*/
/**
* 会话属性,1:单聊,2:普通群,3:万人群, 4:聊天室")
*/
private
ChatTypeEnum
chatType
;
/**
* 客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs, 需与生成sign时的值一致")
*/
private
DeviceTypeEnum
platform
;
}
core/src/main/java/com/wecloud/im/service/ImConversationService.java
View file @
094d7b19
package
com
.
wecloud
.
im
.
service
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.param.*
;
import
com.wecloud.im.param.add.*
;
import
com.wecloud.im.vo.ChatRoomMemberVo
;
import
com.wecloud.im.vo.ConversationVo
;
import
com.wecloud.im.vo.ImConversationCreateVo
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.service.BaseService
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
...
...
@@ -14,6 +7,32 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
import
java.util.Collection
;
import
java.util.List
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.param.ChatRoomMemberPageParam
;
import
com.wecloud.im.param.DisbandConversationParam
;
import
com.wecloud.im.param.ExitChatRoomParam
;
import
com.wecloud.im.param.GroupChatSettingParam
;
import
com.wecloud.im.param.ImConversationPageParam
;
import
com.wecloud.im.param.ImConversationQueryParam
;
import
com.wecloud.im.param.ImConversationQueryVo
;
import
com.wecloud.im.param.IntoChatRoomParam
;
import
com.wecloud.im.param.ListConversationParam
;
import
com.wecloud.im.param.MutedGroupMemberParam
;
import
com.wecloud.im.param.MutedGroupParam
;
import
com.wecloud.im.param.SetAdminsParam
;
import
com.wecloud.im.param.TransferOwnerParam
;
import
com.wecloud.im.param.add.ImClientLeaveConversation
;
import
com.wecloud.im.param.add.ImClientToConversation
;
import
com.wecloud.im.param.add.ImConversationAttrUpdate
;
import
com.wecloud.im.param.add.ImConversationCreate
;
import
com.wecloud.im.param.add.ImConversationDisplayUpdate
;
import
com.wecloud.im.param.add.ImConversationNameUpdate
;
import
com.wecloud.im.param.add.ServerImConversationCreate
;
import
com.wecloud.im.vo.ChatRoomMemberVo
;
import
com.wecloud.im.vo.ConversationVo
;
import
com.wecloud.im.vo.ImConversationCreateVo
;
/**
* 会话表 服务类
*
...
...
@@ -46,7 +65,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param imConversationCreate
* @return
*/
ImConversation
createImConversationForSdk
(
ImConversationCreate
imConversationCreate
);
ImConversation
serverCreateImConversation
(
Server
ImConversationCreate
imConversationCreate
);
/**
...
...
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
View file @
094d7b19
package
com
.
wecloud
.
im
.
service
.
impl
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.enums.BaseEnum
;
import
io.geekidea.springbootplus.framework.common.exception.BusinessException
;
import
io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl
;
import
io.geekidea.springbootplus.framework.core.pagination.PageInfo
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
...
...
@@ -9,16 +34,49 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.wecloud.im.chatroom.cache.ChatRoomCacheManager
;
import
com.wecloud.im.entity.*
;
import
com.wecloud.im.entity.ImApplication
;
import
com.wecloud.im.entity.ImClient
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.entity.ImConversationMembers
;
import
com.wecloud.im.entity.ImMessage
;
import
com.wecloud.im.entity.ImMessageOnlineSend
;
import
com.wecloud.im.mapper.ImConversationMapper
;
import
com.wecloud.im.param.*
;
import
com.wecloud.im.param.add.*
;
import
com.wecloud.im.param.ChatRoomMemberPageParam
;
import
com.wecloud.im.param.DisbandConversationParam
;
import
com.wecloud.im.param.ExitChatRoomParam
;
import
com.wecloud.im.param.GroupChatSettingParam
;
import
com.wecloud.im.param.ImClientSimpleDto
;
import
com.wecloud.im.param.ImConversationPageParam
;
import
com.wecloud.im.param.ImConversationQueryParam
;
import
com.wecloud.im.param.ImConversationQueryVo
;
import
com.wecloud.im.param.IntoChatRoomParam
;
import
com.wecloud.im.param.ListConversationMembersParam
;
import
com.wecloud.im.param.ListConversationParam
;
import
com.wecloud.im.param.MutedGroupMemberParam
;
import
com.wecloud.im.param.MutedGroupParam
;
import
com.wecloud.im.param.SetAdminsParam
;
import
com.wecloud.im.param.TransferOwnerParam
;
import
com.wecloud.im.param.add.ImClientLeaveConversation
;
import
com.wecloud.im.param.add.ImClientToConversation
;
import
com.wecloud.im.param.add.ImConversationAttrUpdate
;
import
com.wecloud.im.param.add.ImConversationCreate
;
import
com.wecloud.im.param.add.ImConversationDisplayUpdate
;
import
com.wecloud.im.param.add.ImConversationNameUpdate
;
import
com.wecloud.im.param.add.ServerImConversationCreate
;
import
com.wecloud.im.sdk.enums.ChatTypeEnum
;
import
com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum
;
import
com.wecloud.im.sdk.enums.GroupRoleEnum
;
import
com.wecloud.im.sdk.enums.MutedEnum
;
import
com.wecloud.im.service.*
;
import
com.wecloud.im.vo.*
;
import
com.wecloud.im.service.ContextService
;
import
com.wecloud.im.service.ImClientService
;
import
com.wecloud.im.service.ImConversationMembersService
;
import
com.wecloud.im.service.ImConversationService
;
import
com.wecloud.im.service.ImMessageService
;
import
com.wecloud.im.vo.ChatRoomMemberVo
;
import
com.wecloud.im.vo.ConversationMemberVo
;
import
com.wecloud.im.vo.ConversationVo
;
import
com.wecloud.im.vo.ImConversationCreateVo
;
import
com.wecloud.im.vo.OfflineMsgDto
;
import
com.wecloud.im.ws.enums.MsgTypeEnum
;
import
com.wecloud.im.ws.enums.WsResponseCmdEnum
;
import
com.wecloud.im.ws.model.WsResponse
;
...
...
@@ -26,26 +84,15 @@ import com.wecloud.im.ws.sender.ChannelSender;
import
com.wecloud.im.ws.utils.RedisUtils
;
import
com.wecloud.utils.JsonUtils
;
import
com.wecloud.utils.SnowflakeUtil
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.enums.BaseEnum
;
import
io.geekidea.springbootplus.framework.common.exception.BusinessException
;
import
io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl
;
import
io.geekidea.springbootplus.framework.core.pagination.PageInfo
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.*;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_ADD_FRIEND
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_ADD_FRIEND_CANCEL
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_LINK
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_LINK_CANCEL
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_PIC
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_PIC_CANCEL
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_RED_PACKETS
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL
;
/**
* 会话表 服务实现类
...
...
@@ -245,8 +292,133 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@Override
public
ImConversation
createImConversationForSdk
(
ImConversationCreate
imConversationCreate
)
{
return
null
;
public
ImConversation
serverCreateImConversation
(
ServerImConversationCreate
imConversationCreate
)
{
if
(
ChatTypeEnum
.
CHAT_ROOM
.
equals
(
imConversationCreate
.
getChatType
()))
{
// 聊天室
throw
new
BusinessException
(
"不允许创建聊天室"
);
}
ImApplication
imApplication
=
imConversationCreate
.
getApplication
();
ImClient
creator
=
imConversationCreate
.
getCreator
();
Long
appId
=
creator
.
getFkAppid
();
if
(
CollectionUtils
.
isEmpty
(
imConversationCreate
.
getMembers
()))
{
log
.
info
(
"未找到群成员信息"
);
throw
new
BusinessException
(
ApiCode
.
PARAMETER_EXCEPTION
);
}
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许
if
(
imApplication
.
getRepeatSessionStatus
()
!=
null
&&
imApplication
.
getRepeatSessionStatus
()
==
0
)
{
// 判断是否已经存在单聊类型会话
// size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话
if
(
imConversationCreate
.
getMembers
().
size
()
==
1
)
{
ImClient
member
=
imConversationCreate
.
getMembers
().
get
(
0
);
// 如果存在重复单聊类型会话,则不会为空
ImConversation
repetitionConversationInfo
=
imConversationMapper
.
getRepetitionConversationSingle
(
creator
.
getId
(),
member
.
getId
());
if
(
repetitionConversationInfo
!=
null
)
{
log
.
info
(
"存在重复的单聊会话,返回已存在的单聊类型会话id: {}"
,
repetitionConversationInfo
.
getId
());
// 返回已存在的会话
return
repetitionConversationInfo
;
}
}
}
else
{
//创建重复一对一会话时对比扩展字段 1是
if
(
imApplication
.
getContrastExtendedFieldStatus
()
==
1
)
{
// 被邀请client
ImClient
member
=
imConversationCreate
.
getMembers
().
get
(
0
);
log
.
info
(
"RequestAttributes:"
+
imConversationCreate
.
getAttributes
());
Long
repetitionConversation
=
getRepetitionConversationAttributes
(
creator
.
getId
(),
member
.
getId
(),
imConversationCreate
.
getAttributes
());
// 存在重复会话
if
(
repetitionConversation
!=
null
)
{
log
.
info
(
"出现Attributes重复"
);
// 为重复
return
getById
(
repetitionConversation
);
}
}
}
// 会话id
Long
imConversationId
=
SnowflakeUtil
.
getId
();
// 创建者
Long
creatorImClientId
=
creator
.
getId
();
// 创建会话
ImConversation
imConversation
=
new
ImConversation
();
imConversation
.
setId
(
imConversationId
);
imConversation
.
setCreateTime
(
new
Date
());
imConversation
.
setLastMessage
(
null
);
imConversation
.
setFkAppid
(
appId
);
imConversation
.
setCreator
(
creatorImClientId
);
imConversation
.
setMemberCount
(
imConversationCreate
.
getMembers
().
size
()
+
1
);
imConversation
.
setChatType
(
imConversationCreate
.
getChatType
().
getCode
());
imConversation
.
setName
(
imConversationCreate
.
getName
());
imConversation
.
setSystemFlag
(
false
);
// 拓展数据
String
attributesStr
=
JsonUtils
.
encodeJson
(
imConversationCreate
.
getAttributes
());
imConversation
.
setAttributes
(
attributesStr
);
imConversationService
.
save
(
imConversation
);
// 将创建者自己添加到会话
Long
imConversationMembersId
=
SnowflakeUtil
.
getId
();
ImConversationMembers
conversationCreator
=
new
ImConversationMembers
();
conversationCreator
.
setId
(
imConversationMembersId
);
conversationCreator
.
setCreateTime
(
new
Date
());
conversationCreator
.
setUpdateTime
(
new
Date
());
conversationCreator
.
setFkAppid
(
appId
);
conversationCreator
.
setFkConversationId
(
imConversationId
);
conversationCreator
.
setFkClientId
(
creatorImClientId
);
conversationCreator
.
setClientId
(
creator
.
getClientId
());
conversationCreator
.
setRole
(
GroupRoleEnum
.
OWNER
.
getCode
());
imConversationMembersService
.
save
(
conversationCreator
);
// 将他人添加到会话
for
(
ImClient
member
:
imConversationCreate
.
getMembers
())
{
ImConversationMembers
imConversationMember
=
new
ImConversationMembers
();
imConversationMember
.
setId
(
SnowflakeUtil
.
getId
());
imConversationMember
.
setCreateTime
(
new
Date
());
imConversationMember
.
setUpdateTime
(
new
Date
());
imConversationMember
.
setFkAppid
(
appId
);
imConversationMember
.
setFkConversationId
(
imConversationId
);
imConversationMember
.
setFkClientId
(
member
.
getId
());
imConversationMember
.
setClientId
(
member
.
getClientId
());
imConversationMember
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
imConversationMembersService
.
save
(
imConversationMember
);
if
(
imConversationCreate
.
getMembers
().
size
()
>
1
)
{
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage
imMessage
=
new
ImMessage
();
Map
<
String
,
Object
>
content
=
Maps
.
newHashMap
();
content
.
put
(
"operator"
,
creator
.
getClientId
());
//操作的client ID
content
.
put
(
"passivityOperator"
,
member
.
getClientId
());
//被操作的client ID
imMessage
.
setContent
(
JsonUtils
.
encodeJson
(
content
));
// 保存消息至消息表
imMessage
.
setId
(
SnowflakeUtil
.
getId
());
imMessage
.
setMsgType
(
MsgTypeEnum
.
CLIENT_JOIN_NEW_CONVERSATION
.
getUriCode
());
imMessage
.
setCreateTime
(
new
Date
());
imMessage
.
setFkAppid
(
imApplication
.
getId
());
imMessage
.
setSender
(
creator
.
getId
());
imMessage
.
setWithdraw
(
false
);
imMessage
.
setEvent
(
true
);
imMessage
.
setSystemFlag
(
false
);
imMessage
.
setSendStatus
(
2
);
imMessage
.
setFkConversationId
(
imConversation
.
getId
());
imMessageService
.
save
(
imMessage
);
// 发送消息
sendEventMsgToMember
(
imConversation
.
getId
(),
imApplication
.
getId
(),
creator
.
getClientId
(),
member
.
getId
(),
content
,
imMessage
);
}
}
ImConversationCreateVo
imConversationCreateVo
=
new
ImConversationCreateVo
();
imConversationCreateVo
.
setId
(
imConversationId
);
return
imConversation
;
}
@Override
...
...
core/src/main/java/com/wecloud/im/service/impl/ImMessageServiceImpl.java
View file @
094d7b19
package
com
.
wecloud
.
im
.
service
.
impl
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.exception.BusinessException
;
import
io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl
;
import
io.geekidea.springbootplus.framework.core.pagination.PageInfo
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
import
io.geekidea.springbootplus.framework.shiro.util.SecurityUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
...
...
@@ -9,18 +36,43 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.wecloud.dispatch.common.BaseRequest
;
import
com.wecloud.im.entity.*
;
import
com.wecloud.im.entity.ImApiMessageOnlineSend
;
import
com.wecloud.im.entity.ImApplication
;
import
com.wecloud.im.entity.ImClient
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.entity.ImConversationMembers
;
import
com.wecloud.im.entity.ImInbox
;
import
com.wecloud.im.entity.ImMessage
;
import
com.wecloud.im.entity.ImMessageOnlineSend
;
import
com.wecloud.im.mapper.ImMessageMapper
;
import
com.wecloud.im.mq.MqSender
;
import
com.wecloud.im.param.*
;
import
com.wecloud.im.param.add.ImConversationCreate
;
import
com.wecloud.im.param.ChatContentVo
;
import
com.wecloud.im.param.GetReadersParam
;
import
com.wecloud.im.param.GroupChatMessageParam
;
import
com.wecloud.im.param.GroupChatStatusMessageParam
;
import
com.wecloud.im.param.ImClientSimpleDto
;
import
com.wecloud.im.param.ImHistoryMessagePageParam
;
import
com.wecloud.im.param.MsgDeleteParam
;
import
com.wecloud.im.param.PrivateChatMessageParam
;
import
com.wecloud.im.param.PrivateChatStatusMessageParam
;
import
com.wecloud.im.param.PushExtParam
;
import
com.wecloud.im.param.add.ImMsgRecall
;
import
com.wecloud.im.param.add.ImMsgSendToOnlineClient
;
import
com.wecloud.im.param.add.ImMsgUpdate
;
import
com.wecloud.im.param.add.ServerImConversationCreate
;
import
com.wecloud.im.sdk.enums.ChatTypeEnum
;
import
com.wecloud.im.service.*
;
import
com.wecloud.im.service.ContextService
;
import
com.wecloud.im.service.ImApplicationService
;
import
com.wecloud.im.service.ImClientService
;
import
com.wecloud.im.service.ImConversationMembersService
;
import
com.wecloud.im.service.ImConversationService
;
import
com.wecloud.im.service.ImInboxService
;
import
com.wecloud.im.service.ImMessageService
;
import
com.wecloud.im.thousandchat.service.ThousandChatService
;
import
com.wecloud.im.vo.*
;
import
com.wecloud.im.vo.ImMessageOfflineListVo
;
import
com.wecloud.im.vo.OfflineMsgDto
;
import
com.wecloud.im.vo.ReaderList
;
import
com.wecloud.im.vo.ReaderVo
;
import
com.wecloud.im.ws.enums.MsgTypeEnum
;
import
com.wecloud.im.ws.enums.WsResponseCmdEnum
;
import
com.wecloud.im.ws.model.WsResponse
;
...
...
@@ -32,23 +84,6 @@ import com.wecloud.pushserver.client.model.constant.MqConstant;
import
com.wecloud.pushserver.client.model.dto.PushDTO
;
import
com.wecloud.utils.JsonUtils
;
import
com.wecloud.utils.SnowflakeUtil
;
import
io.geekidea.springbootplus.framework.common.api.ApiCode
;
import
io.geekidea.springbootplus.framework.common.api.ApiResult
;
import
io.geekidea.springbootplus.framework.common.exception.BusinessException
;
import
io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl
;
import
io.geekidea.springbootplus.framework.core.pagination.PageInfo
;
import
io.geekidea.springbootplus.framework.core.pagination.Paging
;
import
io.geekidea.springbootplus.framework.shiro.util.SecurityUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -636,116 +671,177 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
public
Boolean
privateMessagePublish
(
PrivateChatMessageParam
param
)
{
Long
appId
=
SecurityUtils
.
getCurrentAppId
();
ImApplication
application
=
imApplicationService
.
getCacheById
(
appId
);
// 获取发件人信息
String
senderClientId
=
param
.
getFromUserId
();
String
toUserIdsStr
=
param
.
getToUserIds
();
List
<
String
>
toUserIdList
=
Arrays
.
asList
(
toUserIdsStr
.
split
(
","
));
// 获取发件人信息
ImClient
sender
=
imClientService
.
getCacheImClient
(
appId
,
senderClientId
);
if
(
sender
==
null
)
{
throw
new
BusinessException
(
"id为 "
+
senderClientId
+
" 的发件人不存在"
);
}
// 获取收件人信息
Map
<
Long
,
ImConversation
>
conversationMapGroupById
=
new
HashMap
<>();
Map
<
Long
,
List
<
ImConversationMembers
>>
conMembersMapGroupByConId
=
new
HashMap
<>();
beforePublishPrivateMessage
(
application
,
sender
,
toUserIdList
,
conversationMapGroupById
,
conMembersMapGroupByConId
);
// 开始发送消息
conversationMapGroupById
.
forEach
((
conversationId
,
conversation
)
->
{
List
<
ImConversationMembers
>
membersList
=
conMembersMapGroupByConId
.
getOrDefault
(
conversationId
,
Collections
.
emptyList
());
// 组装消息
ImMessage
message
=
assembleImMessage
(
appId
,
sender
,
conversation
.
getId
(),
param
.
getMessageType
(),
false
,
param
.
getContent
());
// 持久化
this
.
save
(
message
);
// 拼装发送消息体
ImMessageOnlineSend
imMessageOnlineSend
=
assembleImMessageOnlineSend
(
message
,
sender
,
appId
);
// 发送消息
for
(
ImConversationMembers
members
:
membersList
)
{
if
(
members
.
getClientId
().
equals
(
senderClientId
)
&&
!
param
.
getIncludeSender
())
{
// 是否是发送者 且includeSender不为true
continue
;
}
// 入库 保存收件箱
saveImInbox
(
application
,
conversation
.
getId
(),
imMessageOnlineSend
.
getMsgId
(),
members
,
SnowflakeUtil
.
getId
());
// 在线用户直接发消息
sendMsgForOnline
(
members
.
getFkClientId
(),
imMessageOnlineSend
);
// 离线消息推送
pushMsgToOfflineMembers
(
application
,
members
,
param
.
getPushContent
(),
param
.
getPushExt
());
}
});
return
true
;
}
@Override
public
Boolean
privateStatusMessagePublish
(
PrivateChatStatusMessageParam
param
)
{
Long
appId
=
SecurityUtils
.
getCurrentAppId
();
ImApplication
application
=
imApplicationService
.
getCacheById
(
appId
);
String
senderClientId
=
param
.
getFromUserId
();
String
toUserIdsStr
=
param
.
getToUserIds
();
List
<
String
>
toUserIdList
=
Arrays
.
asList
(
toUserIdsStr
.
split
(
","
));
List
<
ImClient
>
clientList
=
imClientService
.
list
(
Wrappers
.<
ImClient
>
lambdaQuery
().
eq
(
ImClient:
:
getFkAppid
,
// 获取发件人信息
ImClient
sender
=
imClientService
.
getCacheImClient
(
appId
,
senderClientId
);
if
(
sender
==
null
)
{
throw
new
BusinessException
(
"id为 "
+
senderClientId
+
" 的发件人不存在"
);
}
Map
<
Long
,
ImConversation
>
conversationMapGroupById
=
new
HashMap
<>();
Map
<
Long
,
List
<
ImConversationMembers
>>
conMembersMapGroupByConId
=
new
HashMap
<>();
beforePublishPrivateMessage
(
application
,
sender
,
toUserIdList
,
conversationMapGroupById
,
conMembersMapGroupByConId
);
// 开始发送消息
conversationMapGroupById
.
forEach
((
conversationId
,
conversation
)
->
{
List
<
ImConversationMembers
>
membersList
=
conMembersMapGroupByConId
.
getOrDefault
(
conversationId
,
Collections
.
emptyList
());
// 组装消息
ImMessage
message
=
assembleImMessage
(
appId
,
sender
,
conversation
.
getId
(),
param
.
getMessageType
(),
true
,
param
.
getContent
());
// 持久化
this
.
save
(
message
);
// 拼装发送消息体
ImMessageOnlineSend
imMessageOnlineSend
=
assembleImMessageOnlineSend
(
message
,
sender
,
appId
);
// 发送消息
for
(
ImConversationMembers
members
:
membersList
)
{
if
(
members
.
getClientId
().
equals
(
senderClientId
)
&&
!
param
.
getIncludeSender
())
{
// 是否是发送者 且includeSender不为true
continue
;
}
// 在线用户直接发消息
sendMsgForOnline
(
members
.
getFkClientId
(),
imMessageOnlineSend
);
}
});
return
true
;
}
/**
* 私聊消息发送前
* @Author luozh
* @Date 2022年05月07日 11:28:59
* @param application
* @param sender
* @param toUserIdList
* @param conversationMapGroupById
* @param conMembersMapGroupByConId
* @Return
*/
private
void
beforePublishPrivateMessage
(
ImApplication
application
,
ImClient
sender
,
List
<
String
>
toUserIdList
,
Map
<
Long
,
ImConversation
>
conversationMapGroupById
,
Map
<
Long
,
List
<
ImConversationMembers
>>
conMembersMapGroupByConId
)
{
Long
appId
=
application
.
getId
();
// 获取收件人信息
List
<
ImClient
>
receiverList
=
imClientService
.
list
(
Wrappers
.<
ImClient
>
lambdaQuery
().
eq
(
ImClient:
:
getFkAppid
,
appId
).
in
(
ImClient:
:
getClientId
,
toUserIdList
));
Map
<
Long
,
ImClient
>
clientMapById
=
client
List
.
stream
().
collect
(
Collectors
.
toMap
(
ImClient:
:
getId
,
Function
.
identity
()));
if
(
client
List
.
isEmpty
())
{
Map
<
Long
,
ImClient
>
clientMapById
=
receiver
List
.
stream
().
collect
(
Collectors
.
toMap
(
ImClient:
:
getId
,
Function
.
identity
()));
if
(
receiver
List
.
isEmpty
())
{
throw
new
BusinessException
(
"收件人列表为空"
);
}
// 查找conversation列表
Long
senderImClientId
=
sender
.
getId
();
Set
<
Long
>
receiverImClientIds
=
client
List
.
stream
().
map
(
ImClient:
:
getId
).
collect
(
Collectors
.
toSet
());
Set
<
Long
>
receiverImClientIds
=
receiver
List
.
stream
().
map
(
ImClient:
:
getId
).
collect
(
Collectors
.
toSet
());
List
<
ImConversation
>
conversationList
=
imConversationService
.
getConversationBySenderAndReceivers
(
senderImClientId
,
receiverImClientIds
);
Map
<
Long
,
ImConversation
>
conversationMapGroupById
=
conversationList
.
stream
().
collect
(
Collectors
.
toMap
(
ImConversation:
:
getId
,
Function
.
identity
(
)));
conversationMapGroupById
.
putAll
(
conversationList
.
stream
().
collect
(
Collectors
.
toMap
(
ImConversation:
:
getId
,
Function
.
identity
()
)));
// 查找会话成员
List
<
Long
>
conversationIdList
=
conversationList
.
stream
().
map
(
ImConversation:
:
getId
).
collect
(
Collectors
.
toList
());
List
<
ImConversationMembers
>
conversationMembersList
=
imConversationMembersService
.
list
(
Wrappers
.<
ImConversationMembers
>
lambdaQuery
().
in
(
ImConversationMembers:
:
getFkConversationId
,
conversationIdList
));
Map
<
Long
,
List
<
ImConversationMembers
>>
conMembersMapGroupByConId
=
conversationMembersList
.
stream
().
collect
(
Collectors
.
groupingBy
(
ImConversationMembers:
:
getFkConversationId
));
Map
<
Long
,
ImConversationMembers
>
receiverConversationMembersMap
=
conMembersMapGroupByConId
.
putAll
(
conversationMembersList
.
stream
().
collect
(
Collectors
.
groupingBy
(
ImConversationMembers:
:
getFkConversationId
)));
if
(
conversationList
.
size
()
==
receiverList
.
size
())
{
// 如果会话数量和收件人数量一致,后面的逻辑就不需要走了
return
;
}
Set
<
Long
>
hasExistConversationReceiverImClientIds
=
conversationMembersList
.
stream
()
.
filter
(
member
->
!
member
.
getFkClientId
().
equals
(
senderImClientId
)
)
.
collect
(
Collectors
.
toMap
(
ImConversationMembers:
:
getFkClientId
,
Function
.
identity
()
));
.
map
(
ImConversationMembers:
:
getFkClientId
)
.
filter
(
fkClientId
->
!
fkClientId
.
equals
(
senderImClientId
)).
collect
(
Collectors
.
toSet
(
));
// 根据收件人imClientId对会话/会话成员进行分组
Set
<
Long
>
existConversationReceiverClientIds
=
receiverConversationMembersMap
.
keySet
();
Set
<
Long
>
notExistConversationReceiverClientIds
=
new
HashSet
<>(
receiverImClientIds
);
notExistConversationReceiverClientIds
.
removeAll
(
existConversationReceiver
ClientIds
);
notExistConversationReceiverClientIds
.
removeAll
(
hasExistConversationReceiverIm
ClientIds
);
// 不存在会话的先创建会话
notExistConversationReceiverClientIds
.
forEach
(
receiverImClientId
->
{
for
(
Long
receiverImClientId
:
notExistConversationReceiverClientIds
)
{
ImClient
receiver
=
clientMapById
.
get
(
receiverImClientId
);
List
<
String
>
clientId
s
=
new
ArrayList
<>();
clientIds
.
add
(
sender
.
getClientId
()
);
clientIds
.
add
(
receiver
.
getClientId
());
ImConversationCreate
conversationCreate
=
new
ImConversationCreate
();
List
<
ImClient
>
member
s
=
new
ArrayList
<>();
members
.
add
(
receiver
);
// 创建会话
ServerImConversationCreate
conversationCreate
=
new
Server
ImConversationCreate
();
conversationCreate
.
setName
(
null
);
conversationCreate
.
setAttributes
(
null
);
conversationCreate
.
setClientIds
(
clientIds
);
conversationCreate
.
setChatType
(
1
);
conversationCreate
.
setCreator
(
sender
);
conversationCreate
.
setMembers
(
members
);
conversationCreate
.
setChatType
(
ChatTypeEnum
.
SINGLE
);
ImConversation
conversation
=
imConversationService
.
serverCreateImConversation
(
conversationCreate
);
// 构建ImConversationMembers(只保存必要信息)
ImConversationMembers
receiverMember
=
new
ImConversationMembers
();
receiverMember
.
setClientId
(
receiver
.
getClientId
());
receiverMember
.
setFkClientId
(
receiver
.
getId
());
receiverMember
.
setFkConversationId
(
conversation
.
getId
());
ImConversationCreateVo
createVo
=
imConversationService
.
createImConversation
(
conversationCreate
);
ImConversation
conversation
=
new
ImConversation
();
conversation
.
setId
(
createVo
.
getId
());
ImConversationMembers
creatorMember
=
new
ImConversationMembers
();
receiverMember
.
setClientId
(
sender
.
getClientId
());
receiverMember
.
setFkClientId
(
sender
.
getId
());
receiverMember
.
setFkConversationId
(
conversation
.
getId
());
List
<
ImConversationMembers
>
conversationMembers
=
new
ArrayList
<>();
conversationMembers
.
add
(
receiverMember
);
conversationMembers
.
add
(
creatorMember
);
});
// // 校验群聊信息
// if (conversationList.size() <= 0) {
// throw new BusinessException("群聊ids为 " + conversationIdsStr + " 的群聊列表不存在");
// }
//
// conversationList.forEach(conversation -> {
// // 获取群成员
// List<ImConversationMembers> membersList = imConversationMembersService.list(
// new QueryWrapper<ImConversationMembers>().lambda()
// .eq(ImConversationMembers::getFkConversationId, conversation.getId()));
//
// if (param.getToUserIds() != null && !param.getToUserIds().isEmpty()) {
// // 定向发送
// membersList =
// membersList.stream().filter(members -> param.getToUserIds().contains(members.getClientId())).collect(Collectors.toList());
// }
//
// // 组装消息
// ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), false, param.getContent());
// // 持久化
// this.save(message);
// // 拼装发送消息体
// ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
//
// // 发送消息
// for (ImConversationMembers members : membersList) {
// if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// // 是否是发送者 且includeSender不为true
// continue;
// }
// // 入库 保存收件箱
// saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
// members, SnowflakeUtil.getId());
//
// // 在线用户直接发消息
// sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
//
// // 离线消息推送
// pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
// }
//
// });
return
true
;
conversationMapGroupById
.
put
(
conversation
.
getId
(),
conversation
);
conMembersMapGroupByConId
.
put
(
conversation
.
getId
(),
conversationMembers
);
}
@Override
public
Boolean
privateStatusMessagePublish
(
PrivateChatStatusMessageParam
param
)
{
return
null
;
}
/**
...
...
im-sdk/src/main/java/com/wecloud/im/sdk/sample/PublishPrivateChatMessageSample.java
View file @
094d7b19
...
...
@@ -31,17 +31,22 @@ public class PublishPrivateChatMessageSample {
String
toGroupIds
=
"1513691265777217536"
;
String
messageType
=
"-1"
;
Map
<
String
,
Object
>
msg
=
new
HashMap
<>();
msg
.
put
(
"toConversation"
,
"1519985463165931520"
);
msg
.
put
(
"type"
,
-
1
);
msg
.
put
(
"text"
,
"这是测试消息: "
+
DateUtil
.
formatDateTime
(
new
Date
()));
Map
<
String
,
Object
>
content
=
new
HashMap
<>();
content
.
put
(
"toConversation"
,
"1519985463165931520"
);
content
.
put
(
"type"
,
-
1
);
content
.
put
(
"text"
,
"这是测试消息: "
+
DateUtil
.
formatDateTime
(
new
Date
()));
content
.
put
(
"attrs"
,
new
HashMap
<
String
,
String
>()
{
{
put
(
"test1"
,
""
);
}
});
boolean
silent
=
true
;
PrivateChatMessage
privateChatMessage
=
new
PrivateChatMessage
();
privateChatMessage
.
setFromUserId
(
senderId
);
privateChatMessage
.
setToUserIds
(
toGroupIds
);
privateChatMessage
.
setMessageType
(
messageType
);
privateChatMessage
.
setContent
(
JSONUtil
.
toJsonStr
(
msg
));
privateChatMessage
.
setContent
(
JSONUtil
.
toJsonStr
(
content
));
privateChatMessage
.
setPushContent
(
""
);
privateChatMessage
.
setIncludeSender
(
false
);
privateChatMessage
.
setPersisted
(
true
);
...
...
im-sdk/src/main/java/com/wecloud/im/sdk/sample/PublishPrivateChatMessageStatusSample.java
0 → 100644
View file @
094d7b19
package
com
.
wecloud
.
im
.
sdk
.
sample
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.wecloud.im.sdk.WecloudIm
;
import
com.wecloud.im.sdk.WecloudImClientBuilder
;
import
com.wecloud.im.sdk.model.PrivateChatStatusMessage
;
/**
* 发布单聊消息
* @Author luozh
* @Date 2022年05月06日 01:37:29
* @Version 1.0
*/
public
class
PublishPrivateChatMessageStatusSample
{
public
static
void
main
(
String
[]
args
)
{
// WecloudIm im = new WecloudImClientBuilder().build("http://139.159.136.86:8082",
// "QizKVHcILRWp6Td2",
// "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
WecloudIm
im
=
new
WecloudImClientBuilder
().
build
(
"http://127.0.0.1:8082"
,
"QizKVHcILRWp6Td2"
,
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737"
);
String
senderId
=
"1519984635566845952"
;
String
toGroupIds
=
"1513691265777217536"
;
String
messageType
=
"-1"
;
Map
<
String
,
Object
>
content
=
new
HashMap
<>();
content
.
put
(
"toConversation"
,
"1519985463165931520"
);
content
.
put
(
"type"
,
-
1
);
content
.
put
(
"text"
,
"这是测试消息: "
+
DateUtil
.
formatDateTime
(
new
Date
()));
content
.
put
(
"attrs"
,
new
HashMap
<
String
,
String
>()
{
{
put
(
"test1"
,
""
);
}
});
PrivateChatStatusMessage
privateChatMessage
=
new
PrivateChatStatusMessage
();
privateChatMessage
.
setFromUserId
(
senderId
);
privateChatMessage
.
setToUserIds
(
toGroupIds
);
privateChatMessage
.
setMessageType
(
messageType
);
privateChatMessage
.
setContent
(
JSONUtil
.
toJsonStr
(
content
));
privateChatMessage
.
setIncludeBlacklist
(
false
);
privateChatMessage
.
setIncludeSender
(
false
);
Boolean
result
=
im
.
publishPrivateStatusMessage
(
privateChatMessage
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment