Skip to content

Commit

Permalink
Add red packet support (kanjielu#4)
Browse files Browse the repository at this point in the history
* red packet message supported
* updated the documentation
  • Loading branch information
kanjielu committed Mar 20, 2018
1 parent 4a22bf1 commit 919ba84
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 34 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,15 @@ void onMediaPlatformsDeleted(Set<Contact> 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.

Expand Down
13 changes: 11 additions & 2 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void onReceivingPrivateTextMessage(Message message, String thumbImageUrl, String
|`thumbImageUrl`| 缩略图URL |
|`fullImageUrl`| 原图URL |

#### ChatRoom text message
#### 聊天群文本消息
```java
void onReceivingChatRoomTextMessage(Message message);
```
Expand All @@ -70,7 +70,7 @@ void onReceivingChatRoomTextMessage(Message message);
| --- | --- |
| `message` | 收到的消息 |

#### ChatRoom image message
#### 聊天群图片消息
```java
void onReceivingChatRoomImageMessage(Message message, String thumbImageUrl, String fullImageUrl);
```
Expand Down Expand Up @@ -168,6 +168,15 @@ void onMediaPlatformsDeleted(Set<Contact> mps);
| --- | --- |
| `mps` | 被删除的公众号 |

#### 收到红包
```java
void onRedPacketReceived(Contact contact);
```

| 参数 | 含义 |
| --- | --- |
| `contact` | 发红包的好友或者群 |

### API
`WechatHttpService` 已经提供了各式各样的API供您使用。

Expand Down
11 changes: 10 additions & 1 deletion src/main/java/com/cherry/jeeves/MessageHandlerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
// 默认接收所有的邀请
Expand Down Expand Up @@ -132,6 +133,14 @@ public void onMediaPlatformsDeleted(Set<Contact> 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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -79,4 +79,9 @@ public void onNewMediaPlatformsFound(Set<Contact> mps) {
public void onMediaPlatformsDeleted(Set<Contact> mps) {
logger.info("onMediaPlatformsDeleted");
}

@Override
public void onRedPacketReceived(Contact contact) {
logger.info("onRedPacketReceived");
}
}
81 changes: 80 additions & 1 deletion src/main/java/com/cherry/jeeves/service/MessageHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<ChatRoomMember> membersJoined, Set<ChatRoomMember> membersLeft);

/**
* 事件:发现新增群(例如加入了新群)
*
* @param chatRooms 新增的群
*/
void onNewChatRoomsFound(Set<Contact> chatRooms);

/**
* 事件:发现群减少(例如被踢出了群)
*
* @param chatRooms 减少的群
*/
void onChatRoomsDeleted(Set<Contact> chatRooms);

/**
* 事件:发现新的好友
*
* @param contacts 新的好友
*/
void onNewFriendsFound(Set<Contact> contacts);

/**
* 事件:发现好友减少
*
* @param contacts 减少的好友
*/
void onFriendsDeleted(Set<Contact> contacts);

/**
* 事件:发现新的公众号
*
* @param mps 新的公众号
*/
void onNewMediaPlatformsFound(Set<Contact> mps);

/**
* 事件:删除公众号
*
* @param mps 被删除的公众号
*/
void onMediaPlatformsDeleted(Set<Contact> mps);

/**
* 事件:收到红包(个人的或者群里的)
*
* @param contact 发红包的个人或者群
*/
void onRedPacketReceived(Contact contact);
}
93 changes: 64 additions & 29 deletions src/main/java/com/cherry/jeeves/service/SyncServie.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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) {
Expand Down Expand Up @@ -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<Contact> 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
}
}

}
}

Expand Down

0 comments on commit 919ba84

Please sign in to comment.