-
-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathrole.ts
More file actions
91 lines (78 loc) · 2.27 KB
/
role.ts
File metadata and controls
91 lines (78 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import {
ApplicationIntegrationType,
InteractionContextType,
type CommandInteraction,
CommandWithSubcommands,
Permission,
ApplicationCommandOptionType
} from "@buape/carbon"
import BaseCommand from "./base.js"
const communityStaff = "1477360613125787678"
class RoleToggle extends BaseCommand {
name: string
roleId: string
options = [
{
type: ApplicationCommandOptionType.User as const,
name: "user",
description: "The user to toggle the role on",
required: true
}
]
constructor(name: string, roleId: string) {
super()
this.name = name
this.roleId = roleId
this.description = `Toggle the ${this.name} role on someone`
this.contexts = [InteractionContextType.Guild]
this.integrationTypes = [ApplicationIntegrationType.GuildInstall]
}
async run(interaction: CommandInteraction) {
if (!interaction.guild || !interaction.member) {
return
}
const member = interaction.member
const memberRoles = member.roles ?? []
const hasAccess = memberRoles.some(
(role) => role.id === communityStaff
)
if (!hasAccess) {
await interaction.reply({
content: "no.",
allowedMentions: { parse: [] }
})
return
}
const target = interaction.options.getUser("user", true)
const targetMember = await interaction.guild.fetchMember(target.id)
if (!targetMember) {
await interaction.reply({
content: "User not found in the server.",
allowedMentions: { parse: [] }
})
return
}
const hasRole = targetMember.roles.some((role) => role.id === this.roleId)
const verb = hasRole ? "Removed" : "Added"
if (hasRole) {
await targetMember.removeRole(this.roleId)
} else {
await targetMember.addRole(this.roleId)
}
await interaction.reply({
content: `${verb} <@&${this.roleId}> ${hasRole ? "from" : "to"} ${targetMember.nickname ?? targetMember.user.globalName ?? targetMember.user.username}.`,
allowedMentions: { parse: [] }
})
}
}
export default class RoleCommand extends CommandWithSubcommands {
name = "role"
description = "Toggle server roles"
permission = Permission.ManageRoles
contexts = [InteractionContextType.Guild]
integrationTypes = [ApplicationIntegrationType.GuildInstall]
subcommands = [
new RoleToggle("showcase-ban", "123456789012345678"),
new RoleToggle("clawtributor", "1458375944111915051")
]
}