From 69dbd312596b58813dcee3b472a7d57a85323294 Mon Sep 17 00:00:00 2001 From: Megghy Date: Sat, 25 Nov 2023 19:09:34 +0800 Subject: [PATCH] add queue --- src/api/api-models.ts | 83 +- src/data/constants.ts | 1 + src/router/index.ts | 26 + src/views/AboutView.vue | 3 + src/views/IndexView.vue | 5 + src/views/ManageLayout.vue | 18 +- src/views/OpenLiveLayout.vue | 16 +- src/views/manage/SettingsManageView.vue | 2 + src/views/obs/QueueOBS.vue | 368 ++++++++ src/views/open_live/MusicRequest.vue | 4 +- src/views/open_live/OpenLiveIndex.vue | 6 + src/views/open_live/OpenQueue.vue | 1085 +++++++++++++++++++++++ 12 files changed, 1604 insertions(+), 13 deletions(-) create mode 100644 src/views/obs/QueueOBS.vue create mode 100644 src/views/open_live/OpenQueue.vue diff --git a/src/api/api-models.ts b/src/api/api-models.ts index 4bbb19e..1313e67 100644 --- a/src/api/api-models.ts +++ b/src/api/api-models.ts @@ -62,6 +62,7 @@ export interface UserSetting { sendEmail: Setting_SendEmail questionBox: Setting_QuestionBox songRequest: Setting_SongRequest + queue: Setting_Queue enableFunctions: FunctionTypes[] indexTemplate: string | null @@ -89,11 +90,55 @@ export interface Setting_SongRequest { tiduCooldownSecond: number jianzhangCooldownSecond: number } +export interface Setting_Queue { + keyword: string + matchType: KeywordMatchType + sortType?: QueueSortType + queueMaxSize: number + + allowAllDanmaku: boolean + allowFromWeb: boolean + needJianzhang: boolean + needTidu: boolean + needZongdu: boolean + fanMedalMinLevel?: number + + allowGift: boolean + giftNames?: string[] + minGiftPrice?: number + giftFilterType: QueueGiftFilterType + allowIncreasePaymentBySendGift: boolean + allowIncreaseByAnyPayment: boolean + + enableCooldown: boolean + cooldownSecond: number + zongduCooldownSecond: number + tiduCooldownSecond: number + jianzhangCooldownSecond: number +} + +export enum KeywordMatchType { + Full, + Contains, + Regex, +} + +export enum QueueSortType { + GuardFirst, + PaymentFist, + TimeFirst, +} + +export enum QueueGiftFilterType { + Or, + And, +} export enum FunctionTypes { SongList, QuestionBox, Schedule, SongRequest, + Queue, } export interface SongAuthorInfo { name: string @@ -120,12 +165,12 @@ export interface SongsInfo { //paidSong: boolean options?: SongRequestOption } -export interface SongRequestOption{ - needJianzhang: boolean; - needTidu: boolean; - needZongdu: boolean; - scMinPrice?: number; - fanMedalMinLevel?: number; +export interface SongRequestOption { + needJianzhang: boolean + needTidu: boolean + needZongdu: boolean + scMinPrice?: number + fanMedalMinLevel?: number } export enum SongLanguage { Chinese, // 中文 @@ -295,12 +340,12 @@ export interface SongRequestInfo { status: SongRequestStatus from: SongRequestFrom scPrice?: number - user?: SongRequestUserInfo + user?: DanmakuUserInfo createAt: number finishAt?: number isInLocal?: boolean } -export interface SongRequestUserInfo { +export interface DanmakuUserInfo { name: string uid: number guard_level: number @@ -315,6 +360,12 @@ export enum SongRequestFrom { SC, Web, } +export enum QueueFrom { + Manual, + Danmaku, + Gift, + Web, +} export enum SongRequestStatus { Waiting, @@ -322,6 +373,12 @@ export enum SongRequestStatus { Finish, Cancel, } +export enum QueueStatus { + Waiting, + Progressing, + Finish, + Cancel, +} export interface EventModel { type: EventDataTypes name: string @@ -342,3 +399,13 @@ export enum EventDataTypes { Gift, Message, } +export interface ResponseQueueModel { + id: number + status: QueueStatus + from: QueueFrom + giftPrice?: number + user?: DanmakuUserInfo + createAt: number + finishAt?: number | null + isInLocal?: boolean +} diff --git a/src/data/constants.ts b/src/data/constants.ts index 1a5027f..cd1da22 100644 --- a/src/data/constants.ts +++ b/src/data/constants.ts @@ -24,6 +24,7 @@ export const SCHEDULE_API_URL = `${BASE_API}schedule/` export const VIDEO_COLLECT_API_URL = `${BASE_API}video-collect/` export const OPEN_LIVE_API_URL = `${BASE_API}open-live/` export const SONG_REQUEST_API_URL = `${BASE_API}song-request/` +export const QUEUE_API_URL = `${BASE_API}queue/` export const EVENT_API_URL = `${BASE_API}event/` export const ScheduleTemplateMap = { diff --git a/src/router/index.ts b/src/router/index.ts index 315fafa..f81f61d 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -200,6 +200,16 @@ const routes: Array = [ danmaku: true, }, }, + { + path: 'queue', + name: 'manage-liveQueue', + component: () => import('@/views/open_live/OpenQueue.vue'), + meta: { + title: '弹幕排队', + keepAlive: true, + danmaku: true, + }, + }, ], }, { @@ -230,6 +240,14 @@ const routes: Array = [ title: '点歌', }, }, + { + path: 'queue', + name: 'open-live-queue', + component: () => import('@/views/open_live/OpenQueue.vue'), + meta: { + title: '排队', + }, + }, ], }, { @@ -252,6 +270,14 @@ const routes: Array = [ title: '弹幕点歌', }, }, + { + path: 'queue', + name: 'obs-queue', + component: () => import('@/views/obs/QueueOBS.vue'), + meta: { + title: '弹幕排队', + }, + }, ], }, { diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue index 00b4a42..2e9f3f3 100644 --- a/src/views/AboutView.vue +++ b/src/views/AboutView.vue @@ -33,6 +33,9 @@ import { NButton, NCard, NDivider, NLayoutContent, NSpace, NText, NTimeline, NTi 更新日志 + + + diff --git a/src/views/IndexView.vue b/src/views/IndexView.vue index 1ba4946..d62bc7e 100644 --- a/src/views/IndexView.vue +++ b/src/views/IndexView.vue @@ -43,6 +43,11 @@ const functions = [ desc: '可以让弹幕进行点歌!', icon: ListCircle, }, + { + name: '弹幕排队', + desc: '通过发送弹幕和礼物加入队列, 允许设置多种条件', + icon: ListCircle, + }, { name: '视频征集', desc: '创建用来收集视频链接的页面, 可以从动态爬取, 也可以提前对视频进行筛选', diff --git a/src/views/ManageLayout.vue b/src/views/ManageLayout.vue index 50fad1b..e62364f 100644 --- a/src/views/ManageLayout.vue +++ b/src/views/ManageLayout.vue @@ -22,7 +22,7 @@ import { } from 'naive-ui' import { h, onMounted, ref } from 'vue' import { BrowsersOutline, Chatbox, Moon, MusicalNote, Sunny, AnalyticsSharp } from '@vicons/ionicons5' -import { CalendarClock24Filled, Chat24Filled, Info24Filled, Lottery24Filled, VehicleShip24Filled, VideoAdd20Filled } from '@vicons/fluent' +import { CalendarClock24Filled, Chat24Filled, Info24Filled, Lottery24Filled, PeopleQueue24Filled, VehicleShip24Filled, VideoAdd20Filled } from '@vicons/fluent' import { isLoadingAccount, useAccount } from '@/api/account' import RegisterAndLogin from '@/components/RegisterAndLogin.vue' import { RouterLink, useRoute } from 'vue-router' @@ -229,7 +229,7 @@ const menuOptions = [ name: 'manage-liveLottery', }, }, - { default: () => '直播抽奖' } + { default: () => '抽奖' } ), key: 'manage-liveLottery', icon: renderIcon(Lottery24Filled), @@ -249,6 +249,20 @@ const menuOptions = [ key: 'manage-songRequest', icon: renderIcon(MusicalNote), //disabled: accountInfo.value?.isEmailVerified == false, + },{ + label: () => + h( + RouterLink, + { + to: { + name: 'manage-liveQueue', + }, + }, + { default: () => '排队' } + ), + key: 'manage-liveQueue', + icon: renderIcon(PeopleQueue24Filled), + //disabled: accountInfo.value?.isEmailVerified == false, }, ], }, diff --git a/src/views/OpenLiveLayout.vue b/src/views/OpenLiveLayout.vue index c3d41e2..2f2dc6b 100644 --- a/src/views/OpenLiveLayout.vue +++ b/src/views/OpenLiveLayout.vue @@ -2,7 +2,7 @@ import { isDarkMode } from '@/Utils' import { OpenLiveInfo, ThemeType } from '@/api/api-models' import DanmakuClient, { AuthInfo } from '@/data/DanmakuClient' -import { Lottery24Filled } from '@vicons/fluent' +import { Lottery24Filled, PeopleQueue24Filled } from '@vicons/fluent' import { Moon, MusicalNote, Sunny } from '@vicons/ionicons5' import { useElementSize, useStorage } from '@vueuse/core' import { @@ -74,6 +74,20 @@ const menuOptions = [ ), key: 'open-live-song-request', icon: renderIcon(MusicalNote), + },{ + label: () => + h( + RouterLink, + { + to: { + name: 'open-live-queue', + query: route.query, + }, + }, + { default: () => '排队' } + ), + key: 'open-live-queue', + icon: renderIcon(PeopleQueue24Filled), }, ] diff --git a/src/views/manage/SettingsManageView.vue b/src/views/manage/SettingsManageView.vue index 707fe4f..1d37f0c 100644 --- a/src/views/manage/SettingsManageView.vue +++ b/src/views/manage/SettingsManageView.vue @@ -284,6 +284,8 @@ onMounted(async () => { 歌单 提问箱(棉花糖 日程 + 点歌 + 排队 通知 diff --git a/src/views/obs/QueueOBS.vue b/src/views/obs/QueueOBS.vue new file mode 100644 index 0000000..24ba28e --- /dev/null +++ b/src/views/obs/QueueOBS.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/src/views/open_live/MusicRequest.vue b/src/views/open_live/MusicRequest.vue index 66a156a..d4137c4 100644 --- a/src/views/open_live/MusicRequest.vue +++ b/src/views/open_live/MusicRequest.vue @@ -10,7 +10,7 @@ import { SongRequestFrom, SongRequestInfo, SongRequestStatus, - SongRequestUserInfo, + DanmakuUserInfo, SongsInfo, } from '@/api/api-models' import { QueryGetAPI, QueryPostAPI, QueryPostAPIWithParams } from '@/api/query' @@ -241,7 +241,7 @@ async function addSong(danmaku: EventModel) { fans_medal_name: danmaku.fans_medal_name, fans_medal_wearing_status: danmaku.fans_medal_wearing_status, guard_level: danmaku.guard_level, - } as SongRequestUserInfo, + } as DanmakuUserInfo, createAt: Date.now(), isInLocal: true, id: songs.value.length == 0 ? 1 : new List(songs.value).Max((s) => s.id) + 1, diff --git a/src/views/open_live/OpenLiveIndex.vue b/src/views/open_live/OpenLiveIndex.vue index cb4655f..98d584a 100644 --- a/src/views/open_live/OpenLiveIndex.vue +++ b/src/views/open_live/OpenLiveIndex.vue @@ -27,6 +27,12 @@ const accountInfo = useAccount() 前往使用 + + 通过发送弹幕或者礼物进行排队, 允许设置多种条件 + +
diff --git a/src/views/open_live/OpenQueue.vue b/src/views/open_live/OpenQueue.vue new file mode 100644 index 0000000..58d93c9 --- /dev/null +++ b/src/views/open_live/OpenQueue.vue @@ -0,0 +1,1085 @@ + + + + +