Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add access control to commands #120

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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