diff options
Diffstat (limited to 'hived.go')
-rw-r--r-- | hived.go | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/hived.go b/hived.go new file mode 100644 index 0000000..14fa696 --- /dev/null +++ b/hived.go @@ -0,0 +1,150 @@ +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() +} |