summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--catgirl.17
-rw-r--r--chat.h2
-rw-r--r--handle.c18
3 files changed, 26 insertions, 1 deletions
diff --git a/catgirl.1 b/catgirl.1
index 138b982..ad820ac 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -560,6 +560,13 @@ join = #ascii.town
.Re
.It
.Rs
+.%A Christine Dodrill
+.%T IRCv3.2 chghost Extension
+.%I IRCv3 Working Group
+.%U https://ircv3.net/specs/extensions/chghost-3.2
+.Re
+.It
+.Rs
.%A Daniel Oaks
.%T IRC Formatting
.%I ircdocs
diff --git a/chat.h b/chat.h
index 91d175f..468d864 100644
--- a/chat.h
+++ b/chat.h
@@ -97,6 +97,7 @@ extern struct Network {
#define ENUM_CAP \
X("causal.agency/consumer", CapConsumer) \
+ X("chghost", CapChghost) \
X("extended-join", CapExtendedJoin) \
X("invite-notify", CapInviteNotify) \
X("multi-prefix", CapMultiPrefix) \
@@ -119,6 +120,7 @@ extern struct Self {
char *join;
char *nick;
char *user;
+ char *host;
enum Color color;
char *quit;
} self;
diff --git a/handle.c b/handle.c
index fa3f36b..f079c00 100644
--- a/handle.c
+++ b/handle.c
@@ -280,10 +280,13 @@ static void handleJoin(struct Message *msg) {
require(msg, true, 1);
uint id = idFor(msg->params[0]);
if (!strcmp(msg->nick, self.nick)) {
- if (!self.user) {
+ if (!self.user || strcmp(self.user, msg->user)) {
set(&self.user, msg->user);
self.color = hash(msg->user);
}
+ if (!self.host || strcmp(self.host, msg->host)) {
+ set(&self.host, msg->host);
+ }
idColors[id] = hash(msg->params[0]);
completeTouch(None, msg->params[0], idColors[id]);
if (replies.join) {
@@ -306,6 +309,18 @@ static void handleJoin(struct Message *msg) {
);
}
+static void handleChghost(struct Message *msg) {
+ require(msg, true, 2);
+ if (strcmp(msg->nick, self.nick)) return;
+ if (!self.user || strcmp(self.user, msg->params[0])) {
+ set(&self.user, msg->params[0]);
+ self.color = hash(msg->params[0]);
+ }
+ if (!self.host || strcmp(self.host, msg->params[1])) {
+ set(&self.host, msg->params[1]);
+ }
+}
+
static void handlePart(struct Message *msg) {
require(msg, true, 1);
uint id = idFor(msg->params[0]);
@@ -1076,6 +1091,7 @@ static const struct Handler {
{ "906", handleErrorSASLFail },
{ "AUTHENTICATE", handleAuthenticate },
{ "CAP", handleCap },
+ { "CHGHOST", handleChghost },
{ "ERROR", handleError },
{ "INVITE", handleInvite },
{ "JOIN", handleJoin },