package telegram import ( "fmt" "github.com/pkg/errors" "path/filepath" "strconv" "dev.narayana.im/narayana/telegabber/config" "github.com/zelenin/go-tdlib/client" ) var logConstants = map[string]int32{ "fatal": 0, "error": 1, "warn": 2, "info": 3, "debug": 4, "verbose": 5, "all": 1023, } func stringToLogConstant(c string) int32 { level, ok := logConstants[c] if !ok { level = 0 } return level } type TelegramClient struct { client *client.Client jid string parameters *client.TdlibParameters online bool logVerbosity client.Option } // NewClient instantiates a Telegram App func NewClient(conf config.TelegramConfig, jid string) (TelegramClient, error) { logVerbosity := client.WithLogVerbosity(&client.SetLogVerbosityLevelRequest{ NewVerbosityLevel: stringToLogConstant(conf.Loglevel), }) apiId, err := strconv.Atoi(conf.Tdlib.Client.APIID) if err != nil { return TelegramClient{}, errors.Wrap(err, "Wrong api_id") } parameters := client.TdlibParameters{ UseTestDc: false, DatabaseDirectory: filepath.Join("./sessions/", jid), FilesDirectory: filepath.Join("./sessions/", jid, "/files/"), UseFileDatabase: true, UseChatInfoDatabase: conf.Tdlib.Client.UseChatInfoDatabase, UseMessageDatabase: true, UseSecretChats: conf.Tdlib.Client.UseSecretChats, ApiId: int32(apiId), ApiHash: conf.Tdlib.Client.APIHash, SystemLanguageCode: "en", DeviceModel: conf.Tdlib.Client.DeviceModel, SystemVersion: "1.0.0", ApplicationVersion: conf.Tdlib.Client.ApplicationVersion, EnableStorageOptimizer: true, IgnoreFileNames: false, } return TelegramClient{ parameters: ¶meters, jid: jid, logVerbosity: logVerbosity, }, nil } func updateHandler(tdlibClient *client.Client) { listener := tdlibClient.GetListener() defer listener.Close() for update := range listener.Updates { if update.GetClass() == client.ClassUpdate { fmt.Printf("%#v", update) } } } func (c *TelegramClient) Connect() error { if c.online { return nil } authorizer := client.ClientAuthorizer() authorizer.TdlibParameters <- c.parameters tdlibClient, err := client.NewClient(authorizer, c.logVerbosity) if err != nil { return errors.Wrap(err, "Coudn't initialize a Telegram client instance") } c.client = tdlibClient c.online = true go updateHandler(c.client) return nil } func (c *TelegramClient) Disconnect() { if !c.online { return } }