Mercurial > nirc
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;