]> Pileus Git - ~andy/lamechat/commitdiff
Start on users
authorAndy Spencer <andy753421@gmail.com>
Fri, 27 Oct 2017 08:03:31 +0000 (08:03 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 29 Oct 2017 05:47:55 +0000 (05:47 +0000)
chat.c
chat.h
irc.c
view.c
xmpp.c

diff --git a/chat.c b/chat.c
index 9d2d0059231463481afb8b6887d86c333db3cd91..351fd4fe24b94c62eb5a54ee436e5787944905f9 100644 (file)
--- a/chat.c
+++ b/chat.c
@@ -34,6 +34,7 @@
 /* Global data */
 server_t  *servers;
 channel_t *channels;
+user_t    *users;
 message_t *messages;
 int        history;
 
@@ -110,8 +111,8 @@ static void write_log(message_t *msg)
        fprintf(chan->log, "(%04d-%02d-%02d %02d:%02d:%02d) %s%s %s\n",
                        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
                        tm->tm_hour, tm->tm_min, tm->tm_sec,
-                       msg->from ?: "***",
-                       msg->from ? ":" : "",
+                       msg->from ? msg->from->name : "***",
+                       msg->from ? ":"             : "",
                        msg->text);
        fflush(chan->log);
 }
@@ -192,7 +193,7 @@ void chat_config(const char *group, const char *name, const char *key, const cha
        }
 }
 
-void chat_recv(channel_t *channel, const char *from, const char *text)
+void chat_recv(channel_t *channel, user_t *from, const char *text)
 {
        append(&msg_buf, NULL, sizeof(message_t));
        messages = (message_t*)msg_buf.data;
@@ -200,7 +201,7 @@ void chat_recv(channel_t *channel, const char *from, const char *text)
        message_t *msg = &messages[history];
        msg->channel = channel;
        msg->when = time(NULL);
-       msg->from = strcopy(from);
+       msg->from = from;
        msg->text = strcopy(text);
 
        history++;
@@ -253,6 +254,26 @@ server_t *add_server(const char *name, protocol_t protocol)
        return (*last = server);
 }
 
+user_t *add_user(const char *name, server_t *server)
+{
+       user_t *user = NULL;
+       user_t **last = &users;
+       debug("adding %s user \"%s\"", server->name, name);
+       switch (server->protocol) {
+               case IRC:
+                       user = irc_user();
+                       break;
+               case XMPP:
+                       user = xmpp_user();
+                       break;
+       }
+       user->name = strcopy(name);
+       user->server = server;
+       while (*last)
+               last = &(*last)->next;
+       return (*last = user);
+}
+
 channel_t *add_channel(const char *name, server_t *server)
 {
        channel_t *channel = NULL;
@@ -281,6 +302,15 @@ server_t *find_server(const char *name)
        return NULL;
 }
 
+user_t *find_user(const char *name)
+{
+       for (user_t *cur = users; cur; cur = cur->next) {
+               if (match(cur->name, name))
+                       return cur;
+       }
+       return NULL;
+}
+
 channel_t *find_channel(const char *name)
 {
        for (channel_t *cur = channels; cur; cur = cur->next) {
diff --git a/chat.h b/chat.h
index a11731723b539bf2151547d943b42d2349c57a02..ad9998767b6dd9cc8cb6451e421745e26354b164 100644 (file)
--- a/chat.h
+++ b/chat.h
@@ -20,6 +20,7 @@ typedef unsigned long long stamp_t;
 
 typedef struct server_t  server_t;
 typedef struct channel_t channel_t;
+typedef struct user_t    user_t;
 
 typedef enum {
        IRC,
@@ -41,16 +42,24 @@ typedef struct channel_t {
        channel_t  *next;
 } channel_t;
 
+typedef struct user_t {
+       server_t   *server;
+       char       *name;
+       char       *full;
+       user_t     *next;
+} user_t;
+
 typedef struct {
-       channel_t  *channel;
        stamp_t     when;
-       char       *from;
+       channel_t  *channel;
+       user_t     *from;
        char       *text;
 } message_t;
 
 /* Global Data */
 extern server_t  *servers;
 extern channel_t *channels;
+extern user_t    *users;
 extern message_t *messages;
 extern int        history;
 
@@ -58,18 +67,21 @@ extern int        history;
 void chat_init(void);
 void chat_config(const char *group, const char *name,
                  const char *key, const char *value);
-void chat_recv(channel_t *channel, const char *from, const char *text);
+void chat_recv(channel_t *channel, user_t *from, const char *text);
 void chat_send(channel_t *channel, const char *text);
 void chat_exit(void);
 
 server_t  *add_server(const char *name, protocol_t protocol);
 channel_t *add_channel(const char *name, server_t *server);
+user_t    *add_user(const char *name, server_t *server);
 server_t  *find_server(const char *name);
 channel_t *find_channel(const char *name);
+user_t    *find_user(const char *name);
 
 /* Protocol functions */
 extern void irc_init(void);
 extern server_t *irc_server(void);
+extern user_t *irc_user(void);
 extern channel_t *irc_channel(void);
 extern void irc_config(server_t *server, channel_t *channel,
                        const char *group, const char *name,
@@ -79,6 +91,7 @@ extern void irc_exit(void);
 
 extern void xmpp_init(void);
 extern server_t *xmpp_server(void);
+extern user_t *xmpp_user(void);
 extern channel_t *xmpp_channel(void);
 extern void xmpp_config(server_t *server, channel_t *channel,
                         const char *group, const char *name,
diff --git a/irc.c b/irc.c
index 3fe171d8742ca695518251b245b50c9fbcd97d90..c50a43ae34b7a361907d71e4ed4adede1950f34d 100644 (file)
--- a/irc.c
+++ b/irc.c
@@ -55,6 +55,12 @@ typedef enum {
        IRC_DEAD,
 } irc_state_t;
 
+typedef struct {
+       user_t        user;
+
+       const char   *nick;
+} irc_user_t;
+
 typedef struct {
        channel_t     channel;
 
@@ -73,6 +79,7 @@ typedef struct {
        const char   *auth;
        const char   *pass;
 
+       irc_user_t    myself;
        irc_channel_t system;
        net_t         net;
        irc_state_t   state;
@@ -133,6 +140,25 @@ static irc_channel_t *find_dest(irc_server_t *srv, const char *dest, int create)
        return chan;
 }
 
+static irc_user_t *find_nick(irc_server_t *srv, const char *from, int create)
+{
+       irc_user_t *usr;
+
+       /* Find existing channels */
+       for (user_t *cur = users; cur; cur = cur->next) {
+               if (cur->server != &srv->server)
+                       continue;
+               usr = (irc_user_t *)cur;
+               if (match(usr->nick, from))
+                       return usr;
+       }
+
+       /* Create a new channel */
+       usr = (irc_user_t *)add_user(from, &srv->server);
+       usr->nick = strcopy(from);
+       return usr;
+}
+
 static void join_channel(irc_server_t *srv, irc_channel_t *chan)
 {
        chan_notice(chan, "Joining Channel: %s", chan->channel.name);
@@ -388,6 +414,7 @@ static void irc_run(irc_server_t *srv, const char *line)
        /* Receive messages */
        if (srv->state == IRC_READY) {
                irc_channel_t *chan;
+               irc_user_t    *usr;
                if (match(cmd, "PING")) {
                        net_print(&srv->net, "PING %s\n", msg);
                }
@@ -407,11 +434,13 @@ static void irc_run(irc_server_t *srv, const char *line)
                }
                if (match(cmd, "PRIVMSG") && dst[0] == '#') {
                        chan = find_dest(srv, dst, 1);
-                       chat_recv(&chan->channel, from, msg);
+                       usr  = find_nick(srv, from, 1);
+                       chat_recv(&chan->channel, &usr->user, msg);
                }
                if (match(cmd, "PRIVMSG") && dst[0] != '#') {
                        chan = find_dest(srv, from, 1);
-                       chat_recv(&chan->channel, from, msg);
+                       usr  = find_nick(srv, from, 1);
+                       chat_recv(&chan->channel, &usr->user, msg);
                }
        }
 
@@ -459,6 +488,11 @@ server_t *irc_server(void)
        return new0(irc_server_t);
 }
 
+user_t *irc_user(void)
+{
+       return new0(irc_user_t);
+}
+
 channel_t *irc_channel(void)
 {
        return new0(irc_channel_t);
@@ -534,7 +568,7 @@ void irc_send(channel_t *channel, const char *text)
                }
                else {
                        net_print(&srv->net, "PRIVMSG %s :%s\n", chan->dest, text);
-                       chat_recv(channel, srv->nick, text);
+                       chat_recv(channel, &srv->myself.user, text);
                }
        }
 }
diff --git a/view.c b/view.c
index f8fff32ce9eabd239dcb17c107a369bb73c49c94..1e48b0201326b608d6c9b768976505eb930cbdab 100644 (file)
--- a/view.c
+++ b/view.c
@@ -347,19 +347,21 @@ static void print_msg(message_t *msg, int *row, int print)
        if (focus->filter && msg->from)
                snprintf(buf, sizeof(buf), "%02d:%02d [%s] %s: ",
                                tm->tm_hour, tm->tm_min,
-                               msg->channel->name, msg->from);
+                               msg->channel->name,
+                               msg->from->full ?: msg->from->name);
        else if (focus->filter)
                snprintf(buf, sizeof(buf), "%02d:%02d [%s] *** ",
                                tm->tm_hour, tm->tm_min, msg->channel->name);
        else if (msg->from)
                snprintf(buf, sizeof(buf), "%02d:%02d %s: ",
-                               tm->tm_hour, tm->tm_min, msg->from);
+                               tm->tm_hour, tm->tm_min,
+                               msg->from->full ?: msg->from->name);
        else
                snprintf(buf, sizeof(buf), "%02d:%02d *** ",
                                tm->tm_hour, tm->tm_min);
 
        const char *chan = focus->filter ? msg->channel->name : NULL;
-       const char *from = msg->from;
+       const char *from = msg->from     ? msg->from->name    : NULL;
        int attr, word = 0;
        while (*hdr) {
                if      (word==0)         attr = color_date;
diff --git a/xmpp.c b/xmpp.c
index 9b7b963f4ea3cb3c52cb48462d018df10423e10d..01ff89068ac6e8671c2a675659367c83ea2ec966 100644 (file)
--- a/xmpp.c
+++ b/xmpp.c
@@ -61,6 +61,11 @@ typedef enum {
        XMPP_IN_PRESENCE,
 } xmpp_state_t;
 
+typedef struct {
+       user_t          user;
+       char            jid[JID_LEN];
+} xmpp_user_t;
+
 typedef struct {
        channel_t       channel;
        char            dest[JID_LEN];
@@ -71,6 +76,7 @@ typedef struct {
 
 typedef struct {
        server_t        server;
+       xmpp_user_t     myself;
        xmpp_channel_t  system;
 
        int             connect;
@@ -195,6 +201,25 @@ static xmpp_channel_t *find_dest(xmpp_server_t *srv,
        return chan;
 }
 
+static xmpp_user_t *find_jid(xmpp_server_t *srv, const char *jid, int create)
+{
+       xmpp_user_t *usr;
+
+       /* Find existing channels */
+       for (user_t *cur = users; cur; cur = cur->next) {
+               if (cur->server != &srv->server)
+                       continue;
+               usr = (xmpp_user_t *)cur;
+               if (match(usr->jid, jid))
+                       return usr;
+       }
+
+       /* Create a new channel */
+       usr = (xmpp_user_t *)add_user(jid, &srv->server);
+       strncpy(usr->jid, jid, JID_LEN);
+       return usr;
+}
+
 static const char *find_attr(const char **attrs, const char *name)
 {
        for (int i = 0; attrs[i] && attrs[i+1]; i += 2)
@@ -548,7 +573,12 @@ static void xmpp_run(xmpp_server_t *srv, int idle,
        }
        if (srv->state == XMPP_IN_VCARD) {
                if (end && chan && data) {
+                       xmpp_user_t *usr = NULL;
                        chan_notice(chan, "%-12s -- %s", end, data);
+                       if (srv->msg_from)
+                               usr = find_jid(srv, srv->msg_from, 1);
+                       if (usr && match(end, "FN"))
+                               strset(&usr->user.full, data);
                }
                if (match(end, "vCard")) {
                        srv->state = XMPP_IN_IQ;
@@ -577,7 +607,10 @@ static void xmpp_run(xmpp_server_t *srv, int idle,
                                srv->msg_chan->channel.name,
                                srv->msg_jid, srv->msg_from);
                        if (srv->body) {
-                               chat_recv(&chan->channel, srv->msg_from, srv->body);
+                               xmpp_user_t *usr = NULL;
+                               if (srv->msg_from)
+                                       usr = find_jid(srv, srv->msg_from, 1);
+                               chat_recv(&chan->channel, &usr->user, srv->body);
                                message_t *msg = &messages[history-1];
                                msg->when = srv->stamp ?: msg->when;
                        }
@@ -676,6 +709,11 @@ server_t *xmpp_server(void)
        return new0(xmpp_server_t);
 }
 
+user_t *xmpp_user(void)
+{
+       return new0(xmpp_user_t);
+}
+
 channel_t *xmpp_channel(void)
 {
        return new0(xmpp_channel_t);
@@ -820,7 +858,7 @@ void xmpp_send(channel_t *channel, const char *text)
                                "<body>%s</body>"
                                "</message>",
                                srv->id++, srv->jid, chan->dest, text);
-                       chat_recv(channel, srv->nick, text);
+                       chat_recv(channel, &srv->myself.user, text);
                }
        }
 }