|
|
- package events_alerter
-
- import (
- "database/sql"
- "fmt"
- "strings"
- "time"
- )
- import _ "github.com/go-sql-driver/mysql"
-
- type MsgStr struct {
- remote string
- message string
- }
-
- func (msg MsgStr) Remote() string {
- return msg.remote
- }
-
- func (msg MsgStr) Message() string {
- return msg.message
- }
-
- type MsgInt interface {
- Remote() string
- Message() string
- }
-
- type DbRequester struct {
- login string
- pass string
- host string
- database string
- }
-
- func (dbStruct *DbRequester) ReqPrepare(sqlStr ...string) string {
- if len(sqlStr) > 1 {
- values := make([]interface{}, len(sqlStr)-1)
- for i, _ := range sqlStr[1:] {
- k := i + 1
- values[i] = sqlStr[k]
- }
- return fmt.Sprintf(sqlStr[0], values...)
- } else {
- return sqlStr[0]
- }
-
- }
-
- func (dbStruct *DbRequester) Requester(sqlStr string) (allResult [][]string, err error) {
- connStr := fmt.Sprintf("%v:%v@tcp(%v)/%v", dbStruct.login, dbStruct.pass, dbStruct.host, dbStruct.database)
- db, err := sql.Open("mysql", connStr)
- if err != nil {
- return
- }
- defer db.Close()
- err = db.Ping()
- if err != nil {
- return
- }
- req, err := db.Prepare(sqlStr)
- if err != nil {
- return
- }
- defer req.Close()
- rows, err := req.Query() //пыщим запросий
- if err != nil {
- return
- }
- cols, err := rows.Columns() // получаем слайс стрингов с названиями колонок
- if err != nil {
- return
- }
- rawResult := make([][]byte, len(cols)) // слайс слайсов байт, это одна строка выхлопа сырая
-
- dest := make([]interface{}, len(cols)) // слайс пустых интерфейсов
- for i, _ := range rawResult {
- dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
- }
- for rows.Next() {
- err = rows.Scan(dest...)
- if err != nil {
- return
- }
- result := make([]string, len(cols)) // слайс строк, одна строка выхлопа, которую надо добавить в общий выхлоп
- for i, raw := range rawResult {
- if raw == nil {
- result[i] = "Null"
- } else {
- result[i] = string(raw)
- }
- }
- allResult = append(allResult, result)
- }
- return
- }
-
- func BuildAlert() (msgSl []MsgInt) {
- msgTpl := `Вспомни! %v время для важного!
- Задача '%v' ждет тебя,
- Лови ссыль:
- https://pm.constanta-smt.ru/index.php/tasksComments?tasks_id=%v&projects_id=%v`
- dbuser := DbRequester{
- login: "bot",
- pass: "z68puEFJhEBtS",
- host: "10.176.120.51",
- database: "qdpm",
- }
- createdFormat := "2006-01-02 15:04"
- t := time.Now()
- sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
- from extra_fields_list, tasks
- where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value = '%v' and extra_fields_list.bind_id = tasks.id ;`
- //sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
- //from extra_fields_list, tasks
- //where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value <> '' and extra_fields_list.bind_id = tasks.id ;`
- fmt.Println(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
- res, err := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
- fmt.Printf("%#v, %#v\n", res, err)
-
- if len(res) > 0 { // обработка запроса, если найдено больше 0 строк
- for _, v := range res {
- fmt.Println(v)
- msgStr := fmt.Sprintf(msgTpl, v[0], v[3], v[2], v[1])
- uidSl := strings.Split(v[4], ",")
- jidSl := make([]string, len(uidSl))
- for _, uid := range uidSl {
- sqlTpl = "select value from qdpm.extra_fields_list where extra_fields_id = 11 and bind_id = '%v';"
- jid, _ := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, uid))
- if len(jid) > 0 {
- tmpJid := jid[0][0]
- jidSl = append(jidSl, tmpJid)
- fmt.Printf("%v\n", tmpJid)
- tmpMsg := MsgStr{remote: tmpJid, message: msgStr}
- msgSl = append(msgSl, tmpMsg)
- }
- }
- }
- fmt.Println(msgSl)
- }
- return
- }
|