38481-vm/index.js
Flatlogic Bot b1733995d3 V1
2026-02-16 16:06:28 +00:00

110 lines
3.3 KiB
JavaScript

process.env.FFMPEG_PATH = require('ffmpeg-static');
const { Client, GatewayIntentBits, SlashCommandBuilder, Routes } = require('discord.js');
const { joinVoiceChannel, createAudioPlayer, createAudioResource, AudioPlayerStatus, VoiceConnectionStatus, entersState } = require('@discordjs/voice');
const { REST } = require('@discordjs/rest');
const fs = require('fs');
const path = require('path');
const configPath = path.join(__dirname, 'data/config.json');
function loadConfig() {
if (fs.existsSync(configPath)) {
return JSON.parse(fs.readFileSync(configPath, 'utf8'));
}
return {};
}
const config = loadConfig();
const token = config.discord_token;
const guildId = config.guild_id;
if (!token) {
console.error('No Discord Token found in data/config.json');
process.exit(1);
}
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildVoiceStates,
]
});
const player = createAudioPlayer();
client.on('ready', async () => {
console.log(`Logged in as ${client.user.tag}`);
// Register commands
const commands = [
new SlashCommandBuilder()
.setName('testsahur')
.setDescription('Memutar file audio sahur')
].map(command => command.toJSON());
const rest = new REST({ version: '10' }).setToken(token);
try {
await rest.put(Routes.applicationCommands(client.user.id), { body: commands });
console.log('Successfully registered application commands.');
} catch (error) {
console.error(error);
}
// Auto-reconnect to last voice channel
const lastVoice = config.last_voice_channel;
if (lastVoice && lastVoice.guildId && lastVoice.channelId) {
joinVC(lastVoice.guildId, lastVoice.channelId);
}
});
function joinVC(gId, cId) {
const connection = joinVoiceChannel({
channelId: cId,
guildId: gId,
adapterCreator: client.guilds.cache.get(gId).voiceAdapterCreator,
selfDeaf: false,
});
connection.on(VoiceConnectionStatus.Disconnected, async () => {
try {
await Promise.race([
entersState(connection, VoiceConnectionStatus.Signalling, 5_000),
entersState(connection, VoiceConnectionStatus.Connecting, 5_000),
]);
} catch (error) {
console.log('Connection lost, attempting to reconnect...');
setTimeout(() => joinVC(gId, cId), 5000);
}
});
connection.subscribe(player);
}
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'testsahur') {
const member = interaction.member;
if (!member.voice.channel) {
return interaction.reply('Kamu harus berada di Voice Channel!');
}
const channel = member.voice.channel;
const gId = interaction.guildId;
const cId = channel.id;
// Save last channel
config.last_voice_channel = { guildId: gId, channelId: cId };
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
joinVC(gId, cId);
const resource = createAudioResource(path.join(__dirname, 'assets/audio/sahur.mp3'));
player.play(resource);
await interaction.reply('🔊 Memutar audio Sahur!');
}
});
client.login(token);