commit 398de81806e1837b043911d3ad5e809cd10c37a2 Author: Tommy Parnell Date: Mon May 11 14:26:39 2015 +0000 Import source code 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..210afed --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: bin/hubot -a hipchat diff --git a/README.md b/README.md new file mode 100644 index 0000000..8a8b547 --- /dev/null +++ b/README.md @@ -0,0 +1,192 @@ + + +# Triatomic: HipChat Hubot for Heroku + +Triatomic is a chat bot built on the [Hubot][hubot] framework, combined +with the [HipChat adapter][hubot-hipchat]. It was initially generated by +the [Yeoman][yeoman] [hubot generator][generator-hubot], and configured +to be deployed on [Heroku][heroku] to get you up and running as quick as possible. + +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/hipchat/triatomic) + +This README is intended to help get you started, but you may need or want to dig +into additional documentation at the following locations. Out of the box +some fun and silly scripts are included, but this bot can can become a +powerful ally once augmented with a combination of community and custom +scripts. + +[hubot-hipchat]: https://github.com/hipchat/hubot-hipchat +[hubot]: http://hubot.github.com +[heroku]: http://www.heroku.com +[yeoman]: http://yeoman.io +[generator-hubot]: https://github.com/github/generator-hubot + +### Why "Triatomic"? + +HipChat Hubot for Heroku is kind of a mouthful. Abbreviated, you get +HHH, which is the molecular abbreviation to triatomic hydrogen, which in +turn sounds cooler than "HHH". In the end, you can give your Triatomic bot +whatever public-facing name you want, since you'll be creating a unique HipChat +user account for it to use. + +### Running Triatomic 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. + +### 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/ + +## Deployment + +### The Easy Way + +The easy way to get Triatomic running on Heroku is to to click this big purple +button and fill out the required fields! + +[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/hipchat/triatomic) + +### The Slightly Harder Way + + % heroku create --stack cedar + % git push heroku master + + If you run into any problems, checkout Heroku's [docs][heroku-node-docs]. + +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 + +Next you will need to set some environment variables for your bot to know how +to connect to HipChat. At a minimum, you will need to create a new user for +your bot and then set the following: + + % heroku config:set HUBOT_HIPCHAT_JID=123_456@chat.hipchat.com + % heroku config:set HUBOT_HIPCHAT_PASSWORD=yourbotpassword + +Obviously, replace the example values with your own. See the +[HuBot HipChat documentation][hubot-hipchat] for more information on the +available environment variables you can use. + +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 + +## Restart the bot + +You may want to get comfortable with `heroku logs` and `heroku restart` if +you're having issues. + +## Thanks + +Special thanks to [Robohash](http://robohash.org) for the sweet logo :) diff --git a/app.json b/app.json new file mode 100644 index 0000000..7851368 --- /dev/null +++ b/app.json @@ -0,0 +1,69 @@ +{ + "name": "Hubot for HipChat", + "description": "A helpful bot for your HipChat group", + "repository": "https://github.com/hipchat/triatomic", + "logo": "https://raw.githubusercontent.com/hipchat/triatomic/master/logo.png", + "keywords": [ + "hubot", + "hipchat", + "bot", + "chat", + "heroku" + ], + "addons": [ + "redistogo" + ], + "env": { + "HUBOT_HIPCHAT_JID": { + "description": "Your bot's Jabber ID which can be found in the XMPP/Jabber settings for your bot's HipChat user account; e.g. 123_456@chat.hipchat.com.", + "required": true + }, + "HUBOT_HIPCHAT_PASSWORD": { + "description": "The password for your bot's HipChat user account.", + "required": true + }, + "HUBOT_HIPCHAT_ROOMS": { + "description": "A comma-separated list of room JIDs that you want your bot to join.", + "required": false + }, + "HUBOT_HIPCHAT_ROOMS_BLACKLIST": { + "description": "A comma-separated list of room JIDs that you DON'T want your bot to join.", + "required": false + }, + "HUBOT_HIPCHAT_JOIN_ROOMS_ON_INVITE": { + "description": "Setting this to `false` will prevent the HipChat adapter from auto-joining rooms when invited.", + "required": false + }, + "HUBOT_HIPCHAT_HOST": { + "description": "Use this to connect to a HipChat host other than `hipchat.com`.", + "required": false + }, + "HUBOT_HIPCHAT_XMPP_DOMAIN": { + "description": "Set to `btf.hipchat.com` if using a self-hosted HipChat Server.", + "required": false + }, + "HUBOT_HIPCHAT_RECONNECT": { + "description": "Set to `false` to prevent the HipChat adapter from auto-reconnecting if it detects a server error or disconnection.", + "required": false + }, + "HUBOT_HIPCHAT_JOIN_PUBLIC_ROOMS": { + "value": "", + "description": "Set to `false` to prevent the bot from joining guest-accessible rooms.", + "required": false + }, + "HUBOT_LOG_LEVEL": { + "description": "Set to `debug` to enable detailed debug logging.", + "required": false + }, + "HUBOT_HEROKU_KEEPALIVE_URL": { + "value": "https://YOUR_BOT_APP.herokuapp.com", + "description": "Set to use the subdomain of this bot to keep it awake", + "required": true + }, + "BUILDPACK_URL": { + "value": "https://github.com/heroku/heroku-buildpack-nodejs", + "description": "Only change this if you are sure you need to.", + "required": true + } + } +} diff --git a/bin/hubot b/bin/hubot new file mode 100755 index 0000000..3724bef --- /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 "triatomic" "$@" diff --git a/bin/hubot.cmd b/bin/hubot.cmd new file mode 100644 index 0000000..1095e87 --- /dev/null +++ b/bin/hubot.cmd @@ -0,0 +1,3 @@ +@echo off + +npm install && node_modules\.bin\hubot.cmd --name "triatomic" %* \ No newline at end of file diff --git a/external-scripts.json b/external-scripts.json new file mode 100644 index 0000000..3fd4c8c --- /dev/null +++ b/external-scripts.json @@ -0,0 +1,12 @@ +[ + "hubot-diagnostics", + "hubot-help", + "hubot-heroku-keepalive", + "hubot-google-images", + "hubot-google-translate", + "hubot-pugme", + "hubot-maps", + "hubot-redis-brain", + "hubot-rules", + "hubot-youtube" +] 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/logo.png b/logo.png new file mode 100644 index 0000000..45b4d73 Binary files /dev/null and b/logo.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..e35a364 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "triatomic", + "version": "0.0.0", + "private": true, + "author": "Bob Bergman ", + "description": "A simple helpful robot for your Company", + "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-hipchat": "^2.12.0-2", + "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'