From 063f2aaa0c578ee54209b1ce31b0f584af583488 Mon Sep 17 00:00:00 2001 From: C. McEnroe Date: Sat, 16 Jan 2021 14:04:53 -0500 Subject: Add -I highlight option and /highlight --- catgirl.1 | 42 +++++++++++++++++++++++++++++++++++++++--- chat.c | 2 ++ command.c | 40 ++++++++++++++++++++++++++++------------ handle.c | 9 +++++---- 4 files changed, 74 insertions(+), 19 deletions(-) diff --git a/catgirl.1 b/catgirl.1 index ce3215e..a7efeb3 100644 --- a/catgirl.1 +++ b/catgirl.1 @@ -11,6 +11,7 @@ .Op Fl Relv .Op Fl C Ar copy .Op Fl H Ar hash +.Op Fl I Ar highlight .Op Fl N Ar notify .Op Fl O Ar open .Op Fl S Ar bind @@ -94,6 +95,34 @@ To use only colors from the 16-color terminal set, use 0,15. . +.It Fl I Ar pattern , Cm highlight = Ar pattern +Add a case-insensitive message highlight pattern, +which may contain +.Ql * , +.Ql \&? +and +.Ql [] +wildcards as in +.Xr sh 1 . +The format of the pattern is as follows: +.Bd -ragged -offset indent +.Ar nick Ns Oo Ar !user@host +.Oo Ar command +.Oo Ar channel +.Oo Ar message +.Oc Oc Oc Oc +.Ed +.Pp +The commands which can be filtered are: +.Sy INVITE , +.Sy JOIN , +.Sy NICK , +.Sy NOTICE , +.Sy PART , +.Sy PRIVMSG , +.Sy QUIT , +.Sy SETNAME . +. .It Fl N Ar util , Cm notify = Ar util Send notifications using a utility. Use more than once to add arguments to @@ -176,7 +205,7 @@ Connect to .Ar host . . .It Fl i Ar pattern , Cm ignore = Ar pattern -Add a case-insensitive message filtering pattern, +Add a case-insensitive message ignore pattern, which may contain .Ql * , .Ql \&? @@ -422,8 +451,13 @@ List the server help for a topic. Try .Ic /help index for a list of topics. +.It Ic /highlight Op Ar pattern +List message highlight patterns +or temporarily add a pattern. +To permanently add a pattern, use +.Fl I . .It Ic /ignore Op Ar pattern -List message filtering patterns +List message ignore patterns or temporarily add a pattern. To permanently add a pattern, use .Fl i . @@ -438,8 +472,10 @@ Open the most recent URL from .Ar nick or matching .Ar substring . +.It Ic /unhighlight Ar pattern +Temporarily remove a message highlight pattern. .It Ic /unignore Ar pattern -Temporarily remove a message filtering pattern. +Temporarily remove a message ignore pattern. .It Ic /window Ar name Switch to window by name. .It Ic /window Ar num , Ic / Ns Ar num diff --git a/chat.c b/chat.c index cdea9a0..ebffe46 100644 --- a/chat.c +++ b/chat.c @@ -199,6 +199,7 @@ int main(int argc, char *argv[]) { { .val = '!', .name = "insecure", no_argument }, { .val = 'C', .name = "copy", required_argument }, { .val = 'H', .name = "hash", required_argument }, + { .val = 'I', .name = "highlight", required_argument }, { .val = 'N', .name = "notify", required_argument }, { .val = 'O', .name = "open", required_argument }, { .val = 'R', .name = "restrict", no_argument }, @@ -234,6 +235,7 @@ int main(int argc, char *argv[]) { break; case '!': insecure = true; break; case 'C': utilPush(&urlCopyUtil, optarg); break; case 'H': parseHash(optarg); + break; case 'I': filterAdd(Hot, optarg); break; case 'N': utilPush(&uiNotifyUtil, optarg); break; case 'O': utilPush(&urlOpenUtil, optarg); break; case 'R': self.restricted = true; diff --git a/command.c b/command.c index f266878..998d9a2 100644 --- a/command.c +++ b/command.c @@ -386,20 +386,20 @@ static void commandCopy(uint id, char *params) { urlCopyMatch(id, params); } -static void commandIgnore(uint id, char *params) { +static void commandFilter(enum Heat heat, uint id, char *params) { if (params) { - struct Filter filter = filterAdd(Ice, params); + struct Filter filter = filterAdd(heat, params); uiFormat( - id, Cold, NULL, "Ignoring \3%02d%s %s %s %s", - Brown, filter.mask, + id, Cold, NULL, "%sing \3%02d%s %s %s %s", + (heat == Hot ? "Highlight" : "Ignor"), Brown, filter.mask, (filter.cmd ?: ""), (filter.chan ?: ""), (filter.mesg ?: "") ); } else { for (size_t i = 0; i < FilterCap && filters[i].mask; ++i) { - if (filters[i].heat != Ice) continue; + if (filters[i].heat != heat) continue; uiFormat( - Network, Warm, NULL, "Ignoring \3%02d%s %s %s %s", - Brown, filters[i].mask, + Network, Warm, NULL, "%sing \3%02d%s %s %s %s", + (heat == Hot ? "Highlight" : "Ignor"), Brown, filters[i].mask, (filters[i].cmd ?: ""), (filters[i].chan ?: ""), (filters[i].mesg ?: "") ); @@ -407,17 +407,31 @@ static void commandIgnore(uint id, char *params) { } } -static void commandUnignore(uint id, char *params) { +static void commandUnfilter(enum Heat heat, uint id, char *params) { if (!params) return; - struct Filter filter = filterParse(Ice, params); + struct Filter filter = filterParse(heat, params); bool found = filterRemove(filter); uiFormat( - id, Cold, NULL, "%s ignoring \3%02d%s %s %s %s", - (found ? "No longer" : "Not"), Brown, filter.mask, - (filter.cmd ?: ""), (filter.chan ?: ""), (filter.mesg ?: "") + id, Cold, NULL, "%s %sing \3%02d%s %s %s %s", + (found ? "No longer" : "Not"), (heat == Hot ? "highlight" : "ignor"), + Brown, filter.mask, (filter.cmd ?: ""), (filter.chan ?: ""), + (filter.mesg ?: "") ); } +static void commandHighlight(uint id, char *params) { + commandFilter(Hot, id, params); +} +static void commandIgnore(uint id, char *params) { + commandFilter(Ice, id, params); +} +static void commandUnhighlight(uint id, char *params) { + commandUnfilter(Hot, id, params); +} +static void commandUnignore(uint id, char *params) { + commandUnfilter(Hot, id, params); +} + static void commandExec(uint id, char *params) { execID = id; @@ -479,6 +493,7 @@ static const struct Handler { { "/except", commandExcept, 0 }, { "/exec", commandExec, Multiline | Restricted }, { "/help", commandHelp, 0 }, + { "/highlight", commandHighlight, 0 }, { "/ignore", commandIgnore, 0 }, { "/invex", commandInvex, 0 }, { "/invite", commandInvite, 0 }, @@ -506,6 +521,7 @@ static const struct Handler { { "/topic", commandTopic, 0 }, { "/unban", commandUnban, 0 }, { "/unexcept", commandUnexcept, 0 }, + { "/unhighlight", commandUnhighlight, 0 }, { "/unignore", commandUnignore, 0 }, { "/uninvex", commandUninvex, 0 }, { "/voice", commandVoice, 0 }, diff --git a/handle.c b/handle.c index 702196b..ddf43e8 100644 --- a/handle.c +++ b/handle.c @@ -1198,8 +1198,9 @@ static void handlePrivmsg(struct Message *msg) { bool notice = (msg->cmd[0] == 'N'); bool action = isAction(msg); - bool mention = !mine && isMention(msg); - enum Heat heat = filterCheck((mention || query ? Hot : Warm), id, msg); + bool highlight = !mine && isMention(msg); + enum Heat heat = filterCheck((highlight || query ? Hot : Warm), id, msg); + if (heat > Warm && !mine && !query) highlight = true; if (!notice && !mine && heat > Ice) { completeTouch(id, msg->nick, hash(msg->user)); } @@ -1222,7 +1223,7 @@ static void handlePrivmsg(struct Message *msg) { uiFormat( id, heat, tagTime(msg), "%s\35\3%d* %s\17\35\t%s%s", - (mention ? "\26" : ""), hash(msg->user), msg->nick, + (highlight ? "\26" : ""), hash(msg->user), msg->nick, buf, msg->params[1] ); } else { @@ -1231,7 +1232,7 @@ static void handlePrivmsg(struct Message *msg) { uiFormat( id, heat, tagTime(msg), "%s\3%d<%s>\17\t%s%s", - (mention ? "\26" : ""), hash(msg->user), msg->nick, + (highlight ? "\26" : ""), hash(msg->user), msg->nick, buf, msg->params[1] ); } -- cgit 1.4.1-2-gfad0