fix lottery distinct

This commit is contained in:
2024-03-12 00:51:42 +08:00
parent 01ef6c09e5
commit ca3f7ca57e
3 changed files with 79 additions and 16 deletions

View File

@@ -414,6 +414,7 @@ export interface OpenLiveInfo {
export interface OpenLiveLotteryUserInfo { export interface OpenLiveLotteryUserInfo {
name: string name: string
uId: number uId: number
openId: string
level?: number level?: number
avatar: string avatar: string
fans_medal_level: number fans_medal_level: number

View File

@@ -5,6 +5,7 @@ import { QueryGetAPI } from '@/api/query'
import { LOTTERY_API_URL, TURNSTILE_KEY } from '@/data/constants' import { LOTTERY_API_URL, TURNSTILE_KEY } from '@/data/constants'
import { useLocalStorage, useStorage } from '@vueuse/core' import { useLocalStorage, useStorage } from '@vueuse/core'
import { format } from 'date-fns' import { format } from 'date-fns'
import { List } from 'linqts'
import { import {
NAvatar, NAvatar,
NButton, NButton,
@@ -151,6 +152,9 @@ async function getCommentsUsers() {
) )
.then((data) => { .then((data) => {
if (data.code == 200) { if (data.code == 200) {
data.data.users = new List(data.data.users).DistinctBy((u) => u.uId).ToArray()
data.data.total = data.data.users.length
originCommentUsers.value = JSON.parse(JSON.stringify(data.data)) originCommentUsers.value = JSON.parse(JSON.stringify(data.data))
commentUsers.value = data.data commentUsers.value = data.data
isCommentCountDown.value = false isCommentCountDown.value = false
@@ -177,6 +181,9 @@ async function getForwardUsers() {
) )
.then((data) => { .then((data) => {
if (data.code == 200) { if (data.code == 200) {
data.data.users = new List(data.data.users).DistinctBy((u) => u.uId).ToArray()
data.data.total = data.data.users.length
originForwardUsers.value = JSON.parse(JSON.stringify(data.data)) originForwardUsers.value = JSON.parse(JSON.stringify(data.data))
forwardUsers.value = data.data forwardUsers.value = data.data
isCommentCountDown.value = false isCommentCountDown.value = false
@@ -258,7 +265,12 @@ function onFinishLottery() {
h( h(
NSpace, NSpace,
{ vertical: true }, { vertical: true },
resultUsers.value?.map((user) => h(NSpace, null, [h(NAvatar, { src: user.avatar + '@32w_32h', imgProps: { referrerpolicy: 'no-referrer' } }), h('span', user.name)])), resultUsers.value?.map((user) =>
h(NSpace, null, [
h(NAvatar, { src: user.avatar + '@32w_32h', imgProps: { referrerpolicy: 'no-referrer' } }),
h('span', user.name),
]),
),
), ),
meta: format(new Date(), 'yyyy-MM-dd HH:mm:ss'), meta: format(new Date(), 'yyyy-MM-dd HH:mm:ss'),
onAfterLeave: () => { onAfterLeave: () => {
@@ -321,7 +333,12 @@ onUnmounted(() => {
<template #header-extra> <template #header-extra>
<NButton @click="showModal = true"> 历史记录 </NButton> <NButton @click="showModal = true"> 历史记录 </NButton>
</template> </template>
<NInput v-model:value="inputDynamic" placeholder="动态链接或直接输入动态Id" :status="inputDynamicId ? 'success' : 'warning'" :disabled="isLoading || isLottering" /> <NInput
v-model:value="inputDynamic"
placeholder="动态链接或直接输入动态Id"
:status="inputDynamicId ? 'success' : 'warning'"
:disabled="isLoading || isLottering"
/>
<NDivider style="margin: 10px 0 10px 0" /> <NDivider style="margin: 10px 0 10px 0" />
<NCard size="small" embedded title="选项"> <NCard size="small" embedded title="选项">
<template #header-extra> <template #header-extra>
@@ -346,7 +363,13 @@ onUnmounted(() => {
<NCollapseTransition> <NCollapseTransition>
<NInputGroup v-if="lotteryOption.needFanCard" style="max-width: 200px"> <NInputGroup v-if="lotteryOption.needFanCard" style="max-width: 200px">
<NInputGroupLabel> 最低粉丝牌等级 </NInputGroupLabel> <NInputGroupLabel> 最低粉丝牌等级 </NInputGroupLabel>
<NInputNumber v-model:value="lotteryOption.fanCardLevel" min="1" max="50" :default-value="1" :disabled="isLottering" /> <NInputNumber
v-model:value="lotteryOption.fanCardLevel"
min="1"
max="50"
:default-value="1"
:disabled="isLottering"
/>
</NInputGroup> </NInputGroup>
</NCollapseTransition> </NCollapseTransition>
</template> </template>
@@ -358,13 +381,26 @@ onUnmounted(() => {
</NCard> </NCard>
<br /> <br />
<NSpace justify="center" align="center"> <NSpace justify="center" align="center">
<NButton :disabled="!inputDynamicId || !isCommentCountDown || !token || isLottering" :loading="!token || isLoading" @click="onGet" type="primary"> 加载用户 </NButton> <NButton
<NCountdown v-if="!isCommentCountDown" :duration="(currentUsers?.createTime ?? -1) + 60000 - Date.now()" @finish="isCommentCountDown = true" /> :disabled="!inputDynamicId || !isCommentCountDown || !token || isLottering"
:loading="!token || isLoading"
@click="onGet"
type="primary"
>
加载用户
</NButton>
<NCountdown
v-if="!isCommentCountDown"
:duration="(currentUsers?.createTime ?? -1) + 60000 - Date.now()"
@finish="isCommentCountDown = true"
/>
</NSpace> </NSpace>
<br /> <br />
<NCard v-if="currentUsers" size="small"> <NCard v-if="currentUsers" size="small">
<NSpace justify="center"> <NSpace justify="center">
<NButton type="primary" @click="startLottery" :loading="isLottering" :disabled="isLotteried"> 开始抽取 </NButton> <NButton type="primary" @click="startLottery" :loading="isLottering" :disabled="isLotteried">
开始抽取
</NButton>
<NButton type="info" :disabled="isLottering || !isLotteried" @click="reset"> 重置 </NButton> <NButton type="info" :disabled="isLottering || !isLotteried" @click="reset"> 重置 </NButton>
</NSpace> </NSpace>
<NDivider style="margin: 10px 0 10px 0"> {{ validUsers?.length }} </NDivider> <NDivider style="margin: 10px 0 10px 0"> {{ validUsers?.length }} </NDivider>
@@ -373,12 +409,34 @@ onUnmounted(() => {
<NCard size="small" :title="item.name" style="height: 155px"> <NCard size="small" :title="item.name" style="height: 155px">
<template #header> <template #header>
<NSpace align="center" vertical :size="5"> <NSpace align="center" vertical :size="5">
<NAvatar round lazy borderd :size="64" :src="item.avatar + '@64w_64h'" :img-props="{ referrerpolicy: 'no-referrer' }" style="box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2)" /> <NAvatar
round
lazy
borderd
:size="64"
:src="item.avatar + '@64w_64h'"
:img-props="{ referrerpolicy: 'no-referrer' }"
style="box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2)"
/>
<NSpace> <NSpace>
<NTag v-if="item.isVIP" size="tiny" round :color="{ color: '#fb7299', textColor: 'white', borderColor: 'white' }"> 大会员 </NTag> <NTag
v-if="item.isVIP"
size="tiny"
round
:color="{ color: '#fb7299', textColor: 'white', borderColor: 'white' }"
>
大会员
</NTag>
<NTooltip> <NTooltip>
<template #trigger> <template #trigger>
<NTag v-if="item.level" size="tiny" :color="{ color: getLevelColor(item.level), textColor: 'white', borderColor: 'white' }" :borderd="false"> LV {{ item.level }} </NTag> <NTag
v-if="item.level"
size="tiny"
:color="{ color: getLevelColor(item.level), textColor: 'white', borderColor: 'white' }"
:borderd="false"
>
LV {{ item.level }}
</NTag>
</template> </template>
用户等级 用户等级
</NTooltip> </NTooltip>
@@ -411,7 +469,9 @@ onUnmounted(() => {
<NTime :time="item.time" /> <NTime :time="item.time" />
</template> </template>
<template #header-extra> <template #header-extra>
<NButton type="error" size="small" @click="lotteryHistory.splice(lotteryHistory.indexOf(item), 1)"> 删除 </NButton> <NButton type="error" size="small" @click="lotteryHistory.splice(lotteryHistory.indexOf(item), 1)">
删除
</NButton>
</template> </template>
<NSpace vertical> <NSpace vertical>
<NSpace v-for="user in item.users" :key="user.uId"> <NSpace v-for="user in item.users" :key="user.uId">

View File

@@ -121,10 +121,10 @@ function updateUsers() {
}) })
} }
function addUser(user: OpenLiveLotteryUserInfo, danmu: any) { function addUser(user: OpenLiveLotteryUserInfo, danmu: any) {
if (originUsers.value.find((u) => u.uId == user.uId) || !isStartLottery.value) { if (originUsers.value.find((u) => u.openId == user.openId) || !isStartLottery.value) {
return return
} }
if (isUserValid(user, danmu)) { if (isUserValid(user, danmu) && !originUsers.value.find((u) => u.openId == user.openId)) {
originUsers.value.push(user) originUsers.value.push(user)
currentUsers.value.push(user) currentUsers.value.push(user)
console.log(`[OPEN-LIVE-Lottery] ${user.name} 添加到队列中`) console.log(`[OPEN-LIVE-Lottery] ${user.name} 添加到队列中`)
@@ -267,8 +267,8 @@ function clear() {
updateUsers() updateUsers()
} }
function removeUser(user: OpenLiveLotteryUserInfo) { function removeUser(user: OpenLiveLotteryUserInfo) {
currentUsers.value = currentUsers.value.filter((u) => u.uId != user.uId) currentUsers.value = currentUsers.value.filter((u) => u.openId != user.openId)
originUsers.value = originUsers.value.filter((u) => u.uId != user.uId) originUsers.value = originUsers.value.filter((u) => u.openId != user.openId)
updateUsers() updateUsers()
} }
@@ -278,6 +278,7 @@ function onDanmaku(data: DanmakuInfo, command: any) {
addUser( addUser(
{ {
uId: data.uid, uId: data.uid,
openId: data.open_id,
name: data.uname, name: data.uname,
avatar: data.uface, avatar: data.uface,
fans_medal_level: data.fans_medal_level, fans_medal_level: data.fans_medal_level,
@@ -294,6 +295,7 @@ function onGift(data: GiftInfo, command: any) {
addUser( addUser(
{ {
uId: data.uid, uId: data.uid,
openId: data.open_id,
name: data.uname, name: data.uname,
avatar: data.uface, avatar: data.uface,
fans_medal_level: data.fans_medal_level, fans_medal_level: data.fans_medal_level,
@@ -496,7 +498,7 @@ onUnmounted(() => {
</NSpace> </NSpace>
<NDivider style="margin: 10px 0 10px 0"> {{ currentUsers?.length }} </NDivider> <NDivider style="margin: 10px 0 10px 0"> {{ currentUsers?.length }} </NDivider>
<NGrid v-if="currentUsers.length > 0" cols="1 500:2 800:3 1000:4" :x-gap="12" :y-gap="8"> <NGrid v-if="currentUsers.length > 0" cols="1 500:2 800:3 1000:4" :x-gap="12" :y-gap="8">
<NGridItem v-for="item in currentUsers" v-bind:key="item.uId"> <NGridItem v-for="item in currentUsers" v-bind:key="item.openId">
<NCard size="small" :title="item.name" style="height: 155px" embedded> <NCard size="small" :title="item.name" style="height: 155px" embedded>
<template #header> <template #header>
<NSpace align="center" vertical :size="5"> <NSpace align="center" vertical :size="5">
@@ -558,7 +560,7 @@ onUnmounted(() => {
</NButton> </NButton>
</template> </template>
<NSpace vertical> <NSpace vertical>
<NSpace v-for="user in item.users" :key="user.uId"> <NSpace v-for="user in item.users" :key="user.openId">
<NAvatar round lazy :src="user.avatar + '@64w_64h'" :img-props="{ referrerpolicy: 'no-referrer' }" /> <NAvatar round lazy :src="user.avatar + '@64w_64h'" :img-props="{ referrerpolicy: 'no-referrer' }" />
{{ user.name }} {{ user.name }}
</NSpace> </NSpace>