R
R
re-incarnation2021-06-19 16:07:28
API
re-incarnation, 2021-06-19 16:07:28

Problem with sending message, how to solve?

There is a code, its essence is sending complaints from the forum, everything works, but not quite, I need to send existing reports in one message, when I use bytes / string to merge text, it either does not work, or as in the current version of the code sends them all the same in turn.

var report Report

type Report struct {
  Report_id int
  Content_type string
  Report_state string
  Is_send_vk int
}

func main() {
  token := "2060761b6eb0fc2e877e04d2ac4bb64adca7291df75d3234c6d6ed9aa925fadbef096678d0f5fe380fb7a" // use os.Getenv("TOKEN")
  vk := api.NewVK(token)

  // get information about the group
  group, err := vk.GroupsGetByID(nil)
  if err != nil {
    log.Fatal(err)
  }

  // Initializing Long Poll
  lp, err := longpoll.NewLongPoll(vk, group[0].ID)
  if err != nil {
    log.Fatal(err)
  }

  db, err := sql.Open("mysql", "cd47468_test:[email protected](92.53.96.174:3306)/cd47468_test")

  if err != nil {
    panic(err)
  }

  defer db.Close()

  res, err := db.Query("SELECT `report_id`, `content_type` FROM `xf_report` WHERE `report_state` = 'open'")
  if err != nil {
    panic(err)
  }
  //spew.Dump(res)


  lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
    if obj.Message.Text == "/dump" {
      for res.Next(){
        err := res.Scan(&report.Report_id, &report.Content_type)
          if err != nil {
            panic(err)
          }
      //  messages := []string{"New Report:\r\nId - " + strconv.Itoa(report.Report_id) + " || Type - " + report.Content_type + "\r\nLink - http://cd47468.tmweb.ru/index.php?reports/" + strconv.Itoa(report.Report_id) + "/"}
       var str strings.Builder
       for i := 0; i < 1; i++ {
    str.WriteString("New Report:\r\nId - " + strconv.Itoa(report.Report_id) + " || Type - " + report.Content_type + "\r\nLink - http://cd47468.tmweb.ru/index.php?reports/" + strconv.Itoa(report.Report_id) + "/")
}

//log.Println(str.String())

        send, err2 := vk.MessagesSend(api.Params{
          "peer_id": 2000000001,
          "random_id": 0,
          "message": str.String(),
        })

        if err2 != nil {
          log.Fatal(err2)
        }
        spew.Dump(send)
      }
    }
  })

  // Run Bots Long Poll
  log.Println("Start Long Poll")
  if err := lp.Run(); err != nil {
    log.Fatal(err)
  }
}


PS If I put more than one in for, then it sends to one id, etc. in several messages, and after the next.

New Report:
Id - 12 || Type - post
Link - http://cd47468.tmweb.ru/index.php?reports/12/New Report:
Id - 12 || Type - post
Link - http://cd47468.tmweb.ru/index.php?reports/12/New Report:
New Report:
Id - 13 || Type - profile_post
Link - http://cd47468.tmweb.ru/index.php?reports/13/New Report:
Id - 13 || Type - profile_post
Link - http://cd47468.tmweb.ru/index.php?reports/13/
и т.д.

I need it to be like this:
New Report:
Id - 1 || Type - profile_post
Link - http://cd47468.tmweb.ru/index.php?reports/1/

Id - 2 || Type - profile_post
Link - http://cd47468.tmweb.ru/index.php?reports/2/

и т.д.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
E
Evgeny Mamonov, 2021-06-19
@re-incarnation

Предполагаю вам нужно запрос в базу переместить в MessageNew.
Т.е. алгоритм должен быть таким:
- вы получили запрос /dump
- сделали запрос в базу
- в цикле извлекли данные и записали их в Buffer
- одним сообщением ответили данными из Buffer
Например так:

lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
    // тут приходит новый запрос
    if obj.Message.Text == "/dump" {
       var str strings.Builder
       // читаете данные из базы
       res, err := db.Query("SELECT `report_id`, `content_type` FROM `xf_report` WHERE `report_state` = 'open'")
       // по одном их обрабатываете и записываете в strings.Builder
       for res.Next(){
        err := res.Scan(&report.Report_id, &report.Content_type)
        str.WriteString(...)
      }
      // тут у вас все данные собраны в str
      // отправляете данные в ответ
      send, err2 := vk.MessagesSend(api.Params{
          "peer_id": 2000000001,
          "random_id": 0,
          "message": str.String(),
        })
    }

Я убрал из кода обработку ошибок и т.д., чтобы вам было лучше видно суть.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question