added fallback display for the removed achievement emoji

This commit is contained in:
Дмитрий Пиченикин 2026-03-10 15:56:02 +03:00
parent 3d84d75669
commit d99ed95cd5
2 changed files with 32 additions and 2 deletions

View File

@ -1536,6 +1536,10 @@ func (p *Plugin) getUserBadges(w http.ResponseWriter, r *http.Request, actingUse
p.mm.Log.Debug("Error getting the badges for user", "error", err, "user", userID) p.mm.Log.Debug("Error getting the badges for user", "error", err, "user", userID)
} }
for _, ub := range badges {
p.sanitizeBadgeEmoji(&ub.Badge)
}
b, _ := json.Marshal(badges) b, _ := json.Marshal(badges)
_, _ = w.Write(b) _, _ = w.Write(b)
} }
@ -1564,6 +1568,7 @@ func (p *Plugin) getBadgeDetails(w http.ResponseWriter, r *http.Request, actingU
resp := BadgeDetailsResponse{BadgeDetails: badge} resp := BadgeDetailsResponse{BadgeDetails: badge}
if badge != nil { if badge != nil {
p.sanitizeBadgeEmoji(&badge.Badge)
actingUser, userErr := p.mm.User.Get(actingUserID) actingUser, userErr := p.mm.User.Get(actingUserID)
if userErr == nil { if userErr == nil {
bt, typeErr := p.store.GetType(badge.Type) bt, typeErr := p.store.GetType(badge.Type)
@ -1578,12 +1583,16 @@ func (p *Plugin) getBadgeDetails(w http.ResponseWriter, r *http.Request, actingU
} }
func (p *Plugin) getAllBadges(w http.ResponseWriter, r *http.Request, actingUserID string) { func (p *Plugin) getAllBadges(w http.ResponseWriter, r *http.Request, actingUserID string) {
badge, err := p.store.GetAllBadges() badges, err := p.store.GetAllBadges()
if err != nil { if err != nil {
p.mm.Log.Debug("Cannot get all badges", "error", err) p.mm.Log.Debug("Cannot get all badges", "error", err)
} }
b, _ := json.Marshal(badge) for _, ab := range badges {
p.sanitizeBadgeEmoji(&ab.Badge)
}
b, _ := json.Marshal(badges)
_, _ = w.Write(b) _, _ = w.Write(b)
} }

View File

@ -140,6 +140,27 @@ func dumpObject(o interface{}) {
fmt.Println(string(b)) fmt.Println(string(b))
} }
const fallbackEmoji = "question"
// sanitizeBadgeEmoji checks if a badge's custom emoji still exists.
// If the emoji was deleted, it replaces it with a fallback and persists the change.
func (p *Plugin) sanitizeBadgeEmoji(badge *badgesmodel.Badge) {
if badge.ImageType != badgesmodel.ImageTypeEmoji {
return
}
if _, ok := model.SystemEmojis[badge.Image]; ok {
return
}
_, appErr := p.API.GetEmojiByName(badge.Image)
if appErr == nil {
return
}
badge.Image = fallbackEmoji
if err := p.store.UpdateBadge(badge); err != nil {
p.mm.Log.Warn("Failed to replace deleted emoji on badge", "badge_id", badge.ID, "error", err.Error())
}
}
func (p *Plugin) notifyGrant(badgeID badgesmodel.BadgeID, granter string, granted *model.User, inChannel bool, channelID string, reason string) { func (p *Plugin) notifyGrant(badgeID badgesmodel.BadgeID, granter string, granted *model.User, inChannel bool, channelID string, reason string) {
b, errBadge := p.store.GetBadgeDetails(badgeID) b, errBadge := p.store.GetBadgeDetails(badgeID)
granterUser, errUser := p.mm.User.Get(granter) granterUser, errUser := p.mm.User.Get(granter)