63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"github.com/celestix/gotgproto/dispatcher"
|
|
"github.com/celestix/gotgproto/ext"
|
|
"github.com/celestix/gotgproto/storage"
|
|
"github.com/charmbracelet/log"
|
|
"github.com/gotd/td/telegram/query/dialogs"
|
|
"github.com/krau/SaveAny-Bot/client/user"
|
|
"github.com/krau/SaveAny-Bot/common/i18n"
|
|
"github.com/krau/SaveAny-Bot/common/i18n/i18nk"
|
|
"github.com/krau/SaveAny-Bot/config"
|
|
)
|
|
|
|
var syncpeerMu sync.Mutex
|
|
|
|
func handleSyncpeersCmd(ctx *ext.Context, u *ext.Update) error {
|
|
if !config.C().Telegram.Userbot.Enable {
|
|
return dispatcher.EndGroups
|
|
}
|
|
syncpeerMu.Lock()
|
|
defer syncpeerMu.Unlock()
|
|
uctx := user.GetCtx()
|
|
if uctx == nil {
|
|
return dispatcher.EndGroups
|
|
}
|
|
ctx.Reply(u, ext.ReplyTextString(i18n.T(i18nk.BotMsgSyncpeersStart)), nil)
|
|
tapi := uctx.Raw
|
|
peerStorage := uctx.PeerStorage
|
|
log.FromContext(ctx).Info("Starting to sync peers...")
|
|
count := 0
|
|
err := dialogs.NewQueryBuilder(tapi).GetDialogs().BatchSize(50).ForEach(ctx, func(ctx context.Context, e dialogs.Elem) error {
|
|
for cid, channel := range e.Entities.Channels() {
|
|
peerStorage.AddPeer(cid, channel.AccessHash, storage.TypeChannel, channel.Username)
|
|
count++
|
|
}
|
|
for uid, user := range e.Entities.Users() {
|
|
peerStorage.AddPeer(uid, user.AccessHash, storage.TypeUser, user.Username)
|
|
count++
|
|
}
|
|
for gid := range e.Entities.Chats() {
|
|
peerStorage.AddPeer(gid, storage.DefaultAccessHash, storage.TypeChat, storage.DefaultUsername)
|
|
count++
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
log.FromContext(ctx).Error("Failed to sync peers", "error", err)
|
|
ctx.Reply(u, ext.ReplyTextString(i18n.T(i18nk.BotMsgSyncpeersFailed, map[string]any{
|
|
"Error": err.Error(),
|
|
})), nil)
|
|
return dispatcher.EndGroups
|
|
}
|
|
log.FromContext(ctx).Info("Finished syncing peers")
|
|
ctx.Reply(u, ext.ReplyTextString(i18n.T(i18nk.BotMsgSyncpeersSuccess, map[string]any{
|
|
"Count": count,
|
|
})), nil)
|
|
return dispatcher.EndGroups
|
|
}
|