package main import ( "encoding/json" "flag" "fmt" "io/ioutil" "log" "net/http" "net/url" "github.com/go-telegram-bot-api/telegram-bot-api" ) var flagPort = flag.String("port", "8008", "determined the port the sercice runs on") var flagTgTokenFile = flag.String("tgtokenfile", "/run/secrets/tg_bot_token", "determines the location of the telegram bot token file") const cryptocomparePriceURL = "https://min-api.cryptocompare.com/data/price?" func getTgToken() string { tgTokenJsonBytes, err := ioutil.ReadFile(*flagTgTokenFile) if err != nil { log.Fatal(err) } type TgToken struct { Token string `json:"token"` } var tgToken TgToken err = json.Unmarshal(tgTokenJsonBytes, &tgToken) if err != nil { log.Fatal(err) } return tgToken.Token } func runTgBot() { botToken := getTgToken() bot, err := tgbotapi.NewBotAPI(botToken) if err != nil { log.Panic(err) } bot.Debug = true log.Printf("Authorized on account %s", bot.Self.UserName) u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := bot.GetUpdatesChan(u) if err != nil { log.Panic(err) } for update := range updates { if update.Message == nil { continue } log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) msg.ReplyToMessageID = update.Message.MessageID bot.Send(msg) } } func sendGetToCryptoCompare(ccurl, name, unit string) (float64, string, error) { params := "fsym=" + url.QueryEscape(name) + "&" + "tsyms=" + url.QueryEscape(unit) path := ccurl + params fmt.Println(path) resp, err := http.Get(path) if err != nil { log.Fatal(err) return 0., "", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) return 0., "", err } jsonBody := make(map[string]float64) err = json.Unmarshal(body, &jsonBody) if err != nil { log.Fatal(err) return 0., "", err } fmt.Println(string(body)) return jsonBody[unit], unit, nil } //TODO func healthHandler(w http.ResponseWriter, r *http.Request) { } func cryptoHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/crypto" { http.Error(w, "404 not found.", http.StatusNotFound) return } if r.Method != "GET" { http.Error(w, "Method is not supported.", http.StatusNotFound) } var name string var unit string params := r.URL.Query() for key, value := range params { switch key { case "name": name = value[0] case "unit": unit = value[0] default: } } price, unit, err := sendGetToCryptoCompare(cryptocomparePriceURL, name, unit) if err != nil { log.Fatal(err) } json.NewEncoder(w).Encode(map[string]interface{}{"name": price, "unit": unit}) } func startServer() { http.HandleFunc("/crypto", cryptoHandler) http.HandleFunc("/health", healthHandler) if err := http.ListenAndServe(":"+*flagPort, nil); err != nil { log.Fatal(err) } } func main() { go runTgBot() startServer() }