1package storage
2
3import (
4	"github.com/automuteus/utils/pkg/game"
5	"os"
6	"sync"
7
8	"github.com/bwmarrin/discordgo"
9	"github.com/denverquane/amongusdiscord/locale"
10)
11
12const DefaultLeaderboardSize = 3
13const DefaultLeaderboardMin = 3
14
15type GuildSettings struct {
16	AdminUserIDs             []string        `json:"adminIDs"`
17	PermissionRoleIDs        []string        `json:"permissionRoleIDs"`
18	CommandPrefix            string          `json:"commandPrefix"`
19	Language                 string          `json:"language"`
20	VoiceRules               game.VoiceRules `json:"voiceRules"`
21	MapVersion               string          `json:"mapVersion"`
22	Delays                   game.GameDelays `json:"delays"`
23	DeleteGameSummaryMinutes int             `json:"deleteGameSummary"`
24	lock                     sync.RWMutex
25	UnmuteDeadDuringTasks    bool   `json:"unmuteDeadDuringTasks"`
26	AutoRefresh              bool   `json:"autoRefresh"`
27	MatchSummaryChannelID    string `json:"matchSummaryChannelID"`
28	LeaderboardMention       bool   `json:"leaderboardMention"`
29	LeaderboardSize          int    `json:"leaderboardSize"`
30	LeaderboardMin           int    `json:"leaderboardMin"`
31	MuteSpectator            bool   `json:"muteSpectator"`
32	DisplayRoomCode          string `json:"displayRoomCode"`
33}
34
35func MakeGuildSettings() *GuildSettings {
36	prefix := os.Getenv("AUTOMUTEUS_GLOBAL_PREFIX")
37	if prefix == "" {
38		prefix = ".au"
39	}
40	return &GuildSettings{
41		CommandPrefix:            prefix,
42		Language:                 locale.DefaultLang,
43		AdminUserIDs:             []string{},
44		PermissionRoleIDs:        []string{},
45		Delays:                   game.MakeDefaultDelays(),
46		VoiceRules:               game.MakeMuteAndDeafenRules(),
47		UnmuteDeadDuringTasks:    false,
48		DeleteGameSummaryMinutes: 0, //-1 for never delete the match summary
49		AutoRefresh:              false,
50		MapVersion:               "simple",
51		MatchSummaryChannelID:    "",
52		LeaderboardMention:       true,
53		LeaderboardSize:          3,
54		LeaderboardMin:           3,
55		MuteSpectator:            false,
56		DisplayRoomCode:          "always",
57		lock:                     sync.RWMutex{},
58	}
59}
60
61func (gs *GuildSettings) LocalizeMessage(args ...interface{}) string {
62	args = append(args, gs.GetLanguage())
63	return locale.LocalizeMessage(args...)
64}
65
66func (gs *GuildSettings) HasAdminPerms(user *discordgo.User) bool {
67	if user == nil {
68		return false
69	}
70
71	for _, v := range gs.AdminUserIDs {
72		if v == user.ID {
73			return true
74		}
75	}
76	return false
77}
78
79func (gs *GuildSettings) HasRolePerms(mem *discordgo.Member) bool {
80	for _, role := range mem.Roles {
81		for _, testRole := range gs.PermissionRoleIDs {
82			if testRole == role {
83				return true
84			}
85		}
86	}
87	return false
88}
89
90func (gs *GuildSettings) GetCommandPrefix() string {
91	return gs.CommandPrefix
92}
93
94func (gs *GuildSettings) SetCommandPrefix(p string) {
95	gs.CommandPrefix = p
96}
97
98func (gs *GuildSettings) GetAdminUserIDs() []string {
99	return gs.AdminUserIDs
100}
101
102func (gs *GuildSettings) SetAdminUserIDs(ids []string) {
103	gs.AdminUserIDs = ids
104}
105
106func (gs *GuildSettings) GetPermissionRoleIDs() []string {
107	return gs.PermissionRoleIDs
108}
109
110func (gs *GuildSettings) SetPermissionRoleIDs(ids []string) {
111	gs.PermissionRoleIDs = ids
112}
113
114func (gs *GuildSettings) GetUnmuteDeadDuringTasks() bool {
115	return gs.UnmuteDeadDuringTasks
116}
117
118func (gs *GuildSettings) GetDeleteGameSummaryMinutes() int {
119	return gs.DeleteGameSummaryMinutes
120}
121
122func (gs *GuildSettings) SetDeleteGameSummaryMinutes(num int) {
123	gs.DeleteGameSummaryMinutes = num
124}
125
126func (gs *GuildSettings) SetMatchSummaryChannelID(id string) {
127	gs.MatchSummaryChannelID = id
128}
129
130func (gs *GuildSettings) GetMatchSummaryChannelID() string {
131	return gs.MatchSummaryChannelID
132}
133
134func (gs *GuildSettings) GetAutoRefresh() bool {
135	return gs.AutoRefresh
136}
137
138func (gs *GuildSettings) SetAutoRefresh(n bool) {
139	gs.AutoRefresh = n
140}
141
142func (gs *GuildSettings) GetLeaderboardMention() bool {
143	return gs.LeaderboardMention
144}
145
146func (gs *GuildSettings) SetLeaderboardMention(v bool) {
147	gs.LeaderboardMention = v
148}
149
150func (gs *GuildSettings) GetLeaderboardSize() int {
151	if gs.LeaderboardSize < 1 {
152		return DefaultLeaderboardSize
153	}
154	return gs.LeaderboardSize
155}
156
157func (gs *GuildSettings) SetLeaderboardSize(v int) {
158	gs.LeaderboardSize = v
159}
160
161func (gs *GuildSettings) GetLeaderboardMin() int {
162	if gs.LeaderboardMin < 1 {
163		return DefaultLeaderboardMin
164	}
165	return gs.LeaderboardMin
166}
167
168func (gs *GuildSettings) SetLeaderboardMin(v int) {
169	gs.LeaderboardMin = v
170}
171
172func (gs *GuildSettings) GetMuteSpectator() bool {
173	return gs.MuteSpectator
174}
175
176func (gs *GuildSettings) SetMuteSpectator(behavior bool) {
177	gs.MuteSpectator = behavior
178}
179
180func (gs *GuildSettings) GetMapVersion() string {
181	if gs.MapVersion == "" {
182		return "simple"
183	}
184	return gs.MapVersion
185}
186
187func (gs *GuildSettings) SetMapVersion(n string) {
188	gs.MapVersion = n
189}
190
191func (gs *GuildSettings) SetUnmuteDeadDuringTasks(v bool) {
192	gs.UnmuteDeadDuringTasks = v
193}
194
195func (gs *GuildSettings) GetLanguage() string {
196	return gs.Language
197}
198
199func (gs *GuildSettings) SetLanguage(l string) {
200	gs.Language = l
201}
202
203func (gs *GuildSettings) GetDelay(oldPhase, newPhase game.Phase) int {
204	return gs.Delays.GetDelay(oldPhase, newPhase)
205}
206
207func (gs *GuildSettings) SetDelay(oldPhase, newPhase game.Phase, v int) {
208	gs.Delays.Delays[oldPhase.ToString()][newPhase.ToString()] = v
209}
210
211func (gs *GuildSettings) GetVoiceRule(isMute bool, phase game.Phase, alive string) bool {
212	if isMute {
213		return gs.VoiceRules.MuteRules[phase.ToString()][alive]
214	}
215	return gs.VoiceRules.DeafRules[phase.ToString()][alive]
216}
217
218func (gs *GuildSettings) SetVoiceRule(isMute bool, phase game.Phase, alive string, val bool) {
219	if isMute {
220		gs.VoiceRules.MuteRules[phase.ToString()][alive] = val
221	}
222	gs.VoiceRules.DeafRules[phase.ToString()][alive] = val
223}
224
225func (gs *GuildSettings) GetVoiceState(alive bool, tracked bool, phase game.Phase) (bool, bool) {
226	return gs.VoiceRules.GetVoiceState(alive, tracked, phase)
227}
228
229func (gs *GuildSettings) GetDisplayRoomCode() string {
230	if gs.DisplayRoomCode == "" {
231		return "always"
232	}
233	return gs.DisplayRoomCode
234}
235
236func (gs *GuildSettings) SetDisplayRoomCode(r string) {
237	gs.DisplayRoomCode = r
238}
239