changeset 34:aeeddb9ce9c9

nirc: support /query
author David Demelier <markand@malikania.fr>
date Tue, 10 Mar 2020 20:30:00 +0100
parents 791e72e43120
children 688182a92f0e
files TODO.md command.c nirc.c server.c
diffstat 4 files changed, 57 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/TODO.md	Tue Mar 10 20:00:00 2020 +0100
+++ b/TODO.md	Tue Mar 10 20:30:00 2020 +0100
@@ -13,5 +13,4 @@
   - /disconnect
   - /kick
   - /names
-  - /query
   - /whois
--- a/command.c	Tue Mar 10 20:00:00 2020 +0100
+++ b/command.c	Tue Mar 10 20:30:00 2020 +0100
@@ -25,6 +25,7 @@
 #include "nirc.h"
 #include "server.h"
 #include "ui.h"
+#include "util.h"
 
 struct command {
 	const char *name;
@@ -108,6 +109,34 @@
 		server_part(s, ch->name, line);
 }
 
+/*
+ * Usage: /query user [msg]
+ */
+static void
+cmd_query(const char *line)
+{
+	struct server *s;
+	struct channel *ch;
+	char user[32 + 1] = { 0 };
+	char msg[512 + 1] = { 0 };
+
+	if (!(s = current_server()) || sscanf(line, "%32s %512s", user, msg) == 0)
+		return;
+
+	/* First, add the new channel if not exists yet. */
+	if (!(ch = server_find(s, user))) {
+		server_add(s, &(const struct channel) {
+			.name = estrdup(user),
+			.joined = true
+		});
+
+		ch = server_find(s, user);
+	}
+
+	if (strlen(msg) != 0)
+		server_privmsg(s, user, msg);
+}
+
 static void
 cmd_topic(const char *line)
 {
@@ -131,6 +160,7 @@
 	{ "list",       cmd_list        },
 	{ "me",         cmd_me          },
 	{ "part",       cmd_part        },
+	{ "query",      cmd_query       },
 	{ "quit",       cmd_quit        },
 	{ "topic",      cmd_topic       },
 	{ NULL,         NULL            }
--- a/nirc.c	Tue Mar 10 20:00:00 2020 +0100
+++ b/nirc.c	Tue Mar 10 20:30:00 2020 +0100
@@ -90,8 +90,6 @@
 	ui_refresh();
 
 	while (nirc.running) {
-		bool update = false;
-
 		/* Realloc pfds if needed. */
 		if (!pfds || pfdsz != nirc.serversz + 1) {
 			pfds = erealloc(pfds, (nirc.serversz + 1) * sizeof (struct pollfd));
@@ -112,8 +110,10 @@
 			ui_getch();
 
 		for (size_t i = 0; i < nirc.serversz; ++i) {
+#if 0
 			if (pfds[i + 1].events && pfds[i + 1].revents)
 				update = true;
+#endif
 
 			server_flush(&nirc.servers[i], &pfds[i + 1]);
 		}
@@ -122,9 +122,7 @@
 		 * Costly function so only update interface if one of the
 		 * server changed.
 		 */
-		if (update)
-			ui_update();
-
+		ui_update();
 		ui_refresh();
 	}
 }
--- a/server.c	Tue Mar 10 20:00:00 2020 +0100
+++ b/server.c	Tue Mar 10 20:30:00 2020 +0100
@@ -293,8 +293,31 @@
 	};
 
 	struct journal *j = &s->journal;
-	struct channel *ch = server_find(s, m->args[0]);
+	struct channel *ch;
 	enum fmt_part part = FMT_MESSAGE;
+	bool is_query;
+
+	/*
+	 * If the target is our nickname it means we have a query message. In
+	 * this case it's no longer the m->args[0] that we need to use
+	 * but the origin message.
+	 */
+	is_query = strcmp(m->args[0], s->nickname) == 0;
+
+	if (is_query) {
+		kw[1].value = origin->nickname;
+		ch = server_find(s, origin->nickname);
+	} else
+		ch = server_find(s, m->args[0]);
+
+	if (!ch) {
+		server_add(s, &(const struct channel) {
+		    .name = estrdup(is_query ? origin->nickname : m->args[0]),
+		    .joined = true
+		});
+
+		ch = server_find(s, is_query ? origin->nickname : m->args[0]);
+	}
 
 	if (ch)
 		j = &ch->journal;