tgf / internal /bot /client.go
Mohammad Shahid
.
f592c10
package bot
import (
"TelegramCloud/tgf/config"
"TelegramCloud/tgf/internal/db"
"context"
"time"
"go.uber.org/zap"
"github.com/celestix/gotgproto"
"github.com/celestix/gotgproto/sessionMaker"
"github.com/glebarez/sqlite"
)
var Bot *gotgproto.Client
var InstanceMgr *InstanceManager
func StartClient(log *zap.Logger) (*gotgproto.Client, error) {
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
defer cancel()
resultChan := make(chan struct {
client *gotgproto.Client
err error
})
go func(ctx context.Context) {
client, err := gotgproto.NewClient(
int(config.ValueOf.ApiID),
config.ValueOf.ApiHash,
gotgproto.ClientTypeBot(config.ValueOf.BotToken),
&gotgproto.ClientOpts{
Session: sessionMaker.SqlSession(
sqlite.Open("/tmp/fsb.session"),
),
DisableCopyright: true,
},
)
resultChan <- struct {
client *gotgproto.Client
err error
}{client, err}
}(ctx)
select {
case <-ctx.Done():
return nil, ctx.Err()
case result := <-resultChan:
if result.err != nil {
return nil, result.err
}
log.Info("Client started", zap.String("username", result.client.Self.Username))
Bot = result.client
return result.client, nil
}
}
// InitInstanceManager initializes the bot instance manager
func InitInstanceManager(userBotMgr *db.UserBotManager, log *zap.Logger) {
InstanceMgr = NewInstanceManager(userBotMgr, log)
log.Info("Bot instance manager initialized")
}
// GetBotForUser returns the appropriate bot for a user (personal or main bot)
func GetBotForUser(ctx context.Context, userID int64, log *zap.Logger) *gotgproto.Client {
// Try to get user's personal bot first
if InstanceMgr != nil {
userBot, err := InstanceMgr.GetBotForUser(ctx, userID)
if err != nil {
log.Warn("Failed to get user bot, falling back to main bot",
zap.Int64("userID", userID),
zap.Error(err))
} else {
log.Debug("Using user's personal bot", zap.Int64("userID", userID))
return userBot
}
}
// Fall back to main bot
log.Debug("Using main bot", zap.Int64("userID", userID))
return Bot
}