diff --git a/exec/ircbot.js b/exec/ircbot.js index b03005e2615ba52b13687c10ebac5c8356e541e7..1f7c17ef8fb39a0a33709392ad01e979cc9d2eba 100644 --- a/exec/ircbot.js +++ b/exec/ircbot.js @@ -201,14 +201,10 @@ function init_users() { function main() { log("*** Entering Main Loop. ***"); while (!js.terminated) { + // Build array of sockets for select() + var socks=[]; for (my_srv in Bot_Servers) { - var cmdline; - var srv = Bot_Servers[my_srv]; - - if(srv.sock && (!srv.sock.is_connected)) { - srv.sock.close(); - src.sock=0; - } + var srv=Bot_Servers[my_srv]; if (!srv.sock &&(srv.lastcon <time())) { //we're not connected. var consock = IRC_client_connect(srv.host, srv.nick, srv.nick, real_name, srv.port); @@ -224,117 +220,140 @@ function main() { + "retry in 60 seconds."); srv.lastcon = time() + 60; } - } else if (srv.sock && srv.sock.data_waiting && - (cmdline=srv.sock.recvline(4096,0))) { - var onick; - var ouh; - var outline; - var sorigin = cmdline.split(" ")[0].slice(1); - if ((cmdline[0] == ":") && sorigin.match(/[@]/)) { - onick = sorigin.split("!")[0]; - ouh = sorigin.split("!")[1]; - outline = "["+onick+"("+ouh+")] " + cmdline; - } else { - onick = ""; - ouh = ""; - outline = cmdline; - } - log("<-- " + srv.host + ": " + outline); - if(!srv.ignore[onick.toUpperCase()]) { - srv.server_command(srv,cmdline,onick,ouh); - } } - - // Run through some commands. - if (srv.sock && srv.is_registered) { - if(!srv.is_identified) { - /* If we have a password for services, send it now */ - if(srv.svspass) srv.writeout("IDENTIFY " + srv.svspass); - // TODO: verify that the raw IDENTIFY command works, and if not, send /MSG NickServ IDENTIFY <Pass> - srv.is_identified = true; - } - for (c in srv.channel) { - if (!srv.channel[c].is_joined && - (srv.channel[c].lastjoin < time())) { - if(srv.channel[c].key) srv.writeout("JOIN " + srv.channel[c].name + " " + srv.channel[c].key); - else srv.writeout("JOIN " + srv.channel[c].name); - srv.channel[c].lastjoin = time() + 60; + else if(srv.sock) { + // Run through some commands. + if (srv.is_registered) { + if(!srv.is_identified) { + /* If we have a password for services, send it now */ + if(srv.svspass) srv.writeout("IDENTIFY " + srv.svspass); + // TODO: verify that the raw IDENTIFY command works, and if not, send /MSG NickServ IDENTIFY <Pass> + srv.is_identified = true; } - // Cycle any available module "main" functions - for(var m in Modules) { - var module=Modules[m]; - if(module && module.enabled && module.main) { - try { - module.main(srv,srv.channel[c].name); - } catch(e) { - srv.o(srv.channel[c].name,m.toLowerCase() + " module error: " + e,"NOTICE"); - module.enabled=false; + for (c in srv.channel) { + if (!srv.channel[c].is_joined && + (srv.channel[c].lastjoin < time())) { + if(srv.channel[c].key) srv.writeout("JOIN " + srv.channel[c].name + " " + srv.channel[c].key); + else srv.writeout("JOIN " + srv.channel[c].name); + srv.channel[c].lastjoin = time() + 60; + } + // Cycle any available module "main" functions + for(var m in Modules) { + var module=Modules[m]; + if(module && module.enabled && module.main) { + try { + module.main(srv,srv.channel[c].name); + } catch(e) { + srv.o(srv.channel[c].name,m.toLowerCase() + " module error: " + e,"NOTICE"); + module.enabled=false; + } } } } } - } - // Cycle server output buffer (srv.buffer) - while(srv.sock && srv.burst<srv.max_burst) { - srv.burst++; - if(!srv.buffers.length>0) break; - var next_output=srv.buffers.shift(); - srv.sock.write(next_output.buffer.shift()); - if(next_output.buffer.length) srv.buffers.push(next_output); - } - var curtime=system.timer; - if ((curtime-srv.lastout)>srv.delay) { - srv.lastout=system.timer; - srv.burst=0; + // Cycle server output buffer (srv.buffer) + while(srv.burst<srv.max_burst) { + srv.burst++; + if(!srv.buffers.length>0) break; + var next_output=srv.buffers.shift(); + if(!srv.sock.write(next_output.buffer.shift())) { + srv.sock.close(); + src.sock=0; + continue; + } + if(next_output.buffer.length) srv.buffers.push(next_output); + } + var curtime=system.timer; + if ((curtime-srv.lastout)>srv.delay) { + srv.lastout=system.timer; + srv.burst=0; + } + + // Push into the select array + srv.sock.srv=my_srv; + socks.push(srv.sock); } } - - /* Take care of DCC chat sessions */ for (c in DCC_Chats) { - if (!DCC_Chats[c].sock.is_connected) { - log("Closing session."); - DCC_Chats[c].sock.close(); - delete DCC_Chats[c]; - continue; - } - if (DCC_Chats[c].waiting_for_password) { - var dcc_pwd; - if (dcc_pwd=DCC_Chats[c].sock.readln()) { - var usr = new User(system.matchuser(DCC_Chats[c].id)); - if (!usr || - (dcc_pwd.toUpperCase() != usr.security.password)) { - DCC_Chats[c].o(null,"Access Denied."); - DCC_Chats[c].sock.close(); - delete DCC_Chats[c]; - continue; + DCC_Chats[c].sock.chat=c; + socks.push(DCC_Chats[c].sock); + } + var ready=socket_select(socks, 0.1); + + for(var s in ready) { + if(socks[s].srv != undefined) { + var srv=Bot_Servers[socks[s].srv]; + if(srv.sock && (!srv.sock.is_connected)) { + srv.sock.close(); + src.sock=0; + } + if (srv.sock && srv.sock.poll(0.1) && + (cmdline=srv.sock.recvline(4096,0))) { + var onick; + var ouh; + var outline; + var sorigin = cmdline.split(" ")[0].slice(1); + if ((cmdline[0] == ":") && sorigin.match(/[@]/)) { + onick = sorigin.split("!")[0]; + ouh = sorigin.split("!")[1]; + outline = "["+onick+"("+ouh+")] " + cmdline; + } else { + onick = ""; + ouh = ""; + outline = cmdline; } - if (dcc_pwd.toUpperCase() == usr.security.password) { - DCC_Chats[c].waiting_for_password = false; - DCC_Chats[c].o(null,"Welcome aboard."); + log("<-- " + srv.host + ": " + outline); + if(!srv.ignore[onick.toUpperCase()]) { + srv.server_command(srv,cmdline,onick,ouh); } } - continue; + } - var line = DCC_Chats[c].sock.readln(); - if (!line || line == "") - continue; - var usr = new User(system.matchuser(DCC_Chats[c].id)); - var cmd = line.split(" "); - cmd[0] = cmd[0].toUpperCase(); - try { - DCC_Chats[c].bot_command(cmd); - } catch (err) { - DCC_Chats[c].o(null,err); - DCC_Chats[c].o(null,"file: " + err.fileName); - DCC_Chats[c].o(null,"line: " + err.lineNumber); + if(socks[s].chat != undefined) { + var c=socks[s].chat; + if (!DCC_Chats[c].sock.is_connected) { + log("Closing session."); + DCC_Chats[c].sock.close(); + delete DCC_Chats[c]; + continue; + } + if (DCC_Chats[c].waiting_for_password) { + var dcc_pwd; + if (dcc_pwd=DCC_Chats[c].sock.readln()) { + var usr = new User(system.matchuser(DCC_Chats[c].id)); + if (!usr || + (dcc_pwd.toUpperCase() != usr.security.password)) { + DCC_Chats[c].o(null,"Access Denied."); + DCC_Chats[c].sock.close(); + delete DCC_Chats[c]; + continue; + } + if (dcc_pwd.toUpperCase() == usr.security.password) { + DCC_Chats[c].waiting_for_password = false; + DCC_Chats[c].o(null,"Welcome aboard."); + } + } + continue; + } + var line = DCC_Chats[c].sock.readln(); + if (!line || line == "") + continue; + var usr = new User(system.matchuser(DCC_Chats[c].id)); + var cmd = line.split(" "); + cmd[0] = cmd[0].toUpperCase(); + try { + DCC_Chats[c].bot_command(cmd); + } catch (err) { + DCC_Chats[c].o(null,err); + DCC_Chats[c].o(null,"file: " + err.fileName); + DCC_Chats[c].o(null,"line: " + err.lineNumber); + } } } if ( (time() - config_last_write) > config_write_delay ) save_everything(); - - mswait(10); /* Don't peg the CPU */ } }