]> Pileus Git - ~andy/lamechat/blobdiff - chat.c
Split chat by channels.
[~andy/lamechat] / chat.c
diff --git a/chat.c b/chat.c
index 4aa4ce63abd84d044949ecae6ddd57f0307b49a9..866ac28da36d57bc8327d999afb4a30b00972bec 100644 (file)
--- a/chat.c
+++ b/chat.c
@@ -33,8 +33,6 @@ message_t *messages;
 int        history;
 
 /* Local data */
-static buf_t srv_buf;
-static buf_t chan_buf;
 static buf_t msg_buf;
 
 static const char *proto_map[] = {
@@ -42,11 +40,9 @@ static const char *proto_map[] = {
        [XMPP] "xmpp",
 };
 
-/* View init */
+/* Chat init */
 void chat_init(void)
 {
-       servers  = (server_t*)srv_buf.data;
-       channels = (channel_t*)chan_buf.data;
        messages = (message_t*)msg_buf.data;
        history  = 0;
 
@@ -113,7 +109,7 @@ void chat_config(const char *group, const char *name, const char *key, const cha
        }
 }
 
-void chat_notice(const char *channel, const char *from, const char *fmt, ...)
+void chat_notice(channel_t *channel, const char *from, const char *fmt, ...)
 {
        static char buf[1024];
 
@@ -125,13 +121,13 @@ void chat_notice(const char *channel, const char *from, const char *fmt, ...)
        chat_recv(channel, from, buf);
 }
 
-void chat_recv(const char *channel, const char *from, const char *text)
+void chat_recv(channel_t *channel, const char *from, const char *text)
 {
        append(&msg_buf, NULL, sizeof(message_t));
        messages = (message_t*)msg_buf.data;
 
        message_t *msg = &messages[history];
-       msg->channel = find_channel(channel);
+       msg->channel = channel;
        msg->when = time(NULL);
        msg->from = strcopy(from);
        msg->text = strcopy(text);
@@ -140,10 +136,8 @@ void chat_recv(const char *channel, const char *from, const char *text)
        view_draw();
 }
 
-void chat_send(const char *channel_name, const char *text)
+void chat_send(channel_t *channel, const char *text)
 {
-       channel_t *channel = find_channel(channel_name);
-
        append(&msg_buf, NULL, sizeof(message_t));
        messages = (message_t*)msg_buf.data;
 
@@ -154,8 +148,14 @@ void chat_send(const char *channel_name, const char *text)
        msg->text = strcopy(text);
        history++;
 
-       irc_send(msg);
-       xmpp_send(msg);
+       switch (channel->server->protocol) {
+               case IRC:
+                       irc_send(msg);
+                       break;
+               case XMPP:
+                       xmpp_send(msg);
+                       break;
+       }
 
        view_draw();
 }
@@ -174,6 +174,7 @@ void chat_exit(void)
 server_t *add_server(const char *name, protocol_t protocol)
 {
        server_t *server = NULL;
+       server_t **last = &servers;
        debug("adding %s server \"%s\"", proto_map[protocol], name);
        switch (protocol) {
                case IRC:
@@ -183,15 +184,17 @@ server_t *add_server(const char *name, protocol_t protocol)
                        server = xmpp_server();
                        break;
        }
-       server->next = servers;
        server->name = strcopy(name);
        server->protocol = protocol;
-       return (servers = server);
+       while (*last)
+               last = &(*last)->next;
+       return (*last = server);
 }
 
 channel_t *add_channel(const char *name, server_t *server)
 {
        channel_t *channel = NULL;
+       channel_t **last = &channels;
        debug("adding %s channel \"%s\"", server->name, name);
        switch (server->protocol) {
                case IRC:
@@ -201,10 +204,11 @@ channel_t *add_channel(const char *name, server_t *server)
                        channel = xmpp_channel();
                        break;
        }
-       channel->next = channels;
        channel->name = strcopy(name);
        channel->server = server;
-       return (channels = channel);
+       while (*last)
+               last = &(*last)->next;
+       return (*last = channel);
 }
 
 server_t *find_server(const char *name)