| @@ -0,0 +1,17 @@ | |||
| package me.chanjar.weixin.cp.api; | |||
| import me.chanjar.weixin.cp.bean.WxCpXmlMessage; | |||
| /** | |||
| * 消息匹配器,用在消息路由的时候 | |||
| */ | |||
| public interface WxCpMessageMatcher { | |||
| /** | |||
| * 消息是否匹配某种模式 | |||
| * @param message | |||
| * @return | |||
| */ | |||
| public boolean match(WxCpXmlMessage message); | |||
| } | |||
| @@ -228,6 +228,8 @@ public class WxCpMessageRouter { | |||
| private String rContent; | |||
| private WxCpMessageMatcher matcher; | |||
| private boolean reEnter = false; | |||
| private Integer agentId; | |||
| @@ -320,6 +322,16 @@ public class WxCpMessageRouter { | |||
| return this; | |||
| } | |||
| /** | |||
| * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 | |||
| * @param matcher | |||
| * @return | |||
| */ | |||
| public Rule matcher(WxCpMessageMatcher matcher) { | |||
| this.matcher = matcher; | |||
| return this; | |||
| } | |||
| /** | |||
| * 设置微信消息拦截器 | |||
| * @param interceptor | |||
| @@ -403,6 +415,8 @@ public class WxCpMessageRouter { | |||
| (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) | |||
| && | |||
| (this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) | |||
| && | |||
| (this.matcher == null || this.matcher.match(wxMessage)) | |||
| ; | |||
| } | |||
| @@ -42,6 +42,12 @@ public class WxCpMessageRouterTest { | |||
| .rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() | |||
| .rule().async(async).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end() | |||
| .rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).end() | |||
| .rule().async(async).matcher(new WxCpMessageMatcher() { | |||
| @Override | |||
| public boolean match(WxCpXmlMessage message) { | |||
| return "strangeformat".equals(message.getFormat()); | |||
| } | |||
| }).handler(new WxEchoCpMessageHandler(sb, "matcher")).end() | |||
| .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end(); | |||
| ; | |||
| } | |||
| @@ -92,6 +98,7 @@ public class WxCpMessageRouterTest { | |||
| Thread.sleep(1000l * 2); | |||
| } | |||
| @DataProvider(name="messages-1") | |||
| public Object[][] messages2() { | |||
| WxCpXmlMessage message1 = new WxCpXmlMessage(); | |||
| @@ -109,9 +116,12 @@ public class WxCpMessageRouterTest { | |||
| WxCpXmlMessage message5 = new WxCpXmlMessage(); | |||
| message5.setContent("BLA"); | |||
| WxCpXmlMessage message6 = new WxCpXmlMessage(); | |||
| WxCpXmlMessage message6 = new WxCpXmlMessage(); | |||
| message6.setContent("abcd"); | |||
| WxCpXmlMessage message7 = new WxCpXmlMessage(); | |||
| message7.setFormat("strangeformat"); | |||
| WxCpXmlMessage c2 = new WxCpXmlMessage(); | |||
| c2.setMsgType(WxConsts.XML_MSG_TEXT); | |||
| c2.setEvent(WxConsts.EVT_CLICK); | |||
| @@ -126,7 +136,8 @@ public class WxCpMessageRouterTest { | |||
| c4.setEvent(WxConsts.EVT_CLICK); | |||
| c4.setEventKey("KEY_1"); | |||
| c4.setContent("CONTENT_1"); | |||
| return new Object[][] { | |||
| new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, | |||
| new Object[] { message2, WxConsts.EVT_CLICK + "," }, | |||
| @@ -134,6 +145,7 @@ public class WxCpMessageRouterTest { | |||
| new Object[] { message4, "CONTENT_1," }, | |||
| new Object[] { message5, "ALL," }, | |||
| new Object[] { message6, "abcd," }, | |||
| new Object[] { message7, "matcher," }, | |||
| new Object[] { c2, "COMBINE_2," }, | |||
| new Object[] { c3, "COMBINE_3," }, | |||
| new Object[] { c4, "COMBINE_4," } | |||
| @@ -290,7 +302,6 @@ public class WxCpMessageRouterTest { | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,17 @@ | |||
| package me.chanjar.weixin.mp.api; | |||
| import me.chanjar.weixin.mp.bean.WxMpXmlMessage; | |||
| /** | |||
| * 消息匹配器,用在消息路由的时候 | |||
| */ | |||
| public interface WxMpMessageMatcher { | |||
| /** | |||
| * 消息是否匹配某种模式 | |||
| * @param message | |||
| * @return | |||
| */ | |||
| public boolean match(WxMpXmlMessage message); | |||
| } | |||
| @@ -225,7 +225,9 @@ public class WxMpMessageRouter { | |||
| private String content; | |||
| private String rContent; | |||
| private WxMpMessageMatcher matcher; | |||
| private boolean reEnter = false; | |||
| private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>(); | |||
| @@ -306,6 +308,16 @@ public class WxMpMessageRouter { | |||
| return this; | |||
| } | |||
| /** | |||
| * 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候 | |||
| * @param matcher | |||
| * @return | |||
| */ | |||
| public Rule matcher(WxMpMessageMatcher matcher) { | |||
| this.matcher = matcher; | |||
| return this; | |||
| } | |||
| /** | |||
| * 设置微信消息拦截器 | |||
| * @param interceptor | |||
| @@ -387,6 +399,8 @@ public class WxMpMessageRouter { | |||
| (this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) | |||
| && | |||
| (this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim())) | |||
| && | |||
| (this.matcher == null || this.matcher.match(wxMessage)) | |||
| ; | |||
| } | |||
| @@ -42,6 +42,12 @@ public class WxMpMessageRouterTest { | |||
| .rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end() | |||
| .rule().async(async).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end() | |||
| .rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).end() | |||
| .rule().async(async).matcher(new WxMpMessageMatcher() { | |||
| @Override | |||
| public boolean match(WxMpXmlMessage message) { | |||
| return "strangeformat".equals(message.getFormat()); | |||
| } | |||
| }).handler(new WxEchoMpMessageHandler(sb, "matcher")).end() | |||
| .rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end(); | |||
| ; | |||
| } | |||
| @@ -109,9 +115,12 @@ public class WxMpMessageRouterTest { | |||
| WxMpXmlMessage message5 = new WxMpXmlMessage(); | |||
| message5.setContent("BLA"); | |||
| WxMpXmlMessage message6 = new WxMpXmlMessage(); | |||
| WxMpXmlMessage message6 = new WxMpXmlMessage(); | |||
| message6.setContent("abcd"); | |||
| WxMpXmlMessage message7 = new WxMpXmlMessage(); | |||
| message7.setFormat("strangeformat"); | |||
| WxMpXmlMessage c2 = new WxMpXmlMessage(); | |||
| c2.setMsgType(WxConsts.XML_MSG_TEXT); | |||
| c2.setEvent(WxConsts.EVT_CLICK); | |||
| @@ -134,6 +143,7 @@ public class WxMpMessageRouterTest { | |||
| new Object[] { message4, "CONTENT_1," }, | |||
| new Object[] { message5, "ALL," }, | |||
| new Object[] { message6, "abcd," }, | |||
| new Object[] { message7, "matcher," }, | |||
| new Object[] { c2, "COMBINE_2," }, | |||
| new Object[] { c3, "COMBINE_3," }, | |||
| new Object[] { c4, "COMBINE_4," } | |||