mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-12-02 11:24:05 +08:00
issue #77 添加自定义消息匹配器的支持
This commit is contained in:
@@ -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," }
|
||||
|
||||
Reference in New Issue
Block a user