about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-14 21:36:58 -0500
committerJune McEnroe <june@causal.agency>2020-02-14 21:36:58 -0500
commit39a343980b634f41377d72426ced50ca8ae0fb64 (patch)
treeaf29e7daa153c7427bfaffcf42ea71bec5b96241
parentAdd /away (diff)
downloadcatgirl-39a343980b634f41377d72426ced50ca8ae0fb64.tar.gz
catgirl-39a343980b634f41377d72426ced50ca8ae0fb64.zip
Add /invite
-rw-r--r--catgirl.111
-rw-r--r--chat.h1
-rw-r--r--command.c7
-rw-r--r--handle.c20
4 files changed, 39 insertions, 0 deletions
diff --git a/catgirl.1 b/catgirl.1
index 770fcc8..437b0d1 100644
--- a/catgirl.1
+++ b/catgirl.1
@@ -242,6 +242,8 @@ can be typed
 .Bl -tag -width Ds
 .It Ic /away Op Ar message
 Set or clear your away status.
+.It Ic /invite Ar nick
+Invite a user to the channel.
 .It Ic /join Ar channel
 Join a channel.
 .It Ic /list Op Ar channel
@@ -558,6 +560,15 @@ join = #ascii.town
 .
 .It
 .Rs
+.%A Attila Molnar
+.%A Adam
+.%T IRCv3.2 invite-notify Extension
+.%I IRCv3 Working Group
+.%U https://ircv3.net/specs/extensions/invite-notify-3.2
+.Re
+.
+.It
+.Rs
 .%A Daniel Oaks
 .%T IRC Formatting
 .%I ircdocs
diff --git a/chat.h b/chat.h
index f0dadcc..c7ab5f7 100644
--- a/chat.h
+++ b/chat.h
@@ -71,6 +71,7 @@ static inline enum Color hash(const char *str) {
 
 #define ENUM_CAP \
 	X("extended-join", CapExtendedJoin) \
+	X("invite-notify", CapInviteNotify) \
 	X("sasl", CapSASL) \
 	X("server-time", CapServerTime) \
 	X("userhost-in-names", CapUserhostInNames)
diff --git a/command.c b/command.c
index 00c3040..f59176f 100644
--- a/command.c
+++ b/command.c
@@ -135,6 +135,12 @@ static void commandNames(size_t id, char *params) {
 	replies.names++;
 }
 
+static void commandInvite(size_t id, char *params) {
+	if (!params) return;
+	char *nick = strsep(&params, " ");
+	ircFormat("INVITE %s %s\r\n", nick, idNames[id]);
+}
+
 static void commandList(size_t id, char *params) {
 	(void)id;
 	if (params) {
@@ -251,6 +257,7 @@ static const struct Handler {
 	{ "/debug", .fn = commandDebug, .restricted = true },
 	{ "/exec", .fn = commandExec, .restricted = true },
 	{ "/help", .fn = commandHelp },
+	{ "/invite", .fn = commandInvite },
 	{ "/join", .fn = commandJoin, .restricted = true },
 	{ "/list", .fn = commandList },
 	{ "/me", .fn = commandMe },
diff --git a/handle.c b/handle.c
index 6dffa17..a73ae3e 100644
--- a/handle.c
+++ b/handle.c
@@ -418,6 +418,25 @@ static void handleTopic(struct Message *msg) {
 	}
 }
 
+static void handleInvite(struct Message *msg) {
+	require(msg, true, 2);
+	if (!strcmp(msg->params[0], self.nick)) {
+		uiFormat(
+			Network, Hot, tagTime(msg),
+			"\3%02d%s\3\tinvites you to \3%02d%s\3",
+			hash(msg->user), msg->nick, hash(msg->params[1]), msg->params[1]
+		);
+	} else {
+		uiFormat(
+			idFor(msg->params[1]), Cold, tagTime(msg),
+			"\3%02d%s\3\tinvites %s to \3%02d%s\3",
+			hash(msg->user), msg->nick,
+			msg->params[0],
+			hash(msg->params[1]), msg->params[1]
+		);
+	}
+}
+
 static void handleReplyList(struct Message *msg) {
 	require(msg, false, 4);
 	if (!replies.list) return;
@@ -710,6 +729,7 @@ static const struct Handler {
 	{ "AUTHENTICATE", handleAuthenticate },
 	{ "CAP", handleCap },
 	{ "ERROR", handleError },
+	{ "INVITE", handleInvite },
 	{ "JOIN", handleJoin },
 	{ "KICK", handleKick },
 	{ "NICK", handleNick },