summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--client.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/client.c b/client.c
index 9bc8a4a..3e6c2f9 100644
--- a/client.c
+++ b/client.c
@@ -37,6 +37,7 @@ struct Client {
 	bool error;
 	struct tls *tls;
 	enum Need need;
+	bool serverTime;
 	char buf[4096];
 	size_t len;
 };
@@ -48,6 +49,7 @@ struct Client *clientAlloc(struct tls *tls) {
 	client->error = false;
 	client->tls = tls;
 	client->need = NeedNick | NeedUser | (clientPass ? NeedPass : 0);
+	client->serverTime = false;
 	client->len = 0;
 
 	return client;
@@ -125,7 +127,34 @@ static void handlePass(struct Client *client, struct Message msg) {
 }
 
 static void handleCap(struct Client *client, struct Message msg) {
-	// TODO...
+	if (!msg.params[0]) msg.params[0] = "";
+
+	if (!strcmp(msg.params[0], "END")) {
+		client->need &= ~NeedCapEnd;
+		if (!client->need) stateSync(client);
+
+	} else if (!strcmp(msg.params[0], "LS")) {
+		client->need |= NeedCapEnd;
+		clientFormat(client, ":invalid CAP * LS :server-time\r\n");
+
+	} else if (!strcmp(msg.params[0], "REQ") && msg.params[1]) {
+		client->need |= NeedCapEnd;
+		if (!strcmp(msg.params[1], "server-time")) {
+			client->serverTime = true;
+			clientFormat(client, ":invalid CAP * ACK :server-time\r\n");
+		} else {
+			clientFormat(client, ":invalid CAP * NAK :%s\r\n", msg.params[1]);
+		}
+
+	} else if (!strcmp(msg.params[0], "LIST")) {
+		clientFormat(
+			client, ":invalid CAP * LIST :%s\r\n",
+			(client->serverTime ? "server-time" : "")
+		);
+
+	} else {
+		clientFormat(client, ":invalid 410 * :Invalid CAP subcommand\r\n");
+	}
 }
 
 static const struct {
2019-11-10Filter extended-joinJune McEnroe 2019-11-10Expand client configuration documentation and list capabilitiesJune McEnroe 2019-11-10Request all supported caps from serverJune McEnroe 2019-11-10Filter ACCOUNT, AWAY, CHGHOST for incapable clientsJune McEnroe 2019-11-10Rename listen to localJune McEnroe 2019-11-09Remove extended-join and invite-notifyJune McEnroe The remaining caps only generate new commands which can easily be filtered out when sending to clients so will be in the first pass of support. extended-join is probably safe to pass through unaltered, just causing extraneous parameters on JOIN commands, but maybe not. invite-notify reuses the INVITE command where the invited user is not self. 2019-11-09Maintain stateCaps and offer them to clientsJune McEnroe 2019-11-09Parse capabilitiesJune McEnroe The list that I've defined are the ones that I expect to be able to enable probably without any clients breaking... And of course server-time which pounce implements itself. 2019-11-09Avoid the reserved _A names with BIT macroJune McEnroe 2019-11-09Define macro for bit flag enumsJune McEnroe 2019-11-08Check that password is hashedJune McEnroe 2019-11-08Avoid calling getopt_long again after it returns -1June McEnroe On GNU, calling getopt_long again will reset optind back to the first non-option argument, which would cause an infinite loop of reading the same configurtion file forever. 2019-11-08Only change AWAY status for registered clientsJune McEnroe Turns out I did eventually fix this, because I may want to implement "passive clients" for logging or notification stuff, which wouldn't affect AWAY status either. 2019-11-07Just write the example normallyJune McEnroe 2019-11-07Include path in readlinkat errorJune McEnroe 2019-11-07Call clientConsume before clientRecvJune McEnroe This might reduce the frequency of a client getting its own message back because it was behind in the ring when it sent it. 2019-11-06Use -l:filename in Linux.mkJune McEnroe 2019-11-06Fix compat.h for #defined strlcpyJune McEnroe 2019-11-06Allow unsetting LIBRESSL_PREFIXJune McEnroe 2019-11-06Document calico service configurationJune McEnroe 2019-11-06Document SASL EXTERNAL configuration in more detailJune McEnroe 2019-11-06Document pounce service configurationJune McEnroe 2019-11-06Mention Darwin and GNU/Linux in READMEJune McEnroe 2019-11-06Assume LibreSSL from brew on DarwinJune McEnroe 2019-11-06Remove -DNO_EXPLICIT_BZERO from Darwin.mkJune McEnroe 2019-11-06Don't install rc scripts or dirs on LinuxJune McEnroe