Compare commits

...

16 commits

Author SHA1 Message Date
RenovateBot 4b78509653 Update dependency @types/uuid to v9.0.4
Some checks failed
continuous-integration/drone/push Build is failing
2023-09-28 10:42:57 +00:00
Ethan Lane 005a366883 v0.1.5
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-13 18:57:45 +01:00
Ethan Lane aebc799966 Revert to 0.1.4 2023-09-13 18:57:39 +01:00
Ethan Lane 7f64065589 Add dates to migration script 2023-09-13 18:57:20 +01:00
Ethan Lane 9c408e07b0 v0.1.5
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-13 18:51:14 +01:00
Ethan Lane 8ccd7c33d4 Prevent users from being able to claim the latest card unless you were the one to drop it
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-13 15:06:53 +01:00
Ethan Lane ad505b3ea2 Fix users being able to claim a card twice if the user has multiple of it already 2023-09-13 14:37:17 +01:00
Ethan Lane 74cdf818d1 v0.1.4
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-10 13:01:34 +01:00
Ethan Lane d5c15af9e3 .env 0.1.4 2023-09-10 13:01:28 +01:00
Ethan Lane 0e839992e6 Fix bug where the randomiser would sometimes pick a legendary that does not exist 2023-09-10 13:01:04 +01:00
Ethan Lane 5970a4fe2d v0.1.3
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-09 18:55:19 +01:00
Ethan Lane 0596e01b8d .env to 0.1.3 2023-09-09 18:55:12 +01:00
Ethan Lane b370c6f05e Fix drone script 2023-09-09 18:54:29 +01:00
Ethan Lane f483467ba5 v0.1.2
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-09 18:53:08 +01:00
Ethan Lane 9058942ea5 Update version in .env to 0.1.2 2023-09-09 18:52:57 +01:00
Ethan Lane 63911f43b0 Fix reoll button not working
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-09 18:49:44 +01:00
17 changed files with 118 additions and 43 deletions

View file

@ -7,7 +7,7 @@
# any secret values. # any secret values.
BOT_TOKEN= BOT_TOKEN=
BOT_VER=0.1.1 DEV BOT_VER=0.1.4 DEV
BOT_AUTHOR=Vylpes BOT_AUTHOR=Vylpes
BOT_OWNERID=147392775707426816 BOT_OWNERID=147392775707426816
BOT_CLIENTID=682942374040961060 BOT_CLIENTID=682942374040961060

View file

@ -7,7 +7,7 @@ steps:
- name: deploy - name: deploy
image: appleboy/drone-ssh image: appleboy/drone-ssh
settings: settings:
host: 192.168.68.121 host: 192.168.68.120
username: vylpes username: vylpes
password: password:
from_secret: ssh_password from_secret: ssh_password
@ -28,7 +28,7 @@ steps:
- name: stage - name: stage
image: appleboy/drone-ssh image: appleboy/drone-ssh
settings: settings:
host: 192.168.68.121 host: 192.168.68.120
username: vylpes username: vylpes
password: password:
from_secret: ssh_password from_secret: ssh_password

View file

@ -7,7 +7,7 @@
# any secret values. # any secret values.
BOT_TOKEN= BOT_TOKEN=
BOT_VER=0.1.1 BOT_VER=0.1.4
BOT_AUTHOR=Vylpes BOT_AUTHOR=Vylpes
BOT_OWNERID=147392775707426816 BOT_OWNERID=147392775707426816
BOT_CLIENTID=1093810443589529631 BOT_CLIENTID=1093810443589529631

View file

@ -7,7 +7,7 @@
# any secret values. # any secret values.
BOT_TOKEN= BOT_TOKEN=
BOT_VER=0.1.1 BETA BOT_VER=0.1.4 BETA
BOT_AUTHOR=Vylpes BOT_AUTHOR=Vylpes
BOT_OWNERID=147392775707426816 BOT_OWNERID=147392775707426816
BOT_CLIENTID=1147976642942214235 BOT_CLIENTID=1147976642942214235

View file

@ -0,0 +1,8 @@
CREATE TABLE `claim` (
`Id` varchar(255) NOT NULL,
`WhenCreated` datetime NOT NULL,
`WhenUpdated` datetime NOT NULL,
`ClaimId` varchar(255) NOT NULL,
`InventoryId` varchar(255) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

View file

@ -0,0 +1,14 @@
INSERT INTO claim (
Id,
WhenCreated,
WhenUpdated,
ClaimId,
InventoryId
)
SELECT
UUID(),
NOW(),
NOW(),
ClaimId,
Id
FROM inventory;

View file

@ -0,0 +1,2 @@
ALTER TABLE inventory
DROP ClaimId;

View file

@ -1,6 +1,6 @@
{ {
"name": "card-drop", "name": "card-drop",
"version": "0.1.1", "version": "0.1.5",
"main": "./dist/bot.js", "main": "./dist/bot.js",
"typings": "./dist", "typings": "./dist",
"scripts": { "scripts": {

View file

@ -2,6 +2,7 @@ import { ButtonInteraction } from "discord.js";
import { ButtonEvent } from "../type/buttonEvent"; import { ButtonEvent } from "../type/buttonEvent";
import Inventory from "../database/entities/app/Inventory"; import Inventory from "../database/entities/app/Inventory";
import { CoreClient } from "../client/client"; import { CoreClient } from "../client/client";
import { default as eClaim } from "../database/entities/app/Claim";
export default class Claim extends ButtonEvent { export default class Claim extends ButtonEvent {
public override async execute(interaction: ButtonInteraction) { public override async execute(interaction: ButtonInteraction) {
@ -9,30 +10,36 @@ export default class Claim extends ButtonEvent {
const cardNumber = interaction.customId.split(' ')[1]; const cardNumber = interaction.customId.split(' ')[1];
const claimId = interaction.customId.split(' ')[2]; const claimId = interaction.customId.split(' ')[2];
const droppedBy = interaction.customId.split(' ')[3];
const userId = interaction.user.id; const userId = interaction.user.id;
const claimed = await Inventory.FetchOneByClaimId(claimId); const claimed = await eClaim.FetchOneByClaimId(claimId);
if (claimed) { if (claimed) {
await interaction.reply('This card has already been claimed'); await interaction.reply('This card has already been claimed');
return; return;
} }
if (claimId != CoreClient.ClaimId) { if (claimId == CoreClient.ClaimId && userId != droppedBy) {
await interaction.reply('This card has expired'); await interaction.reply('The latest dropped card can only be claimed by the user who dropped it');
return; return;
} }
let inventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber); let inventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber);
if (!inventory) { if (!inventory) {
inventory = new Inventory(userId, cardNumber, 1, claimId); inventory = new Inventory(userId, cardNumber, 1);
} else { } else {
inventory.SetQuantity(inventory.Quantity + 1); inventory.SetQuantity(inventory.Quantity + 1);
} }
await inventory.Save(Inventory, inventory); await inventory.Save(Inventory, inventory);
const claim = new eClaim(claimId);
claim.SetInventory(inventory);
await claim.Save(eClaim, claim);
await interaction.reply('Card claimed'); await interaction.reply('Card claimed');
} }
} }

View file

@ -28,6 +28,8 @@ export default class Reroll extends ButtonEvent {
const image = readFileSync(randomCard.Path); const image = readFileSync(randomCard.Path);
await interaction.deferReply();
const attachment = new AttachmentBuilder(image, { name: randomCard.FileName }); const attachment = new AttachmentBuilder(image, { name: randomCard.FileName });
const embed = new EmbedBuilder() const embed = new EmbedBuilder()
@ -43,7 +45,7 @@ export default class Reroll extends ButtonEvent {
row.addComponents( row.addComponents(
new ButtonBuilder() new ButtonBuilder()
.setCustomId(`claim ${randomCard.CardNumber} ${claimId}`) .setCustomId(`claim ${randomCard.CardNumber} ${claimId} ${interaction.user.id}`)
.setLabel("Claim") .setLabel("Claim")
.setStyle(ButtonStyle.Primary), .setStyle(ButtonStyle.Primary),
new ButtonBuilder() new ButtonBuilder()

View file

@ -9,7 +9,6 @@ import { Events } from "./events";
import { Util } from "./util"; import { Util } from "./util";
import CardSetupFunction from "../Functions/CardSetupFunction"; import CardSetupFunction from "../Functions/CardSetupFunction";
import CardDataSource from "../database/dataSources/cardDataSource"; import CardDataSource from "../database/dataSources/cardDataSource";
import CardDropHelper from "../helpers/CardDropHelper";
import IButtonEventItem from "../contracts/IButtonEventItem"; import IButtonEventItem from "../contracts/IButtonEventItem";
import { ButtonEvent } from "../type/buttonEvent"; import { ButtonEvent } from "../type/buttonEvent";
import AppDataSource from "../database/dataSources/appDataSource"; import AppDataSource from "../database/dataSources/appDataSource";

View file

@ -51,7 +51,7 @@ export default class Drop extends Command {
row.addComponents( row.addComponents(
new ButtonBuilder() new ButtonBuilder()
.setCustomId(`claim ${randomCard.CardNumber} ${claimId}`) .setCustomId(`claim ${randomCard.CardNumber} ${claimId} ${interaction.user.id}`)
.setLabel("Claim") .setLabel("Claim")
.setStyle(ButtonStyle.Primary), .setStyle(ButtonStyle.Primary),
new ButtonBuilder() new ButtonBuilder()
@ -76,7 +76,6 @@ export default class Drop extends Command {
} }
} }
CoreClient.ClaimId = claimId; CoreClient.ClaimId = claimId;
} }
} }

View file

@ -0,0 +1,31 @@
import { Column, Entity, ManyToOne } from "typeorm";
import AppBaseEntity from "../../../contracts/AppBaseEntity";
import Inventory from "./Inventory";
import AppDataSource from "../../dataSources/appDataSource";
@Entity()
export default class Claim extends AppBaseEntity {
constructor(claimId: string) {
super();
this.ClaimId = claimId;
}
@Column()
ClaimId: string;
@ManyToOne(() => Inventory, x => x.Claims)
Inventory: Inventory;
public SetInventory(inventory: Inventory) {
this.Inventory = inventory;
}
public static async FetchOneByClaimId(claimId: string): Promise<Claim | null> {
const repository = AppDataSource.getRepository(Claim);
const single = await repository.findOne({ where: { ClaimId: claimId }});
return single;
}
}

View file

@ -1,16 +1,16 @@
import { Column, Entity } from "typeorm"; import { Column, Entity, OneToMany } from "typeorm";
import AppBaseEntity from "../../../contracts/AppBaseEntity"; import AppBaseEntity from "../../../contracts/AppBaseEntity";
import AppDataSource from "../../dataSources/appDataSource"; import AppDataSource from "../../dataSources/appDataSource";
import Claim from "./Claim";
@Entity() @Entity()
export default class Inventory extends AppBaseEntity { export default class Inventory extends AppBaseEntity {
constructor(userId: string, cardNumber: string, quantity: number, claimId: string) { constructor(userId: string, cardNumber: string, quantity: number) {
super(); super();
this.UserId = userId; this.UserId = userId;
this.CardNumber = cardNumber; this.CardNumber = cardNumber;
this.Quantity = quantity; this.Quantity = quantity;
this.ClaimId = claimId;
} }
@Column() @Column()
@ -22,13 +22,17 @@ export default class Inventory extends AppBaseEntity {
@Column() @Column()
Quantity: number; Quantity: number;
@Column() @OneToMany(() => Claim, x => x.Inventory)
ClaimId: string; Claims: Claim[];
public SetQuantity(quantity: number) { public SetQuantity(quantity: number) {
this.Quantity = quantity; this.Quantity = quantity;
} }
public AddClaim(claim: Claim) {
this.Claims.push(claim);
}
public static async FetchOneByCardNumberAndUserId(userId: string, cardNumber: string): Promise<Inventory | null> { public static async FetchOneByCardNumberAndUserId(userId: string, cardNumber: string): Promise<Inventory | null> {
const repository = AppDataSource.getRepository(Inventory); const repository = AppDataSource.getRepository(Inventory);
@ -36,12 +40,4 @@ export default class Inventory extends AppBaseEntity {
return single; return single;
} }
public static async FetchOneByClaimId(claimId: string): Promise<Inventory | null> {
const repository = AppDataSource.getRepository(Inventory);
const single = await repository.findOne({ where: { ClaimId: claimId }});
return single;
}
} }

View file

@ -0,0 +1,17 @@
import { MigrationInterface, QueryRunner } from "typeorm"
import MigrationHelper from "../../../../helpers/MigrationHelper"
export class CreateClaim1694609771821 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
MigrationHelper.Up('1694609771821-CreateClaim', '0.1.5', [
'01-CreateClaim',
'02-MoveToClaim',
'03-AlterInventory',
], queryRunner);
}
public async down(queryRunner: QueryRunner): Promise<void> {
}
}

View file

@ -4,13 +4,6 @@ import Series from "../database/entities/card/Series";
export default class CardDropHelper { export default class CardDropHelper {
public static async GetRandomCard(): Promise<Card> { public static async GetRandomCard(): Promise<Card> {
const allSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]);
const allSeriesWithCards = allSeries.filter(x => x.Cards.length > 0);
const randomSeriesIndex = Math.floor(Math.random() * allSeriesWithCards.length);
const randomSeries = allSeriesWithCards[randomSeriesIndex];
const randomRarity = Math.random() * 100; const randomRarity = Math.random() * 100;
let cardRarity: CardRarity; let cardRarity: CardRarity;
@ -24,6 +17,13 @@ export default class CardDropHelper {
else if (randomRarity < goldChance) cardRarity = CardRarity.Gold; else if (randomRarity < goldChance) cardRarity = CardRarity.Gold;
else cardRarity = CardRarity.Legendary; else cardRarity = CardRarity.Legendary;
const allSeries = await Series.FetchAll(Series, [ "Cards", "Cards.Series" ]);
const allSeriesWithCards = allSeries.filter(x => x.Cards.length > 0 && x.Cards.find(x => x.Rarity == cardRarity));
const randomSeriesIndex = Math.floor(Math.random() * allSeriesWithCards.length);
const randomSeries = allSeriesWithCards[randomSeriesIndex];
const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity && x.Path && x.FileName); const allCards = randomSeries.Cards.filter(x => x.Rarity == cardRarity && x.Path && x.FileName);
const randomCardIndex = Math.floor(Math.random() * allCards.length); const randomCardIndex = Math.floor(Math.random() * allCards.length);

View file

@ -910,14 +910,14 @@
integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
"@types/uuid@^9.0.0": "@types/uuid@^9.0.0":
version "9.0.2" version "9.0.4"
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.2.tgz#ede1d1b1e451548d44919dc226253e32a6952c4b" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.4.tgz#e884a59338da907bda8d2ed03e01c5c49d036f1c"
integrity sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ== integrity sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==
"@types/ws@^8.5.5": "@types/ws@^8.5.5":
version "8.5.5" version "8.5.6"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065"
integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"