@@ -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," } | |||