1 package main 2 3 import ( 4 "io" 5 "strings" 6 "text/template" 7 "time" 8 9 "vimagination.zapto.org/memio" 10 "vimagination.zapto.org/textmagic" 11 ) 12 13 const DefaultTemplate = `Hello {{.ClientName}}, 14 I'm your driver, {{.DriverName}}, for your appointment at {{.StartTime}}.` 15 16 var ( 17 compiledTemplate *template.Template 18 text textmagic.TextMagic 19 fromNumber bool 20 ) 21 22 type MessageData struct { 23 ID int64 24 Message string 25 } 26 27 type MessageVars struct { 28 ID int64 29 StartDate, StartTime, EndDate, EndTime, From, To, ClientName, ClientPhoneNumber, ClientFirstName, ClientLastName, DriverName, DriverPhoneNumber, DriverReg, Passengers string 30 } 31 32 func setMessageVars(username, password, messageTemplate, fromS string, fromNumberB bool) error { 33 t, err := template.New("Message").Parse(messageTemplate) 34 if err != nil { 35 return err 36 } 37 // test template 38 39 if err := t.Execute(io.Discard, &MessageVars{}); err != nil { 40 return err 41 } 42 43 compiledTemplate = t 44 text = textmagic.New(username, password) 45 fromNumber = fromNumberB 46 return nil 47 } 48 49 func (c *Calls) PrepareMessage(eventID int64, m *MessageData) error { 50 return c.prepareMessage(compiledTemplate, eventID, m) 51 } 52 53 func (c *Calls) prepareMessage(ct *template.Template, eventID int64, m *MessageData) error { 54 var ( 55 event Event 56 driver Driver 57 client Client 58 ) 59 err := c.GetEvent(eventID, &event) 60 if err != nil { 61 return err 62 } 63 err = c.GetDriver(event.DriverID, &driver) 64 if err != nil { 65 return err 66 } 67 err = c.GetClient(event.ClientID, &client) 68 if err != nil { 69 return err 70 } 71 var buf []byte 72 start := time.Unix(event.Start/1000, 0) 73 end := time.Unix(event.End/1000, 0) 74 75 names := strings.Split(client.Name, " ") 76 77 data := MessageVars{ 78 event.ID, 79 start.In(time.UTC).Format("02/01/06"), 80 start.In(time.UTC).Format("15:04"), 81 end.In(time.UTC).Format("02/01/06"), 82 end.In(time.UTC).Format("15:04"), 83 event.From, event.To, 84 client.Name, 85 client.PhoneNumber, 86 names[0], 87 names[len(names)-1], 88 driver.Name, 89 driver.PhoneNumber, 90 driver.RegistrationNumber, 91 event.Other, 92 } 93 err = ct.Execute(memio.Create(&buf), data) 94 if err != nil { 95 return err 96 } 97 m.ID = eventID 98 m.Message = string(buf) 99 return nil 100 } 101 102 func (c *Calls) SendMessage(md MessageData, e *string) error { 103 var ( 104 event Event 105 client Client 106 ) 107 err := c.GetEvent(md.ID, &event) 108 if err != nil { 109 return err 110 } 111 err = c.GetClient(event.ClientID, &client) 112 if err != nil { 113 return err 114 } 115 vars := make([]textmagic.Option, 0, 1) 116 if fromNumber { 117 var driver Driver 118 err = c.GetDriver(event.DriverID, &driver) 119 if err != nil { 120 return err 121 } 122 vars = append(vars, textmagic.From(driver.PhoneNumber)) 123 } 124 phoneNumber := client.PhoneNumber 125 if phoneNumber[0] == '0' { 126 phoneNumber = "44" + phoneNumber[1:] 127 } else if phoneNumber[0] == '+' { 128 phoneNumber = phoneNumber[1:] 129 } 130 _, _, _, err = text.Send(md.Message, []string{phoneNumber}, vars...) 131 if err != nil { 132 *e = err.Error() 133 } else { 134 _, err = c.statements[MessageSent].Exec(md.ID) 135 if err != nil { 136 return err 137 } 138 } 139 return nil 140 } 141