Commit bac597e0 by giaogiao

添加 最后离线时间;

完成客户端自定义系统推送内容
parent f518d744
......@@ -61,46 +61,45 @@ public class LoginTest {
if (mySign.equals(sign)) {
System.out.println("一致" + mySign);
// return null;
} else {
System.out.println("不一致" + mySign);
return null;
}
// 判断client是否存在
ImClient client = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientId));
if (client == null) {
System.out.println("不存在");
ImClient imClient = new ImClient();
imClient.setId(new Snowflake(1L, 1L).nextId());
imClient.setFkAppid(imApplication.getId());
imClient.setClientId(clientId);
imClientService.save(imClient);
} else {
System.out.println("存在");
}
// 生成token
String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999));
// 保存redis
redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken);
return generateToken;
}
@Test
public void test() throws Exception {
// 时间戳
String timestamp = "1626665156369";
String clientId = "aaaaa1";
String appKey = "QNtP3EjtLw26ekt0";
String sign = "a0b128928849c44bb0b7ae82944770b5";
String token = getToken(timestamp, clientId, appKey, sign);
System.out.println("token:" + token);
}
}
//
// }
//
// // 判断client是否存在
// ImClient client = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
// .eq(ImClient::getFkAppid, imApplication.getId())
// .eq(ImClient::getClientId, clientId));
//
// if (client == null) {
// System.out.println("不存在");
//
// ImClient imClient = new ImClient();
// imClient.setId(new Snowflake(1L, 1L).nextId());
// imClient.setFkAppid(imApplication.getId());
// imClient.setClientId(clientId);
// imClientService.save(imClient);
//
// } else {
// System.out.println("存在");
// }
//
// // 生成token
// String generateToken = JwtUtil.generateToken(clientId, appKey, imApplication.getAppSecret(), Duration.ofDays(99999));
//
// // 保存redis
// redisTemplate.opsForValue().set("client:" + imApplication.getAppKey() + ":" + clientId, generateToken);
// return generateToken;
// }
//
// @Test
// public void test() throws Exception {
// // 时间戳
// String timestamp = "1629274899016";
// String clientId = "aaaaa2";
// String sign = "a404fe25d383eb154b3b527f7213b35a";
//
//
// String appKey = "QNtP3EjtLw26ekt0";
// String token = getToken(timestamp, clientId, appKey, sign);
// System.out.println("token:\n" + token);
// }
//}
......@@ -33,6 +33,9 @@ public class ImClient extends BaseEntity {
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("最后离线时间")
private Date lastOfflineTime;
@ApiModelProperty("修改时间")
private Date updateTime;
......
package com.wecloud.im.ws.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @Description 推送model
* @Author hewei hwei1233@163.com
* @Date 2019-12-05
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PushModel implements Serializable {
/**
* 标题
*/
private String title;
/**
* 子标题
*/
private String subTitle;
}
......@@ -2,8 +2,8 @@ package com.wecloud.im.ws.sender;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.push.PushUtils;
import com.wecloud.im.ws.model.request.PushModel;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.scheduling.annotation.Async;
......@@ -15,6 +15,7 @@ import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
/**
* 异步系统推送
......@@ -28,22 +29,34 @@ public class PushTask {
*/
private static final String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";
//您收到一条新消息
/**
* 您收到一条新消息
*/
private static final String PUSH_TITLE = "You have received a new message";
//点击查看
/**
* 点击查看
*/
private static final String PUSH_BODY = "Click to view";
/**
* 异步系统推送
*
* @param imClientReceiver
* @param imClientSender
* @param imMessage
*/
@Async
public void push(ImClient imClientReceiver, ImClient imClientSender, ImMessage imMessage, ImApplication imApplication) {
log.debug("push " + imClientReceiver.getClientId());
public void push(HashMap<String, String> pushMap, ImClient imClientReceiver, ImApplication imApplication) {
log.debug("push:" + imClientReceiver.getClientId());
PushModel pushModel = new PushModel();
if (pushMap.isEmpty()) {
pushModel.setTitle(PUSH_TITLE);
pushModel.setSubTitle(PUSH_BODY);
} else {
pushModel.setTitle(pushMap.get("title"));
pushModel.setSubTitle(pushMap.get("subTitle"));
}
// 校验参数
if (imClientReceiver.getValid() == null || imClientReceiver.getDeviceToken() == null || imClientReceiver.getDeviceType() == null) {
......@@ -58,14 +71,14 @@ public class PushTask {
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
ios(imClientReceiver, imApplication);
ios(pushModel, imClientReceiver, imApplication);
} else {
android(imClientReceiver, imApplication, imMessage);
android(pushModel, imClientReceiver, imApplication);
}
}
private void android(ImClient imClientReceiver, ImApplication imApplication, ImMessage imMessage) {
private void android(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) {
// 安卓推送通道,友盟:1;firebase:2; 信鸽3
if (imApplication.getAndroidPushChannel() == 1) {
log.debug("友盟");
......@@ -75,10 +88,8 @@ public class PushTask {
// 安卓 单推
String deviceTokenIOS = imClientReceiver.getDeviceToken();
String titleIOS = PUSH_TITLE;
String subtitle = "";
try {
pushUtils.sendIOSUnicast(deviceTokenIOS, titleIOS, subtitle, PUSH_BODY);
pushUtils.sendIOSUnicast(deviceTokenIOS, pushModel.getTitle(), pushModel.getSubTitle(), PUSH_BODY);
} catch (Exception e) {
e.printStackTrace();
}
......@@ -105,9 +116,8 @@ public class PushTask {
json.put("to", imClientReceiver.getDeviceToken());
JSONObject info = new JSONObject();
info.put("title", PUSH_TITLE);
info.put("body", PUSH_BODY);
info.put("title", pushModel.getTitle());
info.put("body", pushModel.getSubTitle());
//数据消息data 通知消息 notification
json.put("notification", info);
......@@ -139,7 +149,7 @@ public class PushTask {
}
}
private void ios(ImClient imClientReceiver, ImApplication imApplication) {
private void ios(PushModel pushModel, ImClient imClientReceiver, ImApplication imApplication) {
// ios推送通道,友盟:1;firebase:2; apns原生:3
if (imApplication.getIosPushChannel() == 1) {
log.debug("友盟");
......@@ -150,9 +160,9 @@ public class PushTask {
// 安卓单推
String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text";
String unicastTicker = PUSH_BODY;
String unicastTicker = pushModel.getSubTitle();
try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, PUSH_TITLE);
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, pushModel.getTitle());
} catch (Exception e) {
e.printStackTrace();
}
......@@ -179,8 +189,8 @@ public class PushTask {
//推送到哪台客户端机器
json.put("to", imClientReceiver.getDeviceToken());
JSONObject info = new JSONObject();
info.put("title", PUSH_TITLE);
info.put("body", PUSH_BODY);
info.put("title", pushModel.getTitle());
info.put("body", pushModel.getSubTitle());
//数据消息data 通知消息 notification
json.put("notification", info);
......
package com.wecloud.im.ws.strategy;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.ws.model.request.ReceiveModel;
import io.netty.channel.ChannelHandlerContext;
......@@ -19,5 +20,5 @@ public abstract class AbstractReceiveStrategy {
* @param language
* @throws Exception
*/
abstract public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx, String data);
abstract public void process(ReceiveModel requestModel, String language, ChannelHandlerContext ctx, String data) throws JsonProcessingException;
}
......@@ -45,8 +45,10 @@ import java.util.List;
public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
private static final String TO_CONVERSATION_KEY = "toConversation";
private static final String PUSH_KEY = "push";
private static final String MSG_ID = "msgId";
private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired
private ImClientBlacklistService imClientBlacklistService;
......@@ -73,7 +75,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
private PushTask pushTask;
@Override
public void process(ReceiveModel receiveModel, String language, ChannelHandlerContext ctx, String data) {
public void process(ReceiveModel receiveModel, String language, ChannelHandlerContext ctx, String data) throws JsonProcessingException {
String appKey = ctx.channel().attr(MangerChannelService.APP_KEY).get();
String clientUniId = ctx.channel().attr(MangerChannelService.CLIENT_ID).get();
......@@ -81,7 +83,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 查询imApplication
ImApplication imApplication = imApplicationService.getOneByAppKey(appKey);
if (imApplication == null) {
log.error("imApplication为空");
log.info("imApplication为空");
return;
}
......@@ -91,21 +93,12 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
return;
}
// 获取会话id
if (receiveModel.getData().get(TO_CONVERSATION_KEY) == null) {
return;
}
Long toConversationId = Long.valueOf(receiveModel.getData().get(TO_CONVERSATION_KEY).toString());
receiveModel.getData().remove(TO_CONVERSATION_KEY);
String content = null;
JsonMapper jsonMapper = new JsonMapper();
try {
content = jsonMapper.writeValueAsString(receiveModel.getData());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Long toConversationId = Long.valueOf(receiveModel.getData().get(TO_CONVERSATION_KEY).toString());
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
......@@ -113,12 +106,28 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
.eq(ImConversationMembers::getFkConversationId, toConversationId)
.notIn(ImConversationMembers::getFkClientId, imClientSender.getId())
);
if (membersList.isEmpty()) {
log.error("membersList为空,toConversationId:" + toConversationId);
log.info("membersList为空,toConversationId:" + toConversationId);
return;
}
receiveModel.getData().remove(TO_CONVERSATION_KEY);
// 获取自定义推送字段
HashMap<String, String> pushMap = null;
if (receiveModel.getData().get(PUSH_KEY) != null) {
pushMap = (HashMap<String, String>) receiveModel.getData().get(PUSH_KEY);
receiveModel.getData().remove(PUSH_KEY);
}
String content = null;
try {
content = JSON_MAPPER.writeValueAsString(receiveModel.getData());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 判断为单聊
if (membersList.size() == 1) {
// 拉黑逻辑
......@@ -127,7 +136,6 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
}
}
// 生成消息id
long messageId = SnowflakeUtil.getId();
// 保存消息至消息表
......@@ -161,7 +169,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
return;
continue;
}
// 向接收方推送
......@@ -175,7 +183,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
writeDataService.write(responseModel, appKey, imClientReceiver.getClientId());
// 异步推送系统通知消息
pushTask.push(imClientReceiver, imClientSender, imMessage, imApplication);
pushTask.push(pushMap, imClientReceiver, imApplication);
}
// 响应发送方消息id等信息
......@@ -197,7 +205,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientUniId));
if (imClientSender == null) {
log.error("imClientSender为空");
log.info("imClientSender为空");
return null;
}
return imClientSender;
......@@ -223,7 +231,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 判断是否被拉黑
boolean beBlack = imClientBlacklistService.isBeBlack(membersList.get(0).getFkClientId(), imClientSender.getId());
if (beBlack) {
log.debug("被对方拉黑了");
log.info("被对方拉黑了");
// 响应发送方
ResponseModel<HashMap<String, Long>> responseModel = new ResponseModel<>();
......@@ -239,7 +247,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
// 是否把对方拉黑
boolean black = imClientBlacklistService.isBeBlack(imClientSender.getId(), membersList.get(0).getFkClientId());
if (black) {
log.debug("你把对方拉黑了");
log.info("你把对方拉黑了");
// 响应发送方
ResponseModel<HashMap<String, Long>> responseModel = new ResponseModel<>();
ApiResult<Boolean> result = ApiResult.result(ApiCode.IS_TO_BLACK);
......
......@@ -32,7 +32,8 @@
im_message.system,
im_message.`at`,
im_message.send_status,
im_message.fk_conversation_id
im_message.fk_conversation_id,
(SELECT COUNT(id) FROM im_inbox WHERE fk_msg_id = msgId AND read_msg_status = 0) AS not_read_count
FROM im_inbox
INNER JOIN im_message im_message ON im_message.id = im_inbox.fk_msg_id
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
......
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