debug - remove when reqady for telegram
This commit is contained in:
parent
92736a4da6
commit
1def139b22
32
app/app.go
32
app/app.go
@ -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
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
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") {
|
||||||
|
Loading…
Reference in New Issue
Block a user