craft-bot/messageCleaner.go

92 lines
1.6 KiB
Go

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
}
}
}