diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-04 11:16:07 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-04 11:16:07 +0100 |
commit | c8eeadd72286b87cc1638e388669e00e8c8b9f1e (patch) | |
tree | eba8580124c02c2229a6158cd8a85aa010c7f523 /irc_channel.c | |
parent | 0bd948edfea280cf9f05e21cd5bef4b7fdf3335c (diff) |
Added automatic joining of channels. Auto-rejoin functionality for
groupchats not reimplemented yet but that's the next step.
Diffstat (limited to 'irc_channel.c')
-rw-r--r-- | irc_channel.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/irc_channel.c b/irc_channel.c index ffcfbffb..4aec9077 100644 --- a/irc_channel.c +++ b/irc_channel.c @@ -47,6 +47,7 @@ irc_channel_t *irc_channel_new( irc_t *irc, const char *name ) irc->channels = g_slist_append( irc->channels, ic ); + set_add( &ic->set, "auto_join", "false", set_eval_bool, ic ); set_add( &ic->set, "type", "control", set_eval_channel_type, ic ); if( name[0] == '&' ) @@ -308,6 +309,45 @@ void irc_channel_user_set_mode( irc_channel_t *ic, irc_user_t *iu, irc_channel_u icu->flags = flags; } +void irc_channel_auto_joins( irc_t *irc, account_t *acc ) +{ + GSList *l; + + for( l = irc->channels; l; l = l->next ) + { + irc_channel_t *ic = l->data; + gboolean aj = set_getbool( &ic->set, "auto_join" ); + char *type; + + if( acc && + ( type = set_getstr( &ic->set, "chat_type" ) ) && + strcmp( type, "room" ) == 0 ) + { + /* Bit of an ugly special case: Handle chatrooms here, we + can only auto-join them if their account is online. */ + char *acc_s; + + if( !aj && !( ic->flags & IRC_CHANNEL_JOINED ) ) + /* Only continue if this one's marked as auto_join + or if we're in it already. (Possible if the + client auto-rejoined it before identyfing.) */ + continue; + else if( !( acc_s = set_getstr( &ic->set, "account" ) ) ) + continue; + else if( account_get( irc->b, acc_s ) != acc ) + continue; + else if( acc->ic == NULL || !( acc->ic->flags & OPT_LOGGED_IN ) ) + continue; + else + ic->f->join( ic ); + } + else if( aj ) + { + irc_channel_add_user( ic, irc->user ); + } + } +} + void irc_channel_printf( irc_channel_t *ic, char *format, ... ) { va_list params; @@ -524,6 +564,13 @@ static gboolean control_channel_init( irc_channel_t *ic ) return TRUE; } +static gboolean control_channel_join( irc_channel_t *ic ) +{ + bee_irc_channel_update( ic->irc, ic, NULL ); + + return TRUE; +} + static char *set_eval_by_account( set_t *set, char *value ) { struct irc_channel *ic = set->data; @@ -607,7 +654,7 @@ static gboolean control_channel_free( irc_channel_t *ic ) static const struct irc_channel_funcs control_channel_funcs = { control_channel_privmsg, - NULL, + control_channel_join, NULL, NULL, control_channel_invite, |