package main import ( "bufio" "context" "fmt" "html" "os" "os/signal" "regexp" "sync" "time" "git.savin.nyc/alex/go-npfd-printer/parser" "git.savin.nyc/alex/go-npfd-printer/printer" mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/jackc/pgx/v4" logrus "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/api/gmail/v1" ) var log = logrus.New() var config Config var conn *pgx.Conn var prntr *printer.Escpos var readerP *bufio.Reader var writerP *bufio.Writer var readWriter *bufio.ReadWriter var ctx context.Context // Config . type Config struct { MQTT struct { Host string `json:"host"` Port int `json:"port"` Username string `json:"username"` Password string `json:"password"` ClientId string `json:"clientid"` Retained bool `json:"retained"` Topic string `json:"topic"` } `json:"mqtt"` Postgres struct { Host string `json:"host"` Port int `json:"port"` Username string `json:"username"` Password string `json:"password"` Database string `json:"database"` } `json:"postgres"` Update time.Duration `json:"update"` Printer string `json:"printer"` Log struct { Level string `json:"level"` } `json:"log"` } // gMSG . type gMSG struct { gmailID string date string // retrieved from message header snippet string } // mqttConnect . func mqttConnect(wg *sync.WaitGroup) mqtt.Client { opts := mqtt.NewClientOptions() opts.AddBroker(fmt.Sprintf("tcp://%s:%d", config.MQTT.Host, config.MQTT.Port)) opts.SetUsername(config.MQTT.Username) opts.SetPassword(config.MQTT.Password) opts.SetClientID(config.MQTT.ClientId) // opts.OnConnect = func(m mqtt.Client) { // log.Printf("MQTT Client is connected to a MQTT Broker\n") // starter(wg, m) // } opts.OnConnect = func(m mqtt.Client) { log.Printf("MQTT Client is connected to a MQTT Broker\n") starter(wg, m) if token := m.Subscribe(config.MQTT.Topic, byte(0), onMessageReceived); token.Wait() && token.Error() != nil { panic(token.Error()) } } client := mqtt.NewClient(opts) token := client.Connect() for !token.WaitTimeout(3 * time.Second) { } if err := token.Error(); err != nil { log.Fatalf("Couldn't connect to a MQTT Broker (%s)\n", err.Error()) os.Exit(1) } return client } // onMessageReceived . func onMessageReceived(m mqtt.Client, message mqtt.Message) { log.Printf("TOPIC: %s\n", message.Topic()) log.Printf("MSG: %s\n", message.Payload()) re := regexp.MustCompile(`^\{\"time\"\:(?P