package com.xmzs.common.wechat.core; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import com.xmzs.common.wechat.utils.enums.MsgCodeEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.xmzs.common.wechat.api.MessageTools; import com.xmzs.common.wechat.beans.BaseMsg; import com.xmzs.common.wechat.face.IMsgHandlerFace; import com.xmzs.common.wechat.utils.enums.MsgTypeEnum; import com.xmzs.common.wechat.utils.tools.CommonTools; /** * 消息处理中心 * * @author https://github.com/yaphone * @date 创建时间:2017年5月14日 下午12:47:50 * @version 1.0 * */ public class MsgCenter { private static Logger LOG = LoggerFactory.getLogger(MsgCenter.class); private static Core core = Core.getInstance(); /** * 接收消息,放入队列 * * @author https://github.com/yaphone * @date 2017年4月23日 下午2:30:48 * @param msgList * @return */ public static JSONArray produceMsg(JSONArray msgList) { JSONArray result = new JSONArray(); for (int i = 0; i < msgList.size(); i++) { JSONObject msg = new JSONObject(); JSONObject m = msgList.getJSONObject(i); m.put("groupMsg", false);// 是否是群消息 if (m.getString("FromUserName").contains("@@") || m.getString("ToUserName").contains("@@")) { // 群聊消息 if (m.getString("FromUserName").contains("@@") && !core.getGroupIdList().contains(m.getString("FromUserName"))) { core.getGroupIdList().add((m.getString("FromUserName"))); } else if (m.getString("ToUserName").contains("@@") && !core.getGroupIdList().contains(m.getString("ToUserName"))) { core.getGroupIdList().add((m.getString("ToUserName"))); } // 群消息与普通消息不同的是在其消息体(Content)中会包含发送者id及":
"消息,这里需要处理一下,去掉多余信息,只保留消息内容 if (m.getString("Content").contains("
")) { String content = m.getString("Content").substring(m.getString("Content").indexOf("
") + 5); m.put("Content", content); m.put("groupMsg", true); } } else { CommonTools.msgFormatter(m, "Content"); } if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_TEXT.getCode())) { // words // 文本消息 if (m.getString("Url").length() != 0) { String regEx = "(.+?\\(.+?\\))"; Matcher matcher = CommonTools.getMatcher(regEx, m.getString("Content")); String data = "Map"; if (matcher.find()) { data = matcher.group(1); } msg.put("Type", "Map"); msg.put("Text", data); } else { msg.put("Type", MsgTypeEnum.TEXT.getType()); msg.put("Text", m.getString("Content")); } m.put("Type", msg.getString("Type")); m.put("Text", msg.getString("Text")); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_IMAGE.getCode()) || m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_EMOTICON.getCode())) { // 图片消息 m.put("Type", MsgTypeEnum.PIC.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_VOICE.getCode())) { // 语音消息 m.put("Type", MsgTypeEnum.VOICE.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_VERIFYMSG.getCode())) {// friends // 好友确认消息 // MessageTools.addFriend(core, userName, 3, ticket); // 确认添加好友 m.put("Type", MsgTypeEnum.VERIFYMSG.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_SHARECARD.getCode())) { // 共享名片 m.put("Type", MsgTypeEnum.NAMECARD.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_VIDEO.getCode()) || m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_MICROVIDEO.getCode())) {// viedo m.put("Type", MsgTypeEnum.VIEDO.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_MEDIA.getCode())) { // 多媒体消息 m.put("Type", MsgTypeEnum.MEDIA.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_STATUSNOTIFY.getCode())) {// phone // init // 微信初始化消息 } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_SYS.getCode())) {// 系统消息 m.put("Type", MsgTypeEnum.SYS.getType()); } else if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_RECALLED.getCode())) { // 撤回消息 } else { LOG.info("Useless msg"); } LOG.info("收到消息一条,来自: " + m.getString("FromUserName")); result.add(m); } return result; } /** * 消息处理 * * @author https://github.com/yaphone * @date 2017年5月14日 上午10:52:34 * @param msgHandler */ public static void handleMsg(IMsgHandlerFace msgHandler) { while (true) { if (core.getMsgList().size() > 0 && core.getMsgList().get(0).getContent() != null) { if (core.getMsgList().get(0).getContent().length() > 0) { BaseMsg msg = core.getMsgList().get(0); if (msg.getType() != null) { try { if (msg.getType().equals(MsgTypeEnum.TEXT.getType())) { String result = msgHandler.textMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } else if (msg.getType().equals(MsgTypeEnum.PIC.getType())) { String result = msgHandler.picMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } else if (msg.getType().equals(MsgTypeEnum.VOICE.getType())) { String result = msgHandler.voiceMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } else if (msg.getType().equals(MsgTypeEnum.VIEDO.getType())) { String result = msgHandler.viedoMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } else if (msg.getType().equals(MsgTypeEnum.NAMECARD.getType())) { String result = msgHandler.nameCardMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } else if (msg.getType().equals(MsgTypeEnum.SYS.getType())) { // 系统消息 msgHandler.sysMsgHandle(msg); } else if (msg.getType().equals(MsgTypeEnum.VERIFYMSG.getType())) { // 确认添加好友消息 String result = msgHandler.verifyAddFriendMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getRecommendInfo().getUserName()); } else if (msg.getType().equals(MsgTypeEnum.MEDIA.getType())) { // 多媒体消息 String result = msgHandler.mediaMsgHandle(msg); MessageTools.sendMsgById(result, core.getMsgList().get(0).getFromUserName()); } } catch (Exception e) { e.printStackTrace(); } } } core.getMsgList().remove(0); } try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }