From 93381f41151945656be8f31cdae882e90af05c75 Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 10 May 2012 14:01:18 +0200 Subject: [PATCH] added small static content replay (channels will follow) --- src/IRCClient.c | 40 +++++++++++++++++++++++++++++++++++++++- src/IRCClient.h | 8 +++++++- src/UserClient.c | 3 +-- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/IRCClient.c b/src/IRCClient.c index 46e030e..eb91baf 100644 --- a/src/IRCClient.c +++ b/src/IRCClient.c @@ -53,6 +53,12 @@ void ircclient_close(struct IRCClient *client) { client->session->irc = NULL; iohandler_printf(client->iofd, "QUIT :[TransparentIRC] Quit"); iohandler_close(client->iofd); + struct IRCLine *recover_line, *next_line; + for(recover_line = client->recover_header; recover_line; recover_line = next_line) { + next_line = recover_line->next; + free(recover_line->line); + free(recover_line); + } free(client); } @@ -85,7 +91,29 @@ static void ircclient_recv(struct IRCClient *client, char *line) { pass_to_client = 0; } } else { - + if(!stricmp(argv[1], "001") || + !stricmp(argv[1], "002") || + !stricmp(argv[1], "003") || + !stricmp(argv[1], "004") || + !stricmp(argv[1], "005") || + !stricmp(argv[1], "375") || + !stricmp(argv[1], "372") || + !stricmp(argv[1], "376") + ) { + //save these raw's for recovering the connection later + struct IRCLine *recover_line = NULL, *new_line; + if(client->recover_header) + for(recover_line = client->recover_header; recover_line->next; recover_line = recover_line->next) {}; + new_line = malloc(sizeof(*new_line)); + if(new_line) { + new_line->line = strdup(line); + new_line->next = NULL; + if(recover_line) + recover_line->next = new_line; + else + client->recover_header = new_line; + } + } } if(pass_to_client) usersession_client_raw(session, line); @@ -114,3 +142,13 @@ static void ircclient_callback(struct IOEvent *event) { void ircclient_send(struct IRCClient *client, char *line) { iohandler_printf(client->iofd, "%s", line); } + +void ircclient_recover_session(struct UserSession *session) { + struct IRCClient *client = session->irc; + //replay header + struct IRCLine *recover_line; + for(recover_line = client->recover_header; recover_line; recover_line = recover_line->next) { + usersession_client_raw(session, recover_line->line); + } + +} diff --git a/src/IRCClient.h b/src/IRCClient.h index a6b2f4c..00c3180 100644 --- a/src/IRCClient.h +++ b/src/IRCClient.h @@ -25,16 +25,22 @@ struct UserLogin; struct IRCClient { struct IODescriptor *iofd; - struct UserSession *session; int auth_confirmed : 1; + struct IRCLine *recover_header; struct IRCClient *next, *prev; }; +struct IRCLine { + char *line; + struct IRCLine *next; +}; + void ircclient_initialize(struct UserSession *session, struct UserLogin *login); void ircclient_close(struct IRCClient *client); void ircclient_send(struct IRCClient *client, char *line); +void ircclient_recover_session(struct UserSession *session); #endif diff --git a/src/UserClient.c b/src/UserClient.c index d6c0ca5..bb43793 100644 --- a/src/UserClient.c +++ b/src/UserClient.c @@ -176,8 +176,7 @@ void userclient_login_successful(struct UserLogin *login, struct UserSession *se client->flags |= USERCLIENT_LOGGED_IN; if(recover) { iohandler_printf(client->iofd, "NOTICE AUTH :*** [TransparentIRC] Recovering previous link (Nick: %s).", session->nick); - - + ircclient_recover_session(session); } } -- 2.20.1