-
Notifications
You must be signed in to change notification settings - Fork 0
/
newbot.ts
469 lines (447 loc) · 23.7 KB
/
newbot.ts
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
/*
A bot that welcomes new guild members when they join
*/
// Import the discord.js module
import Discord = require('discord.js');
import distuff_util = require('./util/newutils');
class PinTransPair {
public destCh:Discord.TextChannel;
public collectCh:Discord.TextChannel;
constructor(DestinarionChannel:Discord.TextChannel, CollectingChannel:Discord.TextChannel){
this.destCh = DestinarionChannel;
this.collectCh = CollectingChannel;
this.collectCh.messages.fetch({limit:100});
}
}
// Create an instance of a Discord client
const client0 = new Discord.Client();
const client1 = new Discord.Client();
const client2 = new Discord.Client();
const client3 = new Discord.Client();
const client4 = new Discord.Client();
const client5 = new Discord.Client();
const client6 = new Discord.Client();
const client7 = new Discord.Client();
const client8 = new Discord.Client();
const client9 = new Discord.Client();
//奇妙な拡張子のファイルパーサー(emotesという名前で奇妙な拡張子のファイル)
var emostore_json = new distuff_util.EmojiStorage<distuff_util.EmojiCache>();
import FS = require('fs');
FS.readFile('emotes.json', 'utf-8', function (err, data) {
if (err) throw err;
emostore_json.fromJSONArray(JSON.parse(data));
})
// The token of your bot - https://discordapp.com/developers/applications/me
//転送済みメッセージのIDのアレイを格納する奇妙な拡張子のファイルを読み込む
distuff_util.pinnedmsgids=JSON.parse(FS.readFileSync("pinned.json","utf-8"));
//📌転送用の配列
var pinTransmissionPairs:Array<PinTransPair> = [];
//GetVidChLink用のストリング
const vidlinkbase = ["https://canary.discordapp.com/channels/", "/"]
//VCTitle用Array<obj>
var TempLabeledVCList = []
//ログイン用関数
function loginall() {
client0.login(process.env.BK_1);
client1.login(process.env.BK_2);
client2.login(process.env.BK_3);
client3.login(process.env.BK_4);
client4.login(process.env.BK_5);
client5.login(process.env.BK_6);
client6.login(process.env.BK_7);
client7.login(process.env.BK_8);
client8.login(process.env.BK_9);
client9.login(process.env.BK_10);
}
//すべてのインスタンスをオフラインにします(ログオフ)
function offlineall() {
client0.destroy();
client1.destroy();
client2.destroy();
client3.destroy();
client4.destroy();
client5.destroy();
client6.destroy();
client7.destroy();
client8.destroy();
client9.destroy();
}
// The ready event is vital, it means that your bot will only start reacting to information
// from Discord _after_ ready is emitted
client0.on('ready', () => {
console.log('I am ready.');
//client0.permission = new distuff_util.Permission(client0.guilds);
//client0.guilds.array()[0].members.array()[0].permissions.has(Discord.Permissions.FLAGS.MANAGE_GUILD);
});
client1.on('ready', () => {
console.log('I am ready!');
});
client2.on('ready', () => {
console.log('I am ready!!');
});
client3.on('ready', () => {
console.log('I am ready!!!');
});
client4.on('ready', () => {
console.log('I am ready!!!!');
});
client5.on('ready', () => {
console.log('I am ready!!!!!');
});
client6.on('ready', () => {
console.log('I am ready!!!!!!');
});
client7.on('ready', () => {
console.log('I am ready!!!!!!!');
});
client8.on('ready', () => {
console.log('I am ready!!!!!!!!');
});
client9.on('ready', () => {
console.log('Am I ready?');
});
// メッセージ投稿が確認されたとき
client0.on('message', message => {
if (message.type == 'DEFAULT') {
//スパイシーにするコマンド認識
if (message.content.indexOf('/Re: ') == 0) {
//perm:command.util.RepeatPost
//メッセージの解釈をするための分割
let ArrayedMsg = message.content.split(' ->|');
let reNum = Math.floor(Number(ArrayedMsg[0].replace('/Re: ', '')) / 10);
//チャンネル指定の検出と反映
let ch;
if (message.mentions.users.some(user => {return user.bot})) {
message.author.createDM().then(dmch=>{ch=dmch})
} else if (ArrayedMsg[2]) {
ch = message.mentions.channels.last();
//console.log(chs);
} else {
//デフォルト動作としてメッセージが送信された場所を指定
ch = message.channel;
}
//準備完了報告&処理実行
message.channel.send('k');
setTimeout(distuff_util.looper, 1000, ch, ArrayedMsg, reNum);
} else if (message.content.indexOf('/Func: ') == 0) {
//コマンド認識
let ArrayedCmd = message.content.split('.')
if (message.content.indexOf('System') == 7) {
if (ArrayedCmd[1] === 'kill') {
//perm:command.system.Kill
//const author = message.author;
console.log(`終了要請を受信。送信者: ${message.author.username}`)
let reallykill = new Discord.MessageEmbed();
reallykill.setTitle('本当にこのBotを終了しますか?');
reallykill.setColor([255, 0, 0]);
reallykill.addField('終了するとこのBotのすべての機能を利用できなくなります', '本当にこのBotを終了しますか?', false);
reallykill.addField('終了する', '✅', true);
reallykill.addField('キャンセル', '🛑', true);
reallykill.addField('再起動', '🔄', true);
reallykill.setFooter('リアクションをつけて処理を確定してください');
message.channel.send(reallykill)
.then(embed => {
//Embedの投稿が正常に完了したときの処理
embed.react('✅')
.then(returnedreaction => returnedreaction.message.react('🛑')
.then(returnedreaction => returnedreaction.message.react('🔄')));
//✅か🛑か🔄がコマンドメッセージを送った人によってリアクションされたときだけ反応するようにフィルタ
let reactStr = "✅🛑🔄"
const filter:Discord.CollectorFilter = (reaction:Discord.MessageReaction, user:Discord.User) => {
return ((user === message.author) && ([...reactStr].some(react => react === reaction.emoji.name)));
}
embed.awaitReactions(filter).then(r => {
//上のフィルタで引っかかったときの処理
console.log(`${r.first().emoji.name}が認識されました`);
if (r.first().emoji.name === '🛑') {
console.log('終了をキャンセルします。。。');
embed.delete();
message.delete();
} else if (r.first().emoji.name === '✅') {
console.log('終了します...');
//ボットをオフラインにした後プログラムを強制終了
offlineall();
setTimeout(process.exit, 1000, 0);
} else if (r.first().emoji.name === '🔄') {
console.log('再起動します...');
offlineall();
setTimeout(loginall, 15000);
}
});
});
}
} else if (message.content.indexOf('Emoji') == 7) {
//絵文字関連コマンド
if (ArrayedCmd[1].indexOf('post') == 0) {
//perm:command.emoji.Post
//絵文字投稿コマンド
let emoId = ArrayedCmd[1].split(' ')[1];
//絵文字があるか確認
if (emostore_json.some(function (value) {
return value.id == emoId;
})) {
let emoName = emostore_json.filter(function (value) {
return value.id == emoId;
})[0].name,
emoIsanim = emostore_json.filter(function (value) {
return value.id == emoId;
})[0].isanim;
let anim="";
if(emoIsanim){anim = "a"}else{anim = ""}
message.channel.send(`<${anim}:${emoName}:${emoId}>`);
}
} else if (ArrayedCmd[1].indexOf('add') == 0) {
//perm:command.emoji.Add
//絵文字の追加
let newemoIsanim:boolean,
newemoId,
newemoName;
let str=ArrayedCmd[1].slice(4);
if(str.startsWith('a')){
newemoIsanim=true;
str=str.slice(2);
}else{
newemoIsanim=false;
str=str.slice(1);
}
newemoName=str.split(':')[0];
newemoId=str.split(':')[1];
let anim="";
if(newemoIsanim){anim = "a"}else{anim = ""}
message.channel.send(`<${anim}:${newemoName}:${newemoId}>を追加しています。。。`);
let emojic = new distuff_util.EmojiCache(newemoName, newemoId, newemoIsanim);
emostore_json.push(emojic);
FS.writeFile('emotes.json', JSON.stringify(emostore_json), 'utf-8', function (err) {
//非同期な書き込み
if (err) { console.log(err); }
FS.readFile('emotes.json', 'utf-8', function (err, data) {
//非同期な読み込み
if (err) { console.log(err); }
emostore_json = JSON.parse(data);
//内部絵文字情報更新
})
})
} else if (ArrayedCmd[1].indexOf('genEmojiJSON') == 0){
//perm:command.emoji.GenEmojicordJSON
//絵文字のJSONをEmojicord対応形式で出力する。
let guildemojis = message.guild.emojis.cache;
let guildemojistore=new distuff_util.EmojiStorage<distuff_util.EmojiCache>();
guildemojis.forEach(emoji =>{guildemojistore.push(new distuff_util.EmojiCache(emoji))});
let tmpgemojis = new distuff_util.GuildEmojiStorage(message.guild.name, message.guild.id, guildemojistore);
let tmp = {groups:[tmpgemojis]};
FS.writeFileSync(`${message.guild.id}.json`, JSON.stringify(tmp, null,`\t`))
message.channel.send({files:[{attachment: `${message.guild.id}.json`,name:`${message.guild.name}.json`}]})
}
} else if (message.content.indexOf('PinRemoverStart') == 7) {
//perm:command.pin.RemoverTool
//このコマンドが送信されたチャンネルのピン留め(実際に転送できるのは現在はテキストデータのみ。画像等のピン留めは消えてしまうので改善が必要)
//を別のチャンネルに移すというもの
//メッセージ内のチャンネルメンションから転送先を決定する
let destch = message.mentions.channels.last();
message.channel.messages.fetchPinned()
.then(msgs => {
let delay:number = 0;
for (let msg of msgs) {
delay++;
setTimeout(distuff_util.msgtrans, 3000 * delay, destch, msg);
}
message.channel.send('移行処理発行を完了しました。しばらくお待ち下さい...');
})
} else if (message.content.indexOf('PinTransmitter') == 7) {
if (ArrayedCmd[1].indexOf('Enable') == 0) {
//perm:command.pin.observeandcopy.channel
//TODO:クライアントのイベントから拾うように書き直す
if (message.channel instanceof Discord.DMChannel||message.channel instanceof Discord.NewsChannel) return;
let transdestch:Discord.TextChannel|undefined = message.mentions.channels.last();
if (transdestch === undefined){transdestch = message.channel;}
pinTransmissionPairs.push(new PinTransPair(transdestch, message.channel));
}else if (ArrayedCmd[1].indexOf('Guild')==0) {
//perm:command.pin.observeandcopy.guild
//このコマンドで、コマンドメッセージを投稿したギルド全体のテキストチャンネルにて
//ボット起動後に投稿されたメッセージに対してつけられた📌リアクションで
//指定したチャンネルに転送するように設定する。
//チャンネルの指定はチャンネルメンションで行う。
let pinobservechs:Array<Discord.TextChannel>=[];
let pinObserveChCollection = message.guild.channels.cache.filter(guildch =>
//ここでテキストチャンネルだけ取り出す。まだGuildChannelのまま。
guildch.type == "text"
);
pinObserveChCollection.forEach(Ch => pinobservechs.push(Ch as Discord.TextChannel));
for (let collCh of pinobservechs){
pinTransmissionPairs.push(new PinTransPair(message.mentions.channels.last(), collCh));
}
}else if (ArrayedCmd[1].indexOf('Disable') == 0){
//ピン止め転送されてくるのを止めたいチャンネルでこのコマンドを打つと、
//そのチャンネルではあらゆる場所からのピン止め転送を拒否する設定が作動するようになります。
//チャンネルメンションで特定の1チャンネルからのみを遮断することもできます。
let cancellObserveCh = message.mentions.channels.last();
if (cancellObserveCh !== undefined){
pinTransmissionPairs = pinTransmissionPairs.filter(pair => pair != {destCh:message.channel, collectCh:cancellObserveCh})
} else {
pinTransmissionPairs = pinTransmissionPairs.filter(pair => pair.destCh != message.channel)
}
}
} else if (message.content.indexOf('DedNewsGen') == 7) {
//perm:command.util.DedNewsGen
let Arrayedlns = message.content.split(/\r\n|\r|\n/g)
let Defaultstrs = ["に埋もれてdedしている", "が発見された。"].reverse()
Defaultstrs.push(`${distuff_util.WATIIN()}、果実都某所で、`)
Defaultstrs.reverse()
if(Arrayedlns.length >=3){
let burything=""
let buriedperson=""
if(Arrayedlns[1].length>0 && Arrayedlns[2].length>0){
[burything, buriedperson] = Arrayedlns.shift();
burything.endsWith(" ") ? burything=[...burything].slice(0, burything.lastIndexOf(" ")).join() : burything=burything
buriedperson.endsWith(" ") ? [...buriedperson].slice(0, buriedperson.lastIndexOf(" ")).join() : buriedperson=buriedperson
let lns=[];
let lastlnpt=[];
for (var r1=0;r1!=3;r1++) {
let ln =[];
for (var r2=0;r2!=7;r2++) {
ln.push(burything);
}
lns.push(ln.join(""));
lastlnpt.push(burything);
}
lns.push(lastlnpt.join("")+buriedperson+lastlnpt.join(""))
let returnedlns= [Defaultstrs[0]+burything+Defaultstrs[1]+buriedperson+Defaultstrs[2]].concat(lns).join('\n')
message.channel.send(returnedlns)
}
}
} else if (message.content.indexOf('GetVidChLink') == 7) {
//perm:command.util.GetVidChLink
//踏むとビデオ通話の画面が開くcanaryのリンクを生成します。
let targetvoicech = message.member.voice.channel
if (targetvoicech === undefined) {
message.channel.send('あんたが参加してるVCが、ないやん!\nどうしてくれるの、これ。');
}else{
let res = new Discord.MessageEmbed();
res.setTitle('ご注文はこちらのビデオ通話ですか?');
res.setColor([156, 58, 190]);
res.addField("お待たせいたしました。こちら、", `[${targetvoicech.name}](${vidlinkbase[0]}${targetvoicech.guild.id}${vidlinkbase[1]}${targetvoicech.id})になります。`);
res.setFooter("以上でよろしいですね。");
message.channel.send(res);
}
} else if (message.content.indexOf('Help') == 7) {
//perm:command.general.Help
//ヘルプを表示します。
} else if (message.content.indexOf('InviteBots') == 7) {
//perm:command.general.Invitebot
//Botの招待リンクを発行します。
message.channel.send('導入を検討いただきありがとうございます。\n以下のリンク先で追加したいサーバーを選択し、\`認証\`ボタンを押してください。\n||https://discordapp.com/api/oauth2/authorize?client_id=446678468931878912&permissions=120974400&scope=bot||');
} else if (message.content.indexOf('BridgeChannel') == 7) {
//perm:command.util.BridgeCh
//ボイスチャット同士を接続します
} else if (message.content.indexOf('VCTitle') == 7){
//perm:command.util.VCTempTitle
//VCのタイトルを一時的に書き換えて利用目的がわかるようにします
let authorID = message.author.id;
let targetCh = message.member.voice.channel;
if (targetCh === undefined){message.channel.send(`Hey ${message.author}, そもそもVCに参加していませんね。。。?`);return;}
let originTitle = targetCh.name;
let TempTitle = [...originTitle][0]+message.content.split(" ")[2];
if (TempLabeledVCList.find(VCConf => VCConf.targetID == targetCh.id && VCConf.guild == message.guild.id) !== undefined){
let tmp_VCConf = TempLabeledVCList.find(VCConf => VCConf.targetID == targetCh.id && VCConf.guild == message.guild.id);
TempLabeledVCList = TempLabeledVCList.filter(VCConf => VCConf != tmp_VCConf);
tmp_VCConf.issuer = authorID;
TempLabeledVCList.push(tmp_VCConf);
}else{
TempLabeledVCList.push({issuer:authorID, targetID:targetCh.id, originTitle:originTitle, guild:message.guild.id});
}
targetCh.setName(TempTitle, `${targetCh}の一時的なタイトルの設定が${message.author}(${message.author.tag})によって要求されました。`);
message.delete();
}
}
}
//ここのコードはExamplesの今はいらないやつ達
// Send the message to a designated channel on a server:
//const channel = member.guild.channels.find('name', 'member-log');
// Do nothing if the channel wasn't found on this server
//if (!channel) return;
// Send the message, mentioning the member
//channel.send(`Welcome to the server, ${member}`);
}).on('messageReactionAdd', react => {
if (react.emoji.name === '📌'){
if (pinTransmissionPairs.find(pair => pair.collectCh == react.message.channel)!==undefined) {
//対象のチャンネルかどうかを確認
for (let targetPairs of pinTransmissionPairs.filter(pair => pair.collectCh == react.message.channel)){
//送り先のチャンネルの確認
distuff_util.msgtrans(targetPairs.destCh, react.message);
}
}
}
}).on('voiceStateUpdate', (OldVoiceStat, NewVoiceStat) => {
//VCに誰かが入ったり抜けたりしたとき
let NoLongerUsedVCh = TempLabeledVCList.find(vc => vc.issuer == OldVoiceStat.id && vc.targetID != NewVoiceStat.channelID);
if (NoLongerUsedVCh !== undefined){
client0.guilds.resolve(NoLongerUsedVCh.guild).channels.resolve(NoLongerUsedVCh.targetID).setName(NoLongerUsedVCh.originTitle ,`<@${NoLongerUsedVCh.issuer}>(${client0.users.resolve(NoLongerUsedVCh.issuer).tag})が<#${NoLongerUsedVCh.targetID}>を退出したため一時的なタイトルの必要性はもはや認められません。`);
TempLabeledVCList = TempLabeledVCList.filter(vc => vc != NoLongerUsedVCh);
}
});
//こっから先はただおんなじコードがそれぞれ記述されているだけ。違うのはディレイ用の定数くらいなもん
client1.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 1)
}
}
});
client2.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 2)
}
}
});
client3.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 3)
}
}
});
client4.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 4)
}
}
});
client5.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 5)
}
}
});
client6.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 6)
}
}
});
client7.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 7)
}
}
});
client8.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 8)
}
}
});
client9.on('message', message => {
if (message.type == 'DEFAULT') {
if (message.content.indexOf('/Re: ') == 0) {
distuff_util.repeatcom(message, 9)
}
}
});
// Log our bot in
loginall();