-
-
Save caseymorrisus/7a05b2b7139f680300ff to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
######################### | |
## DEPENDENCIES ## | |
######################### | |
Slack = require 'slack-client' | |
Client = require('node-rest-client').Client | |
client = new Client() | |
_ = require 'lodash' | |
moment = require 'moment' | |
r = require 'rethinkdb' | |
######################### | |
## SLACK OPTIONS ## | |
######################### | |
slackToken = 'xoxb-19398446322-zXggZLU2XRtthf9SCAuuUIoa' # Add a bot at https://my.slack.com/services/new/bot and copy the token here. | |
autoReconnect = true # Automatically reconnect after an error response from Slack. | |
autoMark = true # Automatically mark each message as read after it is processed. | |
slack = new Slack(slackToken, autoReconnect, autoMark) | |
######################### | |
## BOT OPTIONS ## | |
######################### | |
options = { | |
## Bot is on if this is set to true, if false, will not respond to commands | |
is_running : true | |
} | |
######################### | |
## HELPER FUNCTIONS ## | |
######################### | |
## Used for displaying message info in a nice format to the server | |
messageInfo = (info) -> | |
console.log '\n===============' | |
console.log 'Sender: ' + info.sender | |
console.log 'Is Admin: ' + info.is_admin | |
console.log 'Text: ' + info.text | |
if _.has(info.channel, 'name') | |
console.log 'Channel: ' + info.channel.name | |
else | |
console.log 'Channel: PRIVATE MESSAGE' | |
console.log 'Time: ' + new Date | |
console.log 'Is running: ' + options.is_running | |
console.log '===============\n' | |
## Commands with 1 argument | |
cmd = (command, info, zombie, callback) -> | |
## Only execute command if bot is running or the zombie parameter is set to true | |
if options.is_running || zombie | |
## If message content is equal to the command, proceed with callback | |
if info.text == command | |
callback() | |
## Commands that only work in blog channel | |
blog = (info, zombie, callback) -> | |
if options.is_running || zombie | |
## Verify the message is from a channel (excludes private messages) | |
if _.has(info.channel, 'name') | |
## Verify the message is from the channel with the name `blog` | |
if info.channel.name == 'blog' | |
callback() | |
## Setup connection variable for later use | |
connection = null | |
## Connect to RethinkDB then open Slack | |
r.connect | |
host: "localhost" | |
port: 28015 | |
, (err, conn) -> | |
throw err if err | |
connection = conn | |
console.log('Connected to database successfully.') | |
## Create table in database if it doesn't already exist | |
r.db('test').tableCreate('posts').run connection, (err, result) -> | |
## Log info for troubleshooting | |
console.log JSON.stringify(result, null, 2) | |
######################### | |
## SLACK OPENED ## | |
######################### | |
slack.on 'open', -> | |
channels = [] | |
# Get all the channels that bot is a member of | |
channels = ("##{channel.name}" for id, channel of slack.channels) | |
# Log info to server | |
console.log "Welcome to Slack. You are @#{slack.self.name} of #{slack.team.name}" | |
######################### | |
## SLACK MESSAGE ## | |
######################### | |
slack.on 'message', (message) -> | |
## Verify message is not a user joining, etc | |
if !(_.has(message, 'subtype')) | |
## Build info to display in console & display it | |
info = { | |
channel_id : slack.getChannelGroupOrDMByID(message.channel) | |
channel : slack.channels[message.channel] | |
sender : slack.users[message.user].name | |
text : message.text | |
message : message | |
image : slack.users[message.user].profile.image_192 | |
} | |
############################## | |
## BLOG CHANNEL COMMANDS ## | |
############################## | |
blog info, false, () -> | |
## Listen for messages in blog channel and save them to RethinkDB | |
## Content is equal to slack message text | |
content = info.text | |
## Image is equal to slack user image | |
image = info.image | |
## Set time variable to current time | |
time = new Date | |
## Convert time converted to milliseconds | |
now = time.getTime() | |
## Convert time to pretty format ex: 7:12 pm | |
cleanTime = moment(time).calendar() | |
## Author of the slack message | |
author = info.sender | |
## Insert post into RethinkDB | |
r.table('posts').insert([ | |
{ | |
content: content, | |
time: now, | |
cleanTime: cleanTime | |
image: image, | |
author: author | |
} | |
]).run connection, (err, result) -> | |
throw err if err | |
## Log info for troubleshooting | |
console.log JSON.stringify(result, null, 2) | |
######################### | |
## COMMANDS ## | |
######################### | |
## Turn the bot off, commands with zombie set to false will not work | |
cmd '!off', info, true, () -> | |
options.is_running = false | |
response = 'Turning off!' | |
info.channel_id.send response | |
## Turn the bot on | |
cmd '!on', info, true, () -> | |
options.is_running = true | |
response = 'Turning on!' | |
info.channel_id.send response | |
## For testing the bot is working | |
cmd '!hi', info, false, () -> | |
response = 'Hello' | |
info.channel_id.send response | |
## Log message info to server | |
messageInfo(info) | |
return | |
slack.on 'error', (err) -> | |
console.error "Error", err | |
slack.login() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment