%%% Scan known ip's on channel for Spammer-Hosts private variable resolv2; private variable RBL_busy = 0; private variable RBL_list; private variable RBL_dirty; private variable RBL_clean; private variable RBL_fail; private variable SpammerIP = inet_addr("127.0.0.2"); private define DQrev(ip) { variable dqr,b; b = strchop(inet_ntoa(ip),'.',0); dqr = b[3] + "." + b[2] + "." + b[1] + "." + b[0]; return dqr; } private define send_RBL_req(ip) { variable ahost,l,req,r; ahost = "xxxxyyyy" + DQrev(ip) + ".rbl.maps.vix.com"; l = strlen(ahost); req = Char_Type[l]; init_char_array(req,ahost); RBL_busy = 1; r = vf_write(resolv2,req); } define Hresolv2(vf,i) { variable q,nc,r,ip,herr,rhost,dqp; q = RBL_list.f; nc = q.v; variable ar = Char_Type[1024]; r = vf_read(vf,ar); if (r > 8) { ip = array_get_u32(ar,0); herr = array_get_u32(ar,4); rhost = array_get_string(ar,8); dqp = DQrev(nc.hip) + "."; if (is_prefix(rhost,dqp)) { nc.rbl = ip; if (ip == SpammerIP){ irc_Logf("[RBL] %s is at SpamHost %s",nc.nick,nc.uhost); RBL_dirty++; }else{ if (herr != 1) RBL_fail++; else RBL_clean++; % irc_Logf("[RBL] %s herr=%d for %s", % inet_ntoa(ip),herr,inet_ntoa(nc.hip)); } }else{ irc_Logf("[RBL] phase error: %s to %s",rhost,chop_last(dqp)); RBL_fail++; } }else{ RBL_fail++; } forever { s_del(q); q = RBL_list.f; if (q == NULL) break; nc = q.v; if (nc.rbl != NULL) { % delete unnecessary requests if (nc.rbl != SpammerIP) RBL_clean++;else RBL_dirty++; continue; } send_RBL_req(nc.hip); return; } () = set_action(vf,0,NULL); () = vf_close(vf); irc_Logf("[RBL] %d/%d/%d spam/clean/fail",RBL_dirty,RBL_clean,RBL_fail); RBL_busy = 0; } %private variable cmds_RBL_pm = NullString; private define cmds_RBL(p,i) { variable s = ""; if (p.v.hip != NULL) if (p.v.hip != -1) () = s_putlast(RBL_list,p.v); } %add_cmnd("rbl"); define command_RBL(params) { if (RBL_busy){ irc_log("[RBL] Previous scan in progress"); return; } % params = strtrim(params); % cmds_RBL_pm = params; RBL_list = make_list(); s_dofunc(nick_chan,&cmds_RBL); !if (RBL_list.ct) return; resolv2 = open_resolver(); if (resolv2 == NULL) { irc_log("[RBL] Can't open resolv2"); return; } RBL_clean = 0; RBL_dirty = 0; RBL_fail = 0; variable nc = RBL_list.f.v; send_RBL_req(nc.hip); () = set_action(resolv2,0,"Hresolv2"); }