int history;
/* Local data */
-static buf_t srv_buf;
-static buf_t chan_buf;
static buf_t msg_buf;
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;
}
}
-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];
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);
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;
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();
}
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:
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:
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)