danmaku support openId

This commit is contained in:
2024-03-29 11:59:05 +08:00
parent 2c6bf5beac
commit cbbf308224
5 changed files with 33 additions and 21 deletions

View File

@@ -545,6 +545,7 @@ export interface DanmakuModel {
price: number | null price: number | null
isEmoji: boolean isEmoji: boolean
num: number num: number
ouId: string
} }
export interface ResponseFeedbackModel { export interface ResponseFeedbackModel {
message: string message: string

View File

@@ -33,6 +33,7 @@ import {
NSwitch, NSwitch,
NTag, NTag,
NTooltip, NTooltip,
useMessage,
} from 'naive-ui' } from 'naive-ui'
import { computed, nextTick, onMounted, ref, watch } from 'vue' import { computed, nextTick, onMounted, ref, watch } from 'vue'
import LiveInfoContainer from './LiveInfoContainer.vue' import LiveInfoContainer from './LiveInfoContainer.vue'
@@ -43,7 +44,7 @@ enum RankType {
Paid, Paid,
} }
interface RankInfo { interface RankInfo {
uId: number ouId: string
uName: string uName: string
Paid: number Paid: number
Danmakus: number Danmakus: number
@@ -106,7 +107,7 @@ const {
to = 'space', to = 'space',
} = defineProps<Props>() } = defineProps<Props>()
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'onClickName', uId: number): boolean (e: 'onClickName', uId: number, ouId: string): boolean
}>() }>()
defineExpose({ defineExpose({
InsertDanmakus, InsertDanmakus,
@@ -146,19 +147,24 @@ const existEnterMessage = ref(false)
const exportType = ref<'json' | 'xml' | 'csv'>('json') const exportType = ref<'json' | 'xml' | 'csv'>('json')
const onlyExportFilteredDanmakus = ref(false) const onlyExportFilteredDanmakus = ref(false)
const isExporting = ref(false) const isExporting = ref(false)
const message = useMessage()
function OnNameClick(uId: number) { function OnNameClick(uId: number, ouId: string) {
if (isInModal) { if (isInModal) {
emit('onClickName', uId) emit('onClickName', uId, ouId)
return return
} }
switch (to) { switch (to) {
case 'userDanmakus': { case 'userDanmakus': {
userDanmakus.value = currentDanmakus.filter((d) => d.uId == uId) userDanmakus.value = currentDanmakus.filter((d) => (d.uId ? d.uId == uId : d.ouId == ouId))
showModal.value = true showModal.value = true
break break
} }
case 'space': { case 'space': {
if (!uId) {
message.error('从开放平台获取的弹幕已不再支持前往用户空间')
return
}
showModal.value = false showModal.value = false
nextTick(() => { nextTick(() => {
window.open('https://space.bilibili.com/' + uId, '_blank') window.open('https://space.bilibili.com/' + uId, '_blank')
@@ -204,15 +210,16 @@ function OnRank(isRank: boolean) {
function OnRankDirect(type: RankType, refresh: boolean, orderByDescending = true) { function OnRankDirect(type: RankType, refresh: boolean, orderByDescending = true) {
if (refresh) { if (refresh) {
var rank = {} as { var rank = {} as {
[uId: number]: RankInfo [ouId: string]: RankInfo
} }
currentDanmakus.forEach((danmaku) => { currentDanmakus.forEach((danmaku) => {
if (danmaku.uId in rank) { if (danmaku.ouId in rank) {
if (danmaku.type == EventDataTypes.Message) rank[danmaku.uId].Danmakus++ if (danmaku.type == EventDataTypes.Message) rank[danmaku.ouId].Danmakus++
rank[danmaku.uId].Paid += danmaku.price ?? 0 rank[danmaku.ouId].Paid += danmaku.price ?? 0
} else { } else {
rank[danmaku.uId] = { rank[danmaku.ouId] = {
uId: danmaku.uId, //uId: danmaku.uId,
ouId: danmaku.ouId,
uName: danmaku.uName, uName: danmaku.uName,
Paid: danmaku.price ?? 0, Paid: danmaku.price ?? 0,
Danmakus: danmaku.type == EventDataTypes.Message ? 1 : 0, Danmakus: danmaku.type == EventDataTypes.Message ? 1 : 0,
@@ -318,7 +325,7 @@ function GetFilteredDanmakus(targetDanmakus?: DanmakuModel[]) {
if (orderDecreasing.value) tempDanmakus = tempDanmakus.reverse() if (orderDecreasing.value) tempDanmakus = tempDanmakus.reverse()
var index = 0 var index = 0
tempDanmakus.forEach((d) => { tempDanmakus.forEach((d) => {
d.id = `${d.uId}_${d.time}_${index}` d.id = `${d.ouId}_${d.time}_${index}`
index++ index++
}) })
return tempDanmakus return tempDanmakus
@@ -563,14 +570,14 @@ onMounted(() => {
</NRadioGroup> </NRadioGroup>
<NDivider /> <NDivider />
<NList :show-divider="false" style="background-color: rgba(255, 255, 255, 0)"> <NList :show-divider="false" style="background-color: rgba(255, 255, 255, 0)">
<NListItem v-for="user in currentRankInfo" v-bind:key="user.uId"> <NListItem v-for="user in currentRankInfo" v-bind:key="user.ouId">
<span style="display: flex; align-items: center"> <span style="display: flex; align-items: center">
<NAvatar round size="small" :style="GetRankIndexColor(user.Index)"> <NAvatar round size="small" :style="GetRankIndexColor(user.Index)">
{{ user.Index }} {{ user.Index }}
</NAvatar> </NAvatar>
<NDivider vertical /> <NDivider vertical />
<NButton text type="info" @click="OnNameClick(user.uId)"> <NButton text type="info" @click="OnNameClick(accountInfo?.biliId ?? 0, user.ouId)">
<NTooltip v-if="user.uId == accountInfo?.biliId"> <NTooltip v-if="user.uName == accountInfo?.name">
<template #trigger> <template #trigger>
<NTag size="small" type="warning" style="cursor: pointer"> <NTag size="small" type="warning" style="cursor: pointer">
{{ user.uName }} {{ user.uName }}

View File

@@ -39,7 +39,7 @@ const {
height?: number height?: number
}>() }>()
defineEmits<{ defineEmits<{
(e: 'onClickName', uId: number): void (e: 'onClickName', uId: number, ouId: string): void
}>() }>()
</script> </script>
@@ -69,7 +69,7 @@ defineEmits<{
</template> </template>
{{ format(danmaku.time, 'yyyy-MM-dd HH:mm:ss') }} {{ format(danmaku.time, 'yyyy-MM-dd HH:mm:ss') }}
</NTooltip> </NTooltip>
<NButton v-if="showName" text type="primary" @click="$emit('onClickName', danmaku.uId)"> <NButton v-if="showName" text type="primary" @click="$emit('onClickName', danmaku.uId, danmaku.ouId)">
<NTag v-if="danmaku.uId == accountInfo?.biliId" size="small" type="warning"> <NTag v-if="danmaku.uId == accountInfo?.biliId" size="small" type="warning">
{{ danmaku.uName }} {{ danmaku.uName }}
</NTag> </NTag>
@@ -110,7 +110,7 @@ defineEmits<{
</span> </span>
<span> <span>
<template v-if="showName && danmaku.uId != -1"> <template v-if="showName && danmaku.uId != -1">
<NButton class="danmaku-item" text type="info" @click="$emit('onClickName', danmaku.uId)"> <NButton class="danmaku-item" text type="info" @click="$emit('onClickName', danmaku.uId, danmaku.ouId)">
<NTooltip v-if="danmaku.uId == accountInfo?.biliId"> <NTooltip v-if="danmaku.uId == accountInfo?.biliId">
<template #trigger> <template #trigger>
<NTag size="small" type="warning" style="cursor: pointer"> <NTag size="small" type="warning" style="cursor: pointer">

View File

@@ -53,7 +53,7 @@ onActivated(async () => {
<template> <template>
<NSpin v-if="isLoading" show /> <NSpin v-if="isLoading" show />
<template v-else> <template v-else>
<NButton @click="router.go(-1)" text> <NButton @click="router.push({ name: 'manage-live' })" text>
{{ '< 返回' }} {{ '< 返回' }}
</NButton> </NButton>
<DanmakuContainer <DanmakuContainer

View File

@@ -79,10 +79,14 @@ async function update() {
if (!visiable.value || !active.value) return if (!visiable.value || !active.value) return
const r = await get() const r = await get()
if (r) { if (r) {
const isCountChange = originSongs.value.length != r.songs.length
originSongs.value = r.songs.sort((a, b) => { originSongs.value = r.songs.sort((a, b) => {
return b.createAt - a.createAt return b.createAt - a.createAt
}) })
settings.value = r.setting settings.value = r.setting
if (isCountChange) {
key.value = Date.now()
}
} }
} }
@@ -113,7 +117,7 @@ onUnmounted(() => {
<div class="live-request-background" v-bind="$attrs"> <div class="live-request-background" v-bind="$attrs">
<p class="live-request-header">{{ settings.obsTitle ?? '点播' }}</p> <p class="live-request-header">{{ settings.obsTitle ?? '点播' }}</p>
<NDivider class="live-request-divider"> <NDivider class="live-request-divider">
<p class="live-request-header-count">已有 {{ activeSongs.length ?? 0 }} </p> <p class="live-request-header-count">已有 {{ activeSongs.length ?? 0 }} </p>
</NDivider> </NDivider>
<div <div
class="live-request-processing-container" class="live-request-processing-container"
@@ -172,7 +176,7 @@ onUnmounted(() => {
</Vue3Marquee> </Vue3Marquee>
</template> </template>
<div v-else style="position: relative; top: 20%"> <div v-else style="position: relative; top: 20%">
<NEmpty class="live-request-empty" description="暂无人点" /> <NEmpty class="live-request-empty" description="暂无人点" />
</div> </div>
</div> </div>
<div class="live-request-footer" v-if="settings.showRequireInfo" ref="footerRef"> <div class="live-request-footer" v-if="settings.showRequireInfo" ref="footerRef">