From 25ce0fe1ec14c7a56bd8c01ceff2fe6836d05538 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Thu, 13 Jun 2024 03:10:11 +0200 Subject: [PATCH] Randomizing campaigns by entity to ensure equal exposure. --- components/scenes/scenes.vue | 1 + src/campaigns.js | 24 ++++++++++++++++++++---- static | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/components/scenes/scenes.vue b/components/scenes/scenes.vue index c16f159..1b78212 100644 --- a/components/scenes/scenes.vue +++ b/components/scenes/scenes.vue @@ -340,6 +340,7 @@ function updateFilter(prop, value, reload = true) { display: flex; justify-content: space-between; align-items: center; + flex-shrink: 0; margin-bottom: .5rem; } diff --git a/src/campaigns.js b/src/campaigns.js index 7cbd061..0352456 100644 --- a/src/campaigns.js +++ b/src/campaigns.js @@ -57,12 +57,28 @@ export async function getRandomCampaign(options = {}, context = {}) { return true; }); - const primaryCampaigns = validCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]); + const campaignsByEntityId = validCampaigns.reduce((acc, campaign) => { + const entityId = campaign.entity.parent?.id || campaign.entity.id; + + if (!acc[entityId]) { + acc[entityId] = []; + } + + acc[entityId].push(campaign); + + return acc; + }, {}); + + // randomize entities first to ensure fair exposure for entities with fewer banners + const entityIds = Object.keys(campaignsByEntityId); + const randomEntityCampaigns = campaignsByEntityId[entityIds[crypto.randomInt(entityIds.length)]]; + + const primaryCampaigns = randomEntityCampaigns.filter((campaign) => campaign.entity.id === options.entityIds?.[0]); if (validCampaigns.length > 0) { - const randomCampaign = primaryCampaigns.length > 0 - ? primaryCampaigns[crypto.randomInt(primaryCampaigns.length)] - : validCampaigns[crypto.randomInt(validCampaigns.length)]; + const randomCampaign = (primaryCampaigns.length > 0 ? primaryCampaigns[crypto.randomInt(primaryCampaigns.length)] : null) + || (randomEntityCampaigns.length > 0 ? randomEntityCampaigns[crypto.randomInt(randomEntityCampaigns.length)] : null) + || validCampaigns[crypto.randomInt(validCampaigns.length)]; return randomCampaign; } diff --git a/static b/static index 6289c5f..76242fe 160000 --- a/static +++ b/static @@ -1 +1 @@ -Subproject commit 6289c5ff5707aac96d306f29805c322393164d3a +Subproject commit 76242feb7b3e75bcc581d9b19ee509c6e01a87aa