about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-10-01 13:27:01 +0100
committerJames Booth <boothj5@gmail.com>2014-10-01 13:27:01 +0100
commit60e0d5ef7b32d509005078bcc5e0581e68162732 (patch)
tree9ecac8d565a175b50df85f32982baa7e56043e3e
parentb189f8f52ea1053c8fe3da60d3d7038a075d8c69 (diff)
downloadprofani-tty-60e0d5ef7b32d509005078bcc5e0581e68162732.tar.gz
Store real jid with occupants
-rw-r--r--TODO_ROLES1
-rw-r--r--src/muc.c19
-rw-r--r--src/muc.h5
-rw-r--r--src/server_events.c12
-rw-r--r--src/server_events.h8
-rw-r--r--src/ui/core.c12
-rw-r--r--src/ui/window.c4
-rw-r--r--src/xmpp/presence.c10
8 files changed, 47 insertions, 24 deletions
diff --git a/TODO_ROLES b/TODO_ROLES
index 7a448555..6cfce7ea 100644
--- a/TODO_ROLES
+++ b/TODO_ROLES
@@ -4,3 +4,4 @@ Changing subject
 Moderator use cases
 Admin use cases
 Owner use cases
+Check commands from private conversations
diff --git a/src/muc.c b/src/muc.c
index 508d77ee..effb1227 100644
--- a/src/muc.c
+++ b/src/muc.c
@@ -71,8 +71,8 @@ static muc_role_t _role_from_string(const char * const role);
 static muc_affiliation_t _affiliation_from_string(const char * const affiliation);
 static char* _role_to_string(muc_role_t role);
 static char* _affiliation_to_string(muc_affiliation_t affiliation);
-static Occupant* _muc_occupant_new(const char *const nick, muc_role_t role, muc_affiliation_t affiliation,
-    resource_presence_t presence, const char * const status);
+static Occupant* _muc_occupant_new(const char *const nick, const char * const jid,
+    muc_role_t role, muc_affiliation_t affiliation, resource_presence_t presence, const char * const status);
 static void _occupant_free(Occupant *occupant);
 
 void
@@ -383,8 +383,8 @@ muc_roster_contains_nick(const char * const room, const char * const nick)
  * Add a new chat room member to the room's roster
  */
 gboolean
-muc_roster_add(const char * const room, const char * const nick, const char * const role,
-    const char * const affiliation, const char * const show, const char * const status)
+muc_roster_add(const char * const room, const char * const nick, const char * const jid,
+    const char * const role, const char * const affiliation, const char * const show, const char * const status)
 {
     ChatRoom *chat_room = g_hash_table_lookup(rooms, room);
     gboolean updated = FALSE;
@@ -404,7 +404,7 @@ muc_roster_add(const char * const room, const char * const nick, const char * co
         resource_presence_t presence = resource_presence_from_string(show);
         muc_role_t role_t = _role_from_string(role);
         muc_affiliation_t affiliation_t = _affiliation_from_string(affiliation);
-        Occupant *occupant = _muc_occupant_new(nick, role_t, affiliation_t, presence, status);
+        Occupant *occupant = _muc_occupant_new(nick, jid, role_t, affiliation_t, presence, status);
         g_hash_table_replace(chat_room->roster, strdup(nick), occupant);
     }
 
@@ -831,7 +831,7 @@ _affiliation_to_string(muc_affiliation_t affiliation)
 }
 
 static Occupant*
-_muc_occupant_new(const char *const nick, muc_role_t role, muc_affiliation_t affiliation, resource_presence_t presence,
+_muc_occupant_new(const char *const nick, const char * const jid, muc_role_t role, muc_affiliation_t affiliation, resource_presence_t presence,
     const char * const status)
 {
     Occupant *occupant = malloc(sizeof(Occupant));
@@ -842,6 +842,12 @@ _muc_occupant_new(const char *const nick, muc_role_t role, muc_affiliation_t aff
         occupant->nick = NULL;
     }
 
+    if (jid) {
+        occupant->jid = strdup(jid);
+    } else {
+        occupant->jid = NULL;
+    }
+
     occupant->presence = presence;
 
     if (status) {
@@ -861,6 +867,7 @@ _occupant_free(Occupant *occupant)
 {
     if (occupant) {
         free(occupant->nick);
+        free(occupant->jid);
         free(occupant->status);
         free(occupant);
         occupant = NULL;
diff --git a/src/muc.h b/src/muc.h
index 491c5331..597a462e 100644
--- a/src/muc.h
+++ b/src/muc.h
@@ -58,6 +58,7 @@ typedef enum {
 
 typedef struct _muc_occupant_t {
     char *nick;
+    char *jid;
     muc_role_t role;
     muc_affiliation_t affiliation;
     resource_presence_t presence;
@@ -85,8 +86,8 @@ char* muc_old_nick(const char * const room, const char * const new_nick);
 
 gboolean muc_roster_contains_nick(const char * const room, const char * const nick);
 gboolean muc_roster_complete(const char * const room);
-gboolean muc_roster_add(const char * const room, const char * const nick, const char * const role,
-    const char * const affiliation, const char * const show,
+gboolean muc_roster_add(const char * const room, const char * const nick, const char * const jid,
+    const char * const role, const char * const affiliation, const char * const show,
     const char * const status);
 void muc_roster_remove(const char * const room, const char * const nick);
 void muc_roster_set_complete(const char * const room);
diff --git a/src/server_events.c b/src/server_events.c
index 4755f3fa..6d4d9031 100644
--- a/src/server_events.c
+++ b/src/server_events.c
@@ -527,10 +527,10 @@ handle_room_roster_complete(const char * const room)
 }
 
 void
-handle_room_member_presence(const char * const room, const char * const nick, const char * const role, 
-    const char *  const affiliation, const char * const show, const char * const status)
+handle_room_member_presence(const char * const room, const char * const nick, const char * const jid,
+    const char * const role, const char *  const affiliation, const char * const show, const char * const status)
 {
-    gboolean updated = muc_roster_add(room, nick, role, affiliation, show, status);
+    gboolean updated = muc_roster_add(room, nick, jid, role, affiliation, show, status);
 
     if (updated) {
         char *muc_status_pref = prefs_get_string(PREF_STATUSES_MUC);
@@ -542,10 +542,10 @@ handle_room_member_presence(const char * const room, const char * const nick, co
 }
 
 void
-handle_room_member_online(const char * const room, const char * const nick, const char * const role,
-    const char * const affiliation, const char * const show, const char * const status)
+handle_room_member_online(const char * const room, const char * const nick, const char * const jid,
+    const char * const role, const char * const affiliation, const char * const show, const char * const status)
 {
-    muc_roster_add(room, nick, role, affiliation, show, status);
+    muc_roster_add(room, nick, jid, role, affiliation, show, status);
 
     char *muc_status_pref = prefs_get_string(PREF_STATUSES_MUC);
     if (g_strcmp0(muc_status_pref, "none") != 0) {
diff --git a/src/server_events.h b/src/server_events.h
index 6990e8bf..952c3397 100644
--- a/src/server_events.h
+++ b/src/server_events.h
@@ -73,10 +73,10 @@ void handle_room_nick_change(const char * const room,
 void handle_room_requires_config(const char * const room);
 void handle_room_destroy(const char * const room);
 void handle_room_roster_complete(const char * const room);
-void handle_room_member_presence(const char * const room, const char * const nick, const char * const role,
-    const char * const affiliation, const char * const show, const char * const status);
-void handle_room_member_online(const char * const room, const char * const nick, const char * const role,
-    const char * const affiliation, const char * const show, const char * const status);
+void handle_room_member_presence(const char * const room, const char * const nick, const char * const  jid,
+    const char * const role, const char * const affiliation, const char * const show, const char * const status);
+void handle_room_member_online(const char * const room, const char * const nick, const char * const  jid,
+    const char * const role, const char * const affiliation, const char * const show, const char * const status);
 void handle_room_member_offline(const char * const room, const char * const nick,
     const char * const show, const char * const status);
 void handle_room_member_nick_change(const char * const room,
diff --git a/src/ui/core.c b/src/ui/core.c
index 892fa1c0..1d106d6b 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -1937,7 +1937,11 @@ _ui_show_room_role_list(ProfWin *window, const char * const room, muc_role_t rol
         while(curr_occupant) {
             Occupant *occupant = curr_occupant->data;
             if (occupant->role == role) {
-                win_save_vprint(window, '!', NULL, 0, 0, "", "  %s", occupant->nick);
+                if (occupant->jid) {
+                    win_save_vprint(window, '!', NULL, 0, 0, "", "  %s (%s)", occupant->nick, occupant->jid);
+                } else {
+                    win_save_vprint(window, '!', NULL, 0, 0, "", "  %s", occupant->nick);
+                }
             }
 
             curr_occupant = g_slist_next(curr_occupant);
@@ -1992,7 +1996,11 @@ _ui_show_room_affiliation_list(ProfWin *window, const char * const room, muc_aff
         while(curr_occupant) {
             Occupant *occupant = curr_occupant->data;
             if (occupant->affiliation == affiliation) {
-                win_save_vprint(window, '!', NULL, 0, 0, "", "  %s", occupant->nick);
+                if (occupant->jid) {
+                    win_save_vprint(window, '!', NULL, 0, 0, "", "  %s (%s)", occupant->nick, occupant->jid);
+                } else {
+                    win_save_vprint(window, '!', NULL, 0, 0, "", "  %s", occupant->nick);
+                }
             }
 
             curr_occupant = g_slist_next(curr_occupant);
diff --git a/src/ui/window.c b/src/ui/window.c
index 00167a17..b4da5147 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -204,6 +204,10 @@ win_show_occupant_info(ProfWin *window, const char * const room, Occupant *occup
 
     win_save_newline(window);
 
+    if (occupant->jid) {
+        win_save_vprint(window, '!', NULL, 0, 0, "", "  Jid: %s", occupant->jid);
+    }
+
     win_save_vprint(window, '!', NULL, 0, 0, "", "  Affiliation: %s", occupant_affiliation);
     win_save_vprint(window, '!', NULL, 0, 0, "", "  Role: %s", occupant_role);
 
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index cfbf18fe..be2d4a01 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -766,6 +766,7 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
             }
 
             char *show_str = stanza_get_show(stanza, "online");
+            char *jid = NULL;
             char *role = NULL;
             char *affiliation = NULL;
 
@@ -773,25 +774,26 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
             if (x) {
                 xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
                 if (item) {
+                    jid = xmpp_stanza_get_attribute(item, "jid");
                     role = xmpp_stanza_get_attribute(item, "role");
                     affiliation = xmpp_stanza_get_attribute(item, "affiliation");
                 }
             }
 
             if (!muc_roster_complete(from_room)) {
-                muc_roster_add(from_room, from_nick, role, affiliation, show_str, status_str);
+                muc_roster_add(from_room, from_nick, jid, role, affiliation, show_str, status_str);
             } else {
                 char *old_nick = muc_roster_nick_change_complete(from_room, from_nick);
 
                 if (old_nick != NULL) {
-                    muc_roster_add(from_room, from_nick, role, affiliation, show_str, status_str);
+                    muc_roster_add(from_room, from_nick, jid, role, affiliation, show_str, status_str);
                     handle_room_member_nick_change(from_room, old_nick, from_nick);
                     free(old_nick);
                 } else {
                     if (!muc_roster_contains_nick(from_room, from_nick)) {
-                        handle_room_member_online(from_room, from_nick, role, affiliation, show_str, status_str);
+                        handle_room_member_online(from_room, from_nick, jid, role, affiliation, show_str, status_str);
                     } else {
-                        handle_room_member_presence(from_room, from_nick, role, affiliation, show_str, status_str);
+                        handle_room_member_presence(from_room, from_nick, jid, role, affiliation, show_str, status_str);
                     }
                 }
             }