From cb8757d8bf3005ea70d2601aa0f43ac7a2b1df4d Mon Sep 17 00:00:00 2001 From: Sola Date: Sun, 27 Dec 2015 14:42:32 +0800 Subject: [PATCH 01/16] update to 1.4-snapshot --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1999353..bb143ff 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ WechatTicketSystem love.sola.netsupport WechatTicketSystem - 1.3 + 1.4-SNAPSHOT war From 98a4e30c3706126f246aba278d5d79871550365f Mon Sep 17 00:00:00 2001 From: Sola Date: Sun, 27 Dec 2015 18:17:26 +0800 Subject: [PATCH 02/16] reverse audit query order --- src/main/java/love/sola/netsupport/api/stuff/TicketLog.java | 2 +- src/main/java/love/sola/netsupport/sql/TableTicket.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/love/sola/netsupport/api/stuff/TicketLog.java b/src/main/java/love/sola/netsupport/api/stuff/TicketLog.java index 8cac701..53d5b2f 100644 --- a/src/main/java/love/sola/netsupport/api/stuff/TicketLog.java +++ b/src/main/java/love/sola/netsupport/api/stuff/TicketLog.java @@ -76,7 +76,7 @@ public class TicketLog extends HttpServlet { AuditReader reader = TableTicket.getAuditReader(s); Object obj = reader.createQuery() .forRevisionsOfEntity(Ticket.class, false, true) - .addOrder(AuditEntity.revisionNumber().asc()) + .addOrder(AuditEntity.revisionNumber().desc()) .add(AuditEntity.revisionProperty("timestamp").between(start.getTime(), end.getTime())) .setFirstResult(first) .setMaxResults(limit) diff --git a/src/main/java/love/sola/netsupport/sql/TableTicket.java b/src/main/java/love/sola/netsupport/sql/TableTicket.java index 12eb39b..0eccfa1 100644 --- a/src/main/java/love/sola/netsupport/sql/TableTicket.java +++ b/src/main/java/love/sola/netsupport/sql/TableTicket.java @@ -92,7 +92,7 @@ public class TableTicket extends SQLCore { AuditReader reader = getAuditReader(s); return reader.createQuery() .forRevisionsOfEntity(Ticket.class, false, true) - .addOrder(AuditEntity.revisionNumber().asc()) + .addOrder(AuditEntity.revisionNumber().desc()) .add(AuditEntity.id().eq(tid)) .getResultList() ; From d45cbebd156e8ddfda942c19c7aafbaa994c176c Mon Sep 17 00:00:00 2001 From: Sola Date: Sun, 27 Dec 2015 22:37:52 +0800 Subject: [PATCH 03/16] correct blocks limit --- src/main/java/love/sola/netsupport/enums/Block.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/love/sola/netsupport/enums/Block.java b/src/main/java/love/sola/netsupport/enums/Block.java index a881d8b..8e72008 100644 --- a/src/main/java/love/sola/netsupport/enums/Block.java +++ b/src/main/java/love/sola/netsupport/enums/Block.java @@ -67,7 +67,7 @@ public class Block { AVAILABLE[BM_7] = new int[]{100, 216, 317, 417, 517, 617, 717}; AVAILABLE[BM_8] = new int[]{100, 221, 321, 421, 521, 621, 721}; AVAILABLE[BM_9] = new int[]{100, 221, 321, 421, 521, 621}; - AVAILABLE[BM_10] = new int[]{111, 239, 339, 439, 558, 658, 758, 858}; + AVAILABLE[BM_10] = new int[]{100, 239, 354, 454, 564, 664, 764, 864}; AVAILABLE[BM_11] = new int[]{100, 213, 321, 421, 521, 621, 721, 821}; AVAILABLE[DM_12] = new int[]{119, 221, 321, 421, 521, 621, 720}; AVAILABLE[DM_13] = new int[]{120, 222, 322, 422, 522, 622, 722}; From b28364f160da6d24ad49cc683c9bbe79e8b1aab5 Mon Sep 17 00:00:00 2001 From: Sola Date: Mon, 28 Dec 2015 01:16:58 +0800 Subject: [PATCH 04/16] add operator info --- .../netsupport/api/stuff/TicketLookup.java | 4 ++ .../love/sola/netsupport/wechat/Command.java | 3 ++ .../sola/netsupport/wechat/WxMpServlet.java | 2 - .../handler/{ => admin}/LoginHandler.java | 2 +- .../handler/admin/OperatorInfoHandler.java | 46 +++++++++++++++++++ .../handler/{ => admin}/SignHandler.java | 2 +- src/main/resources/lang.yml | 10 ++++ 7 files changed, 65 insertions(+), 4 deletions(-) rename src/main/java/love/sola/netsupport/wechat/handler/{ => admin}/LoginHandler.java (97%) create mode 100644 src/main/java/love/sola/netsupport/wechat/handler/admin/OperatorInfoHandler.java rename src/main/java/love/sola/netsupport/wechat/handler/{ => admin}/SignHandler.java (98%) diff --git a/src/main/java/love/sola/netsupport/api/stuff/TicketLookup.java b/src/main/java/love/sola/netsupport/api/stuff/TicketLookup.java index 7465df1..5c39694 100644 --- a/src/main/java/love/sola/netsupport/api/stuff/TicketLookup.java +++ b/src/main/java/love/sola/netsupport/api/stuff/TicketLookup.java @@ -2,6 +2,7 @@ package love.sola.netsupport.api.stuff; import com.google.gson.Gson; import love.sola.netsupport.api.Response; +import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.Operator; import love.sola.netsupport.pojo.Ticket; @@ -60,6 +61,9 @@ public class TicketLookup extends HttpServlet { } else { block = op.getBlock(); } + if (block == 0 && op.getAccess() > Access.LEADER) { + return new Response(Response.ResponseCode.PERMISSION_DENIED); + } List list = TableTicket.unsolvedByBlock(block); return new Response(Response.ResponseCode.OK, list); } catch (NumberFormatException e) { diff --git a/src/main/java/love/sola/netsupport/wechat/Command.java b/src/main/java/love/sola/netsupport/wechat/Command.java index d3ff4a9..6787759 100644 --- a/src/main/java/love/sola/netsupport/wechat/Command.java +++ b/src/main/java/love/sola/netsupport/wechat/Command.java @@ -1,6 +1,8 @@ package love.sola.netsupport.wechat; import love.sola.netsupport.wechat.handler.*; +import love.sola.netsupport.wechat.handler.admin.LoginHandler; +import love.sola.netsupport.wechat.handler.admin.OperatorInfoHandler; import me.chanjar.weixin.mp.api.WxMpMessageHandler; import java.util.HashMap; @@ -22,6 +24,7 @@ public enum Command { CANCEL(3, CancelHandler.class), PROFILE(4, ProfileHandler.class), LOGIN(10, LoginHandler.class), + OPERATOR_INFO(11, OperatorInfoHandler.class), ; private static final Map ID_MAP = new HashMap<>(); diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index b9507a0..2d96f70 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -2,7 +2,6 @@ package love.sola.netsupport.wechat; import love.sola.netsupport.config.Settings; import love.sola.netsupport.wechat.handler.RegisterHandler; -import love.sola.netsupport.wechat.handler.SignHandler; import love.sola.netsupport.wechat.handler.SubscribeHandler; import love.sola.netsupport.wechat.matcher.CheckSpamMatcher; import love.sola.netsupport.wechat.matcher.RegisterMatcher; @@ -81,7 +80,6 @@ public class WxMpServlet extends HttpServlet { } catch (IllegalAccessException | InstantiationException e) { throw new ServletException(e); } - wxMpMessageRouter.rule().async(false).msgType("text").rContent("(?i)^Auth \\d{4}").handler(new SignHandler()).end(); } public static void registerCommands(WxMpMessageRouter router) throws IllegalAccessException, InstantiationException { diff --git a/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/admin/LoginHandler.java similarity index 97% rename from src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java rename to src/main/java/love/sola/netsupport/wechat/handler/admin/LoginHandler.java index c82507e..667981c 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/LoginHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/admin/LoginHandler.java @@ -1,4 +1,4 @@ -package love.sola.netsupport.wechat.handler; +package love.sola.netsupport.wechat.handler.admin; import love.sola.netsupport.enums.Access; import love.sola.netsupport.enums.Attribute; diff --git a/src/main/java/love/sola/netsupport/wechat/handler/admin/OperatorInfoHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/admin/OperatorInfoHandler.java new file mode 100644 index 0000000..a713e59 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/handler/admin/OperatorInfoHandler.java @@ -0,0 +1,46 @@ +package love.sola.netsupport.wechat.handler.admin; + +import love.sola.netsupport.enums.Access; +import love.sola.netsupport.pojo.Operator; +import love.sola.netsupport.sql.TableOperator; +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.outxmlbuilder.TextBuilder; + +import java.util.Map; + +import static love.sola.netsupport.config.Lang.format; +import static love.sola.netsupport.config.Lang.lang; + +/** + * *********************************************** + * Created by Sola on 2015/12/28. + * Don't modify this source without my agreement + * *********************************************** + */ +public class OperatorInfoHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + TextBuilder out = WxMpXmlOutMessage.TEXT().fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName()); + try { + Operator op = TableOperator.get(wxMessage.getFromUserName()); + if (op == null) + out.content(lang("Not_Operator")); + else if (op.getAccess() == Access.NOLOGIN) { + out.content(lang("No_Login")); + } else { + out.content(format("Operator_Info", op.getId(), op.getName(), op.getAccess(), op.getBlock(), op.getWeek())); + } + } catch (Exception e) { + e.printStackTrace(); + out.content(lang("Login_Error")); + } + return out.build(); + } + +} diff --git a/src/main/java/love/sola/netsupport/wechat/handler/SignHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/admin/SignHandler.java similarity index 98% rename from src/main/java/love/sola/netsupport/wechat/handler/SignHandler.java rename to src/main/java/love/sola/netsupport/wechat/handler/admin/SignHandler.java index a11a94b..47e8a8e 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/SignHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/admin/SignHandler.java @@ -1,4 +1,4 @@ -package love.sola.netsupport.wechat.handler; +package love.sola.netsupport.wechat.handler.admin; import love.sola.netsupport.sql.SQLCore; import me.chanjar.weixin.common.exception.WxErrorException; diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index 158dea9..7f5961a 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -10,6 +10,7 @@ REGEX_SUBMIT: '^(?i)(Submit)|(报修)|(保修)|(bx)$' REGEX_CANCEL: '^(?i)(Cancel)|(取消)|(撤销)|(qx)|(cx)$' REGEX_LOGIN: '^(?i)Authme$' REGEX_PROFILE: '^(?i)(EditProfile)|(修改资料)|(修改信息)|(xgzl)|(xgxx)$' +REGEX_OPERATOR_INFO: '^(?i)(OpInfo)|(网维资料)|(wwzl)$' #Misc Invalid_Operation: 'Whoops,报修姬找不到你想要的东西啦 (╯‵□′)╯︵┻━┻。' @@ -45,7 +46,16 @@ Profile_Modify: '> 点此修改资料 <' Not_Operator: '嘟嘟嘟……' No_Login: 'Permission Denied.' Internal_Error: '啊哦,登录失败了哦。' +#Operator_Info +Operator_Info: | + 网维成员资料: + 网维ID: {0,number,#} + 姓名: {1} + 岗位: {2,choice,0#Administrator >ω<|3#值班组长|6#正式成员|7#实习成员} + 值班片区: {3,choice,0#全图 >ω<|1#岐头片区|2#北门片区|3#东门片区|4#香灰片区|5#凤翔片区} + 值班日: {4,choice,0#2月30日 >ω<|1#周一|2#周二|3#周三|4#周四|5#周五|6#周六|7#周日} + 若以上信息有误,请及时联系@15-排污-沙子森。 #URL User_Register_Link: 'http://topaz.sinaapp.com/nm/v1/reg.html?token={0}' User_Query_Link: 'http://topaz.sinaapp.com/nm/v1/list.html?token={0}' From 3e4ce1611dd4328b49dd1e882e8d7f9463388ca0 Mon Sep 17 00:00:00 2001 From: Sola Date: Mon, 28 Dec 2015 01:41:42 +0800 Subject: [PATCH 05/16] fix incorrect pattern --- src/main/resources/lang.yml | 6 +++--- .../java/love/sola/netsupport/wechat/TestMessageFormat.java | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index 7f5961a..6eed633 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -51,9 +51,9 @@ Operator_Info: | 网维成员资料: 网维ID: {0,number,#} 姓名: {1} - 岗位: {2,choice,0#Administrator >ω<|3#值班组长|6#正式成员|7#实习成员} - 值班片区: {3,choice,0#全图 >ω<|1#岐头片区|2#北门片区|3#东门片区|4#香灰片区|5#凤翔片区} - 值班日: {4,choice,0#2月30日 >ω<|1#周一|2#周二|3#周三|4#周四|5#周五|6#周六|7#周日} + 岗位: {2,choice,0#'Administrator >ω<'|3#值班组长|6#正式成员|7#实习成员|} + 值班片区: {3,choice,0#'全图 >ω<'|1#岐头片区|2#北门片区|3#东门片区|4#香灰片区|5#凤翔片区} + 值班日: {4,choice,0#'2月30日 >ω<'|1#周一|2#周二|3#周三|4#周四|5#周五|6#周六|7#周日} 若以上信息有误,请及时联系@15-排污-沙子森。 #URL diff --git a/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java b/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java index 49636f3..95360f7 100644 --- a/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java +++ b/src/test/java/love/sola/netsupport/wechat/TestMessageFormat.java @@ -40,4 +40,9 @@ public class TestMessageFormat { assert "15838838438".equals(MessageFormat.format("{0,number,#}", 15838838438L)); } + @Test + public void testOpInfo() { + assert !Lang.format("Operator_Info", 1541, "Sola", 0, 0, 4).isEmpty(); + } + } From 4c837b36ae3befab8e3ddc193db062376fdd71cf Mon Sep 17 00:00:00 2001 From: Sola Date: Mon, 28 Dec 2015 10:14:56 +0800 Subject: [PATCH 06/16] correct block data DM_10 --- src/main/java/love/sola/netsupport/enums/Block.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/love/sola/netsupport/enums/Block.java b/src/main/java/love/sola/netsupport/enums/Block.java index 8e72008..51f6702 100644 --- a/src/main/java/love/sola/netsupport/enums/Block.java +++ b/src/main/java/love/sola/netsupport/enums/Block.java @@ -67,7 +67,7 @@ public class Block { AVAILABLE[BM_7] = new int[]{100, 216, 317, 417, 517, 617, 717}; AVAILABLE[BM_8] = new int[]{100, 221, 321, 421, 521, 621, 721}; AVAILABLE[BM_9] = new int[]{100, 221, 321, 421, 521, 621}; - AVAILABLE[BM_10] = new int[]{100, 239, 354, 454, 564, 664, 764, 864}; + AVAILABLE[BM_10] = new int[]{111, 239, 354, 454, 564, 664, 764, 864}; AVAILABLE[BM_11] = new int[]{100, 213, 321, 421, 521, 621, 721, 821}; AVAILABLE[DM_12] = new int[]{119, 221, 321, 421, 521, 621, 720}; AVAILABLE[DM_13] = new int[]{120, 222, 322, 422, 522, 622, 722}; From 83ef97609d06663360039e371cf44e24e96419d4 Mon Sep 17 00:00:00 2001 From: Sola Date: Tue, 29 Dec 2015 12:10:57 +0800 Subject: [PATCH 07/16] cortana ready --- .../love/sola/netsupport/config/Cortana.java | 33 +++++++++++++++++++ .../wechat/handler/AutoReplyHandler.java | 26 +++++++++++++++ src/main/resources/cortana.yml | 0 3 files changed, 59 insertions(+) create mode 100644 src/main/java/love/sola/netsupport/config/Cortana.java create mode 100644 src/main/java/love/sola/netsupport/wechat/handler/AutoReplyHandler.java create mode 100644 src/main/resources/cortana.yml diff --git a/src/main/java/love/sola/netsupport/config/Cortana.java b/src/main/java/love/sola/netsupport/config/Cortana.java new file mode 100644 index 0000000..2947715 --- /dev/null +++ b/src/main/java/love/sola/netsupport/config/Cortana.java @@ -0,0 +1,33 @@ +package love.sola.netsupport.config; + +import org.yaml.snakeyaml.Yaml; + +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +/** + * *********************************************** + * Created by Sola on 2015/12/29. + * Don't modify this source without my agreement + * *********************************************** + */ +public class Cortana { + + + public static List entries; + + public static void load() { + InputStream in = Lang.class.getClassLoader().getResourceAsStream("cortana.yml"); + Map root = (Map) new Yaml().load(in); + + } + + + public static class Compiled { + Pattern[] patterns; + String[] replies; + } + +} diff --git a/src/main/java/love/sola/netsupport/wechat/handler/AutoReplyHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/AutoReplyHandler.java new file mode 100644 index 0000000..f147997 --- /dev/null +++ b/src/main/java/love/sola/netsupport/wechat/handler/AutoReplyHandler.java @@ -0,0 +1,26 @@ +package love.sola.netsupport.wechat.handler; + +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 java.util.Map; + +/** + * *********************************************** + * Created by Sola on 2015/12/29. + * Don't modify this source without my agreement + * *********************************************** + */ +public class AutoReplyHandler implements WxMpMessageHandler { + + @Override + public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { + //TODO auto reply + return null; + } + +} diff --git a/src/main/resources/cortana.yml b/src/main/resources/cortana.yml new file mode 100644 index 0000000..e69de29 From 461bdf2c2799f60339a31befab0d25743468fe81 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 01:32:31 +0800 Subject: [PATCH 08/16] async message ready --- .../sola/netsupport/api/user/Register.java | 34 +++++++++++++++++++ .../sola/netsupport/wechat/WxMpServlet.java | 34 +++++++++---------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/main/java/love/sola/netsupport/api/user/Register.java b/src/main/java/love/sola/netsupport/api/user/Register.java index 42db0b0..4d62ecf 100644 --- a/src/main/java/love/sola/netsupport/api/user/Register.java +++ b/src/main/java/love/sola/netsupport/api/user/Register.java @@ -10,7 +10,10 @@ import love.sola.netsupport.sql.TableUser; import love.sola.netsupport.util.Checker; import love.sola.netsupport.util.ParseUtil; import love.sola.netsupport.wechat.Command; +import love.sola.netsupport.wechat.WxMpServlet; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSession; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import org.hibernate.exception.ConstraintViolationException; import javax.servlet.ServletException; @@ -20,6 +23,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import static love.sola.netsupport.util.Checker.*; @@ -101,6 +108,8 @@ public class Register extends HttpServlet { String dupKey = e.getConstraintName(); return "Duplicated_" + dupKey.toUpperCase(); // PHONE ACCOUNT WECHAT } + // FIXME: 2015/12/30 Temporary converter + converter(user); return "Register_Success"; } @@ -110,4 +119,29 @@ public class Register extends HttpServlet { return; } + private void converter(User u) { + try (Connection conn = SQLCore.ds.getConnection()) { + PreparedStatement ps = conn.prepareStatement("SELECT wechat FROM `convert` WHERE id=?"); + ps.setLong(1, u.getId()); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + String old = rs.getString(1); + ps = conn.prepareStatement("UPDATE `convert` SET wechat=? WHERE wechat=?"); + ps.setString(1, u.getWechatId()); + ps.setString(2, old); + if (ps.executeUpdate() == 1) { + WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); + return; + } + } + } catch (SQLException | WxErrorException e) { + e.printStackTrace(); + } + try { + WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换失败").build()); + } catch (WxErrorException e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index 2d96f70..cf3bb2e 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -30,7 +30,7 @@ public class WxMpServlet extends HttpServlet { public static WxMpServlet instance; protected WxMpInMemoryConfigStorage config; - protected WxMpService wxMpService; + public WxMpService wxMpService; protected WxMpMessageRouter wxMpMessageRouter; protected CheckSpamMatcher checkSpamMatcher; @@ -58,7 +58,7 @@ public class WxMpServlet extends HttpServlet { .msgType("event") .event("subscribe") .handler(new SubscribeHandler()) - .end(); + .next(); wxMpMessageRouter.rule() .async(false) .msgType("text") @@ -70,8 +70,7 @@ public class WxMpServlet extends HttpServlet { .content(lang("Message_Spam")).build()) .end(); wxMpMessageRouter.rule() - .async(false) - .msgType("text") + .async(true) .matcher(new RegisterMatcher()) .handler(new RegisterHandler()) .end(); @@ -86,6 +85,7 @@ public class WxMpServlet extends HttpServlet { for (Command c : Command.values()) { WxMpMessageHandler handler = c.handler.newInstance(); router.rule().async(false).msgType("text").rContent(c.regex).handler(handler).end(); + router.rule().async(false).msgType("event").event("CLICK").eventKey(c.name()).handler(handler).end(); } } @@ -115,19 +115,19 @@ public class WxMpServlet extends HttpServlet { String encryptType = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type"); - if ("raw".equals(encryptType)) { - WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); - WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); - if (outMessage == null) { - outMessage = WxMpXmlOutMessage.TEXT() - .fromUser(inMessage.getToUserName()) - .toUser(inMessage.getFromUserName()) - .content(lang("Invalid_Operation")) - .build(); - } - response.getWriter().write(outMessage.toXml()); - return; - } +// if ("raw".equals(encryptType)) { +// WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); +// WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage); +// if (outMessage == null) { +// outMessage = WxMpXmlOutMessage.TEXT() +// .fromUser(inMessage.getToUserName()) +// .toUser(inMessage.getFromUserName()) +// .content(lang("Invalid_Operation")) +// .build(); +// } +// response.getWriter().write(outMessage.toXml()); +// return; +// } if ("aes".equals(encryptType)) { String msgSignature = request.getParameter("msg_signature"); From 86c045aff28f16f09fb455c229027ff69c82e91e Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 01:37:24 +0800 Subject: [PATCH 09/16] fix unregistered matcher --- .../wechat/matcher/RegisterMatcher.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) 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 6895fbe..eef8974 100644 --- a/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java +++ b/src/main/java/love/sola/netsupport/wechat/matcher/RegisterMatcher.java @@ -1,13 +1,9 @@ package love.sola.netsupport.wechat.matcher; -import love.sola.netsupport.pojo.User; 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. @@ -16,18 +12,9 @@ import java.util.Set; */ public class RegisterMatcher implements WxMpMessageMatcher { - public static Set registered = new HashSet<>(); - @Override public boolean match(WxMpXmlMessage message) { - String fromUser = message.getFromUserName(); - if (registered.contains(fromUser)) { - return false; - } else { - User u = TableUser.getByWechat(fromUser); - if (u != null) registered.add(u.getWechatId()); - return u == null; - } + return TableUser.getByWechat(message.getFromUserName()) == null; } } From ab590431afd740bedbc9f140a57e2cb895d2cad2 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 01:44:00 +0800 Subject: [PATCH 10/16] try to fix router rule --- src/main/java/love/sola/netsupport/wechat/WxMpServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index cf3bb2e..332d558 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -70,7 +70,8 @@ public class WxMpServlet extends HttpServlet { .content(lang("Message_Spam")).build()) .end(); wxMpMessageRouter.rule() - .async(true) + .async(false) + .msgType("text") .matcher(new RegisterMatcher()) .handler(new RegisterHandler()) .end(); From 247da5ad83f900184373078976a27c2fa36a003b Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 01:54:34 +0800 Subject: [PATCH 11/16] correct converter --- src/main/java/love/sola/netsupport/api/user/Register.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/love/sola/netsupport/api/user/Register.java b/src/main/java/love/sola/netsupport/api/user/Register.java index 4d62ecf..ccf7b51 100644 --- a/src/main/java/love/sola/netsupport/api/user/Register.java +++ b/src/main/java/love/sola/netsupport/api/user/Register.java @@ -126,7 +126,7 @@ public class Register extends HttpServlet { ResultSet rs = ps.executeQuery(); if (rs.next()) { String old = rs.getString(1); - ps = conn.prepareStatement("UPDATE `convert` SET wechat=? WHERE wechat=?"); + ps = conn.prepareStatement("UPDATE `operators` SET wechat=? WHERE wechat=?"); ps.setString(1, u.getWechatId()); ps.setString(2, old); if (ps.executeUpdate() == 1) { From 9746f0d4b6707c5bdc7fb6d865b5b172436f9f32 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 11:36:39 +0800 Subject: [PATCH 12/16] custom menu attempt --- .../java/love/sola/netsupport/wechat/WxMpServlet.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index 332d558..40931cb 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -5,6 +5,7 @@ import love.sola.netsupport.wechat.handler.RegisterHandler; import love.sola.netsupport.wechat.handler.SubscribeHandler; import love.sola.netsupport.wechat.matcher.CheckSpamMatcher; import love.sola.netsupport.wechat.matcher.RegisterMatcher; +import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.util.StringUtils; import me.chanjar.weixin.mp.api.*; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; @@ -55,13 +56,12 @@ public class WxMpServlet extends HttpServlet { wxMpMessageRouter = new WxMpMessageRouter(wxMpService); wxMpMessageRouter.rule() .async(false) - .msgType("event") - .event("subscribe") + .msgType(WxConsts.XML_MSG_EVENT) + .event(WxConsts.EVT_SUBSCRIBE) .handler(new SubscribeHandler()) .next(); wxMpMessageRouter.rule() .async(false) - .msgType("text") .matcher(new CheckSpamMatcher()) .handler((wxMessage, context, wxMpService1, sessionManager) -> WxMpXmlOutMessage.TEXT() @@ -71,7 +71,6 @@ public class WxMpServlet extends HttpServlet { .end(); wxMpMessageRouter.rule() .async(false) - .msgType("text") .matcher(new RegisterMatcher()) .handler(new RegisterHandler()) .end(); @@ -85,8 +84,8 @@ public class WxMpServlet extends HttpServlet { public static void registerCommands(WxMpMessageRouter router) throws IllegalAccessException, InstantiationException { for (Command c : Command.values()) { WxMpMessageHandler handler = c.handler.newInstance(); - router.rule().async(false).msgType("text").rContent(c.regex).handler(handler).end(); - router.rule().async(false).msgType("event").event("CLICK").eventKey(c.name()).handler(handler).end(); + router.rule().async(false).msgType(WxConsts.XML_MSG_TEXT).rContent(c.regex).handler(handler).end(); + router.rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_CLICK).eventKey(c.name()).handler(handler).end(); } } From 890c001832ee9e3431b0730aa3efe45e816ade03 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 11:55:13 +0800 Subject: [PATCH 13/16] custom menu attempt success --- src/main/resources/menu.json | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/resources/menu.json diff --git a/src/main/resources/menu.json b/src/main/resources/menu.json new file mode 100644 index 0000000..697b62a --- /dev/null +++ b/src/main/resources/menu.json @@ -0,0 +1,29 @@ +{ + "button": [ + { + "name": "我要", + "sub_button": [ + { + "type": "click", + "name": "提交报修", + "key": "SUBMIT" + }, + { + "type": "click", + "name": "查询报修", + "key": "QUERY" + }, + { + "type": "click", + "name": "撤销报修", + "key": "CANCEL" + }, + { + "type": "click", + "name": "修改资料", + "key": "PROFILE" + } + ] + } + ] +} \ No newline at end of file From 78831e5c7a8d05f28cadb42a23511c3612d00507 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 14:49:18 +0800 Subject: [PATCH 14/16] add group manage --- .../java/love/sola/netsupport/api/user/Register.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/love/sola/netsupport/api/user/Register.java b/src/main/java/love/sola/netsupport/api/user/Register.java index ccf7b51..245ea5b 100644 --- a/src/main/java/love/sola/netsupport/api/user/Register.java +++ b/src/main/java/love/sola/netsupport/api/user/Register.java @@ -129,10 +129,11 @@ public class Register extends HttpServlet { ps = conn.prepareStatement("UPDATE `operators` SET wechat=? WHERE wechat=?"); ps.setString(1, u.getWechatId()); ps.setString(2, old); - if (ps.executeUpdate() == 1) { - WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); - return; - } + ps.executeUpdate(); + WxMpServlet.instance.wxMpService + .userUpdateGroup(u.getWechatId(), 100L); + WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); + return; } } catch (SQLException | WxErrorException e) { e.printStackTrace(); From a804b79e6fe5a4b897732f1a7b8c983bdfd53a48 Mon Sep 17 00:00:00 2001 From: Sola Date: Thu, 31 Dec 2015 21:26:24 +0800 Subject: [PATCH 15/16] general users should not receive failed messages --- .../sola/netsupport/api/user/Register.java | 2 + src/main/resources/menu-op.json | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/resources/menu-op.json diff --git a/src/main/java/love/sola/netsupport/api/user/Register.java b/src/main/java/love/sola/netsupport/api/user/Register.java index 245ea5b..41193bb 100644 --- a/src/main/java/love/sola/netsupport/api/user/Register.java +++ b/src/main/java/love/sola/netsupport/api/user/Register.java @@ -134,6 +134,8 @@ public class Register extends HttpServlet { .userUpdateGroup(u.getWechatId(), 100L); WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); return; + } else { + return; } } catch (SQLException | WxErrorException e) { e.printStackTrace(); diff --git a/src/main/resources/menu-op.json b/src/main/resources/menu-op.json new file mode 100644 index 0000000..42ea9e3 --- /dev/null +++ b/src/main/resources/menu-op.json @@ -0,0 +1,47 @@ +{ + "button": [ + { + "name": "我要", + "sub_button": [ + { + "type": "click", + "name": "提交报修", + "key": "SUBMIT" + }, + { + "type": "click", + "name": "查询报修", + "key": "QUERY" + }, + { + "type": "click", + "name": "撤销报修", + "key": "CANCEL" + }, + { + "type": "click", + "name": "修改资料", + "key": "PROFILE" + } + ] + }, + { + "name": "OP", + "sub_button": [ + { + "type": "click", + "name": "网维资料", + "key": "OPERATOR_INFO" + }, + { + "type": "click", + "name": "后台登录", + "key": "LOGIN" + } + ] + } + ], + "matchrule": { + "group_id": "100", + } +} \ No newline at end of file From ea9e78936da60dea3b024f8d67aa27b449f9d199 Mon Sep 17 00:00:00 2001 From: Sola Date: Sun, 3 Jan 2016 12:25:56 +0800 Subject: [PATCH 16/16] improve operator converting --- .../sola/netsupport/api/user/Register.java | 51 ++++++++++++------- .../sola/netsupport/wechat/WxMpServlet.java | 2 +- .../wechat/handler/SubscribeHandler.java | 3 ++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/love/sola/netsupport/api/user/Register.java b/src/main/java/love/sola/netsupport/api/user/Register.java index 41193bb..37f4529 100644 --- a/src/main/java/love/sola/netsupport/api/user/Register.java +++ b/src/main/java/love/sola/netsupport/api/user/Register.java @@ -109,7 +109,7 @@ public class Register extends HttpServlet { return "Duplicated_" + dupKey.toUpperCase(); // PHONE ACCOUNT WECHAT } // FIXME: 2015/12/30 Temporary converter - converter(user); + converterWithRetry(user); return "Register_Success"; } @@ -119,27 +119,17 @@ public class Register extends HttpServlet { return; } - private void converter(User u) { - try (Connection conn = SQLCore.ds.getConnection()) { - PreparedStatement ps = conn.prepareStatement("SELECT wechat FROM `convert` WHERE id=?"); - ps.setLong(1, u.getId()); - ResultSet rs = ps.executeQuery(); - if (rs.next()) { - String old = rs.getString(1); - ps = conn.prepareStatement("UPDATE `operators` SET wechat=? WHERE wechat=?"); - ps.setString(1, u.getWechatId()); - ps.setString(2, old); - ps.executeUpdate(); - WxMpServlet.instance.wxMpService - .userUpdateGroup(u.getWechatId(), 100L); - WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); - return; - } else { + public static void converterWithRetry(User u) { + Throwable last = null; + for (int i = 0; i < 3; i++) { + try { + converter(u); return; + } catch (WxErrorException | SQLException e) { + last = e; } - } catch (SQLException | WxErrorException e) { - e.printStackTrace(); } + last.printStackTrace(); try { WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换失败").build()); } catch (WxErrorException e) { @@ -147,4 +137,27 @@ public class Register extends HttpServlet { } } + public static void converter(User u) throws WxErrorException, SQLException { + try (Connection conn = SQLCore.ds.getConnection()) { + PreparedStatement ps = conn.prepareStatement("SELECT wechat FROM `convert` WHERE id=?"); + ps.setLong(1, u.getId()); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + WxMpServlet.instance.wxMpService + .userUpdateGroup(u.getWechatId(), 100L); + String old = rs.getString(1); + ps = conn.prepareStatement("UPDATE `operators` SET wechat=? WHERE wechat=?"); + ps.setString(1, u.getWechatId()); + ps.setString(2, old); + if (ps.executeUpdate() == 1) { + WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("数据转换成功").build()); + } else { + WxMpServlet.instance.wxMpService.customMessageSend(WxMpCustomMessage.TEXT().toUser(u.getWechatId()).content("已进行过数据转换").build()); + } + } + } catch (SQLException | WxErrorException e) { + throw e; + } + } + } diff --git a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java index 40931cb..83ee37f 100644 --- a/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java +++ b/src/main/java/love/sola/netsupport/wechat/WxMpServlet.java @@ -59,7 +59,7 @@ public class WxMpServlet extends HttpServlet { .msgType(WxConsts.XML_MSG_EVENT) .event(WxConsts.EVT_SUBSCRIBE) .handler(new SubscribeHandler()) - .next(); + .end(); wxMpMessageRouter.rule() .async(false) .matcher(new CheckSpamMatcher()) diff --git a/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java b/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java index 1c50439..f40dff2 100644 --- a/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java +++ b/src/main/java/love/sola/netsupport/wechat/handler/SubscribeHandler.java @@ -1,5 +1,6 @@ package love.sola.netsupport.wechat.handler; +import love.sola.netsupport.api.user.Register; import love.sola.netsupport.enums.Attribute; import love.sola.netsupport.pojo.User; import love.sola.netsupport.sql.TableUser; @@ -38,6 +39,7 @@ public class SubscribeHandler implements WxMpMessageHandler { session.setAttribute(Attribute.WECHAT, fromUser); session.setAttribute(Attribute.USER, u); out.content(format("Event_Subscribe", format("Already_Registered", format("User_Profile_Link", id, u.getName(), u.getIsp().id, u.getNetAccount(), u.getBlock(), u.getRoom(), u.getPhone())))); + Register.converterWithRetry(u); } else { session.setAttribute(Attribute.AUTHORIZED, Command.REGISTER); session.setAttribute(Attribute.WECHAT, fromUser); @@ -45,4 +47,5 @@ public class SubscribeHandler implements WxMpMessageHandler { } return out.build(); } + }