wechat query command

This commit is contained in:
Sola
2015-12-08 23:10:22 +08:00
parent b0ba46cc77
commit 2a062e4008
10 changed files with 161 additions and 46 deletions

View File

@@ -5,8 +5,6 @@ import lombok.AllArgsConstructor;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static love.sola.netsupport.config.Lang.lang;
/** /**
* *********************************************** * ***********************************************
* Created by Sola on 2015/11/5. * Created by Sola on 2015/11/5.
@@ -26,7 +24,7 @@ public class Response {
public Response(ResponseCode code, Object result) { public Response(ResponseCode code, Object result) {
this.code = code.id; this.code = code.id;
this.info = code.info; this.info = code.name();
this.result = result; this.result = result;
} }
@@ -54,11 +52,9 @@ public class Response {
} }
} }
public final String info;
public final int id; public final int id;
ResponseCode(int id) { ResponseCode(int id) {
this.info = lang("RC_" + name());
this.id = id; this.id = id;
} }
@@ -68,7 +64,7 @@ public class Response {
@Override @Override
public String toString() { public String toString() {
return info; return name();
} }
} }

View File

@@ -38,6 +38,10 @@ public class TestPost extends HttpServlet {
for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) { for (Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
out.println(entry.getKey() + ": " + Arrays.toString(entry.getValue())); 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(); out.close();
} }

View File

@@ -1,6 +1,7 @@
package love.sola.netsupport.sql; package love.sola.netsupport.sql;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources; import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@@ -8,6 +9,7 @@ import org.hibernate.service.ServiceRegistry;
import javax.naming.InitialContext; import javax.naming.InitialContext;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.text.DateFormat;
/** /**
* *********************************************** * ***********************************************
@@ -18,7 +20,7 @@ import javax.sql.DataSource;
public class SQLCore { public class SQLCore {
public static DataSource ds; 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 SessionFactory sf;
public static ServiceRegistry sr; public static ServiceRegistry sr;

View File

@@ -4,6 +4,7 @@ import love.sola.netsupport.enums.Status;
import love.sola.netsupport.pojo.Ticket; import love.sola.netsupport.pojo.Ticket;
import love.sola.netsupport.pojo.User; import love.sola.netsupport.pojo.User;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import java.util.List; 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") @SuppressWarnings("unchecked")
public static List<Ticket> queryUnsolvedByBlock(int b) { public static List<Ticket> queryUnsolvedByBlock(int b) {
try (Session s = SQLCore.sf.openSession()) { try (Session s = SQLCore.sf.openSession()) {

View File

@@ -1,5 +1,9 @@
package love.sola.netsupport.wechat; 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.HashMap;
import java.util.Map; import java.util.Map;
@@ -13,9 +17,9 @@ import static love.sola.netsupport.config.Lang.lang;
*/ */
public enum Command { public enum Command {
REGISTER(0, ".*"), REGISTER(0, RegisterHandler.class),
QUERY(1, "Query"), QUERY(1, QueryHandler.class),
SUBMIT(1, "Submit"), SUBMIT(2, null),
; ;
private static final Map<Integer, Command> ID_MAP = new HashMap<>(); private static final Map<Integer, Command> ID_MAP = new HashMap<>();
@@ -30,12 +34,14 @@ public enum Command {
public final String name; public final String name;
public final String regex; public final String regex;
public final Class<? extends WxMpMessageHandler> handler;
public final int id; public final int id;
Command(int id, String regex) { Command(int id, Class<? extends WxMpMessageHandler> handler) {
this.name = lang("CMD_" + name()); this.name = lang("CMD_" + name());
this.id = id; this.id = id;
this.regex = regex; this.regex = lang("REGEX_" + name());
this.handler = handler;
} }
public static Command fromId(int id) { public static Command fromId(int id) {

View File

@@ -1,13 +1,15 @@
package love.sola.netsupport.wechat; package love.sola.netsupport.wechat;
import love.sola.netsupport.config.Settings; 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.handler.RegisterHandler;
import love.sola.netsupport.wechat.intercepter.CheckSpamInterceptor; import love.sola.netsupport.wechat.matcher.CheckSpamMatcher;
import love.sola.netsupport.wechat.matcher.RegisterMatcher; 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.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.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; 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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import static love.sola.netsupport.config.Lang.lang; import static love.sola.netsupport.config.Lang.lang;
@@ -34,7 +35,7 @@ public class WxMpServlet extends HttpServlet {
protected WxMpInMemoryConfigStorage config; protected WxMpInMemoryConfigStorage config;
protected WxMpService wxMpService; protected WxMpService wxMpService;
protected WxMpMessageRouter wxMpMessageRouter; protected WxMpMessageRouter wxMpMessageRouter;
protected CheckSpamInterceptor checkSpamInterceptor; protected CheckSpamMatcher checkSpamMatcher;
public WxMpServlet() { public WxMpServlet() {
instance = this; instance = this;
@@ -53,28 +54,39 @@ public class WxMpServlet extends HttpServlet {
wxMpService = new WxMpServiceImpl(); wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(config); wxMpService.setWxMpConfigStorage(config);
checkSpamInterceptor = new CheckSpamInterceptor(); checkSpamMatcher = new CheckSpamMatcher();
wxMpMessageRouter = new WxMpMessageRouter(wxMpService); 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() wxMpMessageRouter.rule()
.async(false) .async(false)
.msgType("text") .msgType("text")
.matcher(new RegisterMatcher()) .matcher(new RegisterMatcher())
.handler(new RegisterHandler()) .handler(new RegisterHandler())
.interceptor(checkSpamInterceptor)
.end(); .end();
wxMpMessageRouter.rule() wxMpMessageRouter.rule()
.async(false) .async(false)
.msgType("event") .msgType("text")
.event("subscribe") .rContent(Command.QUERY.regex)
.handler(new WxMpMessageHandler() { .handler(new QueryHandler())
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
return WxMpXmlOutMessage.TEXT()
.fromUser(wxMessage.getToUserName())
.toUser(wxMessage.getFromUserName())
.content(lang("Event_Subscribe")).build();
}
})
.end(); .end();
} }

View File

@@ -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<String, Object> 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
}
}

View File

@@ -1,6 +1,8 @@
package love.sola.netsupport.wechat.handler; package love.sola.netsupport.wechat.handler;
import love.sola.netsupport.api.Authorize; 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 love.sola.netsupport.wechat.Command;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.common.session.WxSessionManager;
@@ -13,6 +15,7 @@ import me.chanjar.weixin.mp.bean.outxmlbuilder.TextBuilder;
import java.util.Map; import java.util.Map;
import static love.sola.netsupport.config.Lang.format; 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<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager)
throws WxErrorException { throws WxErrorException {
TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName());
out.content(format("User_Register_Link", wxMessage.getFromUserName())); String fromUser = wxMessage.getFromUserName();
Authorize.fetchedTime.put(wxMessage.getFromUserName(), System.currentTimeMillis()); User u = TableUser.getUserByWechat(fromUser);
Authorize.fetchedCommand.put(wxMessage.getFromUserName(), Command.REGISTER); 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(); return out.build();
} }

View File

@@ -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.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import love.sola.netsupport.config.Settings; import love.sola.netsupport.config.Settings;
import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpMessageMatcher;
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.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
@@ -19,7 +15,7 @@ import java.util.concurrent.TimeUnit;
* Don't modify this source without my agreement * Don't modify this source without my agreement
* *********************************************** * ***********************************************
*/ */
public class CheckSpamInterceptor implements WxMpMessageInterceptor { public class CheckSpamMatcher implements WxMpMessageMatcher {
private class ValueLoader extends CacheLoader<String, Long> { private class ValueLoader extends CacheLoader<String, Long> {
@Override @Override
@@ -36,13 +32,13 @@ public class CheckSpamInterceptor implements WxMpMessageInterceptor {
.build(new ValueLoader()); .build(new ValueLoader());
@Override @Override
public boolean intercept(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { public boolean match(WxMpXmlMessage wxMessage) {
Long l = cache.getIfPresent(wxMessage.getFromUserName()); Long l = cache.getIfPresent(wxMessage.getFromUserName());
if (l != null && l > System.currentTimeMillis()) { if (l != null && l > System.currentTimeMillis()) {
return false; return true;
} }
cache.refresh(wxMessage.getFromUserName()); cache.refresh(wxMessage.getFromUserName());
return true; return false;
} }
} }

View File

@@ -5,6 +5,9 @@ import love.sola.netsupport.sql.TableUser;
import me.chanjar.weixin.mp.api.WxMpMessageMatcher; import me.chanjar.weixin.mp.api.WxMpMessageMatcher;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
import java.util.HashSet;
import java.util.Set;
/** /**
* *********************************************** * ***********************************************
* Created by Sola on 2015/11/26. * Created by Sola on 2015/11/26.
@@ -13,11 +16,18 @@ import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
*/ */
public class RegisterMatcher implements WxMpMessageMatcher { public class RegisterMatcher implements WxMpMessageMatcher {
public static Set<String> registered = new HashSet<>();
@Override @Override
public boolean match(WxMpXmlMessage message) { public boolean match(WxMpXmlMessage message) {
String fromUser = message.getFromUserName(); String fromUser = message.getFromUserName();
User u = TableUser.getUserByWechat(fromUser); if (registered.contains(fromUser)) {
return u == null; return false;
} else {
User u = TableUser.getUserByWechat(fromUser);
if (u != null) registered.add(u.getWechatId());
return u == null;
}
} }
} }