This repository has been archived by the owner on Oct 22, 2023. It is now read-only.
forked from ZeppelinMC/Zeppelin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpermissions.go
81 lines (73 loc) · 1.98 KB
/
permissions.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main
import (
"encoding/json"
"fmt"
"os"
)
/*
Permissions:
server.command.stop - /stop command
server.command.reload - /reload command
server.command.op - /op command
server.command.gamemode - /gamemode command
server.chat - Use chat
server.chat.colors - Use chat colors
*/
var groupCache = make(map[string]GroupPermissions)
var playerCache = make(map[string]PlayerPermissions)
type PlayerPermissions struct {
Group string `json:"group"`
Permissions map[string]bool `json:"permissions"`
}
type GroupPermissions struct {
DisplayName string `json:"display_name"`
Prefix string `json:"prefix"`
Suffix string `json:"suffix"`
Permissions map[string]bool `json:"permissions"`
}
func getPlayer(playerId string) PlayerPermissions {
if playerCache[playerId].Permissions != nil {
return playerCache[playerId]
}
d, err := os.ReadFile(fmt.Sprintf("permissions/players/%s.json", playerId))
if err != nil {
os.WriteFile(fmt.Sprintf("permissions/players/%s.json", playerId), []byte(`{"group":"default"}`), 0755)
return PlayerPermissions{}
}
var data PlayerPermissions
json.Unmarshal(d, &data)
return data
}
func getGroup(group string) GroupPermissions {
if groupCache[group].Permissions != nil {
return groupCache[group]
}
d, err := os.ReadFile(fmt.Sprintf("permissions/groups/%s.json", group))
if err != nil {
return GroupPermissions{}
}
var data GroupPermissions
json.Unmarshal(d, &data)
return data
}
func (server Server) HasPermissions(playerId string, perms []string) bool {
if playerId == "console" {
return true
}
if len(perms) == 0 {
return true
}
for i := 0; i < len(server.Players.OPs); i++ {
if server.Players.OPs[i].UUID == playerId {
return true
}
}
permissionsPlayer := getPlayer(playerId)
permissionsGroup := getGroup(permissionsPlayer.Group)
for _, perm := range perms {
if !permissionsPlayer.Permissions[perm] && !permissionsGroup.Permissions[perm] {
return false
}
}
return true
}