aboutsummaryrefslogblamecommitdiff
path: root/telegram/client.go
blob: b0cee4411a0fbaa4d937fe387d9b370611aee0a6 (plain) (tree)





















































































































                                                                                        
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:   &parameters,
		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
	}
}