Untitled
unknown
javascript
2 years ago
19 kB
17
Indexable
const Discord = require('discord.js');
const fs = require('fs');
const axios = require('axios');
const { Manager } = require("erela.js");
const Spotify = require("erela.js-spotify");
const Facebook = require("erela.js-facebook");
const Deezer = require("erela.js-deezer");
const AppleMusic = require("erela.js-apple");
// Discord client
const client = new Discord.Client({
allowedMentions: {
parse: [
'users',
'roles'
],
repliedUser: true
},
autoReconnect: true,
disabledEvents: [
"TYPING_START"
],
partials: [
Discord.Partials.Channel,
Discord.Partials.GuildMember,
Discord.Partials.Message,
Discord.Partials.Reaction,
Discord.Partials.User,
Discord.Partials.GuildScheduledEvent
],
intents: [
Discord.GatewayIntentBits.Guilds,
Discord.GatewayIntentBits.GuildMembers,
Discord.GatewayIntentBits.GuildBans,
Discord.GatewayIntentBits.GuildEmojisAndStickers,
Discord.GatewayIntentBits.GuildIntegrations,
Discord.GatewayIntentBits.GuildWebhooks,
Discord.GatewayIntentBits.GuildInvites,
Discord.GatewayIntentBits.GuildVoiceStates,
Discord.GatewayIntentBits.GuildMessages,
Discord.GatewayIntentBits.GuildMessageReactions,
Discord.GatewayIntentBits.GuildMessageTyping,
Discord.GatewayIntentBits.DirectMessages,
Discord.GatewayIntentBits.DirectMessageReactions,
Discord.GatewayIntentBits.DirectMessageTyping,
Discord.GatewayIntentBits.GuildScheduledEvents,
Discord.GatewayIntentBits.MessageContent
],
restTimeOffset: 0
});
const clientID = process.env.SPOTIFY_CLIENT_ID;
const clientSecret = process.env.SPOTIFY_CLIENT_SECRET;
if (clientID && clientSecret) {
// Lavalink client
client.player = new Manager({
plugins: [
new AppleMusic(),
new Deezer(),
new Facebook(),
new Spotify({
clientID,
clientSecret,
})
],
nodes: [
{
host: 'lava.link',
port: 80,
password: 'youshallnotpass',
secure: false
},
{
host: process.env.LAVALINK_HOST,
port: parseInt(process.env.LAVALINK_PORT),
password: process.env.LAVALINK_PASSWORD,
secure: Boolean(process.env.LAVALINK_SECURE)
},
],
send(id, payload) {
const guild = client.guilds.cache.get(id);
if (guild) guild.shard.send(payload);
},
})
} else {
// Lavalink client
client.player = new Manager({
plugins: [
new AppleMusic(),
new Deezer(),
new Facebook(),
new Spotify({
clientID,
clientSecret,
})
],
nodes: [
{
host: 'lava.link',
port: 80,
password: 'youshallnotpass',
secure: false
},
{
host: process.env.LAVALINK_HOST,
port: parseInt(process.env.LAVALINK_PORT),
password: process.env.LAVALINK_PASSWORD,
secure: Boolean(process.env.LAVALINK_SECURE)
},
],
send(id, payload) {
const guild = client.guilds.cache.get(id);
if (guild) guild.shard.send(payload);
}
})
}
const events = fs.readdirSync(`./src/events/music`).filter(files => files.endsWith('.js'));
for (const file of events) {
const event = require(`./events/music/${file}`);
client.player.on(file.split(".")[0], event.bind(null, client)).setMaxListeners(0);
};
// Connect to database
require("./database/connect")();
// Client settings
client.config = require('./config/bot');
client.changelogs = require('./config/changelogs');
client.emotes = require("./config/emojis.json");
client.webhooks = require("./config/webhooks.json");
const webHooksArray = ['startLogs', 'shardLogs', 'errorLogs', 'dmLogs', 'voiceLogs', 'serverLogs', 'serverLogs2', 'commandLogs', 'consoleLogs', 'warnLogs', 'voiceErrorLogs', 'creditLogs', 'evalLogs', 'interactionLogs'];
// Check if .env webhook_id and webhook_token are set
if (process.env.WEBHOOK_ID && process.env.WEBHOOK_TOKEN) {
for (const webhookName of webHooksArray) {
client.webhooks[webhookName].id = process.env.WEBHOOK_ID;
client.webhooks[webhookName].token = process.env.WEBHOOK_TOKEN;
}
}
client.commands = new Discord.Collection();
client.playerManager = new Map();
client.triviaManager = new Map();
client.queue = new Map();
// Webhooks
const consoleLogs = new Discord.WebhookClient({
id: client.webhooks.consoleLogs.id,
token: client.webhooks.consoleLogs.token,
});
const warnLogs = new Discord.WebhookClient({
id: client.webhooks.warnLogs.id,
token: client.webhooks.warnLogs.token,
});
// Load handlers
fs.readdirSync('./src/handlers').forEach((dir) => {
fs.readdirSync(`./src/handlers/${dir}`).forEach((handler) => {
require(`./handlers/${dir}/${handler}`)(client);
});
});
client.login(process.env.DISCORD_TOKEN);
process.on('unhandledRejection', error => {
console.error('Unhandled promise rejection:', error);
if (error) if (error.length > 950) error = error.slice(0, 950) + '... schau in die Konsole für Details';
if (error.stack) if (error.stack.length > 950) error.stack = error.stack.slice(0, 950) + '... schau in die Konsole für Details';
if(!error.stack) return
const embed = new Discord.EmbedBuilder()
.setTitle(`🚨・Unhandled promise rejection`)
.addFields([
{
name: "Error",
value: error ? Discord.codeBlock(error) : "Kein Error",
},
{
name: "Stack error",
value: error.stack ? Discord.codeBlock(error.stack) : "Kein stack error",
}
])
.setColor(client.config.colors.normal)
consoleLogs.send({
username: 'Felobot',
embeds: [embed],
}).catch(() => {
console.log('Error sending unhandledRejection to webhook')
})
});
process.on('warning', warn => {
console.warn("Warnung:", warn);
const embed = new Discord.EmbedBuilder()
.setTitle(`🚨・Neue Warnung gefunden`)
.addFields([
{
name: `Warnung`,
value: `\`\`\`${warn}\`\`\``,
},
])
.setColor(client.config.colors.normal)
warnLogs.send({
username: 'Felobot',
embeds: [embed],
}).catch(() => {
console.log('Fehler beim senden der Warnung zum Webhook!')
console.log(warn)
})
});
client.on(Discord.ShardEvents.Error, error => {
console.log(error)
if (error) if (error.length > 950) error = error.slice(0, 950) + '... schau in die Konsole für Details';
if (error.stack) if (error.stack.length > 950) error.stack = error.stack.slice(0, 950) + '... schau in die Konsole für Details';
if (!error.stack) return
const embed = new Discord.EmbedBuilder()
.setTitle(`🚨・A websocket connection encountered an error`)
.addFields([
{
name: `Error`,
value: `\`\`\`${error}\`\`\``,
},
{
name: `Stack error`,
value: `\`\`\`${error.stack}\`\`\``,
}
])
.setColor(client.config.colors.normal)
consoleLogs.send({
username: 'Felobot',
embeds: [embed],
});
});
//DM-Chat
client.on('messageCreate', async message => {
if (message.channel.type === Discord.ChannelType.DM) {
if (message.author.bot) return;
await message.channel.sendTyping();
let input = {
method: 'GET',
url: "https://google-bard1.p.rapidapi.com/",
headers: {
text: message.content,
lang: 'de',
psid: 'REDACTED.',
'X-RapidAPI-Key': 'REDACTED',
'X-RapidAPI-Host': 'google-bard1.p.rapidapi.com',
}
};
try {
const output = await axios.request(input);
const response = output.data.response;
if (response.length > 2000) {
const chunks = response.match(/.{1,2000}/g)
for (let i = 0; i < chunks.length; i++) {
await message.author.send(chunks[i]).catch(err => {
message.author.send("Ein Fehler mit Felo.AI ist aufgetreten! Bitte versuche es erneut!").catch(err => {});
});
}
} else {
await message.author.send(response).catch(err => {
message.author.send("Ein Fehler mit Felo.AI ist aufgetreten! Bitte versuche es erneut!").catch(err => {});
});
}
} catch (e) {
console.log(e);
message.author.send("Ein Fehler mit Felo.AI ist aufgetreten! Bitte versuche es erneut!").catch(err => {});
}
} else {
return;
}
});
client.on('messageCreate', async (message) => {
if (message.author.bot || !message.content.startsWith('.p')) return;
const args = message.content.slice(3).trim().split(' ');
const command = args.shift().toLowerCase();
if (!message.member.voice.channel) {
return client.errNormal({
error: `You're not in a voice channel!`,
type: 'reply'
}, message);
}
const channel = message.member.voice.channel;
let player = client.player.players.get(message.guild.id);
if (player && (channel.id !== player?.voiceChannel)) {
return client.errNormal({
error: `You are not in the same voice channel!`,
type: 'reply'
}, message);
}
if (!player) {
player = client.player.create({
guild: message.guild.id,
voiceChannel: channel.id,
textChannel: message.channel.id,
selfDeafen: true
});
if (!channel.joinable) {
return client.errNormal({
error: `That channel isn't joinable`,
type: 'reply'
}, message);
}
player.connect();
setTimeout(() => {
if (channel.type == Discord.ChannelType.GuildStageVoice) {
message.guild.members.me.voice.setSuppressed(false);
}
}, 500);
}
player = client.player.players.get(message.guild.id);
if (player.state !== "CONNECTED") player.connect();
const query = args.join(' ');
client.simpleEmbed({
desc: `🔎┆Searching...`,
type: 'reply'
}, message);
const res = await player.search(command);
if (res.loadType === 'LOAD_FAILED') {
if (!player.queue.current) player.destroy();
return client.errNormal({
error: `Error getting music. Please try again in a few minutes`,
type: 'reply'
}, message);
}
console.log(res);
switch (res.loadType) {
case 'NO_MATCHES': {
if (!player.queue.current) player.destroy();
await client.errNormal({
error: `No music was found`,
type: 'reply'
}, message);
break;
}
case 'TRACK_LOADED': {
const track = res.tracks[0];
await player.queue.add(track);
if (!player.playing && !player.paused) {
player.play();
} else {
client.embed({
title: `${client.emotes.normal.music}・${track.title}`,
url: track.uri,
desc: `The song has been added to the queue!`,
thumbnail: track.thumbnail,
fields: [
{
name: `👤┆Requested By`,
value: `${track.requester}`,
inline: true
},
{
name: `${client.emotes.normal.clock}┆Ends at`,
value: `<t:${((Date.now() / 1000) + (track.duration / 1000)).toFixed(0)}:f>`,
inline: true
},
{
name: `🎬┆Author`,
value: `${track.author}`,
inline: true
}
],
type: 'reply'
}, message);
}
break;
}
case 'PLAYLIST_LOADED': {
await player.queue.add(res.tracks);
if (!player.playing && !player.paused) player.play();
else {
// Hier kannst du Code hinzufügen, wenn die Wiedergabe bereits läuft
}
break;
}
case 'SEARCH_RESULT': {
let max = 5;
let collected;
let filter = (i) => i.user.id === message.author.id;
if (res.tracks.length < max) max = res.tracks.length;
let row = new Discord.ActionRowBuilder()
.addComponents(
new Discord.ButtonBuilder()
.setEmoji("1️⃣")
.setCustomId("1")
.setStyle(Discord.ButtonStyle.Secondary),
new Discord.ButtonBuilder()
.setEmoji("2️⃣")
.setCustomId("2")
.setStyle(Discord.ButtonStyle.Secondary),
new Discord.ButtonBuilder()
.setEmoji("3️⃣")
.setCustomId("3")
.setStyle(Discord.ButtonStyle.Secondary),
new Discord.ButtonBuilder()
.setEmoji("4️⃣")
.setCustomId("4")
.setStyle(Discord.ButtonStyle.Secondary),
new Discord.ButtonBuilder()
.setEmoji("5️⃣")
.setCustomId("5")
.setStyle(Discord.ButtonStyle.Secondary),
);
let row2 = new Discord.ActionRowBuilder()
.addComponents(
new Discord.ButtonBuilder()
.setEmoji("🛑")
.setLabel("Cancel")
.setCustomId("cancel")
.setStyle(Discord.ButtonStyle.Danger),
);
const results = res.tracks
.slice(0, max)
.map((track, index) => `**[#${++index}]**┆${track.title.length >= 45 ? `${track.title.slice(0, 45)}...` : track.title}`)
.join('\n');
client.embed({
title: `🔍・Search Results`,
desc: results,
fields: [
{
name: `❓┆Cancel search?`,
value: `Press \`cancel\` to stop the search`,
inline: true
}
],
components: [row, row2],
type: 'reply'
}, message);
try {
let i = await message.awaitMessageComponent({ filter, max: 1, time: 30e3, componentType: Discord.ComponentType.Button, errors: ['time'] });
} catch (e) {
if (!player.queue.current) player.destroy();
row.components.forEach((button) => button.setDisabled(true));
row2.components.forEach((button) => button.setDisabled(true));
return client.errNormal({
error: `You didn't provide a selection`,
type: 'reply',
components: [row, row2]
}, message);
}
const first = i.customId;
i.message.delete();
i.deferUpdate();
if (first.toLowerCase() === 'cancel') {
if (!player.queue.current) player.destroy();
return message.channel.send('Cancelled selection.');
}
const index = Number(first) - 1;
if (index < 0 || index > max - 1) return client.errNormal({
error: `The number you provided is too small or too big (1-${max})`,
type: 'reply'
}, message);
const track = res.tracks[index];
player.queue.add(track);
if (!player.playing && !player.paused) {
player.play();
} else {
client.embed({
title: `${client.emotes.normal.music}・${track.title}`,
url: track.uri,
desc: `The song has been added to the queue!`,
thumbnail: track.thumbnail,
fields: [
{
name: `👤┆Requested By`,
value: `${track.requester}`,
inline: true
},
{
name: `${client.emotes.normal.clock}┆Ends at`,
value: `<t:${((Date.now() / 1000) + (track.duration / 1000)).toFixed(0)}:f>`,
inline: true
},
{
name: `🎬┆Author`,
value: `${track.author}`,
inline: true
}
],
type: 'reply'
}, message);
}
}
}
});
Editor is loading...