212 lines
4.9 KiB
Go
212 lines
4.9 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/larkox/mattermost-plugin-badges/badgesmodel"
|
|
"github.com/mattermost/mattermost-server/v5/model"
|
|
)
|
|
|
|
func areRolesAllowed(userRoles []string, allowedRoles map[string]bool) bool {
|
|
for ar, b := range allowedRoles {
|
|
if !b {
|
|
continue
|
|
}
|
|
for _, ur := range userRoles {
|
|
if ar == ur {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func canGrantBadge(user *model.User, badgeAdminID string, badge *badgesmodel.Badge, badgeType *badgesmodel.BadgeTypeDefinition) bool {
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
if user.IsSystemAdmin() {
|
|
return true
|
|
}
|
|
|
|
if badgeType.CreatedBy == user.Id {
|
|
return true
|
|
}
|
|
|
|
if badge.CreatedBy == user.Id {
|
|
return true
|
|
}
|
|
|
|
blocked := badgeType.CanGrant.BlockList[user.Id]
|
|
if blocked {
|
|
return false
|
|
}
|
|
|
|
if areRolesAllowed(user.GetRoles(), badgeType.CanGrant.Roles) {
|
|
return true
|
|
}
|
|
|
|
allowed := badgeType.CanGrant.AllowList[user.Id]
|
|
if allowed {
|
|
return true
|
|
}
|
|
|
|
return badgeType.CanGrant.Everyone
|
|
}
|
|
|
|
func canCreateBadge(user *model.User, badgeAdminID string, badgeType *badgesmodel.BadgeTypeDefinition) bool {
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
if user.IsSystemAdmin() {
|
|
return true
|
|
}
|
|
|
|
if badgeType.CreatedBy == user.Id {
|
|
return true
|
|
}
|
|
|
|
blocked := badgeType.CanCreate.BlockList[user.Id]
|
|
if blocked {
|
|
return false
|
|
}
|
|
|
|
if areRolesAllowed(user.GetRoles(), badgeType.CanCreate.Roles) {
|
|
return true
|
|
}
|
|
|
|
allowed := badgeType.CanCreate.AllowList[user.Id]
|
|
if allowed {
|
|
return true
|
|
}
|
|
|
|
return badgeType.CanCreate.Everyone
|
|
}
|
|
|
|
func canEditType(user *model.User, badgeAdminID string, badgeType *badgesmodel.BadgeTypeDefinition) bool {
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
return user.IsSystemAdmin()
|
|
}
|
|
|
|
func canEditBadge(user *model.User, badgeAdminID string, badge *badgesmodel.Badge) bool {
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
return user.IsSystemAdmin() || user.Id == badge.CreatedBy
|
|
}
|
|
|
|
func canCreateType(user *model.User, badgeAdminID string, isPlugin bool) bool {
|
|
if isPlugin {
|
|
return true
|
|
}
|
|
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
return user.IsSystemAdmin()
|
|
}
|
|
|
|
func canCreateSubscription(user *model.User, badgeAdminID string, channelID string) bool {
|
|
if badgeAdminID != "" && user.Id == badgeAdminID {
|
|
return true
|
|
}
|
|
|
|
return user.IsSystemAdmin()
|
|
}
|
|
|
|
func dumpObject(o interface{}) {
|
|
b, err := json.MarshalIndent(o, "", " ")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
}
|
|
fmt.Println(string(b))
|
|
}
|
|
|
|
func (p *Plugin) notifyGrant(badgeID badgesmodel.BadgeID, granter string, granted *model.User, inChannel bool, channelID string, reason string) {
|
|
b, errBadge := p.store.GetBadgeDetails(badgeID)
|
|
granterUser, errUser := p.mm.User.Get(granter)
|
|
if errBadge != nil {
|
|
p.mm.Log.Debug("badge error", "err", errBadge)
|
|
}
|
|
if errUser != nil {
|
|
p.mm.Log.Debug("user error", "err", errUser)
|
|
}
|
|
|
|
subs, _ := p.store.GetTypeSubscriptions(b.Type)
|
|
|
|
if errBadge == nil && errUser == nil {
|
|
image := ""
|
|
switch b.ImageType {
|
|
case badgesmodel.ImageTypeEmoji:
|
|
image = fmt.Sprintf(":%s: ", b.Image)
|
|
case badgesmodel.ImageTypeAbsoluteURL:
|
|
image = fmt.Sprintf(" ", b.Image)
|
|
}
|
|
|
|
dmPost := &model.Post{}
|
|
dmText := fmt.Sprintf("@%s granted you the %s`%s` badge.", granterUser.Username, image, b.Name)
|
|
if reason != "" {
|
|
dmText += "\nWhy? " + reason
|
|
}
|
|
dmAttachment := model.SlackAttachment{
|
|
Title: fmt.Sprintf("%sbadge granted!", image),
|
|
Text: dmText,
|
|
}
|
|
model.ParseSlackAttachment(dmPost, []*model.SlackAttachment{&dmAttachment})
|
|
err := p.mm.Post.DM(p.BotUserID, granted.Id, dmPost)
|
|
if err != nil {
|
|
p.mm.Log.Debug("dm error", "err", err)
|
|
}
|
|
|
|
basePost := model.Post{
|
|
UserId: p.BotUserID,
|
|
ChannelId: channelID,
|
|
}
|
|
text := fmt.Sprintf("@%s granted @%s the %s`%s` badge.", granterUser.Username, granted.Username, image, b.Name)
|
|
if reason != "" {
|
|
text += "\nWhy? " + reason
|
|
}
|
|
attachment := model.SlackAttachment{
|
|
Title: fmt.Sprintf("%sbadge granted!", image),
|
|
Text: text,
|
|
}
|
|
model.ParseSlackAttachment(&basePost, []*model.SlackAttachment{&attachment})
|
|
for _, sub := range subs {
|
|
post := basePost.Clone()
|
|
post.ChannelId = sub
|
|
err := p.mm.Post.CreatePost(post)
|
|
if err != nil {
|
|
p.mm.Log.Debug("notify subscription error", "err", err)
|
|
}
|
|
}
|
|
if inChannel {
|
|
if !p.API.HasPermissionToChannel(granter, channelID, model.PERMISSION_CREATE_POST) {
|
|
p.mm.Post.SendEphemeralPost(granter, &model.Post{Message: "You don't have permissions to notify the grant on this channel.", ChannelId: channelID})
|
|
} else {
|
|
post := basePost.Clone()
|
|
post.ChannelId = channelID
|
|
err := p.mm.Post.CreatePost(post)
|
|
if err != nil {
|
|
p.mm.Log.Debug("notify here error", "err", err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func getBooleanString(in bool) string {
|
|
if in {
|
|
return TrueString
|
|
}
|
|
return FalseString
|
|
}
|