-
Notifications
You must be signed in to change notification settings - Fork 6
/
index.js
228 lines (188 loc) · 7.79 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
const bunyan = require('bunyan');
const packageJson = require('./package.json');
const fs = require('fs');
const OpenJtalk = require('./openjtalk')
const Softalk = require('./softalk')
const update = require('./update')
const Discord = require('discord.js');
const yaml = require("js-yaml");
const log = bunyan.createLogger({name: 'damare', level: 'debug'});
let useVoiceClient;
let voiceClient;
log.info("Damare 読み上げBot v" + packageJson.version);
log.info("開発者: 巳波みなと https://minato86.me")
log.info("このソフトウェアが気に入ったらサポートをお願いします: https://ko-fi.com/minato86")
update(log, packageJson);
if (fs.existsSync('./voice.wav')) {
log.debug('⚠️ voice.wavが見つかりました、削除します')
fs.unlinkSync('./voice.wav');
log.debug('✅ voice.wavが削除されました')
}
try {
log.debug("🔄 設定ファイルを読み込みます")
config = yaml.load(
fs.readFileSync("./config.yml", "utf-8")
);
} catch (error) {
log.fatal('💥 設定ファイルが見つかりませんでした. 起動には設定ファイルが必要です. 詳しくは公式サイトをご覧ください: https://damare.m86.work/')
log.error(error);
process.exit(1);
}
if (!config.voiceclient) {
log.warn("⚠️ 設定ファイルにvoiceclientが設定されていません. デフォルト設定のSoftalkを使用します.")
useVoiceClient = 1;
} else {
useVoiceClient = config.voiceclient;
}
if (useVoiceClient == 1) {
voiceClient = new Softalk(log);
} else if (useVoiceClient == 2) {
voiceClient = new OpenJtalk(log);
}
log.debug('✅ 設定ファイルを読み込みました')
const client = new Discord.Client();
let connection = null;
let readMessages = [];
let canReadMessage = true;
let readChannel = null;
let dispatcher;
let prefix = config.prefix;
client.on('ready', () => {
log.info('✨ Discordログイン完了!あなたのお名前:' + client.user.tag);
});
client.on('message', async message => {
if (!message.guild) return;
if (message.guild.id != config.useguild) return;
if (message.content === `${prefix}talk`) {
if (message.member.voice.channel) {
readChannel = message.channel.id
connection = await message.member.voice.channel.join();
message.reply('✨ VCに接続しました!');
log.info(`💫 ボイスチャンネルに接続しました!チャンネル名: ${message.member.voice.channel.name}`);
log.debug(`ℹ️ 接続先チャンネル: ${message.member.voice.channel.name}, 実行ユーザ: ${message.author.tag}`)
} else {
message.reply('⚠️ まずはボイスチャンネルに接続してください!');
log.debug(`🚫 ユーザーがVCにいないため、接続できませんでした. 実行ユーザ: ${message.author.tag}`);
}
}
if (message.content === `${prefix}stop`) {
if (connection === null) {
message.reply('⚠️ ボイスチャンネルに接続されていないので、切断ができませんでした。');
} else {
connection.disconnect();
connection = null;
readChannel = null;
message.reply('👍 無事切断できました')
log.info(`🛠️ VCから切断しました. 実行ユーザ: ${message.author.tag}`);
}
}
if (message.content === `${prefix}reset`) {
readMessages = [];
canReadMessage = true;
message.reply('💥 読み上げ状態をリセットしました');
}
if (message.content === `${prefix}skip` || message.content === `${prefix}damare`) {
dispatcher.end();
message.react('🤫');
log.debug(`ℹ️ ユーザーがスキップしました. 実行ユーザ: ${message.author.tag}`);
}
if (message.content === `${prefix}help`) {
message.reply('```\n'+
'Damare 読み上げBot コマンドリスト\n' +
'Author:巳波みなと Version:v' + packageJson.version + '\n' +
'https://github.com/Chipsnet/damare\n\n' +
`${prefix}talk : 現在のテキストチャンネルを現在入っているVCで読み上げます。\n` +
`${prefix}stop : 再生を停止してVCから切断します。\n` +
`${prefix}reset : 読み上げ状態や内部のキューをリセットします。問題が発生した場合にのみ使用してください。\n` +
`${prefix}help : ヘルプを表示します。\n` +
`${prefix}skip: 読み上げをスキップします。\n` +
'```'
);
}
if (message.channel.id === readChannel && message.content != `${prefix}talk` && message.author.bot == false && message.content.startsWith(prefix) == false) {
if (canReadMessage) {
log.debug(`ℹ️ テキストを受信しました. canReadMessage: ${canReadMessage}`)
readMessages.push(message.content);
createVoice();
} else {
log.debug(`ℹ️ テキストを受信しました. canReadMessage: ${canReadMessage}`)
readMessages.push(message.content);
}
}
});
client.on("voiceStateUpdate", () => {
if (connection === null) return;
if (connection.channel.members.size <= 1) {
connection.disconnect();
connection = null;
readChannel = null;
log.info("🛠️ 誰もいなくなったため, VCから切断しました.")
}
})
function replaceString(mes) {
mes = mes.replace(/<.*?>/g, "")
mes = mes.replace(/:.*?:/g, "")
mes = mes.replace(/\|\|.*?\|\|/g, "伏せ字")
mes = mes.replace(/(https?:\/\/[\x21-\x7e]+)/g, "ゆーあーるえる")
mes = mes.split('|').join('')
mes = mes.split(';').join('')
mes = mes.split('&').join('')
mes = mes.split('-').join('')
mes = mes.split('\\').join('')
mes = mes.split('/').join('')
mes = mes.split(':').join('')
mes = mes.split('<').join('')
mes = mes.split('>').join('')
mes = mes.split('$').join('')
mes = mes.split('*').join('')
mes = mes.split('?').join('')
mes = mes.split('{').join('')
mes = mes.split('}').join('')
mes = mes.split('[').join('')
mes = mes.split(']').join('')
mes = mes.split('!').join('')
mes = mes.split('`').join('')
return mes;
}
function nextMessage() {
if (!readMessages.length) {
canReadMessage = true;
log.debug(`ℹ️ 再生終了によりcanReadMessageが ${canReadMessage} に設定されました`);
} else {
createVoice();
}
}
async function createVoice() {
canReadMessage = false;
log.debug(`ℹ️ 音声生成を開始するためcanReadMessageが ${canReadMessage} に設定されました`);
let mes = readMessages.shift();
log.debug("ℹ️ キューにあるメッセージ:", readMessages)
log.debug(`📝 変換前のテキスト: ${mes}`);
mes = replaceString(mes);
if (mes === "") {
log.debug("ℹ️ 読み上げるテキストが空なので、読み上げをスキップします")
nextMessage();
return;
}
try {
await voiceClient.createVoice(mes)
} catch (error) {
log.error("🚫 音声の生成中にエラーが発生しました", error)
nextMessage();
return;
}
playVoice();
}
function playVoice() {
log.debug('📢 再生処理を開始しします');
dispatcher = connection.play('./voice.wav', { volume: 1 });
dispatcher.on('finish', () => {
setTimeout(() => {
log.debug("✅ 再生が完了しました")
fs.unlinkSync('./voice.wav');
nextMessage();
}, 1000)
})
}
client.login(config.token);
log.info('🚀 Discordにログインを試みています...');