package chat.module.entity; import chat.consts.ProtoConstants; import chat.server.call.ResultCode; import chat.server.moquette.message.ModifiedMqttPubAckMessage; import chat.server.moquette.message.MqttFixedHeader; import chat.server.moquette.message.MqttMessage; import chat.server.moquette.message.MqttMessageIdVariableHeader; import chat.server.moquette.message.MqttMessageType; import chat.server.moquette.message.MqttQoS; import chat.user.User; import chat.user.UserStore; import chat.util.ByteStrToStr; import cn.wildfirechat.proto.WFCMessage; import cn.wildfirechat.proto.WFCMessage.Message; import frame.object.data.Entity; import frame.object.data.ID; import frame.persist.NamedSQL; import frame.persist.SQLRunner; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; public class MessageRecord { private String id; private String spaceid; private String spacecode; private String typecode; private int type; private String path; private String content; private int persistflag; private String senderid; private long messageid; private String statuscode; private long timestamp; private String parentid; private int level; private User sender; private WFCMessage.Message message; public MessageRecord() { timestamp = System.currentTimeMillis(); } public static MessageRecord getInstance(String spaceCode, String spaceId, Message message) throws Exception { MessageRecord result = new MessageRecord(); result.id = ID.newValue(); if (message.getContent().getType() == 1) { result.typecode = "text"; } else if (message.getContent().getType() == 2) { result.typecode = "voice"; } else if (message.getContent().getType() == 3) { result.typecode = "image"; } else if (message.getContent().getType() == 4) { result.typecode = "location"; } else if (message.getContent().getType() == 5) { result.typecode = "file"; } else if (message.getContent().getType() == 6) { result.typecode = "video"; } else if (message.getContent().getType() == 7) { result.typecode = "sticker"; } else if (message.getContent().getType() == 8) { result.typecode = "richmedia"; } else if (message.getContent().getType() == 104) { result.typecode = "groupNotiy"; } else if (message.getContent().getType() == 90) { result.typecode = "newFriendNotify"; } result.type = message.getContent().getType(); result.spaceid = spaceId; result.spacecode = spaceCode; if (message.getContent().getType() == 90) { result.content = message.getContent().getContent(); } else if (message.getContent().getSearchableContent() == null || ("").equals(message.getContent().getSearchableContent())) { result.content = ByteStrToStr.transformStr(message.getContent().getData()); } else { result.content = message.getContent().getSearchableContent(); } result.persistflag = message.getContent().getPersistFlag(); result.senderid = message.getFromUser(); result.messageid = message.getMessageId(); result.statuscode = "send"; result.timestamp = System.currentTimeMillis(); result.sender = UserStore.getById(message.getFromUser()); return result; } public static MessageRecord getTextInstance(String content, User sender) throws Exception { MessageRecord result = new MessageRecord(); result.id = ID.newValue(); result.messageid = newMessageId(); result.sender = sender; result.senderid = sender.getId(); result.content = content; return result; } public static MessageRecord getImageInstance(String content) { // TODO Auto-generated method stub return null; } public void load(Entity entity) throws Exception { // TODO Auto-generated method stub id = entity.getString("id"); spaceid = entity.getString("spaceid"); spacecode = entity.getString("spacecode"); typecode = entity.getString("typecode"); type = entity.getInteger("type"); content = entity.getString("content"); path = entity.getString("path"); persistflag = entity.getInteger("persistflag"); senderid = entity.getString("senderid"); messageid = Long.parseLong(entity.getString("messageid")); statuscode = entity.getString("statuscode"); timestamp = Long.parseLong(entity.getString("timestamp")); parentid = entity.getString("parentid"); level = entity.getInteger("level"); } public void pushTo(Entity entity) throws Exception { entity.set("id", id); entity.set("spaceid", spaceid); entity.set("spacecode", spacecode); entity.set("content", content); entity.set("typecode", typecode); entity.set("type", type); entity.set("content", content); entity.set("path", path); entity.set("persistflag", persistflag); entity.set("senderid", senderid); entity.set("content", content); entity.set("messageid", messageid); entity.set("statuscode", statuscode); entity.set("timestamp", timestamp); entity.set("parentid", parentid); entity.set("level", level); } public MqttMessage toMqttMessage(String targetId, WFCMessage.MessageContent content) { WFCMessage.Message wfcMessage = toWFCMessage(targetId, content); byte[] bytes = wfcMessage.toByteArray(); ByteBuf buf = Unpooled.buffer(); buf.ensureWritable(1).writeByte(ResultCode.Success.getValue()); buf.ensureWritable(bytes.length).writeBytes(bytes); MqttMessageIdVariableHeader header = MqttMessageIdVariableHeader.from(Integer.parseInt(String.valueOf(messageid))); MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBACK, false, MqttQoS.AT_MOST_ONCE, false, 0); ModifiedMqttPubAckMessage mqttMessage = new ModifiedMqttPubAckMessage(fixedHeader, header, buf); return mqttMessage; } public Message toWFCMessage(String targetId, WFCMessage.MessageContent contentMessage) { WFCMessage.Message message = null; try { WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder(); if (contentMessage != null) { long timestamp = System.currentTimeMillis(); builder = WFCMessage.Message.newBuilder().setContent(contentMessage).setServerTimestamp(timestamp); builder.setConversation(builder.getConversationBuilder().setType(ProtoConstants.ConversationType.ConversationType_Group).setTarget(targetId).setLine(0)); builder.setFromUser("user000"); long messageId = newMessageId(); builder.setMessageId(messageId); } else { builder = WFCMessage.Message.newBuilder(); builder.setMessageId(messageid); builder.setFromUser(senderid); WFCMessage.Conversation.Builder cb = WFCMessage.Conversation.newBuilder(); cb.setType(0); cb.setTarget(targetId); cb.setLine(0); builder.setConversation(cb.build()); } WFCMessage.MessageContent.Builder contentBuilder = null; if (contentMessage == null) { contentBuilder = WFCMessage.MessageContent.newBuilder(); contentBuilder.setType(1); contentBuilder.setSearchableContent(content); contentBuilder.setMediaType(0); contentBuilder.setPersistFlag(0); contentBuilder.setExpireDuration(0); contentBuilder.setMentionedType(0); WFCMessage.MessageContent messageContent = contentBuilder.build(); builder.setContent(messageContent); builder.setServerTimestamp(System.currentTimeMillis()); } message = builder.build(); } catch (Exception e) { e.printStackTrace(); } return message; } public String getSenderId() { return senderid; } public String getContent() { return content; } public void setSender(User sender) { if (sender == null) { this.sender = null; this.senderid = null; return; } this.sender = sender; this.senderid = sender.getId(); } public WFCMessage.Message getWFCMessage() { return message; } public static int newMessageId() throws Exception { NamedSQL namedSQL = NamedSQL.getInstance("nextval"); namedSQL.setParam("name", "messageId"); int result = SQLRunner.getInteger(namedSQL); return result; } public String getId() { return id; } public boolean isFreshThan(long timestamp) { return this.timestamp > timestamp; } public long getMessageid() { return messageid; } public void setMessageid(long messageid) { this.messageid = messageid; } public WFCMessage.Message getMessage() { return message; } public void setMessage(WFCMessage.Message message) { this.message = message; } public String getTypecode() { return typecode; } public void setTypecode(String typecode) { this.typecode = typecode; } public int getPersistflag() { return persistflag; } public void setPersistflag(int persistflag) { this.persistflag = persistflag; } public int getType() { return type; } public void setType(int type) { this.type = type; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public String getSpacecode() { return spacecode; } public void setSpacecode(String spacecode) { this.spacecode = spacecode; } public String getSpaceid() { return spaceid; } public void setSpaceid(String spaceid) { this.spaceid = spaceid; } }