110 lines
4.0 KiB
JavaScript
110 lines
4.0 KiB
JavaScript
const ffmpeg = require('ffmpeg-static');
|
|
process.env.FFMPEG_PATH = ffmpeg;
|
|
const { Client, GatewayIntentBits, SlashCommandBuilder, Routes, ActivityType } = require('discord.js');
|
|
const { joinVoiceChannel, createAudioPlayer, createAudioResource, getVoiceConnection, VoiceConnectionStatus, StreamType } = require('@discordjs/voice');
|
|
const { REST } = require('@discordjs/rest');
|
|
const { join } = require('path');
|
|
const fs = require('fs');
|
|
|
|
// Load Config
|
|
const config = JSON.parse(fs.readFileSync(join(__dirname, 'data/config.json'), 'utf8'));
|
|
const token = config.discord_token;
|
|
|
|
const client = new Client({
|
|
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildVoiceStates]
|
|
});
|
|
|
|
const player = createAudioPlayer();
|
|
|
|
player.on('error', error => {
|
|
console.error('Error Audio:', error);
|
|
});
|
|
|
|
client.on('ready', async () => {
|
|
console.log(`Bot logged in as ${client.user.tag}`);
|
|
|
|
// Set Status Online dan Aktivitas
|
|
client.user.setPresence({
|
|
activities: [{ name: 'Lilis', type: ActivityType.Watching }],
|
|
status: 'online',
|
|
});
|
|
|
|
// Register Commands
|
|
const commands = [
|
|
new SlashCommandBuilder().setName('join').setDescription('Bot masuk ke Voice Channel'),
|
|
new SlashCommandBuilder().setName('testsahur').setDescription('Test audio sahur')
|
|
].map(cmd => cmd.toJSON());
|
|
|
|
const rest = new REST({ version: '10' }).setToken(token);
|
|
try {
|
|
await rest.put(Routes.applicationCommands(client.user.id), { body: commands });
|
|
console.log('Slash commands registered.');
|
|
} catch (err) {
|
|
console.error('Failed to register commands:', err);
|
|
}
|
|
});
|
|
|
|
client.on('interactionCreate', async interaction => {
|
|
if (!interaction.isChatInputCommand()) return;
|
|
|
|
if (interaction.commandName === 'join') {
|
|
await interaction.deferReply(); // Baris PERTAMA
|
|
console.log('Command dijalankan... /join');
|
|
|
|
const channel = interaction.member.voice.channel;
|
|
if (!channel) return interaction.editReply('Masuk ke Voice Channel dulu!');
|
|
|
|
// Clean Connection Logic: Cek koneksi yang sudah ada
|
|
let connection = getVoiceConnection(interaction.guildId);
|
|
if (!connection) {
|
|
connection = joinVoiceChannel({
|
|
channelId: channel.id,
|
|
guildId: interaction.guildId,
|
|
adapterCreator: interaction.guild.voiceAdapterCreator,
|
|
selfDeaf: false,
|
|
selfMute: false
|
|
});
|
|
|
|
// Subscribe player immediately
|
|
connection.subscribe(player);
|
|
|
|
// 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.');
|
|
}
|
|
}
|
|
|
|
if (interaction.commandName === 'testsahur') {
|
|
await interaction.deferReply(); // Baris PERTAMA
|
|
console.log('Command dijalankan... /testsahur');
|
|
|
|
const connection = getVoiceConnection(interaction.guildId);
|
|
if (!connection) return interaction.editReply('Bot belum join! Gunakan /join dulu.');
|
|
|
|
try {
|
|
// Audio Fix as requested with Volume Booster
|
|
const resource = createAudioResource(join(__dirname, 'assets', 'audio', 'sahur.mp3'), {
|
|
inputType: StreamType.Arbitrary,
|
|
inlineVolume: true
|
|
});
|
|
resource.volume.setVolume(1.0);
|
|
|
|
connection.subscribe(player);
|
|
player.play(resource);
|
|
|
|
// 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/');
|
|
}
|
|
}
|
|
});
|
|
|
|
client.login(token);
|