debug - remove when reqady for telegram

This commit is contained in:
skeris 2024-09-21 00:43:35 +03:00
parent 92736a4da6
commit 1def139b22
8 changed files with 387 additions and 445 deletions

@ -18,13 +18,13 @@ import (
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/brokers" "penahub.gitlab.yandexcloud.net/backend/quiz/core/brokers"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/auth" "penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/auth"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram" //"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/initialize" "penahub.gitlab.yandexcloud.net/backend/quiz/core/initialize"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/models" "penahub.gitlab.yandexcloud.net/backend/quiz/core/models"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/server" "penahub.gitlab.yandexcloud.net/backend/quiz/core/server"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/service" "penahub.gitlab.yandexcloud.net/backend/quiz/core/service"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/tools" "penahub.gitlab.yandexcloud.net/backend/quiz/core/tools"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/workers" //"penahub.gitlab.yandexcloud.net/backend/quiz/core/workers"
"penahub.gitlab.yandexcloud.net/external/trashlog/wrappers/zaptrashlog" "penahub.gitlab.yandexcloud.net/external/trashlog/wrappers/zaptrashlog"
"time" "time"
) )
@ -169,19 +169,19 @@ func New(ctx context.Context, opts interface{}, ver appInit.Version) (appInit.Co
privilegeController := privilege.NewPrivilege(clientData, fiberClient) privilegeController := privilege.NewPrivilege(clientData, fiberClient)
go tools.PublishPrivilege(privilegeController, 10, 5*time.Minute) go tools.PublishPrivilege(privilegeController, 10, 5*time.Minute)
tgClient, err := telegram.NewTelegramClient(ctx, pgdal) // tgClient, err := telegram.NewTelegramClient(ctx, pgdal)
if err != nil { // if err != nil {
panic(fmt.Sprintf("failed init tg clietns: %v", err)) // panic(fmt.Sprintf("failed init tg clietns: %v", err))
} // }
//
tgWC := workers.NewTgListenerWC(workers.Deps{ // tgWC := workers.NewTgListenerWC(workers.Deps{
BotID: int64(6712573453), // todo убрать // BotID: int64(6712573453), // todo убрать
Redis: redisClient, // Redis: redisClient,
Dal: pgdal, // Dal: pgdal,
TgClient: tgClient, // TgClient: tgClient,
}) // })
//
go tgWC.Start(ctx) // go tgWC.Start(ctx)
// todo подумать над реализацией всего а то пока мне кажется что немного каша получается такой предикт что через некоторое время // todo подумать над реализацией всего а то пока мне кажется что немного каша получается такой предикт что через некоторое время
// сложно будет разобраться что есть где // сложно будет разобраться что есть где
@ -209,7 +209,7 @@ func New(ctx context.Context, opts interface{}, ver appInit.Version) (appInit.Co
Producer: producer, Producer: producer,
ServiceName: options.ServiceName, ServiceName: options.ServiceName,
ChDAL: chDal, ChDAL: chDal,
TelegramClient: tgClient, // TelegramClient: tgClient,
RedisClient: redisClient, RedisClient: redisClient,
S3Prefix: options.S3Prefix, S3Prefix: options.S3Prefix,
}) })

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

@ -24,6 +24,9 @@ services:
TRASH_LOG_HOST: "10.8.0.15:7113" TRASH_LOG_HOST: "10.8.0.15:7113"
MODULE_LOGGER: "quiz-core-staging" MODULE_LOGGER: "quiz-core-staging"
CLICK_HOUSE_CRED: "clickhouse://10.8.0.15:9000/default?sslmode=disable" CLICK_HOUSE_CRED: "clickhouse://10.8.0.15:9000/default?sslmode=disable"
REDIS_HOST: '10.8.0.5:6379'
REDIS_PASSWORD: 'Redalert2'
REDIS_DB: 2
ports: ports:
- 10.8.0.5:1488:1488 - 10.8.0.5:1488:1488
- 10.8.0.5:9000:9000 - 10.8.0.5:9000:9000

1
go.mod

@ -22,7 +22,6 @@ require (
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240607202348-efe5f2bf3e8c
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240711133242-0b8534fae5b2 penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240711133242-0b8534fae5b2
penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990 penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990
penahub.gitlab.yandexcloud.net/backend/tdlib v0.0.0-20240701075856-1731684c936f
penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3
penahub.gitlab.yandexcloud.net/external/trashlog v0.1.6-0.20240827173635-78ce9878c387 penahub.gitlab.yandexcloud.net/external/trashlog v0.1.6-0.20240827173635-78ce9878c387
) )

2
go.sum

@ -290,8 +290,6 @@ penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240711133242-0b8
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240711133242-0b8534fae5b2/go.mod h1:uOuosXduBzd2WbLH6TDZO7ME7ZextulA662oZ6OsoB0= penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240711133242-0b8534fae5b2/go.mod h1:uOuosXduBzd2WbLH6TDZO7ME7ZextulA662oZ6OsoB0=
penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990 h1:jiO8GWO+3sCnDAV8/NAV8tQIUwae/I6/xiDilW7zf0o= penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990 h1:jiO8GWO+3sCnDAV8/NAV8tQIUwae/I6/xiDilW7zf0o=
penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990/go.mod h1:zswBuTwmEsFHBVRu1nkG3/Fwylk5Vcm8OUm9iWxccSE= penahub.gitlab.yandexcloud.net/backend/quiz/worker.git v0.0.0-20240421230341-0e086fcbb990/go.mod h1:zswBuTwmEsFHBVRu1nkG3/Fwylk5Vcm8OUm9iWxccSE=
penahub.gitlab.yandexcloud.net/backend/tdlib v0.0.0-20240701075856-1731684c936f h1:Qli89wgu0T7nG4VECXZOZ40fjE/hVVfxF3hTaSYS008=
penahub.gitlab.yandexcloud.net/backend/tdlib v0.0.0-20240701075856-1731684c936f/go.mod h1:AkE19hcbDwB7hoEASwImm7rUI+cK/8jMVJaTvMK4F+c=
penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 h1:sf6e2mp582L3i/FMDd2q6QuWm1njRXzYpIX0SipsvM4= penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3 h1:sf6e2mp582L3i/FMDd2q6QuWm1njRXzYpIX0SipsvM4=
penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3/go.mod h1:i7M72RIpkSjcQtHID6KKj9RT/EYZ1rxS6tIPKWa/BSY= penahub.gitlab.yandexcloud.net/devops/linters/golang.git v0.0.0-20240829220549-d35409b619a3/go.mod h1:i7M72RIpkSjcQtHID6KKj9RT/EYZ1rxS6tIPKWa/BSY=
penahub.gitlab.yandexcloud.net/external/trashlog v0.1.6-0.20240827173635-78ce9878c387 h1:G+GIhkkvUsM9No2rf2D4kvQ2ExTw9KxlA8vsSnC0ywU= penahub.gitlab.yandexcloud.net/external/trashlog v0.1.6-0.20240827173635-78ce9878c387 h1:G+GIhkkvUsM9No2rf2D4kvQ2ExTw9KxlA8vsSnC0ywU=

@ -6,7 +6,7 @@ import (
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/brokers" "penahub.gitlab.yandexcloud.net/backend/quiz/core/brokers"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/auth" "penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/auth"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram" // "penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram"
) )
// Service is an entity for http requests handling // Service is an entity for http requests handling
@ -16,7 +16,7 @@ type Service struct {
producer *brokers.Producer producer *brokers.Producer
serviceName string serviceName string
chDAL *dal.ClickHouseDAL chDAL *dal.ClickHouseDAL
telegramClient *telegram.TelegramClient // telegramClient *telegram.TelegramClient
redisClient *redis.Client redisClient *redis.Client
s3Prefix string s3Prefix string
} }
@ -27,7 +27,7 @@ type Deps struct {
Producer *brokers.Producer Producer *brokers.Producer
ServiceName string ServiceName string
ChDAL *dal.ClickHouseDAL ChDAL *dal.ClickHouseDAL
TelegramClient *telegram.TelegramClient // TelegramClient *telegram.TelegramClient
RedisClient *redis.Client RedisClient *redis.Client
S3Prefix string S3Prefix string
} }
@ -39,7 +39,7 @@ func New(deps Deps) *Service {
producer: deps.Producer, producer: deps.Producer,
serviceName: deps.ServiceName, serviceName: deps.ServiceName,
chDAL: deps.ChDAL, chDAL: deps.ChDAL,
telegramClient: deps.TelegramClient, // telegramClient: deps.TelegramClient,
redisClient: deps.RedisClient, redisClient: deps.RedisClient,
s3Prefix: deps.S3Prefix, s3Prefix: deps.S3Prefix,
} }

@ -2,14 +2,14 @@ package service
import ( import (
"errors" "errors"
"fmt" //"fmt"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/rs/xid" // "github.com/rs/xid"
"path/filepath" //"path/filepath"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" // "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/pj_errors"
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram" // "penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram"
"penahub.gitlab.yandexcloud.net/backend/tdlib/client" // "penahub.gitlab.yandexcloud.net/backend/tdlib/client"
"strconv" "strconv"
) )
@ -32,86 +32,87 @@ func (s *Service) GetPoolTgAccounts(ctx *fiber.Ctx) error {
} }
func (s *Service) AddingTgAccount(ctx *fiber.Ctx) error { func (s *Service) AddingTgAccount(ctx *fiber.Ctx) error {
var req telegram.AuthTgUserReq // var req telegram.AuthTgUserReq
if err := ctx.BodyParser(&req); err != nil { // if err := ctx.BodyParser(&req); err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data") // return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
} // }
if req.ApiID == 0 || req.ApiHash == "" || req.Password == "" || req.PhoneNumber == "" { // if req.ApiID == 0 || req.ApiHash == "" || req.Password == "" || req.PhoneNumber == "" {
return ctx.Status(fiber.StatusBadRequest).SendString("empty required fields") // return ctx.Status(fiber.StatusBadRequest).SendString("empty required fields")
} // }
allAccounts, err := s.dal.TgRepo.GetAllTgAccounts(ctx.Context()) // allAccounts, err := s.dal.TgRepo.GetAllTgAccounts(ctx.Context())
if err != nil && !errors.Is(err, pj_errors.ErrNotFound) { // if err != nil && !errors.Is(err, pj_errors.ErrNotFound) {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) // return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
} // }
if !errors.Is(err, pj_errors.ErrNotFound) { // if !errors.Is(err, pj_errors.ErrNotFound) {
for _, account := range allAccounts { // for _, account := range allAccounts {
if account.ApiID == req.ApiID && account.ApiHash == req.ApiHash && account.Status == model.ActiveTg { // if account.ApiID == req.ApiID && account.ApiHash == req.ApiHash && account.Status == model.ActiveTg {
return ctx.Status(fiber.StatusConflict).SendString("this account already exist and active") // return ctx.Status(fiber.StatusConflict).SendString("this account already exist and active")
} // }
} // }
} // }
authorizer := client.ClientAuthorizerr() // authorizer := client.ClientAuthorizerr()
authorizer.TdlibParameters <- &client.SetTdlibParametersRequest{ // authorizer.TdlibParameters <- &client.SetTdlibParametersRequest{
UseTestDc: false, // UseTestDc: false,
DatabaseDirectory: filepath.Join(".tdlib", "database"), // DatabaseDirectory: filepath.Join(".tdlib", "database"),
FilesDirectory: filepath.Join(".tdlib", "files"), // FilesDirectory: filepath.Join(".tdlib", "files"),
UseFileDatabase: true, // UseFileDatabase: true,
UseChatInfoDatabase: true, // UseChatInfoDatabase: true,
UseMessageDatabase: true, // UseMessageDatabase: true,
UseSecretChats: true, // UseSecretChats: true,
ApiId: req.ApiID, // ApiId: req.ApiID,
ApiHash: req.ApiHash, // ApiHash: req.ApiHash,
SystemLanguageCode: "en", // SystemLanguageCode: "en",
DeviceModel: "Server", // DeviceModel: "Server",
SystemVersion: "1.0.0", // SystemVersion: "1.0.0",
ApplicationVersion: "1.0.0", // ApplicationVersion: "1.0.0",
} // }
//
_, err = client.SetLogVerbosityLevel(&client.SetLogVerbosityLevelRequest{ // _, err = client.SetLogVerbosityLevel(&client.SetLogVerbosityLevelRequest{
NewVerbosityLevel: 1, // NewVerbosityLevel: 1,
}) // })
if err != nil { // if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) // return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
} // }
//
var tdlibClient *client.Client // var tdlibClient *client.Client
// завершается уже в другом контроллере // // завершается уже в другом контроллере
var goErr error // var goErr error
// todo ужно продумать завершение горутины если код вставлять не пошли // // todo ужно продумать завершение горутины если код вставлять не пошли
go func() { // go func() {
tdlibClient, goErr = client.NewClient(authorizer) // tdlibClient, goErr = client.NewClient(authorizer)
if goErr != nil { // if goErr != nil {
fmt.Println("new client failed", err) // fmt.Println("new client failed", err)
return // return
} // }
s.telegramClient.SaveTgAccount(req.ApiID, req.ApiHash, tdlibClient) // s.telegramClient.SaveTgAccount(req.ApiID, req.ApiHash, tdlibClient)
fmt.Println("i am down") // fmt.Println("i am down")
}() // }()
if goErr != nil { // if goErr != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(goErr.Error()) // return ctx.Status(fiber.StatusInternalServerError).SendString(goErr.Error())
} // }
//
for { // for {
state, ok := <-authorizer.State // state, ok := <-authorizer.State
if !ok { // if !ok {
return ctx.Status(fiber.StatusOK).SendString("state chan is close auth maybe ok") // return ctx.Status(fiber.StatusOK).SendString("state chan is close auth maybe ok")
} // }
fmt.Println("currnet state:", state) // fmt.Println("currnet state:", state)
switch state.AuthorizationStateType() { // switch state.AuthorizationStateType() {
case client.TypeAuthorizationStateWaitPhoneNumber: // case client.TypeAuthorizationStateWaitPhoneNumber:
authorizer.PhoneNumber <- req.PhoneNumber // authorizer.PhoneNumber <- req.PhoneNumber
case client.TypeAuthorizationStateWaitCode: // case client.TypeAuthorizationStateWaitCode:
signature := xid.New() // signature := xid.New()
s.telegramClient.AddedToMap(telegram.WaitingClient{ // s.telegramClient.AddedToMap(telegram.WaitingClient{
PreviousReq: req, // PreviousReq: req,
Authorizer: authorizer, // Authorizer: authorizer,
}, signature.String()) // }, signature.String())
return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"signature": signature.String()}) // return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"signature": signature.String()})
//
case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed: // case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state)) // return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state))
} // }
} // }
return nil
} }
func (s *Service) SettingTgCode(ctx *fiber.Ctx) error { func (s *Service) SettingTgCode(ctx *fiber.Ctx) error {
@ -127,36 +128,38 @@ func (s *Service) SettingTgCode(ctx *fiber.Ctx) error {
return ctx.Status(fiber.StatusBadRequest).SendString("empty required fields") return ctx.Status(fiber.StatusBadRequest).SendString("empty required fields")
} }
data, ok := s.telegramClient.GetFromMap(req.Signature) // data, ok := s.telegramClient.GetFromMap(req.Signature)
if !ok { // if !ok {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid id, don't have data") // return ctx.Status(fiber.StatusBadRequest).SendString("Invalid id, don't have data")
} // }
data.Authorizer.Code <- req.Code // data.Authorizer.Code <- req.Code
for { // for {
state, ok := <-data.Authorizer.State // state, ok := <-data.Authorizer.State
if !ok { // if !ok {
return ctx.Status(fiber.StatusNoContent).SendString("state chan is close auth maybe ok") // return ctx.Status(fiber.StatusNoContent).SendString("state chan is close auth maybe ok")
} // }
fmt.Println("currnet state:", state) // fmt.Println("currnet state:", state)
switch state.AuthorizationStateType() { // }
case client.TypeAuthorizationStateReady: return nil
id, err := s.dal.TgRepo.CreateTgAccount(ctx.Context(), model.TgAccount{ // switch state.AuthorizationStateType() {
ApiID: data.PreviousReq.ApiID, // case client.TypeAuthorizationStateReady:
ApiHash: data.PreviousReq.ApiHash, // id, err := s.dal.TgRepo.CreateTgAccount(ctx.Context(), model.TgAccount{
PhoneNumber: data.PreviousReq.PhoneNumber, // ApiID: data.PreviousReq.ApiID,
Status: model.ActiveTg, // ApiHash: data.PreviousReq.ApiHash,
Password: data.PreviousReq.Password, // PhoneNumber: data.PreviousReq.PhoneNumber,
}) // Status: model.ActiveTg,
if err != nil { // Password: data.PreviousReq.Password,
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error()) // })
} // if err != nil {
return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"id": id}) // return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
case client.TypeAuthorizationStateWaitPassword: // }
data.Authorizer.Password <- data.PreviousReq.Password // return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"id": id})
case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed: // case client.TypeAuthorizationStateWaitPassword:
return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state)) // data.Authorizer.Password <- data.PreviousReq.Password
} // case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
} // return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state))
// }
// }
} }
func (s *Service) DeleteTgAccountByID(ctx *fiber.Ctx) error { func (s *Service) DeleteTgAccountByID(ctx *fiber.Ctx) error {

@ -187,66 +187,6 @@ func handleImage(file *excelize.File, sheet, cell, content string, count, row in
fmt.Println(err.Error()) fmt.Println(err.Error())
} }
} }
count := 2
for _, q := range questions {
if !q.Deleted && q.Type != model.TypeResult {
index := binarySearch(response, q.Id)
if index != -1 {
cell := ToAlphaString(count) + strconv.Itoa(row)
tipe := FileSearch(response[index].Content)
noAccept := make(map[string]struct{})
todoMap := make(map[string]string)
if tipe != "Text" && q.Type == model.TypeImages || q.Type == model.TypeVarImages {
urle := ExtractImageURL(response[index].Content)
urlData := strings.Split(urle, " ")
if len(urlData) == 1 {
u, err := url.Parse(urle)
if err == nil && u.Scheme != "" && u.Host != "" {
picture, err := downloadImage(urle)
if err != nil {
fmt.Println(err.Error())
}
err = file.SetColWidth(sheet, ToAlphaString(count), ToAlphaString(count), 50)
if err != nil {
fmt.Println(err.Error())
}
err = file.SetRowHeight(sheet, row, 150)
if err != nil {
fmt.Println(err.Error())
}
if err := file.AddPictureFromBytes(sheet, cell, picture); err != nil {
fmt.Println(err.Error())
}
noAccept[response[index].Content] = struct{}{}
} else {
todoMap[response[index].Content] = cell
}
} else {
todoMap[response[index].Content] = cell
}
} else if tipe != "Text" && q.Type == model.TypeFile {
urle := ExtractImageURL(response[index].Content)
display, tooltip := urle, urle
if err := file.SetCellValue(sheet, cell, response[index].Content); err != nil {
fmt.Println(err.Error())
}
if err := file.SetCellHyperLink(sheet, cell, urle, "External", excelize.HyperlinkOpts{
Display: &display,
Tooltip: &tooltip,
}); err != nil {
fmt.Println(err.Error())
}
noAccept[response[index].Content] = struct{}{}
} else {
todoMap[response[index].Content] = cell
}
for cnt, cel := range todoMap {
if _, ok := noAccept[cnt]; !ok {
if err := file.SetCellValue(sheet, cel, cnt); err != nil {
fmt.Println(err.Error())
}
}
}
mediaRow := row mediaRow := row
for i, imgContent := range multiImgArr { for i, imgContent := range multiImgArr {
@ -356,7 +296,6 @@ func handleImage(file *excelize.File, sheet, cell, content string, count, row in
} }
} }
} }
func handleFile(file *excelize.File, sheet, cell, content, s3Prefix string, noAccept map[string]struct{}) { func handleFile(file *excelize.File, sheet, cell, content, s3Prefix string, noAccept map[string]struct{}) {
urle := content urle := content
if urle != "" && !strings.HasPrefix(urle, "https") { if urle != "" && !strings.HasPrefix(urle, "https") {