From 2870c4da1aedf41926972dd60227c3d62cdaa123 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 16 Jun 2012 14:24:33 +0200 Subject: o Polishing the dynobot a bit. --- dynobot-irc.js | 183 +++++++++++++++------------------------------------------ 1 file changed, 48 insertions(+), 135 deletions(-) (limited to 'dynobot-irc.js') diff --git a/dynobot-irc.js b/dynobot-irc.js index 8258930..9cae258 100644 --- a/dynobot-irc.js +++ b/dynobot-irc.js @@ -1,60 +1,46 @@ require('tinycolor'); -var EventEmitter = require('events').EventEmitter; -var util = require('util'); +var Channel = require('dynobot/channel.js'); +var cmdopt = require('cmdopt') var cp = require('child_process'); +var EventEmitter = require('events').EventEmitter; +var FakeSocket = require('./FakeSocket.js'); var IrcClient = require('./irc-client').IrcClient; -var Service = require('dynobot/service.js'); -var Channel = require('dynobot/channel.js'); +var os = require('os') var _ = require('underscore'); -var rl = require('readline'); - -/************************************************************/ - -function FakeSocket(stdin, stdout, msgHandler) { - this.stdin = stdin; - this.stdout = stdout; - this.msgHandler = msgHandler; - this.connectHandler = undefined; - this.errorHandler = undefined; -} - -FakeSocket.prototype.setEncoding = function(encoding) { - this.stdin.setEncoding(encoding); -} +var Service = require('dynobot/service.js'); +var util = require('util'); -FakeSocket.prototype.on = function(event, cb) { - switch(event) { - case 'data': - this.stdin.on('data', function(chunk) { - cb(chunk.trim() + '\r\n'); - }); - break; - case 'connect': - this.connectHandler = cb; - break; - case 'close': - this.stdin.on('exit', cb); - break; - case 'end': - case 'error': - break; - default: - process.exit(1); - break; +var parser = new cmdopt.Parser(); +parser.option("-h, --help", "Show this help"); +parser.option("-s, --server=HOST", "Server to join"); +parser.option("-p, --port=PORT", "Port to use"); +parser.option("-n, --nick=NICK", "Nickname of the bot"); +parser.option("-c, --channel=CHANNEL", "IRC channel to join"); + +var args = process.argv.slice(2); +var defaults = { + server: "irc.freenode.org", + port: "6667", + nick: os.hostname(), + channel: "#dynobot" +}; + +try { + var config = parser.parse(args); + if (config.help) { + console.log(parser.help()); + return; } + config = _.defaults(config, defaults); + console.log("config", config); +} catch (ex) { + if (ex instanceof cmdopt.ParseError) { + process.stderr.write(ex.message + "\n"); + process.exit(1); + } + throw ex; } -FakeSocket.prototype.connect = function(server, port) { - this.connectHandler(); -} - -FakeSocket.prototype.write = function(chunk) { - this.stdout.write(chunk.red); - this.msgHandler && this.msgHandler(chunk); -} - -/************************************************************/ - var StdinPipe = function() { EventEmitter.call(this); } @@ -66,11 +52,8 @@ StdinPipe.prototype.send = function(msg) { stdinPipe.emit('data', msg + '\r\n'); } -/************************************************************/ - var stdinPipe = new StdinPipe(); var irc; -var nick = 'dynobot'; var realName = 'bots\'r\'us'; var ident = 'ident'; @@ -80,9 +63,7 @@ function info(a, b, c) { var reallyConnect = true; if(reallyConnect) { - var host = 'localhost'; - // host = 'irc.freenode.net'; - irc = new IrcClient(nick, realName, ident, host, 6667); + irc = new IrcClient(config.nick, realName, ident, config.server, config.port); } else { var msgHandler = function(line) { @@ -94,8 +75,7 @@ else { stdinPipe.send(prefix + ' JOIN ' + parts[1]); } } - irc = new IrcClient(nick, realName, ident,new FakeSocket(stdinPipe, process.stdout, msgHandler)); - process.stdin.resume(); + irc = new IrcClient(nick, realName, ident, new FakeSocket(stdinPipe, process.stdout, msgHandler)); } var ircService = new Service('irc', irc); @@ -109,8 +89,8 @@ function Plugin(name, script) { } var plugins = [ - new Plugin('echo', './echo-bot/index.js') -// new Plugin('atom', './atom-bot/index.js') +// new Plugin('echo', './echo-bot/index.js') + new Plugin('atom', './atom-bot/index.js') ]; _.each(plugins, function(plugin) { @@ -133,85 +113,18 @@ _.each(plugins, function(plugin) { // piping to process.stdout }); -process.stdin.resume(); -var i = rl.createInterface(process.stdin, process.stdout, null); - -function quit() { - i.close(); - process.stdin.destroy(); - process.exit(0); -} - -function setupRepl() { - var from = 'alice!~alice@example.com'; - var channel = '#bitraf2'; - - function updatePrompt() { - var prefix = 'from=' + from; - prefix += channel ? ', channel=' + channel : ''; - prefix += '> '; - i.setPrompt(prefix, prefix.length); - i.prompt(); - } - - i.on('line', function (cmd) { - cmd = cmd.trim(); - if(cmd.length == 0) { - i.prompt(); - return; - } - var parts = cmd.split(' '); - switch(parts[0]) { - case '/quit': - case '/q': - quit(); - break; - case '/raw': - case '/r': - parts.shift(); - stdinPipe.send(parts.join(' ')); - updatePrompt(); - break; - case '/join': - case '/j': - channel = parts[1]; - updatePrompt(); - break; - case '/from': - case '/f': - from = parts[1]; - updatePrompt(); - break; - case '/notice': - case '/n': - if(channel) { - parts.shift(); - stdinPipe.send(':' + from + ' NOTICE ' + channel + ' :' + parts.join(' ')); - } - else { - info('You have to /j a channel first'); - } - break; - default: - stdinPipe.send(':' + from + ' PRIVMSG ' + channel + ' :' + parts.join(' ')); - updatePrompt(); - break; - } - }).on('close', function() { - quit(); - }); - updatePrompt(); -} - -irc.join('#bitraf2', function(name) { +irc.join(config.channel, function(name) { info('joined ' + name + ' from dynobot.'); }); info('colors: ' + 'from bot'.red + ', ' + 'to bot'.blue); irc.connect(); -setupRepl(i); - -setTimeout(function() { - stdinPipe.send(':irc.foo.bar 001 this :Welcome to Some Internet Relay Chat Network this'); -}, 1000); +var repl = require('./Repl.js'); +repl.init(); +if(reallyConnect) { + repl.setupRepl(); +} +else { + repl.setupSimulatorRepl(); +} -- cgit v1.2.3