Skip to content

Commit dfbefbf

Browse files
committed
Update permissions
1 parent 4755041 commit dfbefbf

File tree

9 files changed

+275
-0
lines changed

9 files changed

+275
-0
lines changed

index.html

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="UTF-8">
6+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
8+
<title>Document</title>
9+
</head>
10+
11+
<body>
12+
s
13+
</body>
14+
15+
</html>
16+
17+
<script>
18+
async function test() {
19+
fetch('http://localhost:3000/test')
20+
}
21+
test()
22+
</script>

src/app.ts

+15
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,25 @@ export class App {
2323
console.log(`Route chargée : /api/v${getFileName.infos.version}/${getFileName.infos.route}`);
2424
}
2525
})
26+
this.app.set('trust proxy', true)
27+
this.app.get('/test', (req: any, res: any) => {
28+
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
29+
console.log('ip : ' + ip); // ip address of the user
30+
res.end()
31+
})
2632
}
2733
private handleMiddlewares(): void {
2834
this.app.use(express.urlencoded({ extended: true }));
2935
this.app.use(express.json());
36+
this.app.use(function (req: any, res: any, next: Function) {
37+
const origin = req.headers.origin;
38+
res.setHeader('Access-Control-Allow-Origin', origin)
39+
40+
res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
41+
res.setHeader('Access-Control-Allow-Credentials', 'true')
42+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
43+
next()
44+
})
3045
}
3146
public start(): void {
3247
this.handleMiddlewares();

src/assets/classes/v2/auth.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import db from '../../../models/db';
2+
import { IObject } from '../../../types';
3+
const Authentication = class {
4+
private config;
5+
constructor(server: any) {
6+
this.config = server.config
7+
}
8+
logUser(userId: string, infos: IObject) {
9+
return new Promise((resolve, reject) => {
10+
if (!userId) return reject(new Error('Missing user id'));
11+
if (!infos || infos && infos.username) return reject(new Error('Missing username.'))
12+
if (!infos || infos && infos.password) return reject(new Error('Missing password.'))
13+
db.query('')
14+
})
15+
}
16+
17+
}

src/routes/v2/auth.ts

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Router } from 'express';
2+
import * as MemberCtrl from '../../controllers/members';
3+
import { Iroute } from '../../types';
4+
import auth from '../../middlewares/auth';
5+
const MemberRouter: Router = Router();
6+
7+
MemberRouter.post('/', MemberCtrl.createMember);
8+
MemberRouter.post('/auth', MemberCtrl.auth);
9+
10+
MemberRouter.get('/all/:page', auth, MemberCtrl.getMembers);
11+
MemberRouter.get('/:userId', auth, MemberCtrl.getMember);
12+
13+
MemberRouter.put('/:userId', auth, MemberCtrl.updateMember);
14+
15+
MemberRouter.delete('/:userId', auth, MemberCtrl.deleteMember)
16+
17+
export const infos: Iroute = {
18+
route: "auth",
19+
version: 2,
20+
router: MemberRouter
21+
};

src/routes/v2/members.ts

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Router } from 'express';
2+
import * as MemberCtrl from '../../controllers/members';
3+
import { Iroute } from '../../types';
4+
import auth from '../../middlewares/auth';
5+
const MemberRouter: Router = Router();
6+
7+
MemberRouter.post('/', MemberCtrl.createMember);
8+
MemberRouter.post('/auth', MemberCtrl.auth);
9+
10+
MemberRouter.get('/all/:page', auth, MemberCtrl.getMembers);
11+
MemberRouter.get('/:userId', auth, MemberCtrl.getMember);
12+
13+
MemberRouter.put('/:userId', auth, MemberCtrl.updateMember);
14+
15+
MemberRouter.delete('/:userId', auth, MemberCtrl.deleteMember)
16+
17+
export const infos: Iroute = {
18+
route: "members",
19+
version: 2,
20+
router: MemberRouter
21+
};

src/utils/Permissions.ts

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
class Permissions {
2+
private bits: number; // User bits permissions
3+
public FLAGS = [
4+
{ value: 1 << 1, name: 'ADMINISTRATOR' },
5+
{ value: 1 << 2, name: 'VIEW_ALL_MEMBERS' },
6+
{ value: 1 << 3, name: 'UPDATE_MEMBERS' },
7+
{ value: 1 << 4, name: 'DELETE_MEMBERS' },
8+
{ value: 1 << 5, name: 'BAN_MEMBERS' },
9+
]
10+
constructor(bits: number) {
11+
this.bits = bits;
12+
}
13+
get ALL() {
14+
let bit = 0;
15+
for (let flag of this.FLAGS) {
16+
bit += flag.value
17+
}
18+
return bit
19+
}
20+
get permissionCalc() {
21+
return this.bits;
22+
}
23+
public toArray() {
24+
25+
let bits = this.bits;
26+
const flags = [...this.FLAGS].reverse()
27+
28+
const userPermissions: any[] = []
29+
for (let permission of flags) {
30+
31+
const rest = bits % permission.value;
32+
if (rest == 0 && bits != 0) {
33+
userPermissions.push(permission.name);
34+
break;
35+
}
36+
if (rest < bits) {
37+
userPermissions.push(permission.name);
38+
bits = rest
39+
}
40+
}
41+
return userPermissions
42+
}
43+
public hasPermissions(permission: any): boolean {
44+
if (Array.isArray(permission)) return permission.every(p => this.hasPermissions(p))
45+
const permissionsArray = this.toArray();
46+
if (permissionsArray.includes('ADMINISTRATOR')) return true;
47+
if (typeof permission === 'string') {
48+
49+
50+
if (permissionsArray.includes(permission)) return true;
51+
else return false;
52+
}
53+
if (typeof permission === 'number') {
54+
let hasPermissions = false;
55+
this.FLAGS.map(p => {
56+
if (p.value === permission) hasPermissions = true;
57+
})
58+
return hasPermissions;
59+
}
60+
return false
61+
}
62+
public calculate(permissions: string | string[]) {
63+
if (typeof permissions === 'string') {
64+
const permission = this.FLAGS.find(f => f.name === permissions.toUpperCase());
65+
return permission ? permission : undefined;
66+
}
67+
if (Array.isArray(permissions)) {
68+
let some = 0;
69+
permissions.map(p => {
70+
const permission = this.FLAGS.find(perm => perm.name === p.toUpperCase())
71+
if (permission) some += permission.value;
72+
})
73+
}
74+
}
75+
}
76+
77+
const test = new Permissions(2)
78+
79+
console.log(test.toArray());
80+
console.log(test.hasPermissions([16, 'DELETE_MEMBERSs']));

tests/permissions.js

Whitespace-only changes.

tests/t.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
const filter = (reaction, user) => reaction.emoji.name === settings.ReactionClose && !user.bot;
2+
3+
4+
collector.on("collect", collected => {
5+
var bvn = new MessageEmbed()
6+
.setDescription(`Votre ticket a bien été cloturée.`)
7+
.setFooter(`Ticket bot`)
8+
.setColor("RANDOM")
9+
.setTitle(`Ticket cloturée.`)
10+
// channel_ticket.messages.fetch(bvn)
11+
12+
channel_ticket.send(bvn)
13+
channel_ticket.delete({ timeout: 15000 });
14+
15+
16+
// channel_ticket.setTimeout(() => {
17+
// channel_ticket.delete()
18+
// }, 15000);
19+
});
20+
21+
22+
const filter = (reaction, user) => reaction.emoji.name === "📜" && user.id == '531137738108305409' && !user.bot;
23+
24+
25+
collector.on("collect", collected => {
26+
if (!collector.member.hasPermission("BAN_MEMBERS")) return message.channel.send(` :x: Tu n'as pas la permission`).then(msg => msg.delete({ timeout: 5000 }));
27+
28+
const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel;
29+
30+
if (message.member.hasPermission('ADMINISTRATOR') || channel.name === `ticket-${message.author.id}`) {
31+
32+
33+
channel.messages.fetch().then(async (messages) => {
34+
const output = messages.array().reverse().map(m => `${new Date(m.createdAt).toLocaleString('fr-fr')} - ${m.author.tag}: ${m.attachments.size > 0 ? m.attachments.first().proxyURL : m.content}`).join('\n');
35+
36+
let response;
37+
try {
38+
response = await sourcebin.create([
39+
{
40+
name: ' ',
41+
content: output,
42+
languageId: 'text',
43+
},
44+
], {
45+
title: `Chat transcript for ${channel.name}`,
46+
description: ' ',
47+
});
48+
}
49+
catch (e) {
50+
return message.channel.send('An error occurred, please try again!');
51+
}
52+
53+
const embed = new MessageEmbed()
54+
.setDescription(`[\`📄 View\`](${response.url})`)
55+
.setColor('GREEN');
56+
channel_ticket.send('the transcript is complete. Please click the link below to view the transcript', embed);
57+
});
58+
}
59+
})

tests/test.js

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const FLAGS = {
2+
CREATE_INSTANT_INVITE: 1 << 0,
3+
KICK_MEMBERS: 1 << 1,
4+
BAN_MEMBERS: 1 << 2,
5+
ADMINISTRATOR: 1 << 3,
6+
MANAGE_CHANNELS: 1 << 4,
7+
MANAGE_GUILD: 1 << 5,
8+
ADD_REACTIONS: 1 << 6,
9+
VIEW_AUDIT_LOG: 1 << 7,
10+
PRIORITY_SPEAKER: 1 << 8,
11+
STREAM: 1 << 9,
12+
VIEW_CHANNEL: 1 << 10,
13+
SEND_MESSAGES: 1 << 11,
14+
SEND_TTS_MESSAGES: 1 << 12,
15+
MANAGE_MESSAGES: 1 << 13,
16+
EMBED_LINKS: 1 << 14,
17+
ATTACH_FILES: 1 << 15,
18+
READ_MESSAGE_HISTORY: 1 << 16,
19+
MENTION_EVERYONE: 1 << 17,
20+
USE_EXTERNAL_EMOJIS: 1 << 18,
21+
VIEW_GUILD_INSIGHTS: 1 << 19,
22+
CONNECT: 1 << 20,
23+
SPEAK: 1 << 21,
24+
MUTE_MEMBERS: 1 << 22,
25+
DEAFEN_MEMBERS: 1 << 23,
26+
MOVE_MEMBERS: 1 << 24,
27+
USE_VAD: 1 << 25,
28+
CHANGE_NICKNAME: 1 << 26,
29+
MANAGE_NICKNAMES: 1 << 27,
30+
MANAGE_ROLES: 1 << 28,
31+
MANAGE_WEBHOOKS: 1 << 29,
32+
MANAGE_EMOJIS: 1 << 30,
33+
};
34+
let permission = 16;
35+
let i = 0
36+
const permissions = Object.keys(FLAGS)
37+
const has = permissions.filter(bit => {
38+
return FLAGS[bit] === permission
39+
})
40+
console.log(has);

0 commit comments

Comments
 (0)