package chat.handler; import java.util.Set; import chat.consts.MediaServerConfig; import chat.consts.ProtoConstants; import chat.module.Bucket; import chat.module.entity.ChatSpaceType; import chat.module.entity.MessageRecord; import chat.security.DES; import chat.server.call.CallObject; import chat.server.call.ResultCode; import chat.server.im.ResultPool; import chat.server.moquette.message.MqttFixedHeader; import chat.server.moquette.message.MqttMessageType; import chat.server.moquette.message.MqttPublishMessage; import chat.server.moquette.message.MqttPublishVariableHeader; import chat.server.moquette.message.MqttQoS; import chat.upload.UploadFile; import cn.hutool.core.lang.UUID; import cn.wildfirechat.proto.WFCMessage; import io.moquette.spi.impl.security.AES; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.FullHttpRequest; public class SystemHandler extends CallObject { private static final String KEY = "imfile"; @Override protected void publishMethod() { addOneMethod("route"); addOneMethod("getMediaUploadToken"); addOneMethod("getQiniuUploadToken"); addOneMethod("uploadFileToServer"); addOneMethod("getSetting"); addOneMethod("setSetting"); addOneMethod("getToken"); addOneMethod("modifyMyInfo"); addOneMethod("multiCastMessage"); addOneMethod("recallMessage"); addOneMethod("sendMessage"); addOneMethod("uploadDeviceToken"); } public void route() throws Exception { WFCMessage.RouteResponse response = WFCMessage.RouteResponse.newBuilder().setHost("192.168.31.117").setLongPort(1883).setShortPort(80).build(); byte[] resBytes = response.toByteArray(); resultPool.setBytes(resBytes); } public void uploadDeviceToken() throws Exception { //头 WFCMessage.UploadDeviceTokenRequest request = (WFCMessage.UploadDeviceTokenRequest) dataPool.getWFCMessage(WFCMessage.UploadDeviceTokenRequest.class); //尾 resultPool.setBytes(null); } //IMTopic.SendMessageTopic MS public void sendMessage() throws Exception { //头 WFCMessage.Message message = (WFCMessage.Message) dataPool.getWFCMessage(WFCMessage.Message.class); long messageId = MessageRecord.newMessageId(); long timeStamp = System.currentTimeMillis(); message = message.toBuilder().setFromUser(user.getId()).setMessageId(messageId).setServerTimestamp(timeStamp).build(); ChatSpaceType spaceType = ChatSpaceType.pase(message.getConversation().getType()); Bucket bucket = Bucket.getInstance(spaceType); bucket.pushOneMessage(message, user); //尾 ByteBuf ackPayload = Unpooled.buffer(); ackPayload = ackPayload.capacity(20); ackPayload.writeLong(messageId); ackPayload.writeLong(timeStamp); byte[] resBytes = new byte[ackPayload.readableBytes()]; ackPayload.getBytes(0, resBytes); resultPool.setBytes(resBytes); } public int getNotifyReceivers(String userId, WFCMessage.Message.Builder messageBuilder, Set notifyReceivers) throws Exception { int pullType = ProtoConstants.PullType.Pull_Normal; notifyReceivers.add(userId); notifyReceivers.add(messageBuilder.getConversation().getTarget()); return pullType; } public void recallMessage() throws Exception { //头 WFCMessage.INT64Buf request = (WFCMessage.INT64Buf) dataPool.getWFCMessage(WFCMessage.INT64Buf.class); WFCMessage.INT64Buf.Builder requestB = request.toBuilder(); requestB.setId(Long.parseLong(dataPool.getString("messageUid"))); requestB.build(); //尾 resultPool.setBytes(null); } public void multiCastMessage() throws Exception { //头 WFCMessage.MultiCastMessage multiCastMessage = (WFCMessage.MultiCastMessage) dataPool.getWFCMessage(WFCMessage.MultiCastMessage.class); //尾 ByteBuf payload = Unpooled.buffer(); long messageId = MessageRecord.newMessageId(); payload.ensureWritable(20).writeLong(messageId).writeLong(System.currentTimeMillis()); byte[] resBytes = payload.array(); resultPool.setBytes(resBytes); } public void modifyMyInfo() throws Exception { //头 WFCMessage.ModifyMyInfoRequest request = (WFCMessage.ModifyMyInfoRequest) dataPool.getWFCMessage(WFCMessage.ModifyMyInfoRequest.class); //尾 resultPool.setBytes(null); } public void getToken() throws Exception { //头 WFCMessage.GetTokenRequest request = (WFCMessage.GetTokenRequest) dataPool.getWFCMessage(WFCMessage.GetTokenRequest.class); WFCMessage.GetTokenRequest.Builder requestBuild = request.toBuilder(); requestBuild.setUserId(dataPool.getString("userId")); requestBuild.setClientId(dataPool.getString("clientId")); requestBuild.setPlatform(dataPool.getInteger("platform", 0)); request = requestBuild.build(); //尾 String strToken = ""; String result = strToken + "|" + session.getSecret() + "|" + "123456"; byte[] bytes = result.getBytes(); resultPool.setBytes(bytes); } public void getQiniuUploadToken() throws Exception { String token; WFCMessage.GetUploadTokenResult.Builder resultBuilder = WFCMessage.GetUploadTokenResult.newBuilder(); token = getToken(5); String domain = "http://" + MediaServerConfig.SERVER_IP + ":" + MediaServerConfig.HTTP_SERVER_PORT; resultBuilder.setDomain(domain); resultBuilder.setServer(MediaServerConfig.SERVER_IP); resultBuilder.setPort(MediaServerConfig.HTTP_SERVER_PORT); resultBuilder.setToken(token); byte[] data = resultBuilder.buildPartial().toByteArray(); resultPool.setBytes(data); } public void getMediaUploadToken() throws Exception { String token; int type; WFCMessage.GetUploadTokenRequest request = (WFCMessage.GetUploadTokenRequest) dataPool.getWFCMessage(WFCMessage.GetUploadTokenRequest.class); type = request.getMediaType(); WFCMessage.GetUploadTokenResult.Builder resultBuilder = WFCMessage.GetUploadTokenResult.newBuilder(); token = getToken(type); String domain = "http://" + MediaServerConfig.SERVER_IP + ":" + MediaServerConfig.HTTP_SERVER_PORT; resultBuilder.setDomain(domain); resultBuilder.setServer(MediaServerConfig.SERVER_IP); resultBuilder.setPort(MediaServerConfig.HTTP_SERVER_PORT); resultBuilder.setToken(token); byte[] data = resultBuilder.buildPartial().toByteArray(); resultPool.setBytes(data); } public void uploadFileToServer() throws Exception { FullHttpRequest request = dataPool.getHttpRequest(); String requestId = UUID.randomUUID().toString().replace("-", ""); String key = UploadFile.multipartUpload(request, requestId); resultPool.setNeedReturnCode(false); resultPool.add("key", key, false); } public static String getToken(int type) { String signKey = KEY + "|" + (System.currentTimeMillis()) + "|" + type; try { return DES.encryptDES(signKey); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public void getSetting() throws Exception { } public void setSetting() throws Exception { } public static MqttPublishMessage notRetainedPublish(String topic, MqttQoS qos, ByteBuf message) { return notRetainedPublishWithMessageId(topic, qos, message, 0); } private static MqttPublishMessage notRetainedPublishWithMessageId(String topic, MqttQoS qos, ByteBuf message, int messageId) { MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBLISH, false, qos, false, 0); MqttPublishVariableHeader varHeader = new MqttPublishVariableHeader(topic, messageId); return new MqttPublishMessage(fixedHeader, varHeader, message); } public static void main(String[] args) { WFCMessage.RouteResponse response = WFCMessage.RouteResponse.newBuilder().setHost("192.168.31.117").setLongPort(1883).setShortPort(80).build(); byte[] resBytes = response.toByteArray(); resBytes = AES.AESEncrypt(resBytes, "31a95a1a-d169-4a26-be4c-ef73088c1b1f"); // data = Base64.getEncoder().encode(data); ByteBuf buf = Unpooled.buffer(); buf.ensureWritable(1).writeByte(ResultCode.Success.getValue()); buf.ensureWritable(resBytes.length).writeBytes(resBytes); System.out.println(buf); } }