diff --git a/CLAUDE.md b/CLAUDE.md index 8ec89dc..5298c3a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -69,6 +69,22 @@ reaction-bot/ 環境変数の設定方法は [.env.example](.env.example) を参照してください。 +## 開発ワークフロー + +### Makefileの使用 +このプロジェクトではMakefileを使用してビルドやテストを管理しています。 + +**重要**: ビルドやテストなどのコマンドを実行する際は、必ずMakefileの内容を確認し、定義されているターゲットを使用してください。 + +主要なコマンド: +- `make build` - バイナリをビルド(開発用) +- `make test` - テストを実行 +- `make fmt` - コードフォーマット +- `make lint` - 静的解析 +- `make run` - アプリケーションを実行 + +詳細は `make help` で確認できます。 + ## 実装規約 ### Go言語ベストプラクティス diff --git a/internal/interfaces/discord_handler.go b/internal/interfaces/discord_handler.go index a62b9ed..1782a09 100644 --- a/internal/interfaces/discord_handler.go +++ b/internal/interfaces/discord_handler.go @@ -35,6 +35,12 @@ func (h *DiscordHandler) HandleReactionAdd(s *discordgo.Session, r *discordgo.Me return } + // WHY: 転送メッセージへのリアクションは無視する(転送の連鎖を防ぐ) + if h.transferUseCase.IsTransferredMessage(r.MessageID) { + log.Printf("メッセージ %s は転送メッセージのため、リアクション追加を無視します", r.MessageID) + return + } + originalMsg, err := s.ChannelMessage(r.ChannelID, r.MessageID) if err != nil { log.Printf("メッセージ取得に失敗: %v", err) @@ -67,6 +73,12 @@ func (h *DiscordHandler) HandleReactionRemove(s *discordgo.Session, r *discordgo return } + // WHY: 転送メッセージへのリアクションは無視する(転送の連鎖を防ぐ) + if h.transferUseCase.IsTransferredMessage(r.MessageID) { + log.Printf("メッセージ %s は転送メッセージのため、リアクション削除を無視します", r.MessageID) + return + } + originalMsg, err := s.ChannelMessage(r.ChannelID, r.MessageID) if err != nil { log.Printf("メッセージ取得に失敗: %v", err) diff --git a/internal/usecases/transfer_message.go b/internal/usecases/transfer_message.go index a3ce831..80b6579 100644 --- a/internal/usecases/transfer_message.go +++ b/internal/usecases/transfer_message.go @@ -82,3 +82,17 @@ func (uc *TransferMessageUseCase) DeleteTransferredMessage( log.Printf("転送メッセージ %s を削除しました", transferredMsgID) return nil } + +// IsTransferredMessage - 指定されたメッセージIDが転送メッセージかどうかを判定する +func (uc *TransferMessageUseCase) IsTransferredMessage(msgID string) bool { + uc.mappingMutex.RLock() + defer uc.mappingMutex.RUnlock() + + // WHY: transferMsgMappingの値として存在する場合、そのメッセージは転送メッセージ + for _, transferredMsgID := range uc.transferMsgMapping { + if transferredMsgID == msgID { + return true + } + } + return false +}