This commit is contained in:
Flatlogic Bot 2026-02-16 22:45:34 +00:00
parent fe99f09665
commit 63ba3694d3
5 changed files with 79 additions and 103 deletions

57
bot.log
View File

@ -1,44 +1,19 @@
Bot starting... Bot logged in as AsepXiaoQin#6954
Logged in as AsepXiaoQin#6954 (node:11761) DeprecationWarning: The ready event has been renamed to clientReady to distinguish it from the gateway READY event and will only emit under that name in v15. Please use clientReady instead.
Started refreshing application (/) commands.
(node:8584) DeprecationWarning: The ready event has been renamed to clientReady to distinguish it from the gateway READY event and will only emit under that name in v15. Please use clientReady instead.
(Use `node --trace-deprecation ...` to show where the warning was created) (Use `node --trace-deprecation ...` to show where the warning was created)
Successfully reloaded application (/) commands. Slash commands registered.
Interaction Error: Error: Error: Cannot find module '@discordjs/opus' Command dijalankan... /testsahur
Require stack: Command dijalankan... /join
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/util/loader.js /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:529
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js throw new Error(`No compatible encryption modes. Available include: ${options.join(", ")}`);
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/index.js ^
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/index.js
- /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js Error: No compatible encryption modes. Available include: aead_aes256_gcm_rtpsize, aead_xchacha20_poly1305_rtpsize
- /home/ubuntu/executor/workspace/index.js
Error: Cannot find module 'node-opus'
Require stack:
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/util/loader.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/index.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/index.js
- /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js
- /home/ubuntu/executor/workspace/index.js
Error: Cannot find module 'opusscript'
Require stack:
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/util/loader.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/index.js
- /home/ubuntu/executor/workspace/node_modules/prism-media/src/index.js
- /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js
- /home/ubuntu/executor/workspace/index.js
at Object.loader [as require] (/home/ubuntu/executor/workspace/node_modules/prism-media/src/util/loader.js:12:9)
at loadOpus (/home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js:17:17)
at new OpusStream (/home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js:46:10)
at new Encoder (/home/ubuntu/executor/workspace/node_modules/prism-media/src/opus/Opus.js:149:5)
at Object.transformer (/home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:2224:24)
at /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:2457:58
at Array.map (<anonymous>)
at createAudioResource (/home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:2457:39)
at Client.<anonymous> (/home/ubuntu/executor/workspace/index.js:138:30)
at Client.emit (node:events:518:28)
(node:8584) Warning: Supplying "ephemeral" for interaction response options is deprecated. Utilize flags instead.
Voice Connection Error: Error: No compatible encryption modes. Available include: aead_aes256_gcm_rtpsize, aead_xchacha20_poly1305_rtpsize
at chooseEncryptionMode (/home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:529:11) at chooseEncryptionMode (/home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:529:11)
at /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:721:21 at /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:721:21
Emitted 'error' event on VoiceConnection instance at:
at VoiceConnection.onNetworkingError (/home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:1914:10)
at Networking.emit (node:events:518:28)
at /home/ubuntu/executor/workspace/node_modules/@discordjs/voice/dist/index.js:729:32
Node.js v22.18.0

View File

@ -2,6 +2,6 @@
"discord_token": "MTQ3MTkwOTE5Mzg4Njg1OTI5NA.GCEdpc.jMIxPFsquVAhp88x3dO-yWUFI7e1u1r8oIZTcw", "discord_token": "MTQ3MTkwOTE5Mzg4Njg1OTI5NA.GCEdpc.jMIxPFsquVAhp88x3dO-yWUFI7e1u1r8oIZTcw",
"guild_id": "1428530728706117632", "guild_id": "1428530728706117632",
"voice_channel_id": "1457687430189682781", "voice_channel_id": "1457687430189682781",
"alarm_time": "23:35", "alarm_time": "05:46",
"last_voice_channel": null "last_voice_channel": null
} }

109
index.js
View File

@ -1,95 +1,88 @@
process.env.FFMPEG_PATH = require('ffmpeg-static'); process.env.FFMPEG_PATH = require('ffmpeg-static');
const { Client, GatewayIntentBits, SlashCommandBuilder, Routes } = require('discord.js'); const { Client, GatewayIntentBits, SlashCommandBuilder, Routes } = require('discord.js');
const { joinVoiceChannel, createAudioPlayer, createAudioResource, AudioPlayerStatus } = require('@discordjs/voice'); const { joinVoiceChannel, createAudioPlayer, createAudioResource, getVoiceConnection, VoiceConnectionStatus } = require('@discordjs/voice');
const { REST } = require('@discordjs/rest'); const { REST } = require('@discordjs/rest');
const { join } = require('path');
const fs = require('fs'); const fs = require('fs');
const path = require('path');
// Load Discord Token // Load Config
const configPath = path.join(__dirname, 'data/config.json'); const config = JSON.parse(fs.readFileSync(join(__dirname, 'data/config.json'), 'utf8'));
const config = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf8')) : {};
const token = config.discord_token; const token = config.discord_token;
if (!token) {
console.error('ERROR: discord_token not found in data/config.json');
process.exit(1);
}
const client = new Client({ const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates] intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates]
}); });
const player = createAudioPlayer(); const player = createAudioPlayer();
// Stay 24/7 Logic: Do nothing when idle (prevents automatic leave) client.on('ready', async () => {
player.on(AudioPlayerStatus.Idle, () => { console.log(`Bot logged in as ${client.user.tag}`);
console.log('Audio finished. Bot is staying in the channel (Stay 24/7).');
}); // Register Commands
player.on('error', error => console.error('Audio Player Error:', error));
async function deployCommands(clientId) {
const commands = [ const commands = [
new SlashCommandBuilder().setName('join').setDescription('Bot masuk ke Voice Channel user'), new SlashCommandBuilder().setName('join').setDescription('Bot masuk ke Voice Channel'),
new SlashCommandBuilder().setName('testsahur').setDescription('Memutar file sahur secara instan') new SlashCommandBuilder().setName('testsahur').setDescription('Test audio sahur')
].map(cmd => cmd.toJSON()); ].map(cmd => cmd.toJSON());
const rest = new REST({ version: '10' }).setToken(token); const rest = new REST({ version: '10' }).setToken(token);
try { try {
await rest.put(Routes.applicationCommands(clientId), { body: commands }); await rest.put(Routes.applicationCommands(client.user.id), { body: commands });
console.log('Slash commands deployed successfully.'); console.log('Slash commands registered.');
} catch (err) { } catch (err) {
console.error('Failed to deploy commands:', err); console.error('Failed to register commands:', err);
} }
}
client.on('ready', async () => {
console.log(`Bot logged in as ${client.user.tag}`);
await deployCommands(client.user.id);
}); });
client.on('interactionCreate', async interaction => { client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return; if (!interaction.isChatInputCommand()) return;
// Anti-Timeout logic if (interaction.commandName === 'join') {
if (!interaction.deferred) await interaction.deferReply(); await interaction.deferReply(); // Baris PERTAMA
console.log('Command dijalankan... /join');
const { commandName, member } = interaction; const channel = interaction.member.voice.channel;
if (!channel) return interaction.editReply('Masuk ke Voice Channel dulu!');
if (!member.voice.channel) { // Clean Connection Logic: Cek koneksi yang sudah ada
return interaction.editReply('Silakan masuk ke Voice Channel terlebih dahulu!'); let connection = getVoiceConnection(interaction.guildId);
if (!connection) {
connection = joinVoiceChannel({
channelId: channel.id,
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator,
selfDeaf: false
});
// Stay 24/7: Pastikan bot tidak disconnect
connection.on(VoiceConnectionStatus.Disconnected, () => {
console.log('Bot terputus dari voice channel.');
});
await interaction.editReply('Berhasil join ke Voice Channel dan Standby 24/7!');
} else {
await interaction.editReply('Bot sudah berada di dalam Voice Channel.');
}
} }
try { if (interaction.commandName === 'testsahur') {
const connection = joinVoiceChannel({ await interaction.deferReply(); // Baris PERTAMA
channelId: member.voice.channel.id, console.log('Command dijalankan... /testsahur');
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator,
selfDeaf: false,
selfMute: false,
});
connection.subscribe(player); const connection = getVoiceConnection(interaction.guildId);
if (!connection) return interaction.editReply('Bot belum join! Gunakan /join dulu.');
if (commandName === 'join') { try {
return interaction.editReply('Sudah join! 🎵'); // Audio Fix as requested
} const resource = createAudioResource(join(__dirname, 'assets/audio/sahur.mp3'));
if (commandName === 'testsahur') {
const audioPath = path.join(__dirname, 'assets/audio/sahur.mp3');
if (!fs.existsSync(audioPath)) {
return interaction.editReply('File ./assets/audio/sahur.mp3 tidak ditemukan!');
}
const resource = createAudioResource(audioPath, { inlineVolume: true });
resource.volume.setVolume(1.0); // Max Volume
player.play(resource); player.play(resource);
connection.subscribe(player);
return interaction.editReply('Memutar suara sahur... 🔊'); // Edit Reply as requested
await interaction.editReply('Memutar audio sahur... 🔊');
} catch (error) {
console.error('Error playing audio:', error);
await interaction.editReply('Gagal memutar audio. Pastikan file sahur.mp3 ada di folder assets/audio/');
} }
} catch (error) {
console.error('Error during interaction:', error);
return interaction.editReply('Terjadi kesalahan teknis.');
} }
}); });

9
package-lock.json generated
View File

@ -11,7 +11,8 @@
"@discordjs/voice": "^0.17.0", "@discordjs/voice": "^0.17.0",
"discord.js": "^14.15.3", "discord.js": "^14.15.3",
"ffmpeg-static": "^5.2.0", "ffmpeg-static": "^5.2.0",
"libsodium-wrappers": "^0.7.13" "libsodium-wrappers": "^0.7.16",
"opusscript": "^0.0.8"
} }
}, },
"node_modules/@derhuerst/http-basic": { "node_modules/@derhuerst/http-basic": {
@ -487,6 +488,12 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/opusscript": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz",
"integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==",
"license": "MIT"
},
"node_modules/parse-cache-control": { "node_modules/parse-cache-control": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",

View File

@ -4,9 +4,10 @@
"description": "Discord Alarm Sahur Bot", "description": "Discord Alarm Sahur Bot",
"main": "index.js", "main": "index.js",
"dependencies": { "dependencies": {
"discord.js": "^14.15.3",
"@discordjs/voice": "^0.17.0", "@discordjs/voice": "^0.17.0",
"discord.js": "^14.15.3",
"ffmpeg-static": "^5.2.0", "ffmpeg-static": "^5.2.0",
"libsodium-wrappers": "^0.7.13" "libsodium-wrappers": "^0.7.16",
"opusscript": "^0.0.8"
} }
} }