Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

138 lines (117 sloc) 4.163 kB
# Description:
# Basic SendGrid statistics
#
# Dependencies:
# None
#
# Configuration:
# HUBOT_SENDGRID_USER to your SendGrid username (the same as you use to log in to sendgrid.com)
# HUBOT_SENDGRID_KEY to your SendGrid password (the same as you use to log in to sendgrid.com)
#
# Commands:
# hubot sendgrid total - total sendgrid usage for the account
# hubot sendgrid today - Total usage for today
# hubot sendgrid last X [days] - Total usage for the last X days
# hubot sendgrid c[ategory] [total] <category> - Today or all time usage for the given category
# hubot sendgrid c[ategory] last X [days] <category> - Total usage for the last X days for the given category
# hubot sendgrid categories - list all categories for account
#
# Author:
# sixfeetover
# drdamour
env = process.env
module.exports = (robot) ->
if env.HUBOT_SENDGRID_USER and env.HUBOT_SENDGRID_KEY
robot.respond /(sendgrid)( me)? today/i, (msg) ->
opts =
start_date: getTodayStr
query msg, opts, (json) ->
msg.send formatResponse(json[0], json[0].date)
robot.respond /(sendgrid)( me)? total/i, (msg) ->
opts =
aggregate: 1
query msg, opts, (json) ->
msg.send formatResponse(json, "All Time")
robot.respond /(sendgrid)( me)? last (\d+)( days)?/i, (msg) ->
opts =
days: msg.match[3]
aggregate: 1
query msg, opts, (json) ->
msg.send formatResponse(json, "Last #{opts.days} days")
robot.respond /(sendgrid)( me)? c(ategory)?( total)? (.*)/i, (msg) ->
category = msg.match[5].trim()
match = /last (\d+)( days)?/i
#this response matches the next respond, so we need to short circuit it
#anyone got a better way?
if match.test(category)
return
isAllTime = msg.match[4] is " total"
msg.send "Category: #{category}"
opts =
category: [category]
if(isAllTime)
opts.aggregate = 1
else
opts.days = 0
query msg, opts, (json) ->
if(isAllTime)
#surprisingly when you set a cateogry, the aggregate is sent in an array
msg.send formatResponse(json[0], "All Time")
else
msg.send formatResponse(json[0], json[0].date)
robot.respond /(sendgrid)( me)? c(ategory)? last (\d+)( days)? (.*)/i, (msg) ->
category = msg.match[6].trim()
msg.send "Category: #{category}"
opts =
category: [category]
aggregate: 1
days: msg.match[4]
query msg, opts, (json) ->
#surprisingly when you set a cateogry, the aggregate is sent in an array
msg.send formatResponse(json[0], "Last #{opts.days} days")
robot.respond /(sendgrid)( me)? categories/i, (msg) ->
opts =
list: "true"
query msg, opts, (json) ->
msg.send json[0].category
categories = for cat in json
" #{cat.category}"
msg.send categories.join('\n')
query = (msg, opts, callback) ->
opts.api_user = env.HUBOT_SENDGRID_USER
opts.api_key = env.HUBOT_SENDGRID_KEY
msg.http("https://sendgrid.com/api/stats.get.json")
.query(opts)
.get() (err, res, body) ->
parsedBody = JSON.parse(body)
if parsedBody.error
msg.send parsedBody.error
return
callback parsedBody
stats =
requests: 'Requests'
delivered: 'Delivered'
bounces: 'Bounces'
repeat_bounces: 'Repeat Bounces'
invalid_email: 'Invalid Emails'
opens: 'Opens'
unique_opens: 'Unique Opens'
clicks: 'Clicks'
unique_clicks: 'Unique Clicks'
unsubscribes: 'Unsubscribes'
repeat_unsubscribes: 'Repeat Unsubscribes'
blocked: 'Blocked'
spam_drop: 'Spam Drop'
spamreports: 'Spam Reports'
repeat_spamreports: 'Repeat Spam Reports'
formatResponse = (json, header) =>
details = for stat, description of stats
" #{description}: #{json[stat]}"
details.unshift "Stats for #{header}:"
details.join("\n")
getTodayStr = () =>
today = new Date();
cur_day = today.getDate()
cur_month = today.getMonth() + 1
cur_year = today.getFullYear()
tdy_string = cur_year + "-" + cur_month + "-" + cur_day
Jump to Line
Something went wrong with that request. Please try again.