Advertisement
Guest User

Untitled

a guest
Feb 15th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.46 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "encoding/json"
  6.     "fmt"
  7.     "io/ioutil"
  8.     "log"
  9.     "net/http"
  10.     "os"
  11.     "time"
  12.  
  13.     "gopkg.in/telegram-bot-api.v4"
  14.  
  15.     _ "github.com/lib/pq"
  16. )
  17.  
  18. var (
  19.     config Config
  20.     db     *sql.DB
  21. )
  22.  
  23. type Config struct {
  24.     // Database settings
  25.     Host     string `json:"host"`
  26.     Port     string `json:"port"`
  27.     Username string `json:"username"`
  28.     Password string `json:"password"`
  29.     Database string `json:"database"`
  30.  
  31.     // Telegram settings
  32.     TgToken  string `json:"tgtoken"`
  33.     TgDomain string `json:"tgdomain"`
  34.     TgPort   string `json:"tgport"`
  35. }
  36.  
  37. func main() {
  38.     log.Println("Starting application...")
  39.  
  40.     // Load configuration settings.
  41.     data, err := ioutil.ReadFile("/etc/bot/config.json")
  42.  
  43.     switch {
  44.     case os.IsNotExist(err):
  45.         log.Println("Config file missing, using defaults")
  46.         config = Config{
  47.             // Database settings
  48.             Host:     "localhost",
  49.             Port:     "5432",
  50.             Database: "postgres",
  51.             Username: "postgres",
  52.             Password: "postgres",
  53.  
  54.             // Telegram settings
  55.             TgToken:  "",
  56.             TgDomain: "",
  57.             TgPort:   "443",
  58.         }
  59.     case err == nil:
  60.         if err := json.Unmarshal(data, &config); err != nil {
  61.             log.Fatal(err)
  62.         }
  63.     default:
  64.         log.Println(err)
  65.     }
  66.  
  67.     log.Println("Overriding configuration from environment variables")
  68.     // Database settings
  69.     if os.Getenv("APP_HOST") != "" {
  70.         config.Host = os.Getenv("APP_HOST")
  71.     }
  72.     if os.Getenv("APP_PORT") != "" {
  73.         config.Port = os.Getenv("APP_PORT")
  74.     }
  75.     if os.Getenv("APP_USERNAME") != "" {
  76.         config.Username = os.Getenv("APP_USERNAME")
  77.     }
  78.     if os.Getenv("APP_PASSWORD") != "" {
  79.         config.Password = os.Getenv("APP_PASSWORD")
  80.     }
  81.     if os.Getenv("APP_DATABASE") != "" {
  82.         config.Database = os.Getenv("APP_DATABASE")
  83.     }
  84.     // Telegram settings
  85.     if os.Getenv("TELEGRAM_TOKEN") != "" {
  86.         config.TgToken = os.Getenv("TELEGRAM_TOKEN")
  87.     }
  88.     if os.Getenv("TELEGRAM_DOMAIN") != "" {
  89.         config.TgDomain = os.Getenv("TELEGRAM_DOMAIN")
  90.     }
  91.     if os.Getenv("TELEGRAM_PORT") != "" {
  92.         config.TgPort = os.Getenv("TELEGRAM_PORT")
  93.     }
  94.  
  95.     // Connect to database
  96.     log.Println(fmt.Sprintf("Connecting to database at %s:%s", config.Host, config.Port))
  97.  
  98.     psqlInfo := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
  99.         config.Host, config.Port, config.Username, config.Password, config.Database)
  100.  
  101.     db, err = sql.Open("postgres", psqlInfo)
  102.     if err != nil {
  103.         log.Println(err)
  104.     }
  105.  
  106.     var dbError error
  107.     maxAttempts := 20
  108.     for attempts := 1; attempts <= maxAttempts; attempts++ {
  109.         dbError = db.Ping()
  110.         if dbError == nil {
  111.             break
  112.         }
  113.         log.Println(dbError)
  114.         time.Sleep(time.Duration(attempts) * time.Second)
  115.     }
  116.     if dbError != nil {
  117.         log.Fatal(dbError)
  118.     }
  119.  
  120.     log.Println("Application started successfully.")
  121.  
  122.     // Main Telegram Bot
  123.     bot, err := tgbotapi.NewBotAPI(config.TgToken)
  124.     if err != nil {
  125.         log.Fatal(err)
  126.     }
  127.  
  128.     bot.Debug = false
  129.  
  130.     log.Printf("Authorized on account %s", bot.Self.UserName)
  131.  
  132.     _, err = bot.SetWebhook(tgbotapi.NewWebhook("https://" + config.TgDomain + ":" + config.TgPort + "/" + config.TgToken))
  133.     if err != nil {
  134.         log.Fatal(err)
  135.     }
  136.  
  137.     updates := bot.ListenForWebhook("/" + bot.Token)
  138.     go http.ListenAndServe("0.0.0.0:"+config.TgPort, nil)
  139.  
  140.     for update := range updates {
  141.         if update.Message == nil {
  142.             continue
  143.         }
  144.  
  145.         log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
  146.  
  147.         msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
  148.         msg.ReplyToMessageID = update.Message.MessageID
  149.  
  150.         bot.Send(msg)
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement