tucnak / telebot

Telebot is a Telegram bot framework in Go.
MIT License
3.94k stars 459 forks source link

How get a body raw on json? #645

Closed maikeruit closed 1 month ago

maikeruit commented 7 months ago

How can you make it easier?

Now I've done it this way

webhook.go

func (h *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if h.SecretToken != "" && r.Header.Get("X-Telegram-Bot-Api-Secret-Token") != h.SecretToken {
        h.bot.debug(fmt.Errorf("invalid secret token in request"))
        return
    }

    var update Update

    /*
        Read payload body to jsonBody
    */
    jsonBody, err := io.ReadAll(r.Body)

    if err != nil {
        h.bot.debug(fmt.Errorf("cannot read body: %v", err))
        return
    }

    update.raw = jsonBody

    r.Body = io.NopCloser(bytes.NewBuffer(jsonBody))

    /*
        Clone body
    */

    if err := json.NewDecoder(r.Body).Decode(&update); err != nil {
        h.bot.debug(fmt.Errorf("cannot decode update: %v", err))
        return
    }

    h.dest <- update
}

update.go

type Update struct {
    raw []byte
    ...

context.go

type Context interface {
    // Raw returns original body raw
    Raw() string
    .....

func (c *nativeContext) Raw() string {
    return string(c.u.raw)
}
demget commented 1 month ago

You should implement your custom Poller.

See https://github.com/tucnak/telebot/blob/v3/webhook.go for reference.