package main
import (
"context"
"flag"
"fmt"
"net"
"os"
"strconv"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
"github.com/rs/zerolog/log"
pb "github.com/terminaldweller/grpc/telebot/v1"
"google.golang.org/grpc"
)
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 server struct {
pb.UnimplementedNotificationServiceServer
}
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 *server) 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 startServer(port uint16) {
listener, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", port))
if err != nil {
log.Fatal().Err(err)
}
var opts []grpc.ServerOption
grpcServer := grpc.NewServer(opts...)
pb.RegisterNotificationServiceServer(grpcServer, &server{})
if err := grpcServer.Serve(listener); err != nil {
log.Fatal().Err(err)
}
}
func main() {
flag.Parse()
port, _ := strconv.Atoi(*flagPort)
startServer(uint16(port))
}