summaryrefslogtreecommitdiff
path: root/gateway/main.go
blob: 6f10dd34fca345741521109c2096775577a24c9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main

import (
	"flag"

	"github.com/discordnova/nova/gateway/lib"
	"github.com/discordnova/nova/gateway/lib/gateway"
	"github.com/discordnova/nova/gateway/lib/gateway/compression"
	"github.com/discordnova/nova/gateway/lib/gateway/transporters"
	"github.com/rs/zerolog/log"
)

var (
	settings = gateway.GatewayConnectorOptions{
		Token:                  flag.String("token", "", "the discord token for the websocket connection"),
		Restart:                flag.Bool("restart", true, "should the gateway be restarted if an error occurs"),
		GuildSubs:              flag.Bool("guild-subscriptions", true, "should the guild subscription gateway flag set to true"),
		SelfShard:              flag.Int("shard", 0, "the shard id of this instance"),
		TotalShard:             flag.Int("shard-count", 1, "the total amount of shard"),
		SessionUpdateFrequency: flag.Int("session-persist-frequence", 10, "the frequency of session persistence"),
	}

	compressor  = flag.String("compressor", "json-zlib", "the compressor used to connect")
	transporter = flag.String("transporter", "rabbitmq", "the compressor used to connect")
	monitoring  = flag.Int("prometheus-port", 9000, "is this flag is set, a prometheus metrics endpoint will be exposed")
	url         = flag.String("transporter-url", "", "the url needed for rabbitmq to function")
)

func validate(settings *gateway.GatewayConnectorOptions) {
	if *settings.SelfShard > *settings.TotalShard {
		log.Fatal().Msg("invalid config: the shard id must be inferior than the total shard value")
	} else if *settings.SessionUpdateFrequency == 0 {
		log.Fatal().Msg("invalid config: the session update frequency muse be greater than 0")
	} else if *settings.Token == "" {
		log.Fatal().Msg("invalid config: invalid token provided")
	} else if *settings.TotalShard == 0 {
		log.Fatal().Msg("invalid config: the total number of shards muse be greater than 0")
	}
}

func main() {
	flag.Parse()
	lib.SetupLogger()

	if monitoring != nil {
		go lib.CreatePrometheus(*monitoring)
		log.Debug().Msg("prometheus server called")
	}

	if *compressor == "json-zlib" {
		settings.Compressor = compression.NewJsonZlibCompressor()
	} else {
		log.Fatal().Msgf("unknown compressor specified: %s", *compressor)
	}

	if *transporter == "rabbitmq" {
		trns, err := transporters.NewRabbitMqTransporter(*url)
		if err != nil {
			log.Fatal().Msgf("failed to initialize the transporter: %s", err.Error())
		}
		settings.Transporter = trns
	}

	validate(&settings)

	gateway := gateway.NewGateway(settings)
	gateway.Start()
}