Просмотр исходного кода

issue #77 用matcher做新的猜数字游戏,代码更简单

master
Daniel Qian 10 лет назад
Родитель
Сommit
4b8aa69cca
4 измененных файлов: 137 добавлений и 129 удалений
  1. +0
    -71
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoCheckAnswerHandler.java
  2. +135
    -0
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
  3. +0
    -54
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoStartGuessNumberHandler.java
  4. +2
    -4
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java

+ 0
- 71
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoCheckAnswerHandler.java Просмотреть файл

@@ -1,71 +0,0 @@
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.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;

public class DemoCheckAnswerHandler implements WxMpMessageHandler {

@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,
WxSessionManager sessionManager) {

WxSession session = sessionManager.getSession(wxMessage.getFromUserName());

if (session.getAttribute("guessing") == null) {
return null;
}
boolean guessing = (Boolean) session.getAttribute("guessing");
if (!guessing) {
return null;
}

int answer = (Integer) session.getAttribute("number");
int guessNumber = Integer.valueOf(wxMessage.getContent());
if (guessNumber < answer) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("小了")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}

} else if (guessNumber > answer) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("大了")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("Bingo!")
.build();
try {
session.removeAttribute("guessing");
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
return null;
}

}

+ 135
- 0
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java Просмотреть файл

@@ -0,0 +1,135 @@
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) {

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) {
WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
if (session.getAttribute("guessing") == null) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("请猜一个100以内的数字")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("放弃了吗?那请重新猜一个100以内的数字")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
}

session.setAttribute("guessing", Boolean.TRUE);
session.setAttribute("number", random.nextInt(100));
}


protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) {

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();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}

} else if (guessNumber > answer) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("大了")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("Bingo!")
.build();
try {
session.removeAttribute("guessing");
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
}

}
}

+ 0
- 54
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoStartGuessNumberHandler.java Просмотреть файл

@@ -1,54 +0,0 @@
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.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;

public class DemoStartGuessNumberHandler implements WxMpMessageHandler {

private Random random = new Random();

@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,
WxSessionManager sessionManager) {

WxSession session = sessionManager.getSession(wxMessage.getFromUserName());

if (session.getAttribute("guessing") == null) {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("请猜一个100以内的数字")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
} else {
WxMpCustomMessage m = WxMpCustomMessage
.TEXT()
.toUser(wxMessage.getFromUserName())
.content("放弃了吗?那请重新猜一个100以内的数字")
.build();
try {
wxMpService.customMessageSend(m);
} catch (WxErrorException e) {
e.printStackTrace();
}
}

session.setAttribute("guessing", Boolean.TRUE);
session.setAttribute("number", random.nextInt(100));
return null;

}
}

+ 2
- 4
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java Просмотреть файл

@@ -44,14 +44,12 @@ public class WxMpDemoServer {
WxMpMessageHandler textHandler = new DemoTextHandler();
WxMpMessageHandler imageHandler = new DemoImageHandler();
WxMpMessageHandler oauth2handler = new DemoOAuth2Handler();
WxMpMessageHandler checkAnswerHandler = new DemoCheckAnswerHandler();
DemoStartGuessNumberHandler startGuessNumberHandler = new DemoStartGuessNumberHandler();
DemoGuessNumberHandler guessNumberHandler = new DemoGuessNumberHandler();

wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
wxMpMessageRouter
.rule().handler(logHandler).next()
.rule().msgType(WxConsts.XML_MSG_TEXT).content("猜数字").handler(startGuessNumberHandler).next()
.rule().msgType(WxConsts.XML_MSG_TEXT).rContent("\\d+").handler(checkAnswerHandler).end()
.rule().msgType(WxConsts.XML_MSG_TEXT).matcher(guessNumberHandler).handler(guessNumberHandler).end()
.rule().async(false).content("哈哈").handler(textHandler).end()
.rule().async(false).content("图片").handler(imageHandler).end()
.rule().async(false).content("oauth").handler(oauth2handler).end()


Загрузка…
Отмена
Сохранить