Compare commits
25 Commits
cab112e92b
...
dev-new-re
| Author | SHA1 | Date | |
|---|---|---|---|
| 34dbc91d1e | |||
| 2d11fdfdad | |||
| db98cc21b2 | |||
| 696d0f136d | |||
| 24510dcc4c | |||
| ac54231ced | |||
| b0311a3bb3 | |||
|
44eb1783ac
|
|||
|
e2dab416f2
|
|||
|
724621f8da
|
|||
| 56ff2f96a5 | |||
| fe9b52c02d | |||
| 2d9f66acd4 | |||
| 487ee866ba | |||
| 14fbe1ab5d | |||
| 7175271233 | |||
| f84a1deddb | |||
| 5dd106354b | |||
| 9a79521a27 | |||
| b0d08f119e | |||
| ce5cfafd1d | |||
| 8b35534517 | |||
| 795d3b444e | |||
| 46bc9ae711 | |||
| a98f5e0ebc |
25
Docs/API/README.md
Normal file
25
Docs/API/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 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_
|
||||
@@ -1,9 +1,8 @@
|
||||
const { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||
const { customAlphabet, random } = require("nanoid");
|
||||
const { Card, User, Wishlist, Character, sequelize } = require("../models");
|
||||
const { customAlphabet } = require("nanoid");
|
||||
const { Card, User, Wishlist, Character } = 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();
|
||||
|
||||
@@ -203,10 +202,10 @@ module.exports = {
|
||||
switch (i.customId) {
|
||||
case 'testbatch':
|
||||
i.deferUpdate();
|
||||
interaction.channel.send("Beep boop fetching test renders");
|
||||
interaction.channel.send("Beep boop test batch of 5");
|
||||
let testCard = await Card.build({
|
||||
characterId: 1,
|
||||
userId: Math.floor(Math.random() * 10),
|
||||
characterId: 0,
|
||||
userId: 1,
|
||||
identifier: "0xffff",
|
||||
quality: 1,
|
||||
printNr: 0,
|
||||
@@ -219,37 +218,15 @@ module.exports = {
|
||||
imageIdentifier: "azur-lane/akashi.png",
|
||||
enabled: true
|
||||
})
|
||||
|
||||
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}`);
|
||||
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);
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
32
commands/debugRendering.js
Normal file
32
commands/debugRendering.js
Normal file
@@ -0,0 +1,32 @@
|
||||
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 });
|
||||
}
|
||||
}
|
||||
@@ -80,11 +80,7 @@ module.exports = {
|
||||
cards.sort((a, b) => a.characterId - b.characterId);
|
||||
|
||||
const row = new ActionRowBuilder();
|
||||
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 deckImage = await Rendering.renderCardStack(cards);
|
||||
let notableProps = [];
|
||||
let pings = [];
|
||||
for (let i = 0; i < cards.length; i++) {
|
||||
@@ -223,10 +219,7 @@ module.exports = {
|
||||
console.log(`Collected ${collected.size} interactions.`);
|
||||
|
||||
|
||||
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 deckImage = await Rendering.renderCardStack(cards);
|
||||
message.edit({ components: [], files: [new AttachmentBuilder(deckImage)] });
|
||||
});
|
||||
|
||||
|
||||
@@ -37,10 +37,7 @@ 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).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 cardImage = await Rendering.renderCard(card);
|
||||
renderedCards[slot] = cardImage;
|
||||
} else {
|
||||
renderedCards[slot] = `${process.env.ASSET_URL}/cards/card_cover.png`;
|
||||
|
||||
@@ -70,11 +70,8 @@ module.exports = {
|
||||
interaction.editReply({ content: "Card not found" });
|
||||
return;
|
||||
}
|
||||
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 cardImage = await Rendering.renderCard(card);
|
||||
|
||||
let description = "";
|
||||
//Add a new line after every 4th (long) word or after a full stop
|
||||
let words = card.Character.description.split(" ");
|
||||
|
||||
944
package-lock.json
generated
944
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,14 @@
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@discordjs/rest": "^0.3.0",
|
||||
"axios": "^1.6.0",
|
||||
"axios": "^0.27.2",
|
||||
"body-parser": "^1.20.2",
|
||||
"discord-api-types": "^0.37.2",
|
||||
"discord.js": "^14.0.0",
|
||||
"dotenv": "^16.0.0",
|
||||
"express": "^4.21.2",
|
||||
"express": "^4.18.2",
|
||||
"mysql2": "^2.3.3",
|
||||
"nanoid": "^3.3.8",
|
||||
"nanoid": "^3.0.0",
|
||||
"nodemon": "^2.0.15",
|
||||
"sequelize": ">=6.28.1",
|
||||
"sequelize-cli": "^6.4.1",
|
||||
|
||||
@@ -3,25 +3,25 @@
|
||||
module.exports = {
|
||||
async up (queryInterface, Sequelize) {
|
||||
|
||||
await queryInterface.bulkInsert('Groups', [{
|
||||
await queryInterface.bulkInsert('Bands', [{
|
||||
id: 1,
|
||||
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.',
|
||||
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.',
|
||||
imageURL: 'https://cdn.discordapp.com/attachments/851543504831119380/1009467684490063892/unknown.png',
|
||||
enabled: true
|
||||
}]);
|
||||
await queryInterface.bulkInsert('Characters', [{
|
||||
id: 1,
|
||||
groupId: 1,
|
||||
name: 'Group Member 1',
|
||||
bandId: 1,
|
||||
name: 'Band 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,
|
||||
groupId: 1,
|
||||
name: 'Group Member 2',
|
||||
bandId: 1,
|
||||
name: 'Band Member 2',
|
||||
description: 'Band Member 2 is a Japanese drummer and founding member of TEST-BAND',
|
||||
imageIdentifier: 'testband/akane.png',
|
||||
enabled: true
|
||||
|
||||
@@ -6,9 +6,8 @@ module.exports = {
|
||||
id: 1,
|
||||
maintenance: 0,
|
||||
adminIDs: '["222457277708369928"]',
|
||||
claimTimeout: 300000,
|
||||
dropTimeout: 900000,
|
||||
patreonTierRoles: '{"1083018874263453868":1,"1083018984921759744":2,"1083019067184664607":3,"1083019116111216702":4,"1084519566354423918":5}'
|
||||
pullTimeout: 300000,
|
||||
dropTimeout: 900000
|
||||
}]);
|
||||
},
|
||||
|
||||
|
||||
@@ -7,9 +7,6 @@ module.exports = {
|
||||
discordId: '123456789',
|
||||
active: false,
|
||||
privacy: 0,
|
||||
nextDropReset: new Date(),
|
||||
nextClaimReset: new Date(),
|
||||
nextDaily: new Date(),
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date()
|
||||
}]);
|
||||
|
||||
Reference in New Issue
Block a user