AmarnathCJD / gogram

Full-native implementation of MTProto protocol on Golang.
GNU General Public License v3.0
191 stars 37 forks source link
awesome botapi client go gogram golang hacktoberfest hacktoberfest-accepted hacktoberfest2023 mtproto mtproxy tdlib tdlib-go telegram telegram-api telegram-mtproto tg userbot userbot-go

Gogram
modern golang library for mtproto
documentation  •  releases  •  telegram chat

GoDoc Go Report Card License GitHub stars GitHub forks


⭐️ Gogram is a modern, elegant and concurrent MTProto API framework. It enables you to easily interact with the main Telegram API through a user account (custom client) or a bot identity (bot API alternative) using Go.


[!WARNING] gogram is currently in beta stage: there may be a few bugs
feel free to try it out, though, any feedback is appreciated!

setup

please note that gogram requires Go 1.18 or later to support go-generics

go get -u github.com/amarnathcjd/gogram/telegram

quick start

package main

import "github.com/amarnathcjd/gogram/telegram"

func main() {
    client, err := telegram.NewClient(telegram.ClientConfig{
        AppID: 6, AppHash: "<app-hash>",
    })

    if err != nil {
        log.Fatal(err)
    }

    client.Conn()

    client.LoginBot("<bot-token>") // or client.Login("<phone-number>") for user account, or client.AuthPrompt() for interactive login

    client.On(telegram.OnMessage, func(message *telegram.NewMessage) error { // client.AddMessageHandler
            message.Reply("Hello from Gogram!")
                return nil
    }, telegram.FilterPrivate) // waits for private messages only

    client.Idle() // block main goroutine until client is closed
}

support dev

If you'd like to support Gogram, you can consider:

key features

Current Layer - 187 (Updated on 2024-09-18)

doing stuff

// sending a message

client.SendMessage("username", "Hello from Gogram!")

client.SendDice("username", "🎲")

client.On("message:/start", func(m *telegram.NewMessage) error {
    m.Reply("Hello from Gogram!") // m.Respond("...")
    return nil
})
// sending media

client.SendMedia("username", "<file-name>", &telegram.MediaOptions{ // filename/inputmedia,...
    Caption: "Hello from Gogram!",
    TTL: int32((math.Pow(2, 31) - 1)), //  TTL For OneTimeMedia
})

client.SendAlbum("username", []string{"<file-name>", "<file-name>"}, &telegram.MediaOptions{ // Array of filenames/inputmedia,...
    Caption: "Hello from Gogram!",
})

// with progress
var pm *telegram.ProgressManager
client.SendMedia("username", "<file-name>", &telegram.MediaOptions{
    Progress: func(a,b int) {
        if pm == nil {
            pm = telegram.NewProgressManager(a, 3) // 3 is edit interval
        }

        if pm.ShouldEdit(b) {
            fmt.Println(pm.GetStats(b)) // client.EditMessage("<chat-id>", "<message-id>", pm.GetStats())
        }
    },
})
// inline queries

client.On("inline:<pattern>", func(iq *telegram.InlineQuery) error { // client.AddInlineHandler
    builder := iq.Builder()
    builder.Article("<title>", "<description>", "<text>", &telegram.ArticleOptions{
            LinkPreview: true,
    })

    return nil
})
// callback queries

client.On("callback:<pattern>", func(cb *telegram.CallbackQuery) error { // client.AddCallbackHandler
    cb.Answer("This is a callback response", &CallbackOptions{
        Alert: true,
    })
    return nil
})

For more examples, check the examples directory.

features

known issues

contributing

Gogram is an open-source project and your contribution is very much appreciated. If you'd like to contribute, simply fork the repository, commit your changes and send a pull request. If you have any questions, feel free to ask.

License

This library is provided under the terms of the GPL-3.0 License.