@@ -186,6 +186,19 @@ func StartBot() error {
186186
187187// StartAPI starts the REST API server
188188func StartAPI () error {
189+ fmt .Println ("🚀 Starting AutoAR API Server..." )
190+
191+ // Load .env file if it exists
192+ if err := envloader .LoadEnv (); err != nil {
193+ log .Printf ("[WARN] Failed to load .env file: %v" , err )
194+ } else {
195+ fmt .Println ("✅ Loaded environment variables from .env file" )
196+ }
197+
198+ // Re-read API host and port after loading .env
199+ apiHostEnv := getEnv ("API_HOST" , "0.0.0.0" )
200+ apiPortEnv := getEnv ("API_PORT" , "8000" )
201+
189202 // Initialize database if configured
190203 if os .Getenv ("DB_HOST" ) != "" {
191204 if err := db .Init (); err != nil {
@@ -205,7 +218,7 @@ func StartAPI() error {
205218 }()
206219
207220 router := setupAPI ()
208- addr := fmt .Sprintf ("%s:%s" , apiHost , apiPort )
221+ addr := fmt .Sprintf ("%s:%s" , apiHostEnv , apiPortEnv )
209222 fmt .Printf ("AutoAR API Server starting on %s\n " , addr )
210223
211224 sc := make (chan os.Signal , 1 )
@@ -224,6 +237,19 @@ func StartAPI() error {
224237
225238// StartBoth starts both Discord bot and API server
226239func StartBoth () error {
240+ fmt .Println ("🚀 Starting AutoAR (Discord Bot + API Server)..." )
241+
242+ // Load .env file if it exists
243+ if err := envloader .LoadEnv (); err != nil {
244+ log .Printf ("[WARN] Failed to load .env file: %v" , err )
245+ } else {
246+ fmt .Println ("✅ Loaded environment variables from .env file" )
247+ }
248+
249+ // Re-read configuration after loading .env
250+ botTokenEnv := os .Getenv ("DISCORD_BOT_TOKEN" )
251+ autoarModeEnv := getEnv ("AUTOAR_MODE" , "both" )
252+
227253 // Initialize database if configured (only once for both services)
228254 if os .Getenv ("DB_HOST" ) != "" {
229255 if err := db .Init (); err != nil {
@@ -244,27 +270,31 @@ func StartBoth() error {
244270
245271 var wg sync.WaitGroup
246272
247- if botToken == "" {
273+ if botTokenEnv == "" {
248274 return fmt .Errorf ("DISCORD_BOT_TOKEN environment variable is required" )
249275 }
250276
251- // Start Discord bot
252- wg .Add (1 )
253- go func () {
254- defer wg .Done ()
255- if err := StartBot (); err != nil {
256- log .Printf ("Discord bot error: %v" , err )
257- }
258- }()
277+ // Start Discord bot if mode allows
278+ if autoarModeEnv == "discord" || autoarModeEnv == "both" {
279+ wg .Add (1 )
280+ go func () {
281+ defer wg .Done ()
282+ if err := StartBot (); err != nil {
283+ log .Printf ("Discord bot error: %v" , err )
284+ }
285+ }()
286+ }
259287
260- // Start API server
261- wg .Add (1 )
262- go func () {
263- defer wg .Done ()
264- if err := StartAPI (); err != nil {
265- log .Printf ("API server error: %v" , err )
266- }
267- }()
288+ // Start API server if mode allows
289+ if autoarModeEnv == "api" || autoarModeEnv == "both" {
290+ wg .Add (1 )
291+ go func () {
292+ defer wg .Done ()
293+ if err := StartAPI (); err != nil {
294+ log .Printf ("API server error: %v" , err )
295+ }
296+ }()
297+ }
268298
269299 // Wait for interrupt signal
270300 sc := make (chan os.Signal , 1 )
@@ -282,26 +312,31 @@ func Ready(s *discordgo.Session, event *discordgo.Ready) {
282312
283313// InteractionCreate handles Discord slash command interactions
284314func InteractionCreate (s * discordgo.Session , i * discordgo.InteractionCreate ) {
315+ // Read guild restriction from environment variables dynamically (supports .env file)
316+ // This ensures values are read after .env is loaded, not from package-level initialization
317+ allowedGuildIDEnv := getEnv ("DISCORD_ALLOWED_GUILD_ID" , "" )
318+ allowedGuildNameEnv := getEnv ("DISCORD_ALLOWED_GUILD" , "" )
319+
285320 // Check guild restriction by ID (GUID) - preferred method
286- if allowedGuildID != "" {
321+ if allowedGuildIDEnv != "" {
287322 // Reject DMs (commands must be in a server)
288323 if i .GuildID == "" {
289324 log .Printf ("[INFO] Rejected command from DM (not in a server)" )
290- respond (s , i , fmt .Sprintf ("❌ This bot is restricted to a specific server (Guild ID: %s). Please use commands in that server." , allowedGuildID ), true )
325+ respond (s , i , fmt .Sprintf ("❌ This bot is restricted to a specific server (Guild ID: %s). Please use commands in that server." , allowedGuildIDEnv ), true )
291326 return
292327 }
293- if i .GuildID != allowedGuildID {
294- log .Printf ("[INFO] Rejected command from unauthorized guild ID: %s (expected: %s)" , i .GuildID , allowedGuildID )
295- respond (s , i , fmt .Sprintf ("❌ This bot is restricted to a specific server (Guild ID: %s). Your server ID: %s" , allowedGuildID , i .GuildID ), true )
328+ if i .GuildID != allowedGuildIDEnv {
329+ log .Printf ("[INFO] Rejected command from unauthorized guild ID: %s (expected: %s)" , i .GuildID , allowedGuildIDEnv )
330+ respond (s , i , fmt .Sprintf ("❌ This bot is restricted to a specific server (Guild ID: %s). Your server ID: %s" , allowedGuildIDEnv , i .GuildID ), true )
296331 return
297332 }
298333 log .Printf ("[DEBUG] Command allowed from guild ID: %s" , i .GuildID )
299- } else if allowedGuildName != "" {
334+ } else if allowedGuildNameEnv != "" {
300335 // Legacy: Check by guild name (deprecated, but kept for backward compatibility)
301336 // Reject DMs (commands must be in a server)
302337 if i .GuildID == "" {
303338 log .Printf ("[INFO] Rejected command from DM (not in a server)" )
304- respond (s , i , fmt .Sprintf ("❌ This bot only works in the **%s** server. Please use commands in that server." , allowedGuildName ), true )
339+ respond (s , i , fmt .Sprintf ("❌ This bot only works in the **%s** server. Please use commands in that server." , allowedGuildNameEnv ), true )
305340 return
306341 }
307342
@@ -314,9 +349,9 @@ func InteractionCreate(s *discordgo.Session, i *discordgo.InteractionCreate) {
314349 }
315350
316351 // Check if guild name matches allowed guild
317- if guild .Name != allowedGuildName {
318- log .Printf ("[INFO] Rejected command from unauthorized guild: %s (expected: %s)" , guild .Name , allowedGuildName )
319- respond (s , i , fmt .Sprintf ("❌ This bot is restricted to the **%s** server only. Your server: **%s**" , allowedGuildName , guild .Name ), true )
352+ if guild .Name != allowedGuildNameEnv {
353+ log .Printf ("[INFO] Rejected command from unauthorized guild: %s (expected: %s)" , guild .Name , allowedGuildNameEnv )
354+ respond (s , i , fmt .Sprintf ("❌ This bot is restricted to the **%s** server only. Your server: **%s**" , allowedGuildNameEnv , guild .Name ), true )
320355 return
321356 }
322357
0 commit comments