91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package telegram
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
|
||
"github.com/rs/zerolog/log"
|
||
|
||
"github.com/gotd/td/session"
|
||
"github.com/gotd/td/telegram"
|
||
)
|
||
|
||
type Config struct {
|
||
ApiID int `envconfig:"TELEGRAM__API_ID" required:"true"`
|
||
ApiHash string `envconfig:"TELEGRAM__API_HASH" required:"true"`
|
||
SessionFile string `envconfig:"TELEGRAM__SESSION_FILE" required:"true"`
|
||
}
|
||
|
||
type Client struct {
|
||
*telegram.Client
|
||
cancel context.CancelFunc
|
||
done chan struct{}
|
||
}
|
||
|
||
func New(cfg Config) (*Client, error) {
|
||
ctx := context.Background()
|
||
|
||
tg := telegram.NewClient(cfg.ApiID, cfg.ApiHash, telegram.Options{
|
||
SessionStorage: &session.FileStorage{Path: cfg.SessionFile},
|
||
})
|
||
|
||
runCtx, cancel := context.WithCancel(ctx)
|
||
|
||
ready := make(chan struct{})
|
||
done := make(chan struct{})
|
||
|
||
client := &Client{
|
||
Client: tg,
|
||
cancel: cancel,
|
||
done: done,
|
||
}
|
||
|
||
go func() {
|
||
err := tg.Run(runCtx, func(ctx context.Context) error {
|
||
status, err := tg.Auth().Status(ctx)
|
||
if err != nil {
|
||
close(ready)
|
||
return fmt.Errorf("telegram.Auth error: %w", err)
|
||
}
|
||
if !status.Authorized {
|
||
close(ready)
|
||
return fmt.Errorf("session not authorized")
|
||
}
|
||
|
||
// Получаем информацию о текущем пользователе
|
||
self, err := tg.Self(ctx)
|
||
if err != nil {
|
||
log.Warn().Err(err).Msg("Failed to get user info")
|
||
} else {
|
||
log.Info().
|
||
Int64("id", self.ID).
|
||
Str("username", "@"+self.Username).
|
||
Str("first_name", self.FirstName).
|
||
Str("last_name", self.LastName).
|
||
Str("phone", self.Phone).
|
||
Msg("Authorized as user")
|
||
}
|
||
|
||
close(ready)
|
||
|
||
<-ctx.Done()
|
||
return ctx.Err()
|
||
})
|
||
|
||
if err != nil {
|
||
log.Error().Err(err).Msg("telegram client stopped")
|
||
}
|
||
|
||
close(done)
|
||
}()
|
||
|
||
<-ready
|
||
|
||
return client, nil
|
||
}
|
||
|
||
func (c *Client) Close() {
|
||
c.cancel()
|
||
<-c.done
|
||
}
|