mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
feat: add !artist command for artist-based loop playback
This commit is contained in:
1 parent
31e5e08def
commit
1a5bd74357
2 files changed
+36
No files matched your search
@@ -8,6 +8,7 @@ export interface ParsedCommand {
|
|||||||
export const PUBLIC_COMMANDS = new Set([
|
export const PUBLIC_COMMANDS = new Set([
|
||||||
"play", "add", "queue", "list", "now", "lyrics", "vote", "help",
|
"play", "add", "queue", "list", "now", "lyrics", "vote", "help",
|
||||||
"playlist", "album", "fm", "prev", "next", "skip", "pause", "resume",
|
"playlist", "album", "fm", "prev", "next", "skip", "pause", "resume",
|
||||||
|
"artist",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export const ADMIN_COMMANDS = new Set([
|
export const ADMIN_COMMANDS = new Set([
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ export class BotInstance extends EventEmitter {
|
|||||||
"playlist",
|
"playlist",
|
||||||
"album",
|
"album",
|
||||||
"fm",
|
"fm",
|
||||||
|
"artist",
|
||||||
]);
|
]);
|
||||||
if (!this.connected && AUDIO_COMMANDS.has(cmd.name)) {
|
if (!this.connected && AUDIO_COMMANDS.has(cmd.name)) {
|
||||||
throw new Error("Bot is not connected to TeamSpeak");
|
throw new Error("Bot is not connected to TeamSpeak");
|
||||||
@@ -299,6 +300,8 @@ export class BotInstance extends EventEmitter {
|
|||||||
return this.cmdAlbum(cmd);
|
return this.cmdAlbum(cmd);
|
||||||
case "fm":
|
case "fm":
|
||||||
return this.cmdFm();
|
return this.cmdFm();
|
||||||
|
case "artist":
|
||||||
|
return this.cmdArtist(cmd);
|
||||||
case "vote":
|
case "vote":
|
||||||
return this.cmdVote(msg);
|
return this.cmdVote(msg);
|
||||||
case "lyrics":
|
case "lyrics":
|
||||||
@@ -616,6 +619,37 @@ export class BotInstance extends EventEmitter {
|
|||||||
return `Personal FM started: ${first?.name ?? "unknown"} - ${first?.artist ?? ""}`;
|
return `Personal FM started: ${first?.name ?? "unknown"} - ${first?.artist ?? ""}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async cmdArtist(cmd: ParsedCommand): Promise<string> {
|
||||||
|
if (!cmd.args) return "Usage: !artist <artist name>";
|
||||||
|
const provider = this.getProvider(cmd.flags);
|
||||||
|
const result = await provider.search(cmd.args, 50);
|
||||||
|
if (result.songs.length === 0)
|
||||||
|
return `No results found for artist: ${cmd.args}`;
|
||||||
|
|
||||||
|
const query = cmd.args.toLowerCase();
|
||||||
|
let filtered = result.songs.filter(
|
||||||
|
s => s.artist.toLowerCase().includes(query)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Fallback to unfiltered results if filtering drops everything
|
||||||
|
if (filtered.length === 0) {
|
||||||
|
filtered = result.songs.slice(0, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.queue.clear();
|
||||||
|
this.isFmMode = false;
|
||||||
|
for (const song of filtered) {
|
||||||
|
this.queue.add({ ...song, platform: provider.platform });
|
||||||
|
}
|
||||||
|
this.queue.setMode(PlayMode.Loop);
|
||||||
|
this.player.resetFailures();
|
||||||
|
|
||||||
|
const first = this.queue.play();
|
||||||
|
if (first) await this.resolveAndPlay(first);
|
||||||
|
this.emit("stateChange");
|
||||||
|
return `Artist mode: ${cmd.args} — ${filtered.length} songs loaded. Now playing: ${first?.name ?? "unknown"}`;
|
||||||
|
}
|
||||||
|
|
||||||
private async refillFm(): Promise<void> {
|
private async refillFm(): Promise<void> {
|
||||||
if (!this.isFmMode || !this.neteaseProvider.getPersonalFm) return;
|
if (!this.isFmMode || !this.neteaseProvider.getPersonalFm) return;
|
||||||
try {
|
try {
|
||||||
@@ -690,6 +724,7 @@ export class BotInstance extends EventEmitter {
|
|||||||
`${p}playlist <name or id> — Load playlist by name or ID`,
|
`${p}playlist <name or id> — Load playlist by name or ID`,
|
||||||
`${p}album <id> — Load album`,
|
`${p}album <id> — Load album`,
|
||||||
`${p}fm — Personal FM (NetEase)`,
|
`${p}fm — Personal FM (NetEase)`,
|
||||||
|
`${p}artist <name> — Play songs by artist (loop)`,
|
||||||
`${p}vote — Vote to skip`,
|
`${p}vote — Vote to skip`,
|
||||||
`${p}lyrics — Show lyrics`,
|
`${p}lyrics — Show lyrics`,
|
||||||
`${p}now — Current song info`,
|
`${p}now — Current song info`,
|
||||||
|
|||||||
Reference in new issue
Block a user