diff options
author | June McEnroe <june@causal.agency> | 2020-01-10 23:22:27 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-01-10 23:27:39 -0500 |
commit | d39908ab72efde02fabd17c222cd0105ebda9a22 (patch) | |
tree | 218ee887d26ddf94da586e02b79dba0c5de6c12b | |
parent | Rename -A and -Q to -y and -q (diff) | |
download | pounce-d39908ab72efde02fabd17c222cd0105ebda9a22.tar.gz pounce-d39908ab72efde02fabd17c222cd0105ebda9a22.zip |
Add a vendor capability for passive clients
This way things like litterbox can do it automatically without having to be configured with a hyphen-prefixed username, which is usually invalid anywhere else.
Diffstat (limited to '')
-rw-r--r-- | bounce.h | 1 | ||||
-rw-r--r-- | client.c | 9 | ||||
-rw-r--r-- | pounce.1 | 13 |
3 files changed, 14 insertions, 9 deletions
diff --git a/bounce.h b/bounce.h index 497640d..5bff619 100644 --- a/bounce.h +++ b/bounce.h @@ -63,6 +63,7 @@ static inline struct Message parse(char *line) { #define ENUM_CAP \ X("account-notify", CapAccountNotify) \ X("away-notify", CapAwayNotify) \ + X("causal.agency/passive", CapPassive) \ X("chghost", CapChghost) \ X("extended-join", CapExtendedJoin) \ X("invite-notify", CapInviteNotify) \ diff --git a/client.c b/client.c index 0766ef1..a598ec0 100644 --- a/client.c +++ b/client.c @@ -46,7 +46,6 @@ struct Client { struct tls *tls; enum Need need; size_t consumer; - bool passive; enum Cap caps; char buf[1024]; size_t len; @@ -63,7 +62,7 @@ struct Client *clientAlloc(struct tls *tls) { void clientFree(struct Client *client) { if (!client->need) { - if (!client->passive && !--active) { + if (!(client->caps & CapPassive) && !--active) { serverFormat("AWAY :%s\r\n", clientAway); } } @@ -115,7 +114,7 @@ static void maybeSync(struct Client *client) { if (client->need == NeedPass) passRequired(client); if (!client->need) { stateSync(client); - if (!client->passive && !active++) { + if (!(client->caps & CapPassive) && !active++) { serverFormat("AWAY\r\n"); } } @@ -139,7 +138,7 @@ static void handleUser(struct Client *client, struct Message *msg) { } else { client->need &= ~NeedUser; client->consumer = ringConsumer(msg->params[0]); - client->passive = (msg->params[0][0] == '-'); + if (msg->params[0][0] == '-') client->caps |= CapPassive; maybeSync(client); } } @@ -161,7 +160,7 @@ static void handlePass(struct Client *client, struct Message *msg) { static void handleCap(struct Client *client, struct Message *msg) { if (!msg->params[0]) msg->params[0] = ""; - enum Cap avail = CapServerTime | (stateCaps & ~CapSASL); + enum Cap avail = CapServerTime | CapPassive | (stateCaps & ~CapSASL); if (!strcmp(msg->params[0], "END")) { if (!client->need) return; diff --git a/pounce.1 b/pounce.1 index 06ffc94..3b7f8e1 100644 --- a/pounce.1 +++ b/pounce.1 @@ -1,4 +1,4 @@ -.Dd January 7, 2020 +.Dd January 10, 2020 .Dt POUNCE 1 .Os . @@ -284,12 +284,17 @@ New clients with the same username are assumed to be reconnections and will cause previous connections to stop receiving messages. -Clients with usernames beginning with hyphen +The nickname and real name +sent by clients are ignored. +. +.Pp +Clients which request the +.Sy causal.agency/passive +capability +or with usernames beginning with hyphen .Ql - are considered passive and do not affect away status. -The nickname and real name sent by clients -are ignored. . .Pp Pass-through of the following IRCv3 capabilities |