1
1
mirror of https://github.com/profanity-im/profanity.git synced 2025-02-02 15:08:15 -05:00

Split /room and /form commands

This commit is contained in:
James Booth 2014-09-15 21:33:25 +01:00
parent dc103d88d7
commit 529b4f175b
3 changed files with 307 additions and 306 deletions

View File

@ -87,7 +87,7 @@ static char * _statuses_autocomplete(char *input, int *size);
static char * _alias_autocomplete(char *input, int *size); static char * _alias_autocomplete(char *input, int *size);
static char * _join_autocomplete(char *input, int *size); static char * _join_autocomplete(char *input, int *size);
static char * _log_autocomplete(char *input, int *size); static char * _log_autocomplete(char *input, int *size);
static char * _room_autocomplete(char *input, int *size); static char * _form_autocomplete(char *input, int *size);
GHashTable *commands = NULL; GHashTable *commands = NULL;
@ -306,18 +306,25 @@ static struct cmd_t command_defs[] =
NULL } } }, NULL } } },
{ "/room", { "/room",
cmd_room, parse_args, 1, 3, NULL, cmd_room, parse_args, 1, 1, NULL,
{ "/room config accept|destroy|config|submit|cancel|set|add|remove [tag value]", "Room configuration.", { "/room accept|destroy|config", "Room configuration.",
{ "/room config accept|destroy|config|submit|cancel|set|add|remove [tag value]", { "/room accept|destroy|config",
"---------------------------------------------------------------------------", "---------------------------",
"config accept - Accept default room configuration.", "accept - Accept default room configuration.",
"config destroy - Cancel default room configuration.", "destroy - Reject default room configuration.",
"config config - Edit room configuration.", "config - Edit room configuration.",
"config submit - Cancel room configuration.", NULL } } },
"config cancel - Cancel room configuration.",
"config set tag value - Set room configuration field to value.", { "/form",
"config add tag value - Add value to room configuration field.", cmd_form, parse_args, 1, 3, NULL,
"config remove tag value - Remove value from room configuration field.", { "/form submit|cancel|set|add|remove [tag value]", "Form manipulation.",
{ "/form submit|cancel|set|add|remove [tag value]",
"----------------------------------------------",
"set tag value - Set tagged form field to value.",
"add tag value - Add value to tagged form field.",
"remove tag value - Remove value from tagged form field.",
"submit - Submit the current form.",
"cancel - Cancel changes to the current form.",
NULL } } }, NULL } } },
{ "/rooms", { "/rooms",
@ -961,6 +968,7 @@ static Autocomplete alias_ac;
static Autocomplete aliases_ac; static Autocomplete aliases_ac;
static Autocomplete join_property_ac; static Autocomplete join_property_ac;
static Autocomplete room_ac; static Autocomplete room_ac;
static Autocomplete form_ac;
/* /*
* Initialise command autocompleter and history * Initialise command autocompleter and history
@ -1216,11 +1224,13 @@ cmd_init(void)
autocomplete_add(room_ac, "accept"); autocomplete_add(room_ac, "accept");
autocomplete_add(room_ac, "destroy"); autocomplete_add(room_ac, "destroy");
autocomplete_add(room_ac, "config"); autocomplete_add(room_ac, "config");
autocomplete_add(room_ac, "submit");
autocomplete_add(room_ac, "cancel"); form_ac = autocomplete_new();
autocomplete_add(room_ac, "set"); autocomplete_add(form_ac, "submit");
autocomplete_add(room_ac, "add"); autocomplete_add(form_ac, "cancel");
autocomplete_add(room_ac, "remove"); autocomplete_add(form_ac, "set");
autocomplete_add(form_ac, "add");
autocomplete_add(form_ac, "remove");
cmd_history_init(); cmd_history_init();
} }
@ -1266,6 +1276,7 @@ cmd_uninit(void)
autocomplete_free(aliases_ac); autocomplete_free(aliases_ac);
autocomplete_free(join_property_ac); autocomplete_free(join_property_ac);
autocomplete_free(room_ac); autocomplete_free(room_ac);
autocomplete_free(form_ac);
} }
gboolean gboolean
@ -1390,6 +1401,7 @@ cmd_reset_autocomplete()
autocomplete_reset(aliases_ac); autocomplete_reset(aliases_ac);
autocomplete_reset(join_property_ac); autocomplete_reset(join_property_ac);
autocomplete_reset(room_ac); autocomplete_reset(room_ac);
autocomplete_reset(form_ac);
bookmark_autocomplete_reset(); bookmark_autocomplete_reset();
} }
@ -1639,8 +1651,8 @@ _cmd_complete_parameters(char *input, int *size)
} }
} }
gchar *cmds[] = { "/help", "/prefs", "/disco", "/close", "/wins" }; gchar *cmds[] = { "/help", "/prefs", "/disco", "/close", "/wins", "/room" };
Autocomplete completers[] = { help_ac, prefs_ac, disco_ac, close_ac, wins_ac }; Autocomplete completers[] = { help_ac, prefs_ac, disco_ac, close_ac, wins_ac, room_ac };
for (i = 0; i < ARRAY_SIZE(cmds); i++) { for (i = 0; i < ARRAY_SIZE(cmds); i++) {
result = autocomplete_param_with_ac(input, size, cmds[i], completers[i], TRUE); result = autocomplete_param_with_ac(input, size, cmds[i], completers[i], TRUE);
@ -1668,7 +1680,7 @@ _cmd_complete_parameters(char *input, int *size)
g_hash_table_insert(ac_funcs, "/statuses", _statuses_autocomplete); g_hash_table_insert(ac_funcs, "/statuses", _statuses_autocomplete);
g_hash_table_insert(ac_funcs, "/alias", _alias_autocomplete); g_hash_table_insert(ac_funcs, "/alias", _alias_autocomplete);
g_hash_table_insert(ac_funcs, "/join", _join_autocomplete); g_hash_table_insert(ac_funcs, "/join", _join_autocomplete);
g_hash_table_insert(ac_funcs, "/room", _room_autocomplete); g_hash_table_insert(ac_funcs, "/form", _form_autocomplete);
char parsed[*size+1]; char parsed[*size+1];
i = 0; i = 0;
@ -2079,7 +2091,7 @@ _theme_autocomplete(char *input, int *size)
} }
static char * static char *
_room_autocomplete(char *input, int *size) _form_autocomplete(char *input, int *size)
{ {
char *result = NULL; char *result = NULL;
@ -2087,22 +2099,22 @@ _room_autocomplete(char *input, int *size)
if (current != NULL) { if (current != NULL) {
DataForm *form = current->form; DataForm *form = current->form;
if (form != NULL) { if (form != NULL) {
result = autocomplete_param_with_ac(input, size, "/room set", form->tag_ac, TRUE); result = autocomplete_param_with_ac(input, size, "/form set", form->tag_ac, TRUE);
if (result != NULL) { if (result != NULL) {
return result; return result;
} }
result = autocomplete_param_with_ac(input, size, "/room add", form->tag_ac, TRUE); result = autocomplete_param_with_ac(input, size, "/form add", form->tag_ac, TRUE);
if (result != NULL) { if (result != NULL) {
return result; return result;
} }
result = autocomplete_param_with_ac(input, size, "/room remove", form->tag_ac, TRUE); result = autocomplete_param_with_ac(input, size, "/form remove", form->tag_ac, TRUE);
if (result != NULL) { if (result != NULL) {
return result; return result;
} }
} }
} }
result = autocomplete_param_with_ac(input, size, "/room", room_ac, TRUE); result = autocomplete_param_with_ac(input, size, "/form", form_ac, TRUE);
if (result != NULL) { if (result != NULL) {
return result; return result;
} }

View File

@ -1788,7 +1788,7 @@ cmd_decline(gchar **args, struct cmd_help_t help)
} }
gboolean gboolean
cmd_room(gchar **args, struct cmd_help_t help) cmd_form(gchar **args, struct cmd_help_t help)
{ {
jabber_conn_status_t conn_status = jabber_get_connection_status(); jabber_conn_status_t conn_status = jabber_get_connection_status();
@ -1797,102 +1797,25 @@ cmd_room(gchar **args, struct cmd_help_t help)
return TRUE; return TRUE;
} }
// room command allowed in window
win_type_t win_type = ui_current_win_type(); win_type_t win_type = ui_current_win_type();
if (win_type != WIN_MUC && win_type != WIN_MUC_CONFIG) { if (win_type != WIN_MUC_CONFIG) {
cons_show("Command '/room' does not apply to this window."); cons_show("Command '/form' does not apply to this window.");
return TRUE; return TRUE;
} }
// validate subcommand if ((g_strcmp0(args[0], "submit") != 0) &&
if ((g_strcmp0(args[0], "accept") != 0) && (g_strcmp0(args[0], "cancel") != 0) &&
(g_strcmp0(args[0], "destroy") != 0) &&
(g_strcmp0(args[0], "config") != 0) &&
(g_strcmp0(args[0], "submit") != 0) &&
(g_strcmp0(args[0], "set") != 0) && (g_strcmp0(args[0], "set") != 0) &&
(g_strcmp0(args[0], "add") != 0) && (g_strcmp0(args[0], "add") != 0) &&
(g_strcmp0(args[0], "remove") != 0) && (g_strcmp0(args[0], "remove") != 0)) {
(g_strcmp0(args[0], "cancel") != 0)) {
cons_show("Usage: %s", help.usage); cons_show("Usage: %s", help.usage);
return TRUE; return TRUE;
} }
// validate subcommand for window type char *recipient = ui_current_recipient();
if (win_type == WIN_MUC &&
((g_strcmp0(args[0], "submit") == 0) ||
(g_strcmp0(args[0], "cancel") == 0) ||
(g_strcmp0(args[0], "add") == 0) ||
(g_strcmp0(args[0], "remove") == 0) ||
(g_strcmp0(args[0], "set") == 0))) {
cons_show("Command '/room %s' only allowed in room configuration windows.", args[0]);
return TRUE;
}
if (win_type == WIN_MUC_CONFIG &&
((g_strcmp0(args[0], "accept") == 0) ||
(g_strcmp0(args[0], "destroy") == 0) ||
(g_strcmp0(args[0], "config") == 0))) {
cons_show("Command '/room %s' only allowed in chat room windows.", args[0]);
return TRUE;
}
char *room = ui_current_recipient();
ProfWin *window = wins_get_by_recipient(room);
int num = wins_get_num(window);
// commands available in room
if ((g_strcmp0(args[0], "accept") == 0) ||
(g_strcmp0(args[0], "destroy") == 0) ||
(g_strcmp0(args[0], "config") == 0)) {
int ui_index = num;
if (ui_index == 10) {
ui_index = 0;
}
if (g_strcmp0(args[0], "accept") == 0) {
gboolean requires_config = muc_requires_config(room);
if (!requires_config) {
win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Current room does not require configuration.");
return TRUE;
} else {
iq_confirm_instant_room(room);
muc_set_requires_config(room, FALSE);
win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Room unlocked.");
cons_show("Room unlocked: %s (%d)", room, ui_index);
return TRUE;
}
}
if (g_strcmp0(args[0], "destroy") == 0) {
iq_destroy_instant_room(room);
return TRUE;
}
if (g_strcmp0(args[0], "config") == 0) {
GString *win_title = g_string_new(room);
g_string_append(win_title, " config");
ProfWin *window = wins_get_by_recipient(win_title->str);
g_string_free(win_title, TRUE);
if (window != NULL) {
num = wins_get_num(window);
ui_switch_win(num);
} else {
iq_request_room_config_form(room);
}
return TRUE;
}
}
// commands allowed in room config
if ((g_strcmp0(args[0], "submit") == 0) ||
(g_strcmp0(args[0], "cancel") == 0) ||
(g_strcmp0(args[0], "add") == 0) ||
(g_strcmp0(args[0], "remove") == 0) ||
(g_strcmp0(args[0], "set") == 0)) {
ProfWin *current = wins_get_current(); ProfWin *current = wins_get_current();
gchar **split_recipient = g_strsplit(room, " ", 2); gchar **split_recipient = g_strsplit(recipient, " ", 2);
room = split_recipient[0]; char *room = split_recipient[0];
if (g_strcmp0(args[0], "submit") == 0) { if (g_strcmp0(args[0], "submit") == 0) {
iq_submit_room_config(room, current->form); iq_submit_room_config(room, current->form);
@ -2095,7 +2018,7 @@ cmd_room(gchar **args, struct cmd_help_t help)
if (current == NULL) { if (current == NULL) {
current = wins_get_console(); current = wins_get_console();
} }
num = wins_get_num(current); int num = wins_get_num(current);
ui_switch_win(num); ui_switch_win(num);
} }
@ -2104,6 +2027,71 @@ cmd_room(gchar **args, struct cmd_help_t help)
return TRUE; return TRUE;
} }
gboolean
cmd_room(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;
}
win_type_t win_type = ui_current_win_type();
if (win_type != WIN_MUC) {
cons_show("Command '/room' does not apply to this window.");
return TRUE;
}
if ((g_strcmp0(args[0], "accept") != 0) &&
(g_strcmp0(args[0], "destroy") != 0) &&
(g_strcmp0(args[0], "config") != 0)) {
cons_show("Usage: %s", help.usage);
return TRUE;
}
char *room = ui_current_recipient();
ProfWin *window = wins_get_by_recipient(room);
int num = wins_get_num(window);
int ui_index = num;
if (ui_index == 10) {
ui_index = 0;
}
if (g_strcmp0(args[0], "accept") == 0) {
gboolean requires_config = muc_requires_config(room);
if (!requires_config) {
win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Current room does not require configuration.");
return TRUE;
} else {
iq_confirm_instant_room(room);
muc_set_requires_config(room, FALSE);
win_save_vprint(window, '!', NULL, 0, COLOUR_ROOMINFO, "", "Room unlocked.");
cons_show("Room unlocked: %s (%d)", room, ui_index);
return TRUE;
}
}
if (g_strcmp0(args[0], "destroy") == 0) {
iq_destroy_instant_room(room);
return TRUE;
}
if (g_strcmp0(args[0], "config") == 0) {
GString *win_title = g_string_new(room);
g_string_append(win_title, " config");
ProfWin *window = wins_get_by_recipient(win_title->str);
g_string_free(win_title, TRUE);
if (window != NULL) {
num = wins_get_num(window);
ui_switch_win(num);
} else {
iq_request_room_config_form(room);
}
return TRUE;
}
return TRUE; return TRUE;
} }

View File

@ -125,5 +125,6 @@ gboolean cmd_xa(gchar **args, struct cmd_help_t help);
gboolean cmd_alias(gchar **args, struct cmd_help_t help); gboolean cmd_alias(gchar **args, struct cmd_help_t help);
gboolean cmd_xmlconsole(gchar **args, struct cmd_help_t help); gboolean cmd_xmlconsole(gchar **args, struct cmd_help_t help);
gboolean cmd_ping(gchar **args, struct cmd_help_t help); gboolean cmd_ping(gchar **args, struct cmd_help_t help);
gboolean cmd_form(gchar **args, struct cmd_help_t help);
#endif #endif