From 77c7613db10bdd6657cdfcd89a37599e58dd1745 Mon Sep 17 00:00:00 2001 From: tobinio Date: Sat, 26 Oct 2024 12:46:43 +0200 Subject: [PATCH] revenue stats --- README.md | 1 - app/pages/charts.vue | 20 ++++++++++++++++--- server/api/stats/time/revenue.ts | 12 ++++++++++++ server/utils/export/revenue.ts | 31 ++++++++++++++++++++++++++++++ server/utils/processing/revenue.ts | 28 +++++++++++++++++++++++++++ utils/modrinthFetch.ts | 5 +++++ 6 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 server/api/stats/time/revenue.ts create mode 100644 server/utils/export/revenue.ts create mode 100644 server/utils/processing/revenue.ts diff --git a/README.md b/README.md index 11d5fd4..a6dff19 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ a Page to view some global statistics about [Modrinth](https://modrinth.com/) ### Planned Features * data on specific projects - Same graphs as for mods but only showing a single project -* revenue - https://api.modrinth.com/v3/payout/platform_revenue ### .env diff --git a/app/pages/charts.vue b/app/pages/charts.vue index e148401..f8ed085 100644 --- a/app/pages/charts.vue +++ b/app/pages/charts.vue @@ -33,11 +33,25 @@ const isGlobalStats = computed(() => { ); }); +const isRevenueStats = computed(() => { + return ["revenue"].includes( + projectType.value, + ); +}); + +const isGroupData = computed(() => { + return time.value === 'current' && !isGlobalStats.value && !isRevenueStats.value; +}) + const url = computed(() => { if (isGlobalStats.value) { return "/api/stats/time/global"; } + if (isRevenueStats.value) { + return "/api/stats/time/revenue"; + } + return time.value === "current" ? "/api/stats/projects" : "/api/stats/time/projects"; @@ -77,8 +91,8 @@ onMounted(() => {
- - + + @@ -94,7 +108,7 @@ onMounted(() => {
- +
diff --git a/server/api/stats/time/revenue.ts b/server/api/stats/time/revenue.ts new file mode 100644 index 0000000..d0b2c71 --- /dev/null +++ b/server/api/stats/time/revenue.ts @@ -0,0 +1,12 @@ +import type { GlobalStatCategory } from "~~/server/utils/processing/global/types"; + +type QueryData = { + type: GlobalStatCategory; +}; + +export default defineCachedEventHandler( + async (event): Promise => { + return exportRevenueStatsOverTime(); + }, + { maxAge: 60 * 60 /* 1 hour */ }, +); diff --git a/server/utils/export/revenue.ts b/server/utils/export/revenue.ts new file mode 100644 index 0000000..d301b3a --- /dev/null +++ b/server/utils/export/revenue.ts @@ -0,0 +1,31 @@ +import type { GlobalStats } from "~~/server/utils/processing/global/types"; +import { getGlobalStats } from "~~/server/utils/storage"; +import { dateToFormatted, keyToDate } from "~~/utils/date"; +import { getRevenue } from "~~/server/utils/processing/revenue"; + +export async function exportRevenueStatsOverTime(): Promise { + const statsOverTime: StatExport = { + labels: [], + data: [ + { + label: "creator", + backgroundColor: "#7ab0ee", + data: [], + }, + { + label: "modrinth", + backgroundColor: "#a5e388", + data: [], + }, + ], + }; + + for (const revenue of await getRevenue()) { + statsOverTime.labels.splice(0, 0, dateToFormatted(revenue.time)); + + statsOverTime.data[0].data.splice(0, 0, revenue.creator_revenue); + statsOverTime.data[1].data.splice(0, 0, revenue.modrinth_revenue); + } + + return statsOverTime; +} diff --git a/server/utils/processing/revenue.ts b/server/utils/processing/revenue.ts new file mode 100644 index 0000000..28ad9b0 --- /dev/null +++ b/server/utils/processing/revenue.ts @@ -0,0 +1,28 @@ +import revenue from "~~/server/api/stats/time/revenue"; +import { $modrinthV3Fetch } from "~~/utils/modrinthFetch"; + +export async function getRevenue(): Promise { + type RawRevenue = { + time: number; + revenue: string; + creator_revenue: string; + }; + + const data = await $modrinthV3Fetch<{ data: RawRevenue[] }>( + "/payout/platform_revenue", + ); + + return data.data.map((value) => { + return { + time: new Date(value.time * 1000), + modrinth_revenue: Number(value.revenue) - Number(value.creator_revenue), + creator_revenue: Number(value.creator_revenue), + }; + }); +} + +export type Revenue = { + time: Date; + modrinth_revenue: number; + creator_revenue: number; +}; diff --git a/utils/modrinthFetch.ts b/utils/modrinthFetch.ts index cc276c6..1ea78f2 100644 --- a/utils/modrinthFetch.ts +++ b/utils/modrinthFetch.ts @@ -4,3 +4,8 @@ export const $modrinthFetch = ofetch.create({ headers: { "User-Agent": "ToBinio/modrinth-statistics" }, baseURL: "https://api.modrinth.com/v2/", }); + +export const $modrinthV3Fetch = ofetch.create({ + headers: { "User-Agent": "ToBinio/modrinth-statistics" }, + baseURL: "https://api.modrinth.com/v3/", +}); -- 2.51.2