2024-06-25 14:37:26 +00:00
package telegram
2024-09-20 21:43:35 +00:00
//
// import (
// "context"
// "errors"
// "fmt"
// "path/filepath"
// "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
// "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
// "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
// "penahub.gitlab.yandexcloud.net/backend/tdlib/client"
// "sync"
// "time"
// )
//
// type TelegramClient struct {
// repo *dal.DAL
// TgClients map[int64]*client.Client
// WaitingClients map[string]WaitingClient
// mu sync.Mutex
// }
//
// type WaitingClient struct {
// PreviousReq AuthTgUserReq
// Authorizer *client.ClientAuthorizer
// }
//
// func NewTelegramClient(ctx context.Context, repo *dal.DAL) (*TelegramClient, error) {
// tgClient := &TelegramClient{
// repo: repo,
// TgClients: make(map[int64]*client.Client),
// WaitingClients: make(map[string]WaitingClient),
// }
//
// allTgAccounts, err := repo.TgRepo.GetAllTgAccounts(ctx)
// if err != nil {
// if errors.Is(err, pj_errors.ErrNotFound) {
// return tgClient, nil
// }
// return nil, err
// }
//
// for _, account := range allTgAccounts {
// if account.Status == model.ActiveTg {
// authorizer := client.ClientAuthorizerr()
// authorizer.TdlibParameters <- &client.SetTdlibParametersRequest{
// UseTestDc: false,
// DatabaseDirectory: filepath.Join(".tdlib", "database"),
// FilesDirectory: filepath.Join(".tdlib", "files"),
// UseFileDatabase: true,
// UseChatInfoDatabase: true,
// UseMessageDatabase: true,
// UseSecretChats: true,
// ApiId: account.ApiID,
// ApiHash: account.ApiHash,
// SystemLanguageCode: "en",
// DeviceModel: "Server",
// SystemVersion: "1.0.0",
// ApplicationVersion: "1.0.0",
// }
//
// _, err := client.SetLogVerbosityLevel(&client.SetLogVerbosityLevelRequest{
// NewVerbosityLevel: 1,
// })
// if err != nil {
// return nil, err
// }
//
// var tdlibClient *client.Client
// var goErr error
// go func() {
// tdlibClient, goErr = client.NewClient(authorizer)
// if goErr != nil {
// fmt.Println("new client failed", err)
// return
// }
// fmt.Println("i am down")
// }()
// if goErr != nil {
// return nil, goErr
// }
//
// for {
// state, ok := <-authorizer.State
// if !ok {
// break
// }
// fmt.Println("currnet state:", state)
// switch state.AuthorizationStateType() {
// case client.TypeAuthorizationStateWaitPhoneNumber:
// authorizer.PhoneNumber <- account.PhoneNumber
// case client.TypeAuthorizationStateWaitCode:
// err := tgClient.repo.TgRepo.UpdateStatusTg(ctx, account.ID, model.InactiveTg)
// if err != nil {
// return nil, err
// }
// case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
// err := tgClient.repo.TgRepo.UpdateStatusTg(ctx, account.ID, model.InactiveTg)
// if err != nil {
// return nil, err
// }
// case client.TypeAuthorizationStateReady:
// // костыль так как в либе тож костыль стоит пока там ьд обновиться будет ниловый всегда клиент
// time.Sleep(3 * time.Second)
// me, err := tdlibClient.GetMe()
// if err != nil {
// return nil, err
// }
// fmt.Printf("Me: %s %s [%v]", me.FirstName, me.LastName, me.Usernames)
// tgClient.mu.Lock()
// tgClient.TgClients[account.ID] = tdlibClient
// tgClient.mu.Unlock()
// break
// case client.TypeAuthorizationStateWaitPassword:
// authorizer.Password <- account.Password
// }
// }
// }
// }
// return tgClient, nil
// }
//
// type AuthTgUserReq struct {
// ApiID int32 `json:"api_id"`
// ApiHash string `json:"api_hash"`
// PhoneNumber string `json:"phone_number"`
// Password string `json:"password"`
// }
//
// func (tg *TelegramClient) AddedToMap(data WaitingClient, id string) {
// fmt.Println("AddedToMap")
// tg.mu.Lock()
// defer tg.mu.Unlock()
// tg.WaitingClients[id] = data
// }
//
// func (tg *TelegramClient) GetFromMap(id string) (WaitingClient, bool) {
// fmt.Println("GetFromMap")
// tg.mu.Lock()
// defer tg.mu.Unlock()
// if data, ok := tg.WaitingClients[id]; ok {
// delete(tg.WaitingClients, id)
// return data, true
// }
// return WaitingClient{}, false
// }
//
// func (tg *TelegramClient) SaveTgAccount(appID int32, appHash string, tdLibClient *client.Client) {
// account, err := tg.repo.TgRepo.SearchIDByAppIDanAppHash(context.Background(), appID, appHash)
// if err != nil {
// fmt.Println("err SaveTgAccount", err)
// return
// }
// if account.Status == model.ActiveTg {
// tg.mu.Lock()
// defer tg.mu.Unlock()
// tg.TgClients[account.ID] = tdLibClient
// }
// }
//
// func (tg *TelegramClient) CreateChannel(channelName string, botID int64) (string, int64, error) {
// tg.mu.Lock()
// defer tg.mu.Unlock()
// if len(tg.TgClients) == 0 {
// return "", 0, errors.New("no active Telegram clients")
// }
// var lastError error
// var inviteLink string
// var channelId int64
// for _, activeClient := range tg.TgClients {
// // todo пока не понимаю это какой то рандом? в один день бот норм находится в другой уже не находится хотя абсолютно с точки зрения тг кода этой функции и бота не менялось
// _, err := activeClient.GetUser(&client.GetUserRequest{
// UserId: botID,
// })
// if err != nil {
// lastError = fmt.Errorf("not found this bot, make privacy off: %v", err)
// continue
// }
//
// // todo нужно поймать ошибку, при которой либо бан либо медленный редим включается для того чтобы прервать
// // исполнение клиента текущего аккаунта и дать задачу следующему пока поймал 1 раз и не запомнил больше не получается
// channel, err := activeClient.CreateNewSupergroupChat(&client.CreateNewSupergroupChatRequest{
// Title: channelName,
// IsChannel: true,
// Description: "private channel",
// })
// if err != nil {
// lastError = fmt.Errorf("failed to create channel: %s", err.Error())
// continue
// }
//
// _, err = activeClient.SetChatMemberStatus(&client.SetChatMemberStatusRequest{
// ChatId: channel.Id,
// MemberId: &client.MessageSenderUser{UserId: botID},
// Status: &client.ChatMemberStatusAdministrator{
// CustomTitle: "bot",
// Rights: &client.ChatAdministratorRights{
// CanManageChat: true,
// CanChangeInfo: true,
// CanPostMessages: true,
// CanEditMessages: true,
// CanDeleteMessages: true,
// CanInviteUsers: true,
// CanRestrictMembers: true,
// CanPinMessages: true,
// CanManageTopics: true,
// CanPromoteMembers: true,
// CanManageVideoChats: true,
// CanPostStories: true,
// CanEditStories: true,
// CanDeleteStories: true,
// },
// },
// })
// if err != nil {
// lastError = fmt.Errorf("failed to make bot admin: %s", err.Error())
// continue
// }
//
// inviteLinkResp, err := activeClient.CreateChatInviteLink(&client.CreateChatInviteLinkRequest{
// ChatId: channel.Id,
// Name: channelName,
// ExpirationDate: 0,
// MemberLimit: 0,
// CreatesJoinRequest: false,
// })
// if err != nil {
// lastError = fmt.Errorf("failed to get invite link: %s", err.Error())
// continue
// }
//
// _, err = activeClient.LeaveChat(&client.LeaveChatRequest{
// ChatId: channel.Id,
// })
// if err != nil {
// lastError = fmt.Errorf("failed to leave the channel: %s", err.Error())
// continue
// }
//
// inviteLink = inviteLinkResp.InviteLink
// channelId = channel.Id
// return inviteLink, channelId, nil
// }
//
// return "", 0, lastError
// }