Permalink
Browse files

watch module: Don't handle multiple matching patterns for each target

Keep track of the targets which have already been notified of a matching
message, and do not notify them again if other patterns in the same
message match also. For example, consider the following match patterns:

  1) <*watch> /msg *watch ADD *!*@* *highlight *%nick%*
  2) <*watch> /msg *watch ADD *!*@* *highlight *testuser*
  3) <*watch> /msg *watch ADD *!*@* *testhilights *test*

If %nick% ist something like "testuser123", all of the these patterns
match the following message:

  <otheruser> hey testuser123, look at this: ...

Without this patch, the watch module would generate two notify messages
for target *highlight, and one notify message for target *testhilights.
This is unneccessary because patterns 1 and 2 will result in
generating the same notify message twice for target *highlight.

By using a std::set, the implementation in this patch keeps track of
which targets have already been notified and does not notify them more
than once.
  • Loading branch information...
1 parent 8f6b597 commit 84fae4ce9719129c6b4a948ab29b15de1dc57ea6 @rohieb rohieb committed Jun 27, 2012
Showing with 7 additions and 1 deletion.
  1. +7 −1 modules/watch.cpp
View
@@ -10,8 +10,10 @@
#include <znc/User.h>
#include <znc/IRCNetwork.h>
#include <list>
+#include <set>
using std::list;
+using std::set;
class CWatchSource {
public:
@@ -286,15 +288,19 @@ class CWatcherMod : public CModule {
private:
void Process(const CNick& Nick, const CString& sMessage, const CString& sSource) {
+ set<CString> sHandledTargets;
+
for (list<CWatchEntry>::iterator it = m_lsWatchers.begin(); it != m_lsWatchers.end(); ++it) {
CWatchEntry& WatchEntry = *it;
- if (WatchEntry.IsMatch(Nick, sMessage, sSource, m_pNetwork)) {
+ if (WatchEntry.IsMatch(Nick, sMessage, sSource, m_pNetwork) &&
+ sHandledTargets.count(WatchEntry.GetTarget()) < 1) {
if (m_pNetwork->IsUserAttached()) {
m_pNetwork->PutUser(":" + WatchEntry.GetTarget() + "!watch@znc.in PRIVMSG " + m_pNetwork->GetCurNick() + " :" + sMessage);
} else {
m_Buffer.AddLine(":" + _NAMEDFMT(WatchEntry.GetTarget()) + "!watch@znc.in PRIVMSG {target} :{text}", sMessage);
}
+ sHandledTargets.insert(WatchEntry.GetTarget());
}
}
}

0 comments on commit 84fae4c

Please sign in to comment.