Import source code
This commit is contained in:
12
.editorconfig
Normal file
12
.editorconfig
Normal file
@@ -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
|
||||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
.DS_Store*
|
||||||
|
.hubot_history
|
||||||
192
README.md
Normal file
192
README.md
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
<img src="https://raw.githubusercontent.com/hipchat/triatomic/master/logo.png" width="200">
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
[](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!
|
||||||
|
|
||||||
|
[](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 :)
|
||||||
69
app.json
Normal file
69
app.json
Normal file
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
bin/hubot
Executable file
8
bin/hubot
Executable file
@@ -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" "$@"
|
||||||
3
bin/hubot.cmd
Normal file
3
bin/hubot.cmd
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
npm install && node_modules\.bin\hubot.cmd --name "triatomic" %*
|
||||||
12
external-scripts.json
Normal file
12
external-scripts.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
1
hubot-scripts.json
Normal file
1
hubot-scripts.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
26
package.json
Normal file
26
package.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"name": "triatomic",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"author": "Bob Bergman <rbergman@atlassian.com>",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
106
scripts/example.coffee
Normal file
106
scripts/example.coffee
Normal file
@@ -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'
|
||||||
Reference in New Issue
Block a user