about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2013-05-19 23:35:02 +0100
committerJames Booth <boothj5@gmail.com>2013-05-19 23:35:02 +0100
commit59a3a5fe9b579bf76caf594c934fd1a8a9cb46ac (patch)
treef2c65b22d2d7697a0790df8de10a34905293ea1d
parentad6184c86bf65e7436ad0377d3e77985cff1d2fd (diff)
downloadprofani-tty-59a3a5fe9b579bf76caf594c934fd1a8a9cb46ac.tar.gz
Use handle in /msg command
-rw-r--r--src/command/command.c7
-rw-r--r--src/xmpp/message.c21
-rw-r--r--src/xmpp/roster.c63
-rw-r--r--src/xmpp/roster.h1
-rw-r--r--src/xmpp/xmpp.h1
5 files changed, 75 insertions, 18 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 2eb0adc0..53bc39c0 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -1973,14 +1973,15 @@ _cmd_msg(gchar **args, struct cmd_help_t help)
         return TRUE;
 
     } else {
+        char *usr_jid = roster_jid_from_handle(usr);
         if (msg != NULL) {
-            message_send(msg, usr);
-            ui_outgoing_msg("me", usr, msg);
+            message_send(msg, usr_jid);
+            ui_outgoing_msg("me", usr_jid, msg);
 
             if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) {
                 const char *jid = jabber_get_jid();
                 Jid *jidp = jid_create(jid);
-                chat_log_chat(jidp->barejid, usr, msg, PROF_OUT_LOG, NULL);
+                chat_log_chat(jidp->barejid, usr_jid, msg, PROF_OUT_LOG, NULL);
                 jid_destroy(jidp);
             }
 
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 0f69f4ff..00655bde 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -32,6 +32,7 @@
 #include "profanity.h"
 #include "xmpp/connection.h"
 #include "xmpp/message.h"
+#include "xmpp/roster.h"
 #include "xmpp/stanza.h"
 #include "xmpp/xmpp.h"
 
@@ -59,21 +60,29 @@ message_add_handlers(void)
 void
 message_send(const char * const msg, const char * const recipient)
 {
+    const char * jid = NULL;
+
+    if (roster_jid_from_handle(recipient) != NULL) {
+        jid = roster_jid_from_handle(recipient);
+    } else {
+        jid = recipient;
+    }
+
     xmpp_conn_t * const conn = connection_get_conn();
     xmpp_ctx_t * const ctx = connection_get_ctx();
     if (prefs_get_boolean(PREF_STATES)) {
-        if (!chat_session_exists(recipient)) {
-            chat_session_start(recipient, TRUE);
+        if (!chat_session_exists(jid)) {
+            chat_session_start(jid, TRUE);
         }
     }
 
     xmpp_stanza_t *message;
-    if (prefs_get_boolean(PREF_STATES) && chat_session_get_recipient_supports(recipient)) {
-        chat_session_set_active(recipient);
-        message = stanza_create_message(ctx, recipient, STANZA_TYPE_CHAT,
+    if (prefs_get_boolean(PREF_STATES) && chat_session_get_recipient_supports(jid)) {
+        chat_session_set_active(jid);
+        message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT,
             msg, STANZA_NAME_ACTIVE, NULL);
     } else {
-        message = stanza_create_message(ctx, recipient, STANZA_TYPE_CHAT,
+        message = stanza_create_message(ctx, jid, STANZA_TYPE_CHAT,
             msg, NULL, NULL);
     }
 
diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c
index 2d66f4a0..953b91b7 100644
--- a/src/xmpp/roster.c
+++ b/src/xmpp/roster.c
@@ -43,6 +43,7 @@ static int _roster_handle_result(xmpp_conn_t * const conn,
 static Autocomplete ac;
 static Autocomplete resource_ac;
 static GHashTable *contacts;
+static GHashTable *handle_to_jid;
 
 static gboolean _key_equals(void *key1, void *key2);
 static gboolean _datetimes_equal(GDateTime *dt1, GDateTime *dt2);
@@ -66,6 +67,12 @@ roster_request(void)
     xmpp_stanza_release(iq);
 }
 
+char *
+roster_jid_from_handle(const char * const handle)
+{
+    return g_hash_table_lookup(handle_to_jid, handle);
+}
+
 static int
 _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
     void * const userdata)
@@ -82,7 +89,9 @@ _roster_handle_set(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
     const char *name = xmpp_stanza_get_attribute(item, STANZA_ATTR_NAME);
     const char *sub = xmpp_stanza_get_attribute(item, STANZA_ATTR_SUBSCRIPTION);
     if (g_strcmp0(sub, "remove") == 0) {
-        roster_remove(jid);
+        autocomplete_remove(ac, name);
+        g_hash_table_remove(handle_to_jid, name);
+        g_hash_table_remove(contacts, jid);
         return 1;
     }
 
@@ -142,6 +151,7 @@ roster_init(void)
     resource_ac = autocomplete_new();
     contacts = g_hash_table_new_full(g_str_hash, (GEqualFunc)_key_equals, g_free,
         (GDestroyNotify)p_contact_free);
+    handle_to_jid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 }
 
 void
@@ -152,6 +162,8 @@ roster_clear(void)
     g_hash_table_destroy(contacts);
     contacts = g_hash_table_new_full(g_str_hash, (GEqualFunc)_key_equals, g_free,
         (GDestroyNotify)p_contact_free);
+    g_hash_table_destroy(handle_to_jid);
+    handle_to_jid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 }
 
 void
@@ -180,19 +192,19 @@ roster_add(const char * const barejid, const char * const name,
         contact = p_contact_new(barejid, name, subscription, offline_message,
             pending_out);
         g_hash_table_insert(contacts, strdup(barejid), contact);
-        autocomplete_add(ac, strdup(barejid));
+        if (name != NULL) {
+            autocomplete_add(ac, strdup(name));
+            g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid));
+        } else {
+            autocomplete_add(ac, strdup(barejid));
+            g_hash_table_insert(handle_to_jid, strdup(barejid), strdup(barejid));
+        }
         added = TRUE;
     }
 
     return added;
 }
 
-void
-roster_remove(const char * const barejid)
-{
-    g_hash_table_remove(contacts, barejid);
-}
-
 gboolean
 roster_update_presence(const char * const barejid, Resource *resource,
     GDateTime *last_activity)
@@ -243,6 +255,22 @@ roster_change_handle(const char * const barejid, const char * const handle)
 {
     PContact contact = g_hash_table_lookup(contacts, barejid);
 
+    if (p_contact_name(contact) != NULL) {
+        autocomplete_remove(ac, p_contact_name(contact));
+        g_hash_table_remove(handle_to_jid, p_contact_name(contact));
+    } else {
+        autocomplete_remove(ac, barejid);
+        g_hash_table_remove(handle_to_jid, barejid);
+    }
+
+    if (handle != NULL) {
+        autocomplete_add(ac, strdup(handle));
+        g_hash_table_insert(handle_to_jid, strdup(handle), strdup(barejid));
+    } else {
+        autocomplete_add(ac, strdup(barejid));
+        g_hash_table_insert(handle_to_jid, strdup(barejid), strdup(barejid));
+    }
+
     if (contact != NULL) {
         p_contact_set_name(contact, handle);
     }
@@ -262,10 +290,29 @@ roster_update(const char * const barejid, const char * const name,
 
     if (contact == NULL) {
         contact = p_contact_new(barejid, name, subscription, NULL, pending_out);
+        autocomplete_add(ac, strdup(name));
+        g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid));
         g_hash_table_insert(contacts, strdup(barejid), contact);
     } else {
         p_contact_set_subscription(contact, subscription);
         p_contact_set_pending_out(contact, pending_out);
+
+        if (p_contact_name(contact) == NULL) {
+            if (name != NULL) {
+                autocomplete_add(ac, strdup(name));
+                autocomplete_remove(ac, barejid);
+                g_hash_table_remove(handle_to_jid, barejid);
+                g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid));
+            }
+        } else {
+            if (name != NULL) {
+                autocomplete_add(ac, strdup(name));
+                autocomplete_remove(ac, p_contact_name(contact));
+                g_hash_table_remove(handle_to_jid, p_contact_name(contact));
+                g_hash_table_insert(handle_to_jid, strdup(name), strdup(barejid));
+            }
+        }
+
         if (name != NULL) {
             p_contact_set_name(contact, name);
         }
diff --git a/src/xmpp/roster.h b/src/xmpp/roster.h
index 1b16763f..48f6a330 100644
--- a/src/xmpp/roster.h
+++ b/src/xmpp/roster.h
@@ -26,7 +26,6 @@
 void roster_add_handlers(void);
 void roster_request(void);
 
-void roster_remove(const char * const barejid);
 void roster_update(const char * const barejid, const char * const name,
     const char * const subscription, gboolean pending_out);
 
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index 1f3558a9..c18454f4 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -141,5 +141,6 @@ gboolean roster_add(const char * const barejid, const char * const name,
     const char * const subscription, const char * const offline_message,
     gboolean pending_out);
 void roster_change_handle(const char * const barejid, const char * const handle);
+char * roster_jid_from_handle(const char * const handle);
 
 #endif