diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-06-28 10:37:11 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-06-28 10:37:11 +0100 |
commit | 58646d9244557320ec811ee0b67519027170eede (patch) | |
tree | 8a384343e35895a7742a6e34117274a46d8ebc66 /irc_commands.c | |
parent | a670aeb34e4f3c4a1fd910aa5944fed4f9c20d7a (diff) |
Allow joining multiple channels at once. Although BitlBee doesn't advertise
support for this, irssi tries to do this anyway.
Diffstat (limited to 'irc_commands.c')
-rw-r--r-- | irc_commands.c | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/irc_commands.c b/irc_commands.c index 30518a99..bcb2fef2 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -127,30 +127,49 @@ static void irc_cmd_pong( irc_t *irc, char **cmd ) static void irc_cmd_join( irc_t *irc, char **cmd ) { - irc_channel_t *ic; - - if( ( ic = irc_channel_by_name( irc, cmd[1] ) ) == NULL ) - ic = irc_channel_new( irc, cmd[1] ); + char *comma, *s = cmd[1]; - if( ic == NULL ) + while( s ) { - irc_send_num( irc, 479, "%s :Invalid channel name", cmd[1] ); - return; + irc_channel_t *ic; + + if( ( comma = strchr( s, ',' ) ) ) + *comma = '\0'; + + if( ( ic = irc_channel_by_name( irc, s ) ) == NULL ) + ic = irc_channel_new( irc, s ); + + if( ic == NULL ) + { + irc_send_num( irc, 479, "%s :Invalid channel name", s ); + goto next; + } + + if( ic->flags & IRC_CHANNEL_JOINED ) + /* Dude, you're already there... + RFC doesn't have any reply for that though? */ + goto next; + + if( ic->f->join && !ic->f->join( ic ) ) + /* The story is: FALSE either means the handler + showed an error message, or is doing some work + before the join should be confirmed. (In the + latter case, the caller should take care of that + confirmation.) TRUE means all's good, let the + user join the channel right away. */ + goto next; + + irc_channel_add_user( ic, irc->user ); + +next: + if( comma ) + { + s = comma + 1; + *comma = ','; + } + else + break; } - - if( ic->flags & IRC_CHANNEL_JOINED ) - return; /* Dude, you're already there... - RFC doesn't have any reply for that though? */ - - if( ic->f->join && !ic->f->join( ic ) ) - /* The story is: FALSE either means the handler showed an error - message, or is doing some work before the join should be - confirmed. (In the latter case, the caller should take care - of that confirmation.) - TRUE means all's good, let the user join the channel right away. */ - return; - - irc_channel_add_user( ic, irc->user ); } static void irc_cmd_names( irc_t *irc, char **cmd ) |