Files
music_bot_v2/bot/src/utils/music/Button.ts
claude-bot d0dcdb1563 bot 전체 코드 품질 개선 및 버그 수정
- GuildPlayer: 타이머 레이스 컨디션 수정, 모든 타이머 정리 로직 통합 (clearAllTimers)
- GuildPlayer: 이벤트 핸들러에 try-catch 추가 (end, exception, stuck)
- GuildPlayer: start 이벤트에서 endTimer 정리, autoPlay tracks 길이 검증 추가
- RedisClient: player_seek, player_volume에 누락된 return ���가
- RedisClient: queue_remove 인덱스 검증 주석 명확화
- Handler: runCommand에 try-catch 추가하여 에러 시 사용자에게 응답
- Channel: getGuildById에 누락된 await 추가, getMemberById/getVoiceChannelById 안전한 에러 처리
- Command.d.ts: 잘못된 타입 ChatInputChatInputCommandInteraction → ChatInputCommandInteraction 수정
- join.ts: 채널 멘션 닫는 괄호 누락 수정
- shuffle.ts: 제네릭 타입 적용, 불필요한 5회 반복 제거
- import 경로 대소문자 수정 (Shuffle → shuffle) - Linux 호환
- YoutubeMusic/Spotify: 하드코딩된 IP를 환경변수로 분리
- console.log/error → Logger 통일 (YoutubeMusic, Button, channel)
- interactionCreate: 전체 try-catch 추가, silent catch에 로깅 추가
- Database: schema 경로 __dirname 기반으로 수정, 컬럼 화이트리스트 추가
- 사용하지 않는 코드 정리 (axios 의존성, 주석처리된 user 관련 코드)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-26 23:13:16 +09:00

42 lines
1.7 KiB
TypeScript

import { ButtonInteraction, Guild } from "discord.js";
import { lavalinkManager } from "../../index";
import { checkTextChannelAndMsg, getTextChannelAndMsg } from "./Channel";
import { default_content, default_embed, default_image, getButtons } from "./Config";
import { DB } from "../Database";
import { Logger } from "../Logger";
export const buttonInteraction = (interaction: ButtonInteraction, args: string[]) => {
if (!interaction.guild) return;
let player = lavalinkManager.getPlayer(interaction.guild.id);
if (player) {
if (args[0] === "pause") player.setPause();
if (args[0] === "stop") player.stop();
if (args[0] === "skip") player.skip();
if (args[0] === "shuffle") player.setShuffle();
if (args[0] === "recommend") player.setRecommend();
} else {
if (args[0] === "recommend") buttonRecommend(interaction.guild);
}
return interaction.deferUpdate().catch((err) => {
Logger.warn(`[Button] deferUpdate 실패: ${String(err)}`);
});
}
const buttonRecommend = async (guild: Guild) => {
const gdb = DB.guild.get(guild.id);
const change = gdb ? DB.guild.update({...gdb, options: { ...gdb.options, recommend: !gdb.options.recommend }}) : false;
if (!change) return;
const { channel: getChannel, msg: getMsg, reason } = await getTextChannelAndMsg(guild);
if (reason || !getChannel || !getMsg) return;
const { msg, check } = await checkTextChannelAndMsg(guild, getChannel, getMsg);
if (!check) return;
await msg.edit({
content: default_content,
embeds: [ default_embed(guild.id) ],
components: [ getButtons() ],
files: [ default_image ],
}).catch((err) => {
Logger.error(`[Button] 메세지 수정 실패: ${String(err)}`);
return null;
});
}