diff --git a/configure.ac b/configure.ac index 2e9929e7..4da11e9e 100644 --- a/configure.ac +++ b/configure.ac @@ -272,6 +272,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 429c596a..a3b02197 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -322,20 +322,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.' 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 da34ff09..a8bebdaa 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include "chat_session.h" @@ -2103,8 +2104,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 307a1bd5..1a49ebfd 100644 --- a/tests/testsuite.c +++ b/tests/testsuite.c @@ -562,7 +562,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),