diff --git a/ChangeLog b/ChangeLog index 26e5f82..b2d0579 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-09-18 Arnaud Cornet + + * src/irc.c: added no_client_away_msg configuration directive and + code. + 2006-07-02 Arnaud Cornet * src/irc.c: added /bip subcommands: diff --git a/TODO b/TODO index ee4db7c..aa810f3 100644 --- a/TODO +++ b/TODO @@ -8,9 +8,6 @@ - use gnutls - MODE #channel and WHO #channel on join -11:23 < KiBi> Un /away truc chose automatique quand plus aucun client n'est - attaché. -- in english: automatic command when no more client is connected - this: Hi Arnaud, @@ -27,3 +24,9 @@ Best regards, Whoopie -- Donner des droits plus méchants au log global + +DONE: + +11:23 < KiBi> Un /away truc chose automatique quand plus aucun client n'est + attaché. +- in english: automatic command when no more client is connected diff --git a/src/bip.c b/src/bip.c index e917333..356e8c2 100644 --- a/src/bip.c +++ b/src/bip.c @@ -407,6 +407,7 @@ static int add_connection(list_t *connectionl, list_t *data, c = calloc(sizeof(struct c_connection), 1); list_init(&c->channell, NULL); + list_init(&c->on_connect_send, NULL); while ((t = list_remove_first(data))) { switch (t->type) { @@ -455,7 +456,7 @@ static int add_connection(list_t *connectionl, list_t *data, c->away_nick = t->pdata; break; case LEX_ON_CONNECT_SEND: - c->on_connect_send = t->pdata; + list_add(&c->on_connect_send, t->pdata); break; default: conf_die("unknown keyword in connection statement"); @@ -790,6 +791,7 @@ void ircize(list_t *ll) } \ } while(0); MAYFREE(link->away_nick); + MAYFREE(link->no_client_away_msg); MAYFREE(link->password); MAYFREE(link->user); MAYFREE(link->real_name); @@ -811,8 +813,20 @@ void ircize(list_t *ll) link->follow_nick = c->follow_nick; link->ignore_first_nick = c->ignore_first_nick; - link->on_connect_send = strmaydup(c->on_connect_send); + + /* XXX vider laliste on_connect_send */ + list_iterator_t ocsit; + for (list_it_init(&c->channell, &ocsit); + list_it_item(&ocsit); + list_it_next(&ocsit)) { + free(list_it_item(&ocsit)); + } + list_init(&link->on_connect_send); + list_append(&link->on_connect_send, + &c->on_connect_send); link->away_nick = strmaydup(c->away_nick); + link->no_client_away_msg = + strmaydup(c->no_client_away_msg); link->username = strmaydup(u->name); link->password = malloc(20); diff --git a/src/bip.h b/src/bip.h index 65af54b..e7ffbc8 100644 --- a/src/bip.h +++ b/src/bip.h @@ -51,7 +51,8 @@ struct c_connection int follow_nick; int ignore_first_nick; char *away_nick; - char *on_connect_send; + list_t on_connect_send; + char *no_client_away_msg; struct client *client; }; diff --git a/src/conf.y b/src/conf.y index aaaee64..c71ceb8 100644 --- a/src/conf.y +++ b/src/conf.y @@ -80,7 +80,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_USERNAME 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_CHANNEL LEX_KEY LEX_LOG_ROOT LEX_LOG_FORMAT LEX_LOG_LEVEL LEX_BACKLOG_LINES LEX_BACKLOG LEX_LOG 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_LOGIN LEX_BLRESET_ON_TALK LEX_DEFAULT_USER LEX_DEFAULT_NICK LEX_DEFAULT_REALNAME +%token LEX_IP LEX_EQ LEX_PORT LEX_CSS LEX_SEMICOLON LEX_CONNECTION LEX_NETWORK LEX_LBRA LEX_RBRA LEX_USER LEX_NAME LEX_USERNAME 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_CHANNEL LEX_KEY LEX_LOG_ROOT LEX_LOG_FORMAT LEX_LOG_LEVEL LEX_BACKLOG_LINES LEX_BACKLOG LEX_LOG 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_LOGIN LEX_BLRESET_ON_TALK LEX_DEFAULT_USER LEX_DEFAULT_NICK LEX_DEFAULT_REALNAME LEX_NO_CLIENT_AWAY_MSG %union { int number; diff --git a/src/irc.c b/src/irc.c index ee01439..ca4f3bb 100644 --- a/src/irc.c +++ b/src/irc.c @@ -814,7 +814,7 @@ static int irc_cli_startup(struct link_client *ic, struct line *line, list_it_item(&it); list_it_next(&it)) write_init_string(CONN(ic), list_it_item(&it), init_nick); - /* we change nick on client */ + /* we change nick on server */ if (LINK(ic)->l_server) { struct link_server *server = LINK(ic)->l_server; WRITE_LINE1(CONN(ic), initmask, "NICK", server->nick); @@ -825,6 +825,12 @@ static int irc_cli_startup(struct link_client *ic, struct line *line, strcmp(LINK(ic)->away_nick, server->nick) == 0) WRITE_LINE1(CONN(server), NULL, "NICK", LINK(server)->connect_nick); + + /* change away status */ + if (LINK(ic)->l_clientc == 0) { + if (server && LINK(ic)->no_client_away_msg) + WRITE_LINE0(CONN(server), NULL, "AWAY"); + } } free(initmask); @@ -1921,6 +1927,9 @@ void irc_client_close(struct link_client *ic) if (is && LINK(ic)->away_nick) WRITE_LINE1(CONN(is), NULL, "NICK", LINK(ic)->away_nick); + if (is && LINK(ic)->no_client_away_msg) + WRITE_LINE1(CONN(is), NULL, "AWAY", + LINK(ic)->no_client_away_msg); log_client_none_connected(LINK(ic)->log); } irc_client_free(ic); @@ -2391,6 +2400,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); return link; } diff --git a/src/irc.h b/src/irc.h index c21c6b2..a7c0151 100644 --- a/src/irc.h +++ b/src/irc.h @@ -90,7 +90,7 @@ struct link { int follow_nick; int ignore_first_nick; - char *on_connect_send; + list_t on_connect_send; char *away_nick; hash_t chan_infos; /* channels we want */ list_t chan_infos_order; /* for order only */ diff --git a/src/lex.l b/src/lex.l index 0c78b64..8bea155 100644 --- a/src/lex.l +++ b/src/lex.l @@ -91,6 +91,7 @@ list_t *parse_conf(FILE *file) "ignore_first_nick" { return LEX_IGN_FIRST_NICK; } "away_nick" { return LEX_AWAY_NICK; } "on_connect_send" { return LEX_ON_CONNECT_SEND; } +"no_client_away_msg" { return LEX_NO_CLIENT_AWAY_MSG; } "pid_file" { return LEX_PID_FILE; } "blreset_on_talk" { return LEX_BLRESET_ON_TALK; } \"[^"]*\" { diff --git a/src/util.c b/src/util.c index 939e351..82a4453 100644 --- a/src/util.c +++ b/src/util.c @@ -262,6 +262,11 @@ void *list_remove_last(list_t *list) return ptr; } +static void *__list_ptr_cpy(void *a) +{ + return a; +} + /* static void *list_remove_item(list_t *l, struct list_item *li) { @@ -384,7 +389,7 @@ void list_free(list_t *t) void list_append(list_t *src, list_t *dest) { list_iterator_t it; - + for (list_it_init(src, &it); list_it_item(&it); list_it_next(&it)) list_add_last(dest, list_it_item(&it)); }