about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-04-11 23:37:52 +0100
committerJames Booth <boothj5@gmail.com>2015-04-11 23:37:52 +0100
commita2ccd896465982bd6059ae7770532417b1062bdb (patch)
tree9f627a7f0ba5aace156d3cd5511b2ac3e66110e8
parentf18759192c1dd82385cfbc3edabea3e9a920e23c (diff)
downloadprofani-tty-a2ccd896465982bd6059ae7770532417b1062bdb.tar.gz
Autogenerate room name with UUID for /join with no args
-rw-r--r--configure.ac3
-rw-r--r--src/command/command.c13
-rw-r--r--src/command/commands.c21
-rw-r--r--src/xmpp/message.c4
-rw-r--r--tests/test_cmd_join.c17
-rw-r--r--tests/test_cmd_join.h1
-rw-r--r--tests/testsuite.c1
7 files changed, 32 insertions, 28 deletions
diff --git a/configure.ac b/configure.ac
index 0653ab68..1e2c6173 100644
--- a/configure.ac
+++ b/configure.ac
@@ -146,6 +146,9 @@ AS_IF([test "x$PLATFORM" != xosx],
             AC_SUBST(AM_LDFLAGS)],
         [AC_MSG_ERROR([libreadline is required for profanity])])])
 
+AC_CHECK_LIB([uuid], [uuid_generate], [],
+    [AC_MSG_ERROR([libuuid is required for profanity])])
+
 AS_IF([test "x$PLATFORM" = xosx], [LIBS="-lcurl $LIBS"])
 
 ### Check for desktop notification support
diff --git a/src/command/command.c b/src/command/command.c
index e165254e..d9b6a6e0 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -321,20 +321,21 @@ static struct cmd_t command_defs[] =
           NULL } } },
 
     { "/join",
-        cmd_join, parse_args, 1, 5, NULL,
-        { "/join room[@server] [nick value] [password value]", "Join a chat room.",
-        { "/join room[@server] [nick value] [password value]",
-          "-------------------------------------------------",
+        cmd_join, parse_args, 0, 5, NULL,
+        { "/join [room] [nick value] [password value]", "Join a chat room.",
+        { "/join [room] [nick value] [password value]",
+          "-----------------------------------------",
           "Join a chat room at the conference server.",
           "",
-          "room           : Bare room JID, the chat server is determined by the 'muc.service' account property, 'conference.<domainpart>' by default.",
-          "room@server    : Full room JID.",
+          "room           : Bare room JID (the chat server is determined by the 'muc.service' account property) or full room jid."
           "nick value     : Nickname to use in the room",
           "password value : Password if the room requires it.",
           "",
+          "If no room is supplied, a generated name will be used with the format private-chat-[UUID].",
           "If no nickname is specified the account preference 'muc.nick' will be used which by default is the localpart of your JID.",
           "If the room doesn't exist, and the server allows it, a new one will be created.",
           "",
+          "Example: /join",
           "Example: /join jdev@conference.jabber.org",
           "Example: /join jdev@conference.jabber.org nick mynick",
           "Example: /join private@conference.jabber.org nick mynick password mypassword",
diff --git a/src/command/commands.c b/src/command/commands.c
index 2699924b..79bc54af 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <assert.h>
+#include <uuid/uuid.h>
 #include <glib.h>
 
 #include "chat_session.h"
@@ -2070,8 +2071,24 @@ cmd_join(gchar **args, struct cmd_help_t help)
     }
 
     if (args[0] == NULL) {
-        cons_show("Usage: %s", help.usage);
-        cons_show("");
+        uuid_t uuid;
+        uuid_generate(uuid);
+        char *uuid_str = malloc(sizeof(char) * 37);
+        uuid_unparse_lower(uuid, uuid_str);
+
+        char *account_name = jabber_get_account_name();
+        ProfAccount *account = accounts_get_account(account_name);
+
+        GString *room_str = g_string_new("");
+        g_string_append_printf(room_str, "private-chat-%s@%s", uuid_str, account->muc_service);
+
+        presence_join_room(room_str->str, account->muc_nick, NULL);
+        muc_join(room_str->str, account->muc_nick, NULL, FALSE);
+
+        g_string_free(room_str, TRUE);
+        free(uuid_str);
+        account_free(account);
+
         return TRUE;
     }
 
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 02c748d9..323c653c 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -342,7 +342,9 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
 
         char *password = NULL;
         xmpp_stanza_t *password_st = xmpp_stanza_get_child_by_name(xns_muc_user, STANZA_NAME_PASSWORD);
-        password = xmpp_stanza_get_text(password_st);
+        if (password_st) {
+            password = xmpp_stanza_get_text(password_st);
+        }
 
         handle_room_invite(INVITE_MEDIATED, invitor, room, reason, password);
         jid_destroy(jidp);
diff --git a/tests/test_cmd_join.c b/tests/test_cmd_join.c
index 10ffa547..19824b3a 100644
--- a/tests/test_cmd_join.c
+++ b/tests/test_cmd_join.c
@@ -50,23 +50,6 @@ void cmd_join_shows_message_when_undefined(void **state)
     test_with_connection_status(JABBER_UNDEFINED);
 }
 
-void cmd_join_shows_usage_when_no_args(void **state)
-{
-    CommandHelp *help = malloc(sizeof(CommandHelp));
-    help->usage = "some usage";
-    gchar *args[] = { NULL };
-
-    will_return(jabber_get_connection_status, JABBER_CONNECTED);
-
-    expect_cons_show("Usage: some usage");
-    expect_cons_show("");
-
-    gboolean result = cmd_join(args, *help);
-    assert_true(result);
-
-    free(help);
-}
-
 void cmd_join_shows_error_message_when_invalid_room_jid(void **state)
 {
     CommandHelp *help = malloc(sizeof(CommandHelp));
diff --git a/tests/test_cmd_join.h b/tests/test_cmd_join.h
index 812aee87..a96fa435 100644
--- a/tests/test_cmd_join.h
+++ b/tests/test_cmd_join.h
@@ -2,7 +2,6 @@ void cmd_join_shows_message_when_disconnecting(void **state);
 void cmd_join_shows_message_when_connecting(void **state);
 void cmd_join_shows_message_when_disconnected(void **state);
 void cmd_join_shows_message_when_undefined(void **state);
-void cmd_join_shows_usage_when_no_args(void **state);
 void cmd_join_shows_error_message_when_invalid_room_jid(void **state);
 void cmd_join_uses_account_mucservice_when_no_service_specified(void **state);
 void cmd_join_uses_supplied_nick(void **state);
diff --git a/tests/testsuite.c b/tests/testsuite.c
index 78d7b570..15682d1f 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -563,7 +563,6 @@ int main(int argc, char* argv[]) {
         unit_test(cmd_join_shows_message_when_connecting),
         unit_test(cmd_join_shows_message_when_disconnected),
         unit_test(cmd_join_shows_message_when_undefined),
-        unit_test(cmd_join_shows_usage_when_no_args),
         unit_test(cmd_join_shows_error_message_when_invalid_room_jid),
         unit_test(cmd_join_uses_account_mucservice_when_no_service_specified),
         unit_test(cmd_join_uses_supplied_nick),