commit 712c93b9d6d36e043c16b0aa557ecf606516e0ee Author: Sebastian Kippe Date: Sun Apr 26 23:20:26 2015 +0200 Initial kommit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5760be5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9049bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store* +.hubot_history diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..ce1dc01 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: bin/hubot -a irc diff --git a/README.md b/README.md new file mode 100644 index 0000000..b1b9bab --- /dev/null +++ b/README.md @@ -0,0 +1,214 @@ +# hal9000 + +hal9000 is a chat bot built on the [Hubot][hubot] framework. It was +initially generated by [generator-hubot][generator-hubot], and configured to be +deployed on [Heroku][heroku] to get you up and running as quick as possible. + +This README is intended to help get you started. Definitely update and improve +to talk about your own instance, how to use and deploy, what functionality he +has, etc! + +[heroku]: http://www.heroku.com +[hubot]: http://hubot.github.com +[generator-hubot]: https://github.com/github/generator-hubot + +### Running hal9000 Locally + +You can test your hubot by running the following, however some plugins will not +behave as expected unless the [environment variables](#configuration) they rely +upon have been set. + +You can start hal9000 locally by running: + + % bin/hubot + +You'll see some start up output and a prompt: + + [Sat Feb 28 2015 12:38:27 GMT+0000 (GMT)] INFO Using default redis on localhost:6379 + hal9000> + +Then you can interact with hal9000 by typing `hal9000 help`. + + hal9000> hal9000 help + hal9000 animate me - The same thing as `image me`, except adds [snip] + hal9000 help - Displays all of the help commands that hal9000 knows about. + ... + +### Configuration + +A few scripts (including some installed by default) require environment +variables to be set as a simple form of configuration. + +Each script should have a commented header which contains a "Configuration" +section that explains which values it requires to be placed in which variable. +When you have lots of scripts installed this process can be quite labour +intensive. The following shell command can be used as a stop gap until an +easier way to do this has been implemented. + + grep -o 'hubot-[a-z0-9_-]\+' external-scripts.json | \ + xargs -n1 -i sh -c 'sed -n "/^# Configuration/,/^#$/ s/^/{} /p" \ + $(find node_modules/{}/ -name "*.coffee")' | \ + awk -F '#' '{ printf "%-25s %s\n", $1, $2 }' + +How to set environment variables will be specific to your operating system. +Rather than recreate the various methods and best practices in achieving this, +it's suggested that you search for a dedicated guide focused on your OS. + +### Scripting + +An example script is included at `scripts/example.coffee`, so check it out to +get started, along with the [Scripting Guide](scripting-docs). + +For many common tasks, there's a good chance someone has already one to do just +the thing. + +[scripting-docs]: https://github.com/github/hubot/blob/master/docs/scripting.md + +### external-scripts + +There will inevitably be functionality that everyone will want. Instead of +writing it yourself, you can use existing plugins. + +Hubot is able to load plugins from third-party `npm` packages. This is the +recommended way to add functionality to your hubot. You can get a list of +available hubot plugins on [npmjs.com](npmjs) or by using `npm search`: + + % npm search hubot-scripts panda + NAME DESCRIPTION AUTHOR DATE VERSION KEYWORDS + hubot-pandapanda a hubot script for panda responses =missu 2014-11-30 0.9.2 hubot hubot-scripts panda + ... + + +To use a package, check the package's documentation, but in general it is: + +1. Use `npm install --save` to add the package to `package.json` and install it +2. Add the package name to `external-scripts.json` as a double quoted string + +You can review `external-scripts.json` to see what is included by default. + +##### Advanced Usage + +It is also possible to define `external-scripts.json` as an object to +explicitly specify which scripts from a package should be included. The example +below, for example, will only activate two of the six available scripts inside +the `hubot-fun` plugin, but all four of those in `hubot-auto-deploy`. + +```json +{ + "hubot-fun": [ + "crazy", + "thanks" + ], + "hubot-auto-deploy": "*" +} +``` + +**Be aware that not all plugins support this usage and will typically fallback +to including all scripts.** + +[npmjs]: https://www.npmjs.com + +### hubot-scripts + +Before hubot plugin packages were adopted, most plugins were held in the +[hubot-scripts][hubot-scripts] package. Some of these plugins have yet to be +migrated to their own packages. They can still be used but the setup is a bit +different. + +To enable scripts from the hubot-scripts package, add the script name with +extension as a double quoted string to the `hubot-scripts.json` file in this +repo. + +[hubot-scripts]: https://github.com/github/hubot-scripts + +## Persistence + +If you are going to use the `hubot-redis-brain` package (strongly suggested), +you will need to add the Redis to Go addon on Heroku which requires a verified +account or you can create an account at [Redis to Go][redistogo] and manually +set the `REDISTOGO_URL` variable. + + % heroku config:add REDISTOGO_URL="..." + +If you don't need any persistence feel free to remove the `hubot-redis-brain` +from `external-scripts.json` and you don't need to worry about redis at all. + +[redistogo]: https://redistogo.com/ + +## Adapters + +Adapters are the interface to the service you want your hubot to run on, such +as Campfire or IRC. There are a number of third party adapters that the +community have contributed. Check [Hubot Adapters][hubot-adapters] for the +available ones. + +If you would like to run a non-Campfire or shell adapter you will need to add +the adapter package as a dependency to the `package.json` file in the +`dependencies` section. + +Once you've added the dependency with `npm install --save` to install it you +can then run hubot with the adapter. + + % bin/hubot -a + +Where `` is the name of your adapter without the `hubot-` prefix. + +[hubot-adapters]: https://github.com/github/hubot/blob/master/docs/adapters.md + +## Deployment + + % heroku create --stack cedar + % git push heroku master + +If your Heroku account has been verified you can run the following to enable +and add the Redis to Go addon to your app. + + % heroku addons:add redistogo:nano + +If you run into any problems, checkout Heroku's [docs][heroku-node-docs]. + +You'll need to edit the `Procfile` to set the name of your hubot. + +More detailed documentation can be found on the [deploying hubot onto +Heroku][deploy-heroku] wiki page. + +### Deploying to UNIX or Windows + +If you would like to deploy to either a UNIX operating system or Windows. +Please check out the [deploying hubot onto UNIX][deploy-unix] and [deploying +hubot onto Windows][deploy-windows] wiki pages. + +[heroku-node-docs]: http://devcenter.heroku.com/articles/node-js +[deploy-heroku]: https://github.com/github/hubot/blob/master/docs/deploying/heroku.md +[deploy-unix]: https://github.com/github/hubot/blob/master/docs/deploying/unix.md +[deploy-windows]: https://github.com/github/hubot/blob/master/docs/deploying/unix.md + +## Campfire Variables + +If you are using the Campfire adapter you will need to set some environment +variables. If not, refer to your adapter documentation for how to configure it, +links to the adapters can be found on [Hubot Adapters][hubot-adapters]. + +Create a separate Campfire user for your bot and get their token from the web +UI. + + % heroku config:add HUBOT_CAMPFIRE_TOKEN="..." + +Get the numeric IDs of the rooms you want the bot to join, comma delimited. If +you want the bot to connect to `https://mysubdomain.campfirenow.com/room/42` +and `https://mysubdomain.campfirenow.com/room/1024` then you'd add it like +this: + + % heroku config:add HUBOT_CAMPFIRE_ROOMS="42,1024" + +Add the subdomain hubot should connect to. If you web URL looks like +`http://mysubdomain.campfirenow.com` then you'd add it like this: + + % heroku config:add HUBOT_CAMPFIRE_ACCOUNT="mysubdomain" + +[hubot-adapters]: https://github.com/github/hubot/blob/master/docs/adapters.md + +## Restart the bot + +You may want to get comfortable with `heroku logs` and `heroku restart` if +you're having issues. diff --git a/bin/hubot b/bin/hubot new file mode 100755 index 0000000..36c9eb4 --- /dev/null +++ b/bin/hubot @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +npm install +export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH" + +exec node_modules/.bin/hubot --name "hal9000" "$@" diff --git a/bin/hubot.cmd b/bin/hubot.cmd new file mode 100644 index 0000000..5cad12c --- /dev/null +++ b/bin/hubot.cmd @@ -0,0 +1,3 @@ +@echo off + +npm install && node_modules\.bin\hubot.cmd --name "hal9000" %* \ No newline at end of file diff --git a/external-scripts.json b/external-scripts.json new file mode 100644 index 0000000..a2d8106 --- /dev/null +++ b/external-scripts.json @@ -0,0 +1,13 @@ +[ + "hubot-diagnostics", + "hubot-help", + "hubot-heroku-keepalive", + "hubot-google-images", + "hubot-google-translate", + "hubot-pugme", + "hubot-maps", + "hubot-redis-brain", + "hubot-rules", + "hubot-shipit", + "hubot-youtube" +] \ No newline at end of file diff --git a/hubot-scripts.json b/hubot-scripts.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/hubot-scripts.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..8e3e1f5 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "hal9000", + "version": "0.1.0", + "private": true, + "author": "Sebastian Kippe ", + "description": "Heuristically programmed ALgorithmic computer", + "dependencies": { + "hubot": "^2.12.0", + "hubot-diagnostics": "0.0.1", + "hubot-google-images": "^0.1.4", + "hubot-google-translate": "^0.1.0", + "hubot-help": "^0.1.1", + "hubot-heroku-keepalive": "0.0.4", + "hubot-irc": "^0.2.7", + "hubot-maps": "0.0.2", + "hubot-pugme": "^0.1.0", + "hubot-redis-brain": "0.0.2", + "hubot-rules": "^0.1.0", + "hubot-scripts": "^2.5.16", + "hubot-shipit": "^0.2.0", + "hubot-youtube": "^0.1.2" + }, + "engines": { + "node": "0.10.x" + } +} diff --git a/scripts/example.coffee b/scripts/example.coffee new file mode 100644 index 0000000..7c9839c --- /dev/null +++ b/scripts/example.coffee @@ -0,0 +1,106 @@ +# Description: +# Example scripts for you to examine and try out. +# +# Notes: +# They are commented out by default, because most of them are pretty silly and +# wouldn't be useful and amusing enough for day to day huboting. +# Uncomment the ones you want to try and experiment with. +# +# These are from the scripting documentation: https://github.com/github/hubot/blob/master/docs/scripting.md + +module.exports = (robot) -> + + # robot.hear /badger/i, (res) -> + # res.send "Badgers? BADGERS? WE DON'T NEED NO STINKIN BADGERS" + # + # robot.respond /open the (.*) doors/i, (res) -> + # doorType = res.match[1] + # if doorType is "pod bay" + # res.reply "I'm afraid I can't let you do that." + # else + # res.reply "Opening #{doorType} doors" + # + # robot.hear /I like pie/i, (res) -> + # res.emote "makes a freshly baked pie" + # + # lulz = ['lol', 'rofl', 'lmao'] + # + # robot.respond /lulz/i, (res) -> + # res.send res.random lulz + # + # robot.topic (res) -> + # res.send "#{res.message.text}? That's a Paddlin'" + # + # + # enterReplies = ['Hi', 'Target Acquired', 'Firing', 'Hello friend.', 'Gotcha', 'I see you'] + # leaveReplies = ['Are you still there?', 'Target lost', 'Searching'] + # + # robot.enter (res) -> + # res.send res.random enterReplies + # robot.leave (res) -> + # res.send res.random leaveReplies + # + # answer = process.env.HUBOT_ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING + # + # robot.respond /what is the answer to the ultimate question of life/, (res) -> + # unless answer? + # res.send "Missing HUBOT_ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING in environment: please set and try again" + # return + # res.send "#{answer}, but what is the question?" + # + # robot.respond /you are a little slow/, (res) -> + # setTimeout () -> + # res.send "Who you calling 'slow'?" + # , 60 * 1000 + # + # annoyIntervalId = null + # + # robot.respond /annoy me/, (res) -> + # if annoyIntervalId + # res.send "AAAAAAAAAAAEEEEEEEEEEEEEEEEEEEEEEEEIIIIIIIIHHHHHHHHHH" + # return + # + # res.send "Hey, want to hear the most annoying sound in the world?" + # annoyIntervalId = setInterval () -> + # res.send "AAAAAAAAAAAEEEEEEEEEEEEEEEEEEEEEEEEIIIIIIIIHHHHHHHHHH" + # , 1000 + # + # robot.respond /unannoy me/, (res) -> + # if annoyIntervalId + # res.send "GUYS, GUYS, GUYS!" + # clearInterval(annoyIntervalId) + # annoyIntervalId = null + # else + # res.send "Not annoying you right now, am I?" + # + # + # robot.router.post '/hubot/chatsecrets/:room', (req, res) -> + # room = req.params.room + # data = JSON.parse req.body.payload + # secret = data.secret + # + # robot.messageRoom room, "I have a secret: #{secret}" + # + # res.send 'OK' + # + # robot.error (err, res) -> + # robot.logger.error "DOES NOT COMPUTE" + # + # if res? + # res.reply "DOES NOT COMPUTE" + # + # robot.respond /have a soda/i, (res) -> + # # Get number of sodas had (coerced to a number). + # sodasHad = robot.brain.get('totalSodas') * 1 or 0 + # + # if sodasHad > 4 + # res.reply "I'm too fizzy.." + # + # else + # res.reply 'Sure!' + # + # robot.brain.set 'totalSodas', sodasHad+1 + # + # robot.respond /sleep it off/i, (res) -> + # robot.brain.set 'totalSodas', 0 + # res.reply 'zzzzz'