about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2018-08-13 14:37:37 -0400
committerJune McEnroe <june@causal.agency>2018-08-13 14:37:37 -0400
commit372b79b59e961f07699b6c9a1d03ae7ca1c11ea3 (patch)
tree944ece448e14b6c32262285f5e91e8da1aee3712
parentAdd /query, /part and /close (diff)
downloadcatgirl-372b79b59e961f07699b6c9a1d03ae7ca1c11ea3.tar.gz
catgirl-372b79b59e961f07699b6c9a1d03ae7ca1c11ea3.zip
Detect pings anywhere in message
Diffstat (limited to '')
-rw-r--r--handle.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/handle.c b/handle.c
index 80ed1b4..22a4723 100644
--- a/handle.c
+++ b/handle.c
@@ -14,6 +14,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <ctype.h>
 #include <err.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -86,6 +87,20 @@ static bool isSelf(const char *nick, const char *user) {
 	return false;
 }
 
+static bool isPing(const char *mesg) {
+	size_t len = strlen(self.nick);
+	const char *match = mesg;
+	while (NULL != (match = strcasestr(match, self.nick))) {
+		char b = (match > mesg ? *(match - 1) : ' ');
+		char a = (match[len] ? match[len] : ' ');
+		match = &match[len];
+		if (!isspace(b) && !ispunct(b)) continue;
+		if (!isspace(a) && !ispunct(a)) continue;
+		return true;
+	}
+	return false;
+}
+
 typedef void (*Handler)(char *prefix, char *params);
 
 static void handlePing(char *prefix, char *params) {
@@ -292,13 +307,12 @@ static void handlePrivmsg(char *prefix, char *params) {
 	}
 	if (!isSelf(nick, user)) tabTouch(tag, nick);
 	urlScan(tag, mesg);
-	bool ping = !strncasecmp(mesg, self.nick, strlen(self.nick));
 	bool self = isSelf(nick, user);
+	bool ping = isPing(mesg);
 	uiFmt(
 		tag, "%c\3%d%c%s%c\17 %s",
 		ping["\17\26"], color(user), self["<("], nick, self[">)"], mesg
 	);
-	// TODO: always be beeping.
 }
 
 static void handleNotice(char *prefix, char *params) {