Create daily command #224
7 changed files with 77 additions and 2 deletions
2
database/0.6/1715967355818-daily/Up/01-table/User.sql
Normal file
2
database/0.6/1715967355818-daily/Up/01-table/User.sql
Normal file
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE `user`
|
||||
ADD LastUsedDaily datetime null;
|
|
@ -8,6 +8,7 @@ import CardDropHelperMetadata from "../helpers/CardDropHelperMetadata";
|
|||
import { readFileSync } from "fs";
|
||||
import path from "path";
|
||||
import User from "../database/entities/app/User";
|
||||
import CardConstants from "../constants/CardConstants";
|
||||
|
||||
export default class Claim extends ButtonEvent {
|
||||
public override async execute(interaction: ButtonInteraction) {
|
||||
|
@ -42,11 +43,11 @@ export default class Claim extends ButtonEvent {
|
|||
|
||||
await inventory.Save(Inventory, inventory);
|
||||
|
||||
const user = await User.FetchOneById(User, userId) || new User(userId, 300);
|
||||
const user = await User.FetchOneById(User, userId) || new User(userId, CardConstants.StartingCurrency);
|
||||
|
||||
AppLogger.LogSilly("Button/Claim", `${user.Id} has ${user.Currency} currency`);
|
||||
|
||||
if (!user.RemoveCurrency(10)) {
|
||||
if (!user.RemoveCurrency(CardConstants.ClaimCost)) {
|
||||
await interaction.reply(`Not enough currency! You need 10 currency, you have ${user.Currency}`);
|
||||
return;
|
||||
}
|
||||
|
|
43
src/commands/daily.ts
Normal file
43
src/commands/daily.ts
Normal file
|
@ -0,0 +1,43 @@
|
|||
import { CommandInteraction, SlashCommandBuilder } from "discord.js";
|
||||
import { Command } from "../type/command";
|
||||
import User from "../database/entities/app/User";
|
||||
import CardConstants from "../constants/CardConstants";
|
||||
import TimeLengthInput from "../helpers/TimeLengthInput";
|
||||
|
||||
export default class Daily extends Command {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.CommandBuilder = new SlashCommandBuilder()
|
||||
.setName("daily")
|
||||
.setDescription("Gain bonus currency, once a day");
|
||||
}
|
||||
|
||||
public override async execute(interaction: CommandInteraction) {
|
||||
const user = await User.FetchOneById(User, interaction.user.id) ?? new User(interaction.user.id, CardConstants.StartingCurrency);
|
||||
|
||||
const dayAgo = new Date(Date.now() - (1000 * 60 * 60 * 24));
|
||||
|
||||
if (user.LastUsedDaily && user.LastUsedDaily > dayAgo) {
|
||||
const timeNow = Date.now();
|
||||
const timeLength = 24 * 60 * 60 * 1000; // 1 day
|
||||
|
||||
const timeLeft = Math.ceil(((timeLength - (timeNow - user.LastUsedDaily.getTime()))) / 1000 / 60);
|
||||
|
||||
const timeLeftHours = Math.floor(timeLeft / 60);
|
||||
const timeLeftMinutes = timeLeft % 60;
|
||||
|
||||
const timeLeftString = new TimeLengthInput(`${timeLeftHours}h ${timeLeftMinutes}m`);
|
||||
|
||||
await interaction.reply(`You have already used the daily command! You can use it again in **${timeLeftString.GetLength()}**.`);
|
||||
return;
|
||||
}
|
||||
|
||||
user.AddCurrency(CardConstants.DailyCurrency);
|
||||
user.UpdateLastUsedDaily(new Date());
|
||||
|
||||
await user.Save(User, user);
|
||||
|
||||
await interaction.reply(`Given ${CardConstants.DailyCurrency} currency to ${interaction.user.username}`);
|
||||
}
|
||||
}
|
5
src/constants/CardConstants.ts
Normal file
5
src/constants/CardConstants.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
export default class CardConstants {
|
||||
public static readonly ClaimCost = 10;
|
||||
public static readonly DailyCurrency = 100;
|
||||
public static readonly StartingCurrency = 300;
|
||||
}
|
|
@ -13,6 +13,9 @@ export default class User extends AppBaseEntity {
|
|||
@Column()
|
||||
Currency: number;
|
||||
|
||||
@Column()
|
||||
LastUsedDaily?: Date;
|
||||
|
||||
public AddCurrency(amount: number) {
|
||||
this.Currency += amount;
|
||||
}
|
||||
|
@ -24,4 +27,8 @@ export default class User extends AppBaseEntity {
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
public UpdateLastUsedDaily(lastUsedDaily: Date) {
|
||||
this.LastUsedDaily = lastUsedDaily;
|
||||
}
|
||||
}
|
15
src/database/migrations/app/0.6/1715967355818-daily.ts
Normal file
15
src/database/migrations/app/0.6/1715967355818-daily.ts
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
import MigrationHelper from "../../../../helpers/MigrationHelper";
|
||||
|
||||
export class Daily1715967355818 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
MigrationHelper.Up("1715967355818-daily", "0.6", [
|
||||
"01-table/User",
|
||||
], queryRunner);
|
||||
}
|
||||
|
||||
public async down(): Promise<void> {
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,7 @@ import { Environment } from "./constants/Environment";
|
|||
|
||||
// Global Command Imports
|
||||
import About from "./commands/about";
|
||||
import Daily from "./commands/daily";
|
||||
import Drop from "./commands/drop";
|
||||
import Gdrivesync from "./commands/gdrivesync";
|
||||
import Give from "./commands/give";
|
||||
|
@ -29,6 +30,7 @@ export default class Registry {
|
|||
public static RegisterCommands() {
|
||||
// Global Commands
|
||||
CoreClient.RegisterCommand("about", new About());
|
||||
CoreClient.RegisterCommand("daily", new Daily());
|
||||
CoreClient.RegisterCommand("drop", new Drop());
|
||||
CoreClient.RegisterCommand("gdrivesync", new Gdrivesync());
|
||||
CoreClient.RegisterCommand("give", new Give());
|
||||
|
|
Loading…
Reference in a new issue