summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--catgirl.142
-rw-r--r--chat.c2
-rw-r--r--command.c40
-rw-r--r--handle.c9
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]
);
}