Join Gate (account age, avatar, advertising and username filters, bot checks), raid detection with invite pausing, anti-nuke quarantine of admins who mass delete, manual and automatic lockdowns, a decaying heat score against spam, role and channel snapshots with restore, and alert DMs to the owner and trusted users. Everything that weakens protection is limited to the owner and the trusted list. Co-Authored-By: Claude Opus 5.5 <[email protected]>
101 lines
3.4 KiB
Go
101 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"velox-bot/internal/bot"
|
|
"velox-bot/internal/commands"
|
|
cmdtickets "velox-bot/internal/commands/tickets"
|
|
"velox-bot/internal/config"
|
|
"velox-bot/internal/db"
|
|
"velox-bot/internal/db/repos/defaultrolerepo"
|
|
"velox-bot/internal/db/repos/levelrepo"
|
|
"velox-bot/internal/db/repos/musicrepo"
|
|
"velox-bot/internal/db/repos/projectsrepo"
|
|
"velox-bot/internal/db/repos/rpsrepo"
|
|
"velox-bot/internal/db/repos/schedulerepo"
|
|
"velox-bot/internal/db/repos/securityrepo"
|
|
"velox-bot/internal/db/repos/settingsrepo"
|
|
"velox-bot/internal/db/repos/ticketrepo"
|
|
"velox-bot/internal/db/repos/twitchrepo"
|
|
"velox-bot/internal/db/repos/usersettingsrepo"
|
|
"velox-bot/internal/db/repos/welcomerepo"
|
|
"velox-bot/internal/db/services"
|
|
"velox-bot/internal/db/services/defaultrole"
|
|
"velox-bot/internal/db/services/level"
|
|
"velox-bot/internal/db/services/levelsettings"
|
|
"velox-bot/internal/db/services/logsettings"
|
|
"velox-bot/internal/db/services/meeting"
|
|
"velox-bot/internal/db/services/musicsettings"
|
|
"velox-bot/internal/db/services/projects"
|
|
"velox-bot/internal/db/services/rps"
|
|
"velox-bot/internal/db/services/schedule"
|
|
"velox-bot/internal/db/services/twitch"
|
|
"velox-bot/internal/db/services/usersettings"
|
|
"velox-bot/internal/db/services/welcome"
|
|
"velox-bot/internal/security"
|
|
)
|
|
|
|
func main() {
|
|
config, err := config.LoadConfig()
|
|
if err != nil {
|
|
log.Fatalf("Error loading config: %v", err)
|
|
return
|
|
}
|
|
|
|
db, err := db.NewDB(config)
|
|
if err != nil {
|
|
log.Fatalf("Error creating database: %v", err)
|
|
return
|
|
}
|
|
defer db.Close()
|
|
|
|
levelRepo := levelrepo.NewRepo(db)
|
|
settingsRepo := settingsrepo.NewRepo(db)
|
|
musicRepo := musicrepo.NewRepo(db)
|
|
rpsRepo := rpsrepo.NewRepo(db)
|
|
projectsRepo := projectsrepo.NewRepo(db)
|
|
scheduleRepo := schedulerepo.NewRepo(db)
|
|
userSettingsRepo := usersettingsrepo.NewRepo(db)
|
|
welcomeRepo := welcomerepo.NewRepo(db)
|
|
twitchRepo := twitchrepo.NewRepo(db)
|
|
defaultRoleRepo := defaultrolerepo.NewRepo(db)
|
|
cmdtickets.Init(ticketrepo.NewRepo(db))
|
|
security.Configure(securityrepo.NewRepo(db))
|
|
levelService := level.New(levelRepo, settingsRepo)
|
|
levelSettingsService := levelsettings.New(settingsRepo)
|
|
logSettingsService := logsettings.New(settingsRepo)
|
|
meetingService := meeting.New(settingsRepo)
|
|
scheduleService := schedule.New(scheduleRepo)
|
|
userSettingsService := usersettings.New(userSettingsRepo)
|
|
projectsService := projects.New(projectsRepo)
|
|
rpsService := rps.New(rpsRepo)
|
|
twitchService := twitch.New(twitchRepo, config.TwitchClientID)
|
|
welcomeService := welcome.New(welcomeRepo)
|
|
defaultRoleService := defaultrole.New(defaultRoleRepo)
|
|
musicSettingsService := musicsettings.New(settingsRepo)
|
|
services := services.NewServices(levelService, levelSettingsService, meetingService, scheduleService, userSettingsService, projectsService, rpsService, twitchService, welcomeService, defaultRoleService, logSettingsService, musicSettingsService)
|
|
|
|
bot, err := bot.NewBot(config.BotToken, config.AppID, config.GuildID, config.LavalinkHost, config.LavalinkPass, commands.AllCommands, services, musicRepo, config.DBHost)
|
|
if err != nil {
|
|
log.Fatalf("Error creating bot: %v", err)
|
|
return
|
|
}
|
|
|
|
err = bot.Start()
|
|
if err != nil {
|
|
log.Fatalf("Error starting bot: %v", err)
|
|
}
|
|
|
|
defer bot.Close()
|
|
|
|
fmt.Println("Bot is running...")
|
|
|
|
sc := make(chan os.Signal, 1)
|
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
|
|
<-sc
|
|
}
|