[FEATURE] autojoin_on_kick in connection blocks

true by default
This commit is contained in:
Arnaud Cornet 2009-01-21 17:24:54 +01:00
parent afefc9a3d4
commit 170d4d1e00
7 changed files with 31 additions and 4 deletions

View File

@ -280,6 +280,11 @@ If set to true, when you change nick, BIP stores the new nickname as the new
default nickname value. Thus, if you are disconnected from the server, BIP will
restore the correct nickname.
.TP
\fBautojoin_on_kick\fP (default: \fBtrue\fP)
If set to false bip will not attempt to re-join a channel from which you were
kicked.
.TP
\fBignore_first_nick\fP (default: \fBfalse\fP)
If set to true, BIP will ignore the nickname sent by the client upon connect.

View File

@ -196,6 +196,8 @@ user {
#follow_nick = true;
#ignore_first_nick = true;
#autojoin_on_kick = false;
# Autojoined channels:
channel { name = "#bip"; };
# Password protected channel

View File

@ -548,6 +548,9 @@ static int add_connection(bip_t *bip, struct user *user, list_t *data)
}
list_free(t->pdata);
break;
case LEX_AUTOJOIN_ON_KICK:
l->autojoin_on_kick = t->ndata;
break;
case LEX_FOLLOW_NICK:
l->follow_nick = t->ndata;
break;

View File

@ -68,7 +68,7 @@ struct tuple *tuple_l_new(int type, void *p)
%}
%token LEX_IP LEX_EQ LEX_PORT LEX_CSS LEX_SEMICOLON LEX_CONNECTION LEX_NETWORK LEX_LBRA LEX_RBRA LEX_USER LEX_NAME LEX_NICK LEX_SERVER LEX_PASSWORD LEX_SRCIP LEX_HOST LEX_VHOST LEX_SOURCE_PORT LEX_NONE LEX_COMMENT LEX_BUNCH LEX_REALNAME LEX_SSL LEX_SSL_CHECK_MODE LEX_SSL_CHECK_STORE LEX_SSL_CLIENT_CERTFILE LEX_CHANNEL LEX_KEY LEX_LOG_ROOT LEX_LOG_FORMAT LEX_LOG_LEVEL LEX_BACKLOG_LINES LEX_BACKLOG_NO_TIMESTAMP LEX_BACKLOG LEX_LOG LEX_LOG_SYSTEM LEX_LOG_SYNC_INTERVAL LEX_FOLLOW_NICK LEX_ON_CONNECT_SEND LEX_AWAY_NICK LEX_PID_FILE LEX_IGN_FIRST_NICK LEX_ALWAYS_BACKLOG LEX_BLRESET_ON_TALK LEX_BLRESET_CONNECTION LEX_DEFAULT_USER LEX_DEFAULT_NICK LEX_DEFAULT_REALNAME LEX_NO_CLIENT_AWAY_MSG LEX_BL_MSG_ONLY LEX_ADMIN LEX_BIP_USE_NOTICE LEX_CSS_PEM
%token LEX_IP LEX_EQ LEX_PORT LEX_CSS LEX_SEMICOLON LEX_CONNECTION LEX_NETWORK LEX_LBRA LEX_RBRA LEX_USER LEX_NAME LEX_NICK LEX_SERVER LEX_PASSWORD LEX_SRCIP LEX_HOST LEX_VHOST LEX_SOURCE_PORT LEX_NONE LEX_COMMENT LEX_BUNCH LEX_REALNAME LEX_SSL LEX_SSL_CHECK_MODE LEX_SSL_CHECK_STORE LEX_SSL_CLIENT_CERTFILE LEX_CHANNEL LEX_KEY LEX_LOG_ROOT LEX_LOG_FORMAT LEX_LOG_LEVEL LEX_BACKLOG_LINES LEX_BACKLOG_NO_TIMESTAMP LEX_BACKLOG LEX_LOG LEX_LOG_SYSTEM LEX_LOG_SYNC_INTERVAL LEX_FOLLOW_NICK LEX_ON_CONNECT_SEND LEX_AWAY_NICK LEX_PID_FILE LEX_IGN_FIRST_NICK LEX_ALWAYS_BACKLOG LEX_BLRESET_ON_TALK LEX_BLRESET_CONNECTION LEX_DEFAULT_USER LEX_DEFAULT_NICK LEX_DEFAULT_REALNAME LEX_NO_CLIENT_AWAY_MSG LEX_BL_MSG_ONLY LEX_ADMIN LEX_BIP_USE_NOTICE LEX_CSS_PEM LEX_AUTOJOIN_ON_KICK
%union {
int number;
@ -203,12 +203,14 @@ con_command:
$$ = tuple_i_new(LEX_FOLLOW_NICK, $3); }
| LEX_IGN_FIRST_NICK LEX_EQ LEX_BOOL { $$ = tuple_i_new(
LEX_IGN_FIRST_NICK, $3); }
| LEX_AUTOJOIN_ON_KICK LEX_EQ LEX_BOOL {
$$ = tuple_i_new(LEX_AUTOJOIN_ON_KICK, $3); }
| LEX_CHANNEL LEX_LBRA channel LEX_RBRA { $$ = tuple_l_new(
LEX_CHANNEL, $3); }
LEX_CHANNEL, $3); }
| LEX_ON_CONNECT_SEND LEX_EQ LEX_STRING { $$ = tuple_s_new(
LEX_ON_CONNECT_SEND, $3); }
LEX_ON_CONNECT_SEND, $3); }
| LEX_NO_CLIENT_AWAY_MSG LEX_EQ LEX_STRING { $$ = tuple_s_new(
LEX_NO_CLIENT_AWAY_MSG, $3); }
LEX_NO_CLIENT_AWAY_MSG, $3); }
| LEX_SSL_CHECK_MODE LEX_EQ LEX_STRING { $$ = tuple_s_new(
LEX_SSL_CHECK_MODE, $3); }
channel:

View File

@ -1767,11 +1767,21 @@ static int irc_kick(struct link_server *server, struct line *line)
return ERR_PROTOCOL;
if (strcasecmp(irc_line_elem(line, 2), server->nick) == 0) {
/* we get kicked !! */
log_kick(LINK(server)->log, line->origin, channel->name,
irc_line_elem(line, 2),
irc_line_count(line) == 4 ?
irc_line_elem(line, 3) : NULL);
if (LINK(server)->autojoin_on_kick) {
if (!channel->key)
WRITE_LINE1(CONN(server), NULL, "JOIN",
channel->name);
else
WRITE_LINE2(CONN(server), NULL, "JOIN",
channel->name, channel->key);
}
hash_remove(&server->channels, channel->name);
channel_free(channel);
return OK_COPY;
@ -1781,6 +1791,8 @@ static int irc_kick(struct link_server *server, struct line *line)
log_kick(LINK(server)->log, line->origin, irc_line_elem(line, 1),
irc_line_elem(line, 2),
irc_line_count(line) == 4 ? irc_line_elem(line, 3) : NULL);
return OK_COPY;
}
@ -2541,6 +2553,7 @@ struct link *irc_link_new()
hash_init(&link->chan_infos, HASH_NOCASE);
list_init(&link->chan_infos_order, list_ptr_cmp);
list_init(&link->on_connect_send, list_ptr_cmp);
link->autojoin_on_kick = 1;
return link;
}

View File

@ -131,6 +131,7 @@ struct link {
int follow_nick;
int ignore_first_nick;
int autojoin_on_kick;
list_t on_connect_send;
char *no_client_away_msg;
char *away_nick;

View File

@ -81,6 +81,7 @@ list_t *parse_conf(FILE *file, int *err)
"ssl_check_store" { return LEX_SSL_CHECK_STORE; }
"ssl_client_certfile" { return LEX_SSL_CLIENT_CERTFILE; }
"key" { return LEX_KEY; }
"autojoin_on_kick" { return LEX_AUTOJOIN_ON_KICK; }
"channel" { return LEX_CHANNEL; }
"log_level" { return LEX_LOG_LEVEL; }
"log_root" { return LEX_LOG_ROOT; }