about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-08-21 14:49:07 -0400
committerJune McEnroe <june@causal.agency>2021-08-21 14:49:07 -0400
commit0e3cdc19922c6ea0b3b63264b5362e1984e8b466 (patch)
treeb57849e5ea9390a3e308edfea78c951604d83030
parentReplace verbose colors with two types of arrows (diff)
downloadpounce-0e3cdc19922c6ea0b3b63264b5362e1984e8b466.tar.gz
pounce-0e3cdc19922c6ea0b3b63264b5362e1984e8b466.zip
Avoid overwriting manual AWAY messages
Setting an AWAY message then disconnecting will no longer replace
the AWAY message with the default one. Reconnecting continues to
always clear AWAY.
Diffstat (limited to '')
-rw-r--r--bounce.h1
-rw-r--r--client.c2
-rw-r--r--state.c13
3 files changed, 15 insertions, 1 deletions
diff --git a/bounce.h b/bounce.h
index e17f216..3951599 100644
--- a/bounce.h
+++ b/bounce.h
@@ -232,6 +232,7 @@ void clientConsume(struct Client *client);
 
 extern bool stateNoNames;
 extern enum Cap stateCaps;
+extern bool stateAway;
 void stateLogin(
 	const char *pass, enum Cap blind, const char *plain,
 	const char *nick, const char *user, const char *real
diff --git a/client.c b/client.c
index 938ab8b..ed2e0d3 100644
--- a/client.c
+++ b/client.c
@@ -76,7 +76,7 @@ static void clientHandshake(struct Client *client) {
 
 void clientFree(struct Client *client) {
 	if (!client->need) {
-		if (!(client->caps & CapPassive) && !--active) {
+		if (!(client->caps & CapPassive) && !--active && !stateAway) {
 			serverEnqueue("AWAY :%s\r\n", clientAway);
 		}
 	}
diff --git a/state.c b/state.c
index 21669c4..edc4b92 100644
--- a/state.c
+++ b/state.c
@@ -38,6 +38,7 @@
 
 bool stateNoNames;
 enum Cap stateCaps;
+bool stateAway;
 
 typedef void Handler(struct Message *msg);
 
@@ -331,6 +332,16 @@ static void handleReplyTopic(struct Message *msg) {
 	chanTopic(msg->params[1], msg->params[2]);
 }
 
+static void handleReplyUnaway(struct Message *msg) {
+	(void)msg;
+	stateAway = false;
+}
+
+static void handleReplyNowAway(struct Message *msg) {
+	(void)msg;
+	stateAway = true;
+}
+
 static void handleError(struct Message *msg) {
 	require(msg, false, 1);
 	errx(EX_UNAVAILABLE, "%s", msg->params[0]);
@@ -345,6 +356,8 @@ static const struct {
 	{ "003", handleReplyCreated },
 	{ "004", handleReplyMyInfo },
 	{ "005", handleReplyISupport },
+	{ "305", handleReplyUnaway },
+	{ "306", handleReplyNowAway },
 	{ "332", handleReplyTopic },
 	{ "375", handleReplyMOTDStart },
 	{ "422", handleReplyMOTDStart },