/[sudobot]/trunk/src/services/ChannelLockManager.ts
ViewVC logotype

Annotation of /trunk/src/services/ChannelLockManager.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 244 - (hide annotations)
Mon Jul 29 17:29:11 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 6095 byte(s)
refactor: improve channel locking systems
1 rakin 242 import { GuildChannel, PermissionString, Role, RoleResolvable, User } from "discord.js";
2 rakin 241 import MessageEmbed from "../client/MessageEmbed";
3     import ChannelLock from "../models/ChannelLock";
4     import Service from "../utils/structures/Service";
5    
6     export interface ChannelLockOptions {
7     reason?: string;
8     sendConfirmation?: boolean;
9     force?: boolean;
10 rakin 242 role?: RoleResolvable;
11 rakin 241 }
12    
13     export default class ChannelLockManager extends Service {
14 rakin 242 async lock(channel: GuildChannel, user: User, { reason, sendConfirmation, role }: ChannelLockOptions = {}) {
15 rakin 244 const lockRole = role ? (role instanceof Role ? role : (await channel.guild.roles.fetch(role))!) : channel.guild.roles.everyone;
16 rakin 242
17 rakin 241 const channelLock = await ChannelLock.findOne({
18     where: {
19     channel_id: channel.id,
20 rakin 242 guild_id: channel.guild.id,
21 rakin 244 role_id: lockRole.id
22 rakin 241 }
23     });
24    
25     if (channelLock) {
26 rakin 244 console.log('exists');
27 rakin 241 return false;
28     }
29    
30 rakin 244 console.log(lockRole?.name);
31 rakin 241
32 rakin 244 let permissions = channel.permissionOverwrites.cache.get(lockRole.id);
33 rakin 241
34 rakin 244 const permJson = {
35     allow: permissions?.allow?.toArray() ?? null,
36     deny: permissions?.deny?.toArray() ?? null,
37     };
38 rakin 241
39 rakin 244 console.log(permJson);
40    
41     await ChannelLock.create({
42     user_id: user.id,
43     guild_id: channel.guild.id,
44     channel_id: channel.id,
45     reason,
46     previous_perms: permJson,
47     role_id: lockRole.id
48     });
49    
50 rakin 242 await channel.permissionOverwrites.edit(lockRole, {
51 rakin 241 SEND_MESSAGES: false,
52     SEND_MESSAGES_IN_THREADS: false,
53     REQUEST_TO_SPEAK: false,
54     SPEAK: false,
55     }, { reason });
56    
57 rakin 244 console.log('success');
58    
59 rakin 241 if (sendConfirmation && channel.isText()) {
60     await channel.send({
61     embeds: [
62     new MessageEmbed({
63     color: 0x007bff,
64     description: `:lock: This channel has been locked.`,
65     fields: reason ? [
66     {
67     name: 'Reason',
68     value: reason + ''
69     }
70     ] : [],
71     footer: { text: 'Locked' }
72     })
73     .setTimestamp()
74     ]
75     });
76     }
77    
78     return true;
79     }
80    
81 rakin 242 async unlock(channel: GuildChannel, { reason, sendConfirmation, force, role }: ChannelLockOptions = {}) {
82 rakin 244 const lockRole = role ? (role instanceof Role ? role : (await channel.guild.roles.fetch(role))!) : channel.guild.roles.everyone;
83 rakin 242
84 rakin 241 const channelLock = await ChannelLock.findOne({
85     where: {
86     channel_id: channel.id,
87 rakin 242 guild_id: channel.guild.id,
88 rakin 244 role_id: lockRole.id
89 rakin 241 }
90     });
91    
92 rakin 242 if (!channelLock) {
93 rakin 244 console.log('Channel not locked');
94 rakin 242 return false;
95     }
96    
97 rakin 244 const permissions = channelLock?.get('previous_perms') as { allow: PermissionString[] | null, deny: PermissionString[] | null };
98 rakin 241
99     if (!permissions && !force) {
100 rakin 244 console.log('Permission error');
101 rakin 241 return false;
102     }
103    
104     const transform = (key: PermissionString) => {
105 rakin 244 if (!permissions.allow || !permissions.deny) {
106     return undefined;
107     }
108    
109 rakin 241 if (!permissions) {
110     return force ? true : undefined;
111     }
112    
113     if (permissions.allow.includes(key) && !permissions.deny.includes(key)) {
114     return true;
115     }
116     else if (!permissions.allow.includes(key) && permissions.deny.includes(key)) {
117     return false;
118     }
119     else {
120     return null;
121     }
122     };
123    
124 rakin 244 if (!permissions.allow && !permissions.deny) {
125     await channel.permissionOverwrites.delete(lockRole);
126     }
127     else {
128     await channel.permissionOverwrites.edit(lockRole, {
129     SEND_MESSAGES: transform('SEND_MESSAGES'),
130     SEND_MESSAGES_IN_THREADS: transform('SEND_MESSAGES_IN_THREADS'),
131     REQUEST_TO_SPEAK: transform('REQUEST_TO_SPEAK'),
132     SPEAK: transform('SPEAK'),
133     }, { reason });
134     }
135 rakin 241
136     await channelLock?.destroy();
137    
138     if (sendConfirmation && channel.isText()) {
139     await channel.send({
140     embeds: [
141     new MessageEmbed({
142     color: 0x007bff,
143     description: `:closed_lock_with_key: This channel has been unlocked.`,
144     fields: reason ? [
145     {
146     name: 'Reason',
147     value: reason + ''
148     }
149     ] : [],
150     footer: { text: 'Unlocked' }
151     })
152     .setTimestamp()
153     ]
154     });
155     }
156    
157     return true;
158     }
159    
160 rakin 244 async lockAll(channels: GuildChannel[], user: User, options: ChannelLockOptions = {}) {
161     let success = 0, failure = 0;
162    
163     for await (const channel of channels) {
164     console.log('Locking', channel.name);
165    
166     if (await this.lock(channel, user, options)) {
167     success++;
168     }
169     else {
170     failure++;
171     }
172     }
173    
174     return [success, failure];
175 rakin 241 }
176    
177 rakin 244 async unlockAll(channels: GuildChannel[], options: ChannelLockOptions = {}) {
178     let success = 0, failure = 0;
179    
180     for await (const channel of channels) {
181     console.log('Unlocking', channel.name);
182    
183     if (await this.unlock(channel, options)) {
184     success++;
185     }
186     else {
187     failure++;
188     }
189     }
190    
191     return [success, failure];
192 rakin 241 }
193     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26