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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 331 - (hide annotations)
Mon Jul 29 17:29:35 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 6083 byte(s)
refactor(locking): use mongodb
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 rakin 331 role_id: lockRole.id,
48     createdAt: new Date()
49 rakin 244 });
50    
51 rakin 242 await channel.permissionOverwrites.edit(lockRole, {
52 rakin 241 SEND_MESSAGES: false,
53     SEND_MESSAGES_IN_THREADS: false,
54     REQUEST_TO_SPEAK: false,
55     SPEAK: false,
56     }, { reason });
57    
58 rakin 244 console.log('success');
59    
60 rakin 241 if (sendConfirmation && channel.isText()) {
61     await channel.send({
62     embeds: [
63     new MessageEmbed({
64     color: 0x007bff,
65     description: `:lock: This channel has been locked.`,
66     fields: reason ? [
67     {
68     name: 'Reason',
69     value: reason + ''
70     }
71     ] : [],
72     footer: { text: 'Locked' }
73     })
74     .setTimestamp()
75     ]
76     });
77     }
78    
79     return true;
80     }
81    
82 rakin 242 async unlock(channel: GuildChannel, { reason, sendConfirmation, force, role }: ChannelLockOptions = {}) {
83 rakin 244 const lockRole = role ? (role instanceof Role ? role : (await channel.guild.roles.fetch(role))!) : channel.guild.roles.everyone;
84 rakin 242
85 rakin 241 const channelLock = await ChannelLock.findOne({
86 rakin 331 channel_id: channel.id,
87     guild_id: channel.guild.id,
88     role_id: lockRole.id
89 rakin 241 });
90    
91 rakin 242 if (!channelLock) {
92 rakin 244 console.log('Channel not locked');
93 rakin 242 return false;
94     }
95    
96 rakin 331 const permissions = channelLock?.previous_perms; // as { allow: PermissionString[] | null, deny: PermissionString[] | null }
97 rakin 241
98     if (!permissions && !force) {
99 rakin 244 console.log('Permission error');
100 rakin 241 return false;
101     }
102    
103     const transform = (key: PermissionString) => {
104 rakin 331 if (!permissions?.allow || !permissions?.deny) {
105 rakin 244 return undefined;
106     }
107    
108 rakin 241 if (!permissions) {
109     return force ? true : undefined;
110     }
111    
112     if (permissions.allow.includes(key) && !permissions.deny.includes(key)) {
113     return true;
114     }
115     else if (!permissions.allow.includes(key) && permissions.deny.includes(key)) {
116     return false;
117     }
118     else {
119     return null;
120     }
121     };
122    
123 rakin 331 if (!permissions?.allow && !permissions?.deny) {
124 rakin 244 await channel.permissionOverwrites.delete(lockRole);
125     }
126     else {
127     await channel.permissionOverwrites.edit(lockRole, {
128     SEND_MESSAGES: transform('SEND_MESSAGES'),
129     SEND_MESSAGES_IN_THREADS: transform('SEND_MESSAGES_IN_THREADS'),
130     REQUEST_TO_SPEAK: transform('REQUEST_TO_SPEAK'),
131     SPEAK: transform('SPEAK'),
132     }, { reason });
133     }
134 rakin 241
135 rakin 331 await channelLock?.delete();
136 rakin 241
137     if (sendConfirmation && channel.isText()) {
138     await channel.send({
139     embeds: [
140     new MessageEmbed({
141     color: 0x007bff,
142     description: `:closed_lock_with_key: This channel has been unlocked.`,
143     fields: reason ? [
144     {
145     name: 'Reason',
146     value: reason + ''
147     }
148     ] : [],
149     footer: { text: 'Unlocked' }
150     })
151     .setTimestamp()
152     ]
153     });
154     }
155    
156     return true;
157     }
158    
159 rakin 244 async lockAll(channels: GuildChannel[], user: User, options: ChannelLockOptions = {}) {
160     let success = 0, failure = 0;
161    
162     for await (const channel of channels) {
163     console.log('Locking', channel.name);
164    
165     if (await this.lock(channel, user, options)) {
166     success++;
167     }
168     else {
169     failure++;
170     }
171     }
172    
173     return [success, failure];
174 rakin 241 }
175    
176 rakin 244 async unlockAll(channels: GuildChannel[], options: ChannelLockOptions = {}) {
177     let success = 0, failure = 0;
178    
179     for await (const channel of channels) {
180     console.log('Unlocking', channel.name);
181    
182     if (await this.unlock(channel, options)) {
183     success++;
184     }
185     else {
186     failure++;
187     }
188     }
189    
190     return [success, failure];
191 rakin 241 }
192     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26