mirror of
https://github.com/aydenjahola/discord-multipurpose-bot.git
synced 2025-02-28 11:56:24 +00:00
This commit is contained in:
parent
0ddaf4caea
commit
fed3903db8
4 changed files with 119 additions and 0 deletions
71
commands/ai/chat.js
Normal file
71
commands/ai/chat.js
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
const { SlashCommandBuilder } = require("discord.js");
|
||||||
|
const { getAIResponse } = require("../../utils/aiAPI");
|
||||||
|
const QuotaUsage = require("../../models/QuotaUsage");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
data: new SlashCommandBuilder()
|
||||||
|
.setName("chat")
|
||||||
|
.setDescription("Chat with AI")
|
||||||
|
.addStringOption((option) =>
|
||||||
|
option
|
||||||
|
.setName("message")
|
||||||
|
.setDescription("Your message to the AI")
|
||||||
|
.setRequired(true)
|
||||||
|
),
|
||||||
|
async execute(interaction) {
|
||||||
|
await interaction.deferReply(); // Defer initial response
|
||||||
|
|
||||||
|
try {
|
||||||
|
const guildId = interaction.guild.id;
|
||||||
|
const input = interaction.options.getString("message");
|
||||||
|
const currentMonthYear = new Date().toISOString().slice(0, 7);
|
||||||
|
|
||||||
|
// Check quota first
|
||||||
|
let quotaUsage = await QuotaUsage.findOne({
|
||||||
|
guildId,
|
||||||
|
monthYear: currentMonthYear,
|
||||||
|
});
|
||||||
|
if (!quotaUsage) {
|
||||||
|
quotaUsage = new QuotaUsage({ guildId, monthYear: currentMonthYear });
|
||||||
|
await quotaUsage.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quotaUsage.quotaUsed >= quotaUsage.quotaLimit) {
|
||||||
|
return await interaction.editReply(
|
||||||
|
"❌ This server has reached its monthly usage limit."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update quota after successful check
|
||||||
|
quotaUsage.quotaUsed += 1;
|
||||||
|
await quotaUsage.save();
|
||||||
|
|
||||||
|
// Get AI response with retry logic
|
||||||
|
const model_name = "facebook/blenderbot-3B";
|
||||||
|
let aiResponse = null;
|
||||||
|
let attempts = 0;
|
||||||
|
|
||||||
|
while (!aiResponse && attempts < 3) {
|
||||||
|
attempts++;
|
||||||
|
aiResponse = await getAIResponse(model_name, input);
|
||||||
|
|
||||||
|
if (!aiResponse) {
|
||||||
|
await interaction.editReply(`⏳ AI is waking up...`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aiResponse) {
|
||||||
|
await interaction.editReply(aiResponse.generated_text);
|
||||||
|
} else {
|
||||||
|
await interaction.editReply(
|
||||||
|
"❌ Failed to get response after 3 attempts. Please try again later."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Command Error:", error);
|
||||||
|
await interaction.editReply(
|
||||||
|
"⚠️ An error occurred. Please try again later."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
14
models/QuotaUsage.js
Normal file
14
models/QuotaUsage.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
const mongoose = require("mongoose");
|
||||||
|
|
||||||
|
const quotaUsageSchema = new mongoose.Schema({
|
||||||
|
guildId: { type: String, required: true, unique: true },
|
||||||
|
monthYear: {
|
||||||
|
type: String,
|
||||||
|
default: () => new Date().toISOString().substr(0, 7),
|
||||||
|
},
|
||||||
|
quotaUsed: { type: Number, default: 0 },
|
||||||
|
quotaLimit: { type: Number, default: 100 }, // Set your desired limit
|
||||||
|
});
|
||||||
|
|
||||||
|
const QuotaUsage = mongoose.model("QuotaUsage", quotaUsageSchema);
|
||||||
|
module.exports = QuotaUsage;
|
|
@ -19,6 +19,7 @@
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"mongoose": "^8.6.0",
|
"mongoose": "^8.6.0",
|
||||||
"nodemailer": "^6.9.14",
|
"nodemailer": "^6.9.14",
|
||||||
|
"openai": "^4.85.4",
|
||||||
"owoify-js": "^2.0.0",
|
"owoify-js": "^2.0.0",
|
||||||
"puppeteer": "^23.4.1",
|
"puppeteer": "^23.4.1",
|
||||||
"rcon-client": "^4.2.5",
|
"rcon-client": "^4.2.5",
|
||||||
|
|
33
utils/aiAPI.js
Normal file
33
utils/aiAPI.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
const axios = require("axios");
|
||||||
|
const API_KEY = process.env.HUGGING_FACE_API_KEY;
|
||||||
|
|
||||||
|
const getAIResponse = async (model_name, input) => {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(
|
||||||
|
`https://api-inference.huggingface.co/models/${model_name}`,
|
||||||
|
{ inputs: input, parameters: { max_length: 100 } },
|
||||||
|
{
|
||||||
|
headers: { Authorization: `Bearer ${API_KEY}` },
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle model loading state
|
||||||
|
if (response.data.error?.includes("loading")) {
|
||||||
|
console.log(`Model ${model_name} is loading, retrying...`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.data[0] || null;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("API Error:", error.message);
|
||||||
|
|
||||||
|
// Handle specific error cases
|
||||||
|
if (error.response?.data?.error) {
|
||||||
|
console.log("HF API Error:", error.response.data.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { getAIResponse };
|
Loading…
Reference in a new issue