-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathHomeServerPerms.cs
158 lines (141 loc) · 6.54 KB
/
HomeServerPerms.cs
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
namespace Cliptok.CommandChecks
{
public class ServerPerms
{
public enum ServerPermLevel
{
Muted = -1,
Nothing = 0,
Tier1,
Tier2,
Tier3,
Tier4,
Tier5,
Tier6,
Tier7,
Tier8,
TierS,
TierX,
TechnicalQueriesSlayer,
TrialModerator,
Moderator,
Admin,
Owner = int.MaxValue
}
public static ServerPermLevel GetPermLevel(DiscordMember target)
{
if (target.Guild.Id != Program.cfgjson.ServerID)
return ServerPermLevel.Nothing;
// Torch approved of this.
if (target.IsOwner)
return ServerPermLevel.Owner;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.AdminRole)))
return ServerPermLevel.Admin;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.ModRole)))
return ServerPermLevel.Moderator;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.MutedRole)))
return ServerPermLevel.Muted;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TrialModRole)))
return ServerPermLevel.TrialModerator;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TqsRoleId)))
return ServerPermLevel.TechnicalQueriesSlayer;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[9])))
return ServerPermLevel.TierX;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[8])))
return ServerPermLevel.TierS;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[7])))
return ServerPermLevel.Tier8;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[6])))
return ServerPermLevel.Tier7;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[5])))
return ServerPermLevel.Tier6;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[4])))
return ServerPermLevel.Tier5;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[3])))
return ServerPermLevel.Tier4;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[2])))
return ServerPermLevel.Tier3;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[1])))
return ServerPermLevel.Tier2;
else if (target.Roles.Contains(target.Guild.GetRole(Program.cfgjson.TierRoles[0])))
return ServerPermLevel.Tier1;
else
return ServerPermLevel.Nothing;
}
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class RequireHomeserverPermAttribute : CheckBaseAttribute
{
public ServerPermLevel TargetLvl { get; set; }
public bool WorkOutside { get; set; }
public bool OwnerOverride { get; set; }
public RequireHomeserverPermAttribute(ServerPermLevel targetlvl, bool workOutside = false, bool ownerOverride = false)
{
WorkOutside = workOutside;
OwnerOverride = ownerOverride;
TargetLvl = targetlvl;
}
public override async Task<bool> ExecuteCheckAsync(CommandContext ctx, bool help)
{
// If the command is supposed to stay within the server and its being used outside, fail silently
if (!WorkOutside && (ctx.Channel.IsPrivate || ctx.Guild.Id != Program.cfgjson.ServerID))
return false;
// bot owners can bypass perm checks ONLY if the command allows it.
if (OwnerOverride && Program.cfgjson.BotOwners.Contains(ctx.User.Id))
return true;
DiscordMember member;
if (ctx.Channel.IsPrivate || ctx.Guild.Id != Program.cfgjson.ServerID)
{
var guild = await ctx.Client.GetGuildAsync(Program.cfgjson.ServerID);
try
{
member = await guild.GetMemberAsync(ctx.User.Id);
}
catch (DSharpPlus.Exceptions.NotFoundException)
{
return false;
}
}
else
{
member = ctx.Member;
}
var level = GetPermLevel(member);
if (level >= TargetLvl)
return true;
else if (!help && ctx.Command.QualifiedName != "edit")
{
var levelText = level.ToString();
if (level == ServerPermLevel.Nothing && Program.rand.Next(1, 100) == 69)
levelText = $"naught but a thing, my dear human. Congratulations, you win {Program.rand.Next(1, 10)} bonus points.";
await ctx.RespondAsync(
$"{Program.cfgjson.Emoji.NoPermissions} Invalid permissions to use command **{ctx.Command.Name}**!\n" +
$"Required: `{TargetLvl}`\nYou have: `{levelText}`");
}
return false;
}
}
public class HomeServerAttribute : CheckBaseAttribute
{
public override async Task<bool> ExecuteCheckAsync(CommandContext ctx, bool help)
{
return !ctx.Channel.IsPrivate && ctx.Guild.Id == Program.cfgjson.ServerID;
}
}
public class SlashRequireHomeserverPermAttribute : SlashCheckBaseAttribute
{
public ServerPermLevel TargetLvl;
public SlashRequireHomeserverPermAttribute(ServerPermLevel targetlvl)
=> TargetLvl = targetlvl;
public override async Task<bool> ExecuteChecksAsync(InteractionContext ctx)
{
if (ctx.Guild.Id != Program.cfgjson.ServerID)
return false;
var level = GetPermLevel(ctx.Member);
if (level >= TargetLvl)
return true;
else
return false;
}
}
}
}