added IRC Client and RAW pass-through
[TransparentIRC.git] / src / UserSession.c
index 136b7674b2d3d0be9ad8c9eea7d890c40c07920d..8b90299df4dcf40fac073954edff9fd9db1240e9 100644 (file)
@@ -19,6 +19,7 @@
 #include "UserClient.h"
 #include "ConfigParser.h"
 #include "tools.h"
+#include "IRCClient.h"
 
 static struct UserSession *usersessions = NULL;
 
@@ -39,10 +40,11 @@ static struct UserSession *usersession_add(char *username, char *password, char
     return session;
 }
 
-/*
 static void usersession_close(struct UserSession *session) {
     if(session->client)
         userclient_close(session->client);
+    if(session->irc)
+        ircclient_close(session->irc);
     
     if(session->prev)
         session->prev->next = session->next;
@@ -53,24 +55,32 @@ static void usersession_close(struct UserSession *session) {
     free(session->username);
     free(session->password);
     free(session->nick);
+    if(session->realname)
+        free(session->realname);
     free(session);
 }
-*/
 
-/* ****************** SESSION FUNCTIONS ****************** */
+/* ****************** EXTERNAL EVENTS ****************** */
 
-static void usersession_initialize_session(struct UserSession *session) {
-    
+void usersession_error(struct UserSession *session, char *error) {
+    if(session->client) {
+        iohandler_printf(session->client->iofd, ":*TransparentIRC!TransIRC@TransparentIRC.system.notification NOTICE %s :[TransparentIRC] ERROR: %s", session->nick, error);
+    }
+    usersession_close(session);
 }
 
-/* ****************** EXTERNAL EVENTS ****************** */
-
 void usersession_client_close(struct UserSession *session) {
     session->client = NULL;
     session->idle_since = time(0);
     
 }
 
+void usersession_client_raw(struct UserSession *session, char *raw) {
+    if(session->client) {
+        iohandler_printf(session->client->iofd, "%s", raw);
+    }
+}
+
 void usersession_client_notification(struct UserSession *session, char *notification) {
     if(session->client) {
         iohandler_printf(session->client->iofd, ":*TransparentIRC!TransIRC@TransparentIRC.system.notification NOTICE %s :[TransparentIRC] %s", session->nick, notification);
@@ -152,8 +162,10 @@ static void usersession_login_accept(struct UserLogin *login) {
             userclient_login_failed(login, "Could not create Session.");
             return;
         }
+        active_session->client = login->client;
+        active_session->realname = strdup(login->realname);
+        ircclient_initialize(active_session, login);
         userclient_login_successful(login, active_session, 0);
-        usersession_initialize_session(active_session);
     }
 }
 
@@ -196,6 +208,18 @@ static void usersession_login_callback(struct IOEvent *event) {
                 if(argc < 2) return;
                 if(!stricmp(argv[0], "CLASS")) {
                     login->session_class = strdup(argv[1]);
+                } else if(!stricmp(argv[0], "SERVER")) {
+                    login->server_address = strdup(argv[1]);
+                    if(argc > 2) {
+                        login->server_override_port = 1;
+                        if(argv[2][0] == '+') {
+                            argv[2]++;
+                            login->server_ssl = 1;
+                        }
+                        login->server_port = atoi(argv[2]);
+                    }
+                } else if(!stricmp(argv[0], "BIND")) {
+                    login->bind_address = strdup(argv[1]);
                 }
                 
             }