36 Commits

Author SHA1 Message Date
dependabot[bot]
718978bf76 Bump serve-static and express
Bumps [serve-static](https://github.com/expressjs/serve-static) to 1.16.2 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together.


Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.1)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 15:33:17 +00:00
dependabot[bot]
265f4a7864 Bump undici from 5.26.3 to 5.28.4
Bumps [undici](https://github.com/nodejs/undici) from 5.26.3 to 5.28.4.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.28.4)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 15:32:45 +00:00
dependabot[bot]
284c015509 Bump express from 4.18.2 to 4.19.2
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 15:32:33 +00:00
dependabot[bot]
e010a25c72 Bump follow-redirects from 1.15.2 to 1.15.6
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 15:32:22 +00:00
dependabot[bot]
4595ea9f07 Bump es5-ext from 0.10.62 to 0.10.64
Bumps [es5-ext](https://github.com/medikoo/es5-ext) from 0.10.62 to 0.10.64.
- [Release notes](https://github.com/medikoo/es5-ext/releases)
- [Changelog](https://github.com/medikoo/es5-ext/blob/main/CHANGELOG.md)
- [Commits](https://github.com/medikoo/es5-ext/compare/v0.10.62...v0.10.64)

---
updated-dependencies:
- dependency-name: es5-ext
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 15:32:10 +00:00
dependabot[bot]
b08fd54288 Bump axios from 0.27.2 to 1.6.0
Bumps [axios](https://github.com/axios/axios) from 0.27.2 to 1.6.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.27.2...v1.6.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-03 13:21:49 +01:00
dependabot[bot]
324f008fbf Bump undici from 5.21.0 to 5.26.3
Bumps [undici](https://github.com/nodejs/undici) from 5.21.0 to 5.26.3.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.21.0...v5.26.3)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-03 13:20:48 +01:00
111cf4aead Delete duplicate Docs/API directory
This was causing collisions on case-insensitive filesystems  
The proper spelling is all lowercase
2023-09-18 12:42:04 +02:00
1eab3e7853 Commands: remove legacy debugrendering command 2023-09-18 12:38:35 +02:00
d4a9c4543a Seeds: Update seed files to new schema 2023-09-18 12:19:27 +02:00
f5837c4b25 Debug: Extend rendering debug command 2023-08-20 11:53:50 +02:00
36de2c1715 Rendering: Properly handle error response from Jose 2023-08-17 17:08:12 +02:00
4d72f8562e Profile: Implement custom profile backgrounds 2023-08-07 17:34:19 +02:00
2f63f172c2 DB: Add fields for custom profile backgrounds 2023-08-07 17:34:19 +02:00
7962266b26 GeneralUtil: Add download file function 2023-08-07 17:34:19 +02:00
6edc6771ef Profile: Fix showcase card being out of order.
The showcase cards were rendered based on the order in which
the render calls returned within the slots.map call.
Using the original slot keys fixes this issue.
2023-08-07 17:34:19 +02:00
596a6b5dc5 Bot: Change ENV to NODE_ENV in ready.js 2023-08-07 17:34:19 +02:00
de37b9d348 Bot: Clear global commands when running as dev 2023-08-07 17:34:19 +02:00
643c027ce8 Rendering: Better card debug output
- Add timestamp
- Larger font
2023-08-07 17:34:19 +02:00
0c232a55cb Debug: Catch and print errors when fetching from Jose 2023-08-07 17:34:19 +02:00
d7a99968bc GeneralUtils/Profile: Shorten numbers to K M B format
- Implemented for currencies on the profile
2023-08-07 17:34:19 +02:00
b099c29ecf Rendering: Add debug output in develop mode
- Burn node info into rendered card
- Log job def onto console
2023-08-07 17:34:19 +02:00
aaaac430e6 Editprofile: Properly defer updates on non-modal interactions
Also fixes interaction filtering by user id.
Also fixes collector filtering by modal customID
2023-08-07 17:34:19 +02:00
56a76b0fbb Bump node versiom to 20
node:20-alpine
2023-08-07 17:34:19 +02:00
e50449ec03 Cleanup legacy rendering code and files
also removes dockerfile and imagemagick.
2023-08-07 17:34:19 +02:00
2a4b58f7af Rendering: Reposition labels for top-aligned default 2023-08-07 17:34:19 +02:00
e1cc82eb32 Rendering: Add placeholder frame
and fix profile card alignment
2023-08-07 17:34:19 +02:00
6d35019e3e Profile: Add stats bar to new rendering 2023-08-07 17:34:19 +02:00
490db1c70f Profile: Add userimage and status to new profile 2023-08-07 17:34:19 +02:00
21ccd3a3d1 Profile: Add new rendering for username and showcase 2023-08-07 17:34:19 +02:00
a33a7d737e Editprofile: Remove top level defer which broke modal inputs 2023-08-07 17:34:19 +02:00
5a31ef95fb Rendering: Hide card if it's unclaimed 2023-08-07 17:34:19 +02:00
f2ac0ed10e Rendering: Replace card stack rendering with external API call 2023-08-07 17:34:19 +02:00
6d86799e02 API: Serve static assets via express 2023-08-07 17:34:19 +02:00
189e126983 Rendering: Add configurable Jose endpoint 2023-08-07 17:34:19 +02:00
d99b8ab4d6 Rendering: WIP Replacing renderer with external API 2023-08-07 17:34:19 +02:00
11 changed files with 504 additions and 372 deletions

View File

@@ -1,25 +0,0 @@
# API Documentation
## Introduction
This API provides CRU (Create, Read, Update) operations for various models.
The API requires an API key for some operations.
The endpoints provided by this API are:
## Generic:
- / - List all routes (JSON Response)
- /ping - Returns pong
- /stats - Simple stats about the bot (Record counts and uptime)
- /most-recent-drop - Returns the most recent drop (Requires API Key)
## For characters:
- [`/characters`](characters.md#get-characters)
- [`/characters/:character_id`](characters.md#get-characterscharacter_id)
## For groups:
_TODO_
## For Badges:
_TODO_

View File

@@ -1,8 +1,9 @@
const { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
const { customAlphabet } = require("nanoid");
const { Card, User, Wishlist, Character } = require("../models");
const { customAlphabet, random } = require("nanoid");
const { Card, User, Wishlist, Character, sequelize } = require("../models");
const { UserUtils, CardUtils, GeneralUtils, Rendering } = require("../util");
const { PATREON } = require("../config/constants");
const axios = require('axios').default
const stores = require("../stores");
require('dotenv').config();
@@ -202,10 +203,10 @@ module.exports = {
switch (i.customId) {
case 'testbatch':
i.deferUpdate();
interaction.channel.send("Beep boop test batch of 5");
interaction.channel.send("Beep boop fetching test renders");
let testCard = await Card.build({
characterId: 0,
userId: 1,
characterId: 1,
userId: Math.floor(Math.random() * 10),
identifier: "0xffff",
quality: 1,
printNr: 0,
@@ -218,15 +219,37 @@ module.exports = {
imageIdentifier: "azur-lane/akashi.png",
enabled: true
})
for (let index = 0; index < 5; index++) {
testCard.printNr = index;
let render = await Rendering.renderCard(testCard, testCharacter).catch(async function(error){
await interaction.channel.send(JSON.stringify(error));
await interaction.channel.send(JSON.stringify(error.response?.data));
return;
});
await interaction.channel.send(render);
}
let testCards = [ { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard}, { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard} ];
let startTime = Date.now();
let renderedStack = await Rendering.renderCardStack([testCard, testCard, testCard]);
let execTime = Date.now() - startTime;
await interaction.channel.send(renderedStack);
await interaction.channel.send(`Stack rendering took ${execTime} ms`);
let total = 0;
startTime = Date.now()
await Promise.all(testCards.map(async card => {
console.log(`Iterating card `);
card.characterId = (await Character.findAll({where: {enabled: true},order: sequelize.random(),limit: 1}))[0].id;
card.id = 0;
card.identifier = CardUtils.generateIdentifier();
card.userId = 1;
let startTime = Date.now();
card['render'] = await Rendering.renderCard(card);
let execTime = Date.now() - startTime;
total += execTime;
card['timing'] = `${card.identifier} Card rendering took ${execTime} ms`;
}));
let toatalExecTime = Date.now() - startTime;
await interaction.channel.send(testCards.map(card => {return `${card['identifier']} ${card['render']}` }).join('\n'));
await interaction.channel.send(testCards.map(card => {return card['timing'] }).join('\n'))
let joseStats = (await axios.get(`${process.env.JOSE_ENDPOINT}/status`)).data;
await interaction.channel.send(`Active Nodes: ${joseStats.nodes.count} Queued Jobs: ${joseStats.jobs.queued.count}`);
await interaction.channel.send(`Total time for ${testCards.length} Cards: ${toatalExecTime}\nAverage time per card: ${total / testCards.length}`);
break;
}
});

View File

@@ -1,32 +0,0 @@
const sharp = require('sharp');
const { SlashCommandBuilder, AttachmentBuilder, EmbedBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName("debugrendering")
.setDescription("Debug rendering"),
permissionLevel: 2,
async execute(interaction) {
const image = await sharp({
create: {
width: 900,
height: 500,
channels: 4,
background: { r: 255, g: 0, b: 0, alpha: 0.5 }
}
})
.composite([
{ input: './assets/cards/test/test.png', gravity: 'northwest' },
{ input: './assets/cards/test/test.png', gravity: 'centre' },
{ input: './assets/cards/test/test.png', gravity: 'northeast' },
{ input: './assets/overlays/rainbow_overlay.png', gravity: 'northwest' },
{ input: './assets/overlays/rainbow_overlay.png', gravity: 'centre' },
{ input: './assets/overlays/rainbow_overlay.png', gravity: 'northeast' },
])
.png()
.toBuffer();
const file = new AttachmentBuilder(image);
const message = await interaction.reply({ content: 'asd', files: [file], fetchReply: true });
}
}

View File

@@ -80,7 +80,11 @@ module.exports = {
cards.sort((a, b) => a.characterId - b.characterId);
const row = new ActionRowBuilder();
let deckImage = await Rendering.renderCardStack(cards);
let deckImage = await Rendering.renderCardStack(cards).catch(async err => {
await interaction.channel.send(`Uooh an error! ${err.response?.status} ${err.response?.statusText} \n ${err.response?.data.message} \n ${err.response?.data.jobId}`);
});
if (!deckImage) { return; }
let notableProps = [];
let pings = [];
for (let i = 0; i < cards.length; i++) {
@@ -219,7 +223,10 @@ module.exports = {
console.log(`Collected ${collected.size} interactions.`);
let deckImage = await Rendering.renderCardStack(cards);
let deckImage = await Rendering.renderCardStack(cards).catch(async err => {
await interaction.channel.send(`Uooh an error! ${err.response?.status} ${err.response?.statusText} \n ${err.response?.data.message} \n ${err.response?.data.jobId}`);
});
if (!deckImage){ return; }
message.edit({ components: [], files: [new AttachmentBuilder(deckImage)] });
});

View File

@@ -37,7 +37,10 @@ module.exports = {
let card = await Card.findOne({ where: { id: profile[slot], burned: false } });
if (card) {
console.log(`Iterating card ${card.id}`);
let cardImage = await Rendering.renderCard(card);
let cardImage = await Rendering.renderCard(card).catch(async err => {
await interaction.channel.send(`Uooh an error! ${err.response?.status} ${err.response?.statusText} \n ${err.response?.data.message} \n ${err.response?.data.jobId}`);
});
if (!cardImage) { return; }
renderedCards[slot] = cardImage;
} else {
renderedCards[slot] = `${process.env.ASSET_URL}/cards/card_cover.png`;

View File

@@ -70,8 +70,11 @@ module.exports = {
interaction.editReply({ content: "Card not found" });
return;
}
let cardImage = await Rendering.renderCard(card);
let cardImage = await Rendering.renderCard(card).catch(async err => {
await interaction.channel.send(`Uooh an error! ${err.response?.status} ${err.response?.statusText} \n ${err.response?.data.message} \n ${err.response?.data.jobId}`);
});
if (!cardImage) { return; }
let description = "";
//Add a new line after every 4th (long) word or after a full stop
let words = card.Character.description.split(" ");

719
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,12 +12,12 @@
"license": "ISC",
"dependencies": {
"@discordjs/rest": "^0.3.0",
"axios": "^0.27.2",
"axios": "^1.6.0",
"body-parser": "^1.20.2",
"discord-api-types": "^0.37.2",
"discord.js": "^14.0.0",
"dotenv": "^16.0.0",
"express": "^4.18.2",
"express": "^4.21.1",
"mysql2": "^2.3.3",
"nanoid": "^3.0.0",
"nodemon": "^2.0.15",

View File

@@ -3,25 +3,25 @@
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.bulkInsert('Bands', [{
await queryInterface.bulkInsert('Groups', [{
id: 1,
name: 'TEST-BAND',
description: 'Test-Band (stylized as TEST-BAND) is an all girl rock band from Tokyo that formed in July 2013. The band combines a rock sound with a maid image modeled on Japanese maid cafés.',
name: 'TEST-GROUP',
description: 'Test-Group (stylized as TEST-GROUP) is an all girl rock band from Tokyo that formed in July 2013. The band combines a rock sound with a maid image modeled on Japanese maid cafés.',
imageURL: 'https://cdn.discordapp.com/attachments/851543504831119380/1009467684490063892/unknown.png',
enabled: true
}]);
await queryInterface.bulkInsert('Characters', [{
id: 1,
bandId: 1,
name: 'Band Member 1',
groupId: 1,
name: 'Group Member 1',
description: 'Band Member 1 is a Japanese singer, songwriter and guitarist. She is the initial founding member and main lyricist for TEST-BAND.',
imageIdentifier: 'testband/miku.png',
enabled: true
},
{
id: 2,
bandId: 1,
name: 'Band Member 2',
groupId: 1,
name: 'Group Member 2',
description: 'Band Member 2 is a Japanese drummer and founding member of TEST-BAND',
imageIdentifier: 'testband/akane.png',
enabled: true

View File

@@ -6,8 +6,9 @@ module.exports = {
id: 1,
maintenance: 0,
adminIDs: '["222457277708369928"]',
pullTimeout: 300000,
dropTimeout: 900000
claimTimeout: 300000,
dropTimeout: 900000,
patreonTierRoles: '{"1083018874263453868":1,"1083018984921759744":2,"1083019067184664607":3,"1083019116111216702":4,"1084519566354423918":5}'
}]);
},

View File

@@ -7,6 +7,9 @@ module.exports = {
discordId: '123456789',
active: false,
privacy: 0,
nextDropReset: new Date(),
nextClaimReset: new Date(),
nextDaily: new Date(),
createdAt: new Date(),
updatedAt: new Date()
}]);