Compare commits
41 Commits
dev-new-re
...
2a9f76afa6
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a9f76afa6 | |||
|
|
dfd2c12103 | ||
| cab112e92b | |||
|
|
c2f09881d3 | ||
|
|
ae3733c0f2 | ||
|
|
f07bc524d6 | ||
|
|
265f4a7864 | ||
|
|
284c015509 | ||
|
|
e010a25c72 | ||
|
|
4595ea9f07 | ||
|
|
b08fd54288 | ||
|
|
324f008fbf | ||
| 111cf4aead | |||
| 1eab3e7853 | |||
| d4a9c4543a | |||
| f5837c4b25 | |||
| 36de2c1715 | |||
| 4d72f8562e | |||
| 2f63f172c2 | |||
| 7962266b26 | |||
| 6edc6771ef | |||
| 596a6b5dc5 | |||
| de37b9d348 | |||
| 643c027ce8 | |||
| 0c232a55cb | |||
| d7a99968bc | |||
| b099c29ecf | |||
| aaaac430e6 | |||
| 56a76b0fbb | |||
| e50449ec03 | |||
| 2a4b58f7af | |||
| e1cc82eb32 | |||
| 6d35019e3e | |||
| 490db1c70f | |||
| 21ccd3a3d1 | |||
| a33a7d737e | |||
| 5a31ef95fb | |||
| f2ac0ed10e | |||
| 6d86799e02 | |||
| 189e126983 | |||
| d99b8ab4d6 |
@@ -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_
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
const { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
const { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js");
|
||||||
const { customAlphabet } = require("nanoid");
|
const { customAlphabet, random } = require("nanoid");
|
||||||
const { Card, User, Wishlist, Character } = require("../models");
|
const { Card, User, Wishlist, Character, sequelize } = 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();
|
||||||
|
|
||||||
@@ -202,10 +203,10 @@ module.exports = {
|
|||||||
switch (i.customId) {
|
switch (i.customId) {
|
||||||
case 'testbatch':
|
case 'testbatch':
|
||||||
i.deferUpdate();
|
i.deferUpdate();
|
||||||
interaction.channel.send("Beep boop test batch of 5");
|
interaction.channel.send("Beep boop fetching test renders");
|
||||||
let testCard = await Card.build({
|
let testCard = await Card.build({
|
||||||
characterId: 0,
|
characterId: 1,
|
||||||
userId: 1,
|
userId: Math.floor(Math.random() * 10),
|
||||||
identifier: "0xffff",
|
identifier: "0xffff",
|
||||||
quality: 1,
|
quality: 1,
|
||||||
printNr: 0,
|
printNr: 0,
|
||||||
@@ -218,15 +219,37 @@ module.exports = {
|
|||||||
imageIdentifier: "azur-lane/akashi.png",
|
imageIdentifier: "azur-lane/akashi.png",
|
||||||
enabled: true
|
enabled: true
|
||||||
})
|
})
|
||||||
for (let index = 0; index < 5; index++) {
|
|
||||||
testCard.printNr = index;
|
let testCards = [ { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard}, { ...testCard},{ ...testCard},{ ...testCard},{ ...testCard},{ ...testCard} ];
|
||||||
let render = await Rendering.renderCard(testCard, testCharacter).catch(async function(error){
|
let startTime = Date.now();
|
||||||
await interaction.channel.send(JSON.stringify(error));
|
let renderedStack = await Rendering.renderCardStack([testCard, testCard, testCard]);
|
||||||
await interaction.channel.send(JSON.stringify(error.response?.data));
|
let execTime = Date.now() - startTime;
|
||||||
return;
|
await interaction.channel.send(renderedStack);
|
||||||
});
|
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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -80,7 +80,11 @@ 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);
|
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 notableProps = [];
|
||||||
let pings = [];
|
let pings = [];
|
||||||
for (let i = 0; i < cards.length; i++) {
|
for (let i = 0; i < cards.length; i++) {
|
||||||
@@ -219,7 +223,10 @@ module.exports = {
|
|||||||
console.log(`Collected ${collected.size} interactions.`);
|
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)] });
|
message.edit({ components: [], files: [new AttachmentBuilder(deckImage)] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,10 @@ 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);
|
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;
|
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,7 +70,10 @@ module.exports = {
|
|||||||
interaction.editReply({ content: "Card not found" });
|
interaction.editReply({ content: "Card not found" });
|
||||||
return;
|
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 = "";
|
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
|
||||||
|
|||||||
961
package-lock.json
generated
961
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": "^0.27.2",
|
"axios": "^1.6.0",
|
||||||
"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.18.2",
|
"express": "^4.21.2",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
"nanoid": "^3.0.0",
|
"nanoid": "^3.3.8",
|
||||||
"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('Bands', [{
|
await queryInterface.bulkInsert('Groups', [{
|
||||||
id: 1,
|
id: 1,
|
||||||
name: 'TEST-BAND',
|
name: 'TEST-GROUP',
|
||||||
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.',
|
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',
|
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,
|
||||||
bandId: 1,
|
groupId: 1,
|
||||||
name: 'Band Member 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.',
|
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,
|
||||||
bandId: 1,
|
groupId: 1,
|
||||||
name: 'Band Member 2',
|
name: 'Group 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,8 +6,9 @@ module.exports = {
|
|||||||
id: 1,
|
id: 1,
|
||||||
maintenance: 0,
|
maintenance: 0,
|
||||||
adminIDs: '["222457277708369928"]',
|
adminIDs: '["222457277708369928"]',
|
||||||
pullTimeout: 300000,
|
claimTimeout: 300000,
|
||||||
dropTimeout: 900000
|
dropTimeout: 900000,
|
||||||
|
patreonTierRoles: '{"1083018874263453868":1,"1083018984921759744":2,"1083019067184664607":3,"1083019116111216702":4,"1084519566354423918":5}'
|
||||||
}]);
|
}]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ 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