summaryrefslogtreecommitdiff
path: root/src/client/components/global
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-05-07 14:22:13 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-05-07 14:22:13 +0900
commitb60f9fbc0089ade0b9dce3902489917ca8a57d42 (patch)
tree535037a7c4afd2a4d1d0240a9c2720b3c156848c /src/client/components/global
parent12.80.3 (diff)
downloadsharkey-b60f9fbc0089ade0b9dce3902489917ca8a57d42.tar.gz
sharkey-b60f9fbc0089ade0b9dce3902489917ca8a57d42.tar.bz2
sharkey-b60f9fbc0089ade0b9dce3902489917ca8a57d42.zip
Improve ad
Diffstat (limited to 'src/client/components/global')
-rw-r--r--src/client/components/global/ad.vue45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/client/components/global/ad.vue b/src/client/components/global/ad.vue
index f88a1d2026..e340f846ee 100644
--- a/src/client/components/global/ad.vue
+++ b/src/client/components/global/ad.vue
@@ -19,7 +19,7 @@
<script lang="ts">
import { defineComponent, ref } from 'vue';
-import { instance } from '@client/instance';
+import { Instance, instance } from '@client/instance';
import { host } from '@client/config';
import MkButton from '@client/components/ui/button.vue';
@@ -45,32 +45,45 @@ export default defineComponent({
showMenu.value = !showMenu.value;
};
- let ad = null;
+ const choseAd = (): Instance['ads'][number] | null => {
+ if (props.specify) {
+ return props.specify as Instance['ads'][number];
+ }
- if (props.specify) {
- ad = props.specify;
- } else {
let ads = instance.ads.filter(ad => props.prefer.includes(ad.place));
if (ads.length === 0) {
ads = instance.ads.filter(ad => ad.place === 'square');
}
- const high = ads.filter(ad => ad.priority === 'high');
- const middle = ads.filter(ad => ad.priority === 'middle');
- const low = ads.filter(ad => ad.priority === 'low');
+ const lowPriorityAds = ads.filter(ad => ad.ratio === 0);
+ ads = ads.filter(ad => ad.ratio !== 0);
- if (high.length > 0) {
- ad = high[Math.floor(Math.random() * high.length)];
- } else if (middle.length > 0) {
- ad = middle[Math.floor(Math.random() * middle.length)];
- } else if (low.length > 0) {
- ad = low[Math.floor(Math.random() * low.length)];
+ if (ads.length === 0) {
+ if (lowPriorityAds.length !== 0) {
+ return lowPriorityAds[Math.floor(Math.random() * lowPriorityAds.length)];
+ } else {
+ return null;
+ }
}
- }
+
+ const totalFactor = ads.reduce((a, b) => a + b.ratio, 0);
+ const r = Math.random() * totalFactor;
+
+ let stackedFactor = 0;
+ for (const ad of ads) {
+ if (r >= stackedFactor && r <= stackedFactor + ad.ratio) {
+ return ad;
+ } else {
+ stackedFactor += ad.ratio;
+ }
+ }
+
+ return null;
+ };
return {
- ad,
+ ad: choseAd(),
showMenu,
toggleMenu,
host,