V
V
vadimuar2019-01-18 18:50:46
API
vadimuar, 2019-01-18 18:50:46

How to forward the same message to the sender using tgbotapi in golang?

Hello, actually the question itself is in the header. Difficulties with replying to ordinary messages (text messages) do not arise. But, I would like to implement reply pictures, voice messages and stickers. But here I would like to know specifically how to implement the sending of voice messages to the sender

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vladislav, 2019-01-18
@vadimuar

old answer

как и с сообщениями, у созданных объектов есть свойство ReplyToMessageID в которое нужно записать ID сообщения из update.Message.MessageID
audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, ...)
audioUpload.ReplyMarkup = update.Message.MessageID
_, err := bot.Send(audioUpload)

Если возникает вопрос, как вообще отправить файл, то нужно передать структуру tgbotapi.FileBytes или tgbotapi.FileReader вторым параметром в функцию и заполнить её.
Для примера, отправляем файл с диска:
file, err := os.Open("audio.mp3")
    if err != nil {
      panic(err)
    }
    defer file.Close()

    audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, tgbotapi.FileReader{
      Name:   "audio.mp3",
      Reader: file,
      Size:   -1, // If Size is -1, it will read the entire Reader into memory to calculate a Size.
    })
    audioUpload.ReplyToMessageID = update.Message.MessageID
    _, err := bot.Send(audioUpload)
    if err != nil {
      panic(err)
    }

UPD: After talking on the LAN, it turned out that the question was to create an Echo bot that could send not only text, but also pictures, audio, and more.
In this example, only text and images are sent. To add processing for other types of messages, you need to add a new `case` to `switch` in the `OnMessage` function:
The code
package main

import (
  "log"

  "github.com/davecgh/go-spew/spew"
  "github.com/go-telegram-bot-api/telegram-bot-api"
)

func main() {
  // подключаемся к боту с помощью токена
  bot, err := tgbotapi.NewBotAPI("ТОКЕН")
  if err != nil {
    log.Panic(err)
  }

  bot.Debug = true
  log.Printf("Authorized on account %s", bot.Self.UserName)

  // инициализируем канал, куда будут прилетать обновления от API
  u := tgbotapi.NewUpdate(0)
  u.Timeout = 60

  updates, err := bot.GetUpdatesChan(u)
  if err != nil {
    log.Fatal(err)
  }

  // читаем обновления из канала
  for update := range updates {
    switch {
    case update.Message != nil: // Если было прислано сообщение, то обрабатываем, так как могут приходить не только сообщения.
      OnMessage(bot, update.Message)
    }
  }
}

func OnMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
  // Пользователь, который написал боту
  userName := message.From.UserName

  // ID чата/диалога.
  // Может быть идентификатором как чата с пользователем
  // (тогда он равен UserID) так и публичного чата/канала
  chatID := message.Chat.ID

  log.Printf("[%s] %d", userName, chatID)

  spew.Dump(message) // выводим то что пришло (Для отладки!!!)

  var msg tgbotapi.Chattable
  switch {
  case message.Text != "": // Текстовое ли сообщение?
    msg = tgbotapi.NewMessage(chatID, message.Text)

  case message.Photo != nil: // Это фото?
    photoArray := *message.Photo
    photoLastIndex := len(photoArray) - 1
    photo := photoArray[photoLastIndex] // Получаем последний элемент массива (самую большую картинку)
    msg = tgbotapi.NewPhotoShare(chatID, photo.FileID)

  default:                                                 // Если не одно условие не сработало
    msg = tgbotapi.NewMessage(chatID, "Не реализовано") // Отправляется на тот тип сообщения, который ещё не реализован выше ^
  }

  // и отправляем его
  _, err := bot.Send(msg)
  if err != nil {
    log.Println(err)
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question