diff options
Diffstat (limited to 'src/command')
-rw-r--r-- | src/command/command.c | 27 | ||||
-rw-r--r-- | src/command/commands.c | 91 |
2 files changed, 65 insertions, 53 deletions
diff --git a/src/command/command.c b/src/command/command.c index 9fc7f9e5..131f861e 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -300,12 +300,19 @@ static struct cmd_t command_defs[] = NULL } } }, { "/bookmark", - cmd_bookmark, parse_args, 0, 4, NULL, - { "/bookmark [add|list|remove] [room@server] [autojoin] [nick]", - "Manage bookmarks.", - { "/bookmark [add|list|remove] [room@server] [autojoin] [nick]", + cmd_bookmark, parse_args, 1, 8, NULL, + { "/bookmark list|add|update|remove|join [room@server] [nick value] [password value] [autojoin on|off]", "Manage bookmarks.", + { "/bookmark list|add|update|remove|join [room@server] [nick value] [password value] [autojoin on|off]", "-----------------------------------------------------------", "Manage bookmarks.", + "list: List all bookmarks.", + "add: Add a bookmark for room@server with the following optional properties:", + " nick: Nickname used in the chat room", + " password: Password for private rooms, note this may be stored in plaintext on your server", + " autojoin: Whether to join the room automatically on login \"on\" or \"off\".", + "update: Update any of the above properties associated with the bookmark.", + "remove: Remove the bookmark for room@server.", + "join: Join room@server using the properties associated with the bookmark.", NULL } } }, { "/disco", @@ -1057,9 +1064,11 @@ cmd_init(void) autocomplete_add(who_ac, "any"); bookmark_ac = autocomplete_new(); - autocomplete_add(bookmark_ac, "add"); autocomplete_add(bookmark_ac, "list"); + autocomplete_add(bookmark_ac, "add"); + autocomplete_add(bookmark_ac, "update"); autocomplete_add(bookmark_ac, "remove"); + autocomplete_add(bookmark_ac, "join"); otr_ac = autocomplete_new(); autocomplete_add(otr_ac, "gen"); @@ -1651,11 +1660,15 @@ _bookmark_autocomplete(char *input, int *size) return result; } - result = autocomplete_param_with_func(input, size, "/bookmark list", bookmark_find); + result = autocomplete_param_with_func(input, size, "/bookmark remove", bookmark_find); if (result != NULL) { return result; } - result = autocomplete_param_with_func(input, size, "/bookmark remove", bookmark_find); + result = autocomplete_param_with_func(input, size, "/bookmark join", bookmark_find); + if (result != NULL) { + return result; + } + result = autocomplete_param_with_func(input, size, "/bookmark update", bookmark_find); if (result != NULL) { return result; } diff --git a/src/command/commands.c b/src/command/commands.c index ad508cc7..8a1b66bf 100644 --- a/src/command/commands.c +++ b/src/command/commands.c @@ -1734,77 +1734,76 @@ cmd_bookmark(gchar **args, struct cmd_help_t help) return TRUE; } - /* TODO: /bookmark list room@server */ - if (strcmp(cmd, "list") == 0) { const GList *bookmarks = bookmark_get_list(); cons_show_bookmarks(bookmarks); } else { - gboolean autojoin = FALSE; - gchar *jid = NULL; - gchar *nick = NULL; - int idx = 1; - - while (args[idx] != NULL) { - gchar *opt = args[idx]; - - if (strcmp(opt, "autojoin") == 0) { - autojoin = TRUE; - } else if (jid == NULL) { - jid = opt; - } else if (nick == NULL) { - nick = opt; + char *jid = args[1]; + if (jid == NULL) { + cons_show("Usage: %s", help.usage); + cons_show(""); + return TRUE; + } + + if (strcmp(cmd, "remove") == 0) { + gboolean removed = bookmark_remove(jid); + if (removed) { + cons_show("Bookmark removed for %s.", jid); } else { - cons_show("Usage: %s", help.usage); + cons_show("No bookmark exists for %s.", jid); } + return TRUE; + } - ++idx; + if (strcmp(cmd, "join") == 0) { + gboolean joined = bookmark_join(jid); + if (!joined) { + cons_show("No bookmark exists for %s.", jid); + } + return TRUE; } - if (jid == NULL) { - win_type_t win_type = ui_current_win_type(); + gchar *opt_keys[] = { "autojoin", "nick", "password", NULL }; + gboolean parsed; - if (win_type == WIN_MUC) { - jid = ui_current_recipient(); - nick = muc_get_room_nick(jid); - } else { + GHashTable *options = parse_options(&args[2], opt_keys, &parsed); + if (!parsed) { + cons_show("Usage: %s", help.usage); + cons_show(""); + return TRUE; + } + + char *nick = g_hash_table_lookup(options, "nick"); + char *password = g_hash_table_lookup(options, "password"); + char *autojoin = g_hash_table_lookup(options, "autojoin"); + + if (autojoin != NULL) { + if ((strcmp(autojoin, "on") != 0) && (strcmp(autojoin, "off") != 0)) { cons_show("Usage: %s", help.usage); + cons_show(""); return TRUE; } } if (strcmp(cmd, "add") == 0) { - gboolean added = bookmark_add(jid, nick, autojoin); + gboolean added = bookmark_add(jid, nick, password, autojoin); if (added) { - GString *msg = g_string_new("Bookmark added for "); - g_string_append(msg, jid); - if (nick != NULL) { - g_string_append(msg, ", nickname: "); - g_string_append(msg, nick); - } - if (autojoin) { - g_string_append(msg, ", autojoin enabled"); - } - g_string_append(msg, "."); - cons_show(msg->str); - g_string_free(msg, TRUE); + cons_show("Bookmark added for %s.", jid); } else { - cons_show("Bookmark updated for %s.", jid); + cons_show("Bookmark already exists, use /bookmark update to edit."); } - } else if (strcmp(cmd, "remove") == 0) { - gboolean removed = bookmark_remove(jid, autojoin); - if (removed) { - if (autojoin) { - cons_show("Autojoin disabled for %s.", jid); - } else { - cons_show("Bookmark removed for %s.", jid); - } + } else if (strcmp(cmd, "update") == 0) { + gboolean updated = bookmark_update(jid, nick, password, autojoin); + if (updated) { + cons_show("Bookmark updated."); } else { cons_show("No bookmark exists for %s.", jid); } } else { cons_show("Usage: %s", help.usage); } + + options_destroy(options); } return TRUE; |