diff options
author | Jilles Tjoelker <jilles@irssi.org> | 2009-02-27 14:32:33 +0000 |
---|---|---|
committer | jilles <jilles@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2009-02-27 14:32:33 +0000 |
commit | c57f58dea5dbbd9b5b1e8861d9a37dfa1c62b98a (patch) | |
tree | 7562fcf61d481c744ff34d19fb3082794096f9e7 /src/fe-common | |
parent | d979a991c8306b74838062a2f87547ea22dc298f (diff) | |
download | irssi-c57f58dea5dbbd9b5b1e8861d9a37dfa1c62b98a.zip |
Move to a single /join function, avoiding confusion on "/join -window".
patch by exg
bug #644, thanks for the useful bug report
git-svn-id: file:///var/www/svn.irssi.org/SVN/irssi/trunk@5023 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-common')
-rw-r--r-- | src/fe-common/core/fe-channels.c | 84 | ||||
-rw-r--r-- | src/fe-common/core/fe-core-commands.c | 26 |
2 files changed, 33 insertions, 77 deletions
diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c index 061d68ca..75147fdb 100644 --- a/src/fe-common/core/fe-channels.c +++ b/src/fe-common/core/fe-channels.c @@ -110,47 +110,31 @@ static void sig_channel_joined(CHANNEL_REC *channel) fe_channels_nicklist(channel, CHANNEL_NICKLIST_FLAG_ALL); } -static void cmd_wjoin_pre(const char *data, SERVER_REC *server) -{ - GHashTable *optlist; - char *nick; - void *free_arg; - - if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | - PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, - "join", &optlist, &nick)) - return; - - /* kludge for /join -invite -window if there is no invite */ - if (g_hash_table_lookup(optlist, "invite") && - server != NULL && server->last_invite == NULL) { - cmd_params_free(free_arg); - return; - } - if (g_hash_table_lookup(optlist, "window") != NULL) { - signal_add("channel created", - (SIGNAL_FUNC) signal_channel_created_curwin); - } - cmd_params_free(free_arg); -} - +/* SYNTAX: JOIN [-window] [-invite] [-<server tag>] <channels> [<keys>] */ static void cmd_join(const char *data, SERVER_REC *server) { WINDOW_REC *window; CHANNEL_REC *channel; GHashTable *optlist; - char *channelname; + char *pdata; + int invite; + int samewindow; void *free_arg; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | - PARAM_FLAG_UNKNOWN_OPTIONS, - "join", &optlist, &channelname)) + PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, + "join", &optlist, &pdata)) return; + invite = g_hash_table_lookup(optlist, "invite") != NULL; + samewindow = g_hash_table_lookup(optlist, "window") != NULL; + if (!invite && *pdata == '\0') + cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); + /* -<server tag> */ server = cmd_options_get_server("join", optlist, server); - - channel = channel_find(server, channelname); + + channel = channel_find(server, pdata); if (channel != NULL) { /* already joined to channel, set it active */ window = window_item_window(channel); @@ -159,23 +143,25 @@ static void cmd_join(const char *data, SERVER_REC *server) window_item_set_active(active_win, (WI_ITEM_REC *) channel); } - cmd_params_free(free_arg); -} - -static void cmd_wjoin_post(const char *data) -{ - GHashTable *optlist; - char *nick; - void *free_arg; - - if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | - PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, - "join", &optlist, &nick)) - return; - - if (g_hash_table_lookup(optlist, "window") != NULL) { - signal_remove("channel created", - (SIGNAL_FUNC) signal_channel_created_curwin); + else { + if (server == NULL || !server->connected) + cmd_param_error(CMDERR_NOT_CONNECTED); + if (invite) { + if (server->last_invite == NULL) { + printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_NOT_INVITED); + signal_stop(); + cmd_params_free(free_arg); + return; + } + pdata = server->last_invite; + } + if (samewindow) + signal_add("channel created", + (SIGNAL_FUNC) signal_channel_created_curwin); + server->channels_join(server, pdata, FALSE); + if (samewindow) + signal_remove("channel created", + (SIGNAL_FUNC) signal_channel_created_curwin); } cmd_params_free(free_arg); } @@ -632,9 +618,7 @@ void fe_channels_init(void) signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected); signal_add_last("channel joined", (SIGNAL_FUNC) sig_channel_joined); - command_bind_first("join", NULL, (SIGNAL_FUNC) cmd_wjoin_pre); command_bind("join", NULL, (SIGNAL_FUNC) cmd_join); - command_bind_last("join", NULL, (SIGNAL_FUNC) cmd_wjoin_post); command_bind("channel", NULL, (SIGNAL_FUNC) cmd_channel); command_bind("channel add", NULL, (SIGNAL_FUNC) cmd_channel_add); command_bind("channel remove", NULL, (SIGNAL_FUNC) cmd_channel_remove); @@ -644,7 +628,7 @@ void fe_channels_init(void) command_set_options("channel add", "auto noauto -bots -botcmd"); command_set_options("names", "count ops halfops voices normal"); - command_set_options("join", "window"); + command_set_options("join", "invite window"); } void fe_channels_deinit(void) @@ -655,9 +639,7 @@ void fe_channels_deinit(void) signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected); signal_remove("channel joined", (SIGNAL_FUNC) sig_channel_joined); - command_unbind("join", (SIGNAL_FUNC) cmd_wjoin_pre); command_unbind("join", (SIGNAL_FUNC) cmd_join); - command_unbind("join", (SIGNAL_FUNC) cmd_wjoin_post); command_unbind("channel", (SIGNAL_FUNC) cmd_channel); command_unbind("channel add", (SIGNAL_FUNC) cmd_channel_add); command_unbind("channel remove", (SIGNAL_FUNC) cmd_channel_remove); diff --git a/src/fe-common/core/fe-core-commands.c b/src/fe-common/core/fe-core-commands.c index d991b1a7..5caf87d3 100644 --- a/src/fe-common/core/fe-core-commands.c +++ b/src/fe-common/core/fe-core-commands.c @@ -169,30 +169,6 @@ static void cmd_nick(const char *data, SERVER_REC *server) signal_stop(); } -static void cmd_join(const char *data, SERVER_REC *server) -{ - GHashTable *optlist; - char *channels; - void *free_arg; - - g_return_if_fail(data != NULL); - - if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | - PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, - "join", &optlist, &channels)) - return; - - server = cmd_options_get_server("join", optlist, server); - if (g_hash_table_lookup(optlist, "invite") && - server != NULL && server->last_invite == NULL) { - /* ..all this trouble just to print this error message */ - printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_NOT_INVITED); - signal_stop(); - } - - cmd_params_free(free_arg); -} - /* SYNTAX: UPTIME */ static void cmd_uptime(char *data) { @@ -344,7 +320,6 @@ void fe_core_commands_init(void) command_bind("beep", NULL, (SIGNAL_FUNC) cmd_beep); command_bind("uptime", NULL, (SIGNAL_FUNC) cmd_uptime); command_bind_first("nick", NULL, (SIGNAL_FUNC) cmd_nick); - command_bind_first("join", NULL, (SIGNAL_FUNC) cmd_join); signal_add("send command", (SIGNAL_FUNC) event_command); signal_add_last("send command", (SIGNAL_FUNC) event_command_last); @@ -363,7 +338,6 @@ void fe_core_commands_deinit(void) command_unbind("beep", (SIGNAL_FUNC) cmd_beep); command_unbind("uptime", (SIGNAL_FUNC) cmd_uptime); command_unbind("nick", (SIGNAL_FUNC) cmd_nick); - command_unbind("join", (SIGNAL_FUNC) cmd_join); signal_remove("send command", (SIGNAL_FUNC) event_command); signal_remove("send command", (SIGNAL_FUNC) event_command_last); |