X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=IRCParser.c;h=8662f6d8399e3907f60ef1c9713cbc5a5e438d42;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=9918abca35138c4e69b5166135ec21c369f0af92;hpb=ad235e0a6aba61fd6a58afbac7f2c68d879ab4a8;p=NeonServV5.git diff --git a/IRCParser.c b/IRCParser.c index 9918abc..8662f6d 100644 --- a/IRCParser.c +++ b/IRCParser.c @@ -7,6 +7,9 @@ #include "ClientSocket.h" #include "WHOHandler.h" #include "lang.h" +#include "DBHelper.h" +#include "BanNode.h" +#include "ModeNode.h" struct irc_cmd *irc_commands = NULL; @@ -45,6 +48,7 @@ static void parse_line(struct ClientSocket *client, char *line) { if (*line == ':') { //the rest is a single parameter argv[argc++] = line + 1; + break; } argv[argc++] = line; if (argc >= MAXNUMPARAMS) @@ -82,7 +86,7 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char * if(!irc_cmd) { event_raw(client, from, cmd, argv, argc); } else if(!ret) { - fprintf(stderr,"PARSE ERROR: %s", cmd); + fprintf(stderr,"PARSE ERROR: %s\n", cmd); } } @@ -112,6 +116,7 @@ static IRC_CMD(raw_join) { struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot get_userlist(chan, got_channel_userlist, chanuser); putsock(client, "MODE %s", chan->name); + putsock(client, "MODE %s +b", chan->name); } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { struct ChanUser *chanuser = addChanUser(chan, user); event_join(chanuser); @@ -120,7 +125,7 @@ static IRC_CMD(raw_join) { } static IRC_CMD(raw_part) { - if(from == NULL || argc < 2) return 0; + if(from == NULL || argc < 1) return 0; struct UserNode *user = getUserByMask(from); if(user == NULL) return 0; struct ChanNode *chan = getChanByName(argv[0]); @@ -128,7 +133,7 @@ static IRC_CMD(raw_part) { if(isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { struct ChanUser *chanuser = getChanUser(user, chan); delChanUser(chanuser, 0); //we need to free the chanuser manually! - event_part(chanuser, argv[1]); + event_part(chanuser, (argc > 1 ? argv[1] : NULL)); free(chanuser); if(chan->chanbot == user) { //check if theres another bot in the channel - otherwise free it @@ -143,11 +148,11 @@ static IRC_CMD(raw_part) { } static IRC_CMD(raw_quit) { - if(from == NULL || argc < 2) return 0; + if(from == NULL || argc < 1) return 0; struct UserNode *user = getUserByMask(from); if(user == NULL) return 0; delUser(user, 0); //a little bit crazy, but we want to delete the user on the channel's userlists - but not the users channel list - event_quit(user, argv[1]); + event_quit(user, argv[0]); if(user->flags & USERFLAG_ISBOT) { //check if there are other bots in the users channel - otherwise free them struct ChanUser *chanuser, *next; @@ -195,7 +200,7 @@ static IRC_CMD(raw_kick) { } if(target->channel == NULL && !(target->flags & USERFLAG_ISBOT)) { //remove the user - delUser(user, 1); + delUser(target, 1); } return 1; } @@ -309,14 +314,18 @@ static IRC_CMD(raw_324) { //MODE LIST if(from == NULL || argc < 3) return 0; struct ChanNode *chan = getChanByName(argv[1]); if(chan == NULL) return 0; - parseModes(chan, argv[2], argv+3, argc-3); + parseModes(chan->modes, argv[2], argv+3, argc-3); return 1; } static IRC_CMD(raw_invite) { if(from == NULL || argc < 2) return 0; struct UserNode *user = getUserByMask(from); - event_invite(user, argv[1]); + if(user == NULL) { + user = createTempUser(from); + user->flags |= USERFLAG_ISTMPUSER; + } + event_invite(client, user, argv[1]); return 1; } @@ -333,17 +342,30 @@ static IRC_CMD(raw_mode) { if(!chan) return 0; if(chan->chanbot != client->user) return 1; event_mode(user, chan, argv[1], argv+2, argc-2); - parseModes(chan, argv[1], argv+2, argc-2); + parseModes(chan->modes, argv[1], argv+2, argc-2); } else { //UserMode } return 1; } +static IRC_CMD(raw_367) { + //Watchcat #pktest pk911!*@* TestBot!~bot@pktest.user.WebGamesNet 1315863279 + struct ChanNode *chan = getChanByName(argv[1]); + if(!chan) return 0; + struct BanNode *ban; + while((ban = getMatchingChannelBan(chan, argv[2]))) { + removeChannelBan(ban); + } + addChannelBan(chan, argv[2]); + return 1; +} + void init_parser() { //all the raws we receive... register_irc_function("001", raw_001); register_irc_function("324", raw_324); + register_irc_function("367", raw_367); register_irc_function("INVITE", raw_invite); register_irc_function("NOTICE", raw_notice); register_irc_function("TOPIC", raw_topic); @@ -371,8 +393,7 @@ void reply(struct ClientSocket *client, struct UserNode *user, const char *text, const char *reply_format = get_language_string(user, text); if(reply_format == NULL) reply_format = text; - if((user->flags & USERFLAG_ISAUTHED) && !(user->flags & USERFLAG_LOADED_SETTINGS)) - load_user_settings(user); + loadUserSettings(user); char formatBuf[MAXLEN]; sprintf(formatBuf, "%s %s :%s", ((user->flags & USERFLAG_REPLY_PRIVMSG) ? "PRIVMSG" : "NOTICE"), user->nick, reply_format); va_list arg_list; @@ -389,3 +410,18 @@ void reply(struct ClientSocket *client, struct UserNode *user, const char *text, write_socket(client, sendBuf, pos+1); } +char* merge_argv(char **argv, int start, int end) { + return merge_argv_char(argv, start, end, ' '); +} + +char* merge_argv_char(char **argv, int start, int end, char seperator) { + int i; + char *p = NULL; + for(i = start; i < end; i++) { + p = argv[i]; + while(*p) p++; + *p = seperator; + } + if(p) *p = '\0'; + return argv[start]; +}