package me.chanjar.weixin.mp.demo;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSession;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpMessageMatcher;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.WxMpCustomMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;
public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMatcher {
private Random random = new Random();
private Pattern pattern = Pattern.compile("\\d+");
@Override
public boolean match(WxMpXmlMessage message) {
return isUserWantGuess(message) || isUserAnswering(message);
}
private boolean isUserWantGuess(WxMpXmlMessage message) {
return "猜数字".equals(message.getContent());
}
private boolean isUserAnswering(WxMpXmlMessage message) {
return pattern.matcher(message.getContent()).matches();
}
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,
WxSessionManager sessionManager) throws WxErrorException {
if (isUserWantGuess(wxMessage)) {
letsGo(wxMessage, wxMpService, sessionManager);
}
if (isUserAnswering(wxMessage)) {
giveHint(wxMessage, wxMpService, sessionManager);
}
return null;
}
protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
if (session.getAttribute("guessing") == null) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("请猜一个100以内的数字")
.build();
wxMpService.customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("放弃了吗?那请重新猜一个100以内的数字")
.build();
wxMpService.customMessageSend(m);
}
session.setAttribute("guessing", Boolean.TRUE);
session.setAttribute("number", random.nextInt(100));
}
protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
if (session.getAttribute("guessing") == null) {
return;
}
boolean guessing = (Boolean) session.getAttribute("guessing");
if (!guessing) {
return;
}
int answer = (Integer) session.getAttribute("number");
int guessNumber = Integer.valueOf(wxMessage.getContent());
if (guessNumber < answer) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("小了")
.build();
wxMpService.customMessageSend(m);
} else if (guessNumber > answer) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("大了")
.build();
wxMpService.customMessageSend(m);
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("Bingo!")
.build();
session.removeAttribute("guessing");
wxMpService.customMessageSend(m);
}
}
}