From 4850b94bcdd5c1c2767dfb22626368ba95ff7f91 Mon Sep 17 00:00:00 2001 From: DaInfLoop Date: Sat, 22 Jun 2024 19:45:37 +0100 Subject: [PATCH] feat: daily/weekly/monthly rewards --- index.js | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/index.js b/index.js index 0958491..1fc979f 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,7 @@ async function initializeUser(slackUserId) { if (a.length === 0) { a = await sql`INSERT INTO users (slack_id) VALUES (${slackUserId}) RETURNING *;` + await sql`INSERT INTO cooldowns (slack_id) VALUES (${slackUserId});` } return a[0]; @@ -982,6 +983,170 @@ app.command('/viewopponents', async (ctx) => { } }); +function getTimeDifference(date1, date2) { + // Ensure both dates are Date objects + const start = new Date(date1); + const end = new Date(date2); + + // Calculate the difference in milliseconds + const diff = Math.abs(end - start); + + // Calculate the difference in weeks, days, hours, minutes, and seconds + const weeks = Math.floor(diff / (1000 * 60 * 60 * 24 * 7)); + const days = Math.floor(diff / (1000 * 60 * 60 * 24)) % 7; + const hours = Math.floor(diff / (1000 * 60 * 60)) % 24; + const minutes = Math.floor(diff / (1000 * 60)) % 60; + const seconds = Math.floor(diff / 1000) % 60; + + // Determine which unit to use for the output + if (weeks > 0) { + return `${weeks} Week${weeks > 1 ? 's' : ''}`; + } else if (days > 0) { + return `${days} Day${days > 1 ? 's' : ''}`; + } else if (hours > 0) { + return `${hours} Hour${hours > 1 ? 's' : ''}`; + } else if (minutes > 0) { + return `${minutes} Minute${minutes > 1 ? 's' : ''}`; + } else { + return `${seconds} Second${seconds > 1 ? 's' : ''}`; + } +} + +app.command('/b-daily', async (ctx) => { + await ctx.ack(); + const [ cooldown ] = await sql`SELECT * FROM cooldowns WHERE slack_id = ${ctx.context.userId};` + const user = await initializeUser(ctx.context.userId) + const slackUser = (await ctx.client.users.info({ user: ctx.context.userId })).user.profile; + + const now = new Date(); + + if (!cooldown.daily || (cooldown.daily.getTime() <= now.getTime())) { + const cshards = Math.floor(Math.random() * 10) + 1; + const spoints = Math.floor(Math.random() * 5) + 1; + + + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* Oh ${slackUser.display_name_normalized}, apologies for the wait. Here is your reward for today.\n\n> ${cshards} Creation Shards\n> ${spoints} Skill Points` + } + } + ] + }) + + await sql`UPDATE users SET cshards = ${user.cshards + cshards}, spoints = ${user.spoints + spoints} WHERE slack_id = ${ctx.context.userId};` + + await sql`UPDATE cooldowns SET daily = ${new Date(now.getTime() + 24 * 60 * 60 * 1000)};` + } else { + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* Apologies battler. Unfortunately you must wait *${getTimeDifference(now, cooldown.daily)}* before you can collect your next daily reward.` + } + } + ] + }) + } +}) + +app.command('/b-weekly', async (ctx) => { + await ctx.ack(); + const [ cooldown ] = await sql`SELECT * FROM cooldowns WHERE slack_id = ${ctx.context.userId};` + const user = await initializeUser(ctx.context.userId) + const slackUser = (await ctx.client.users.info({ user: ctx.context.userId })).user.profile; + + const now = new Date(); + + if (!cooldown.weekly || (cooldown.weekly.getTime() <= now.getTime())) { + const cshards = Math.floor(Math.random() * 20) + 1; + const dshards = Math.floor(Math.random() * 15) + 1; + const spoints = Math.floor(Math.random() * 10) + 1; + + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* It's that time again ${slackUser.display_name_normalized}. Enjoy your weekly reward.\n\n> ${cshards} Creation Shards\n> ${dshards} Destruction Shards\n> ${spoints} Skill Points` + } + } + ] + }) + + await sql`UPDATE users SET cshards = ${user.cshards + cshards}, dshards = ${user.dshards + dshards}, spoints = ${user.spoints + spoints} WHERE slack_id = ${ctx.context.userId};` + + await sql`UPDATE cooldowns SET weekly = ${new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000)};` + } else { + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* Apologies battler. Unfortunately you must wait *${getTimeDifference(now, cooldown.weekly)}* before you can collect your next weekly reward.` + } + } + ] + }) + } +}) + +app.command('/b-monthly', async (ctx) => { + await ctx.ack(); + const [ cooldown ] = await sql`SELECT * FROM cooldowns WHERE slack_id = ${ctx.context.userId};` + const user = await initializeUser(ctx.context.userId) + const slackUser = (await ctx.client.users.info({ user: ctx.context.userId })).user.profile; + + const now = new Date(); + + if (!cooldown.monthly || (cooldown.monthly.getTime() <= now.getTime())) { + const cshards = Math.floor(Math.random() * 30) + 1; + const dshards = Math.floor(Math.random() * 25) + 1; + const spoints = Math.floor(Math.random() * 15) + 1; + + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* Another month, another reward. You have my appreciation ${slackUser.display_name_normalized}.\n\n> ${cshards} Creation Shards\n> ${dshards} Destruction Shards\n> ${spoints} Skill Points` + } + } + ] + }) + + await sql`UPDATE users SET cshards = ${user.cshards + cshards}, dshards = ${user.dshards + dshards}, spoints = ${user.spoints + spoints} WHERE slack_id = ${ctx.context.userId};` + + await sql`UPDATE cooldowns SET monthly = ${new Date(now.getTime() + 30 * 7 * 24 * 60 * 60 * 1000)};` + } else { + ctx.respond({ + response_type: 'ephemeral', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: `*Battle Master:* Apologies battler. Unfortunately you must wait *${getTimeDifference(now, cooldown.monthly)}* before you can collect your next monthly reward.` + } + } + ] + }) + } +}) + ; (async () => { await app.start(process.env.PORT);