hubot-factoids-loche
Version:
Factoids for Hubot
122 lines (101 loc) • 2.64 kB
text/coffeescript
class Factoids
constructor: () ->
if .brain?.data?
= .brain.data.factoids ?= {}
.brain.on 'loaded', =>
= .brain.data.factoids ?= {}
set: (key, value, who, resolveAlias) ->
key = key.trim()
value = value.trim()
fact = key, resolveAlias
if typeof fact is 'object'
fact.history ?= []
hist =
date: Date()
editor: who
oldValue: fact.value
newValue: value
fact.history.push hist
fact.value = value
if fact.forgotten? then fact.forgotten = false
else
fact =
value: value
popularity: 0
[key.toLowerCase()] = fact
add: (key, value, who, resolveAlias) ->
fact = key, resolveAlias
fact = fact.value + ", and is also " + value
key, fact, who, resolveAlias
get: (key, resolveAlias = true) ->
fact = [key.toLowerCase()]
alias = fact?.value?.match /^@([^@].+)$/i
if resolveAlias and alias?
fact = alias[1]
fact
has: (key) ->
if key of
true
else false
search: (str) ->
keys = Object.keys
keys.filter (a) =>
if [a].forgotten
return false
value = [a].value
value.indexOf(str) > -1 || a.indexOf(str) > -1
ref: (key, fact) ->
aliasKey = fact.value.match(/^@([^@].+)$/i)
if aliasKey
key = aliasKey[1]
# Check for multi-tiered aliases.
return key, [key]
{
value: fact.value
key: key
}
list: ->
map = {}
keys = Object.keys
key = ''
i = 0
while i < keys.length
key = keys[i]
okey = key
fact = [key]
if fact.forgotten
++i
continue
data = key, fact, []
if data.key != key
key = data.key
if !map[key]
map[key] =
aliases: []
value: ''
if key != okey
map[key].aliases.push okey
map[key].value = data.value
++i
result = []
for name of map
str = name
if map[name].aliases.length
str += ' (aliases: ' + map[name].aliases.join(', ') + ')'
result.push str
result
forget: (key) ->
fact = key
if fact
fact.forgotten = true
remember: (key) ->
fact = key
if fact
fact.forgotten = false
fact
drop: (key) ->
key = key.toLowerCase()
if key
delete [key]
else false
module.exports = Factoids