X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=IRCParser.c;h=682cdf0fc811e170969388315791f34a5ef689d1;hb=84fb65ee885f3f747b0a07eb07999395c0ae22f9;hp=669b09d5046468adec1d9f1a2ad6e6367f9243ca;hpb=b3f2d5b1cd3644cf1b5487998567f3c39b70ff98;p=NeonServV5.git diff --git a/IRCParser.c b/IRCParser.c index 669b09d..682cdf0 100644 --- a/IRCParser.c +++ b/IRCParser.c @@ -78,38 +78,39 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char * break; } } - if(!ret) { - //fprintf(stderr,"PARSE ERROR: %s", cmd); commented out right now - we're still developing and this is very spammy + if(!irc_cmd) { + event_raw(client, from, cmd, argv, argc); + } else if(!ret) { + fprintf(stderr,"PARSE ERROR: %s", cmd); } } static USERLIST_CALLBACK(got_channel_userlist) { struct ChanUser *chanuser = data; event_join(chanuser); - putsock(client, "PRIVMSG %s :[BOT JOIN] Users on this Channel:", chan->name); - for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { - putsock(client, "PRIVMSG %s : %s!%s@%s [%s] rights: %d", chan->name, chanuser->user->nick, chanuser->user->ident, chanuser->user->host, ((chanuser->user->flags & USERFLAG_ISAUTHED) ? chanuser->user->auth : "*"), chanuser->flags); - } } static IRC_CMD(raw_001) { client->flags |= SOCKET_FLAG_READY; - putsock(client, "JOIN #pktest"); + event_bot_ready(client); return 1; } static IRC_CMD(raw_join) { if(from == NULL || argc < 1) return 0; struct UserNode *user = getUserByMask(from); + struct ChanNode *chan = getChanByName(argv[0]); + if(!chan && !(user->flags & USERFLAG_ISBOT)) return 0; if(user == NULL) { user = addUserMask(from); } - struct ChanNode *chan = getChanByName(argv[0]); if(chan == NULL) { chan = addChannel(argv[0]); //request member list + chan->chanbot = user; struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot get_userlist(chan, got_channel_userlist, chanuser); + putsock(client, "MODE %s", chan->name); } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { struct ChanUser *chanuser = addChanUser(chan, user); event_join(chanuser); @@ -128,7 +129,7 @@ static IRC_CMD(raw_part) { delChanUser(chanuser, 0); //we need to free the chanuser manually! event_part(chanuser, argv[1]); free(chanuser); - if(user->flags & USERFLAG_ISBOT) { + if(chan->chanbot == user) { //check if theres another bot in the channel - otherwise free it checkChannelVisibility(chan); } @@ -186,9 +187,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); @@ -206,40 +204,89 @@ static IRC_CMD(raw_topic) { struct UserNode *user = getUserByMask(from); struct ChanNode *chan = getChanByName(argv[0]); if(chan == NULL) return 0; + if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates if(user == NULL) { user = createTempUser(from); user->flags |= USERFLAG_ISTMPUSER; } event_topic(user, chan, argv[1]); strcpy(chan->topic, argv[1]); - if(user->flags & USERFLAG_ISTMPUSER) { - free(user); - } return 1; } static IRC_CMD(raw_privmsg) { if(from == NULL || argc < 2) return 0; struct UserNode *user = getUserByMask(from); - struct ChanNode *chan = getChanByName(argv[0]); - if(chan == NULL) return 0; if(user == NULL) { user = createTempUser(from); user->flags |= USERFLAG_ISTMPUSER; } - //TEST - struct ChanUser *chanuser; - putsock(client, "PRIVMSG %s :[PRIVMSG] Users on this Channel:", chan->name); - for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { - putsock(client, "PRIVMSG %s : %s!%s@%s [%s] rights: %d", chan->name, chanuser->user->nick, chanuser->user->ident, chanuser->user->host, ((chanuser->user->flags & USERFLAG_ISAUTHED) ? chanuser->user->auth : "*"), chanuser->flags); + if(argv[0][0] == '#') { //Channel message + struct ChanNode *chan = getChanByName(argv[0]); + if(chan && chan->chanbot == client->user) { + if(argv[1][0] == '\001') { + char *cmd = &argv[1][1]; + char *text = strstr(cmd, " "); + if(text) { + *text = '\0'; + text++; + if(strlen(text) && text[strlen(text)-1] == '\001') + text[strlen(text)-1] = '\0'; + } else if(strlen(cmd) && cmd[strlen(cmd)-1] == '\001') + cmd[strlen(cmd)-1] = '\0'; + event_chanctcp(user, chan, cmd, text); + } else + event_chanmsg(user, chan, argv[1]); + } + } else { + struct UserNode *target = getUserByNick(argv[0]); + if(target) { + if(argv[1][0] == '\001') { + char *cmd = &argv[1][1]; + char *text = strstr(cmd, " "); + if(text) { + *text = '\0'; + text++; + if(strlen(text) && text[strlen(text)-1] == '\001') + text[strlen(text)-1] = '\0'; + } else if(strlen(cmd) && cmd[strlen(cmd)-1] == '\001') + cmd[strlen(cmd)-1] = '\0'; + event_privctcp(user, target, cmd, text); + } else + event_privmsg(user, target, argv[1]); + } } - //END TEST - 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); + if(user == NULL) return 0; + 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]); @@ -256,16 +303,66 @@ static IRC_CMD(raw_315) { return 1; } -void parser_init() { +static IRC_CMD(raw_324) { //MODE LIST + //Watchcat #pktest +stnzN + 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); + return 1; +} + +static IRC_CMD(raw_invite) { + if(from == NULL || argc < 2) return 0; + struct UserNode *user = getUserByMask(from); + event_invite(user, argv[1]); + return 1; +} + +static IRC_CMD(raw_mode) { + 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] == '#') { + //ChannelMode + struct ChanNode *chan = getChanByName(argv[0]); + 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); + } else { + //UserMode + } + 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("INVITE", raw_invite); + 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("MODE", raw_mode); + register_irc_function("NICK", raw_nick); register_irc_function("354", raw_354); register_irc_function("315", raw_315); register_irc_function("PING", raw_ping); register_irc_function("PRIVMSG", raw_privmsg); } + +void free_parser() { + struct irc_cmd *cmd, *next; + for(cmd = irc_commands; cmd; cmd = next) { + next = cmd->next; + free(cmd); + } +} +