记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
dc78ab4d
Commit
dc78ab4d
authored
Nov 11, 2021
by
sunyuntian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
划卡计数调任务积分接口
parent
502ce7e8
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
146 additions
and
11 deletions
+146
-11
AdamChimeUinfoDto.java
...com/liquidnet/service/adam/dto/rsc/AdamChimeUinfoDto.java
+11
-1
AdamUserInfoVo.java
...ava/com/liquidnet/service/adam/dto/vo/AdamUserInfoVo.java
+5
-0
ChimeConstant.java
...a/com/liquidnet/service/chime/constant/ChimeConstant.java
+3
-0
ChimeUserDoTask.java
...java/com/liquidnet/service/chime/dto/ChimeUserDoTask.java
+13
-0
ChimeUserInfoDto.java
...ava/com/liquidnet/service/chime/dto/ChimeUserInfoDto.java
+7
-1
AdamUserInfoDto.java
.../java/com/liquidnet/service/adam/dto/AdamUserInfoDto.java
+5
-0
ChimePerformanceServiceImpl.java
...rvice/chime/service/impl/ChimePerformanceServiceImpl.java
+4
-1
ChimeUserServiceImpl.java
...dnet/service/chime/service/impl/ChimeUserServiceImpl.java
+28
-8
DoTaskUtils.java
...n/java/com/liquidnet/service/chime/utils/DoTaskUtils.java
+70
-0
No files found.
liquidnet-bus-api/liquidnet-service-adam-api/src/main/java/com/liquidnet/service/adam/dto/rsc/AdamChimeUinfoDto.java
View file @
dc78ab4d
...
@@ -23,8 +23,14 @@ public class AdamChimeUinfoDto implements Serializable, Cloneable {
...
@@ -23,8 +23,14 @@ public class AdamChimeUinfoDto implements Serializable, Cloneable {
private
String
birthday
;
private
String
birthday
;
@ApiModelProperty
(
position
=
6
,
value
=
"签名"
)
@ApiModelProperty
(
position
=
6
,
value
=
"签名"
)
private
String
signature
;
private
String
signature
;
@ApiModelProperty
(
position
=
7
,
value
=
"常住地/区域"
)
@ApiModelProperty
(
position
=
7
,
value
=
"常住地/区域
~ 已废除,参见[province、city、county]
"
)
private
String
area
;
private
String
area
;
@ApiModelProperty
(
position
=
8
,
value
=
"常住地/省 ~ 替换原字段[area]"
)
private
String
province
;
@ApiModelProperty
(
position
=
9
,
value
=
"常住地/市 ~ 替换原字段[area]"
)
private
String
city
;
@ApiModelProperty
(
position
=
10
,
value
=
"常住地/区县 ~ 替换原字段[area]"
)
private
String
county
;
private
static
final
AdamChimeUinfoDto
obj
=
new
AdamChimeUinfoDto
();
private
static
final
AdamChimeUinfoDto
obj
=
new
AdamChimeUinfoDto
();
...
@@ -46,6 +52,10 @@ public class AdamChimeUinfoDto implements Serializable, Cloneable {
...
@@ -46,6 +52,10 @@ public class AdamChimeUinfoDto implements Serializable, Cloneable {
this
.
setBirthday
(
source
.
getBirthday
());
this
.
setBirthday
(
source
.
getBirthday
());
this
.
setSignature
(
source
.
getSignature
());
this
.
setSignature
(
source
.
getSignature
());
this
.
setArea
(
source
.
getArea
());
this
.
setArea
(
source
.
getArea
());
//
this
.
setProvince
(
source
.
getProvince
());
this
.
setCity
(
source
.
getCity
());
this
.
setCounty
(
source
.
getCounty
());
return
this
;
return
this
;
}
}
}
}
liquidnet-bus-api/liquidnet-service-adam-api/src/main/java/com/liquidnet/service/adam/dto/vo/AdamUserInfoVo.java
View file @
dc78ab4d
...
@@ -94,6 +94,11 @@ public class AdamUserInfoVo implements java.io.Serializable, Cloneable {
...
@@ -94,6 +94,11 @@ public class AdamUserInfoVo implements java.io.Serializable, Cloneable {
this
.
setSex
(
JsonUtils
.
fromJson
(
source
.
getSex
(),
AdamTagVo
.
class
));
this
.
setSex
(
JsonUtils
.
fromJson
(
source
.
getSex
(),
AdamTagVo
.
class
));
this
.
setBirthday
(
source
.
getBirthday
());
this
.
setBirthday
(
source
.
getBirthday
());
this
.
setArea
(
source
.
getArea
());
this
.
setArea
(
source
.
getArea
());
this
.
setProvince
(
source
.
getProvince
());
this
.
setCity
(
source
.
getCity
());
this
.
setCounty
(
source
.
getCounty
());
//
this
.
setSignature
(
source
.
getSignature
());
this
.
setSignature
(
source
.
getSignature
());
this
.
setAvatar
(
source
.
getAvatar
());
this
.
setAvatar
(
source
.
getAvatar
());
...
...
liquidnet-bus-api/liquidnet-service-chime-api/src/main/java/com/liquidnet/service/chime/constant/ChimeConstant.java
View file @
dc78ab4d
...
@@ -20,6 +20,9 @@ public class ChimeConstant {
...
@@ -20,6 +20,9 @@ public class ChimeConstant {
public
static
final
String
REDIS_CITY_NAME_NOT_ALLOW
=
PREFIX
.
concat
(
"per:cityName:notAllow"
);
public
static
final
String
REDIS_CITY_NAME_NOT_ALLOW
=
PREFIX
.
concat
(
"per:cityName:notAllow"
);
public
static
final
String
REDIS_PERFORMANCE_IDS_ALLOW
=
PREFIX
.
concat
(
"per:performanceIds:allow"
);
public
static
final
String
REDIS_PERFORMANCE_IDS_ALLOW
=
PREFIX
.
concat
(
"per:performanceIds:allow"
);
public
static
final
String
REDIS_PERFORMANCE_IDS_NOT_ALLOW
=
PREFIX
.
concat
(
"per:performanceIds:notAllow"
);
public
static
final
String
REDIS_PERFORMANCE_IDS_NOT_ALLOW
=
PREFIX
.
concat
(
"per:performanceIds:notAllow"
);
public
static
final
String
REDIS_USER_OPEN_NUM
=
PREFIX
.
concat
(
"per:openNum:Allow"
);
public
static
final
String
REDIS_USER_TO_DOTASK
=
PREFIX
.
concat
(
"per:toDotask:Allow"
);
public
static
String
getNewUserId
(){
public
static
String
getNewUserId
(){
return
USER_ID_PREFIX
+
IDGenerator
.
nextTimeId
();
return
USER_ID_PREFIX
+
IDGenerator
.
nextTimeId
();
}
}
...
...
liquidnet-bus-api/liquidnet-service-chime-api/src/main/java/com/liquidnet/service/chime/dto/ChimeUserDoTask.java
0 → 100644
View file @
dc78ab4d
package
com
.
liquidnet
.
service
.
chime
.
dto
;
import
lombok.Data
;
@Data
public
class
ChimeUserDoTask
{
private
String
code
;
private
Object
object
;
private
String
message
;
private
Boolean
success
;
}
\ No newline at end of file
liquidnet-bus-api/liquidnet-service-chime-api/src/main/java/com/liquidnet/service/chime/dto/ChimeUserInfoDto.java
View file @
dc78ab4d
...
@@ -33,12 +33,18 @@ public class ChimeUserInfoDto {
...
@@ -33,12 +33,18 @@ public class ChimeUserInfoDto {
private
String
birthday
;
private
String
birthday
;
@ApiModelProperty
(
position
=
7
,
value
=
"签名"
)
@ApiModelProperty
(
position
=
7
,
value
=
"签名"
)
private
String
signature
;
private
String
signature
;
@ApiModelProperty
(
position
=
8
,
value
=
"常住地/区域"
)
@ApiModelProperty
(
position
=
8
,
value
=
"常住地/区域
~ 已废除,参见[province、city、county]
"
)
private
String
area
;
private
String
area
;
@ApiModelProperty
(
position
=
9
,
value
=
"在场ID"
)
@ApiModelProperty
(
position
=
9
,
value
=
"在场ID"
)
private
String
joinPerformanceId
;
private
String
joinPerformanceId
;
@ApiModelProperty
(
position
=
10
,
value
=
"用户标签"
)
@ApiModelProperty
(
position
=
10
,
value
=
"用户标签"
)
private
List
<
ChimeUserTagDto
>
userTags
;
private
List
<
ChimeUserTagDto
>
userTags
;
@ApiModelProperty
(
position
=
11
,
value
=
"常住地/省 ~ 替换原字段[area]"
)
private
String
province
;
@ApiModelProperty
(
position
=
12
,
value
=
"常住地/市 ~ 替换原字段[area]"
)
private
String
city
;
@ApiModelProperty
(
position
=
13
,
value
=
"常住地/区县 ~ 替换原字段[area]"
)
private
String
county
;
private
static
final
ChimeUserInfoDto
obj
=
new
ChimeUserInfoDto
();
private
static
final
ChimeUserInfoDto
obj
=
new
ChimeUserInfoDto
();
public
static
ChimeUserInfoDto
getNew
()
{
public
static
ChimeUserInfoDto
getNew
()
{
...
...
liquidnet-bus-do/liquidnet-service-adam-do/src/main/java/com/liquidnet/service/adam/dto/AdamUserInfoDto.java
View file @
dc78ab4d
...
@@ -15,6 +15,11 @@ public class AdamUserInfoDto {
...
@@ -15,6 +15,11 @@ public class AdamUserInfoDto {
private
String
sex
;
private
String
sex
;
private
String
birthday
;
private
String
birthday
;
private
String
area
;
private
String
area
;
private
String
province
;
private
String
city
;
private
String
county
;
private
String
signature
;
private
String
signature
;
private
String
avatar
;
private
String
avatar
;
private
String
background
;
private
String
background
;
...
...
liquidnet-bus-service/liquidnet-service-chime/liquidnet-service-chime-impl/src/main/java/com/liquidnet/service/chime/service/impl/ChimePerformanceServiceImpl.java
View file @
dc78ab4d
...
@@ -135,7 +135,10 @@ public class ChimePerformanceServiceImpl implements IChimePerformanceService {
...
@@ -135,7 +135,10 @@ public class ChimePerformanceServiceImpl implements IChimePerformanceService {
dto
.
setUserCover
(
adamUserDto
.
getUserCover
());
dto
.
setUserCover
(
adamUserDto
.
getUserCover
());
dto
.
setBirthday
(
adamUserDto
.
getBirthday
());
dto
.
setBirthday
(
adamUserDto
.
getBirthday
());
dto
.
setSignature
(
adamUserDto
.
getSignature
());
dto
.
setSignature
(
adamUserDto
.
getSignature
());
dto
.
setArea
(
adamUserDto
.
getArea
());
dto
.
setProvince
(
adamUserDto
.
getProvince
());
dto
.
setCity
(
adamUserDto
.
getCity
());
dto
.
setCounty
(
adamUserDto
.
getCounty
());
}
}
});
});
}
}
...
...
liquidnet-bus-service/liquidnet-service-chime/liquidnet-service-chime-impl/src/main/java/com/liquidnet/service/chime/service/impl/ChimeUserServiceImpl.java
View file @
dc78ab4d
package
com
.
liquidnet
.
service
.
chime
.
service
.
impl
;
package
com
.
liquidnet
.
service
.
chime
.
service
.
impl
;
import
com.liquidnet.commons.lang.util.BeanUtil
;
import
com.liquidnet.common.cache.redis.util.RedisUtil
;
import
com.liquidnet.commons.lang.util.CurrentUtil
;
import
com.liquidnet.commons.lang.util.*
;
import
com.liquidnet.commons.lang.util.JsonUtils
;
import
com.liquidnet.commons.lang.util.StringUtil
;
import
com.liquidnet.service.adam.dto.rsc.AdamChimeUinfoDto
;
import
com.liquidnet.service.adam.dto.rsc.AdamChimeUinfoDto
;
import
com.liquidnet.service.base.constant.MQConst
;
import
com.liquidnet.service.base.constant.MQConst
;
import
com.liquidnet.service.chime.biz.ChimeUserBiz
;
import
com.liquidnet.service.chime.biz.ChimeUserBiz
;
import
com.liquidnet.service.chime.constant.ChimeConstant
;
import
com.liquidnet.service.chime.constant.ChimeConstant
;
import
com.liquidnet.service.chime.dto.ChimeUserInfoDto
;
import
com.liquidnet.service.chime.dto.*
;
import
com.liquidnet.service.chime.dto.ChimeUserRegisterReqDto
;
import
com.liquidnet.service.chime.dto.ChimeUserTagDto
;
import
com.liquidnet.service.chime.dto.ChimeUserUpdateReqDto
;
import
com.liquidnet.service.chime.service.IChimeUserService
;
import
com.liquidnet.service.chime.service.IChimeUserService
;
import
com.liquidnet.service.chime.utils.DataUtils
;
import
com.liquidnet.service.chime.utils.DataUtils
;
import
com.liquidnet.service.chime.utils.DoTaskUtils
;
import
com.liquidnet.service.chime.utils.QueueUtils
;
import
com.liquidnet.service.chime.utils.QueueUtils
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserInfoVo
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserInfoVo
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserOperLogVo
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserOperLogVo
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserTagsMappingVo
;
import
com.liquidnet.service.chime.vo.mongo.ChimeUserTagsMappingVo
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.MultiValueMap
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.Arrays
;
import
java.util.Arrays
;
import
java.util.Calendar
;
import
java.util.List
;
import
java.util.List
;
/**
/**
...
@@ -47,6 +46,9 @@ public class ChimeUserServiceImpl implements IChimeUserService {
...
@@ -47,6 +46,9 @@ public class ChimeUserServiceImpl implements IChimeUserService {
@Autowired
@Autowired
private
ChimeUserBiz
chimeUserBiz
;
private
ChimeUserBiz
chimeUserBiz
;
@Autowired
private
DoTaskUtils
doTaskUtils
;
@Override
@Override
public
ChimeUserInfoVo
createChimeUserInfo
(
ChimeUserRegisterReqDto
reqDto
)
{
public
ChimeUserInfoVo
createChimeUserInfo
(
ChimeUserRegisterReqDto
reqDto
)
{
...
@@ -118,6 +120,9 @@ public class ChimeUserServiceImpl implements IChimeUserService {
...
@@ -118,6 +120,9 @@ public class ChimeUserServiceImpl implements IChimeUserService {
chimeUserInfoDto
.
setBirthday
(
adamChimeUinfoDto
.
getBirthday
());
chimeUserInfoDto
.
setBirthday
(
adamChimeUinfoDto
.
getBirthday
());
chimeUserInfoDto
.
setSignature
(
adamChimeUinfoDto
.
getSignature
());
chimeUserInfoDto
.
setSignature
(
adamChimeUinfoDto
.
getSignature
());
chimeUserInfoDto
.
setArea
(
adamChimeUinfoDto
.
getArea
());
chimeUserInfoDto
.
setArea
(
adamChimeUinfoDto
.
getArea
());
chimeUserInfoDto
.
setProvince
(
adamChimeUinfoDto
.
getProvince
());
chimeUserInfoDto
.
setCity
(
adamChimeUinfoDto
.
getCity
());
chimeUserInfoDto
.
setCounty
(
adamChimeUinfoDto
.
getCounty
());
}
}
//获取标签
//获取标签
List
<
ChimeUserTagDto
>
userTagDtoList
=
chimeUserBiz
.
buildUserTagDtoListFromVo
(
chimeUserInfoVo
.
getUserTagsVoList
());
List
<
ChimeUserTagDto
>
userTagDtoList
=
chimeUserBiz
.
buildUserTagDtoListFromVo
(
chimeUserInfoVo
.
getUserTagsVoList
());
...
@@ -153,6 +158,16 @@ public class ChimeUserServiceImpl implements IChimeUserService {
...
@@ -153,6 +158,16 @@ public class ChimeUserServiceImpl implements IChimeUserService {
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_LIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_LIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
chimeUserOperLogVo
.
setOpType
(
ChimeConstant
.
LOG_USER_OPERATION_LIKE_MYSELF_CLICK
);
chimeUserOperLogVo
.
setOpType
(
ChimeConstant
.
LOG_USER_OPERATION_LIKE_MYSELF_CLICK
);
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_LIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_LIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
/* Integer i;
//判断redis是否有喜欢的记录
if (!redisUtil.hasKey(ChimeConstant.REDIS_USER_LIKE_NUM+currentUserId)){
i=1;
}else {
i = (Integer) redisUtil.get(ChimeConstant.REDIS_USER_LIKE_NUM+currentUserId)+1;
}
redisUtil.set(ChimeConstant.REDIS_USER_LIKE_NUM + currentUserId,i);*/
doTaskUtils
.
userAddNum
(
currentUserId
);
return
true
;
return
true
;
}
}
...
@@ -167,6 +182,11 @@ public class ChimeUserServiceImpl implements IChimeUserService {
...
@@ -167,6 +182,11 @@ public class ChimeUserServiceImpl implements IChimeUserService {
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_DISLIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_DISLIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
chimeUserOperLogVo
.
setOpType
(
ChimeConstant
.
LOG_USER_OPERATION_DISLIKE_MYSELF_CLICK
);
chimeUserOperLogVo
.
setOpType
(
ChimeConstant
.
LOG_USER_OPERATION_DISLIKE_MYSELF_CLICK
);
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_DISLIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
queueUtils
.
sendMsgByRedis
(
MQConst
.
ChimeQueue
.
USER_OPERATION_DISLIKE
.
getKey
(),
JsonUtils
.
toJson
(
chimeUserOperLogVo
));
doTaskUtils
.
userAddNum
(
currentUserId
);
return
true
;
return
true
;
}
}
}
}
liquidnet-bus-service/liquidnet-service-chime/liquidnet-service-chime-impl/src/main/java/com/liquidnet/service/chime/utils/DoTaskUtils.java
0 → 100644
View file @
dc78ab4d
package
com
.
liquidnet
.
service
.
chime
.
utils
;
import
com.liquidnet.common.cache.redis.util.RedisUtil
;
import
com.liquidnet.commons.lang.util.CollectionUtil
;
import
com.liquidnet.commons.lang.util.HttpUtil
;
import
com.liquidnet.commons.lang.util.JsonUtils
;
import
com.liquidnet.service.chime.constant.ChimeConstant
;
import
com.liquidnet.service.chime.dto.ChimeUserDoTask
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.MultiValueMap
;
import
java.util.Calendar
;
@Slf4j
@Component
public
class
DoTaskUtils
{
@Autowired
private
RedisUtil
redisUtil
;
@Value
(
"${liquidnet.service.stone.url}"
)
private
String
stoneUrl
;
/**
* 划卡调任务
* @param currentUserId
*/
public
void
userAddNum
(
String
currentUserId
)
{
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
add
(
Calendar
.
DAY_OF_YEAR
,
1
);
cal
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
cal
.
set
(
Calendar
.
SECOND
,
0
);
cal
.
set
(
Calendar
.
MINUTE
,
0
);
cal
.
set
(
Calendar
.
MILLISECOND
,
0
);
Long
timeout
=(
cal
.
getTimeInMillis
()-
System
.
currentTimeMillis
())/
1000
;
Integer
i
;
//判断当天是否有划卡
if
(!
redisUtil
.
hasKey
(
ChimeConstant
.
REDIS_USER_OPEN_NUM
+
currentUserId
)){
i
=
1
;
redisUtil
.
set
(
ChimeConstant
.
REDIS_USER_OPEN_NUM
+
currentUserId
,
i
,
timeout
);
}
else
{
i
=
(
Integer
)
redisUtil
.
get
(
ChimeConstant
.
REDIS_USER_OPEN_NUM
+
currentUserId
)+
1
;
}
redisUtil
.
set
(
ChimeConstant
.
REDIS_USER_OPEN_NUM
+
currentUserId
,
i
,
timeout
);
//获取用户是否调用过任务接口
boolean
hasKey
=
redisUtil
.
hasKey
(
ChimeConstant
.
REDIS_USER_TO_DOTASK
+
currentUserId
);
if
(!
hasKey
){
//满足10次调用接口,每天最多调用一次
if
(
i
>=
10
){
MultiValueMap
<
String
,
String
>
params
=
CollectionUtil
.
linkedMultiValueMapStringString
();
params
.
add
(
"uid"
,
currentUserId
);
params
.
add
(
"taskId"
,
3
+
""
);
String
resultData
=
HttpUtil
.
post
(
stoneUrl
+
"/user/inner/doTask"
,
params
);
ChimeUserDoTask
chimeUserDoTask
=
JsonUtils
.
fromJson
(
resultData
,
ChimeUserDoTask
.
class
);
Boolean
success
=
chimeUserDoTask
.
getSuccess
();
//接口调用失败,重试
if
(!
success
)
{
this
.
userAddNum
(
currentUserId
);
}
else
{
//调用接口成功,记录
redisUtil
.
set
(
ChimeConstant
.
REDIS_USER_TO_DOTASK
+
currentUserId
,
1
,
timeout
);
}
}
}
}
}
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