177 lines
5.4 KiB
JavaScript
177 lines
5.4 KiB
JavaScript
|
const {Client, GatewayIntentBits, EmbedBuilder} = require('discord.js');
|
||
|
const axios = require('axios');
|
||
|
const he = require('he');
|
||
|
const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args));
|
||
|
const { userResetMessages } = require('./assets/messages.js');
|
||
|
|
||
|
const cheerio = require('cheerio');
|
||
|
|
||
|
require('dotenv').config();
|
||
|
|
||
|
const channelIDs = process.env.CHANNEL_IDS.split(',');
|
||
|
|
||
|
const client = new Client({
|
||
|
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent]
|
||
|
});
|
||
|
|
||
|
const MAX_CONTENT_LENGTH = process.env.MAX_CONTENT_LENGTH || 8000;
|
||
|
|
||
|
|
||
|
client.on('ready', () => {
|
||
|
console.log(`Logged in as ${client.user.tag}!`);
|
||
|
});
|
||
|
|
||
|
client.on('messageCreate', async message => {
|
||
|
// Function to send a random message from any array
|
||
|
async function sendRand(array) {
|
||
|
const arrayChoice = array[Math.floor(Math.random() * array.length)];
|
||
|
await message.channel.send(arrayChoice); // give a notification of reset using a human-like response.
|
||
|
}
|
||
|
|
||
|
if (message.author.bot) return;
|
||
|
|
||
|
// Only respond in the specified channels
|
||
|
if (!channelIDs.includes(message.channel.id)) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const content = message.content.trim();
|
||
|
let additionalContent = '';
|
||
|
|
||
|
if (content === '!r' || content === '!reset') {
|
||
|
|
||
|
// Handle conversation reset
|
||
|
return await sendRand(userResetMessages)
|
||
|
}
|
||
|
if (content === '!restartCore') {
|
||
|
// Handle core restart
|
||
|
return await restartCore(message);
|
||
|
}
|
||
|
|
||
|
await handleUserMessage(message, content, additionalContent);
|
||
|
});
|
||
|
|
||
|
|
||
|
async function handleUserMessage(message, content, additionalContent) {
|
||
|
const encodedMessage = he.encode(content + additionalContent);
|
||
|
|
||
|
// Start typing indicator
|
||
|
const typingInterval = setInterval(() => {
|
||
|
message.channel.sendTyping();
|
||
|
}, 9000);
|
||
|
message.channel.sendTyping(); // Initial typing indicator
|
||
|
|
||
|
try {
|
||
|
const response = await axios.post(`http://${process.env.ROOT_IP}:${process.env.ROOT_PORT}/api/v1/chat`, {
|
||
|
message: encodedMessage,
|
||
|
max_tokens: Number(process.env.MAX_TOKENS),
|
||
|
repeat_penalty: Number(process.env.REPEAT_PENALTY)
|
||
|
}, {
|
||
|
headers: {
|
||
|
'Content-Type': 'application/json',
|
||
|
'x-forwarded-for-id': message.author.id,
|
||
|
'x-forwarded-for-name': message.author.username,
|
||
|
'x-forwarded-for-guild': message.guild.name
|
||
|
}
|
||
|
});
|
||
|
|
||
|
clearInterval(typingInterval); // Stop typing indicator
|
||
|
const data = response.data;
|
||
|
await sendLongMessage(message, data.content);
|
||
|
} catch (error) {
|
||
|
clearInterval(typingInterval); // Stop typing indicator
|
||
|
if (error.response && error.response.status === 429) {
|
||
|
try {
|
||
|
await message.author.send('I am currently busy. Please try again later.');
|
||
|
} catch (dmError) {
|
||
|
console.error('Failed to send DM:', dmError);
|
||
|
message.reply('I am currently busy. Please try again later.');
|
||
|
}
|
||
|
} else {
|
||
|
message.reply('Error: ' + error.message);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
async function resetConversation(message) {
|
||
|
try {
|
||
|
const response = await axios.post(
|
||
|
`${process.env.API_PATH}/reset-conversation`, {}, {
|
||
|
headers: {
|
||
|
'x-forwarded-for-id': message.author.id,
|
||
|
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
console.log(response.status)
|
||
|
if (response.status === 200) {
|
||
|
return await sendRand(userResetMessages);
|
||
|
|
||
|
} else {
|
||
|
message.reply('Error clearing message history.');
|
||
|
}
|
||
|
} catch (error) {
|
||
|
message.reply('Error clearing message history.');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function restartCore(message) {
|
||
|
try {
|
||
|
const response = await axios.post(`${process.env.API_PATH}/restart-core`);
|
||
|
if (response.status === 200) {
|
||
|
message.reply('The core server was restarted.');
|
||
|
} else {
|
||
|
message.reply('Error restarting the core.');
|
||
|
}
|
||
|
} catch (error) {
|
||
|
message.reply('Error restarting the core.');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function sendLongMessage(message, responseText) {
|
||
|
const limit = 8096;
|
||
|
|
||
|
if (responseText.length > limit) {
|
||
|
const lines = responseText.split('\n');
|
||
|
const chunks = [];
|
||
|
let currentChunk = '';
|
||
|
|
||
|
for (const line of lines) {
|
||
|
if (currentChunk.length + line.length > limit) {
|
||
|
chunks.push(currentChunk);
|
||
|
currentChunk = '';
|
||
|
}
|
||
|
currentChunk += line + '\n';
|
||
|
}
|
||
|
|
||
|
if (currentChunk.trim() !== '') {
|
||
|
chunks.push(currentChunk.trim());
|
||
|
}
|
||
|
|
||
|
if (chunks.length >= 80) return await message.channel.send("Response chunks too large. Try again");
|
||
|
|
||
|
for (let i = 0; i < chunks.length; i++) {
|
||
|
const chunk = chunks[i];
|
||
|
const embed = new EmbedBuilder()
|
||
|
.setDescription(chunk) // Wraps the chunk in a code block
|
||
|
.setColor("#3498DB")
|
||
|
.setTimestamp();
|
||
|
setTimeout(() => {
|
||
|
message.channel.send({
|
||
|
embeds: [embed]
|
||
|
});
|
||
|
}, i * (process.env.OVERFLOW_DELAY || 3) * 1000);
|
||
|
}
|
||
|
} else {
|
||
|
const embed = new EmbedBuilder()
|
||
|
.setDescription(responseText) // Wraps the response in a code block
|
||
|
.setColor("#3498DB")
|
||
|
.setTimestamp();
|
||
|
message.channel.send({
|
||
|
embeds: [embed]
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
client.login(process.env.THE_TOKEN);
|