77 lines
1.8 KiB
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)
|
|
}
|
|
}
|
|
}
|
|
}
|