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) } } } }