Merge pull request #150 from JsSucks/plugin-permissions

Initial plugin permissions
This commit is contained in:
Alexei Stukov 2018-02-28 21:39:23 +02:00 committed by GitHub
commit ecf7f872cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 209 additions and 3 deletions

View File

@ -208,7 +208,8 @@ export default class {
mainPath
};
const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies);
const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions);
if (!content) return null;
if (!reload && this.getContentById(content.id))
throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`};

View File

@ -11,3 +11,4 @@ export { default as ModuleManager } from './modulemanager';
export { default as EventListener } from './eventlistener';
export { default as SocketProxy } from './socketproxy';
export { default as EventHook } from './eventhook';
export { default as Permissions } from './permissionmanager';

View File

@ -0,0 +1,44 @@
/**
* BetterDiscord Permission Manager
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
* All rights reserved.
* https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const PermissionMap = {
IDENTIFY: {
HEADER: 'Access your account information',
BODY: 'Allows :NAME: to read your account information(excluding user token)'
},
READ_MESSAGES: {
HEADER: 'Read all messages',
BODY: 'Allows :NAME: to read all messages accessible through your Discord account'
},
SEND_MESSAGES: {
HEADER: 'Send messages',
BODY: 'Allows :NAME: to send messages on your behalf'
},
DELETE_MESSAGES: {
HEADER: 'Delete messages',
BODY: 'Allows :NAME: to delete messages on your behalf'
},
EDIT_MESSAGES: {
HEADER: 'Edit messages',
BODY: 'Allows :NAME: to edit messages on your behalf'
},
JOIN_SERVERS: {
HEADER: 'Join servers for you',
BODY: 'Allows :NAME: to join servers on your behalf'
}
}
export default class {
static permissionText(permission) {
return PermissionMap[permission];
}
}

View File

@ -14,7 +14,8 @@ import Plugin from './plugin';
import PluginApi from './pluginapi';
import Vendor from './vendor';
import { ClientLogger as Logger } from 'common';
import { Events } from 'modules';
import { Events, Permissions } from 'modules';
import { Modals } from 'ui';
export default class extends ContentManager {
@ -47,7 +48,19 @@ export default class extends ContentManager {
static get refreshPlugins() { return this.refreshContent }
static get loadContent() { return this.loadPlugin }
static async loadPlugin(paths, configs, info, main, dependencies) {
static async loadPlugin(paths, configs, info, main, dependencies, permissions) {
if (permissions && permissions.length > 0) {
for (let perm of permissions) {
console.log(`Permission: ${Permissions.permissionText(perm).HEADER} - ${Permissions.permissionText(perm).BODY}`);
}
try {
const allowed = await Modals.permissions(`${info.name} wants to:`, info.name, permissions).promise;
} catch (err) {
return null;
}
}
const deps = [];
if (dependencies) {
for (const [key, value] of Object.entries(dependencies)) {

View File

@ -6,3 +6,4 @@
@import './basic-modal.scss';
@import './error-modal.scss';
@import './settings-modal.scss';
@import './permission-modal.scss';

View File

@ -0,0 +1,52 @@
.bd-perm-scope {
display: flex;
.bd-perm-allow {
display: flex;
flex: 1;
.bd-perm-check {
-webkit-box-sizing: border-box;
background: hsla(0,0%,100%,.2);
border-radius: 18px;
box-sizing: border-box;
height: 36px;
margin-right: 20px;
margin-top: 14px;
padding: 2px;
width: 36px;
.bd-perm-check-inner {
background-color: #43b581;
border: 2px solid #35383c;
border-radius: 16px;
box-sizing: border-box;
height: 32px;
width: 32px;
}
}
.bd-perm-inner {
display: flex;
flex: 1;
flex-direction: column;
justify-content: center;
min-height: 45px;
padding: 13px 0;
border-bottom: 1px solid hsla(0,0%,100%,.1);
.bd-perm-name {
color: #fff;
font-size: 17px;
font-weight: 500;
line-height: 22px;
}
.bd-perm-desc {
color: hsla(0,0%,100%,.2);
font-size: 12px;
line-height: 15px;
}
}
}
}

View File

@ -0,0 +1,55 @@
/**
* BetterDiscord Permission Modal Component
* Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks
* All rights reserved.
* https://betterdiscord.net
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
<template>
<Modal :class="['bd-modal-basic', {'bd-modal-out': modal.closing}]" :headerText="modal.title" :close="modal.close">
<div slot="body" class="bd-modal-basic-body">
<div v-for="(perm, i) in permissions" :key="`perm-${i}`" class="bd-perm-scope">
<div class="bd-perm-allow">
<div class="bd-perm-check">
<div class="bd-perm-check-inner"></div>
</div>
<div class="bd-perm-inner">
<div class="bd-perm-name">{{perm.HEADER}}</div>
<div class="bd-perm-desc">{{perm.BODY}}</div>
</div>
</div>
</div>
</div>
<div slot="footer" class="bd-modal-controls">
<div class="bd-flex-grow"></div>
<div class="bd-button" @click="modal.close">Cancel</div>
<div class="bd-button bd-ok" @click="() => { modal.confirm(); modal.close(); }">Authorize</div>
</div>
</Modal>
</template>
<script>
// Imports
import { Modal } from '../../common';
import { Permissions } from 'modules';
export default {
data() {
return { permissions: [] }
},
props: ['modal'],
components: {
Modal
},
beforeMount() {
this.permissions = this.modal.perms.map(perm => {
const getPerm = Permissions.permissionText(perm);
getPerm.BODY = getPerm.BODY.replace(':NAME:', this.modal.name);
return getPerm;
});
}
}
</script>

View File

@ -14,6 +14,7 @@ import BasicModal from './components/bd/modals/BasicModal.vue';
import ConfirmModal from './components/bd/modals/ConfirmModal.vue';
import ErrorModal from './components/bd/modals/ErrorModal.vue';
import SettingsModal from './components/bd/modals/SettingsModal.vue';
import PermissionModal from './components/bd/modals/PermissionModal.vue';
export default class {
@ -81,6 +82,16 @@ export default class {
return modal;
}
static permissions(title, name, perms) {
const modal = { title,name, perms };
modal.promise = new Promise((resolve, reject) => {
modal.confirm = () => resolve(true);
modal.beforeClose = () => reject();
this.add(modal, PermissionModal);
});
return modal;
}
static error(event) {
return this.add({ event }, ErrorModal);
}

View File

@ -0,0 +1,16 @@
{
"info": {
"id": "permission-test",
"name": "Permission Test",
"authors": [ "Jiiks" ],
"version": 1.0,
"description": "Permission Test Description"
},
"main": "index.js",
"type": "plugin",
"permissions": [
"READ_MESSAGES",
"SEND_MESSAGES"
],
"defaultConfig": []
}

View File

@ -0,0 +1,12 @@
module.exports = (Plugin, Api, Vendor) => {
return class extends Plugin {
onStart() {
return true;
}
onStop() {
return true;
}
}
}