package main
import (
"context"
"encoding/json"
"flag"
"net/http"
"os"
"os/signal"
"time"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
"github.com/gorilla/mux"
"github.com/rs/zerolog/log"
pb "github.com/terminaldweller/grpc/telebot/v1"
)
var (
flagPort = flag.String("port", "8000", "determined the port the sercice runs on")
// FIXME-the client should provide the channel ID
botChannelID = flag.Int64("botchannelid", 146328407, "determines the channel id the telgram bot should send messages to")
)
const (
TELEGRAM_BOT_TOKEN_ENV_VAR = "TELEGRAM_BOT_TOKEN"
SERVER_DEPLOYMENT_TYPE = "SERVER_DEPLOYMENT_TYPE"
)
type NotificationService struct {
}
func getTGBot() *tgbotapi.BotAPI {
token := os.Getenv(TELEGRAM_BOT_TOKEN_ENV_VAR)
bot, err := tgbotapi.NewBotAPI(token[1 : len(token)-1])
if err != nil {
log.Error().Err(err)
}
return bot
}
func sendMessage(bot *tgbotapi.BotAPI, msgText string, channelID int64) error {
msg := tgbotapi.NewMessage(channelID, msgText)
bot.Send(msg)
return nil
}
func (s *NotificationService) Notify(ctx context.Context, NotificationRequest *pb.NotificationRequest) (*pb.NotificationResponse, error) {
var err error
tgbotapi := getTGBot()
if NotificationRequest.ChannelId == 0 {
err = sendMessage(tgbotapi, NotificationRequest.NotificationText, *botChannelID)
} else {
err = sendMessage(tgbotapi, NotificationRequest.NotificationText, NotificationRequest.ChannelId)
}
if err != nil {
return &pb.NotificationResponse{Error: err.Error(), IsOK: false}, err
}
return &pb.NotificationResponse{Error: "", IsOK: true}, nil
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
var telebotError string
IsTelebotOk := true
w.Header().Add("Content-Type", "application/json")
if r.Method != "GET" {
http.Error(w, "Method is not supported.", http.StatusNotFound)
}
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(struct {
IsHivedOk bool `json:"isTelebotOK"`
TelebotError string `json:"telebotError"`
}{IsHivedOk: IsTelebotOk, TelebotError: telebotError})
}
func msgHandler(w http.ResponseWriter, r *http.Request) {
}
func startServer(gracefulWait time.Duration) {
r := mux.NewRouter()
srv := &http.Server{
Addr: "0.0.0.0:" + *flagPort,
WriteTimeout: time.Second * 15,
ReadTimeout: time.Second * 15,
Handler: r,
}
r.HandleFunc("/health", healthHandler)
r.HandleFunc("/msg", msgHandler)
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Fatal().Err(err)
}
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
ctx, cancel := context.WithTimeout(context.Background(), gracefulWait)
defer cancel()
srv.Shutdown(ctx)
log.Info().Msg("gracefully shut down the server")
}
func main() {
var gracefulWait time.Duration
flag.DurationVar(&gracefulWait, "gracefulwait", time.Second*15, "the duration to wait during the graceful shutdown")
flag.Parse()
startServer(gracefulWait)
}