mirror of
				https://github.com/ZSCNetSupportDept/WechatTicketSystem.git
				synced 2025-10-31 02:16:18 +08:00 
			
		
		
		
	wechat query command
This commit is contained in:
		| @@ -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(); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|   | ||||
| @@ -38,6 +38,10 @@ public class TestPost extends HttpServlet { | ||||
| 		for (Map.Entry<String, String[]> 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(); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
|   | ||||
| @@ -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<Ticket> queryUnsolvedByBlock(int b) { | ||||
| 		try (Session s = SQLCore.sf.openSession()) { | ||||
|   | ||||
| @@ -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
	 Sola
					Sola