Golang Telegram TdLib JSON bindings
Telegram Tdlib is a complete library for creating telegram clients, it also has a simple tdjson ready-to-use library to ease the integration with different programming languages and platforms.
go-tdlib is a complete tdlib-tdjson binding package to help you create your own Telegram clients.
NOTE: basic tdjson-golang binding is inspired from this package: go-tdjson
All the classes and functions declared in Tdlib TypeLanguage schema file have been exported using the autogenerate tool tl-parser. So you can use every single type and method in Tdlib.
- Autogenerated golang structs and methods of tdlib .tl schema
- Custom event receivers defined by user (e.g. get only text messages from a specific user)
- Supports all tdjson functions: Send(), Execute(), Receive(), Destroy(), SetFilePath(), SetLogVerbosityLevel()
- Supports all tdlib functions and types
First of all you need to clone the Tdlib repo and build it:
git clone [email protected]:tdlib/td.git --depth 1
cd td
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . -- -j5
make install
# -j5 refers to number of your cpu cores + 1 for multi-threaded build.
If hit any build errors, refer to Tdlib build instructions I'm using static linking against tdlib so it won't require to build the whole tdlib source files.
You can use prebuilt tdlib with following Docker image:
Windows:
docker pull mihaildemidoff/tdlib-go
Here is a simple example for authorization and fetching updates:
package main
import (
"fmt"
"github.com/Arman92/go-tdlib"
)
func main() {
tdlib.SetLogVerbosityLevel(1)
tdlib.SetFilePath("./errors.txt")
// Create new instance of client
client := tdlib.NewClient(tdlib.Config{
APIID: "187786",
APIHash: "e782045df67ba48e441ccb105da8fc85",
SystemLanguageCode: "en",
DeviceModel: "Server",
SystemVersion: "1.0.0",
ApplicationVersion: "1.0.0",
UseMessageDatabase: true,
UseFileDatabase: true,
UseChatInfoDatabase: true,
UseTestDataCenter: false,
DatabaseDirectory: "./tdlib-db",
FileDirectory: "./tdlib-files",
IgnoreFileNames: false,
})
for {
currentState, _ := client.Authorize()
if currentState.GetAuthorizationStateEnum() == tdlib.AuthorizationStateWaitPhoneNumberType {
fmt.Print("Enter phone: ")
var number string
fmt.Scanln(&number)
_, err := client.SendPhoneNumber(number)
if err != nil {
fmt.Printf("Error sending phone number: %v", err)
}
} else if currentState.GetAuthorizationStateEnum() == tdlib.AuthorizationStateWaitCodeType {
fmt.Print("Enter code: ")
var code string
fmt.Scanln(&code)
_, err := client.SendAuthCode(code)
if err != nil {
fmt.Printf("Error sending auth code : %v", err)
}
} else if currentState.GetAuthorizationStateEnum() == tdlib.AuthorizationStateWaitPasswordType {
fmt.Print("Enter Password: ")
var password string
fmt.Scanln(&password)
_, err := client.SendAuthPassword(password)
if err != nil {
fmt.Printf("Error sending auth password: %v", err)
}
} else if currentState.GetAuthorizationStateEnum() == tdlib.AuthorizationStateReadyType {
fmt.Println("Authorization Ready! Let's rock")
break
}
}
// Main loop
for update := range client.RawUpdates {
// Show all updates
fmt.Println(update.Data)
fmt.Print("\n\n")
}
}
More examples can be found on examples folder