feat: add default role management functionality

- Introduced a new default role service and repository for managing default roles assigned to new members.
- Added command to set the default role through the bot's configuration.
- Implemented event handling to assign the default role to new guild members upon joining.
- Updated main application to include the new default role service in the bot's services.
This commit is contained in:
2026-03-18 05:12:40 +00:00
parent e6aa5def96
commit 4080ce8aec
6 changed files with 201 additions and 48 deletions
+47
View File
@@ -0,0 +1,47 @@
package defaultrolerepo
import (
"context"
"database/sql"
)
type Repo struct {
db *sql.DB
}
func NewRepo(db *sql.DB) *Repo {
return &Repo{db: db}
}
// GetRole returns the configured default role ID for a guild, or 0 if none.
func (r *Repo) GetRole(ctx context.Context, guildID int64) (int64, error) {
const q = `
SELECT role_id
FROM defaultrole
WHERE guild_id = $1
`
var roleID sql.NullInt64
if err := r.db.QueryRowContext(ctx, q, guildID).Scan(&roleID); err != nil {
if err == sql.ErrNoRows {
return 0, nil
}
return 0, err
}
if !roleID.Valid {
return 0, nil
}
return roleID.Int64, nil
}
// SetRole upserts the default role for a guild.
func (r *Repo) SetRole(ctx context.Context, guildID, roleID int64) error {
const q = `
INSERT INTO defaultrole (guild_id, role_id)
VALUES ($1, $2)
ON CONFLICT (guild_id)
DO UPDATE SET role_id = EXCLUDED.role_id
`
_, err := r.db.ExecContext(ctx, q, guildID, roleID)
return err
}
@@ -0,0 +1,24 @@
package defaultrole
import (
"context"
"velox-bot/internal/db/repos/defaultrolerepo"
)
type Service struct {
repo *defaultrolerepo.Repo
}
func New(repo *defaultrolerepo.Repo) *Service {
return &Service{repo: repo}
}
func (s *Service) GetRole(ctx context.Context, guildID int64) (int64, error) {
return s.repo.GetRole(ctx, guildID)
}
func (s *Service) SetRole(ctx context.Context, guildID, roleID int64) error {
return s.repo.SetRole(ctx, guildID, roleID)
}
+4 -1
View File
@@ -10,6 +10,7 @@ import (
"velox-bot/internal/db/services/twitch"
"velox-bot/internal/db/services/usersettings"
"velox-bot/internal/db/services/welcome"
"velox-bot/internal/db/services/defaultrole"
)
type Services struct {
@@ -22,11 +23,12 @@ type Services struct {
RPS *rps.Service
Twitch *twitch.Service
Welcome *welcome.Service
DefaultRole *defaultrole.Service
}
var Global *Services
func NewServices(level *level.Service, levelSettings *levelsettings.Service, meeting *meeting.Service, schedule *schedule.Service, userSettings *usersettings.Service, projects *projects.Service, rps *rps.Service, twitchSvc *twitch.Service, welcomeSvc *welcome.Service) *Services {
func NewServices(level *level.Service, levelSettings *levelsettings.Service, meeting *meeting.Service, schedule *schedule.Service, userSettings *usersettings.Service, projects *projects.Service, rps *rps.Service, twitchSvc *twitch.Service, welcomeSvc *welcome.Service, defaultRoleSvc *defaultrole.Service) *Services {
s := &Services{
Level: level,
LevelSettings: levelSettings,
@@ -37,6 +39,7 @@ func NewServices(level *level.Service, levelSettings *levelsettings.Service, mee
RPS: rps,
Twitch: twitchSvc,
Welcome: welcomeSvc,
DefaultRole: defaultRoleSvc,
}
Global = s
return s