re-incarnation
@re-incarnation

Проблема с отправкой сообщения, как решить?

Есть код, его суть - отправление жалоб с форума, всё работает, но не совсем, мне нужно отправлять существующие репорты в одном сообщении, когда я использую bytes/string, для слияния текста, то это либо не работает, либо как в нынешней версии кода отправляет их всё равно по очереди.
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:537003DOSAv@tcp(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)
	}
}


P.S. Если я ставлю в for больше одного, то он отправляет в один id и т.д. в нескольких сообщениях, а после следущий.

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/
и т.д.

Мне нужно что бы было так :
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/

и т.д.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Предполагаю вам нужно запрос в базу переместить в 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(),
        })
    }

Я убрал из кода обработку ошибок и т.д., чтобы вам было лучше видно суть.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы