Spaces:
Paused
Paused
| package bot | |
| import ( | |
| "TelegramCloud/tgf/config" | |
| "errors" | |
| "github.com/celestix/gotgproto" | |
| "github.com/celestix/gotgproto/sessionMaker" | |
| "github.com/gotd/td/tg" | |
| "go.uber.org/zap" | |
| ) | |
| type UserBotStruct struct { | |
| log *zap.Logger | |
| client *gotgproto.Client | |
| } | |
| var UserBot *UserBotStruct = &UserBotStruct{} | |
| func StartUserBot(l *zap.Logger) { | |
| log := l.Named("USERBOT") | |
| if config.ValueOf.UserSession == "" { | |
| log.Warn("User session is empty") | |
| return | |
| } | |
| log.Sugar().Infoln("Starting userbot") | |
| client, err := gotgproto.NewClient( | |
| int(config.ValueOf.ApiID), | |
| config.ValueOf.ApiHash, | |
| gotgproto.ClientTypePhone(""), | |
| &gotgproto.ClientOpts{ | |
| Session: sessionMaker.PyrogramSession(config.ValueOf.UserSession), | |
| DisableCopyright: true, | |
| }, | |
| ) | |
| if err != nil { | |
| log.Error("Failed to start userbot", zap.Error(err)) | |
| return | |
| } | |
| UserBot.log = log | |
| UserBot.client = client | |
| log.Info("Userbot started", zap.String("username", client.Self.Username), zap.String("FirstName", client.Self.FirstName), zap.String("LastName", client.Self.LastName)) | |
| if err := UserBot.AddBotsAsAdmins(); err != nil { | |
| log.Error("Failed to add bots as admins", zap.Error(err)) | |
| return | |
| } | |
| } | |
| func (u *UserBotStruct) AddBotsAsAdmins() error { | |
| u.log.Info("Preparing to add bots as admins") | |
| ctx := u.client.CreateContext() | |
| channel := config.ValueOf.LogChannelID | |
| channelInfos, err := u.client.API().ChannelsGetChannels( | |
| ctx, | |
| []tg.InputChannelClass{ | |
| &tg.InputChannel{ | |
| ChannelID: channel, | |
| }, | |
| }, | |
| ) | |
| if err != nil { | |
| u.log.Error("Failed to get channel info", zap.Error(err)) | |
| return errors.New("failed to get channel info") | |
| } | |
| if len(channelInfos.GetChats()) == 0 { | |
| return errors.New("no channels found") | |
| } | |
| inputChannel := channelInfos.GetChats()[0].(*tg.Channel).AsInput() | |
| currentAdmins := []int64{} | |
| admins, err := u.client.API().ChannelsGetParticipants(ctx, &tg.ChannelsGetParticipantsRequest{ | |
| Channel: inputChannel, | |
| Filter: &tg.ChannelParticipantsAdmins{}, | |
| Offset: 0, | |
| Limit: 100, | |
| }) | |
| if err != nil { | |
| u.log.Error("Failed to get admins", zap.Error(err)) | |
| return err | |
| } | |
| for _, admin := range admins.(*tg.ChannelsChannelParticipants).Participants { | |
| if user, ok := admin.(*tg.ChannelParticipantAdmin); ok { | |
| currentAdmins = append(currentAdmins, user.UserID) | |
| } | |
| } | |
| for _, bot := range Workers.Bots { | |
| isAdmin := false | |
| for _, admin := range currentAdmins { | |
| if admin == bot.Self.ID { | |
| u.log.Sugar().Infof("Bot @%s is already an admin", bot.Self.Username) | |
| isAdmin = true | |
| continue | |
| } | |
| } | |
| if isAdmin { | |
| continue | |
| } | |
| botInfo, err := ctx.ResolveUsername(bot.Self.Username) | |
| if err != nil { | |
| u.log.Warn(err.Error()) | |
| } | |
| _, err = u.client.API().ChannelsEditAdmin( | |
| u.client.CreateContext().Context, | |
| &tg.ChannelsEditAdminRequest{ | |
| Channel: inputChannel, | |
| UserID: botInfo.GetInputUser(), | |
| AdminRights: tg.ChatAdminRights{ | |
| PostMessages: true, | |
| }, | |
| Rank: "admin", | |
| }, | |
| ) | |
| if err != nil { | |
| u.log.Sugar().Warnf("Failed to add @%s as admin", bot.Self.Username) | |
| u.log.Warn(err.Error()) | |
| } | |
| u.log.Sugar().Infof("Added @%s as admin", bot.Self.Username) | |
| } | |
| return nil | |
| } | |