]> Pileus Git - ~andy/lamechat/commitdiff
Window management
authorAndy Spencer <andy753421@gmail.com>
Tue, 17 Oct 2017 08:56:22 +0000 (08:56 +0000)
committerAndy Spencer <andy753421@gmail.com>
Tue, 17 Oct 2017 08:56:22 +0000 (08:56 +0000)
chat.c
chat.h
irc.c
util.c
util.h
view.c
xmpp.c

diff --git a/chat.c b/chat.c
index 866ac28da36d57bc8327d999afb4a30b00972bec..83fd2c9584d1cc1155206669151b332a660d108c 100644 (file)
--- a/chat.c
+++ b/chat.c
@@ -109,18 +109,6 @@ void chat_config(const char *group, const char *name, const char *key, const cha
        }
 }
 
-void chat_notice(channel_t *channel, const char *from, const char *fmt, ...)
-{
-       static char buf[1024];
-
-       va_list ap;
-       va_start(ap, fmt);
-       vsnprintf(buf, sizeof(buf), fmt, ap);
-       va_end(ap);
-
-       chat_recv(channel, from, buf);
-}
-
 void chat_recv(channel_t *channel, const char *from, const char *text)
 {
        append(&msg_buf, NULL, sizeof(message_t));
@@ -144,7 +132,6 @@ void chat_send(channel_t *channel, const char *text)
        message_t *msg = &messages[history];
        msg->channel = channel;
        msg->when = time(NULL);
-       msg->from = strcopy("andy");
        msg->text = strcopy(text);
        history++;
 
diff --git a/chat.h b/chat.h
index f3195d3d10969993314cef01c45f95b938d65eaf..38c6f58f1de59dcce13058487a96329a72c93c29 100644 (file)
--- a/chat.h
+++ b/chat.h
@@ -18,7 +18,7 @@
 /* Message Types */
 typedef unsigned long long stamp_t;
 
-typedef struct server_t server_t;
+typedef struct server_t  server_t;
 typedef struct channel_t channel_t;
 
 typedef enum {
@@ -55,7 +55,6 @@ extern int        history;
 void chat_init(void);
 void chat_config(const char *group, const char *name,
                  const char *key, const char *value);
-void chat_notice(channel_t *channel, const char *from, const char *fmt, ...);
 void chat_recv(channel_t *channel, const char *from, const char *msg);
 void chat_send(channel_t *channel, const char *msg);
 void chat_exit(void);
diff --git a/irc.c b/irc.c
index e12cbb9d1dadfb1e724da3bcc9f112c86462e2bc..e41fa7388b9d025eddca4e2f1715cc3dfe2523be 100644 (file)
--- a/irc.c
+++ b/irc.c
@@ -56,40 +56,65 @@ typedef enum {
 } irc_state_t;
 
 typedef struct {
-       server_t    server;
-
-       int         connect;
-       const char *host;
-       int         port;
-       int         tls;
-       const char *nick;
-       const char *auth;
-       const char *pass;
-
-       net_t       net;
-       irc_state_t state;
-       char        line[IRC_LINE];
-       int         pos;
-} irc_server_t;
-
-typedef struct {
-       channel_t   channel;
+       channel_t     channel;
 
-       const char *dest;
-       int         join;
+       const char   *dest;
+       int           join;
 } irc_channel_t;
 
 typedef struct {
-       char src[IRC_LINE]; // (:([^ ]+) +)?   
-       char cmd[IRC_LINE]; // (([A-Z0-9]+) +) 
-       char dst[IRC_LINE]; // (([^ ]+)[= ]+)? 
-       char arg[IRC_LINE]; // (([^: ]+) *)?   
-       char msg[IRC_LINE]; // (:(.*))?        
+       server_t      server;
+
+       int           connect;
+       const char   *host;
+       int           port;
+       int           tls;
+       const char   *nick;
+       const char   *auth;
+       const char   *pass;
+
+       irc_channel_t system;
+       net_t         net;
+       irc_state_t   state;
+       char          line[IRC_LINE];
+       int           pos;
+} irc_server_t;
+
+typedef struct {
+       char src[IRC_LINE]; // (:([^ ]+) +)?
+       char cmd[IRC_LINE]; // (([A-Z0-9]+) +)
+       char dst[IRC_LINE]; // (([^ ]+)[= ]+)?
+       char arg[IRC_LINE]; // (([^: ]+) *)?
+       char msg[IRC_LINE]; // (:(.*))?
        char from[IRC_LINE];
 } irc_command_t;
 
 /* Local functions */
-static irc_channel_t *find_dest(irc_server_t *srv, const char *dest)
+static void srv_notice(irc_server_t *srv, const char *from, const char *fmt, ...)
+{
+       static char buf[1024];
+
+       va_list ap;
+       va_start(ap, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       chat_recv(&srv->system.channel, from, buf);
+}
+
+static void chan_notice(irc_channel_t *chan, const char *from, const char *fmt, ...)
+{
+       static char buf[1024];
+
+       va_list ap;
+       va_start(ap, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       chat_recv(&chan->channel, from, buf);
+}
+
+static irc_channel_t *find_dest(irc_server_t *srv, const char *dest, int create)
 {
        irc_channel_t *chan;
 
@@ -108,6 +133,20 @@ static irc_channel_t *find_dest(irc_server_t *srv, const char *dest)
        return chan;
 }
 
+static void join_channel(irc_server_t *srv, irc_channel_t *chan)
+{
+       chan_notice(chan, NULL, "Joining Channel: %s", chan->channel.name);
+       net_print(&srv->net, "JOIN %s\n",  chan->dest);
+       net_print(&srv->net, "TOPIC %s\n", chan->dest);
+       net_print(&srv->net, "WHO %s\n",   chan->dest);
+}
+
+static void part_channel(irc_server_t *srv, irc_channel_t *chan)
+{
+       chan_notice(chan, NULL, "Leaving Channel: %s", chan->channel.name);
+       net_print(&srv->net, "PART %s\n",  chan->dest);
+}
+
 static void parse_line(irc_server_t *srv, const char *line,
                       irc_command_t *_cmd)
 {
@@ -155,11 +194,13 @@ static void parse_line(irc_server_t *srv, const char *line,
 
        /* Read arg */
        if  (*c && *c != ':' && *c != ' ') {
-               for (i = 0; *c && *c != ' '; i++)
+               for (i = 0; *c && *c != ':'; i++)
                        arg[i] = *c++;
                while (*c == ' ')
                        c++;
-               arg[i] = '\0';
+               do
+                       arg[i--] = '\0';
+               while (i >= 0 && arg[i] == ' ');
        }
 
        /* Read msg */
@@ -232,6 +273,8 @@ static void irc_run(irc_server_t *srv, const char *line)
                srv->net.recv = on_recv;
                srv->net.err  = on_err;
                srv->net.data = srv;
+
+               srv_notice(srv, NULL, "Joining Server: %s", srv->server.name);
                net_open(&srv->net, srv->host, srv->port);
 
                if (srv->tls)
@@ -247,11 +290,11 @@ static void irc_run(irc_server_t *srv, const char *line)
        }
        if (srv->state == IRC_RECV_TLS) {
                if (match(cmd, "CAP") && match(arg, "ACK")) {
-                       chat_notice(NULL, from, "Start TLS proceeding");
+                       srv_notice(srv, from, "Start TLS proceeding");
                        srv->state = IRC_SEND_STARTTLS;
                }
                if (match(cmd, "CAP") && match(arg, "NAK")) {
-                       chat_notice(NULL, from, "Start TLS unsupported");
+                       srv_notice(srv, from, "Start TLS unsupported");
                        srv->state = IRC_SEND_END;
                }
        }
@@ -277,11 +320,11 @@ static void irc_run(irc_server_t *srv, const char *line)
        }
        if (srv->state == IRC_RECV_SASL) {
                if (match(cmd, "CAP") && match(arg, "ACK")) {
-                       chat_notice(NULL, from, "SASL auth proceeding");
+                       srv_notice(srv, from, "SASL auth proceeding");
                        srv->state = IRC_SEND_PLAIN;
                }
                if (match(cmd, "CAP") && match(arg, "NAK")) {
-                       chat_notice(NULL, from, "SASL auth unsupported");
+                       srv_notice(srv, from, "SASL auth unsupported");
                        srv->state = IRC_SEND_END;
                }
        }
@@ -301,14 +344,14 @@ static void irc_run(irc_server_t *srv, const char *line)
        }
        if (srv->state == IRC_RECV_STATUS) {
                if (match(cmd, "903")) {
-                       chat_notice(NULL, from, "SASL auth succeeded");
+                       srv_notice(srv, from, "SASL auth succeeded");
                        srv->state = IRC_SEND_END;
                }
                if (match(cmd, "904") ||
                    match(cmd, "905") ||
                    match(cmd, "906") ||
                    match(cmd, "907")) {
-                       chat_notice(NULL, from, "SASL auth failed");
+                       srv_notice(srv, from, "SASL auth failed");
                        srv->state = IRC_DEAD;
                }
        }
@@ -337,7 +380,7 @@ static void irc_run(irc_server_t *srv, const char *line)
                        irc_channel_t *chan = (irc_channel_t*)cur;
                        if (cur->server != &srv->server || !chan->join)
                                continue;
-                       net_print(&srv->net, "JOIN %s\n", chan->dest);
+                       join_channel(srv, chan);
                }
                srv->state = IRC_READY;
        }
@@ -348,12 +391,24 @@ static void irc_run(irc_server_t *srv, const char *line)
                if (match(cmd, "PING")) {
                        net_print(&srv->net, "PING %s\n", msg);
                }
+               if (match(cmd, "TOPIC")) {
+                       chan = find_dest(srv, arg, 1);
+                       chan_notice(chan, NULL, "Topic changed to %s", msg);
+               }
+               if (match(cmd, "331") || match(cmd, "322")) {
+                       chan = find_dest(srv, arg, 1);
+                       chan_notice(chan, NULL, "Topic: %s", msg);
+               }
+               if (match(cmd, "353") && prefix(arg, "@", &arg)) {
+                       chan = find_dest(srv, arg, 1);
+                       chan_notice(chan, NULL, "Members: %s", msg);
+               }
                if (match(cmd, "PRIVMSG") && dst[0] == '#') {
-                       chan = find_dest(srv, dst);
+                       chan = find_dest(srv, dst, 1);
                        chat_recv(&chan->channel, from, msg);
                }
                if (match(cmd, "PRIVMSG") && dst[0] != '#') {
-                       chan = find_dest(srv, from);
+                       chan = find_dest(srv, from, 1);
                        chat_recv(&chan->channel, from, msg);
                }
        }
@@ -364,7 +419,7 @@ static void irc_run(irc_server_t *srv, const char *line)
            match(cmd, "372")    ||
            match(cmd, "375")    ||
            match(cmd, "376"))
-               chat_notice(NULL, from, "%s", msg);
+               srv_notice(srv, from, "%s", msg);
 }
 
 /* IRC functions */
@@ -375,6 +430,9 @@ void irc_init(void)
                        continue;
 
                irc_server_t *srv = (irc_server_t*)cur;
+               srv->system.channel.server = &srv->server;
+               srv->system.channel.name   = srv->server.name;
+
                if (!srv->port)
                        srv->port = srv->tls ? 6697 : 6667;
                if (!srv->nick)
@@ -439,10 +497,38 @@ void irc_send(message_t *msg)
 {
        irc_channel_t *chan = (irc_channel_t*)msg->channel;
        irc_server_t  *srv  = (irc_server_t*)msg->channel->server;
-
-       net_print(&srv->net, "PRIVMSG %s :%s\n", chan->dest, msg->text);
-
-       msg->from = strcopy(srv->nick);
+       const char *txt = msg->text;
+       const char *arg;
+
+       if (txt[0] == '/') {
+               if (prefix(txt, "/join", &arg)) {
+                       if (arg)
+                               chan = find_dest(srv, arg, 1);
+                       if (chan)
+                               join_channel(srv, chan);
+               }
+               else if (prefix(txt, "/part", &arg)) {
+                       if (arg)
+                               chan = find_dest(srv, arg, 0);
+                       if (chan)
+                               part_channel(srv, chan);
+               }
+               else {
+                       debug("unknown: [%s]", txt);
+                       chan_notice(chan, "unknown command %s", txt);
+               }
+       } else {
+               if (chan == &srv->system) {
+                       strset(&msg->text, "Cannot send to server");
+               }
+               else if (!chan->dest) {
+                       strset(&msg->text, "No destination for message");
+               }
+               else {
+                       net_print(&srv->net, "PRIVMSG %s :%s\n", chan->dest, msg->text);
+                       msg->from = strcopy(srv->nick);
+               }
+       }
 }
 
 void irc_exit(void)
diff --git a/util.c b/util.c
index dc9cf24a507b46529654109bbd4846204f641cdc..121124150d487f289291d41ec18dcda89bbaf12f 100644 (file)
--- a/util.c
+++ b/util.c
@@ -103,6 +103,16 @@ char *strcopy(const char *str)
        return strdup(str);
 }
 
+void strset(char **old, const char *str)
+{
+       if (*old != NULL)
+               free(old);
+       if (str)
+               *old = strdup(str);
+       else
+               *old = NULL;
+}
+
 int match(const char *a, const char *b)
 {
        if (a == b)
diff --git a/util.h b/util.h
index 8747491502f2f74d9c0e4546870f6dd39635645f..c00b21d89733adf647f4897e9f845d5507412873 100644 (file)
--- a/util.h
+++ b/util.h
@@ -46,6 +46,7 @@ void util_init(void);
 /* Stirng functions */
 void strsub(char *str, char find, char repl);
 char *strcopy(const char *str);
+void strset(char **old, const char *str);
 int match(const char *a, const char *b);
 int match(const char *a, const char *b);
 int prefix(const char *str, const char *prefix, const char **suffix);
diff --git a/view.c b/view.c
index 5d7ee7e31c836f47f26c26cb9367d244065cf729..40ba002f03f2ec220d5b87ae3d858f89bceeabac 100644 (file)
--- a/view.c
+++ b/view.c
@@ -34,6 +34,9 @@
 #include "chat.h"
 #include "view.h"
 
+/* View constants */
+#define RE_FLAGS   (REG_EXTENDED|REG_NOSUB)
+
 /* Extra keys */
 #define KEY_CTRL_G '\7'
 #define KEY_CTRL_L '\14'
@@ -48,9 +51,11 @@ typedef struct window_t window_t;
 
 typedef struct window_t {
        char      *name;
+       int        hide;
        int        flag;
        char      *filter;
        regex_t    regex;
+       server_t  *server;
        channel_t *channel;
        window_t  *next;
 } window_t;
@@ -72,7 +77,18 @@ static window_t *windows;
 static int in_window(message_t *msg, window_t *win)
 {
        channel_t  *chan = msg->channel;
-       const char *name = chan ? chan->name : "";
+       server_t   *srv  = chan->server;
+       const char *name = chan->name;
+       if (!win)
+               return 0;
+       if (win->server) {
+               if (srv != win->server) {
+                       debug("srv: %p:%s != %p:%s",
+                                       srv,         srv->name,
+                                       win->server, win->server->name);
+                       return 0;
+               }
+       }
        if (win->filter)
                return !regexec(&win->regex, name, 0, 0, 0);
        else
@@ -87,13 +103,13 @@ static void add_window(window_t *win)
        *last = win;
 }
 
-static window_t *find_window(const char *name)
+static window_t *find_window(const char *name, int create)
 {
        window_t *win;
        for (win = windows; win; win = win->next)
                if (match(win->name, name))
                        break;
-       if (!win) {
+       if (!win && create) {
                win = new0(window_t);
                win->name = strcopy(name);
                add_window(win);
@@ -101,18 +117,40 @@ static window_t *find_window(const char *name)
        return win;
 }
 
+static window_t *next_window(window_t *win)
+{
+       if (!win)
+               return NULL;
+       for (window_t *cur = win->next; cur; cur = cur->next)
+               if (!cur->hide)
+                       return cur;
+       return win && !win->hide ? win : NULL;
+}
+
+static window_t *prev_window(window_t *win)
+{
+       if (!win)
+               return NULL;
+       window_t *prev = windows;
+       for (window_t *cur = windows; cur != win; cur = cur->next)
+               if (!cur->hide)
+                       prev = cur;
+       return prev && !prev->hide ? prev : NULL;
+}
+
 static void update_windows(void)
 {
        static int seen = 0;
        for (; seen < history; seen++) {
-               window_t   *win  = NULL;
-               message_t  *msg  = &messages[seen];
-               channel_t  *chan = msg->channel;
+               window_t  *win  = NULL;
+               message_t *msg  = &messages[seen];
+               channel_t *chan = msg->channel;
 
                /* Flag existing windows */
                for (window_t *cur = windows; cur; cur = cur->next) {
                        if (in_window(msg, cur)) {
                                win = cur;
+                               win->hide = 0;
                                win->flag = 1;
                        }
                }
@@ -129,6 +167,9 @@ static void update_windows(void)
        /* Update focus */
        if (!focus)
                focus = windows;
+       if (focus && focus->hide)
+               focus = next_window(focus) ?:
+                       prev_window(focus);
 }
 
 /* Print functions */
@@ -201,6 +242,45 @@ static void print_msg(message_t *msg, int *row, int print)
        (*row)++;
 }
 
+/* Commands */
+static int send_command(const char *text)
+{
+       const char *arg;
+       window_t   *win = focus;
+
+       if (match(text, "/quit")) {
+               poll_quit();
+       }
+       else if (prefix(text, "/open", &arg)) {
+               if (!arg && focus)
+                       arg = focus->channel->name;
+               if (!arg)
+                       arg = "(new)";
+               focus = find_window(arg, 1);
+               focus->hide = 0;
+       }
+       else if (prefix(text, "/close", &arg)) {
+               if (arg)
+                       win = find_window(arg, 0);
+               if (win)
+                       win->hide = 1;
+       }
+       else if (prefix(text, "/name", &arg)) {
+               strset(&focus->name, arg);
+       }
+       else if (prefix(text, "/filter", &arg)) {
+               strset(&focus->filter, arg);
+               regcomp(&focus->regex, focus->filter, RE_FLAGS);
+       }
+       else if (focus) {
+               chat_send(focus->channel, text);
+       }
+       else {
+               return 0;
+       }
+       return 1;
+}
+
 /* Drawing functions */
 void draw_header(void)
 {
@@ -245,6 +325,8 @@ void draw_status(void)
        if (!windows)
                printw(" none");
        for (window_t *cur = windows; cur; cur = cur->next) {
+               if (cur->hide)
+                       continue;
                printw(" ");
                if (cur == focus)
                        attron(A_BOLD);
@@ -274,12 +356,10 @@ void draw_cmdline(void)
 /* View init */
 void view_init(void)
 {
-       const int flags = REG_EXTENDED|REG_NOSUB;
-
        /* Setup windows */
        for (window_t *win = windows; win; win = win->next)
                if (win->filter)
-                       regcomp(&win->regex, win->filter, flags);
+                       regcomp(&win->regex, win->filter, RE_FLAGS);
 
        /* Set default escape timeout */
        if (!getenv("ESCDELAY"))
@@ -329,7 +409,9 @@ void view_config(const char *group, const char *name, const char *key, const cha
        if (match(group, "window")) {
                if (match(key, ""))
                        get_name(name);
-               win = find_window(name);
+               win = find_window(name, 1);
+               if (match(key, "server"))
+                       win->server = find_server(get_string(value));
                if (match(key, "channel"))
                        win->channel = find_channel(get_string(value));
                if (match(key, "filter"))
@@ -367,17 +449,11 @@ void view_sync(void)
 
        /* View management */
        else if (chr == KEY_CTRL_N) {
-               if (focus && focus->next)
-                       focus = focus->next;
-               else if (!focus)
-                       focus = windows;
+               focus = next_window(focus) ?: focus;
                view_draw();
        }
        else if (chr == KEY_CTRL_P) {
-               window_t *cur = windows;
-               for (; cur; cur = cur->next)
-                       if (cur->next == focus)
-                               focus = cur;
+               focus = prev_window(focus) ?: focus;
                view_draw();
        }
        else if (chr == KEY_CTRL_X) {
@@ -386,14 +462,12 @@ void view_sync(void)
 
        /* Cmdline Input */
        else if (chr == KEY_RETURN) {
-               if (focus) {
-                       cmd_buf[cmd_len] = '\0';
+               cmd_buf[cmd_len] = '\0';
+               if (send_command(cmd_buf)) {
                        cmd_pos = 0;
                        cmd_len = 0;
-                       chat_send(focus->channel, cmd_buf);
                }
-               draw_chat();
-               draw_cmdline();
+               view_draw();
        }
        else if (chr == KEY_ESCAPE) {
                cmd_pos = 0;
diff --git a/xmpp.c b/xmpp.c
index c928e38643a620deca9436a38ced6ccc48551611..22504b2d34238b7cfa4f417c00c35ec0f3dd3a32 100644 (file)
--- a/xmpp.c
+++ b/xmpp.c
@@ -51,40 +51,65 @@ typedef enum {
 } xmpp_state_t;
 
 typedef struct {
-       server_t     server;
-
-       int          connect;
-       const char  *host;
-       int          port;
-       const char  *muc;
-       const char  *nick;
-       const char  *jid;
-       const char  *user;
-       const char  *pass;
-
-       net_t        net;
-       XML_Parser   expat;
-       xmpp_state_t state;
-       buf_t        buf;
-       int          indent;
-
-       int          in_error;
-
-       char         msg_from[JID_LEN];
-       char         msg_usr[JID_LEN];
-       char         msg_srv[JID_LEN];
-       char         msg_res[JID_LEN];
-} xmpp_server_t;
-
-typedef struct {
-       channel_t    channel;
-       char         dest[JID_LEN];
+       channel_t      channel;
+       char           dest[JID_LEN];
 
-       const char  *room;
-       int          join;
+       const char    *room;
+       int            join;
 } xmpp_channel_t;
 
+typedef struct {
+       server_t       server;
+       xmpp_channel_t system;
+
+       int            connect;
+       const char    *host;
+       int            port;
+       const char    *muc;
+       const char    *nick;
+       const char    *jid;
+       const char    *user;
+       const char    *pass;
+
+       net_t          net;
+       XML_Parser     expat;
+       xmpp_state_t   state;
+       buf_t          buf;
+       int            indent;
+
+       int            in_error;
+
+       char           msg_from[JID_LEN];
+       char           msg_usr[JID_LEN];
+       char           msg_srv[JID_LEN];
+       char           msg_res[JID_LEN];
+} xmpp_server_t;
+
 /* Helper functions */
+static void srv_notice(xmpp_server_t *srv, const char *fmt, ...)
+{
+       static char buf[1024];
+
+       va_list ap;
+       va_start(ap, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       chat_recv(&srv->system.channel, NULL, buf);
+}
+
+static void chan_notice(xmpp_channel_t *chan, const char *fmt, ...)
+{
+       static char buf[1024];
+
+       va_list ap;
+       va_start(ap, fmt);
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       chat_recv(&chan->channel, NULL, buf);
+}
+
 static void split_jid(const char *jid, char *usr, char *srv, char *res)
 {
        char *ptr = usr;
@@ -370,14 +395,14 @@ static void xmpp_run(xmpp_server_t *srv,
        /* Info queries */
        if (srv->state == XMPP_READY) {
                if (match(start, "item"))
-                       chat_notice(NULL, NULL, "item: [%s] %s",
+                       srv_notice(srv, "item: [%s] %s",
                                        find_attr(attrs, "jid"),
                                        find_attr(attrs, "name"));
                if (match(start, "identity"))
-                       chat_notice(NULL, NULL, "identity: %s",
+                       srv_notice(srv, "identity: %s",
                                        find_attr(attrs, "name"));
                if (match(start, "feature"))
-                       chat_notice(NULL, NULL, "feature: %s",
+                       srv_notice(srv, "feature: %s",
                                        find_attr(attrs, "var"));
        }
 
@@ -416,7 +441,7 @@ static void xmpp_run(xmpp_server_t *srv,
        if (srv->in_error) {
                if (match(end, "text")) {
                        debug("xmpp: error: %s", data);
-                       chat_notice(NULL, NULL, "error: %s", data);
+                       srv_notice(srv, "error: %s", data);
                }
        }
 }
@@ -429,6 +454,10 @@ void xmpp_init(void)
                        continue;
 
                xmpp_server_t *srv = (xmpp_server_t*)cur;
+               srv->system.channel.server = &srv->server;
+               srv->system.channel.name   = srv->server.name;
+               srv_notice(srv, "XMPP Server: %s", srv->server.name);
+
                if (!srv->port)
                        srv->port = 5222;
                if (!srv->jid)
@@ -524,7 +553,7 @@ void xmpp_send(message_t *msg)
                }
                else if (prefix(txt, "/join", &arg)) {
                        if (!arg) {
-                               chat_notice(NULL, NULL, "usage: /join <channel>");
+                               chan_notice(chan, "usage: /join <channel>");
                                return;
                        }
                        chan = find_dest(srv, arg, 1);
@@ -536,16 +565,15 @@ void xmpp_send(message_t *msg)
                }
                else if (prefix(txt, "/query", &arg)) {
                        if (!arg) {
-                               chat_notice(NULL, NULL, "usage: /query <user>");
+                               chan_notice(chan, "usage: /query <user>");
                                return;
                        }
                        chan = find_dest(srv, arg, 0);
-                       (void)chan;
+                       chan_notice(chan, "query <user>");
                }
                else {
                        debug("unknown: [%s]", txt);
-                       chat_notice(NULL, NULL,
-                               "unknown command %s", txt);
+                       chan_notice(chan, "unknown command %s", txt);
                }
        } else {
                debug("message: [%s]", txt);