Skip to content

Commit

Permalink
Fix save brain (#400)
Browse files Browse the repository at this point in the history
* arregla scripts para guardar correctamente

* actualiza command-log

* arregla test de karma
  • Loading branch information
gmq committed Mar 19, 2018
1 parent 8acf97a commit 5f3ea6a
Show file tree
Hide file tree
Showing 6 changed files with 250 additions and 186 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -42,7 +42,7 @@
"hubot-chaucha": "0.0.1",
"hubot-chilexpress": "0.0.1",
"hubot-cne": "2.0.1",
"hubot-command-log": "1.0.2",
"hubot-command-log": "1.0.3",
"hubot-cpf": "1.0.6",
"hubot-diagnostics": "0.0.2",
"hubot-diceware": "3.0.0",
Expand Down
104 changes: 60 additions & 44 deletions scripts/karma.js
Expand Up @@ -24,7 +24,9 @@ module.exports = robot => {

const userForMentionName = mentionName => {
const users = robot.brain.users()
return Object.keys(users).map(key => users[key]).find(user => mentionName === user.mention_name)
return Object.keys(users)
.map(key => users[key])
.find(user => mentionName === user.mention_name)
}

const userFromWeb = token => {
Expand Down Expand Up @@ -71,20 +73,22 @@ module.exports = robot => {
const usersForToken = token => {
return new Promise((resolve, reject) => {
let user
if (user = robot.brain.userForName(token)) {
if ((user = robot.brain.userForName(token))) {
return resolve([user])
}
if (user = userForMentionName(token)) {
if ((user = userForMentionName(token))) {
return resolve([user])
}
if (robot.adapter.constructor.name === 'SlackBot') {
userFromWeb(token).then(webUser => {
if (webUser) {
return resolve([webUser])
} else {
return resolve(robot.brain.usersForFuzzyName(token))
}
}).catch(reject)
userFromWeb(token)
.then(webUser => {
if (webUser) {
return resolve([webUser])
} else {
return resolve(robot.brain.usersForFuzzyName(token))
}
})
.catch(reject)
} else {
user = robot.brain.usersForFuzzyName(token)
resolve(user)
Expand All @@ -93,37 +97,43 @@ module.exports = robot => {
}

const userForToken = (token, response) => {
return usersForToken(token)
.then(users => {
let user
if (users.length === 1) {
user = users[0]
if (typeof user.karma === 'undefined' || user.karma === null) {
user.karma = 0
}
} else if (users.length > 1) {
robot.messageRoom(`@${response.message.user.name}`, `Se más específico, hay ${users.length} personas que se parecen a: ${users.map(user => user.name).join(', ')}.`)
} else {
response.send(`Chaucha, no encuentro al usuario '${token}'.`)
return usersForToken(token).then(users => {
let user
if (users.length === 1) {
user = users[0]
if (typeof user.karma === 'undefined' || user.karma === null) {
user.karma = 0
}
return user
})
} else if (users.length > 1) {
robot.messageRoom(
`@${response.message.user.name}`,
`Se más específico, hay ${users.length} personas que se parecen a: ${users
.map(user => user.name)
.join(', ')}.`
)
} else {
response.send(`Chaucha, no encuentro al usuario '${token}'.`)
}
return user
})
}

const canUpvote = (user, victim) => {
robot.brain.karmaLimits = robot.brain.karmaLimits || {}
robot.brain.karmaLimits[user.id] = robot.brain.karmaLimits[user.id] || {}
if (!robot.brain.karmaLimits[user.id][victim.id]) {
robot.brain.karmaLimits[user.id][victim.id] = new Date()
karmaLimits = robot.brain.get('karmaLimits') || {}
karmaLimits[user.id] = karmaLimits[user.id] || {}
if (!karmaLimits[user.id][victim.id]) {
karmaLimits[user.id][victim.id] = new Date()
robot.brain.set('karmaLimits', karmaLimits)
robot.brain.save()
return true
} else {
const limit1 = robot.golden.isGold(user.name) ? 15 : 60
const limit2 = limit1 - 1
const oldDate = robot.brain.karmaLimits[user.id][victim.id]
const timePast = Math.round((new Date().getTime() - oldDate.getTime())) / 60000
const oldDate = karmaLimits[user.id][victim.id]
const timePast = Math.round(new Date().getTime() - oldDate.getTime()) / 60000
if (timePast > limit2) {
robot.brain.karmaLimits[user.id][victim.id] = new Date()
karmaLimits[user.id][victim.id] = new Date()
robot.brain.set('karmaLimits', karmaLimits)
robot.brain.save()
return true
} else {
Expand All @@ -137,7 +147,8 @@ module.exports = robot => {
userForToken(userToken, response)
.then(targetUser => {
if (!targetUser) return
if (thisUser.name === targetUser.name && op !== '--') return response.send('¡Oe no po, el karma es pa otros no pa ti!')
if (thisUser.name === targetUser.name && op !== '--')
return response.send('¡Oe no po, el karma es pa otros no pa ti!')
if (targetUser.length === '') return response.send('¡Oe no seai pillo, escribe un nombre!')
const limit = canUpvote(thisUser, targetUser)
if (Number.isFinite(limit)) {
Expand All @@ -158,17 +169,15 @@ module.exports = robot => {
robot.brain.set('karmaLog', karmaLog)
robot.brain.save()
response.send(`${getCleanName(targetUser.name)} ahora tiene ${targetUser.karma} puntos de karma.`)
}).catch(err => robot.emit('error', err, response))
})
.catch(err => robot.emit('error', err, response))
}

const removeURLFromTokens = (tokens, message) => {
const urls = message.match(/\bhttps?:\/\/\S+/gi)
if (!urls) return tokens
// if a token match with a URL, it gets remove
return tokens.filter(token => (
urls
.reduce((acc, url) => (acc && url.indexOf(token) === -1), true)
))
return tokens.filter(token => urls.reduce((acc, url) => acc && url.indexOf(token) === -1, true))
}

robot.hear(/([a-zA-Z0-9-_\.]|[^\,\-\s\+$!(){}"'`~%=^:;#°|¡¿?]+?)(\b\+{2}|-{2})([^,]?|\s|$)/g, response => {
Expand All @@ -178,11 +187,14 @@ module.exports = robot => {
if (robot.adapter.constructor.name === 'SlackBot') {
if (!robot.adapter.client.rtm.dataStore.getChannelGroupOrDMById(response.envelope.room).is_channel) return
}

tokens.slice(0, 5).forEach(token => {
const opRegex = /(\+{2}|-{2})/g
const specialChars = /@/
const userToken = token.trim().replace(specialChars, '').replace(opRegex, '')
const userToken = token
.trim()
.replace(specialChars, '')
.replace(opRegex, '')
const op = token.match(opRegex)[0]
applyKarma(userToken, op, response)
})
Expand Down Expand Up @@ -217,7 +229,11 @@ module.exports = robot => {
} else {
userForToken(targetToken, response).then(targetUser => {
if (!targetUser) return
response.send(`${getCleanName(targetUser.name)} tiene ${targetUser.karma} puntos de karma. Más detalles en: ${hubotWebSite}/karma/log/${targetUser.name}`)
response.send(
`${getCleanName(targetUser.name)} tiene ${
targetUser.karma
} puntos de karma. Más detalles en: ${hubotWebSite}/karma/log/${targetUser.name}`
)
})
}
})
Expand Down Expand Up @@ -261,13 +277,13 @@ module.exports = robot => {
return log.targetName === req.params.user
}
})
const processedKarmaLog = filteredKarmaLog.map(log =>
`${new Date(log.date).toJSON()} - ${log.name}: ${log.msg}`
)
const processedKarmaLog = filteredKarmaLog.map(log => `${new Date(log.date).toJSON()} - ${log.name}: ${log.msg}`)
let msg
if (filteredKarmaLog.length > 0) {
msg = `<li>${processedKarmaLog.join('</li><li>')}</li>`
} else { msg = `<li>No hay detalles sobre el karma de ${req.params.user}</li>` }
} else {
msg = `<li>No hay detalles sobre el karma de ${req.params.user}</li>`
}
res.setHeader('content-type', 'text/html')
// res.end(msg)
res.end(theme('Karma Todos', 'Karmalog:', msg))
Expand Down
131 changes: 76 additions & 55 deletions scripts/recordador.js
Expand Up @@ -19,114 +19,135 @@

class Reminders {
constructor(robot) {
this.robot = robot;
this.cache = [];
this.current_timeout = null;
this.robot = robot
this.cache = []
this.current_timeout = null

this.robot.brain.on('loaded', () => {
if (this.robot.brain.data.reminders) {
this.cache = this.robot.brain.data.reminders;
return this.queue();
const reminders = this.robot.brain.get('reminders')
if (reminders) {
this.cache = reminders
return this.queue()
}
});
})
}

add(reminder) {
this.cache.push(reminder);
this.cache.sort((a, b) => a.due - b.due);
this.robot.brain.data.reminders = this.cache;
return this.queue();
this.cache.push(reminder)
this.cache.sort((a, b) => a.due - b.due)
this.robot.brain.set('reminders', this.cache)
this.robot.brain.save()
return this.queue()
}

removeFirst() {
let reminder = this.cache.shift();
this.robot.brain.data.reminders = this.cache;
return reminder;
let reminder = this.cache.shift()
this.robot.brain.set('reminders', this.cache)
this.robot.brain.save()
return reminder
}

queue() {
if (this.current_timeout) { clearTimeout(this.current_timeout); }
if (this.current_timeout) {
clearTimeout(this.current_timeout)
}
if (this.cache.length > 0) {
let now = new Date().getTime();
while ((this.cache.length !== 0) && !(this.cache[0].due > now)) { this.removeFirst(); }
let now = new Date().getTime()
while (this.cache.length !== 0 && !(this.cache[0].due > now)) {
this.removeFirst()
}
if (this.cache.length > 0) {
let trigger = () => {
let reminder = this.removeFirst();
let reminder = this.removeFirst()
if (reminder) {
this.robot.reply(reminder.msg_envelope, `me pediste que te recordara que tienes que ${reminder.action}. Ahora hazlo.`);
this.robot.reply(
reminder.msg_envelope,
`me pediste que te recordara que tienes que ${reminder.action}. Ahora hazlo.`
)
}
return this.queue();
};
return this.queue()
}
// setTimeout uses a 32-bit INT
var extendTimeout = (timeout, callback) =>{
if (timeout > 0x7FFFFFFF) {
return this.current_timeout = setTimeout(() => extendTimeout((timeout - 0x7FFFFFFF), callback)
, 0x7FFFFFFF);
var extendTimeout = (timeout, callback) => {
if (timeout > 0x7fffffff) {
return (this.current_timeout = setTimeout(() => extendTimeout(timeout - 0x7fffffff, callback), 0x7fffffff))
} else {
return this.current_timeout = setTimeout(callback, timeout);
return (this.current_timeout = setTimeout(callback, timeout))
}
};
return extendTimeout(this.cache[0].due - now, trigger);
}
return extendTimeout(this.cache[0].due - now, trigger)
}
}
}
}

class Reminder {
constructor(msg_envelope, time, action) {
this.msg_envelope = msg_envelope;
this.time = time;
this.action = action;
this.time.replace(/^\s+|\s+$/g, '');
this.msg_envelope = msg_envelope
this.time = time
this.action = action
this.time.replace(/^\s+|\s+$/g, '')

let periods = {
weeks: {
value: 0,
regex: "semanas?"
regex: 'semanas?'
},
days: {
value: 0,
regex: "dias?"
regex: 'dias?'
},
hours: {
value: 0,
regex: "horas?|hrs?"
regex: 'horas?|hrs?'
},
minutes: {
value: 0,
regex: "minutos?|mins?"
regex: 'minutos?|mins?'
},
seconds: {
value: 0,
regex: "segundos?|segs?"
regex: 'segundos?|segs?'
}
};
}

for (let period in periods) {
let pattern = new RegExp(`^.*?([\\d\\.]+)\\s*(?:(?:${periods[period].regex})).*$`, 'i');
let matches = pattern.exec(this.time);
if (matches) { periods[period].value = parseInt(matches[1]); }
let pattern = new RegExp(`^.*?([\\d\\.]+)\\s*(?:(?:${periods[period].regex})).*$`, 'i')
let matches = pattern.exec(this.time)
if (matches) {
periods[period].value = parseInt(matches[1])
}
}

this.due = new Date().getTime();
this.due += ((periods.weeks.value * 604800) + (periods.days.value * 86400) + (periods.hours.value * 3600) + (periods.minutes.value * 60) + periods.seconds.value) * 1000;
this.due = new Date().getTime()
this.due +=
(periods.weeks.value * 604800 +
periods.days.value * 86400 +
periods.hours.value * 3600 +
periods.minutes.value * 60 +
periods.seconds.value) *
1000
}

dueDate() {
let dueDate = new Date(this.due);
return dueDate.toLocaleString();
let dueDate = new Date(this.due)
return dueDate.toLocaleString()
}
}

module.exports = robot => {
let reminders = new Reminders(robot)

let reminders = new Reminders(robot);

robot.respond(/recu[eé]rdame en ((?:(?:\d+) (?:semanas?|dias?|horas?|hrs?|minutos?|mins?|segundos?|segs?)[ ,]*(?:and)? +)+)que tengo que (.*)/i, function(msg) {
let time = msg.match[1];
let action = msg.match[2];
let reminder = new Reminder(msg.envelope, time, action);
reminders.add(reminder);
msg.send(`Te recordaré que tienes que ${action} a las ${reminder.dueDate()}`);
});
};
robot.respond(
/recu[eé]rdame en ((?:(?:\d+) (?:semanas?|dias?|horas?|hrs?|minutos?|mins?|segundos?|segs?)[ ,]*(?:and)? +)+)que tengo que (.*)/i,
function(msg) {
let time = msg.match[1]
let action = msg.match[2]
let envelope = Object.assign({}, msg.envelope)
delete envelope.message.rawMessage
let reminder = new Reminder(envelope, time, action)
reminders.add(reminder)
msg.send(`Te recordaré que tienes que ${action} a las ${reminder.dueDate()}`)
}
)
}

0 comments on commit 5f3ea6a

Please sign in to comment.