continued writing cache
authorpk910 <philipp@zoelle1.de>
Wed, 10 Aug 2011 02:15:54 +0000 (04:15 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 10 Aug 2011 02:15:54 +0000 (04:15 +0200)
ChanNode.c [new file with mode: 0644]
ChanNode.h
ClientSocket.c
IRCEvents.h [new file with mode: 0644]
IRCParser.c
UserNode.c
UserNode.h
main.c

diff --git a/ChanNode.c b/ChanNode.c
new file mode 100644 (file)
index 0000000..5eafa32
--- /dev/null
@@ -0,0 +1,74 @@
+#include "ChanNode.h"
+
+static struct ChanNode **chanList;
+
+void init_ChanNode() {
+    /*
+     len pos chars 
+     26  0   a-z
+     10  26  0-9
+     10  36  {|}~[\]^_`
+     1   46  *everything else*
+     ---------------------------
+     = 47
+    */
+    userList = calloc(47, sizeof(*userList));
+}
+
+int is_valid_chan(const char *name) {
+    unsigned int ii;
+    if (*name !='#')
+        return 0;
+    for (ii=1; name[ii]; ++ii) {
+        if ((name[ii] > 0) && (name[ii] <= 32))
+            return 0;
+        if (name[ii] == ',')
+            return 0;
+        if (name[ii] == '\xa0')
+            return 0;
+    }
+    return 1;
+}
+
+static int get_chanlist_entry(int name) {
+    int i;
+    if((name > 0 && name <= 32) || name == ',' || name == '\xa0') return -1; //invalid name
+    if(tolower(name) >= 97 && tolower(name) <= 122) {
+        return (tolower(name) - 97);
+    }
+    if(tolower(name) >= 48 && tolower(name) <= 57) {
+        return (tolower(name) - 48 + 26);
+    }
+    /* {|}~[\]^_` */
+    if(name == '{') return 36;
+    if(name == '|') return 37;
+    if(name == '}') return 38;
+    if(name == '~') return 39;
+    if(name == '[') return 40;
+    if(name == '\\') return 41;
+    if(name == ']') return 42;
+    if(name == '^') return 43;
+    if(name == '_') return 44;
+    if(name == '`') return 45;
+    return 46;
+}
+
+struct ChanNode* getChanByName(const char *name) { //case insensitive
+    int chanListIndex = get_chanlist_entry(*name);
+    if(chanListIndex == -1 || chanList[chanListIndex] == NULL)
+        return NULL;
+    struct ChanNode *chan;
+    for(chan = chanList[chanListIndex]; chan; chan = chan->next) {
+        if(!stricmp(name, chan->name))
+            return chan;
+    }
+    return NULL;
+}
+
+struct ChanNode* addChannel(const char *chan) {
+    return NULL; //to be continued
+}
+
+void delChannel(struct ChanNode* chan, int freeChan) {
+    //to be continued
+}
index ead845a0c456161b9067c05328dfdf4aff30e75d..127d7b560a0f3c7f68e155f174ef53db4238e42a 100644 (file)
@@ -12,13 +12,10 @@ struct ChanNode {
     struct ChanNode *next;
 };
 
-/*
-void init_UserNode();
-int is_valid_nick(const char *nick);
-struct UserNode* getUserByNick(const char *nick);
-struct UserNode* addUser(const char *nick);
-int renameUser(struct UserNode* user, const char *new_nick);
-void delUser(struct UserNode* user, int freeUser);
-*/
+void init_ChanNode();
+int is_valid_chan(const char *name);
+struct ChanNode* getChanByName(const char *name);
+struct ChanNode* addChannel(const char *chan);
+void delChannel(struct ChanNode* chan, int freeChan);
 
 #endif
\ No newline at end of file
index 20ec7246a92af4bf506fc6fa59db7bcf986f2946..1d5e2f1fb60610548deb73d0a99138f36c56346c 100644 (file)
@@ -185,7 +185,7 @@ putsock(struct ClientSocket *client, const char *text, ...)
     va_end(arg_list);
     if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
     sendBuf[pos] = '\n';
-    sendBuf[pos+1] = '0';
+    sendBuf[pos+1] = '\0';
     write_socket(client, sendBuf, pos+1);
 }
 
diff --git a/IRCEvents.h b/IRCEvents.h
new file mode 100644 (file)
index 0000000..a8047ee
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _IRCEvents_h
+#define _IRCEvents_h
+
+#include "main.h"
+#include "UserNode.h"
+#include "ChanNode.h"
+#include "ChanUser.h"
+
+int event_join(struct ChanUser *chanuser);
+int event_part(struct ChanUser *chanuser, char *reason);
+int event_quit(struct UserNode *user, char *reason);
+int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message);
+int event_privmsg(struct UserNode *user, struct UserNode *target, char *message);
+
+#endif
\ No newline at end of file
index eb2e8a4a09b9da5e7089c2de81e730978fd3ebe2..f60d2aafd98ad302ec80a3bc724f14e2bde140e0 100644 (file)
@@ -1,5 +1,9 @@
 
 #include "IRCParser.h"
+#include "UserNode.h"
+#include "ChanNode.h"
+#include "ChanUser.h"
+#include "IRCEvents.h"
 #include "ClientSocket.h"
 
 struct irc_cmd *irc_commands = NULL;
@@ -66,17 +70,37 @@ static void register_irc_function(char *command, irc_cmd_t *func) {
 
 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
     struct irc_cmd *irc_cmd;
+    int ret = 0;
     for(irc_cmd = irc_commands; irc_cmd; irc_cmd = irc_cmd->next) {
         if(!stricmp(irc_cmd->cmd, cmd)) {
-            irc_cmd->func(client, from, argv, argc);
+            ret = irc_cmd->func(client, from, argv, argc);
             break;
         }
     }
+    if(!ret) {
+        fprintf(stderr,"PARSE ERROR: %s", cmd);
+    }
 }
 
 static IRC_CMD(raw_001) {
     client->flags |= SOCKET_FLAG_READY;
-    putsock(client, "PRIVMSG Watchcat :hi");
+    putsock(client, "JOIN #pktest");
+    return 1;
+}
+
+static IRC_CMD(raw_join) {
+    if(from == NULL || argc < 1) return 0;
+    struct UserNode *user = getUserByMask(from);
+    if(user == NULL) {
+        user = addUserMask(from);
+    }
+    struct ChanNode *chan = getChanByName(argv[0]);
+    if(chan == NULL) {
+        chan = addChannel(argv[0]);
+        
+    }
+    putsock(client, "PRIVMSG #pktest :hi");
+    
     return 1;
 }
 
@@ -89,5 +113,6 @@ static IRC_CMD(raw_ping) {
 void parser_init() {
     //all the raws we receive...
     register_irc_function("001", raw_001);
+    register_irc_function("JOIN", raw_join);
     register_irc_function("PING", raw_ping);
 }
index 21a7c81655648b5843e1e7a5930df9a21f8afa00..8a03620bdf3c35241f2547c4712f5be19529becc 100644 (file)
@@ -43,6 +43,24 @@ struct UserNode* getUserByNick(const char *nick) { //case sensitive
     return NULL;
 }
 
+struct UserNode* getUserByMask(const char *mask) { //case sensitive
+    char cmask[strlen(mask)+1];
+    strcpy(cmask, mask);
+    int i;
+    struct UserNode *user = NULL;
+    for(i = 0; i < strlen(mask); i++) {
+        if(cmask[i] == '!') {
+            cmask[i] = 0;
+            user = getUserByNick(&cmask);
+            return user;
+        } else if(cmask[i] == '.') {
+            //it's a server
+            return NULL;
+        }
+    }
+    return NULL;
+}
+
 struct UserNode* searchUserByNick(const char *nick) { //case insensitive
     if(!isalpha(*nick)) 
         return getUserByNick(nick);
@@ -90,6 +108,34 @@ struct UserNode* addUser(const char *nick) {
     return user;
 }
 
+
+struct UserNode* addUserMask(const char *mask) {
+    char cmask[strlen(mask)+1];
+    strcpy(cmask, mask);
+    int i, ii = 0;
+    struct UserNode *user = NULL;
+    for(i = 0; i < strlen(mask)+1; i++) {
+        if(cmask[i] == '!') {
+            cmask[i] = 0;
+            user = addUser(&cmask);
+            if(user == NULL) return NULL;
+            ii = i+1;
+        } else if(cmask[i] == '.' && !user) {
+            //it's a server
+            return NULL;
+        } else if(cmask[i] == '@') {
+            if(user == NULL) return NULL;
+            cmask[i] = 0;
+            strcpy(user->ident, &cmask[ii]);
+            ii = i+1;
+        } else if(cmask[i] == '\0') {
+            if(user == NULL) return NULL;
+            strcpy(user->host, &cmask[ii]);
+        }
+    }
+    return NULL;
+}
+
 int renameUser(struct UserNode* user, const char *new_nick) {
     if(!is_valid_nick(new_nick))
         return 0;
index a0e418f45a66448f3d628d242b4cf8135da17f6e..d63fede63bd998dee4da88671f89ff7c477a5cb3 100644 (file)
@@ -19,8 +19,10 @@ struct UserNode {
 void init_UserNode();
 int is_valid_nick(const char *nick);
 struct UserNode* getUserByNick(const char *nick);
+struct UserNode* getUserByMask(const char *mask);
 struct UserNode* searchUserByNick(const char *nick);
 struct UserNode* addUser(const char *nick);
+struct UserNode* addUserMask(const char *mask);
 int renameUser(struct UserNode* user, const char *new_nick);
 void delUser(struct UserNode* user, int freeUser);
 
diff --git a/main.c b/main.c
index e12f79de2a6d3fc8981797f459526199fab8ac9a..55608990d50b004eb1336d361fcd01f16a2a6af8 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,9 +7,9 @@
 #include "ClientSocket.c"
 #include "IRCParser.c"
 #include "UserNode.c"
+#include "ChanNode.c"
 
 #include "ChanUser.h"
-#include "ChanNode.h"
 
 void just_test_it() {
     struct UserNode *user = addUser("TestBot");