mirror of
https://github.com/HugeFrog24/go-telegram-bot.git
synced 2026-08-28 22:11:38 +00:00
89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/go-telegram/bot/models"
|
|
)
|
|
|
|
const albumFlushWindow = 1 * time.Second
|
|
|
|
type pendingAlbum struct {
|
|
items []*models.Message
|
|
chatID, userID int64
|
|
username, firstName, lastName, languageCode string
|
|
isPremium bool
|
|
messageTime int
|
|
businessConnectionID string
|
|
timer *time.Timer
|
|
}
|
|
|
|
func (b *Bot) bufferAlbumItem(
|
|
ctx context.Context,
|
|
msg *models.Message,
|
|
chatID, userID int64,
|
|
username, firstName, lastName string,
|
|
isPremium bool,
|
|
languageCode string,
|
|
messageTime int,
|
|
businessConnectionID string,
|
|
) {
|
|
b.albumBuffersMu.Lock()
|
|
defer b.albumBuffersMu.Unlock()
|
|
|
|
album, exists := b.albumBuffers[msg.MediaGroupID]
|
|
if !exists {
|
|
album = &pendingAlbum{
|
|
chatID: chatID,
|
|
userID: userID,
|
|
username: username,
|
|
firstName: firstName,
|
|
lastName: lastName,
|
|
isPremium: isPremium,
|
|
languageCode: languageCode,
|
|
messageTime: messageTime,
|
|
businessConnectionID: businessConnectionID,
|
|
}
|
|
b.albumBuffers[msg.MediaGroupID] = album
|
|
}
|
|
album.items = append(album.items, msg)
|
|
|
|
if album.timer != nil {
|
|
album.timer.Stop()
|
|
}
|
|
mediaGroupID := msg.MediaGroupID
|
|
album.timer = time.AfterFunc(albumFlushWindow, func() {
|
|
b.flushAlbum(ctx, mediaGroupID)
|
|
})
|
|
}
|
|
|
|
func (b *Bot) flushAlbum(ctx context.Context, mediaGroupID string) {
|
|
b.albumBuffersMu.Lock()
|
|
album, exists := b.albumBuffers[mediaGroupID]
|
|
if !exists {
|
|
b.albumBuffersMu.Unlock()
|
|
return
|
|
}
|
|
delete(b.albumBuffers, mediaGroupID)
|
|
items := album.items
|
|
captured := *album
|
|
b.albumBuffersMu.Unlock()
|
|
|
|
sort.Slice(items, func(i, j int) bool { return items[i].ID < items[j].ID })
|
|
|
|
if !b.checkRateLimits(captured.userID) {
|
|
b.sendRateLimitExceededMessage(ctx, captured.chatID, captured.businessConnectionID)
|
|
return
|
|
}
|
|
|
|
b.handlePhotoMessage(
|
|
ctx, items,
|
|
captured.chatID, captured.userID,
|
|
captured.username, captured.firstName, captured.lastName,
|
|
captured.isPremium, captured.languageCode, captured.messageTime,
|
|
captured.businessConnectionID,
|
|
)
|
|
}
|