Store role list in database and convert role mentions into a readable format

This commit is contained in:
Tulir Asokan
2022-07-08 15:31:03 +03:00
parent 668a77e30d
commit 2611cbfa34
8 changed files with 246 additions and 9 deletions

74
user.go
View File

@@ -459,6 +459,9 @@ func (user *User) Connect() error {
user.Session.AddHandler(user.guildCreateHandler)
user.Session.AddHandler(user.guildDeleteHandler)
user.Session.AddHandler(user.guildUpdateHandler)
user.Session.AddHandler(user.guildRoleCreateHandler)
user.Session.AddHandler(user.guildRoleUpdateHandler)
user.Session.AddHandler(user.guildRoleDeleteHandler)
user.Session.AddHandler(user.channelCreateHandler)
user.Session.AddHandler(user.channelDeleteHandler)
@@ -586,6 +589,74 @@ func (user *User) addGuildToSpace(guild *Guild) bool {
return false
}
func (user *User) discordRoleToDB(guildID string, role *discordgo.Role, dbRole *database.Role) (*database.Role, bool) {
var changed bool
if dbRole == nil {
dbRole = user.bridge.DB.Role.New()
dbRole.ID = role.ID
dbRole.GuildID = guildID
changed = true
} else {
changed = dbRole.Name != role.Name ||
dbRole.Icon != role.Icon ||
dbRole.Mentionable != role.Mentionable ||
dbRole.Managed != role.Managed ||
dbRole.Hoist != role.Hoist ||
dbRole.Color != role.Color ||
dbRole.Position != role.Position ||
dbRole.Permissions != role.Permissions
}
dbRole.Role = *role
return dbRole, changed
}
func (user *User) handleGuildRoles(guildID string, newRoles []*discordgo.Role) {
existingRoles := user.bridge.DB.Role.GetAll(guildID)
existingRoleMap := make(map[string]*database.Role, len(existingRoles))
for _, role := range existingRoles {
existingRoleMap[role.ID] = role
}
txn, err := user.bridge.DB.Begin()
if err != nil {
user.log.Errorln("Failed to start transaction for guild role sync:", err)
panic(err)
return
}
for _, role := range newRoles {
dbRole, changed := user.discordRoleToDB(guildID, role, existingRoleMap[role.ID])
delete(existingRoleMap, role.ID)
if changed {
dbRole.Upsert(txn)
}
}
for _, removeRole := range existingRoleMap {
removeRole.Delete(txn)
}
err = txn.Commit()
if err != nil {
user.log.Errorln("Failed to commit guild role sync:", err)
rollbackErr := txn.Rollback()
if rollbackErr != nil {
user.log.Errorln("Failed to rollback errored guild role sync:", rollbackErr)
}
panic(err)
}
}
func (user *User) guildRoleCreateHandler(_ *discordgo.Session, r *discordgo.GuildRoleCreate) {
dbRole, _ := user.discordRoleToDB(r.GuildID, r.Role, nil)
dbRole.Upsert(nil)
}
func (user *User) guildRoleUpdateHandler(_ *discordgo.Session, r *discordgo.GuildRoleUpdate) {
dbRole, _ := user.discordRoleToDB(r.GuildID, r.Role, nil)
dbRole.Upsert(nil)
}
func (user *User) guildRoleDeleteHandler(_ *discordgo.Session, r *discordgo.GuildRoleDelete) {
user.bridge.DB.Role.DeleteByID(r.GuildID, r.RoleID)
}
func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSpace bool) {
guild := user.bridge.GetGuildByID(meta.ID, true)
guild.UpdateInfo(user, meta)
@@ -602,6 +673,9 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp
}
}
}
if len(meta.Roles) > 0 {
user.handleGuildRoles(meta.ID, meta.Roles)
}
if !isInSpace {
isInSpace = user.addGuildToSpace(guild)
}