From 8fc68762e33d8ff24f5997228befbcf02e80a385 Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 12 Aug 2011 01:57:53 +0200 Subject: [PATCH] added some more events and changed TempUser-Handling --- IRCEvents.c | 35 +++++++++++++++++++++++++++++++++++ IRCEvents.h | 15 ++++++++++++--- IRCParser.c | 38 +++++++++++++++++++++++++++++--------- UserNode.c | 23 +++++++++++++++++++++-- UserNode.h | 15 +++++++++------ main.c | 8 +++++++- main.h | 3 +++ 7 files changed, 116 insertions(+), 21 deletions(-) diff --git a/IRCEvents.c b/IRCEvents.c index acf4ff5..010bb7a 100644 --- a/IRCEvents.c +++ b/IRCEvents.c @@ -1,10 +1,17 @@ #include "IRCEvents.h" +#include "UserNode.h" +#include "ChanNode.h" +#include "ChanUser.h" int event_join(struct ChanUser *chanuser) { return 1; } +int event_nick(struct UserNode *user, char *new_nick) { + return 1; +} + int event_part(struct ChanUser *chanuser, char *reason) { return 1; } @@ -21,6 +28,10 @@ int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_to return 1; } +int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **args, int argc) { + return 1; +} + int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) { return 1; } @@ -28,3 +39,27 @@ int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) { int event_privmsg(struct UserNode *user, struct UserNode *target, char *message) { return 1; } + +int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message) { + return 1; +} + +int event_privnotice(struct UserNode *user, struct UserNode *target, char *message) { + return 1; +} + +int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) { + return 1; +} + +int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) { + return 1; +} + +int event_invite(struct UserNode *user, struct ChanUser *target, char *channel) { + return 1; +} + +int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) { + return 1; +} diff --git a/IRCEvents.h b/IRCEvents.h index 1badf72..ce560ed 100644 --- a/IRCEvents.h +++ b/IRCEvents.h @@ -2,16 +2,25 @@ #define _IRCEvents_h #include "main.h" -#include "UserNode.h" -#include "ChanNode.h" -#include "ChanUser.h" + +struct UserNode; +struct ChanNode; +struct ChanUser; int event_join(struct ChanUser *chanuser); +int event_nick(struct UserNode *user, char *new_nick); int event_part(struct ChanUser *chanuser, char *reason); int event_quit(struct UserNode *user, char *reason); int event_kick(struct UserNode *user, struct ChanUser *target, char *reason); int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic); +int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc); int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message); int event_privmsg(struct UserNode *user, struct UserNode *target, char *message); +int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message); +int event_privnotice(struct UserNode *user, struct UserNode *target, char *message); +int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text); +int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text); +int event_invite(struct UserNode *user, struct ChanUser *target, char *channel); +int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc); #endif \ No newline at end of file diff --git a/IRCParser.c b/IRCParser.c index 3c99664..6e663e6 100644 --- a/IRCParser.c +++ b/IRCParser.c @@ -188,9 +188,6 @@ static IRC_CMD(raw_kick) { delChanUser(chanuser, 0); //we need to free the chanuser manually! event_kick(user, chanuser, argv[1]); free(chanuser); - if(user->flags & USERFLAG_ISTMPUSER) { - free(user); - } if(target->flags & USERFLAG_ISBOT) { //check if theres another bot in the channel - otherwise free it checkChannelVisibility(chan); @@ -215,9 +212,6 @@ static IRC_CMD(raw_topic) { } event_topic(user, chan, argv[1]); strcpy(chan->topic, argv[1]); - if(user->flags & USERFLAG_ISTMPUSER) { - free(user); - } return 1; } @@ -237,12 +231,36 @@ static IRC_CMD(raw_privmsg) { if(target) event_privmsg(user, target, argv[1]); } - if(user->flags & USERFLAG_ISTMPUSER) { - free(user); + return 1; +} + +static IRC_CMD(raw_notice) { + if(from == NULL || argc < 2) return 0; + struct UserNode *user = getUserByMask(from); + if(user == NULL) { + user = createTempUser(from); + user->flags |= USERFLAG_ISTMPUSER; + } + if(argv[0][0] == '#') { //Channel notice + struct ChanNode *chan = getChanByName(argv[0]); + if(chan && chan->chanbot == client->user) + event_channotice(user, chan, argv[1]); + } else { + struct UserNode *target = getUserByNick(argv[0]); + if(target) + event_privnotice(user, target, argv[1]); } return 1; } +static IRC_CMD(raw_nick) { + if(from == NULL || argc == 0) return 0; + struct UserNode *user = getUserByMask(from); + event_nick(user, argv[0]); + renameUser(user, argv[0]); + return 1; +} + static IRC_CMD(raw_ping) { if(argc == 0) return 0; putsock(client, "PONG :%s", argv[0]); @@ -262,11 +280,13 @@ static IRC_CMD(raw_315) { void parser_init() { //all the raws we receive... register_irc_function("001", raw_001); + register_irc_function("NOTICE", raw_notice); register_irc_function("TOPIC", raw_topic); register_irc_function("KICK", raw_kick); - register_irc_function("JOIN", raw_join); register_irc_function("PART", raw_part); register_irc_function("QUIT", raw_quit); + register_irc_function("JOIN", raw_join); + register_irc_function("NICK", raw_nick); register_irc_function("354", raw_354); register_irc_function("315", raw_315); register_irc_function("PING", raw_ping); diff --git a/UserNode.c b/UserNode.c index 1c223ac..465fd2e 100644 --- a/UserNode.c +++ b/UserNode.c @@ -4,8 +4,7 @@ static struct UserNode **userList; void init_UserNode() { - userList = calloc(VALID_NICK_CHARS_FIRST_LEN, sizeof(*userList)); - + userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList)); } int is_valid_nick(const char *nick) { @@ -99,6 +98,7 @@ struct UserNode* addUser(const char *nick) { return NULL; } strcpy(user->nick, nick); + user->created = time(0); user->ident[0] = 0; user->host[0] = 0; user->realname[0] = 0; @@ -152,6 +152,7 @@ struct UserNode* createTempUser(const char *mask) { return NULL; } strcpy(user->nick, cmask); + user->created = time(0); user->ident[0] = 0; user->host[0] = 0; user->realname[0] = 0; @@ -167,6 +168,7 @@ struct UserNode* createTempUser(const char *mask) { return NULL; } strcpy(user->host, cmask); + user->created = time(0); user->ident[0] = 0; user->host[0] = 0; user->realname[0] = 0; @@ -227,3 +229,20 @@ void delUser(struct UserNode* user, int freeUser) { else user->next = NULL; } + +void clearTempUsers() { + int userListIndex = TEMPUSER_LIST_INDEX; + struct UserNode *cuser, *last_user = NULL, *next; + time_t now = time(0); + for(cuser = userList[userListIndex]; cuser; cuser = next) { + next = cuser->next; + if(cuser->flags & USERFLAG_FREETMPUSER || now - cuser->created >= 300) { + if(last_user) + last_user->next = cuser->next; + else + userList[userListIndex] = cuser->next; + break; + } else + last_user = cuser; + } +} diff --git a/UserNode.h b/UserNode.h index 49bb940..eaddf59 100644 --- a/UserNode.h +++ b/UserNode.h @@ -2,11 +2,13 @@ #define _UserNode_h #include "main.h" -#define USERFLAG_ISBOT 0x01 -#define USERFLAG_ISAUTHED 0x02 -#define USERFLAG_ISIRCOP 0x04 -#define USERFLAG_ISTMPUSER 0x08 -#define USERFLAG_ISSERVER 0x10 +#define USERFLAG_ISBOT 0x0001 +#define USERFLAG_ISAUTHED 0x0002 +#define USERFLAG_ISIRCOP 0x0004 +#define USERFLAG_ISTMPUSER 0x0008 +#define USERFLAG_ISSERVER 0x0010 +#define USERFLAG_FREETMPUSER 0x0020 + struct ChanUser; struct UserNode { @@ -15,7 +17,8 @@ struct UserNode { char host[HOSTLEN+1]; char realname[REALLEN+1]; char auth[AUTHLEN+1]; - char flags; + unsigned int flags; + time_t created; struct ChanUser *channel; struct UserNode *next; diff --git a/main.c b/main.c index 04a9f7d..ddd5b5f 100644 --- a/main.c +++ b/main.c @@ -27,7 +27,13 @@ int main(void) init_UserNode(); init_ChanNode(); just_test_it(); + + time_t socket_wait; while(1) { - socket_loop(1); + socket_wait = time(0) + SOCKET_SELECT_TIME; + do { + socket_loop(SOCKET_SELECT_TIME); + } while(time(0) > socket_wait); + clearTempUsers(); } } diff --git a/main.h b/main.h index 802c1cb..75fdca3 100644 --- a/main.h +++ b/main.h @@ -41,6 +41,7 @@ int stricmp (const char *s1, const char *s2) return c1 - c2; } +#define SOCKET_SELECT_TIME 2 #define NICKLEN 30 #define USERLEN 10 @@ -59,4 +60,6 @@ int stricmp (const char *s1, const char *s2) #define VALID_NICK_CHARS_FIRST "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~[\\]^_`" #define VALID_NICK_CHARS_FIRST_LEN 62 +#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN + #endif \ No newline at end of file -- 2.20.1