-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.go
More file actions
133 lines (111 loc) · 4.1 KB
/
main.go
File metadata and controls
133 lines (111 loc) · 4.1 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package main
import (
"fmt"
"log"
"os"
"github.com/StrafeChat/nebula/src/config"
"github.com/StrafeChat/nebula/src/database"
"github.com/StrafeChat/nebula/src/events"
"github.com/StrafeChat/nebula/src/handlers/v1/bots"
handlerevents "github.com/StrafeChat/nebula/src/handlers/v1/events"
"github.com/StrafeChat/nebula/src/handlers/v1/files"
"github.com/StrafeChat/nebula/src/handlers/v1/rooms"
"github.com/StrafeChat/nebula/src/handlers/v1/spaces"
"github.com/StrafeChat/nebula/src/handlers/v1/users"
"github.com/StrafeChat/nebula/src/middleware"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/cors"
"github.com/gofiber/fiber/v3/middleware/logger"
"github.com/gofiber/fiber/v3/middleware/static"
"github.com/joho/godotenv"
)
func main() {
// Load .env file
if err := godotenv.Load(); err != nil {
log.Fatal("Error loading .env file")
}
// Initialize database connections
if err := database.InitDB(); err != nil {
log.Fatalf("Failed to initialize database: %v", err)
}
defer database.Session.Close()
// Initialize Redis connection
if err := database.InitRedis(); err != nil {
log.Fatalf("Failed to initialize Redis: %v", err)
}
// Start avatar event listener in a goroutine
go handlerevents.StartAvatarEventListener()
// Start file event listener in a goroutine
go events.StartFileEventListener()
// Check all user avatars on startup
handlerevents.CheckUserAvatars()
// Ensure all users from database have avatar directories
handlerevents.EnsureUserAvatars()
// Ensure all bots from database have avatar directories
handlerevents.EnsureBotAvatars()
// Load configuration
cfg := config.LoadConfig()
// Create uploads directory if it doesn't exist
if err := os.MkdirAll("uploads", 0755); err != nil {
log.Fatalf("Failed to create uploads directory: %v", err)
}
// Create Fiber app
app := fiber.New(fiber.Config{
BodyLimit: 10 * 1024 * 1024, // 10MB
})
// Middleware
app.Use(logger.New())
app.Use(cors.New(cors.Config{
AllowOrigins: []string{"*"},
AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization", "x-session-token", "x-bot-token"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE"},
}))
// API routes
api := app.Group("/api")
v1 := api.Group("/v1")
// User routes
userRoutes := v1.Group("/users")
userRoutes.Use(middleware.Auth)
userRoutes.Post("/avatar", users.UploadAvatar)
userRoutes.Post("/banner", users.HandleBannerUpload)
// Room routes
roomRoutes := v1.Group("/rooms")
roomRoutes.Use(middleware.Auth)
roomRoutes.Post("/:id/icon", rooms.UploadIcon)
// Space routes
spaceRoutes := v1.Group("/spaces")
spaceRoutes.Use(middleware.Auth)
spaceRoutes.Post("/:id/icon", spaces.UploadIcon)
spaceRoutes.Post("/:id/banner", spaces.UploadBanner)
spaceRoutes.Post("/:id/emojis", spaces.UploadCustomEmoji)
spaceRoutes.Get("/:id/emojis", spaces.GetSpaceCustomEmojis)
spaceRoutes.Delete("/:id/emojis/:shortcode", spaces.DeleteCustomEmoji)
// Bot routes
botRoutes := v1.Group("/bots")
botRoutes.Use(middleware.Auth)
botRoutes.Post("/:id/avatar", bots.UploadBotAvatar)
botRoutes.Post("/create-default-avatar", bots.CreateDefaultAvatar)
// File routes
fileRoutes := v1.Group("/files")
fileRoutes.Use(middleware.Auth)
fileRoutes.Post("/", files.UploadFile)
fileRoutes.Get("/:id", files.GetFile)
// Static file serving
app.Use("avatars", static.New("./uploads/avatars"))
app.Use("banners", static.New("./uploads/banners"))
app.Use("icons", static.New("./uploads/icons"))
app.Use("space_icons", static.New("./uploads/space_icons"))
app.Use("space_banners", static.New("./uploads/space_banners"))
app.Use("attachments", static.New("./uploads/attachments"))
app.Use("emojis", static.New("./uploads/emojis"))
app.Use("bot_avatars", static.New("./uploads/bot_avatars"))
app.Use("custom_emojis", static.New("./uploads/custom_emojis"))
// Twemoji SVG serving (no auth required for public emojis)
app.Use("twemoji", static.New("./static/twemoji"))
// Start server
addr := fmt.Sprintf(":%d", cfg.Port)
log.Printf("Server starting on %s", addr)
if err := app.Listen(addr); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
}