diff options
author | June McEnroe <june@causal.agency> | 2021-01-01 20:09:10 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2021-01-01 20:09:10 -0500 |
commit | 4b883177dc025db24473e62469f97631a12ad536 (patch) | |
tree | 0039251bc3093c68c44eb95fb7a1051168fe3acf /command.c | |
parent | Factor out reply count checking and decrementing (diff) | |
download | catgirl-4b883177dc025db24473e62469f97631a12ad536.tar.gz catgirl-4b883177dc025db24473e62469f97631a12ad536.zip |
Split ignore fields to avoid over-eager * matching
Split ignore fields and match each separately to avoid an early * eagerly matching across several fields. For example, "* JOIN * *" should not match messages which happen to contain the word "JOIN" followed by two other words. Ignore capacity is reduced to 64 to keep the size of the array the same. I don't think it's an issue.
Diffstat (limited to 'command.c')
-rw-r--r-- | command.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/command.c b/command.c index 43870f1..c71bebc 100644 --- a/command.c +++ b/command.c @@ -388,16 +388,19 @@ static void commandCopy(uint id, char *params) { static void commandIgnore(uint id, char *params) { if (params) { - const char *pattern = ignoreAdd(params); + struct Ignore ignore = ignoreAdd(params); uiFormat( - id, Cold, NULL, "Ignoring \3%02d%s\3", - Brown, pattern + id, Cold, NULL, "Ignoring \3%02d%s %s %s %s", + Brown, ignore.mask, + (ignore.cmd ?: ""), (ignore.chan ?: ""), (ignore.mesg ?: "") ); } else { - for (size_t i = 0; i < ignore.len; ++i) { + for (size_t i = 0; i < IgnoreCap && ignores[i].mask; ++i) { uiFormat( - Network, Warm, NULL, "Ignoring \3%02d%s\3", - Brown, ignore.patterns[i] + Network, Warm, NULL, "Ignoring \3%02d%s %s %s %s", + Brown, ignores[i].mask, + (ignores[i].cmd ?: ""), (ignores[i].chan ?: ""), + (ignores[i].mesg ?: "") ); } } @@ -405,14 +408,13 @@ static void commandIgnore(uint id, char *params) { static void commandUnignore(uint id, char *params) { if (!params) return; - if (ignoreRemove(params)) { - uiFormat( - id, Cold, NULL, "No longer ignoring \3%02d%s\3", - Brown, params - ); - } else { - uiFormat(id, Cold, NULL, "Not ignoring \3%02d%s\3", Brown, params); - } + struct Ignore ignore = ignoreParse(params); + bool found = ignoreRemove(ignore); + uiFormat( + id, Cold, NULL, "%s ignoring \3%02d%s %s %s %s", + (found ? "No longer" : "Not"), Brown, ignore.mask, + (ignore.cmd ?: ""), (ignore.chan ?: ""), (ignore.mesg ?: "") + ); } static void commandExec(uint id, char *params) { |