about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-11-18 18:36:17 +0000
committerJames Booth <boothj5@gmail.com>2012-11-18 18:36:17 +0000
commite9d6ba211774e382771df5afcc3170f64a72ca6d (patch)
tree2faed044d2921073c34ab5680f7c7b60a83a1a7f
parenta847ad5603a496309adb374097e28e52ae1a2ce9 (diff)
downloadprofani-tty-e9d6ba211774e382771df5afcc3170f64a72ca6d.tar.gz
Allow nick change in chat room
-rw-r--r--src/command.c35
-rw-r--r--src/jabber.c14
-rw-r--r--src/jabber.h1
-rw-r--r--src/room_chat.c11
-rw-r--r--src/room_chat.h1
-rw-r--r--src/stanza.c11
-rw-r--r--src/stanza.h3
7 files changed, 76 insertions, 0 deletions
diff --git a/src/command.c b/src/command.c
index 15f13d65..83f37664 100644
--- a/src/command.c
+++ b/src/command.c
@@ -122,6 +122,7 @@ static gboolean _cmd_chat(gchar **args, struct cmd_help_t help);
 static gboolean _cmd_xa(gchar **args, struct cmd_help_t help);
 static gboolean _cmd_info(gchar **args, struct cmd_help_t help);
 static gboolean _cmd_wins(gchar **args, struct cmd_help_t help);
+static gboolean _cmd_nick(gchar **args, struct cmd_help_t help);
 
 /*
  * The commands are broken down into three groups:
@@ -227,6 +228,19 @@ static struct cmd_t main_commands[] =
           "Example : /join jdev@conference.jabber.org mynick",
           NULL } } },
 
+    { "/nick",
+        _cmd_nick, parse_args_with_freetext, 1, 1,
+        { "/nick [nickname]", "Change nickname in chat room.",
+        { "/nick [nickname]",
+          "------------------------",
+          "Change the name by which other member of a chat room see you.",
+          "This command is only valid when called within a chat room window.",
+          "The new nickname may contain spaces.",
+          "",
+          "Example : /nick kai hansen",
+          "Example : /nick bob",
+          NULL } } },
+
     { "/wins",
         _cmd_wins, parse_args, 0, 0,
         { "/wins", "List active windows.",
@@ -1238,6 +1252,27 @@ _cmd_join(gchar **args, struct cmd_help_t help)
 }
 
 static gboolean
+_cmd_nick(gchar **args, struct cmd_help_t help)
+{
+    jabber_conn_status_t conn_status = jabber_get_connection_status();
+
+    if (conn_status != JABBER_CONNECTED) {
+        cons_show("You are not currently connected.");
+        return TRUE;
+    }
+    if (!win_in_groupchat()) {
+        cons_show("You can only change your nickname in a chat room window.");
+        return TRUE;
+    }
+
+    char *room = win_get_recipient();
+    char *nick = args[0];
+    jabber_change_room_nick(room, nick);
+
+    return TRUE;
+}
+
+static gboolean
 _cmd_tiny(gchar **args, struct cmd_help_t help)
 {
     char *url = args[0];
diff --git a/src/jabber.c b/src/jabber.c
index e0b7a67c..a8b7aa44 100644
--- a/src/jabber.c
+++ b/src/jabber.c
@@ -267,6 +267,20 @@ jabber_join(const char * const room, const char * const nick)
 }
 
 void
+jabber_change_room_nick(const char * const room, const char * const nick)
+{
+    char *full_room_jid = room_create_full_room_jid(room, nick);
+    xmpp_stanza_t *presence = stanza_create_room_newnick_presence(jabber_conn.ctx,
+        full_room_jid);
+    xmpp_send(jabber_conn.conn, presence);
+    xmpp_stanza_release(presence);
+
+    room_change_nick(room, nick);
+
+    free(full_room_jid);
+}
+
+void
 jabber_leave_chat_room(const char * const room_jid)
 {
     char *nick = room_get_nick_for_room(room_jid);
diff --git a/src/jabber.h b/src/jabber.h
index 3b59552c..a31d3e4a 100644
--- a/src/jabber.h
+++ b/src/jabber.h
@@ -52,6 +52,7 @@ jabber_conn_status_t jabber_connect(const char * const user,
 void jabber_disconnect(void);
 void jabber_process_events(void);
 void jabber_join(const char * const room, const char * const nick);
+void jabber_change_room_nick(const char * const room, const char * const nick);
 void jabber_leave_chat_room(const char * const room_jid);
 void jabber_subscription(const char * const jid, jabber_subscr_t action);
 void jabber_send(const char * const msg, const char * const recipient);
diff --git a/src/room_chat.c b/src/room_chat.c
index 8e843f9a..cdadc529 100644
--- a/src/room_chat.c
+++ b/src/room_chat.c
@@ -57,6 +57,17 @@ room_join(const char * const room, const char * const nick)
 }
 
 void
+room_change_nick(const char * const room, const char * const nick)
+{
+    muc_room *chat_room = g_hash_table_lookup(rooms, room);
+
+    if (chat_room != NULL) {
+        free(chat_room->nick);
+        chat_room->nick = strdup(nick);
+    }
+}
+
+void
 room_leave(const char * const room)
 {
     g_hash_table_remove(rooms, room);
diff --git a/src/room_chat.h b/src/room_chat.h
index 02ef3a5e..d36c67b7 100644
--- a/src/room_chat.h
+++ b/src/room_chat.h
@@ -26,6 +26,7 @@
 #include <glib.h>
 
 void room_join(const char * const room, const char * const nick);
+void room_change_nick(const char * const room, const char * const nick);
 void room_leave(const char * const room);
 gboolean room_is_active(const char * const full_room_jid);
 char * room_get_nick_for_room(const char * const room);
diff --git a/src/stanza.c b/src/stanza.c
index 41d80d10..07e49d36 100644
--- a/src/stanza.c
+++ b/src/stanza.c
@@ -99,6 +99,17 @@ stanza_create_room_join_presence(xmpp_ctx_t *ctx,
 }
 
 xmpp_stanza_t *
+stanza_create_room_newnick_presence(xmpp_ctx_t *ctx,
+    const char * const full_room_jid)
+{
+    xmpp_stanza_t *presence = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
+    xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
+
+    return presence;
+}
+
+xmpp_stanza_t *
 stanza_create_room_leave_presence(xmpp_ctx_t *ctx, const char * const room,
     const char * const nick)
 {
diff --git a/src/stanza.h b/src/stanza.h
index 7fbe3d4d..310fca38 100644
--- a/src/stanza.h
+++ b/src/stanza.h
@@ -85,6 +85,9 @@ xmpp_stanza_t* stanza_create_message(xmpp_ctx_t *ctx,
 xmpp_stanza_t* stanza_create_room_join_presence(xmpp_ctx_t *ctx,
     const char * const full_room_jid);
 
+xmpp_stanza_t* stanza_create_room_newnick_presence(xmpp_ctx_t *ctx,
+    const char * const full_room_jid);
+
 xmpp_stanza_t* stanza_create_room_leave_presence(xmpp_ctx_t *ctx,
     const char * const room, const char * const nick);