From 2a062e4008e45236de9aaf069a0465d61197cc49 Mon Sep 17 00:00:00 2001 From: Sola Date: Tue, 8 Dec 2015 23:10:22 +0800 Subject: [PATCH] wechat query command --- .../love/sola/netsupport/api/Response.java | 8 +-- .../sola/netsupport/api/test/TestPost.java | 4 ++ .../love/sola/netsupport/sql/SQLCore.java | 4 +- .../love/sola/netsupport/sql/TableTicket.java | 10 +++ .../love/sola/netsupport/wechat/Command.java | 16 +++-- .../sola/netsupport/wechat/WxMpServlet.java | 50 ++++++++----- .../wechat/handler/QueryHandler.java | 70 +++++++++++++++++++ .../wechat/handler/RegisterHandler.java | 15 +++- .../CheckSpamMatcher.java} | 16 ++--- .../wechat/matcher/RegisterMatcher.java | 14 +++- 10 files changed, 161 insertions(+), 46 deletions(-) create mode 100644 src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java rename src/main/java/love/sola/netsupport/wechat/{intercepter/CheckSpamInterceptor.java => matcher/CheckSpamMatcher.java} (66%) diff --git a/src/main/java/love/sola/netsupport/api/Response.java b/src/main/java/love/sola/netsupport/api/Response.java index 40867c7..c9f8bd2 100644 --- a/src/main/java/love/sola/netsupport/api/Response.java +++ b/src/main/java/love/sola/netsupport/api/Response.java @@ -5,8 +5,6 @@ import lombok.AllArgsConstructor; import java.util.HashMap; import java.util.Map; -import static love.sola.netsupport.config.Lang.lang; - /** * *********************************************** * Created by Sola on 2015/11/5. @@ -26,7 +24,7 @@ public class Response { public Response(ResponseCode code, Object result) { this.code = code.id; - this.info = code.info; + this.info = code.name(); this.result = result; } @@ -54,11 +52,9 @@ public class Response { } } - public final String info; public final int id; ResponseCode(int id) { - this.info = lang("RC_" + name()); this.id = id; } @@ -68,7 +64,7 @@ public class Response { @Override public String toString() { - return info; + return name(); } } diff --git a/src/main/java/love/sola/netsupport/api/test/TestPost.java b/src/main/java/love/sola/netsupport/api/test/TestPost.java index 4ace00b..c9a06e6 100644 --- a/src/main/java/love/sola/netsupport/api/test/TestPost.java +++ b/src/main/java/love/sola/netsupport/api/test/TestPost.java @@ -38,6 +38,10 @@ public class TestPost extends HttpServlet { for (Map.Entry entry : request.getParameterMap().entrySet()) { out.println(entry.getKey() + ": " + Arrays.toString(entry.getValue())); } + Integer i = (Integer) request.getSession().getAttribute("ReqCount"); + i = i == null ? 0 : i; + request.getSession().setAttribute("ReqCount", i + 1); + out.println("ReqCount = " + i); out.close(); } diff --git a/src/main/java/love/sola/netsupport/sql/SQLCore.java b/src/main/java/love/sola/netsupport/sql/SQLCore.java index 2b018b2..a566f27 100644 --- a/src/main/java/love/sola/netsupport/sql/SQLCore.java +++ b/src/main/java/love/sola/netsupport/sql/SQLCore.java @@ -1,6 +1,7 @@ package love.sola.netsupport.sql; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import org.hibernate.SessionFactory; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; @@ -8,6 +9,7 @@ import org.hibernate.service.ServiceRegistry; import javax.naming.InitialContext; import javax.sql.DataSource; +import java.text.DateFormat; /** * *********************************************** @@ -18,7 +20,7 @@ import javax.sql.DataSource; public class SQLCore { public static DataSource ds; - public static Gson gson = new Gson(); + public static Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG, DateFormat.LONG).create(); public static SessionFactory sf; public static ServiceRegistry sr; diff --git a/src/main/java/love/sola/netsupport/sql/TableTicket.java b/src/main/java/love/sola/netsupport/sql/TableTicket.java index 40c0132..1e98e02 100644 --- a/src/main/java/love/sola/netsupport/sql/TableTicket.java +++ b/src/main/java/love/sola/netsupport/sql/TableTicket.java @@ -4,6 +4,7 @@ import love.sola.netsupport.enums.Status; import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.User; import org.hibernate.Session; +import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import java.util.List; @@ -35,6 +36,15 @@ public class TableTicket extends SQLCore { } } + public static Ticket queryLast(User u) { + try (Session s = SQLCore.sf.openSession()) { + return (Ticket) s.createCriteria(Ticket.class) + .addOrder(Order.desc(Ticket.PROPERTY_SUBMIT_TIME)) + .add(Restrictions.eq(Ticket.PROPERTY_USER, u)) + .uniqueResult(); + } + } + @SuppressWarnings("unchecked") public static List queryUnsolvedByBlock(int b) { try (Session s = SQLCore.sf.openSession()) { diff --git a/src/main/java/love/sola/netsupport/wechat/Command.java b/src/main/java/love/sola/netsupport/wechat/Command.java index 68c05f4..26d07a2 100644 --- a/src/main/java/love/sola/netsupport/wechat/Command.java +++ b/src/main/java/love/sola/netsupport/wechat/Command.java @@ -1,5 +1,9 @@ package love.sola.netsupport.wechat; +import love.sola.netsupport.wechat.handler.QueryHandler; +import love.sola.netsupport.wechat.handler.RegisterHandler; +import me.chanjar.weixin.mp.api.WxMpMessageHandler; + import java.util.HashMap; import java.util.Map; @@ -13,9 +17,9 @@ import static love.sola.netsupport.config.Lang.lang; */ public enum Command { - REGISTER(0, ".*"), - QUERY(1, "Query"), - SUBMIT(1, "Submit"), + REGISTER(0, RegisterHandler.class), + QUERY(1, QueryHandler.class), + SUBMIT(2, null), ; private static final Map ID_MAP = new HashMap<>(); @@ -30,12 +34,14 @@ public enum Command { public final String name; public final String regex; + public final Class handler; public final int id; - Command(int id, String regex) { + Command(int id, Class handler) { this.name = lang("CMD_" + name()); this.id = id; - this.regex = regex; + this.regex = lang("REGEX_" + name()); + this.handler = handler; } public static Command fromId(int id) { diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index e4819ea..5ad7842 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -1,13 +1,15 @@ package love.sola.netsupport.wechat; import love.sola.netsupport.config.Settings; +import love.sola.netsupport.wechat.handler.QueryHandler; import love.sola.netsupport.wechat.handler.RegisterHandler; -import love.sola.netsupport.wechat.intercepter.CheckSpamInterceptor; +import love.sola.netsupport.wechat.matcher.CheckSpamMatcher; import love.sola.netsupport.wechat.matcher.RegisterMatcher; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.util.StringUtils; -import me.chanjar.weixin.mp.api.*; +import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.api.WxMpMessageRouter; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpServiceImpl; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; @@ -17,7 +19,6 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Map; import static love.sola.netsupport.config.Lang.lang; @@ -34,7 +35,7 @@ public class WxMpServlet extends HttpServlet { protected WxMpInMemoryConfigStorage config; protected WxMpService wxMpService; protected WxMpMessageRouter wxMpMessageRouter; - protected CheckSpamInterceptor checkSpamInterceptor; + protected CheckSpamMatcher checkSpamMatcher; public WxMpServlet() { instance = this; @@ -53,28 +54,39 @@ public class WxMpServlet extends HttpServlet { wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(config); - checkSpamInterceptor = new CheckSpamInterceptor(); + checkSpamMatcher = new CheckSpamMatcher(); wxMpMessageRouter = new WxMpMessageRouter(wxMpService); + wxMpMessageRouter.rule() + .async(false) + .msgType("event") + .event("subscribe") + .handler((wxMessage, context, wxMpService1, sessionManager) + -> WxMpXmlOutMessage.TEXT() + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()) + .content(lang("Event_Subscribe")).build()) + .end(); + wxMpMessageRouter.rule() + .async(false) + .msgType("text") + .matcher(new CheckSpamMatcher()) + .handler((wxMessage, context, wxMpService1, sessionManager) + -> WxMpXmlOutMessage.TEXT() + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()) + .content(lang("Message_Spam")).build()) + .end(); wxMpMessageRouter.rule() .async(false) .msgType("text") .matcher(new RegisterMatcher()) .handler(new RegisterHandler()) - .interceptor(checkSpamInterceptor) .end(); wxMpMessageRouter.rule() .async(false) - .msgType("event") - .event("subscribe") - .handler(new WxMpMessageHandler() { - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { - return WxMpXmlOutMessage.TEXT() - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()) - .content(lang("Event_Subscribe")).build(); - } - }) + .msgType("text") + .rContent(Command.QUERY.regex) + .handler(new QueryHandler()) .end(); } diff --git a/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java new file mode 100644 index 0000000..3ec2903 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/handler/QueryHandler.java @@ -0,0 +1,70 @@ +package love.sola.netsupport.wechat.handler; + +import love.sola.netsupport.api.Authorize; +import love.sola.netsupport.pojo.Ticket; +import love.sola.netsupport.pojo.User; +import love.sola.netsupport.sql.TableTicket; +import love.sola.netsupport.sql.TableUser; +import love.sola.netsupport.wechat.Command; +import me.chanjar.weixin.common.exception.WxErrorException; +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.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.WxMpXmlOutNewsMessage; +import me.chanjar.weixin.mp.bean.outxmlbuilder.NewsBuilder; + +import java.text.SimpleDateFormat; +import java.util.Map; + +import static love.sola.netsupport.config.Lang.lang; + +/** + * *********************************************** + * Created by Sola on 2015/12/8. + * Don't modify this source without my agreement + * *********************************************** + */ +public class QueryHandler implements WxMpMessageHandler { + + public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm EEE"); + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + User u = TableUser.getUserByWechat(wxMessage.getFromUserName()); + Ticket t = TableTicket.queryLast(u); + if (t == null) { + return WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()) + .content(lang("No_Ticket_Available")).build(); + } + + NewsBuilder out = WxMpXmlOutMessage.NEWS().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); + WxMpXmlOutNewsMessage.Item item = new WxMpXmlOutNewsMessage.Item(); + item.setTitle(lang("Query_Title")); + StringBuilder sb = new StringBuilder() + .append("Ticket ID: ").append(t.getId()).append("\n") + .append("Desc: ").append(t.getDescription()).append("\n") + .append("Submit Time: ").append(dateFormat.format(t.getSubmitTime())).append("\n"); + if (t.getUpdateTime() != null) { + sb.append("Latest Update: ").append(dateFormat.format(t.getUpdateTime())).append("\n"); + sb.append("Remark: ").append(t.getRemark()).append("\n"); + sb.append("Operator: ").append(t.getOperator().getId()).append("\n"); + } + sb.append("Ticket Status: ").append(t.getStatus()); + + item.setDescription(sb.toString()); + out.addArticle(item); + out.addArticle(more_details); + Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); + Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.QUERY); + return out.build(); + } + + public static WxMpXmlOutNewsMessage.Item more_details = new WxMpXmlOutNewsMessage.Item(); + static { + more_details.setTitle("For more details, please click >"); + more_details.setUrl("www.baidu.com"); // TODO: 2015/12/8 FOR TEST ONLY + } + +} diff --git a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java index 7712135..ed2a3f6 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/RegisterHandler.java @@ -1,6 +1,8 @@ package love.sola.netsupport.wechat.handler; import love.sola.netsupport.api.Authorize; +import love.sola.netsupport.pojo.User; +import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.wechat.Command; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; @@ -13,6 +15,7 @@ import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder; import java.util.Map; import static love.sola.netsupport.config.Lang.format; +import static love.sola.netsupport.config.Lang.lang; /** * *********************************************** @@ -26,9 +29,15 @@ public class RegisterHandler implements WxMpMessageHandler { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); - out.content(format("User_Register_Link", wxMessage.getFromUserName())); - Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); - Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.REGISTER); + String fromUser = wxMessage.getFromUserName(); + User u = TableUser.getUserByWechat(fromUser); + if (u != null) { + out.content(lang("Already_Registered")); + } else { + out.content(format("User_Register_Link", wxMessage.getFromUserName())); + Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); + Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.REGISTER); + } return out.build(); } diff --git a/src/main/java/love/sola/netsupport/wechat/intercepter/CheckSpamInterceptor.java b/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java similarity index 66% rename from src/main/java/love/sola/netsupport/wechat/intercepter/CheckSpamInterceptor.java rename to src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java index d53b50b..00363c3 100644 --- a/src/main/java/love/sola/netsupport/wechat/intercepter/CheckSpamInterceptor.java +++ b/src/main/java/love/sola/netsupport/wechat/matcher/CheckSpamMatcher.java @@ -1,16 +1,12 @@ -package love.sola.netsupport.wechat.intercepter; +package love.sola.netsupport.wechat.matcher; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import love.sola.netsupport.config.Settings; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpMessageInterceptor; -import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpMessageMatcher; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; -import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -19,7 +15,7 @@ import java.util.concurrent.TimeUnit; * Don't modify this source without my agreement * *********************************************** */ -public class CheckSpamInterceptor implements WxMpMessageInterceptor { +public class CheckSpamMatcher implements WxMpMessageMatcher { private class ValueLoader extends CacheLoader { @Override @@ -36,13 +32,13 @@ public class CheckSpamInterceptor implements WxMpMessageInterceptor { .build(new ValueLoader()); @Override - public boolean intercept(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + public boolean match(WxMpXmlMessage wxMessage) { Long l = cache.getIfPresent(wxMessage.getFromUserName()); if (l != null && l > System.currentTimeMillis()) { - return false; + return true; } cache.refresh(wxMessage.getFromUserName()); - return true; + return false; } } diff --git a/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java b/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java index 8e2bffd..014446b 100644 --- a/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java +++ b/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java @@ -5,6 +5,9 @@ import love.sola.netsupport.sql.TableUser; import me.chanjar.weixin.mp.api.WxMpMessageMatcher; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; +import java.util.HashSet; +import java.util.Set; + /** * *********************************************** * Created by Sola on 2015/11/26. @@ -13,11 +16,18 @@ import me.chanjar.weixin.mp.bean.WxMpXmlMessage; */ public class RegisterMatcher implements WxMpMessageMatcher { + public static Set registered = new HashSet<>(); + @Override public boolean match(WxMpXmlMessage message) { String fromUser = message.getFromUserName(); - User u = TableUser.getUserByWechat(fromUser); - return u == null; + if (registered.contains(fromUser)) { + return false; + } else { + User u = TableUser.getUserByWechat(fromUser); + if (u != null) registered.add(u.getWechatId()); + return u == null; + } } }