diff --git a/src/commands/fun/subcommands/eco-bet.ts b/src/commands/fun/subcommands/eco-bet.ts index edce702..68087c2 100644 --- a/src/commands/fun/subcommands/eco-bet.ts +++ b/src/commands/fun/subcommands/eco-bet.ts @@ -2,6 +2,7 @@ import Command from "../../../core/command"; import $ from "../../../core/lib"; import {Storage} from "../../../core/structures"; import {isAuthorized, getMoneyEmbed, getSendEmbed, ECO_EMBED_COLOR} from "./eco-utils"; +import {User} from "discord.js"; export const BetCommand = new Command({ description: "Bet your Mons with other people [TBD]", @@ -27,8 +28,8 @@ export const BetCommand = new Command({ async run({args, author, channel, guild}): Promise { if (isAuthorized(guild, channel)) { const sender = Storage.getUser(author.id); - const target = args[0]; - const receiver = Storage.getUser(target); + const target = args[0] as User; + const receiver = Storage.getUser(target.id); const amount = Math.floor(args[1]); // handle invalid target @@ -49,15 +50,15 @@ export const BetCommand = new Command({ } }, any: new Command({ - async run({client, args, author, message, channel, guild}): Promise { + async run({client, args, author, message, channel, guild, askYesOrNo}): Promise { if (isAuthorized(guild, channel)) { // [Pertinence to make configurable on the fly.] // Lower and upper bounds for bet const durationBounds = { min:"1m", max:"1d" }; const sender = Storage.getUser(author.id); - const target = args[0]; - const receiver = Storage.getUser(target); + const target = args[0] as User; + const receiver = Storage.getUser(target.id); const amount = Math.floor(args[1]); const duration = parseDuration(args[2].trim()); @@ -94,16 +95,22 @@ export const BetCommand = new Command({ // Remove amount money from both parts at the start to avoid duplication of money. sender.money -= amount; receiver.money -= amount; + // Very hacky solution for persistence but better than no solution, backup returns runs during the bot's setup code. + sender.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled += amount; + receiver.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled += amount; Storage.save(); // Notify both users. await channel.send(`<@${target.id}> has taken <@${author.id}>'s bet, the bet amount of ${$(amount).pluralise("Mon", "s")} has been deducted from each of them.`); - // Wait for the duration of the bet. + // Wait for the duration of the bet. client.setTimeout(async () => { + // In debug mode, saving the storage will break the references, so you have to redeclare sender and receiver for it to actually save. + const sender = Storage.getUser(author.id); + const receiver = Storage.getUser(target.id); // [TODO: when D.JSv13 comes out, inline reply to clean up.] // When bet is over, give a vote to ask people their thoughts. - const voteMsg = await channel.send(`VOTE: do you think that <@${target.id}> has won the bet?\nhttps://discord.com/channels/${guild.id}/${channel.id}/${message.id}`); + const voteMsg = await channel.send(`VOTE: do you think that <@${target.id}> has won the bet?\nhttps://discord.com/channels/${guild!.id}/${channel.id}/${message.id}`); await voteMsg.react("✅"); await voteMsg.react("❌"); @@ -115,9 +122,11 @@ export const BetCommand = new Command({ // [Pertinence to make configurable on the fly.] { time: parseDuration("2m") } ).then(reactions => { - // Count votes - const ok = reactions.filter(reaction => reaction.emoji.name === "✅").size; - const no = reactions.filter(reaction => reaction.emoji.name === "❌").size; + // Count votes + const okReaction = reactions.get("✅"); + const noReaction = reactions.get("❌"); + const ok = okReaction ? (okReaction.count ?? 1) - 1 : 0; + const no = noReaction ? (noReaction.count ?? 1) - 1 : 0; if (ok > no) { receiver.money += amount * 2; @@ -132,11 +141,13 @@ export const BetCommand = new Command({ receiver.money += amount; channel.send(`By the people's votes, <@${target.id}> couldn't be determined to have won or lost the bet that <@${author.id}> had sent them.`); } + sender.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled -= amount; + receiver.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled -= amount; Storage.save(); }); }, duration); } - else + else await channel.send(`<@${target.id}> has rejected your bet, <@${author.id}>`); } } diff --git a/src/core/structures.ts b/src/core/structures.ts index 37b2194..6a4aa94 100644 --- a/src/core/structures.ts +++ b/src/core/structures.ts @@ -26,6 +26,7 @@ class User { public lastMonday: number; public timezone: number | null; // This is for the standard timezone only, not the daylight savings timezone public daylightSavingsRegion: "na" | "eu" | "sh" | null; + public quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled: number; constructor(data?: GenericJSON) { this.money = select(data?.money, 0, Number); @@ -35,6 +36,7 @@ class User { this.daylightSavingsRegion = /^((na)|(eu)|(sh))$/.test(data?.daylightSavingsRegion) ? data?.daylightSavingsRegion : null; + this.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled = select(data?.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled, 0, Number); } } diff --git a/src/events/ready.ts b/src/events/ready.ts index e3fe021..561d33a 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -1,7 +1,7 @@ import Event from "../core/event"; import {client} from "../index"; import $ from "../core/lib"; -import {Config} from "../core/structures"; +import {Config, Storage} from "../core/structures"; import {updateGlobalEmoteRegistry} from "../core/lib"; export default new Event<"ready">({ @@ -14,5 +14,17 @@ export default new Event<"ready">({ }); } updateGlobalEmoteRegistry(); + + // Run this setup block once to restore eco bet money in case the bot went down. (And I guess search the client for those users to let them know too.) + for (const id in Storage.users) { + const user = Storage.users[id]; + + if(user.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled > 0) { + client.users.cache.get(id)?.send(`Because my system either crashed or restarted while you had a pending bet, the total amount of money that you bet, which was \`${user.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled}\`, has been restored.`); + user.money += user.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled; + user.quoteUnquoteSoCalledInsuranceForEcoBetIfItEvenCanBeSoCalled = 0; + } + } + Storage.save(); } });