Skip to content

Commit

Permalink
Add access control to commands
Browse files Browse the repository at this point in the history
  • Loading branch information
ya7on committed May 24, 2019
1 parent 32a4436 commit febe887
Show file tree
Hide file tree
Showing 22 changed files with 853 additions and 590 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"googleapis": "^34.0.0",
"moment": "^2.22.2",
"node-schedule": "^0.6.0",
"hubot-routines": "https://github.com/tolstoyevsky/hubot-routines.git"
"hubot-routines": "git+https://github.com/tolstoyevsky/hubot-routines.git",
"hubot-engine": "git+https://github.com/seven48/hubot-engine.git"
},
"devDependencies": {
"eslint": "^5.5.0",
Expand Down
44 changes: 28 additions & 16 deletions src/routes/ill/iAmIll.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
const routines = require('hubot-routines')

module.exports = async msg => {
const user = msg.message.user
const { AbstractView } = require('hubot-engine')

// if already ill
if (user.sick) {
msg.send('Я уже слышал, что ты болеешь. :thinking:')

return
class View extends AbstractView {
init (options) {
options.app = 'ill'
}

const message = routines.buildMessageWithButtons(
'Очень жаль. Ты в состоянии работать из дома в эти дни?',
[
['Да', 'Болею и работаю'],
['Нет', 'Болею и не работаю']
]
)
callback (msg) {
const user = msg.message.user

// if already ill
if (user.sick) {
msg.send('Я уже слышал, что ты болеешь. :thinking:')

return
}

const message = routines.buildMessageWithButtons(
'Очень жаль. Ты в состоянии работать из дома в эти дни?',
[
['Да', 'Болею и работаю'],
['Нет', 'Болею и не работаю']
]
)

user.sickConfirming = true
user.sickConfirming = true

msg.send(message)
this.app.set()

msg.send(message)
}
}

module.exports = View
73 changes: 42 additions & 31 deletions src/routes/ill/iAmNotIll.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,51 @@ const moment = require('moment')

const vars = require('./../../vars')
const utils = require('./../../utils')
const { AbstractView } = require('hubot-engine')

module.exports = msg => {
const user = msg.message.user
class View extends AbstractView {
init (options) {
options.app = 'ill'
}

if (!user.sick) {
msg.send('Я ничего не знал о твоей болезни. :thinking:')
callback (msg) {
const user = msg.message.user

return
}
if (!user.sick) {
msg.send('Я ничего не знал о твоей болезни. :thinking:')

return
}

this.app.clear()

let isCalendar = String()

let isCalendar = String()

if (vars.GOOGLE_API && user.sick.eventId) {
utils.getEventFromCalendar(msg.robot, user.sick.eventId)
.then(event => {
const startDate = moment(user.sick.start, 'DD.MM.YYYY')
const yesterday = moment()

if (utils.isEqualDate(startDate, yesterday)) {
isCalendar = ' Я удалил событие из календаря.'
return utils.deleteEventFromCalendar(msg.robot, user.sick.eventId)
} else {
event.data.end = { date: yesterday.format('YYYY-MM-DD') }
isCalendar = ' Я исправил событие в календаре.'
return utils.updateEventFromCalendar(msg.robot, user.sick.eventId, event.data)
}
}).then(() => {
delete user.sick

msg.send(`Рад видеть тебя снова!${isCalendar}`)
})
} else if (user.sick) {
delete user.sick

msg.send(`Рад видеть тебя снова!`)
if (vars.GOOGLE_API && user.sick.eventId) {
utils.getEventFromCalendar(msg.robot, user.sick.eventId)
.then(event => {
const startDate = moment(user.sick.start, 'DD.MM.YYYY')
const yesterday = moment()

if (utils.isEqualDate(startDate, yesterday)) {
isCalendar = ' Я удалил событие из календаря.'
return utils.deleteEventFromCalendar(msg.robot, user.sick.eventId)
} else {
event.data.end = { date: yesterday.format('YYYY-MM-DD') }
isCalendar = ' Я исправил событие в календаре.'
return utils.updateEventFromCalendar(msg.robot, user.sick.eventId, event.data)
}
}).then(() => {
delete user.sick

msg.send(`Рад видеть тебя снова!${isCalendar}`)
})
} else if (user.sick) {
delete user.sick

msg.send(`Рад видеть тебя снова!`)
}
}
}

module.exports = View
36 changes: 23 additions & 13 deletions src/routes/ill/illAgree.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
const routines = require('hubot-routines')

module.exports = msg => {
const user = msg.message.user
const { AbstractView } = require('hubot-engine')

if (user.sick) return
if (!(typeof user.sickConfirming === 'boolean')) return
class View extends AbstractView {
init (options) {
options.app = 'ill'
}

user.sickConfirming = msg.match[1].toLowerCase()
callback (msg) {
const user = msg.message.user

const message = routines.buildMessageWithButtons(
'Я понял. Согласовано ли отсутствие с руководителем/тимлидом?',
[
['Да', 'Да, они предупреждены, что я болею'],
['Нет', 'Нет, они не предупреждены, что я болею']
]
)
if (user.sick) return
if (!(typeof user.sickConfirming === 'boolean')) return

msg.send(message)
user.sickConfirming = msg.match[1].toLowerCase()

const message = routines.buildMessageWithButtons(
'Я понял. Согласовано ли отсутствие с руководителем/тимлидом?',
[
['Да', 'Да, они предупреждены, что я болею'],
['Нет', 'Нет, они не предупреждены, что я болею']
]
)

msg.send(message)
}
}

module.exports = View
85 changes: 48 additions & 37 deletions src/routes/ill/yesTheyAreNotified.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,56 @@ const moment = require('moment')

const vars = require('../../vars')
const utils = require('../../utils')
const { AbstractView } = require('hubot-engine')

module.exports = async msg => {
const user = msg.message.user
const today = moment()
const tomorrow = moment().add(1, 'days')

if (user.sick) return
if (!(typeof user.sickConfirming === 'string')) return

if (msg.match[1].toLowerCase() === 'да, они предупреждены, что я болею') {
const isWork = user.sickConfirming === 'болею и работаю'

if (!user.sick) {
user.sick = Object()
}
class View extends AbstractView {
init (options) {
options.app = 'ill'
}

let isCalendar = vars.GOOGLE_API ? ' Я добавил событие в календарь.' : ''
if (vars.GOOGLE_API) {
utils.addEventToCalendar(
msg.robot,
today.format('YYYY-MM-DD'),
tomorrow.format('YYYY-MM-DD'),
user,
isWork ? vars.GOOGLE_EVENT_SICK_WITH_WORK : vars.GOOGLE_EVENT_SICK
).then(eventId => { user.sick.eventId = eventId })
callback (msg) {
const user = msg.message.user
const today = moment()
const tomorrow = moment().add(1, 'days')

if (user.sick) return
if (!(typeof user.sickConfirming === 'string')) return

if (msg.match[1].toLowerCase() === 'да, они предупреждены, что я болею') {
const isWork = user.sickConfirming === 'болею и работаю'

if (!user.sick) {
user.sick = Object()
}

let isCalendar = vars.GOOGLE_API ? ' Я добавил событие в календарь.' : ''
if (vars.GOOGLE_API) {
utils.addEventToCalendar(
msg.robot,
today.format('YYYY-MM-DD'),
tomorrow.format('YYYY-MM-DD'),
user,
isWork ? vars.GOOGLE_EVENT_SICK_WITH_WORK : vars.GOOGLE_EVENT_SICK
).then(eventId => { user.sick.eventId = eventId })
}

user.sick.start = today.format(vars.CREATION_DATE_FORMAT)
user.sick.isWork = isWork
delete user.sickConfirming
this.app.clear()

msg.robot.messageRoom(
vars.LEAVE_COORDINATION_CHANNEL,
`@${user.name} болеет и ${isWork ? 'работает' : 'не может работать'} из дома`
)

msg.send(`Ok. Выздоравливай поскорее.${isCalendar} Когда ты выйдешь на работу, скажи мне \`я не болею\`.`)
} else {
this.app.clear()
delete user.sickConfirming
msg.send('Тогда сначала предупреди, а потом вернись и повтори все снова!')
}

user.sick.start = today.format(vars.CREATION_DATE_FORMAT)
user.sick.isWork = isWork
delete user.sickConfirming

msg.robot.messageRoom(
vars.LEAVE_COORDINATION_CHANNEL,
`@${user.name} болеет и ${isWork ? 'работает' : 'не может работать'} из дома`
)

msg.send(`Ok. Выздоравливай поскорее.${isCalendar} Когда ты выйдешь на работу, скажи мне \`я не болею\`.`)
} else {
delete user.sickConfirming
msg.send('Тогда сначала предупреди, а потом вернись и повтори все снова!')
}
}

module.exports = View
27 changes: 16 additions & 11 deletions src/routes/leave/customerNotified.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
const vars = require('../../vars')
const utils = require('../../utils')
const { AbstractView } = require('hubot-engine')

module.exports = async msg => {
const username = msg.message.user.name
const state = await utils.getStateFromBrain(msg.robot, username)
const answer = msg.match[1].toLowerCase().trim()
class View extends AbstractView {
async callback (msg) {
const username = msg.message.user.name
const state = await utils.getStateFromBrain(msg.robot, username)
const answer = msg.match[1].toLowerCase().trim()

if (!state.reportToCustomer) {
if (answer === 'да, предупрежден') {
state.reportToCustomer = true
msg.robot.messageRoom(vars.LEAVE_COORDINATION_CHANNEL, `Пользователь @${username} только что сообщил, что предупредил заказчика о своем отпуске.`)
msg.send(':thumbsup:')
} else {
msg.send('Обязательно предупреди! :fearful:')
if (!state.reportToCustomer) {
if (answer === 'да, предупрежден') {
state.reportToCustomer = true
msg.robot.messageRoom(vars.LEAVE_COORDINATION_CHANNEL, `Пользователь @${username} только что сообщил, что предупредил заказчика о своем отпуске.`)
msg.send(':thumbsup:')
} else {
msg.send('Обязательно предупреди! :fearful:')
}
}
}
}

module.exports = View
67 changes: 39 additions & 28 deletions src/routes/leave/iAmPlanningToGoOnLeave.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,46 @@ const routines = require('hubot-routines')

const vars = require('../../vars')
const utils = require('../../utils')
const { AbstractView } = require('hubot-engine')

module.exports = async msg => {
const username = msg.message.user.name
const state = await utils.getStateFromBrain(msg.robot, username)
const answer = msg.match[1].toLowerCase().trim()

if (state.n === vars.CONFIRM_STATE) {
if (answer === 'да, планирую') {
const deadline = moment(state.creationDate, vars.CREATION_DATE_FORMAT).add(vars.MAXIMUM_LENGTH_OF_WAIT, 'days').format('DD.MM')
const from = moment(`${state.leaveStart.day}.${state.leaveStart.month}`, 'D.M').format('DD.MM')
const to = moment(`${state.leaveEnd.day}.${state.leaveEnd.month}`, 'D.M').format('DD.MM')

const buttonsMessage = routines.buildMessageWithButtons(
`Пользователь @${username} хочет в отпуск с ${from} по ${to}. Ответ нужно дать до ${deadline}.`,
[
['Одобрить', `${msg.robot.alias} одобрить заявку @${username}`],
['Отклонить', `${msg.robot.alias} отклонить заявку @${username}`]
]
)
msg.robot.messageRoom(vars.LEAVE_COORDINATION_CHANNEL, buttonsMessage)

state.requestStatus = vars.PENDING_STATUS
state.reportToCustomer = false

msg.send(`Заявка на отпуск отправлена. Ответ поступит не позже чем через ${utils.noname(vars.MAXIMUM_LENGTH_OF_WAIT)}.`)
} else {
msg.send('Я прервал процесс формирования заявки на отпуск.')
}
class View extends AbstractView {
init (options) {
options.app = 'leave'
}

async callback (msg) {
const username = msg.message.user.name
const state = await utils.getStateFromBrain(msg.robot, username)
const answer = msg.match[1].toLowerCase().trim()

if (state.n === vars.CONFIRM_STATE) {
if (answer === 'да, планирую') {
const deadline = moment(state.creationDate, vars.CREATION_DATE_FORMAT).add(vars.MAXIMUM_LENGTH_OF_WAIT, 'days').format('DD.MM')
const from = moment(`${state.leaveStart.day}.${state.leaveStart.month}`, 'D.M').format('DD.MM')
const to = moment(`${state.leaveEnd.day}.${state.leaveEnd.month}`, 'D.M').format('DD.MM')

const buttonsMessage = routines.buildMessageWithButtons(
`Пользователь @${username} хочет в отпуск с ${from} по ${to}. Ответ нужно дать до ${deadline}.`,
[
['Одобрить', `${msg.robot.alias} одобрить заявку @${username}`],
['Отклонить', `${msg.robot.alias} отклонить заявку @${username}`]
]
)
msg.robot.messageRoom(vars.LEAVE_COORDINATION_CHANNEL, buttonsMessage)

state.n = vars.INIT_STATE
state.requestStatus = vars.PENDING_STATUS
state.reportToCustomer = false

msg.send(`Заявка на отпуск отправлена. Ответ поступит не позже чем через ${utils.noname(vars.MAXIMUM_LENGTH_OF_WAIT)}.`)
} else {
msg.send('Я прервал процесс формирования заявки на отпуск.')
}

this.app.clear()

state.n = vars.INIT_STATE
}
}
}

module.exports = View
Loading

0 comments on commit febe887

Please sign in to comment.