You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.0 KiB

  1. package events_alerter
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strings"
  6. "time"
  7. )
  8. import _ "github.com/go-sql-driver/mysql"
  9. type MsgStr struct {
  10. remote string
  11. message string
  12. }
  13. func (msg MsgStr) Remote() string {
  14. return msg.remote
  15. }
  16. func (msg MsgStr) Message() string {
  17. return msg.message
  18. }
  19. type MsgInt interface {
  20. Remote() string
  21. Message() string
  22. }
  23. type DbRequester struct {
  24. login string
  25. pass string
  26. host string
  27. database string
  28. }
  29. func (dbStruct *DbRequester) ReqPrepare(sqlStr ...string) string {
  30. if len(sqlStr) > 1 {
  31. values := make([]interface{}, len(sqlStr)-1)
  32. for i, _ := range sqlStr[1:] {
  33. k := i + 1
  34. values[i] = sqlStr[k]
  35. }
  36. return fmt.Sprintf(sqlStr[0], values...)
  37. } else {
  38. return sqlStr[0]
  39. }
  40. }
  41. func (dbStruct *DbRequester) Requester(sqlStr string) (allResult [][]string, err error) {
  42. connStr := fmt.Sprintf("%v:%v@tcp(%v)/%v", dbStruct.login, dbStruct.pass, dbStruct.host, dbStruct.database)
  43. db, err := sql.Open("mysql", connStr)
  44. if err != nil {
  45. return
  46. }
  47. defer db.Close()
  48. err = db.Ping()
  49. if err != nil {
  50. return
  51. }
  52. req, err := db.Prepare(sqlStr)
  53. if err != nil {
  54. return
  55. }
  56. defer req.Close()
  57. rows, err := req.Query() //пыщим запросий
  58. if err != nil {
  59. return
  60. }
  61. cols, err := rows.Columns() // получаем слайс стрингов с названиями колонок
  62. if err != nil {
  63. return
  64. }
  65. rawResult := make([][]byte, len(cols)) // слайс слайсов байт, это одна строка выхлопа сырая
  66. dest := make([]interface{}, len(cols)) // слайс пустых интерфейсов
  67. for i, _ := range rawResult {
  68. dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
  69. }
  70. for rows.Next() {
  71. err = rows.Scan(dest...)
  72. if err != nil {
  73. return
  74. }
  75. result := make([]string, len(cols)) // слайс строк, одна строка выхлопа, которую надо добавить в общий выхлоп
  76. for i, raw := range rawResult {
  77. if raw == nil {
  78. result[i] = "Null"
  79. } else {
  80. result[i] = string(raw)
  81. }
  82. }
  83. allResult = append(allResult, result)
  84. }
  85. return
  86. }
  87. func BuildAlert() (msgSl []MsgInt) {
  88. msgTpl := `Вспомни! %v время для важного!
  89. Задача '%v' ждет тебя,
  90. Лови ссыль:
  91. https://pm.constanta-smt.ru/index.php/tasksComments?tasks_id=%v&projects_id=%v`
  92. dbuser := DbRequester{
  93. login: "bot",
  94. pass: "z68puEFJhEBtS",
  95. host: "10.176.120.51",
  96. database: "qdpm",
  97. }
  98. createdFormat := "2006-01-02 15:04"
  99. t := time.Now()
  100. sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
  101. from extra_fields_list, tasks
  102. where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value = '%v' and extra_fields_list.bind_id = tasks.id ;`
  103. //sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
  104. //from extra_fields_list, tasks
  105. //where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value <> '' and extra_fields_list.bind_id = tasks.id ;`
  106. fmt.Println(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
  107. res, err := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
  108. fmt.Printf("%#v, %#v\n", res, err)
  109. if len(res) > 0 { // обработка запроса, если найдено больше 0 строк
  110. for _, v := range res {
  111. fmt.Println(v)
  112. msgStr := fmt.Sprintf(msgTpl, v[0], v[3], v[2], v[1])
  113. uidSl := strings.Split(v[4], ",")
  114. jidSl := make([]string, len(uidSl))
  115. for _, uid := range uidSl {
  116. sqlTpl = "select value from qdpm.extra_fields_list where extra_fields_id = 11 and bind_id = '%v';"
  117. jid, _ := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, uid))
  118. if len(jid) > 0 {
  119. tmpJid := jid[0][0]
  120. jidSl = append(jidSl, tmpJid)
  121. fmt.Printf("%v\n", tmpJid)
  122. tmpMsg := MsgStr{remote: tmpJid, message: msgStr}
  123. msgSl = append(msgSl, tmpMsg)
  124. }
  125. }
  126. }
  127. fmt.Println(msgSl)
  128. }
  129. return
  130. }

Powered by TurnKey Linux.