diff --git a/apps/idlebiz/src/game/multiplier.ts b/apps/idlebiz/src/game/multiplier.ts new file mode 100644 index 0000000..cefedb9 --- /dev/null +++ b/apps/idlebiz/src/game/multiplier.ts @@ -0,0 +1,69 @@ +import { + MultiplierSource, + type MultiplierType, + type PermanentMultiplier, + type Profile, + type TemporaryMultiplier, +} from "@/game/types"; +import { mongo } from "@/lib/mongo"; + +export async function addTemporaryMultiplier( + discordId: string, + value: number, + duration: number, + source: MultiplierSource, + type: MultiplierType +) { + const now = new Date(); + const expiredAt = new Date(now.getTime() + duration); + + const multiplier: TemporaryMultiplier = { + value, + source, + type, + activatedAt: now, + expiredAt, + }; + + const client = await mongo(); + const db = client.db(); + + return await db + .collection("profiles") + .updateOne({ discordId: discordId }, { $push: { "multipliers.temporary": multiplier } }); +} + +export async function addPermanentMultiplier( + discordId: string, + value: number, + source: MultiplierSource, + type: MultiplierType +) { + const now = new Date(); + + const multiplier: PermanentMultiplier = { + value, + source, + type, + activatedAt: now, + }; + + const client = await mongo(); + const db = client.db(); + + return await db + .collection("profiles") + .updateOne({ discordId: discordId }, { $push: { "multipliers.permanent": multiplier } }); +} + +export async function updateReferralBonusMultiplier(discordId: string, value: number) { + const client = await mongo(); + const db = client.db(); + + return await db + .collection("profiles") + .updateOne( + { discordId: discordId, "multipliers.permanent.source": MultiplierSource.ReferralBonus }, + { $set: { "multipliers.permanent.$.value": value } } + ); +} diff --git a/apps/idlebiz/src/lib/types/building.ts b/apps/idlebiz/src/game/types/building.ts similarity index 100% rename from apps/idlebiz/src/lib/types/building.ts rename to apps/idlebiz/src/game/types/building.ts diff --git a/apps/idlebiz/src/game/types/index.ts b/apps/idlebiz/src/game/types/index.ts new file mode 100644 index 0000000..7bd18d1 --- /dev/null +++ b/apps/idlebiz/src/game/types/index.ts @@ -0,0 +1,5 @@ +export * from "./material"; +export * from "./building"; +export * from "./referral"; +export * from "./multiplier"; +export * from "./profile"; diff --git a/apps/idlebiz/src/lib/types/material.ts b/apps/idlebiz/src/game/types/material.ts similarity index 100% rename from apps/idlebiz/src/lib/types/material.ts rename to apps/idlebiz/src/game/types/material.ts diff --git a/apps/idlebiz/src/game/types/multiplier.ts b/apps/idlebiz/src/game/types/multiplier.ts new file mode 100644 index 0000000..3dfeea1 --- /dev/null +++ b/apps/idlebiz/src/game/types/multiplier.ts @@ -0,0 +1,22 @@ +export enum MultiplierSource { + DailyReward = "dailyReward", + ReferralBonus = "referralBonus", + ReferralClaim = "referralClaim", +} + +export enum MultiplierType { + MaterialProduction = "materialProduction", +} + +type Multiplier = { + value: number; + source: MultiplierSource; + type: MultiplierType; + activatedAt: Date; +}; + +export type PermanentMultiplier = Multiplier; + +export type TemporaryMultiplier = Multiplier & { + expiredAt: Date; +}; diff --git a/apps/idlebiz/src/game/types/profile.ts b/apps/idlebiz/src/game/types/profile.ts new file mode 100644 index 0000000..58d348c --- /dev/null +++ b/apps/idlebiz/src/game/types/profile.ts @@ -0,0 +1,12 @@ +// TODO +import type { PermanentMultiplier, TemporaryMultiplier } from "@/game/types/multiplier"; + +export type Profile = { + discordId: string; + multipliers: ProfileMultipliers; +}; + +export type ProfileMultipliers = { + permanent: PermanentMultiplier[]; + temporary: TemporaryMultiplier[]; +}; diff --git a/apps/idlebiz/src/game/types/referral.ts b/apps/idlebiz/src/game/types/referral.ts new file mode 100644 index 0000000..2e99973 --- /dev/null +++ b/apps/idlebiz/src/game/types/referral.ts @@ -0,0 +1,6 @@ +export type Referral = { + userId: string; + ownerId: string; + code: string; + createdAt: Date; +}; diff --git a/apps/idlebiz/src/lib/types/index.ts b/apps/idlebiz/src/lib/types/index.ts deleted file mode 100644 index 03f121a..0000000 --- a/apps/idlebiz/src/lib/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./material"; -export * from "./building"; diff --git a/apps/idlebiz/src/setup.ts b/apps/idlebiz/src/setup.ts index 7747933..d32a648 100644 --- a/apps/idlebiz/src/setup.ts +++ b/apps/idlebiz/src/setup.ts @@ -1,6 +1,6 @@ +import type { Building } from "@/game/types/building"; +import type { Material } from "@/game/types/material"; import { mongo } from "@/lib/mongo"; -import type { Building } from "@/lib/types/building"; -import type { Material } from "@/lib/types/material"; import ms from "ms"; (async () => {