mirror of
https://github.com/ZSCNetSupportDept/WechatTicketSystem.git
synced 2026-02-11 12:49:31 +08:00
wechat query command
This commit is contained in:
@@ -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<Integer, Command> ID_MAP = new HashMap<>();
|
||||
@@ -30,12 +34,14 @@ public enum Command {
|
||||
|
||||
public final String name;
|
||||
public final String regex;
|
||||
public final Class<? extends WxMpMessageHandler> handler;
|
||||
public final int id;
|
||||
|
||||
Command(int id, String regex) {
|
||||
Command(int id, Class<? extends WxMpMessageHandler> 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) {
|
||||
|
||||
@@ -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<String, Object> 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<String, Object> 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<String, Long> {
|
||||
@Override
|
||||
@@ -36,13 +32,13 @@ public class CheckSpamInterceptor implements WxMpMessageInterceptor {
|
||||
.build(new ValueLoader());
|
||||
|
||||
@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());
|
||||
if (l != null && l > System.currentTimeMillis()) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
cache.refresh(wxMessage.getFromUserName());
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<String> 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user