From c6dca9fe53f48a28c287d8c354e0dbc90a5e9e2f Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 10 Aug 2011 04:15:54 +0200 Subject: [PATCH] continued writing cache --- ChanNode.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ ChanNode.h | 13 ++++----- ClientSocket.c | 2 +- IRCEvents.h | 15 ++++++++++ IRCParser.c | 29 ++++++++++++++++++-- UserNode.c | 46 +++++++++++++++++++++++++++++++ UserNode.h | 2 ++ main.c | 2 +- 8 files changed, 171 insertions(+), 12 deletions(-) create mode 100644 ChanNode.c create mode 100644 IRCEvents.h diff --git a/ChanNode.c b/ChanNode.c new file mode 100644 index 0000000..5eafa32 --- /dev/null +++ b/ChanNode.c @@ -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 +} diff --git a/ChanNode.h b/ChanNode.h index ead845a..127d7b5 100644 --- a/ChanNode.h +++ b/ChanNode.h @@ -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 diff --git a/ClientSocket.c b/ClientSocket.c index 20ec724..1d5e2f1 100644 --- a/ClientSocket.c +++ b/ClientSocket.c @@ -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 index 0000000..a8047ee --- /dev/null +++ b/IRCEvents.h @@ -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 diff --git a/IRCParser.c b/IRCParser.c index eb2e8a4..f60d2aa 100644 --- a/IRCParser.c +++ b/IRCParser.c @@ -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); } diff --git a/UserNode.c b/UserNode.c index 21a7c81..8a03620 100644 --- a/UserNode.c +++ b/UserNode.c @@ -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; diff --git a/UserNode.h b/UserNode.h index a0e418f..d63fede 100644 --- a/UserNode.h +++ b/UserNode.h @@ -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 e12f79d..5560899 100644 --- 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"); -- 2.20.1