Compare commits
25 Commits
2a9f76afa6
...
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 { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const { customAlphabet, random } = require("nanoid");
|
const { customAlphabet } = require("nanoid");
|
||||||
const { Card, User, Wishlist, Character, sequelize } = require("../models");
|
const { Card, User, Wishlist, Character } = require("../models");
|
||||||
const { UserUtils, CardUtils, GeneralUtils, Rendering } = require("../util");
|
const { UserUtils, CardUtils, GeneralUtils, Rendering } = require("../util");
|
||||||
const { PATREON } = require("../config/constants");
|
const { PATREON } = require("../config/constants");
|
||||||
const axios = require('axios').default
|
|
||||||
const stores = require("../stores");
|
const stores = require("../stores");
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
|
|
||||||
@@ -203,10 +202,10 @@ module.exports = {
|
|||||||
switch (i.customId) {
|
switch (i.customId) {
|
||||||
case 'testbatch':
|
case 'testbatch':
|
||||||
i.deferUpdate();
|
i.deferUpdate();
|
||||||
interaction.channel.send("Beep boop fetching test renders");
|
interaction.channel.send("Beep boop test batch of 5");
|
||||||
let testCard = await Card.build({
|
let testCard = await Card.build({
|
||||||
characterId: 1,
|
characterId: 0,
|
||||||
userId: Math.floor(Math.random() * 10),
|
userId: 1,
|
||||||
identifier: "0xffff",
|
identifier: "0xffff",
|
||||||
quality: 1,
|
quality: 1,
|
||||||
printNr: 0,
|
printNr: 0,
|
||||||
@@ -219,37 +218,15 @@ module.exports = {
|
|||||||
imageIdentifier: "azur-lane/akashi.png",
|
imageIdentifier: "azur-lane/akashi.png",
|
||||||
enabled: true
|
enabled: true
|
||||||
})
|
})
|
||||||
|
for (let index = 0; index < 5; index++) {
|
||||||
let testCards = [ { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard}, { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard} ];
|
testCard.printNr = index;
|
||||||
let startTime = Date.now();
|
let render = await Rendering.renderCard(testCard, testCharacter).catch(async function(error){
|
||||||
let renderedStack = await Rendering.renderCardStack([testCard, testCard, testCard]);
|
await interaction.channel.send(JSON.stringify(error));
|
||||||
let execTime = Date.now() - startTime;
|
await interaction.channel.send(JSON.stringify(error.response?.data));
|
||||||
await interaction.channel.send(renderedStack);
|
return;
|
||||||
await interaction.channel.send(`Stack rendering took ${execTime} ms`);
|
});
|
||||||
|
await interaction.channel.send(render);
|
||||||
|
}
|
||||||
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;
|
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);
|
cards.sort((a, b) => a.characterId - b.characterId);
|
||||||
|
|
||||||
const row = new ActionRowBuilder();
|
const row = new ActionRowBuilder();
|
||||||
let deckImage = await Rendering.renderCardStack(cards).catch(async err => {
|
let deckImage = await Rendering.renderCardStack(cards);
|
||||||
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 notableProps = [];
|
||||||
let pings = [];
|
let pings = [];
|
||||||
for (let i = 0; i < cards.length; i++) {
|
for (let i = 0; i < cards.length; i++) {
|
||||||
@@ -223,10 +219,7 @@ module.exports = {
|
|||||||
console.log(`Collected ${collected.size} interactions.`);
|
console.log(`Collected ${collected.size} interactions.`);
|
||||||
|
|
||||||
|
|
||||||
let deckImage = await Rendering.renderCardStack(cards).catch(async err => {
|
let deckImage = await Rendering.renderCardStack(cards);
|
||||||
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)] });
|
message.edit({ components: [], files: [new AttachmentBuilder(deckImage)] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -37,10 +37,7 @@ module.exports = {
|
|||||||
let card = await Card.findOne({ where: { id: profile[slot], burned: false } });
|
let card = await Card.findOne({ where: { id: profile[slot], burned: false } });
|
||||||
if (card) {
|
if (card) {
|
||||||
console.log(`Iterating card ${card.id}`);
|
console.log(`Iterating card ${card.id}`);
|
||||||
let cardImage = await Rendering.renderCard(card).catch(async err => {
|
let cardImage = await Rendering.renderCard(card);
|
||||||
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;
|
renderedCards[slot] = cardImage;
|
||||||
} else {
|
} else {
|
||||||
renderedCards[slot] = `${process.env.ASSET_URL}/cards/card_cover.png`;
|
renderedCards[slot] = `${process.env.ASSET_URL}/cards/card_cover.png`;
|
||||||
|
|||||||
@@ -70,10 +70,7 @@ module.exports = {
|
|||||||
interaction.editReply({ content: "Card not found" });
|
interaction.editReply({ content: "Card not found" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let cardImage = await Rendering.renderCard(card).catch(async err => {
|
let cardImage = await Rendering.renderCard(card);
|
||||||
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 = "";
|
let description = "";
|
||||||
//Add a new line after every 4th (long) word or after a full stop
|
//Add a new line after every 4th (long) word or after a full stop
|
||||||
|
|||||||
957
package-lock.json
generated
957
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,14 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@discordjs/rest": "^0.3.0",
|
"@discordjs/rest": "^0.3.0",
|
||||||
"axios": "^1.6.0",
|
"axios": "^0.27.2",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"discord-api-types": "^0.37.2",
|
"discord-api-types": "^0.37.2",
|
||||||
"discord.js": "^14.0.0",
|
"discord.js": "^14.0.0",
|
||||||
"dotenv": "^16.0.0",
|
"dotenv": "^16.0.0",
|
||||||
"express": "^4.21.2",
|
"express": "^4.18.2",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
"nanoid": "^3.3.8",
|
"nanoid": "^3.0.0",
|
||||||
"nodemon": "^2.0.15",
|
"nodemon": "^2.0.15",
|
||||||
"sequelize": ">=6.28.1",
|
"sequelize": ">=6.28.1",
|
||||||
"sequelize-cli": "^6.4.1",
|
"sequelize-cli": "^6.4.1",
|
||||||
|
|||||||
@@ -3,25 +3,25 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
async up (queryInterface, Sequelize) {
|
async up (queryInterface, Sequelize) {
|
||||||
|
|
||||||
await queryInterface.bulkInsert('Groups', [{
|
await queryInterface.bulkInsert('Bands', [{
|
||||||
id: 1,
|
id: 1,
|
||||||
name: 'TEST-GROUP',
|
name: 'TEST-BAND',
|
||||||
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.',
|
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',
|
imageURL: 'https://cdn.discordapp.com/attachments/851543504831119380/1009467684490063892/unknown.png',
|
||||||
enabled: true
|
enabled: true
|
||||||
}]);
|
}]);
|
||||||
await queryInterface.bulkInsert('Characters', [{
|
await queryInterface.bulkInsert('Characters', [{
|
||||||
id: 1,
|
id: 1,
|
||||||
groupId: 1,
|
bandId: 1,
|
||||||
name: 'Group Member 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.',
|
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',
|
imageIdentifier: 'testband/miku.png',
|
||||||
enabled: true
|
enabled: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
groupId: 1,
|
bandId: 1,
|
||||||
name: 'Group Member 2',
|
name: 'Band Member 2',
|
||||||
description: 'Band Member 2 is a Japanese drummer and founding member of TEST-BAND',
|
description: 'Band Member 2 is a Japanese drummer and founding member of TEST-BAND',
|
||||||
imageIdentifier: 'testband/akane.png',
|
imageIdentifier: 'testband/akane.png',
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|||||||
@@ -6,9 +6,8 @@ module.exports = {
|
|||||||
id: 1,
|
id: 1,
|
||||||
maintenance: 0,
|
maintenance: 0,
|
||||||
adminIDs: '["222457277708369928"]',
|
adminIDs: '["222457277708369928"]',
|
||||||
claimTimeout: 300000,
|
pullTimeout: 300000,
|
||||||
dropTimeout: 900000,
|
dropTimeout: 900000
|
||||||
patreonTierRoles: '{"1083018874263453868":1,"1083018984921759744":2,"1083019067184664607":3,"1083019116111216702":4,"1084519566354423918":5}'
|
|
||||||
}]);
|
}]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,6 @@ module.exports = {
|
|||||||
discordId: '123456789',
|
discordId: '123456789',
|
||||||
active: false,
|
active: false,
|
||||||
privacy: 0,
|
privacy: 0,
|
||||||
nextDropReset: new Date(),
|
|
||||||
nextClaimReset: new Date(),
|
|
||||||
nextDaily: new Date(),
|
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
updatedAt: new Date()
|
updatedAt: new Date()
|
||||||
}]);
|
}]);
|
||||||
|
|||||||
Reference in New Issue
Block a user