@@ -3,7 +3,8 @@ package main
3
3
import (
4
4
"context"
5
5
_ "embed"
6
- "math/rand"
6
+ "fmt"
7
+ "log/slog"
7
8
"net/http"
8
9
"os"
9
10
"os/signal"
@@ -12,10 +13,7 @@ import (
12
13
13
14
"github.com/disgoorg/disgo"
14
15
"github.com/disgoorg/disgo/bot"
15
- "github.com/disgoorg/disgo/discord"
16
- "github.com/disgoorg/log"
17
16
"github.com/prometheus/client_golang/prometheus/promhttp"
18
- "golang.org/x/oauth2"
19
17
20
18
"github.com/topi314/reddit-discord-bot/v2/redditbot"
21
19
)
@@ -34,59 +32,44 @@ var (
34
32
)
35
33
36
34
func main () {
37
- log . Infof ("starting reddit-discord-bot version: %s (%s)" , Version , Commit )
35
+ slog . Info ("starting reddit-discord-bot..." , slog . String ( "version" , Version ), slog . String ( "commit" , Commit ) )
38
36
cfg , err := redditbot .ReadConfig ()
39
37
if err != nil {
40
- log .Fatal ("error reading config:" , err .Error ())
38
+ slog .Error ("error reading config" , slog .Any ("err" , err ))
39
+ return
41
40
}
42
41
43
- log .SetLevel (cfg .Log .Level )
44
- log .SetFlags (cfg .Log .Flags ())
42
+ if err = setupLogger (cfg .Log ); err != nil {
43
+ slog .Error ("error setting up logger" , slog .Any ("err" , err ))
44
+ return
45
+ }
45
46
46
- log .Info ("Config: " , cfg )
47
+ slog .Info ("loaded config " , slog . String ( "config" , cfg . String ()) )
47
48
if err = cfg .Validate (); err != nil {
48
- log .Fatalf (err .Error ())
49
+ slog .Error ("error validating config" , slog .Any ("err" , err ))
50
+ return
49
51
}
50
52
51
53
client , err := disgo .New (cfg .Discord .Token ,
52
54
bot .WithDefaultGateway (),
53
55
)
54
56
if err != nil {
55
- log .Fatal ("error creating client:" , err .Error ())
57
+ slog .Error ("error creating client" , slog .Any ("err" , err ))
58
+ return
56
59
}
57
60
58
- reddit , err := redditbot .NewReddit (cfg .Reddit )
61
+ reddit , err := redditbot .NewReddit (cfg .Reddit , Version )
59
62
if err != nil {
60
- log .Fatal ("error creating reddit client:" , err .Error ())
63
+ slog .Error ("error creating reddit client" , slog .Any ("err" , err ))
64
+ return
61
65
}
62
66
63
67
db , err := redditbot .NewDB (cfg .Database , schema )
64
68
if err != nil {
65
- log . Fatal ("error creating database client: " , err . Error ( ))
69
+ slog . Error ("error creating database client" , slog . Any ( "err" , err ))
66
70
}
67
71
68
- b := redditbot.Bot {
69
- Cfg : cfg ,
70
- RedditIcon : redditIcon ,
71
- Client : client ,
72
- Reddit : reddit ,
73
- DB : db ,
74
- Rand : rand .New (rand .NewSource (time .Now ().UnixNano ())),
75
- DiscordConfig : & oauth2.Config {
76
- ClientID : client .ApplicationID ().String (),
77
- ClientSecret : cfg .Discord .ClientSecret ,
78
- Endpoint : oauth2.Endpoint {
79
- AuthURL : "https://discord.com/api/oauth2/authorize" ,
80
- TokenURL : "https://discord.com/api/oauth2/token" ,
81
- AuthStyle : oauth2 .AuthStyleInParams ,
82
- },
83
- RedirectURL : cfg .Server .RedirectURL ,
84
- Scopes : []string {
85
- string (discord .OAuth2ScopeWebhookIncoming ),
86
- },
87
- },
88
- States : map [string ]redditbot.SetupState {},
89
- }
72
+ b := redditbot .New (cfg , redditIcon , client , reddit , db )
90
73
defer b .Close ()
91
74
92
75
if cfg .Metrics .Enabled {
@@ -111,31 +94,62 @@ func main() {
111
94
112
95
if cfg .Discord .SyncCommands {
113
96
if _ , err = client .Rest ().SetGlobalCommands (client .ApplicationID (), redditbot .Commands ); err != nil {
114
- log . Fatal ("error setting global commands: " , err . Error ( ))
97
+ slog . Error ("error setting global commands" , slog . Any ( "err" , err ))
115
98
}
116
99
}
117
100
118
101
ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
119
102
defer cancel ()
120
103
if err = client .OpenGateway (ctx ); err != nil {
121
- log . Fatal ("error opening gateway: " , err . Error ( ))
104
+ slog . Error ("error opening discord gateway" , slog . Any ( "err" , err ))
122
105
}
123
106
124
107
go b .ListenSubreddits ()
125
108
126
109
if cfg .Server .Enabled {
127
110
go b .ListenAndServe ()
128
- defer b .Server .Shutdown (context .Background ())
111
+ defer func () {
112
+ sCtx , sCancel := context .WithTimeout (context .Background (), 5 * time .Second )
113
+ defer sCancel ()
114
+ if sErr := b .Server .Shutdown (sCtx ); sErr != nil {
115
+ slog .Error ("error shutting down server" , slog .Any ("err" , sErr ))
116
+ }
117
+ }()
129
118
}
130
119
131
120
if cfg .Metrics .Enabled {
132
121
go b .ListenAndServeMetrics ()
133
- defer b .MetricsServer .Shutdown (context .Background ())
122
+ defer func () {
123
+ mCtx , mCancel := context .WithTimeout (context .Background (), 5 * time .Second )
124
+ defer mCancel ()
125
+ if mErr := b .MetricsServer .Shutdown (mCtx ); mErr != nil {
126
+ slog .Error ("error shutting down metrics server" , slog .Any ("err" , mErr ))
127
+ }
128
+ }()
134
129
}
135
130
136
- defer log .Info ("exiting ..." )
131
+ defer slog .Info ("stopping reddit-discord-bot ..." )
137
132
138
133
s := make (chan os.Signal , 1 )
139
134
signal .Notify (s , syscall .SIGINT , syscall .SIGTERM )
140
135
<- s
141
136
}
137
+
138
+ func setupLogger (cfg redditbot.LogConfig ) error {
139
+ options := & slog.HandlerOptions {
140
+ AddSource : cfg .AddSource ,
141
+ Level : cfg .Level ,
142
+ }
143
+
144
+ var sHandler slog.Handler
145
+ switch cfg .Format {
146
+ case "json" :
147
+ sHandler = slog .NewJSONHandler (os .Stdout , options )
148
+ case "text" :
149
+ sHandler = slog .NewTextHandler (os .Stdout , options )
150
+ default :
151
+ return fmt .Errorf ("unknown log format: %s" , cfg .Format )
152
+ }
153
+ slog .SetDefault (slog .New (sHandler ))
154
+ return nil
155
+ }
0 commit comments