core/service/telegram_svc.go

135 lines
4.3 KiB
Go
Raw Normal View History

2024-06-27 13:27:16 +00:00
package service
2024-06-30 18:02:23 +00:00
import (
"fmt"
"github.com/gofiber/fiber/v2"
"github.com/rs/xid"
"path/filepath"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
2024-06-30 18:02:23 +00:00
"penahub.gitlab.yandexcloud.net/backend/quiz/core/clients/telegram"
"penahub.gitlab.yandexcloud.net/backend/tdlib/client"
)
2024-06-27 13:27:16 +00:00
2024-06-30 18:02:23 +00:00
type Message struct {
Type string `json:"type"`
Data string `json:"data"`
2024-06-27 13:27:16 +00:00
}
2024-06-30 18:02:23 +00:00
func (s *Service) GetPoolTgAccounts(ctx *fiber.Ctx) error {
2024-06-27 13:27:16 +00:00
return nil
}
2024-06-30 18:02:23 +00:00
func (s *Service) AddingTgAccount(ctx *fiber.Ctx) error {
var req telegram.AuthTgUserReq
if err := ctx.BodyParser(&req); err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
}
authorizer := client.ClientAuthorizerr()
authorizer.TdlibParameters <- &client.SetTdlibParametersRequest{
UseTestDc: false,
DatabaseDirectory: filepath.Join(".tdlib", "database"),
FilesDirectory: filepath.Join(".tdlib", "files"),
UseFileDatabase: false,
UseChatInfoDatabase: false,
UseMessageDatabase: false,
UseSecretChats: false,
ApiId: req.ApiID,
ApiHash: req.ApiHash,
SystemLanguageCode: "en",
DeviceModel: "Server",
SystemVersion: "1.0.0",
ApplicationVersion: "1.0.0",
}
_, err := client.SetLogVerbosityLevel(&client.SetLogVerbosityLevelRequest{
NewVerbosityLevel: 1,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
var tdlibClient *client.Client
2024-07-01 08:16:47 +00:00
// завершается уже в другом контроллере
var goErr error
2024-06-30 18:02:23 +00:00
go func() {
2024-07-01 08:16:47 +00:00
tdlibClient, goErr = client.NewClient(authorizer)
if goErr != nil {
2024-06-30 18:02:23 +00:00
fmt.Println("new client failed", err)
return
}
2024-07-01 08:16:47 +00:00
fmt.Println("i am down")
2024-06-30 18:02:23 +00:00
}()
2024-07-01 08:16:47 +00:00
if goErr != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(goErr.Error())
}
2024-06-30 18:02:23 +00:00
for {
state, ok := <-authorizer.State
if !ok {
2024-07-01 08:16:47 +00:00
return ctx.Status(fiber.StatusOK).SendString("state chan is close auth maybe ok")
2024-06-30 18:02:23 +00:00
}
fmt.Println("currnet state:", state)
switch state.AuthorizationStateType() {
case client.TypeAuthorizationStateWaitPhoneNumber:
authorizer.PhoneNumber <- req.PhoneNumber
case client.TypeAuthorizationStateWaitCode:
id := xid.New()
s.telegramClient.AddedToMap(telegram.WaitingClient{
TdLibClient: tdlibClient,
PreviousReq: req,
Authorizer: authorizer,
}, id.String())
2024-07-01 08:16:47 +00:00
return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"id": id.String()})
2024-06-30 18:02:23 +00:00
case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
2024-07-01 08:16:47 +00:00
return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state))
2024-06-30 18:02:23 +00:00
}
}
}
func (s *Service) SettingTgCode(ctx *fiber.Ctx) error {
var req struct {
Code string `json:"code"`
ID string `json:"id"`
}
if err := ctx.BodyParser(&req); err != nil {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid request data")
}
data, ok := s.telegramClient.GetFromMap(req.ID)
if !ok {
return ctx.Status(fiber.StatusBadRequest).SendString("Invalid id, don't have data")
}
data.Authorizer.Code <- req.Code
for {
state, ok := <-data.Authorizer.State
if !ok {
2024-07-01 08:16:47 +00:00
return ctx.Status(fiber.StatusOK).SendString("state chan is close auth maybe ok")
2024-06-30 18:02:23 +00:00
}
fmt.Println("currnet state:", state)
switch state.AuthorizationStateType() {
case client.TypeAuthorizationStateReady:
s.telegramClient.TgClients = append(s.telegramClient.TgClients, data.TdLibClient)
id, err := s.dal.TgRepo.CreateTgAccount(ctx.Context(), model.TgAccount{
ApiID: data.PreviousReq.ApiID,
ApiHash: data.PreviousReq.ApiHash,
PhoneNumber: data.PreviousReq.PhoneNumber,
Status: model.ActiveTg,
Password: data.PreviousReq.Password,
})
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"id": id})
2024-06-30 18:02:23 +00:00
case client.TypeAuthorizationStateWaitPassword:
data.Authorizer.Password <- data.PreviousReq.Password
case client.TypeAuthorizationStateLoggingOut, client.TypeAuthorizationStateClosing, client.TypeAuthorizationStateClosed:
2024-07-01 08:16:47 +00:00
return ctx.Status(fiber.StatusForbidden).SendString(fmt.Sprintf("auth failed, last state is %s", state))
2024-06-30 18:02:23 +00:00
}
}
2024-06-27 13:27:16 +00:00
}
2024-06-30 18:02:23 +00:00
func (s *Service) DeleteTgAccountByID(ctx *fiber.Ctx) error {
2024-06-27 13:27:16 +00:00
return nil
}