feat: daily/weekly/monthly rewards
This commit is contained in:
parent
5f3ff1c3bf
commit
4850b94bcd
165
index.js
165
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue