hubot-ingress
Version:
Ingress commands for Hubot
318 lines (288 loc) • 9.58 kB
text/coffeescript
# Description
# Ingress helper commands for Hubot
#
# Dependencies:
# None
#
# Commands:
# hubot I have the <badge> badge - add/remove badges (say don't to remove)
# hubot I don't have any badges - remove your badges completely
# hubot what badges do I have? - show off your Ingress badges—you worked hard for them!
# hubot what badges does <person> have? - check another agent's badges
# hubot list badges - list the badges available
# hubot display badges - displays all the badge titles and the badges
#
# Author:
# therealklanni
badgeList = [
'abaddon',
'acolyte',
'ada',
'ada-2016',
'aegis-nova',
'akira-tsukasa',
'builder1', 'builder2', 'builder3', 'builder4', 'builder5',
'connector1', 'connector2', 'connector3', 'connector4', 'connector5',
'darsana',
'devra-bogdanovich',
'edgar-allan-wright',
'engineer1', 'engineer2', 'engineer3', 'engineer4', 'engineer5',
'eve',
'explorer1', 'explorer2', 'explorer3', 'explorer4', 'explorer5',
'founder',
'goruck',
'goruck-stealth',
'goruck-urban',
'guardian1', 'guardian2', 'guardian3', 'guardian4', 'guardian5',
'hacker1', 'hacker2', 'hacker3', 'hacker4', 'hacker5',
'hank-johnson',
'hank-johnson-2016',
'helios',
'illuminator1', 'illuminator2', 'illuminator3', 'illuminator4',
'illuminator5',
'initio',
'innovator1', 'innovator2', 'innovator3', 'innovator4', 'innovator5'
'interitus',
'jahan',
'klue',
'klue-2016',
'kodama-smiles',
'liberator1', 'liberator2', 'liberator3', 'liberator4', 'liberator5',
'luminary1', 'luminary2', 'luminary3', 'luminary4', 'luminary5',
'magnus1', 'magnus2',
'mindcontroller1', 'mindcontroller2', 'mindcontroller3', 'mindcontroller4', 'mindcontroller5',
'missionday1', 'missionday2', 'missionday3', 'missionday4', 'missionday5',
'nl-1331',
'nl-1331-2016',
'nl-1331e'
'nl-prime',
'oliver-lynton-wolfe',
'oliver-lynton-wolfe-2016',
'obsidian',
'p-a-chapeau', 'p-a-chapeau-2016',
'persepolis',
'pioneer1', 'pioneer2', 'pioneer3', 'pioneer4', 'pioneer5',
'purifier1', 'purifier2', 'purifier3', 'purifier4', 'purifier5',
'recharger1', 'recharger2', 'recharger3', 'recharger4', 'recharger5',
'recursion',
'recruiter0', 'recruiter1', 'recruiter2', 'recruiter3', 'recruiter4', 'recruiter5',
'seer1', 'seer2', 'seer3', 'seer4', 'seer5',
'shonin',
'sojourner1', 'sojourner2', 'sojourner3', 'sojourner4', 'sojourner5',
'specops1', 'specops2', 'specops3', 'specops4', 'specops5',
'stella-vyctory',
'susanna-moyer',
'susanna-moyer-2016',
'trekker1', 'trekker2', 'trekker3', 'trekker4', 'trekker5',
'translator1', 'translator2', 'translator3', 'translator4', 'translator5',
'verified',
'vanguard1', 'vanguard2', 'vanguard3', 'vanguard4', 'vanguard5'
'via-lux-adventurer',
'via-lux-odyssey',
'via-lux',
'via-noir'
]
badgeNameUpdateVersion = 1
badgeNameUpdateMap = {
'ada-1': 'ada'
'ada-2': 'ada-2016'
'aegis': 'aegis-nova'
'akira': 'akira-tsukasa'
'devra-1': 'devra-bogdanovich'
'goruckstealh': 'goruck-stealth'
'goruckurban': 'goruck-urban'
'nl-1331-1': 'nl-1331'
'nl-1331-2': 'nl-1331-2016'
'oliver-lynton-wolfe-2': 'oliver-lynton-wolfe-2016'
'p-a-chapeau-2': 'p-a-chapeau-2016'
'susanna-moyer1': 'susanna-moyer'
'susanna-moyer2': 'susanna-moyer-2016'
}
colorList= {
'': '',
'locked': 0,
'bronze': 1,
'silver': 2,
'gold': 3,
'platinum': 4,
'black': 5,
'onyx': 5
}
badgeTypes = {
'abaddon': 1,
'acolyte': 1,
'ada': 1,
'ada-2016': 1,
'aegis-nova': 1,
'akira-tsukasa': 1,
'builder': 5,
'connector': 5,
'darsana': 1,
'devra-bogdanovich': 1,
'edgar-allan-wright': 1,
'engineer': 5,
'eve': 1,
'explorer': 5,
'founder': 1,
'goruck': 1,
'goruck-stealth': 1,
'goruck-urban': 1,
'guardian': 5,
'hacker': 5,
'hank-johnson': 1,
'hank-johnson-2016': 1,
'helios': 1,
'illuminator': 5,
'initio': 1,
'innovator': 5,
'interitus': 1,
'jahan': 1,
'klue': 1,
'klue-2016': 1,
'kodama-smiles': 1,
'liberator': 5,
'luminary': 5,
'mindcontroller': 5,
'missionday': 5,
'nl-1331': 1,
'nl-1331-2016': 1,
'nl-1331e': 1,
'nl-prime': 1,
'oliver-lynton-wolfe': 1,
'oliver-lynton-wolfe-2016': 1,
'obsidian': 1,
'p-a-chapeau': 1,
'p-a-chapeau-2016': 1,
'persepolis': 1,
'pioneer': 5,
'purifier': 5,
'recharger': 5,
'recursion': 1,
'recruiter': 6,
'seer': 5,
'shonin': 1,
'sojourner': 5,
'specops': 5,
'stella-vyctory': 1,
'susanna-moyer': 1,
'susanna-moyer-2016': 1,
'trekker': 5,
'translator': 5,
'verified': 1,
'vanguard': 5
'via-lux-adventurer': 1,
'via-lux-odyssey': 1,
'via-lux': 1,
'via-noir': 1
}
module.exports = (robot) ->
badges =
add: (user, badgeNames...) ->
for badgeName in badgeNames
# only replace tiered badges - allows having all of the character badges
if not badgeTypes[badgeName]?
toRemove = badgeList.filter (x) ->
(x.replace /\d+/, '') is (badgeName.replace /\d+/, '')
@del user, badge for badge in toRemove
userBadges = robot.brain.data.ingressBadges[user.id] ?= []
userBadges.push ":#{badgeName}:" unless ":#{badgeName}:" in (badges.forUser user)
del: (user, badgeName) ->
robot.brain.data.ingressBadges[user.id] = (badges.forUser user).filter (x) ->
x isnt ":#{badgeName}:"
updateNames: ->
robot.brain.data.ingressBadgeNameUpdateVersion ?= 0
if robot.brain.data.ingressBadgeNameUpdateVersion < badgeNameUpdateVersion
for userId, userBadges of robot.brain.data.ingressBadges
for oldBadgeName, newBadgeName of badgeNameUpdateMap
index = userBadges.indexOf ":#{oldBadgeName}:"
userBadges[index] = ":#{newBadgeName}:" if index isnt -1
robot.brain.data.ingressBadgeNameUpdateVersion = badgeNameUpdateVersion
clear: (user) ->
robot.brain.data.ingressBadges[user.id] = []
forUser: (user) ->
robot.brain.data.ingressBadges[user.id] ?= []
robot.brain.on 'loaded', ->
robot.brain.data.ingressBadges ?= {}
badges.updateNames()
robot.respond /(@?[.\w\-]+) (?:have|has|got|earned)(?: the)? :?([\-\w,\s]+):? badges?/i, (msg) ->
who = msg.match[1].toLowerCase().replace '@', ''
badgeNames = (msg.match[2].toLowerCase()).split ','
if who == 'i'
who = msg.envelope.user
else
who = robot.brain.userForName who
invalidNames = []
validNames = []
for rawBadgeName in badgeNames
colorNames = Object.keys(colorList).join '|'
badgeNameParts = rawBadgeName.match /// ^
\s* # Leading spaces
(#{colorNames})?
\s* # Actual space
([\-\w]+) # Badge Name
\s* # Trailing space
$ ///i
continue unless badgeNameParts?
badgeName = badgeNameParts[2].toLowerCase()
colorName = 'bronze'
colorName = badgeNameParts[1] if badgeNameParts[1]
colorName = '' if badgeName in badgeList
badgeName += colorList[colorName.toLowerCase()]
if badgeName in badgeList
validNames.push badgeName
else
invalidNames.push badgeName
msg.reply "invalid badge name(s): #{invalidNames.join ', '}." if invalidNames.length > 0
if validNames.length > 0
for badgeName in validNames
badges.add who, badgeName
userBadges = badges.forUser who
validNames = validNames.filter (x) ->
":#{x}:" in userBadges
if who.name == msg.envelope.user.name
msg.reply "congrats on earning the :#{validNames.join ': :'}:
badge#{if validNames.length > 1 then 's' else ''}!"
else
msg.send "@#{who.name}: congrats on earning the :#{validNames.join ': :'}:
badge#{if validNames.length > 1 then 's' else ''}!"
robot.respond /wh(?:at|ich) badges? do(?:es)? (@?[.\w\-]+) have/i, (msg) ->
who = msg.match[1].replace '@', ''
if who.toLowerCase() == 'i'
who = msg.envelope.user
else
who = robot.brain.userForName who
userBadges = badges.forUser who
you = if who? and who.name == msg.envelope.user.name then true else false
whowhat = "#{if you then 'You have' else who.name + ' has'}"
if who? and userBadges.length > 0
msg.reply "#{whowhat} the following badges: #{userBadges.join ' '}"
else
msg.reply "#{whowhat} no badges."
robot.respond /(@?[.\w\-]+) (?:do(?:n't|esn't| not)) have the :?([\-\w]+):? badge/i, (msg) ->
who = msg.match[1].toLowerCase().replace '@', ''
badgeName = msg.match[2].toLowerCase()
if who == 'i'
who = msg.envelope.user
else
who = robot.brain.userForName who
if ":#{badgeName}:" in badges.forUser who
badges.del who, badgeName
msg.reply "removed the :#{badgeName}: badge"
robot.respond /I (?:do(?:n't| not)) have any badges?/i, (msg) ->
badges.clear msg.envelope.user
msg.reply 'OK, removed all your badges'
robot.respond /list badges ?.*/i, (msg) ->
message = ""
for badgeType of badgeTypes
message += "#{badgeType}, "
msg.send message
robot.respond /display badges ?.*/i, (msg) ->
message = "The available badges are:\n"
for badgeType, badgeNum of badgeTypes
if badgeNum == 1
message += "#{badgeType}: :#{badgeType}: \n"
else if badgeNum == 5
message += "#{badgeType}: :#{badgeType}1: :#{badgeType}2: :#{badgeType}3: :#{badgeType}4: :#{badgeType}5: \n"
else if badgeNum == 6
message += "#{badgeType}: :#{badgeType}0: :#{badgeType}1: :#{badgeType}2: :#{badgeType}3: :#{badgeType}4: :#{badgeType}5: \n"
msg.send message