mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
Merge origin/main into dev: sync bug fixes from main
Merges 4 PRs from main: - PR#15: Fix ffmpeg spawn failure causing infinite retry loop - PR#16: Fix Docker restart crash (respect autoStart flag, persist identity) - PR#17: Add missing "play" script to package.json - PR#18: Add detailed update/upgrade instructions to README Conflict resolution in src/data/database.ts: - Combined dev's serverProtocol/ts6ApiKey fields with main's identity field - Extended migrateSchema() to also migrate serverProtocol and ts6ApiKey columns - Updated SQL schema and upsert query to include all three new columns
This commit is contained in:
commit
419911b78b
8 files changed
+201
-20
No files matched your search
+42
-9
@@ -143,12 +143,25 @@ export class BotManager {
|
||||
const bot = this.bots.get(id);
|
||||
if (!bot) throw new Error(`Bot ${id} not found`);
|
||||
await bot.connect();
|
||||
|
||||
// Mark as autoStart so it reconnects on Docker restart, and persist identity
|
||||
const saved = this.database.getBotInstances().find((i) => i.id === id);
|
||||
if (saved) {
|
||||
this.database.saveBotInstance({ ...saved, autoStart: true });
|
||||
this.persistBotIdentity(saved, bot);
|
||||
}
|
||||
}
|
||||
|
||||
stopBot(id: string): void {
|
||||
const bot = this.bots.get(id);
|
||||
if (!bot) throw new Error(`Bot ${id} not found`);
|
||||
bot.disconnect();
|
||||
|
||||
// Mark as not autoStart so it stays stopped on Docker restart
|
||||
const saved = this.database.getBotInstances().find((i) => i.id === id);
|
||||
if (saved) {
|
||||
this.database.saveBotInstance({ ...saved, autoStart: false });
|
||||
}
|
||||
}
|
||||
|
||||
async loadSavedBots(): Promise<void> {
|
||||
@@ -163,6 +176,7 @@ export class BotManager {
|
||||
port: saved.serverPort,
|
||||
queryPort: proto === "ts6" ? 10080 : 10011,
|
||||
nickname: saved.nickname,
|
||||
identity: saved.identity || undefined,
|
||||
defaultChannel: saved.defaultChannel || undefined,
|
||||
channelPassword: saved.channelPassword || undefined,
|
||||
serverProtocol: proto === "ts3" || proto === "ts6" ? proto : undefined,
|
||||
@@ -178,18 +192,30 @@ export class BotManager {
|
||||
|
||||
this.bots.set(saved.id, bot);
|
||||
|
||||
// Auto-connect in background (non-blocking, won't affect other bots)
|
||||
bot.connect().then(() => {
|
||||
// Only auto-connect bots that have autoStart enabled
|
||||
if (saved.autoStart) {
|
||||
bot.connect().then(() => {
|
||||
// Persist identity after successful connection for future restarts
|
||||
this.persistBotIdentity(saved, bot);
|
||||
this.logger.info(
|
||||
{ botId: saved.id, name: saved.name },
|
||||
"Auto-connected saved bot"
|
||||
);
|
||||
}).catch((err) => {
|
||||
this.logger.error(
|
||||
{ err, botId: saved.id, name: saved.name },
|
||||
"Failed to auto-connect bot (start manually from Settings)"
|
||||
);
|
||||
});
|
||||
|
||||
// Stagger connections to avoid overwhelming the TS server
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
} else {
|
||||
this.logger.info(
|
||||
{ botId: saved.id, name: saved.name },
|
||||
"Auto-connected saved bot"
|
||||
"Loaded bot (autoStart disabled, not connecting)"
|
||||
);
|
||||
}).catch((err) => {
|
||||
this.logger.error(
|
||||
{ err, botId: saved.id, name: saved.name },
|
||||
"Failed to auto-connect bot (start manually from Settings)"
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.info(
|
||||
@@ -198,6 +224,13 @@ export class BotManager {
|
||||
);
|
||||
}
|
||||
|
||||
private persistBotIdentity(saved: import("../data/database.js").BotInstance, bot: BotInstance): void {
|
||||
const identity = bot.getIdentityExport();
|
||||
if (identity && identity !== saved.identity) {
|
||||
this.database.saveBotInstance({ ...saved, identity });
|
||||
}
|
||||
}
|
||||
|
||||
shutdown(): void {
|
||||
for (const bot of this.bots.values()) {
|
||||
bot.disconnect();
|
||||
|
||||
Reference in new issue
Block a user