mirror of
https://github.com/Megghy/vtsuru.live.git
synced 2025-12-07 02:46:55 +08:00
fix lottery distinct
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user