Compare commits

..

No commits in common. "926d49242198d6bcea4981be1b18961d52ca44be" and "e50061a99c08e44a50c87e13296ea511e86e11a8" have entirely different histories.

7 changed files with 18 additions and 40 deletions

View file

@ -5,6 +5,5 @@ this bot does cool stuff I guess
features:
- ai-powered alt text for images
- booru search (20+ supported boorus)
- online file search (using searxng)
- quote image maker (funny)
- google image search (using searxng)
- and more to come

View file

@ -1,4 +1,4 @@
const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType, AttachmentBuilder, EmbedBuilder, basename } = require("discord.js");
const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType, AttachmentBuilder, EmbedBuilder } = require("discord.js");
const data = new ContextMenuCommandBuilder()
.setName("Describe Image(s)")
@ -21,28 +21,18 @@ module.exports = {
const groq = interaction.client.groq;
const message = interaction.targetMessage;
const attachments = message.attachments;
const images = message.embeds.filter(e => e.data.type == "image").map(e => e.data.url);
const urls = [];
const files = [];
const embeds = [];
if (attachments.length == 0 && images.length == 0) {
await interaction.followUp("Message does not contain any images.");
return;
}
for (const att of attachments) {
const attachment = att[1];
if (!attachment.contentType.startsWith("image/"))
if (!attachment.contentType.startsWith("image/")) {
console.log(attachment.contentType);
continue;
}
const name = attachment.name.substr(0, attachment.name.lastIndexOf("."));
images.push(attachment.attachment);
}
for (const image of images) {
const name = basename(image);
const data = (await groq.chat.completions.create({
const description = (await groq.chat.completions.create({
messages: [{
"role": "user",
"content": [{
@ -51,18 +41,16 @@ module.exports = {
}, {
"type": "image_url",
"image_url": {
"url": image
"url": attachment.attachment
}
}]
}],
"model": "llama-3.2-90b-vision-preview"
}));
const description = data.choices[0].message.content.trim();
"model": "llama-3.2-11b-vision-preview"
})).choices[0].message.content.trim();
if (description.length < 2000) {
const embed = new EmbedBuilder()
.setTitle(name)
.setTitle(attachment.name)
.setDescription(description);
embeds.push(embed);
} else {
@ -74,4 +62,4 @@ module.exports = {
await interaction.followUp({ embeds, files });
},
};
};

View file

@ -22,8 +22,10 @@ module.exports = {
const msg = interaction.targetMessage;
const user = msg.author;
const avatar = `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png?size=1024`;
console.log("Generating quote image");
try {
const data = await createQuoteImage(avatar, user.displayName, msg.content, true, interaction.client.users.cache);
console.log("Sending quote image");
await interaction.followUp({
files: [{

View file

@ -26,17 +26,8 @@ function notEmpty(str) {
return str && str.trim() !== ''
}
/**
* @param {string} str
* @param {number} len
*/
function shorten(str) {
const len = 50;
var urlStart = str.indexOf("://") + 3;
if (urlStart == 2) urlStart = 0;
return str.length <= len ? str : `[${str.slice(urlStart, urlStart + (len - 3))}...](${(str.startsWith("magnet:") ? (`${process.env.BASE_URL}/magnet/${str}`) : str).replaceAll(" ", "%20")})`;
return str.length <= 20 ? str : `[${str.slice(0, 17)}...](${str})`;
}
const emojis = JSON.parse(readFileSync("config/emojis.json"));

View file

@ -134,4 +134,4 @@ client.once(Events.ClientReady, async () => {
}
});
client.login(process.env.TOKEN);
client.login(process.env.TOKEN);

View file

@ -1,4 +1,4 @@
Please describe the following image in as much detail as you can.
Do not add information that isn't there or miss important information.
There is an image, do not say there isn't. The image is provided. You can see the image.
There is an image, do not say there isn't.
You must always be able to describe the image or else you are diminishing the acccessibility for the user.

View file

@ -15,7 +15,7 @@ function canvasToBuffer(canvas) {
}
function wrapText(context, text, x, y, maxWidth, lineHeight, preparingSentence, lines) {
const words = text.split(/\s/g);
const words = text.split(" ");
for (let i = 0; i < words.length; i++) {
const workSentence = preparingSentence.join(" ") + " " + words[i];
@ -29,8 +29,6 @@ function wrapText(context, text, x, y, maxWidth, lineHeight, preparingSentence,
lines.push(preparingSentence.join(" "));
y -= (lines.length * lineHeight) / 2;
lines.forEach(element => {
const lineWidth = context.measureText(element).width;
const xOffset = (maxWidth - lineWidth) / 2;