mirror of
https://github.com/Megghy/vtsuru.live.git
synced 2025-12-10 20:36:55 +08:00
152 lines
4.9 KiB
TypeScript
152 lines
4.9 KiB
TypeScript
import type { MessageApiInjection } from 'naive-ui/es/message/src/MessageProvider'
|
|
import type { BiliAuthModel, ResponsePointGoodModel } from '@/api/api-models'
|
|
import { useStorage } from '@vueuse/core'
|
|
import { defineStore } from 'pinia'
|
|
import { computed, ref } from 'vue'
|
|
import { QueryGetAPI, QueryPostAPI } from '@/api/query'
|
|
import { BILI_AUTH_API_URL, POINT_API_URL } from '@/data/constants'
|
|
|
|
export const useBiliAuth = defineStore('BiliAuth', () => {
|
|
const biliAuth = ref<BiliAuthModel>({} as BiliAuthModel)
|
|
|
|
const biliTokens = useStorage<
|
|
{
|
|
id: number
|
|
uId: number
|
|
name?: string
|
|
token: string
|
|
}[]
|
|
>('Bili.Auth.Tokens', [])
|
|
const currentToken = useStorage<string>('Bili.Auth.Selected', null)
|
|
|
|
const isLoading = ref(false)
|
|
const isAuthed = computed(() => currentToken.value != null && currentToken.value.length > 0)
|
|
const isInvalid = ref(false)
|
|
|
|
async function setCurrentAuth(token: string) {
|
|
if (!token) {
|
|
console.warn('[bili-auth] 无效的token')
|
|
return
|
|
}
|
|
biliAuth.value = {} as BiliAuthModel
|
|
currentToken.value = token
|
|
await getAuthInfo()
|
|
}
|
|
|
|
async function getAuthInfo() {
|
|
try {
|
|
isLoading.value = true
|
|
if (!currentToken.value) return
|
|
await QueryBiliAuthGetAPI<BiliAuthModel>(`${BILI_AUTH_API_URL}info`).then((data) => {
|
|
if (data.code == 200) {
|
|
biliAuth.value = data.data
|
|
console.log('[bili-auth] 已获取 Bilibili 认证信息')
|
|
// 将token加入到biliTokens
|
|
const index = biliTokens.value.findIndex(t => t.id == biliAuth.value.id)
|
|
if (index >= 0) {
|
|
biliTokens.value[index] = {
|
|
id: biliAuth.value.id,
|
|
token: currentToken.value,
|
|
name: biliAuth.value.name,
|
|
uId: biliAuth.value.userId,
|
|
}
|
|
// console.log('更新已存在的认证账户: ' + biliAuth.value.userId)
|
|
} else {
|
|
biliTokens.value.push({
|
|
id: biliAuth.value.id,
|
|
token: currentToken.value,
|
|
name: biliAuth.value.name,
|
|
uId: biliAuth.value.userId,
|
|
})
|
|
console.log(`添加新的认证账户: ${biliAuth.value.userId}`)
|
|
}
|
|
isInvalid.value = false
|
|
return true
|
|
} else {
|
|
console.error(`[bili-auth] 无法获取 Bilibili 认证信息: ${data.message}`)
|
|
isInvalid.value = true
|
|
logout()
|
|
// message.error('无法获取 Bilibili 认证信息: ' + data.message)
|
|
}
|
|
})
|
|
} catch (err) {
|
|
console.error(`[bili-auth] 无法获取 Bilibili 认证信息: ${err}`)
|
|
// message.error('无法获取 Bilibili 认证信息: ' + err)
|
|
} finally {
|
|
isLoading.value = false
|
|
}
|
|
return false
|
|
}
|
|
async function QueryBiliAuthGetAPI<T>(url: string, params?: any, headers?: [string, string][]) {
|
|
headers ??= []
|
|
if (headers.find(h => h[0] == 'Bili-Auth') == null) {
|
|
headers.push(['Bili-Auth', currentToken.value ?? ''])
|
|
}
|
|
return QueryGetAPI<T>(url, params, headers)
|
|
}
|
|
async function QueryBiliAuthPostAPI<T>(url: string, body?: unknown, headers?: [string, string][]) {
|
|
headers ??= []
|
|
if (headers.find(h => h[0] == 'Bili-Auth') == null) {
|
|
headers.push(['Bili-Auth', currentToken.value ?? ''])
|
|
}
|
|
return QueryPostAPI<T>(url, body, headers)
|
|
}
|
|
|
|
async function GetSpecificPoint(id: number) {
|
|
try {
|
|
const data = await QueryBiliAuthGetAPI<number>(`${POINT_API_URL}user/get-point`, { id })
|
|
if (data.code == 200) {
|
|
return data.data
|
|
} else {
|
|
console.error(`[point] 无法获取在指定直播间拥有的积分: ${data.message}`)
|
|
}
|
|
} catch (err) {
|
|
console.error(`[point] 无法获取在指定直播间拥有的积分: ${err}`)
|
|
}
|
|
return null
|
|
}
|
|
async function GetGoods(id: number | undefined = undefined, message?: MessageApiInjection) {
|
|
if (!id) {
|
|
return []
|
|
}
|
|
try {
|
|
const resp = await QueryGetAPI<ResponsePointGoodModel[]>(`${POINT_API_URL}get-goods`, {
|
|
id,
|
|
})
|
|
if (resp.code == 200) {
|
|
return resp.data
|
|
} else {
|
|
message?.error(`无法获取数据: ${resp.message}`)
|
|
console.error(`无法获取数据: ${resp.message}`)
|
|
}
|
|
} catch (err) {
|
|
message?.error(`无法获取数据: ${err}`)
|
|
console.error(`无法获取数据: ${err}`)
|
|
}
|
|
return []
|
|
}
|
|
function logout() {
|
|
biliAuth.value = {} as BiliAuthModel
|
|
biliTokens.value = biliTokens.value.filter(t => t.token != currentToken.value)
|
|
currentToken.value = ''
|
|
console.log('[bili-auth] 已登出 Bilibili 认证')
|
|
}
|
|
|
|
return {
|
|
biliAuth,
|
|
biliToken: currentToken,
|
|
biliTokens,
|
|
isLoading,
|
|
isAuthed,
|
|
isInvalid,
|
|
currentToken,
|
|
getAuthInfo,
|
|
QueryBiliAuthGetAPI,
|
|
QueryBiliAuthPostAPI,
|
|
GetSpecificPoint,
|
|
GetGoods,
|
|
setCurrentAuth,
|
|
logout,
|
|
}
|
|
})
|