aboutsummaryrefslogblamecommitdiff
path: root/telegram/client.go
blob: f15d07db1be0a9da10fb83572366fff75e962ed6 (plain) (tree)
1
2
3
4
5
6
7
8
9


                


                               
              

                                                    
                                                         

                                            
                       


                                    






                         

 
                   



                                    








                                          

                                                               
                                   
                                      
                                            
                                  




                                    
                                             
                      
 
                          
                   

 



                                         
                                        
                                                                                                                                  



                                                                                    
                                                           
                       
                                                                  












                                                                                
                                      










                                                                         
                       








                                                        
                                           
                                            

              
package telegram

import (
	"github.com/pkg/errors"
	"path/filepath"
	"strconv"
	"sync"

	"dev.narayana.im/narayana/telegabber/config"
	"dev.narayana.im/narayana/telegabber/persistence"

	"github.com/zelenin/go-tdlib/client"
	"gosrc.io/xmpp"
)

var logConstants = map[string]int32{
	":fatal":   0,
	":error":   1,
	":warn":    2,
	":info":    3,
	":debug":   4,
	":verbose": 5,
	":all":     1023,
}

type cache struct {
	chats map[int64]*client.Chat
	users map[int32]*client.User
}

func stringToLogConstant(c string) int32 {
	level, ok := logConstants[c]
	if !ok {
		level = 0
	}

	return level
}

// Client stores the metadata for lazily invoked TDlib instance
type Client struct {
	client       *client.Client
	authorizer   *clientAuthorizer
	parameters   *client.TdlibParameters
	logVerbosity client.Option
	me           *client.User

	xmpp    *xmpp.Component
	jid     string
	Session *persistence.Session
	content *config.TelegramContentConfig
	cache   *cache

	locks  clientLocks
	online bool
}

type clientLocks struct {
	authorizationReady sync.WaitGroup
}

// NewClient instantiates a Telegram App
func NewClient(conf config.TelegramConfig, jid string, component *xmpp.Component, session *persistence.Session) (*Client, error) {
	logVerbosity := client.WithLogVerbosity(&client.SetLogVerbosityLevelRequest{
		NewVerbosityLevel: stringToLogConstant(conf.Loglevel),
	})

	apiID, err := strconv.Atoi(conf.Tdlib.Client.APIID)
	if err != nil {
		return &Client{}, 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 &Client{
		parameters: &parameters,
		xmpp:       component,
		jid:        jid,
		Session:    session,
		content:    &conf.Content,
		cache: &cache{
			chats: map[int64]*client.Chat{},
			users: map[int32]*client.User{},
		},
		logVerbosity: logVerbosity,
		locks:        clientLocks{},
	}, nil
}