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