package main import ( "context" "sync" "time" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" ) type messageToClean struct { messID int chatID int64 timer *time.Timer } type messageCleaner struct { botApi *tgbotapi.BotAPI wg *sync.WaitGroup messages []*messageToClean mx sync.Mutex } func newMessageCleaner(bot *tgbotapi.BotAPI, wg *sync.WaitGroup) *messageCleaner { return &messageCleaner{ botApi: bot, wg: wg, messages: make([]*messageToClean, 0), } } func (m *messageCleaner) add(ctx context.Context, messID int, chatID int64, d time.Duration) { m.mx.Lock() defer m.mx.Unlock() for _, ms := range m.messages { if ms.chatID == chatID && ms.messID == messID { return } } m.wg.Add(1) go func() { defer m.wg.Done() ms := &messageToClean{ messID: messID, chatID: chatID, timer: time.NewTimer(d), } m.messages = append(m.messages, ms) select { case <-ms.timer.C: case <-ctx.Done(): } m.remove(messID, chatID) _, _ = m.botApi.DeleteMessage(tgbotapi.DeleteMessageConfig{ MessageID: messID, ChatID: chatID, }) }() } func (m *messageCleaner) remove(messID int, chatID int64) { m.mx.Lock() defer m.mx.Unlock() for i, ms := range m.messages { if ms.chatID == chatID && ms.messID == messID { m.messages = append(m.messages[:i], m.messages[i+1:]...) return } } } func (m *messageCleaner) resetTimer(messID int, chatID int64, d time.Duration) { m.mx.Lock() defer m.mx.Unlock() for _, ms := range m.messages { if ms.chatID == chatID && ms.messID == messID { ms.timer.Reset(d) return } } }