Permalink
Please
sign in to comment.
Showing
with
2,378 additions
and 1,911 deletions.
- +6 −165 bin/hubot
- +213 −0 bin/hubot.js
- +29 −0 es2015.js
- +0 −26 index.coffee
- +39 −0 index.js
- +0 −117 src/adapter.coffee
- +132 −0 src/adapter.js
- +0 −308 src/adapters/campfire.coffee
- +394 −0 src/adapters/campfire.js
- +0 −105 src/adapters/shell.coffee
- +135 −0 src/adapters/shell.js
- +0 −159 src/brain.coffee
- +198 −0 src/brain.js
- +0 −110 src/listener.coffee
- +134 −0 src/listener.js
- +0 −72 src/message.coffee
- +88 −0 src/message.js
- +0 −71 src/middleware.coffee
- +86 −0 src/middleware.js
- +0 −111 src/response.coffee
- +150 −0 src/response.js
- +0 −656 src/robot.coffee
- +749 −0 src/robot.js
- +0 −11 src/user.coffee
- +25 −0 src/user.js
| @@ -1,168 +1,9 @@ | |||
| #!/usr/bin/env coffee | |||
| # vim:ft=coffee ts=2 sw=2 et : | |||
| # -*- mode:coffee -*- | |||
|
|
|||
| Hubot = require '..' | |||
| # While all other files have been converted to JavaScript via https://github.com/github/hubot/pull/1347, | |||
| # we left the `bin/hubot` file to remain in CoffeeScript in order prevent | |||
| # breaking existing 3rd party adapters of which some are still written in | |||
| # CoffeeScript themselves. We will depracate and eventually remove this file | |||
| # in a future version of hubot | |||
|
|
|||
| Fs = require 'fs' | |||
| OptParse = require 'optparse' | |||
| Path = require 'path' | |||
|
|
|||
| Switches = [ | |||
| [ "-a", "--adapter ADAPTER", "The Adapter to use" ], | |||
| [ "-c", "--create PATH", "Create a deployable hubot" ], | |||
| [ "-d", "--disable-httpd", "Disable the HTTP server" ], | |||
| [ "-h", "--help", "Display the help information" ], | |||
| [ "-l", "--alias ALIAS", "Enable replacing the robot's name with alias" ], | |||
| [ "-n", "--name NAME", "The name of the robot in chat" ], | |||
| [ "-r", "--require PATH", "Alternative scripts path" ], | |||
| [ "-t", "--config-check", "Test hubot's config to make sure it won't fail at startup"] | |||
| [ "-v", "--version", "Displays the version of hubot installed" ] | |||
| ] | |||
|
|
|||
| Options = | |||
| adapter: process.env.HUBOT_ADAPTER or "shell" | |||
| alias: process.env.HUBOT_ALIAS or false | |||
| create: process.env.HUBOT_CREATE or false | |||
| enableHttpd: process.env.HUBOT_HTTPD or true | |||
| scripts: process.env.HUBOT_SCRIPTS or [] | |||
| name: process.env.HUBOT_NAME or "Hubot" | |||
| path: process.env.HUBOT_PATH or "." | |||
| configCheck: false | |||
|
|
|||
| Parser = new OptParse.OptionParser(Switches) | |||
| Parser.banner = "Usage hubot [options]" | |||
|
|
|||
| Parser.on "adapter", (opt, value) -> | |||
| Options.adapter = value | |||
|
|
|||
| Parser.on "create", (opt, value) -> | |||
| Options.path = value | |||
| Options.create = true | |||
|
|
|||
| Parser.on "disable-httpd", (opt) -> | |||
| Options.enableHttpd = false | |||
|
|
|||
| Parser.on "help", (opt, value) -> | |||
| console.log Parser.toString() | |||
| process.exit 0 | |||
|
|
|||
| Parser.on "alias", (opt, value) -> | |||
| value or= '/' | |||
| Options.alias = value | |||
|
|
|||
| Parser.on "name", (opt, value) -> | |||
| Options.name = value | |||
|
|
|||
| Parser.on "require", (opt, value) -> | |||
| Options.scripts.push(value) | |||
|
|
|||
| Parser.on "config-check", (opt) -> | |||
| Options.configCheck = true | |||
|
|
|||
| Parser.on "version", (opt, value) -> | |||
| Options.version = true | |||
|
|
|||
| Parser.on (opt, value) -> | |||
| console.warn "Unknown option: #{opt}" | |||
|
|
|||
| Parser.parse process.argv | |||
|
|
|||
| unless process.platform is "win32" | |||
| process.on 'SIGTERM', -> | |||
| process.exit 0 | |||
|
|
|||
| if Options.create | |||
| console.error "'hubot --create' is deprecated. Use the yeoman generator instead:" | |||
| console.error " npm install -g yo generator-hubot" | |||
| console.error " mkdir -p #{Options.path}" | |||
| console.error " cd #{Options.path}" | |||
| console.error " yo hubot" | |||
| console.error "See https://github.com/github/hubot/blob/master/docs/index.md for more details on getting started." | |||
| process.exit 1 | |||
|
|
|||
| else | |||
| robot = Hubot.loadBot undefined, Options.adapter, Options.enableHttpd, Options.name, Options.alias | |||
|
|
|||
| if Options.version | |||
| console.log robot.version | |||
| process.exit 0 | |||
|
|
|||
| loadScripts = -> | |||
| scriptsPath = Path.resolve ".", "scripts" | |||
| robot.load scriptsPath | |||
|
|
|||
| scriptsPath = Path.resolve ".", "src", "scripts" | |||
| robot.load scriptsPath | |||
|
|
|||
| hubotScripts = Path.resolve ".", "hubot-scripts.json" | |||
| if Fs.existsSync(hubotScripts) | |||
| data = Fs.readFileSync(hubotScripts) | |||
| if data.length > 0 | |||
| try | |||
| scripts = JSON.parse data | |||
| scriptsPath = Path.resolve "node_modules", "hubot-scripts", "src", "scripts" | |||
| robot.loadHubotScripts scriptsPath, scripts | |||
| catch err | |||
| robot.logger.error "Error parsing JSON data from hubot-scripts.json: #{err}" | |||
| process.exit(1) | |||
|
|
|||
| hubotScriptsWarning = "Loading scripts from hubot-scripts.json is deprecated and " + | |||
| "will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) " + | |||
| "in favor of packages for each script.\n\n" | |||
|
|
|||
| if scripts.length is 0 | |||
| hubotScriptsWarning += "Your hubot-scripts.json is empty, so you just need to remove it." | |||
| else | |||
| hubotScriptsReplacements = Path.resolve "node_modules", "hubot-scripts", "replacements.json" | |||
|
|
|||
| if Fs.existsSync(hubotScriptsReplacements) | |||
| hubotScriptsWarning += "The following scripts have known replacements. Follow the link for installation instructions, then remove it from hubot-scripts.json:\n" | |||
|
|
|||
| replacementsData = Fs.readFileSync(hubotScriptsReplacements) | |||
| replacements = JSON.parse(replacementsData) | |||
| scriptsWithoutReplacements = [] | |||
| for script in scripts | |||
| replacement = replacements[script] | |||
| if replacement | |||
| hubotScriptsWarning += "* #{script}: #{replacement}\n" | |||
| else | |||
| scriptsWithoutReplacements.push(script) | |||
| hubotScriptsWarning += "\n" | |||
|
|
|||
| if scriptsWithoutReplacements.length > 0 | |||
| hubotScriptsWarning += "The following scripts don't have (known) replacements. You can try searching https://www.npmjs.com/ or http://github.com/search or your favorite search engine. You can copy the script into your local scripts directory, or consider creating a new package to maintain yourself. If you find a replacement or create a package yourself, please post on https://github.com/github/hubot-scripts/issues/1641:\n" | |||
| hubotScriptsWarning += "* #{script}\n" for script in scriptsWithoutReplacements | |||
|
|
|||
| hubotScriptsWarning += "\nYou an also try updating hubot-scripts to get the latest list of replacements: npm install --save hubot-scripts@latest" | |||
| else | |||
| hubotScriptsWarning += "To get a list of recommended replacements, update your hubot-scripts: npm install --save hubot-scripts@latest" | |||
|
|
|||
| robot.logger.warning hubotScriptsWarning | |||
|
|
|||
| externalScripts = Path.resolve ".", "external-scripts.json" | |||
| if Fs.existsSync(externalScripts) | |||
| Fs.readFile externalScripts, (err, data) -> | |||
| if data.length > 0 | |||
| try | |||
| scripts = JSON.parse data | |||
| catch err | |||
| console.error "Error parsing JSON data from external-scripts.json: #{err}" | |||
| process.exit(1) | |||
| robot.loadExternalScripts scripts | |||
|
|
|||
| for path in Options.scripts | |||
| if path[0] == '/' | |||
| scriptsPath = path | |||
| else | |||
| scriptsPath = Path.resolve ".", path | |||
| robot.load scriptsPath | |||
|
|
|||
| if Options.configCheck | |||
| loadScripts() | |||
| console.log "OK" | |||
| process.exit 0 | |||
|
|
|||
| robot.adapter.once 'connected', loadScripts | |||
|
|
|||
| robot.run() | |||
| require './hubot.js' | |||
| @@ -0,0 +1,213 @@ | |||
| 'use strict' | |||
|
|
|||
| const fs = require('fs') | |||
| const pathResolve = require('path').resolve | |||
|
|
|||
| const OptParse = require('optparse') | |||
|
|
|||
| const Hubot = require('..') | |||
|
|
|||
| const switches = [ | |||
| ['-a', '--adapter ADAPTER', 'The Adapter to use'], | |||
| ['-c', '--create PATH', 'Create a deployable hubot'], | |||
| ['-d', '--disable-httpd', 'Disable the HTTP server'], | |||
| ['-h', '--help', 'Display the help information'], | |||
| ['-l', '--alias ALIAS', "Enable replacing the robot's name with alias"], | |||
| ['-n', '--name NAME', 'The name of the robot in chat'], | |||
| ['-r', '--require PATH', 'Alternative scripts path'], | |||
| ['-t', '--config-check', "Test hubot's config to make sure it won't fail at startup"], | |||
| ['-v', '--version', 'Displays the version of hubot installed'] | |||
| ] | |||
|
|
|||
| const options = { | |||
| adapter: process.env.HUBOT_ADAPTER || 'shell', | |||
| alias: process.env.HUBOT_ALIAS || false, | |||
| create: process.env.HUBOT_CREATE || false, | |||
| enableHttpd: process.env.HUBOT_HTTPD || true, | |||
| scripts: process.env.HUBOT_SCRIPTS || [], | |||
| name: process.env.HUBOT_NAME || 'Hubot', | |||
| path: process.env.HUBOT_PATH || '.', | |||
| configCheck: false | |||
| } | |||
|
|
|||
| const Parser = new OptParse.OptionParser(switches) | |||
| Parser.banner = 'Usage hubot [options]' | |||
|
|
|||
| Parser.on('adapter', (opt, value) => { | |||
| options.adapter = value | |||
| }) | |||
|
|
|||
| Parser.on('create', function (opt, value) { | |||
| options.path = value | |||
| options.create = true | |||
| }) | |||
|
|
|||
| Parser.on('disable-httpd', opt => { | |||
| options.enableHttpd = false | |||
| }) | |||
|
|
|||
| Parser.on('help', function (opt, value) { | |||
| console.log(Parser.toString()) | |||
| return process.exit(0) | |||
| }) | |||
|
|
|||
| Parser.on('alias', function (opt, value) { | |||
| if (!value) { | |||
| value = '/' | |||
| } | |||
| options.alias = value | |||
| }) | |||
|
|
|||
| Parser.on('name', (opt, value) => { | |||
| options.name = value | |||
| }) | |||
|
|
|||
| Parser.on('require', (opt, value) => { | |||
| options.scripts.push(value) | |||
| }) | |||
|
|
|||
| Parser.on('config-check', opt => { | |||
| options.configCheck = true | |||
| }) | |||
|
|
|||
| Parser.on('version', (opt, value) => { | |||
| options.version = true | |||
| }) | |||
|
|
|||
| Parser.on((opt, value) => { | |||
| console.warn(`Unknown option: ${opt}`) | |||
| }) | |||
|
|
|||
| Parser.parse(process.argv) | |||
|
|
|||
| if (process.platform !== 'win32') { | |||
| process.on('SIGTERM', () => process.exit(0)) | |||
| } | |||
|
|
|||
| if (options.create) { | |||
| console.error("'hubot --create' is deprecated. Use the yeoman generator instead:") | |||
| console.error(' npm install -g yo generator-hubot') | |||
| console.error(` mkdir -p ${options.path}`) | |||
| console.error(` cd ${options.path}`) | |||
| console.error(' yo hubot') | |||
| console.error('See https://github.com/github/hubot/blob/master/docs/index.md for more details on getting started.') | |||
| process.exit(1) | |||
| } | |||
|
|
|||
| const robot = Hubot.loadBot(undefined, options.adapter, options.enableHttpd, options.name, options.alias) | |||
|
|
|||
| if (options.version) { | |||
| console.log(robot.version) | |||
| process.exit(0) | |||
| } | |||
|
|
|||
| if (options.configCheck) { | |||
| loadScripts() | |||
| console.log('OK') | |||
| process.exit(0) | |||
| } | |||
|
|
|||
| robot.adapter.once('connected', loadScripts) | |||
|
|
|||
| robot.run() | |||
|
|
|||
| function loadScripts () { | |||
| robot.load(pathResolve('.', 'scripts')) | |||
| robot.load(pathResolve('.', 'src', 'scripts')) | |||
|
|
|||
| loadHubotScripts() | |||
| loadExternalScripts() | |||
|
|
|||
| options.scripts.forEach((scriptPath) => { | |||
| if (scriptPath[0] === '/') { | |||
| return robot.load(scriptPath) | |||
| } | |||
|
|
|||
| robot.load(pathResolve('.', scriptPath)) | |||
| }) | |||
| } | |||
|
|
|||
| function loadHubotScripts () { | |||
| const hubotScripts = pathResolve('.', 'hubot-scripts.json') | |||
| let scripts | |||
| let scriptsPath | |||
|
|
|||
| if (fs.existsSync(hubotScripts)) { | |||
| let hubotScriptsWarning | |||
| const data = fs.readFileSync(hubotScripts) | |||
|
|
|||
| if (data.length === 0) { | |||
| return | |||
| } | |||
|
|
|||
| try { | |||
| scripts = JSON.parse(data) | |||
| scriptsPath = pathResolve('node_modules', 'hubot-scripts', 'src', 'scripts') | |||
| robot.loadHubotScripts(scriptsPath, scripts) | |||
| } catch (error) { | |||
| const err = error | |||
| robot.logger.error(`Error parsing JSON data from hubot-scripts.json: ${err}`) | |||
| process.exit(1) | |||
| } | |||
|
|
|||
| hubotScriptsWarning = 'Loading scripts from hubot-scripts.json is deprecated and ' + 'will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) ' + 'in favor of packages for each script.\n\n' | |||
|
|
|||
| if (scripts.length === 0) { | |||
| hubotScriptsWarning += 'Your hubot-scripts.json is empty, so you just need to remove it.' | |||
| return robot.logger.warning(hubotScriptsWarning) | |||
| } | |||
|
|
|||
| const hubotScriptsReplacements = pathResolve('node_modules', 'hubot-scripts', 'replacements.json') | |||
| const replacementsData = fs.readFileSync(hubotScriptsReplacements) | |||
| const replacements = JSON.parse(replacementsData) | |||
| const scriptsWithoutReplacements = [] | |||
|
|
|||
| if (!fs.existsSync(hubotScriptsReplacements)) { | |||
| hubotScriptsWarning += 'To get a list of recommended replacements, update your hubot-scripts: npm install --save hubot-scripts@latest' | |||
| return robot.logger.warning(hubotScriptsWarning) | |||
| } | |||
|
|
|||
| hubotScriptsWarning += 'The following scripts have known replacements. Follow the link for installation instructions, then remove it from hubot-scripts.json:\n' | |||
|
|
|||
| scripts.forEach((script) => { | |||
| const replacement = replacements[script] | |||
|
|
|||
| if (replacement) { | |||
| hubotScriptsWarning += `* ${script}: ${replacement}\n` | |||
| } else { | |||
| scriptsWithoutReplacements.push(script) | |||
| } | |||
| }) | |||
|
|
|||
| hubotScriptsWarning += '\n' | |||
|
|
|||
| if (scriptsWithoutReplacements.length > 0) { | |||
| hubotScriptsWarning += 'The following scripts don’t have (known) replacements. You can try searching https://www.npmjs.com/ or http://github.com/search or your favorite search engine. You can copy the script into your local scripts directory, or consider creating a new package to maintain yourself. If you find a replacement or create a package yourself, please post on https://github.com/github/hubot-scripts/issues/1641:\n' | |||
| hubotScriptsWarning += scriptsWithoutReplacements.map((script) => `* ${script}\n`).join('') | |||
| hubotScriptsWarning += '\nYou an also try updating hubot-scripts to get the latest list of replacements: npm install --save hubot-scripts@latest' | |||
| } | |||
|
|
|||
| robot.logger.warning(hubotScriptsWarning) | |||
| } | |||
| } | |||
|
|
|||
| function loadExternalScripts () { | |||
| const externalScripts = pathResolve('.', 'external-scripts.json') | |||
|
|
|||
| if (!fs.existsSync(externalScripts)) { | |||
| return | |||
| } | |||
|
|
|||
| fs.readFile(externalScripts, function (error, data) { | |||
| if (error) { | |||
| throw error | |||
| } | |||
|
|
|||
| try { | |||
| robot.loadExternalScripts(JSON.parse(data)) | |||
| } catch (error) { | |||
| console.error(`Error parsing JSON data from external-scripts.json: ${error}`) | |||
| process.exit(1) | |||
| } | |||
| }) | |||
| } | |||
Oops, something went wrong.
0 comments on commit
7939b8f