Networking - Heaps of changes
[tpg/acess2.git] / Usermode / Applications / irc_src / main.c
index 0c90c50..9c7eccc 100644 (file)
@@ -64,13 +64,14 @@ tWindow     *Window_Create(tServer *Server, const char *Name);
 \r
  int   ProcessIncoming(tServer *Server);\r
 // --- Helpers\r
+ int   SetCursorPos(int Row, int Col);\r
  int   writef(int FD, const char *Format, ...);\r
  int   OpenTCP(const char *AddressString, short PortNumber);\r
 char   *GetValue(char *Str, int *Ofs);\r
 static inline int      isdigit(int ch);\r
 \r
 // === GLOBALS ===\r
-char   *gsUsername = "root";\r
+char   *gsUsername = "user";\r
 char   *gsHostname = "acess";\r
 char   *gsRealName = "Acess2 IRC Client";\r
 char   *gsNickname = "acess";\r
@@ -81,8 +82,15 @@ tWindow      gWindow_Status = {
 };\r
 tWindow        *gpWindows = &gWindow_Status;\r
 tWindow        *gpCurrentWindow = &gWindow_Status;\r
+ int   giTerminal_Width = 80;\r
+ int   giTerminal_Height = 25;\r
 \r
 // ==== CODE ====\r
+void ExitHandler(void)\r
+{\r
+       printf("\x1B[?1047l");\r
+}\r
+\r
 int main(int argc, const char *argv[], const char *envp[])\r
 {\r
         int    tmp;\r
@@ -91,6 +99,14 @@ int main(int argc, const char *argv[], const char *envp[])
        // Parse Command line\r
        if( (tmp = ParseArguments(argc, argv)) )        return tmp;\r
        \r
+       atexit(ExitHandler);\r
+       \r
+       giTerminal_Width = ioctl(1, 5, NULL);   // getset_width\r
+       giTerminal_Height = ioctl(1, 6, NULL);  // getset_height\r
+       \r
+       printf("\x1B[?1047h");\r
+       printf("\x1B[%i;%ir", 0, giTerminal_Height-1);\r
+       \r
        // HACK: Static server entry\r
        // UCC (University [of Western Australia] Computer Club) IRC Server\r
        gWindow_Status.Server = Server_Connect( "UCC", "130.95.13.18", 6667 );\r
@@ -100,6 +116,9 @@ int main(int argc, const char *argv[], const char *envp[])
        \r
        readline_info = Readline_Init(1);\r
        \r
+       SetCursorPos(giTerminal_Height-1, 0);\r
+       printf("[(status)] ");\r
+       \r
        for( ;; )\r
        {\r
                fd_set  readfds, errorfds;\r
@@ -133,6 +152,12 @@ int main(int argc, const char *argv[], const char *envp[])
                                        ParseUserCommand(cmd);\r
                                }\r
                                free(cmd);\r
+                               // Prompt\r
+                               SetCursorPos(giTerminal_Height-1, 0);\r
+                               if( gpCurrentWindow->Name[0] )\r
+                                       printf("[%s:%s] ", gpCurrentWindow->Server->Name, gpCurrentWindow->Name);\r
+                               else\r
+                                       printf("[(status)] ");\r
                        }\r
                }\r
                \r
@@ -188,7 +213,7 @@ int ParseUserCommand(char *String)
                        \r
                        if( gpCurrentWindow->Server )\r
                        {\r
-                               writef(gpCurrentWindow->Server->FD, "JOIN %s\n",  channel_name);\r
+                               writef(gpCurrentWindow->Server->FD, "JOIN :%s\n",  channel_name);\r
                        }\r
                }\r
                else if( strcmp(command, "/quit") == 0 )\r
@@ -196,13 +221,15 @@ int ParseUserCommand(char *String)
                        char    *quit_message = GetValue(String, &pos);\r
                        tServer *srv;\r
                        \r
-                       if( !quit_message )\r
+                       if( quit_message == NULL || quit_message[0] == '\0' )\r
                                quit_message = "/quit - Acess2 IRC Client";\r
                        \r
                        for( srv = gpServers; srv; srv = srv->Next )\r
                        {\r
-                               writef(srv->FD, "QUIT %s\n", quit_message);\r
+                               writef(srv->FD, "QUIT :%s\n", quit_message);\r
                        }\r
+                       \r
+                       exit(0);\r
                }\r
                else if( strcmp(command, "/window") == 0 || strcmp(command, "/win") == 0 || strcmp(command, "/w") == 0 )\r
                {\r
@@ -217,13 +244,20 @@ int ParseUserCommand(char *String)
                                for( win = gpWindows; win && window_num--; win = win->Next );\r
                                if( win ) {\r
                                        gpCurrentWindow = win;\r
-                                       if( win->Name[0] )\r
-                                               printf("[%s:%s] ", win->Server->Name, win->Name);\r
-                                       else\r
-                                               printf("[(status)] ", win->Server->Name, win->Name);\r
                                }\r
                                // Otherwise, silently ignore\r
                        }\r
+                       else\r
+                       {\r
+                               tWindow *win;\r
+                               window_num = 1;\r
+                               for( win = gpWindows; win; win = win->Next, window_num ++ )\r
+                               {\r
+                                       char tmp[snprintf(NULL, 1000, "%i: %s/%s", window_num, win->Server->Name, win->Name)+1];\r
+                                       snprintf(tmp, 1000, "%i: %s/%s", window_num, win->Server->Name, win->Name);\r
+                                       Message_Append(NULL, MSG_TYPE_SERVER, "client", "", tmp);\r
+                               }\r
+                       }\r
                }\r
                else\r
                {\r
@@ -359,6 +393,22 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch
        ret->Next = win->Messages;\r
        win->Messages = ret;\r
        \r
+       //TODO: Set location\r
+       \r
+       #if 1\r
+       if( win == gpCurrentWindow ) {\r
+               int pos = SetCursorPos(giTerminal_Height-2, 0);\r
+               printf("\x1B[S");       // Scroll up 1\r
+               printf("[%s] %s\n", Source, Message);\r
+               SetCursorPos(-1, pos);\r
+       }\r
+       #else\r
+       if(win->Name[0])\r
+               printf("%s/%s [%s] %s\n", win->Server->Name, win->Name, Source, Message);\r
+       else\r
+               printf("(status) [%s] %s\n", Source, Message);\r
+       #endif\r
+       \r
        return ret;\r
 }\r
 \r
@@ -387,14 +437,15 @@ tWindow *Window_Create(tServer *Server, const char *Name)
                gpWindows = ret;\r
        }\r
        \r
-       printf("Win %i %s:%s created\n", num, Server->Name, Name);\r
+//     printf("Win %i %s:%s created\n", num, Server->Name, Name);\r
        \r
        return ret;\r
 }\r
 \r
 void Cmd_PRIVMSG(tServer *Server, const char *Dest, const char *Src, const char *Message)\r
 {\r
-       printf("<%s:%s:%s> %s\n", Server->Name, Dest, Src, Message);\r
+       Message_Append(Server, MSG_TYPE_STANDARD, Dest, Src, Message);\r
+       //printf("<%s:%s:%s> %s\n", Server->Name, Dest, Src, Message);\r
 }\r
 \r
 /**\r
@@ -431,7 +482,7 @@ void ParseServerLine(tServer *Server, char *Line)
                        switch(num)\r
                        {\r
                        default:\r
-                               printf("[%s] %i %s\n", Server->Name, num, message);\r
+                               //printf("[%s] %i %s\n", Server->Name, num, message);\r
                                Message_Append(Server, MSG_TYPE_SERVER, ident, user, message);\r
                                break;\r
                        }\r
@@ -449,7 +500,7 @@ void ParseServerLine(tServer *Server, char *Line)
                                message = GetValue(Line, &pos);\r
                        }\r
                        \r
-                       printf("[%s] NOTICE %s: %s\n", Server->Name, ident, message);\r
+                       //printf("[%s] NOTICE %s: %s\n", Server->Name, ident, message);\r
                        Message_Append(Server, MSG_TYPE_NOTICE, ident, "", message);\r
                }\r
                else if( strcmp(cmd, "PRIVMSG") == 0 )\r
@@ -466,6 +517,12 @@ void ParseServerLine(tServer *Server, char *Line)
                        Cmd_PRIVMSG(Server, dest, ident, message);\r
                        Message_Append(Server, MSG_TYPE_STANDARD, ident, dest, message);\r
                }\r
+               else if( strcmp(cmd, "JOIN" ) == 0 )\r
+               {\r
+                       char    *channel;\r
+                       channel = GetValue(Line, &pos) + 1;\r
+                       Window_Create(Server, channel);\r
+               }\r
                else\r
                {\r
                        printf("Unknown message %s (%s)\n", cmd, Line+pos);\r
@@ -639,6 +696,16 @@ char *GetValue(char *Src, int *Ofs)
        return ret;\r
 }\r
 \r
+int SetCursorPos(int Row, int Col)\r
+{\r
+       if( Row == -1 ) {\r
+               Row = Col / giTerminal_Width;\r
+               Col = Col % giTerminal_Width;\r
+       }\r
+       printf("\x1B[%i;%iH", Col, Row);\r
+       return ioctl(1, 9, NULL);       // Ugh, constants\r
+}\r
+\r
 static inline int isdigit(int ch)\r
 {\r
        return '0' <= ch && ch < '9';\r

UCC git Repository :: git.ucc.asn.au