mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 13:02:49 +08:00
- **TS server password** (#7/#9): add serverPassword field across database, manager, bot API, and Settings UI — allows joining password-protected servers - **YouTube audio source** (#1/#10): new YouTubeProvider using yt-dlp binary; adds -y flag in chat commands, /api/music supports platform=youtube, YouTube badge in SongCard, yt-dlp-wrap npm dependency - **Bot selector UI** (#14): selector always visible (not just when >1 bot), bigger button with border and play-state indicator; per-bot URL routing at /bot/:id with BotRedirect view; copy-link button in dropdown Closes #1, #7, #9, #10, #14 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
43 lines
938 B
Vue
43 lines
938 B
Vue
<template>
|
|
<div class="redirect-page">
|
|
<span v-if="notFound">机器人不存在或未加载</span>
|
|
<span v-else>正在跳转...</span>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { onMounted, ref } from 'vue';
|
|
import { useRoute, useRouter } from 'vue-router';
|
|
import { usePlayerStore } from '../stores/player.js';
|
|
|
|
const route = useRoute();
|
|
const router = useRouter();
|
|
const store = usePlayerStore();
|
|
const notFound = ref(false);
|
|
|
|
onMounted(async () => {
|
|
const botId = route.params.id as string;
|
|
if (!store.bots.length) {
|
|
await store.fetchBots();
|
|
}
|
|
const bot = store.bots.find((b) => b.id === botId);
|
|
if (bot) {
|
|
store.setActiveBotId(botId);
|
|
router.replace('/');
|
|
} else {
|
|
notFound.value = true;
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<style scoped>
|
|
.redirect-page {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 60vh;
|
|
font-size: 16px;
|
|
color: var(--text-secondary);
|
|
}
|
|
</style>
|