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
ba03e9d5
Commit
ba03e9d5
authored
May 09, 2022
by
罗长华
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
会话成员表增加加入会话方式和加入会话msg字段
parent
4aefa1a1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
130 additions
and
6 deletions
+130
-6
core/src/main/java/com/wecloud/im/entity/ImConversationMembers.java
+6
-0
core/src/main/java/com/wecloud/im/param/add/ImClientToConversation.java
+8
-0
core/src/main/java/com/wecloud/im/sdk/enums/JoinConversationTypeEnum.java
+34
-0
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
+82
-6
No files found.
core/src/main/java/com/wecloud/im/entity/ImConversationMembers.java
View file @
ba03e9d5
...
@@ -14,6 +14,7 @@ import javax.validation.constraints.NotNull;
...
@@ -14,6 +14,7 @@ import javax.validation.constraints.NotNull;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.wecloud.im.sdk.enums.JoinConversationTypeEnum
;
/**
/**
* 会话成员表
* 会话成员表
...
@@ -89,4 +90,9 @@ public class ImConversationMembers extends BaseEntity {
...
@@ -89,4 +90,9 @@ public class ImConversationMembers extends BaseEntity {
@TableField
(
"is_top"
)
@TableField
(
"is_top"
)
private
Boolean
top
;
private
Boolean
top
;
@ApiModelProperty
(
"加入会话方式编码"
)
private
JoinConversationTypeEnum
joinTypeCode
;
@ApiModelProperty
(
"加入会话方式信息"
)
private
String
joinTypeMsg
;
}
}
core/src/main/java/com/wecloud/im/param/add/ImClientToConversation.java
View file @
ba03e9d5
...
@@ -9,6 +9,8 @@ import lombok.experimental.Accessors;
...
@@ -9,6 +9,8 @@ import lombok.experimental.Accessors;
import
java.util.List
;
import
java.util.List
;
import
com.wecloud.im.sdk.enums.JoinConversationTypeEnum
;
/**
/**
* @author wei
* @author wei
* @since 2021年11月30日16:57:03
* @since 2021年11月30日16:57:03
...
@@ -26,4 +28,10 @@ public class ImClientToConversation extends BaseEntity {
...
@@ -26,4 +28,10 @@ public class ImClientToConversation extends BaseEntity {
@ApiModelProperty
(
"要操作的clientId"
)
@ApiModelProperty
(
"要操作的clientId"
)
private
List
<
String
>
clientIds
;
private
List
<
String
>
clientIds
;
@ApiModelProperty
(
"加入方式 "
)
private
JoinConversationTypeEnum
joinConversationType
;
@ApiModelProperty
(
"邀请人clientId"
)
private
String
inviterClientId
;
}
}
core/src/main/java/com/wecloud/im/sdk/enums/JoinConversationTypeEnum.java
0 → 100644
View file @
ba03e9d5
package
com
.
wecloud
.
im
.
sdk
.
enums
;
import
com.baomidou.mybatisplus.annotation.EnumValue
;
/**
* 加入会话方式枚举
* @Author luozh
* @Date 2022年05月09日 14:58
* @Version 1.0
*/
public
enum
JoinConversationTypeEnum
{
// 会话创建者
OWNER
(
"OWNER"
,
"会话创建者"
),
// 被邀请
BE_INVITED
(
"BE_INVITED"
,
"被邀请"
),
;
@EnumValue
private
final
String
code
;
private
final
String
desc
;
JoinConversationTypeEnum
(
String
code
,
String
desc
)
{
this
.
code
=
code
;
this
.
desc
=
desc
;
}
public
String
getCode
()
{
return
this
.
code
;
}
public
String
getDesc
()
{
return
this
.
desc
;
}
}
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
View file @
ba03e9d5
...
@@ -25,6 +25,8 @@ import org.springframework.cache.annotation.CacheEvict;
...
@@ -25,6 +25,8 @@ import org.springframework.cache.annotation.CacheEvict;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
...
@@ -67,6 +69,7 @@ import com.wecloud.im.param.add.ServerImConversationCreate;
...
@@ -67,6 +69,7 @@ import com.wecloud.im.param.add.ServerImConversationCreate;
import
com.wecloud.im.sdk.enums.ChatTypeEnum
;
import
com.wecloud.im.sdk.enums.ChatTypeEnum
;
import
com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum
;
import
com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum
;
import
com.wecloud.im.sdk.enums.GroupRoleEnum
;
import
com.wecloud.im.sdk.enums.GroupRoleEnum
;
import
com.wecloud.im.sdk.enums.JoinConversationTypeEnum
;
import
com.wecloud.im.sdk.enums.MutedEnum
;
import
com.wecloud.im.sdk.enums.MutedEnum
;
import
com.wecloud.im.service.ContextService
;
import
com.wecloud.im.service.ContextService
;
import
com.wecloud.im.service.ImClientService
;
import
com.wecloud.im.service.ImClientService
;
...
@@ -86,6 +89,7 @@ import com.wecloud.im.ws.utils.RedisUtils;
...
@@ -86,6 +89,7 @@ import com.wecloud.im.ws.utils.RedisUtils;
import
com.wecloud.utils.JsonUtils
;
import
com.wecloud.utils.JsonUtils
;
import
com.wecloud.utils.SnowflakeUtil
;
import
com.wecloud.utils.SnowflakeUtil
;
import
static
cn
.
hutool
.
core
.
date
.
DatePattern
.
CHINESE_DATE_PATTERN
;
import
static
com
.
wecloud
.
im
.
ws
.
enums
.
MsgTypeEnum
.
CONVERSATION_FORBID_ADD_FRIEND
;
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_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
;
...
@@ -233,17 +237,34 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -233,17 +237,34 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversation
.
setAttributes
(
attributesStr
);
imConversation
.
setAttributes
(
attributesStr
);
imConversationService
.
save
(
imConversation
);
imConversationService
.
save
(
imConversation
);
Date
now
=
new
Date
();
// 将创建者自己添加到会话
// 将创建者自己添加到会话
Long
imConversationMembersId
=
SnowflakeUtil
.
getId
();
Long
imConversationMembersId
=
SnowflakeUtil
.
getId
();
ImConversationMembers
imConversationMembers
=
new
ImConversationMembers
();
ImConversationMembers
imConversationMembers
=
new
ImConversationMembers
();
imConversationMembers
.
setId
(
imConversationMembersId
);
imConversationMembers
.
setId
(
imConversationMembersId
);
imConversationMembers
.
setCreateTime
(
n
ew
Date
()
);
imConversationMembers
.
setCreateTime
(
n
ow
);
imConversationMembers
.
setUpdateTime
(
n
ew
Date
()
);
imConversationMembers
.
setUpdateTime
(
n
ow
);
imConversationMembers
.
setFkAppid
(
createClient
.
getFkAppid
());
imConversationMembers
.
setFkAppid
(
createClient
.
getFkAppid
());
imConversationMembers
.
setFkConversationId
(
imConversationId
);
imConversationMembers
.
setFkConversationId
(
imConversationId
);
imConversationMembers
.
setFkClientId
(
creator
);
imConversationMembers
.
setFkClientId
(
creator
);
imConversationMembers
.
setClientId
(
createClient
.
getClientId
());
imConversationMembers
.
setClientId
(
createClient
.
getClientId
());
imConversationMembers
.
setRole
(
GroupRoleEnum
.
OWNER
.
getCode
());
imConversationMembers
.
setRole
(
GroupRoleEnum
.
OWNER
.
getCode
());
// 会话拥有者加入会话方式固定
imConversationMembers
.
setJoinTypeCode
(
JoinConversationTypeEnum
.
OWNER
);
String
joinTypeMsg
=
""
;
if
(
ChatTypeEnum
.
SINGLE
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>创建了该会话"
;
}
else
if
(
ChatTypeEnum
.
NORMAL_GROUP
.
getCode
().
equals
(
imConversationCreate
.
getChatType
())
||
ChatTypeEnum
.
THOUSAND_GROUP
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
joinTypeMsg
=
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>创建了该群聊"
;
;
}
else
if
(
ChatTypeEnum
.
CHAT_ROOM
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
joinTypeMsg
=
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>创建了该聊天室"
;
;
}
imConversationMembers
.
setJoinTypeMsg
(
joinTypeMsg
);
imConversationMembersService
.
save
(
imConversationMembers
);
imConversationMembersService
.
save
(
imConversationMembers
);
// 将他人添加到会话
// 将他人添加到会话
...
@@ -260,6 +281,22 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -260,6 +281,22 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers2
.
setFkClientId
(
client2
.
getId
());
imConversationMembers2
.
setFkClientId
(
client2
.
getId
());
imConversationMembers2
.
setClientId
(
client2
.
getClientId
());
imConversationMembers2
.
setClientId
(
client2
.
getClientId
());
imConversationMembers2
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
imConversationMembers2
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
// 加入会话方式固定为 邀请
imConversationMembers
.
setJoinTypeCode
(
JoinConversationTypeEnum
.
BE_INVITED
);
String
memberJoinTypeMsg
=
""
;
if
(
ChatTypeEnum
.
SINGLE
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
memberJoinTypeMsg
=
"由 <@>"
+
createClient
.
getClientId
()
+
"<@>邀请加入该会话"
;
}
else
if
(
ChatTypeEnum
.
NORMAL_GROUP
.
getCode
().
equals
(
imConversationCreate
.
getChatType
())
||
ChatTypeEnum
.
THOUSAND_GROUP
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
memberJoinTypeMsg
=
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>邀请进聊"
;
;
}
else
if
(
ChatTypeEnum
.
CHAT_ROOM
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
memberJoinTypeMsg
=
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>邀请进入聊天室"
;
;
}
imConversationMembersService
.
save
(
imConversationMembers2
);
imConversationMembersService
.
save
(
imConversationMembers2
);
if
(
imConversationCreate
.
getClientIds
().
size
()
>
1
)
{
if
(
imConversationCreate
.
getClientIds
().
size
()
>
1
)
{
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
...
@@ -367,16 +404,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -367,16 +404,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationService
.
save
(
imConversation
);
imConversationService
.
save
(
imConversation
);
// 将创建者自己添加到会话
// 将创建者自己添加到会话
Date
now
=
new
Date
();
Long
imConversationMembersId
=
SnowflakeUtil
.
getId
();
Long
imConversationMembersId
=
SnowflakeUtil
.
getId
();
ImConversationMembers
conversationCreator
=
new
ImConversationMembers
();
ImConversationMembers
conversationCreator
=
new
ImConversationMembers
();
conversationCreator
.
setId
(
imConversationMembersId
);
conversationCreator
.
setId
(
imConversationMembersId
);
conversationCreator
.
setCreateTime
(
n
ew
Date
()
);
conversationCreator
.
setCreateTime
(
n
ow
);
conversationCreator
.
setUpdateTime
(
n
ew
Date
()
);
conversationCreator
.
setUpdateTime
(
n
ow
);
conversationCreator
.
setFkAppid
(
appId
);
conversationCreator
.
setFkAppid
(
appId
);
conversationCreator
.
setFkConversationId
(
imConversationId
);
conversationCreator
.
setFkConversationId
(
imConversationId
);
conversationCreator
.
setFkClientId
(
creatorImClientId
);
conversationCreator
.
setFkClientId
(
creatorImClientId
);
conversationCreator
.
setClientId
(
creator
.
getClientId
());
conversationCreator
.
setClientId
(
creator
.
getClientId
());
conversationCreator
.
setRole
(
GroupRoleEnum
.
OWNER
.
getCode
());
conversationCreator
.
setRole
(
GroupRoleEnum
.
OWNER
.
getCode
());
conversationCreator
.
setJoinTypeCode
(
JoinConversationTypeEnum
.
OWNER
);
String
joinTypeMsg
=
""
;
if
(
ChatTypeEnum
.
SINGLE
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
joinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
creatorImClientId
+
"<@>创建了该会话"
;
}
imConversationMembersService
.
save
(
conversationCreator
);
imConversationMembersService
.
save
(
conversationCreator
);
// 将他人添加到会话
// 将他人添加到会话
...
@@ -390,6 +434,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -390,6 +434,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMember
.
setFkClientId
(
member
.
getId
());
imConversationMember
.
setFkClientId
(
member
.
getId
());
imConversationMember
.
setClientId
(
member
.
getClientId
());
imConversationMember
.
setClientId
(
member
.
getClientId
());
imConversationMember
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
imConversationMember
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
// 加入会话方式固定为 邀请
imConversationMember
.
setJoinTypeCode
(
JoinConversationTypeEnum
.
BE_INVITED
);
String
memberJoinTypeMsg
=
""
;
if
(
ChatTypeEnum
.
SINGLE
.
getCode
().
equals
(
imConversationCreate
.
getChatType
()))
{
memberJoinTypeMsg
=
"由 <@>"
+
creatorImClientId
+
"<@>邀请加入该会话"
;
}
imConversationMembersService
.
save
(
imConversationMember
);
imConversationMembersService
.
save
(
imConversationMember
);
if
(
imConversationCreate
.
getMembers
().
size
()
>
1
)
{
if
(
imConversationCreate
.
getMembers
().
size
()
>
1
)
{
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
...
@@ -431,6 +483,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -431,6 +483,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 根据appId查询application
// 根据appId查询application
ImApplication
imApplication
=
contextService
.
getImApplicationIfNotNullOrThrow
(
createClient
.
getFkAppid
());
ImApplication
imApplication
=
contextService
.
getImApplicationIfNotNullOrThrow
(
createClient
.
getFkAppid
());
ImConversation
imConversation
=
getById
(
imClientToConversation
.
getConversationId
());
ImClient
imClientSender
=
imClientService
.
getCurrentClient
();
ImClient
imClientSender
=
imClientService
.
getCurrentClient
();
// 查询该会话所有成员
// 查询该会话所有成员
...
@@ -467,7 +521,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -467,7 +521,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
if
(
members
!=
null
)
{
if
(
members
!=
null
)
{
continue
;
continue
;
}
}
Date
now
=
new
Date
();
Long
imConversationMembersId2
=
SnowflakeUtil
.
getId
();
Long
imConversationMembersId2
=
SnowflakeUtil
.
getId
();
ImConversationMembers
imConversationMembers2
=
new
ImConversationMembers
();
ImConversationMembers
imConversationMembers2
=
new
ImConversationMembers
();
imConversationMembers2
.
setUpdateTime
(
new
Date
());
imConversationMembers2
.
setUpdateTime
(
new
Date
());
...
@@ -479,6 +533,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -479,6 +533,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers2
.
setClientId
(
clientToConversation
.
getClientId
());
imConversationMembers2
.
setClientId
(
clientToConversation
.
getClientId
());
imConversationMembers2
.
setMuted
(
MutedEnum
.
NO
.
getCode
());
imConversationMembers2
.
setMuted
(
MutedEnum
.
NO
.
getCode
());
imConversationMembers2
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
imConversationMembers2
.
setRole
(
GroupRoleEnum
.
NORMAL
.
getCode
());
// 加入会话方式
// 加入会话方式固定为 邀请
imConversationMembers2
.
setJoinTypeCode
(
JoinConversationTypeEnum
.
BE_INVITED
);
String
memberJoinTypeMsg
=
""
;
if
(
ChatTypeEnum
.
SINGLE
.
getCode
().
equals
(
imConversation
.
getChatType
()))
{
memberJoinTypeMsg
=
"由 <@>"
+
createClient
.
getClientId
()
+
"<@>邀请加入该会话"
;
}
else
if
(
ChatTypeEnum
.
NORMAL_GROUP
.
getCode
().
equals
(
imConversation
.
getChatType
())
||
ChatTypeEnum
.
THOUSAND_GROUP
.
getCode
().
equals
(
imConversation
.
getChatType
()))
{
memberJoinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>邀请进聊"
;
;
}
else
if
(
ChatTypeEnum
.
CHAT_ROOM
.
getCode
().
equals
(
imConversation
.
getChatType
()))
{
memberJoinTypeMsg
=
DateUtil
.
format
(
now
,
CHINESE_DATE_PATTERN
)
+
" <@>"
+
createClient
.
getClientId
()
+
"<@>邀请进入聊天室"
;
;
}
imConversationMembersService
.
save
(
imConversationMembers2
);
imConversationMembersService
.
save
(
imConversationMembers2
);
needAddCount
++;
needAddCount
++;
...
@@ -1265,7 +1336,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -1265,7 +1336,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
if
(
StringUtils
.
isBlank
(
param
.
getConversationIds
()))
{
if
(
StringUtils
.
isBlank
(
param
.
getConversationIds
()))
{
throw
new
BusinessException
(
"会话id列表不可为空"
);
throw
new
BusinessException
(
"会话id列表不可为空"
);
}
}
List
<
Long
>
conversationIds
=
(
List
)
JSON
.
parse
(
param
.
getConversationIds
());
List
<
Long
>
conversationIds
=
(
List
)
JSON
.
parse
(
param
.
getConversationIds
());
List
<
ConversationVo
>
conversationVoList
=
Lists
.
newArrayList
();
List
<
ConversationVo
>
conversationVoList
=
Lists
.
newArrayList
();
List
<
ImConversation
>
conversations
=
imConversationMapper
.
selectList
(
List
<
ImConversation
>
conversations
=
imConversationMapper
.
selectList
(
new
QueryWrapper
<
ImConversation
>().
lambda
()
new
QueryWrapper
<
ImConversation
>().
lambda
()
...
@@ -1489,4 +1560,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
...
@@ -1489,4 +1560,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
channelSender
.
sendMsg
(
responseModel
,
receiverClientId
);
channelSender
.
sendMsg
(
responseModel
,
receiverClientId
);
}
}
private
String
buildJoinConversationTypeMsg
(
JoinConversationTypeEnum
joinConversationType
,
String
inviterClientId
)
{
return
""
;
}
}
}
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