aboutsummaryrefslogtreecommitdiffstats
path: root/hived.go
diff options
context:
space:
mode:
Diffstat (limited to 'hived.go')
-rw-r--r--hived.go150
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()
+}