mqttg/main.go

77 lines
1.8 KiB
Go

package main
import (
"flag"
"git.ddd.rip/ptrcnull/telegram"
mqtt "github.com/eclipse/paho.mqtt.golang"
"log"
"net/url"
"os"
)
func main() {
token := flag.String("token", "", "Telegram bot token")
chat := flag.String("chat", "", "Telegram chat ID")
broker := flag.String("broker", "", "MQTT broker address")
topic := flag.String("topic", "", "MQTT topic")
flag.Parse()
if *token == "" || *chat == "" || *broker == "" || *topic == "" {
flag.Usage()
os.Exit(1)
}
tg := telegram.Client{
Token: *token,
PollTimeout: 120,
}
brokerUrl, err := url.Parse(*broker)
if err != nil {
log.Fatalf("broker url: %s", err)
}
opts := mqtt.NewClientOptions()
opts.AddBroker(*broker)
if brokerUrl.User != nil {
opts.SetUsername(brokerUrl.User.Username())
if password, ok := brokerUrl.User.Password(); ok {
opts.SetUsername(password)
}
}
opts.SetDefaultPublishHandler(func(client mqtt.Client, message mqtt.Message) {
_, err := tg.SendMessage(*chat, string(message.Payload()))
if err != nil {
log.Fatalf("send message: %s", err)
}
})
opts.OnConnect = func(client mqtt.Client) {
log.Println("connected!")
}
opts.OnConnectionLost = func(client mqtt.Client, err error) {
log.Printf("connection lost: %s\n", err)
}
opts.SetClientID("mqttg")
client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() && token.Error() != nil {
log.Fatalf("mqtt connect: %s", token.Error())
}
client.Subscribe(*topic + "/inbox", 1, nil)
for {
res, err := tg.GetUpdates()
if err != nil {
log.Fatalf("telegram updates: %s", err)
}
if !res.Ok {
log.Fatalf("telegram updates: %s", res.Raw)
}
for _, update := range res.Result {
if update.Message != nil {
client.Publish(*topic + "/outbox", 0, false, update.Message.Text)
}
}
}
}