-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
243 lines (233 loc) · 9.64 KB
/
index.js
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
const Discord = require('discord.js')
const { LoggerFactory } = require('logger.js')
require('dotenv').config()
const client = new Discord.Client({
intents: Discord.Intents.FLAGS.GUILD_MESSAGES | Discord.Intents.FLAGS.GUILD_MESSAGE_REACTIONS | Discord.Intents.FLAGS.GUILDS | Discord.Intents.FLAGS.GUILD_MEMBERS,
})
const logger = LoggerFactory.getLogger('client', 'green')
// const DISCORD_BACKGROUND_COLOR = 0x36393f
// these colors are just bad (hard to see)
// #000000 is used as default color
const bannedColors = [0x000000, 0x444444]
const emojis = {
arrow_backward: '◀️',
one: '1️⃣',
two: '2️⃣',
three: '3️⃣',
four: '4️⃣',
five: '5️⃣',
six: '6️⃣',
seven: '7️⃣',
eight: '8️⃣',
nine: '9️⃣',
ten: '🔟',
arrow_forward: '▶️',
}
const zero = (length, o) => {
const s = String(o)
if (s.length >= length) return s
return '0'.repeat(length - s.length) + s
}
const diffColor = (color, another) => {
const r1 = (color >> 16) & 0xFF
const g1 = (color >> 8) & 0xFF
const b1 = color & 0xFF
const r2 = (another >> 16) & 0xFF
const g2 = (another >> 8) & 0xFF
const b2 = another & 0xFF
return Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2)
}
client.on('ready', () => {
logger.info(`Logged in as ${client.user.tag}!`)
})
client.on('messageCreate', async msg => {
if (msg.system || msg.author.system || msg.author.bot) return
if (msg.content === `<@${client.user.id}>` || msg.content === `<@!${client.user.id}>`) {
const embed = new Discord.MessageEmbed()
embed.setColor('GREEN')
embed.setTitle('コマンド')
embed.addField('/set <RGB>', '色を設定します。指定した色が使用できない場合は一番近い色に設定されます。')
embed.addField('/color [RGB]', '色を設定します。')
embed.addField('/remove', '自分が設定している色を削除します。\"すごい染料\"を付与していない場合はエラーが発生します。')
if (msg.member.permissions.has(8)) {
embed.addField('/setup', 'すごい染料を作成します。')
embed.addField('/removeall', 'すごい染料をすべて削除します。')
}
msg.reply({ embeds: [embed] })
return
}
const args = msg.content.split(/\s+/)
if (args[0] === '//set') {
let color = parseInt(args[1], 16)
if (isNaN(color)) {
color = parseInt(args[1], 10)
}
if (isNaN(color)) return
const roles = (await msg.guild.roles.fetch()).filter(role => role.name === 'すごい染料')
roles.sort((a, b) => diffColor(color, a.color) - diffColor(color, b.color))
await msg.member.fetch()
await msg.member.roles.remove(msg.member.roles.cache.filter(role => role.name === 'すごい染料'))
await msg.member.roles.add(roles.first())
const embed = new Discord.MessageEmbed()
embed.setColor(roles.first().color)
embed.setTitle('すごい染料')
embed.setDescription(`色を${zero(6, roles.first().color.toString(16))}に設定しました。`)
msg.reply({ embeds: [embed] })
} else if (args[0] === '//color') {
if (args.length === 1) args[1] = '000000'
let color = parseInt(args[1], 16)
if (isNaN(color)) {
color = parseInt(args[1], 10)
}
if (isNaN(color)) return
const roles = (await msg.guild.roles.fetch()).filter(role => role.name === 'すごい染料')
roles.sort((a, b) => diffColor(color, a.color) - diffColor(color, b.color))
const embed = new Discord.MessageEmbed()
embed.setColor(color)
embed.setTitle(`すごい染料 (1)`)
embed.footer = { text: msg.author.tag }
const values = roles.values()
for (let i = 0; i < 10; i++) {
const role = values.next().value
embed.addField(`${i + 1}. #${zero(6, role.color.toString(16))}`, `<@&${role.id}>`)
}
const message = await msg.reply({ embeds: [embed], failIfNotExists: false })
message.react(emojis.arrow_backward)
message.react(emojis.one)
message.react(emojis.two)
message.react(emojis.three)
message.react(emojis.four)
message.react(emojis.five)
message.react(emojis.six)
message.react(emojis.seven)
message.react(emojis.eight)
message.react(emojis.nine)
message.react(emojis.ten)
message.react(emojis.arrow_forward)
} else if(args[0] === '//remove') {
const runUser = msg.author
const runGuild = msg.guild
const guildUser = runGuild.members.cache.get(`${runUser.id}`)
await msg.member.fetch()
const guilduserRole = guildUser.roles.cache.find((role) => role.name === 'すごい染料')
const embed = new Discord.MessageEmbed()
embed.setColor('RED')
embed.setTitle('すごい染料')
embed.setDescription(`すごい染料があなたについていません。削除することに失敗しました。`)
if(!guilduserRole) return msg.reply({ embeds: [embed] })
await guildUser.roles.remove(guilduserRole)
embed.setColor(guilduserRole.color)
embed.setDescription(`あなたの染料を削除しました。`)
msg.reply({ embeds: [embed] })
} else if (msg.member.permissions.has(Discord.Permissions.FLAGS.MANAGE_ROLES) && args[0] === '//setup') {
const roles = await msg.guild.roles.fetch()
if (250 - roles.size < 123) {
msg.reply(`ロール数の空きが123個必要です。(あと${123 - (250 - roles.size)}個)`)
return
}
const arr = ['0', '4', '8', 'c', 'f']
const promises = []
arr.forEach(sr => {
arr.forEach(sg => {
arr.forEach(sb => {
const color = parseInt(`${sr}${sr}${sg}${sg}${sb}${sb}`, 16)
if (!bannedColors.includes(color)) {
promises.push(msg.guild.roles.create({ name: 'すごい染料', color: color }))
}
})
})
})
logger.info(`Attempting to create ${promises.length} roles`)
await Promise.all(promises)
msg.reply('ロールの作成が完了しました。')
} else if (msg.member.permissions.has(Discord.Permissions.FLAGS.MANAGE_ROLES) && args[0] === '//removeall') {
const roles = await msg.guild.roles.fetch()
await Promise.all(roles.filter(role => role.name === 'すごい染料').map(role => role.delete()))
msg.reply('染料ロールをすべて削除しました。')
}
})
client.on('messageReactionAdd', async (reaction, user) => {
if (user.bot || user.system) return
if (reaction.message.author.id !== client.user.id) return
if (reaction.message.embeds.length === 0) return
const embed = reaction.message.embeds[0]
if (!embed.title.startsWith('すごい染料 (')) return
if (embed.fields.length === 0) return
reaction.users.remove(user)
let index = -1
if (reaction.emoji.name === emojis.arrow_backward) index = -2
if (reaction.emoji.name === emojis.one) index = 0
if (reaction.emoji.name === emojis.two) index = 1
if (reaction.emoji.name === emojis.three) index = 2
if (reaction.emoji.name === emojis.four) index = 3
if (reaction.emoji.name === emojis.five) index = 4
if (reaction.emoji.name === emojis.six) index = 5
if (reaction.emoji.name === emojis.seven) index = 6
if (reaction.emoji.name === emojis.eight) index = 7
if (reaction.emoji.name === emojis.nine) index = 8
if (reaction.emoji.name === emojis.ten) index = 9
if (reaction.emoji.name === emojis.arrow_forward) index = -3
if (index === -1) return
let page = parseInt(embed.title.replace(/.*\((\d+)\)/, '$1'))
const originalColor = embed.color
const roles = (await reaction.message.guild.roles.fetch()).filter(role => role.name === 'すごい染料')
// duplicate code? i don't care.
if (index === -2) {
// backward
if (embed.footer.text !== user.tag) return
if (page <= 1) return
roles.sort((a, b) => diffColor(originalColor, a.color) - diffColor(originalColor, b.color))
page--
const values = roles.values()
const e = new Discord.MessageEmbed()
e.setColor(originalColor)
e.setTitle(`すごい染料 (${page})`)
e.footer = embed.footer
let o = 0
for (let i = 0; i < 10 * page; i++) {
const role = values.next().value
if (!role) break
if (i >= 10 * (page - 1)) {
e.addField(`${++o}. #${zero(6, role.color.toString(16))}`, `<@&${role.id}>`)
}
}
reaction.message.edit({ embeds: [e] })
return
}
if (index === -3) {
// forward
if (embed.footer.text !== user.tag) return
if (page >= 13) return
roles.sort((a, b) => diffColor(originalColor, a.color) - diffColor(originalColor, b.color))
page++
const values = roles.values()
const e = new Discord.MessageEmbed()
e.setColor(originalColor)
e.setTitle(`すごい染料 (${page})`)
e.footer = embed.footer
let o = 0
for (let i = 0; i < 10 * page; i++) {
const role = values.next().value
if (!role) break
if (i >= 10 * (page - 1)) {
e.addField(`${++o}. #${zero(6, role.color.toString(16))}`, `<@&${role.id}>`)
}
}
reaction.message.edit({ embeds: [e] })
return
}
if (!embed.fields[index]) return
const color = parseInt(embed.fields[index].name.replace(/.*#(.*)/, '$1'), 16)
const member = await reaction.message.guild.members.fetch(user.id)
await member.roles.remove(member.roles.cache.filter(role => role.name === 'すごい染料'))
roles.sort((a, b) => diffColor(color, a.color) - diffColor(color, b.color))
await member.roles.add(roles.first())
const e = new Discord.MessageEmbed()
e.setColor(roles.first().color)
e.setTitle('すごい染料')
e.setDescription(`色を${zero(6, roles.first().color.toString(16))}に設定しました。`)
reaction.message.channel.send({ content: `<@${user.id}>`, embeds: [e] })
})
logger.info('Hello! Please turn on "server members intent" on your bot page if you haven\'t done so already!')
logger.info('Logging in...')
client.login(process.env.TOKEN)