update song-request to live-request, add questionbox tag support

This commit is contained in:
2024-03-12 14:36:01 +08:00
parent ca3f7ca57e
commit af112da9a8
28 changed files with 542 additions and 216 deletions

View File

@@ -5,7 +5,7 @@ import {
EventDataTypes,
EventModel,
FunctionTypes,
Setting_SongRequest,
Setting_LiveRequest,
SongRequestFrom,
SongRequestInfo,
SongRequestStatus,
@@ -65,10 +65,10 @@ import {
} from 'naive-ui'
import { computed, h, onActivated, onDeactivated, onMounted, onUnmounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import SongRequestOBS from '../obs/SongRequestOBS.vue'
import SongRequestOBS from '../obs/LiveRequestOBS.vue'
const defaultSettings = {
orderPrefix: '点',
orderPrefix: '点',
onlyAllowSongList: false,
queueMaxSize: 10,
allowAllDanmaku: true,
@@ -88,11 +88,11 @@ const defaultSettings = {
tiduCooldownSecond: 600,
jianzhangCooldownSecond: 900,
isReverse: false,
} as Setting_SongRequest
} as Setting_LiveRequest
const STATUS_MAP = {
[SongRequestStatus.Waiting]: '等待中',
[SongRequestStatus.Singing]: '演唱中',
[SongRequestStatus.Finish]: '已演唱',
[SongRequestStatus.Singing]: '处理中',
[SongRequestStatus.Finish]: '已处理',
[SongRequestStatus.Cancel]: '已取消',
}
@@ -194,7 +194,7 @@ async function getAllSong() {
id: accountInfo.value.id,
})
if (data.code == 200) {
console.log('[OPEN-LIVE-Song-Request] 已获取所有数据')
console.log('[OPEN-LIVE-LIVE-REQUEST] 已获取所有数据')
return new List(data.data).OrderByDescending((s) => s.createAt).ToArray()
} else {
message.error('无法获取数据: ' + data.message)
@@ -210,10 +210,10 @@ async function getAllSong() {
}
async function addSong(danmaku: EventModel) {
console.log(
`[OPEN-LIVE-Song-Request] 收到 [${danmaku.name}] 的点${danmaku.type == EventDataTypes.SC ? 'SC' : '弹幕'}: ${danmaku.msg}`,
`[OPEN-LIVE-LIVE-REQUEST] 收到 [${danmaku.name}] 的点${danmaku.type == EventDataTypes.SC ? 'SC' : '弹幕'}: ${danmaku.msg}`,
)
if (settings.value.enableOnStreaming && accountInfo.value?.streamerInfo?.isStreaming != true) {
message.info('当前未在直播中, 无法添加点请求. 或者关闭设置中的仅允许直播时加入')
message.info('当前未在直播中, 无法添加点请求. 或者关闭设置中的仅允许直播时加入')
return
}
if (accountInfo.value) {
@@ -225,12 +225,12 @@ async function addSong(danmaku: EventModel) {
//message.error(`[${danmaku.name}] : ${data.message}`)
const time = Date.now()
notice.warning({
title: danmaku.name + ' 点失败',
title: danmaku.name + ' 点失败',
description: data.message,
duration: isWarnMessageAutoClose.value ? 3000 : 0,
meta: () => h(NTime, { type: 'relative', time: time, key: updateKey.value }),
})
console.log(`[OPEN-LIVE-Song-Request] [${danmaku.name}] 添加曲目失败: ${data.message}`)
console.log(`[OPEN-LIVE-LIVE-REQUEST] [${danmaku.name}] 添加曲目失败: ${data.message}`)
}
})
} else {
@@ -253,12 +253,12 @@ async function addSong(danmaku: EventModel) {
id: songs.value.length == 0 ? 1 : new List(songs.value).Max((s) => s.id) + 1,
} as SongRequestInfo
localActiveSongs.value.unshift(songData)
message.success(`[${danmaku.name}] 添加曲目: ${songData.songName}`)
message.success(`[${danmaku.name}] 添加: ${songData.songName}`)
}
}
async function addSongManual() {
if (!newSongName.value) {
message.error('请输入曲目名')
message.error('请输入名')
return
}
if (accountInfo.value) {
@@ -266,12 +266,12 @@ async function addSongManual() {
name: newSongName.value,
}).then((data) => {
if (data.code == 200) {
message.success(`已手动添加曲目: ${data.data.songName}`)
message.success(`已手动添加: ${data.data.songName}`)
originSongs.value.unshift(data.data)
newSongName.value = ''
console.log(`[OPEN-LIVE-Song-Request] 已手动添加曲目: ${data.data.songName}`)
console.log(`[OPEN-LIVE-LIVE-REQUEST] 已手动添加: ${data.data.songName}`)
} else {
message.error(`手动添加曲目失败: ${data.message}`)
message.error(`手动添加失败: ${data.message}`)
}
})
} else {
@@ -287,7 +287,7 @@ async function addSongManual() {
id: songs.value.length == 0 ? 1 : new List(songs.value).Max((s) => s.id) + 1,
} as SongRequestInfo
localActiveSongs.value.unshift(songData)
message.success(`已手动添加曲目: ${songData.songName}`)
message.success(`已手动添加: ${songData.songName}`)
}
}
async function updateSongStatus(song: SongRequestInfo, status: SongRequestStatus) {
@@ -313,7 +313,7 @@ async function updateSongStatus(song: SongRequestInfo, status: SongRequestStatus
break
case SongRequestStatus.Singing:
statusString = 'singing'
statusString2 = '演唱中'
statusString2 = '处理中'
break
}
await QueryGetAPI(SONG_REQUEST_API_URL + statusString, {
@@ -321,19 +321,19 @@ async function updateSongStatus(song: SongRequestInfo, status: SongRequestStatus
})
.then((data) => {
if (data.code == 200) {
console.log(`[OPEN-LIVE-Song-Request] 更新曲目状态: ${song.songName} -> ${statusString}`)
console.log(`[OPEN-LIVE-LIVE-REQUEST] 更新状态: ${song.songName} -> ${statusString}`)
song.status = status
if (status > SongRequestStatus.Singing) {
song.finishAt = Date.now()
}
message.success(`已更新曲目状态为: ${statusString2}`)
message.success(`已更新状态为: ${statusString2}`)
} else {
console.log(`[OPEN-LIVE-Song-Request] 更新曲目状态失败: ${data.message}`)
message.error(`更新曲目状态失败: ${data.message}`)
console.log(`[OPEN-LIVE-LIVE-REQUEST] 更新状态失败: ${data.message}`)
message.error(`更新状态失败: ${data.message}`)
}
})
.catch((err) => {
message.error(`更新曲目状态失败`)
message.error(`更新状态失败`)
})
.finally(() => {
isLoading.value = false
@@ -376,20 +376,20 @@ async function onUpdateFunctionEnable() {
.then((data) => {
if (data.code == 200) {
message.success(
`${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}功能`,
`${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}功能`,
)
} else {
if (accountInfo.value) {
accountInfo.value.settings.enableFunctions = oldValue
}
message.error(
`功能${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}失败: ${data.message}`,
`功能${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}失败: ${data.message}`,
)
}
})
.catch((err) => {
message.error(
`功能${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}失败: ${err}`,
`功能${accountInfo.value?.settings.enableFunctions.includes(FunctionTypes.SongRequest) ? '启用' : '禁用'}失败: ${err}`,
)
})
}
@@ -677,12 +677,12 @@ async function updateActive() {
} else {
originSongs.value.unshift(item)
if (item.from == SongRequestFrom.Web) {
message.success(`[${item.user?.name}] 直接从网页歌单点: ${item.songName}`)
message.success(`[${item.user?.name}] 直接从网页歌单点: ${item.songName}`)
}
}
})
} else {
message.error('无法获取点队列: ' + data.message)
message.error('无法获取点队列: ' + data.message)
return []
}
} catch (err) {}
@@ -747,8 +747,8 @@ onUnmounted(() => {
</script>
<template>
<NAlert type="info" v-if="accountInfo">
启用弹幕点功能
<NAlert type="info" v-if="accountInfo.id">
启用弹幕点功能
<NSwitch
:value="accountInfo?.settings.enableFunctions.includes(FunctionTypes.SongRequest)"
@update:value="onUpdateFunctionEnable"
@@ -760,7 +760,7 @@ onUnmounted(() => {
<NButton text type="primary" tag="a" href="https://www.yuque.com/megghy/dez70g/vfvcyv3024xvaa1p" target="_blank">
VtsuruEventFetcher
</NButton>
则其需要保持此页面开启才能点, 也不要同时开多个页面, 会导致点重复 !(部署了则不影响)
则其需要保持此页面开启才能点, 也不要同时开多个页面, 会导致点重复 !(部署了则不影响)
</NText>
</NAlert>
<NAlert
@@ -801,12 +801,12 @@ onUnmounted(() => {
<template #icon>
<NIcon :component="Checkmark12Regular" />
</template>
今日已演唱 |
今日已处理 |
{{
songs.filter((s) => s.status != SongRequestStatus.Cancel && isSameDay(s.finishAt ?? 0, Date.now()))
.length
}}
</NTag>
<NInputGroup>
<NInput placeholder="手动添加" v-model:value="newSongName" />
@@ -1049,7 +1049,7 @@ onUnmounted(() => {
<NDivider> 规则 </NDivider>
<NSpace vertical>
<NInputGroup style="width: 250px">
<NInputGroupLabel> 弹幕前缀 </NInputGroupLabel>
<NInputGroupLabel> 弹幕前缀 </NInputGroupLabel>
<template v-if="configCanEdit">
<NInput v-model:value="settings.orderPrefix" />
<NButton @click="updateSettings" type="primary">确定</NButton>
@@ -1075,7 +1075,7 @@ onUnmounted(() => {
@update:checked="updateSettings"
:disabled="!configCanEdit"
>
允许所有弹幕点
允许所有弹幕点
</NCheckbox>
<template v-if="!settings.allowAllDanmaku">
<NCheckbox
@@ -1118,7 +1118,7 @@ onUnmounted(() => {
</NSpace>
<NSpace align="center">
<NCheckbox v-model:checked="settings.allowSC" @update:checked="updateSettings" :disabled="!configCanEdit">
允许通过 SuperChat
允许通过 SuperChat
</NCheckbox>
<span v-if="settings.allowSC">
<NCheckbox
@@ -1126,13 +1126,13 @@ onUnmounted(() => {
@update:checked="updateSettings"
:disabled="!configCanEdit"
>
SC点歌无视限制
SC 点播无视限制
</NCheckbox>
<NTooltip>
<template #trigger>
<NIcon :component="Info24Filled" />
</template>
包含冷却时间, 队列长度, 重复点
包含冷却时间, 队列长度, 重复点
</NTooltip>
</span>
<NInputGroup v-if="settings.allowSC" style="width: 250px">
@@ -1141,6 +1141,7 @@ onUnmounted(() => {
<NButton @click="updateSettings" type="info" :disabled="!configCanEdit">确定</NButton>
</NInputGroup>
</NSpace>
<NDivider> 点歌 </NDivider>
<NSpace>
<NCheckbox
v-model:checked="settings.onlyAllowSongList"
@@ -1165,7 +1166,7 @@ onUnmounted(() => {
@update:checked="updateSettings"
:disabled="!configCanEdit"
>
启用点冷却
启用点冷却
</NCheckbox>
<NSpace v-if="settings.enableCooldown">
<NInputGroup style="width: 250px">
@@ -1190,7 +1191,14 @@ onUnmounted(() => {
</NInputGroup>
</NSpace>
<NDivider> OBS </NDivider>
<NSpace>
<NSpace align="center">
<NInputGroup style="width: 220px">
<NInputGroupLabel> 标题 </NInputGroupLabel>
<template v-if="configCanEdit">
<NInput v-model:value="settings.obsTitle" placeholder="默认为 点播" />
<NButton @click="updateSettings" type="primary">确定</NButton>
</template>
</NInputGroup>
<NCheckbox
v-model:checked="settings.showRequireInfo"
:disabled="!configCanEdit"
@@ -1203,24 +1211,24 @@ onUnmounted(() => {
:disabled="!configCanEdit"
@update:checked="updateSettings"
>
显示点用户名
显示点用户名
</NCheckbox>
<NCheckbox
v-model:checked="settings.showFanMadelInfo"
:disabled="!configCanEdit"
@update:checked="updateSettings"
>
显示点用户粉丝牌
显示点用户粉丝牌
</NCheckbox>
</NSpace>
<NDivider> 其他 </NDivider>
<NCheckbox v-model:checked="isWarnMessageAutoClose"> 自动关闭点失败时的提示消息 </NCheckbox>
<NCheckbox v-model:checked="isWarnMessageAutoClose"> 自动关闭点失败时的提示消息 </NCheckbox>
</NSpace>
</NSpin>
</NTabPane>
</NTabs>
<template v-else>
<NAlert title="未启用" type="error"> 请先启用弹幕点功能 </NAlert>
<NAlert title="未启用" type="error"> 请先启用弹幕点功能 </NAlert>
</template>
</NCard>
<NModal v-model:show="showOBSModal" title="OBS组件" preset="card" style="width: 800px">
@@ -1230,7 +1238,7 @@ onUnmounted(() => {
<SongRequestOBS :id="accountInfo?.id" />
</div>
<br />
<NInput :value="'https://vtsuru.live/obs/song-request?id=' + accountInfo?.id" />
<NInput :value="'https://vtsuru.live/obs/live-request?id=' + accountInfo?.id" />
<NDivider />
<NCollapse>
<NCollapseItem title="使用说明">

View File

@@ -26,7 +26,7 @@ const accountInfo = useAccount()
<NCard hoverable embedded size="small" title="弹幕点歌" style="width: 300px">
通过弹幕或者SC进行点歌, 注册后可以保存和导出 (这个是歌势用的点歌, 不是拿来放歌的那种!)
<template #footer>
<NButton @click="$router.push({ name: 'open-live-song-request', query: $route.query })" type="primary">
<NButton @click="$router.push({ name: 'open-live-live-request', query: $route.query })" type="primary">
前往使用
</NButton>
</template>

View File

@@ -749,7 +749,7 @@ onUnmounted(() => {
</script>
<template>
<NAlert type="info" v-if="accountInfo">
<NAlert type="info" v-if="accountInfo.id">
启用弹幕队列功能
<NSwitch
:value="accountInfo?.settings.enableFunctions.includes(FunctionTypes.Queue)"