From 919ba84f56efbc4c7aa01b594d3d45dfb6f3504e Mon Sep 17 00:00:00 2001 From: Kanjie Lu Date: Tue, 20 Mar 2018 16:30:35 +0800 Subject: [PATCH] Add red packet support (#4) * red packet message supported * updated the documentation --- README.md | 9 ++ README.zh-CN.md | 13 ++- .../com/cherry/jeeves/MessageHandlerImpl.java | 11 ++- .../jeeves/service/DefaultMessageHandler.java | 7 +- .../cherry/jeeves/service/MessageHandler.java | 81 +++++++++++++++- .../com/cherry/jeeves/service/SyncServie.java | 93 +++++++++++++------ 6 files changed, 180 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index a649588..69f914d 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,15 @@ void onMediaPlatformsDeleted(Set mps); | --- | --- | | `mps` | a list of media platforms that are deleted | +#### Red packet received +```java +void onRedPacketReceived(Contact contact); +``` + +| Parameters | Meaning | +| --- | --- | +| `contact` | where the red packet is recevied | + ### API `WechatHttpService` has provided a bundle of apis that you can use to interact with the server. diff --git a/README.zh-CN.md b/README.zh-CN.md index 99a5a26..39f19c7 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -61,7 +61,7 @@ void onReceivingPrivateTextMessage(Message message, String thumbImageUrl, String |`thumbImageUrl`| 缩略图URL | |`fullImageUrl`| 原图URL | -#### ChatRoom text message +#### 聊天群文本消息 ```java void onReceivingChatRoomTextMessage(Message message); ``` @@ -70,7 +70,7 @@ void onReceivingChatRoomTextMessage(Message message); | --- | --- | | `message` | 收到的消息 | -#### ChatRoom image message +#### 聊天群图片消息 ```java void onReceivingChatRoomImageMessage(Message message, String thumbImageUrl, String fullImageUrl); ``` @@ -168,6 +168,15 @@ void onMediaPlatformsDeleted(Set mps); | --- | --- | | `mps` | 被删除的公众号 | +#### 收到红包 +```java +void onRedPacketReceived(Contact contact); +``` + +| 参数 | 含义 | +| --- | --- | +| `contact` | 发红包的好友或者群 | + ### API `WechatHttpService` 已经提供了各式各样的API供您使用。 diff --git a/src/main/java/com/cherry/jeeves/MessageHandlerImpl.java b/src/main/java/com/cherry/jeeves/MessageHandlerImpl.java index 73423b3..214aebe 100644 --- a/src/main/java/com/cherry/jeeves/MessageHandlerImpl.java +++ b/src/main/java/com/cherry/jeeves/MessageHandlerImpl.java @@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Set; @@ -63,7 +64,7 @@ public void onReceivingPrivateImageMessage(Message message, String thumbImageUrl } @Override - public boolean onReceivingFriendInvitation(RecommendInfo info) throws IOException { + public boolean onReceivingFriendInvitation(RecommendInfo info) { logger.info("onReceivingFriendInvitation"); logger.info("recommendinfo content:" + info.getContent()); // 默认接收所有的邀请 @@ -132,6 +133,14 @@ public void onMediaPlatformsDeleted(Set mps) { logger.info("onMediaPlatformsDeleted"); } + @Override + public void onRedPacketReceived(Contact contact) { + logger.info("onRedPacketReceived"); + if (contact != null) { + logger.info("the red packet is from " + contact.getNickName()); + } + } + private void replyMessage(Message message) throws IOException { wechatHttpService.sendText(message.getFromUserName(), message.getContent()); } diff --git a/src/main/java/com/cherry/jeeves/service/DefaultMessageHandler.java b/src/main/java/com/cherry/jeeves/service/DefaultMessageHandler.java index 080b049..72f80ff 100644 --- a/src/main/java/com/cherry/jeeves/service/DefaultMessageHandler.java +++ b/src/main/java/com/cherry/jeeves/service/DefaultMessageHandler.java @@ -35,7 +35,7 @@ public void onReceivingPrivateImageMessage(Message message, String thumbImageUrl } @Override - public boolean onReceivingFriendInvitation(RecommendInfo info) throws IOException { + public boolean onReceivingFriendInvitation(RecommendInfo info) { logger.info("onReceivingFriendInvitation"); return false; } @@ -79,4 +79,9 @@ public void onNewMediaPlatformsFound(Set mps) { public void onMediaPlatformsDeleted(Set mps) { logger.info("onMediaPlatformsDeleted"); } + + @Override + public void onRedPacketReceived(Contact contact) { + logger.info("onRedPacketReceived"); + } } diff --git a/src/main/java/com/cherry/jeeves/service/MessageHandler.java b/src/main/java/com/cherry/jeeves/service/MessageHandler.java index b5b2e75..4fcd270 100644 --- a/src/main/java/com/cherry/jeeves/service/MessageHandler.java +++ b/src/main/java/com/cherry/jeeves/service/MessageHandler.java @@ -9,29 +9,108 @@ import java.util.Set; public interface MessageHandler { + /** + * 事件:收到群聊天文本消息 + * + * @param message 消息体 + */ void onReceivingChatRoomTextMessage(Message message); + /** + * 事件:收到群聊天图片消息 + * + * @param message 消息体 + * @param thumbImageUrl 图片缩略图链接 + * @param fullImageUrl 图片完整图链接 + */ void onReceivingChatRoomImageMessage(Message message, String thumbImageUrl, String fullImageUrl); + /** + * 事件:收到个人聊天文本消息 + * + * @param message 消息体 + */ void onReceivingPrivateTextMessage(Message message) throws IOException; + /** + * 事件:收到个人聊天图片消息 + * + * @param message 消息体 + * @param thumbImageUrl 图片缩略图链接 + * @param fullImageUrl 图片完整图链接 + */ void onReceivingPrivateImageMessage(Message message, String thumbImageUrl, String fullImageUrl) throws IOException; - boolean onReceivingFriendInvitation(RecommendInfo info) throws IOException; + /** + * 事件:收到加好友邀请 + * + * @param info 邀请信息 + * @return {@code true} 如果接受请求, 否则 {@code false} + */ + boolean onReceivingFriendInvitation(RecommendInfo info); + /** + * 事件:接受好友邀请成功 + * + * @param message 消息体 + */ void postAcceptFriendInvitation(Message message) throws IOException; + /** + * 事件:群成员发生变化 + * + * @param chatRoom 群 + * @param membersJoined 新加入的群成员 + * @param membersLeft 离开的群成员 + */ void onChatRoomMembersChanged(Contact chatRoom, Set membersJoined, Set membersLeft); + /** + * 事件:发现新增群(例如加入了新群) + * + * @param chatRooms 新增的群 + */ void onNewChatRoomsFound(Set chatRooms); + /** + * 事件:发现群减少(例如被踢出了群) + * + * @param chatRooms 减少的群 + */ void onChatRoomsDeleted(Set chatRooms); + /** + * 事件:发现新的好友 + * + * @param contacts 新的好友 + */ void onNewFriendsFound(Set contacts); + /** + * 事件:发现好友减少 + * + * @param contacts 减少的好友 + */ void onFriendsDeleted(Set contacts); + /** + * 事件:发现新的公众号 + * + * @param mps 新的公众号 + */ void onNewMediaPlatformsFound(Set mps); + /** + * 事件:删除公众号 + * + * @param mps 被删除的公众号 + */ void onMediaPlatformsDeleted(Set mps); + + /** + * 事件:收到红包(个人的或者群里的) + * + * @param contact 发红包的个人或者群 + */ + void onRedPacketReceived(Contact contact); } diff --git a/src/main/java/com/cherry/jeeves/service/SyncServie.java b/src/main/java/com/cherry/jeeves/service/SyncServie.java index 819266a..92c761f 100644 --- a/src/main/java/com/cherry/jeeves/service/SyncServie.java +++ b/src/main/java/com/cherry/jeeves/service/SyncServie.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.util.HashSet; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -35,6 +36,8 @@ public class SyncServie { @Value("${wechat.url.get_msg_img}") private String WECHAT_URL_GET_MSG_IMG; + private final static String RED_PACKET_CONTENT = "收到红包,请在手机上查看"; + @PostConstruct public void setMessageHandler() { if (messageHandler == null) { @@ -101,48 +104,80 @@ private void acceptFriendInvitation(RecommendInfo info) throws IOException, URIS WechatUtils.checkBaseResponse(verifyUserResponse); } + private boolean isMessageFromIndividual(Message message) { + return message.getFromUserName() != null + && message.getFromUserName().startsWith("@") + && !message.getFromUserName().startsWith("@@"); + } + + private boolean isMessageFromChatRoom(Message message) { + return message.getFromUserName() != null && message.getFromUserName().startsWith("@@"); + } + private void onNewMessage() throws IOException, URISyntaxException { SyncResponse syncResponse = sync(); + if (messageHandler == null) { + return; + } for (Message message : syncResponse.getAddMsgList()) { - //私信 - if (messageHandler != null && message.getFromUserName() != null - && message.getFromUserName().startsWith("@") - && !message.getFromUserName().startsWith("@@")) { - if (message.getMsgType() == MessageType.TEXT.getCode()) { - cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); + //文本消息 + if (message.getMsgType() == MessageType.TEXT.getCode()) { + cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); + //个人 + if (isMessageFromIndividual(message)) { messageHandler.onReceivingPrivateTextMessage(message); - } else if (message.getMsgType() == MessageType.IMAGE.getCode()) { - cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); - String fullImageUrl = String.format(WECHAT_URL_GET_MSG_IMG, cacheService.getHostUrl(), message.getMsgId(), cacheService.getsKey()); - String thumbImageUrl = fullImageUrl + "&type=slave"; - messageHandler.onReceivingPrivateImageMessage(message, thumbImageUrl, fullImageUrl); } - } - //群聊 - else if (messageHandler != null && message.getFromUserName() != null && message.getFromUserName().startsWith("@@")) { - if (message.getMsgType() == MessageType.TEXT.getCode()) { - cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); + //群 + else if (isMessageFromChatRoom(message)) { messageHandler.onReceivingChatRoomTextMessage(message); - } else if (message.getMsgType() == MessageType.IMAGE.getCode()) { - cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); - String fullImageUrl = String.format(WECHAT_URL_GET_MSG_IMG, cacheService.getHostUrl(), message.getMsgId(), cacheService.getsKey()); - String thumbImageUrl = fullImageUrl + "&type=slave"; + } + //图片 + } else if (message.getMsgType() == MessageType.IMAGE.getCode()) { + cacheService.getContactNamesWithUnreadMessage().add(message.getFromUserName()); + String fullImageUrl = String.format(WECHAT_URL_GET_MSG_IMG, cacheService.getHostUrl(), message.getMsgId(), cacheService.getsKey()); + String thumbImageUrl = fullImageUrl + "&type=slave"; + //个人 + if (isMessageFromIndividual(message)) { + messageHandler.onReceivingPrivateImageMessage(message, thumbImageUrl, fullImageUrl); + } + //群 + else if (isMessageFromChatRoom(message)) { messageHandler.onReceivingChatRoomImageMessage(message, thumbImageUrl, fullImageUrl); } } + //系统消息 + else if (message.getMsgType() == MessageType.SYS.getCode()) { + //红包 + if (RED_PACKET_CONTENT.equals(message.getContent())) { + logger.info("[*] you've received a red packet"); + String from = message.getFromUserName(); + Set contacts = null; + //个人 + if (isMessageFromIndividual(message)) { + contacts = cacheService.getIndividuals(); + } + //群 + else if (isMessageFromChatRoom(message)) { + contacts = cacheService.getChatRooms(); + } + if (contacts != null) { + Contact contact = contacts.stream().filter(x -> Objects.equals(x.getUserName(), from)).findAny().orElse(null); + messageHandler.onRedPacketReceived(contact); + } + } + } //好友邀请 else if (message.getMsgType() == MessageType.VERIFYMSG.getCode() && cacheService.getOwner().getUserName().equals(message.getToUserName())) { - if (messageHandler != null) { - if (messageHandler.onReceivingFriendInvitation(message.getRecommendInfo())) { - acceptFriendInvitation(message.getRecommendInfo()); - logger.info("[*] you've accepted the invitation"); - messageHandler.postAcceptFriendInvitation(message); - } else { - logger.info("[*] you've declined the invitation"); - //TODO decline invitation - } + if (messageHandler.onReceivingFriendInvitation(message.getRecommendInfo())) { + acceptFriendInvitation(message.getRecommendInfo()); + logger.info("[*] you've accepted the invitation"); + messageHandler.postAcceptFriendInvitation(message); + } else { + logger.info("[*] you've declined the invitation"); + //TODO decline invitation } } + } }