Skip to content

Commit

Permalink
system/commands: Add custom permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
sogehige committed Apr 4, 2018
1 parent 67d13c8 commit 4aa412a
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 47 deletions.
14 changes: 8 additions & 6 deletions libs/constants.js
Expand Up @@ -62,9 +62,9 @@ define(

define(
'PERMISSION_REGEXP',
XRegExp(`(?<type> viewer|mods|owner|regular|disable ) # type
\\s # empty space
!?(?<command> [\\pL0-9 ]* ) # command`, 'ix')
XRegExp(`(?<type> viewer|mods|owner|regular|disable ) # type
\\s # empty space
!?(?<command> [\\pL0-9 ]* ) # command`, 'ix')
)

define('KEYWORD_REGEXP', XRegExp(`(?<keyword> !?[\\pL0-9]*)\\s(?<response> .*)`, 'ix'))
Expand All @@ -82,9 +82,11 @@ define(

define(
'COMMAND_REGEXP_WITH_RESPONSE',
XRegExp(`!(?<command> [\\pL0-9]* ) # command
\\s # empty space
(?<response> .* ) # response`, 'ix')
XRegExp(`(?<premission> owner|mod|regular|viewer) # permission
\\s # empty space
!(?<command> [\\pL0-9]* ) # command
\\s # empty space
(?<response> .* ) # response`, 'ix')
)

define(
Expand Down
79 changes: 62 additions & 17 deletions libs/systems/customCommands.js
Expand Up @@ -9,13 +9,13 @@ const XRegExp = require('xregexp')
var constants = require('../constants')

/*
* !command - gets an info about command usage
* !command add ![cmd] [response] - add command with specified response
* !command edit ![cmd] [response] - edit command with specified response
* !command remove ![cmd] - remove specified command
* !command toggle ![cmd] - enable/disable specified command
* !command toggle-visibility ![cmd] - enable/disable specified command
* !command list - get commands list
* !command - gets an info about command usage
* !command add owner|mod|regular|viewer ![cmd] [response] - add command with specified response
* !command edit owner|mod|regular|viewer ![cmd] [response] - edit command with specified response
* !command remove ![cmd] - remove specified command
* !command toggle ![cmd] - enable/disable specified command
* !command toggle-visibility ![cmd] - enable/disable specified command
* !command list - get commands list
*/

class CustomCommands {
Expand All @@ -24,7 +24,7 @@ class CustomCommands {
global.panel.addMenu({category: 'manage', name: 'custom-commands', id: 'customCommands'})
global.panel.registerSockets({
self: this,
expose: ['add', 'remove', 'visible', 'toggle', 'editCommand', 'editResponse', 'send'],
expose: ['add', 'remove', 'visible', 'toggle', 'togglePermission', 'editCommand', 'editResponse', 'send'],
finally: this.send
})
}
Expand Down Expand Up @@ -61,9 +61,6 @@ class CustomCommands {
else {
if (data.value.startsWith('!')) data.value = data.value.replace('!', '')
await global.db.engine.update('commands', { command: data.id }, { command: data.value })

global.parser.unregister(data.id)
global.parser.register(self, '!' + data.value, self.run, constants.VIEWERS)
}
}

Expand All @@ -73,7 +70,7 @@ class CustomCommands {
}

help (self, sender) {
global.commons.sendMessage(global.translate('core.usage') + ': !command add <!command> <response> | !command edit <!command> <response> | !command remove <!command> | !command list', sender)
global.commons.sendMessage(global.translate('core.usage') + ': !command add owner|mod|regular|viewer <!command> <response> | !command edit owner|mod|regular|viewer <!command> <response> | !command remove <!command> | !command list', sender)
}

async edit (self, sender, text) {
Expand All @@ -93,7 +90,20 @@ class CustomCommands {
return false
}

await global.db.engine.update('commands', { command: match.command }, { response: match.response })
let permission = constants.VIEWERS
switch (match.permission) {
case 'owner':
permission = constants.OWNER_ONLY
break
case 'mod':
permission = constants.MODS
break
case 'regular':
permission = constants.REGULAR
break
}

await global.db.engine.update('commands', { command: match.command }, { response: match.response, permision: permission })
let message = await global.commons.prepare('customcmds.command-was-edited', { command: match.command, response: match.response })
debug(message); global.commons.sendMessage(message, sender)
}
Expand All @@ -109,9 +119,21 @@ class CustomCommands {
}

debug(match)
let command = { command: match.command, response: match.response, enabled: true, visible: true }
let permission = constants.VIEWERS
switch (match.permission) {
case 'owner':
permission = constants.OWNER_ONLY
break
case 'mod':
permission = constants.MODS
break
case 'regular':
permission = constants.REGULAR
break
}
let command = { command: match.command, response: match.response, enabled: true, visible: true, permission: permission }

await global.db.engine.insert('commands', command)
await global.db.engine.update('commands', { command: command.command }, command)
let message = await global.commons.prepare('customcmds.command-was-added', { command: match.command })
debug(message); global.commons.sendMessage(message, sender)
}
Expand All @@ -130,8 +152,23 @@ class CustomCommands {
}
if (_.isEmpty(command)) return true // no command was found - return
debug('Command found: %j', command)
const param = msg.replace(cmdArray.join(' '), '') // remove found command from message to get param
global.commons.sendMessage(command.response, sender, {'param': param, 'cmd': command.command})

debug('Checking if permissions are ok')
let [isRegular, isMod, isOwner] = await Promise.all([
global.commons.isRegular(sender),
global.commons.isMod(sender),
global.commons.isOwner(sender)
])
debug('isRegular: %s', isRegular)
debug('isMod: %s', isMod)
debug('isOwner: %s', isOwner)
if (command.permission === constants.VIEWERS ||
(command.permission === constants.REGULAR && (isRegular || isMod || isOwner)) ||
(command.permission === constants.MODS && (isMod || isOwner)) ||
(command.permission === constants.OWNER_ONLY && isOwner)) {
const param = msg.replace(cmdArray.join(' '), '') // remove found command from message to get param
global.commons.sendMessage(command.response, sender, {'param': param, 'cmd': command.command})
}
return true
}

Expand All @@ -141,6 +178,14 @@ class CustomCommands {
debug(output); global.commons.sendMessage(output, sender)
}

async togglePermission (self, sender, text) {
debug('togglePermission(%j,%j,%j)', self, sender, text)
const command = await global.db.engine.findOne('commands', { command: text.replace('!', '') })
if (!_.isEmpty(command)) {
await global.db.engine.update('commands', { _id: command._id.toString() }, { permission: command.permission === 3 ? 0 : ++command.permission })
}
}

async toggle (self, sender, text) {
debug('toggle(%j,%j,%j)', self, sender, text)
const match = XRegExp.exec(text, constants.COMMAND_REGEXP)
Expand Down
6 changes: 6 additions & 0 deletions locales/cs.json
Expand Up @@ -534,6 +534,12 @@
"show": "Ukázat statistiky",
"hide": "Skrýt statistiky"
},
"permissions_list": {
"0": "owner",
"1": "viewer",
"2": "mod",
"3": "regular"
},
"translations": "Vlastní překlad",
"bot-responses": "Odpovědi bota",
"duration": "Trvání",
Expand Down
6 changes: 6 additions & 0 deletions locales/en.json
Expand Up @@ -534,6 +534,12 @@
"show": "Show stats",
"hide": "Hide stats"
},
"permissions_list": {
"0": "owner",
"1": "viewer",
"2": "mod",
"3": "regular"
},
"translations": "Custom translations",
"bot-responses": "Bot responses",
"duration": "Duration",
Expand Down
31 changes: 8 additions & 23 deletions public/pages/customCommands.html
Expand Up @@ -33,22 +33,12 @@
new: function () {
$('#new-command').css('display', 'table-row')
$('.new-confirm-btn').css('display', 'block')

$('#new-command [contenteditable=true]:first').off()
$('#new-command [contenteditable=true]:first').keyup(function (ev) {
var command = $(ev.target).text().trim()
if (!command.startsWith('!')) command = '!' + command
socket.emit('parser.isRegistered', {
emit: 'command.check',
command: command
})
})
},
update: function (list) {
this.list = list
$("#Commands").empty()
$("#Commands").append('<tr id="new-command" style="display:none">' +
'<td style="vertical-align: top !important; width: 20rem; max-width: 20rem;;"><span class="badge badge-default">New command</span> <span class="status badge badge-warning">available</span>' +
'<td style="vertical-align: top !important; width: 20rem; max-width: 20rem;;"><span class="badge badge-default">New command</span></span>' +
commons.editable({
text: '',
id: '_new!',
Expand Down Expand Up @@ -79,6 +69,8 @@
'<span style="cursor: pointer;" class="badge badge-' + (item.visible ? "success" : "danger") +
'" " data-command="' + item.command + '" onclick="cc.toggleVisibility(this)">' + (item.visible ?
translations['visible'] : translations['hidden']) + '</span> ' +
'<span style="cursor: pointer;" class="badge badge-info' +
'" " data-command="' + item.command +'" onclick="cc.togglePermission(this)">' + commons.translate(`permissions_list.${item.permission}`) + '</span> ' +
'<span style="cursor: pointer;" class="badge badge-' + (item.enabled ? "success" : "danger") +
'" data-command="' + item.command + '" onclick="cc.toggle(this)">' + (item.enabled ? translations['enabled'] :
translations['disabled']) + '</span>' +
Expand Down Expand Up @@ -115,6 +107,9 @@
toggle: function (el) {
socket.emit('customcommands.toggle', `!${el.dataset.command}`)
},
togglePermission: function (el) {
socket.emit('customcommands.togglePermission', `!${el.dataset.command}`)
},
toggleVisibility: function (el) {
socket.emit('customcommands.visible', `!${el.dataset.command}`)
},
Expand All @@ -123,9 +118,9 @@
var inputs = $('[data-id="_new!"]')
var data = {
command: $(inputs[0]).text().replace('!', ''),
response: commons.cleanResponseText($(inputs[1]).html())
response: commons.cleanResponseText($(inputs[1]).html()),
}
socket.emit('customcommands.add', `!${data.command} ${data.response}`)
socket.emit('customcommands.add', `viewer !${data.command} ${data.response}`)
$('.new-confirm-btn').css('display', 'none')
}
}
Expand All @@ -136,16 +131,6 @@

socket.on('commands', function (list) {
cc.update(list)
});

socket.on('command.check', function (data) {
if (data.isRegistered) {
$('.status').removeClass().addClass('badge badge-danger status')
$('.save-button').prop('disabled', true)
} else {
$('.status').removeClass().addClass('badge badge-success status')
$('.save-button').prop('disabled', false)
}
})

</script>
13 changes: 12 additions & 1 deletion tools/migrate.js
Expand Up @@ -65,6 +65,17 @@ let updates = async (from, to) => {
}

let migration = {
commands: [{
version: '7.0.0',
do: async () => {
console.info('Migration commands to %s', '7.0.0')
let commands = await global.db.engine.find('commands')
const constants = require('../libs/constants')
for (let command of commands) {
await global.db.engine.update('commands', { _id: command._id.toString() }, { permission: constants.VIEWERS })
}
}
}],
bits: [{
version: '7.0.0',
do: async () => {
Expand All @@ -77,7 +88,7 @@ let migration = {
global.db.engine.insert('users.bits', { username: user.username, amount: user.stats.bits, message: 'Migrated from 6.x', timestamp: _.now() })
])
delete user.stats.bits
delete user._id
delete user._id``
await global.db.engine.insert('users', user)
}
}
Expand Down

0 comments on commit 4aa412a

Please sign in to comment.