Skip to content

Commit 2422161

Browse files
committed
Add new Moderator Permissions
Fixes #183 Fixes #182
1 parent 44d9df7 commit 2422161

File tree

6 files changed

+96
-21
lines changed

6 files changed

+96
-21
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ StyleCop.Cache
1818
/.vs
1919
/packages
2020
/RedditSharpTests/secrets.json
21+
/RedditSharpTests/private.config

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Development
22

3-
Use a private config or Secret Manager to pull in config for tests. The required format is as follows
3+
Use a private.config file to pull in config for tests. The required format is as follows
44

55
```json
66
{

RedditSharp/Moderator Actions/ModeratorPermission.cs

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public enum ModeratorPermission
1414
/// <summary>
1515
/// No permissions.
1616
/// </summary>
17-
None = 0x00,
17+
None = 0x00,
1818
/// <summary>
1919
/// access permissions.
2020
/// </summary>
@@ -26,23 +26,35 @@ public enum ModeratorPermission
2626
/// <summary>
2727
/// Flair management.
2828
/// </summary>
29-
Flair = 0x04,
29+
Flair = 0x04,
3030
/// <summary>
3131
/// Modmail.
3232
/// </summary>
33-
Mail = 0x08,
33+
Mail = 0x08,
3434
/// <summary>
3535
/// Moderate posts.
3636
/// </summary>
37-
Posts = 0x10,
37+
Posts = 0x10,
3838
/// <summary>
3939
/// Edit / view protected wiki paes.
4040
/// </summary>
41-
Wiki = 0x20,
41+
Wiki = 0x20,
42+
/// <summary>
43+
/// Configure chat groups
44+
/// </summary>
45+
ChatConfig = 0x40,
46+
/// <summary>
47+
/// Moderate users in subreddit chatrooms
48+
/// </summary>
49+
ChatOperator = 0x80,
50+
/// <summary>
51+
/// Has the "all" permission / super user status in sub
52+
/// </summary>
53+
SuperUser = 0x1000000 | All, //give some padding for other permissions
4254
/// <summary>
4355
/// All permissions.
4456
/// </summary>
45-
All = Access | Config | Flair | Mail | Posts | Wiki
57+
All = Access | Config | Flair | Mail | Posts | Wiki | ChatConfig | ChatOperator
4658
}
4759

4860
internal class ModeratorPermissionConverter : JsonConverter
@@ -54,12 +66,58 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
5466

5567
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
5668
{
57-
var data = string.Join(",", JArray.Load(reader).Select(t => t.ToString()));
58-
ModeratorPermission result;
59-
var valid = Enum.TryParse(data, true, out result);
60-
61-
if (!valid)
62-
result = ModeratorPermission.None;
69+
var perms = JArray.Load(reader).Select(t => t.ToString());
70+
ModeratorPermission result = ModeratorPermission.None;
71+
foreach (var perm in perms)
72+
{
73+
switch (perm.ToLower())
74+
{
75+
case "all":
76+
{
77+
return ModeratorPermission.SuperUser;
78+
}
79+
case "access":
80+
{
81+
result = result | ModeratorPermission.Access;
82+
break;
83+
}
84+
case "config":
85+
{
86+
result = result | ModeratorPermission.Config;
87+
break;
88+
}
89+
case "flair":
90+
{
91+
result = result | ModeratorPermission.Flair;
92+
break;
93+
}
94+
case "mail":
95+
{
96+
result = result | ModeratorPermission.Mail;
97+
break;
98+
}
99+
case "posts":
100+
{
101+
result = result | ModeratorPermission.Posts;
102+
break;
103+
}
104+
case "wiki":
105+
{
106+
result = result | ModeratorPermission.Wiki;
107+
break;
108+
}
109+
case "chat_config":
110+
{
111+
result = result | ModeratorPermission.ChatConfig;
112+
break;
113+
}
114+
case "chat_operator":
115+
{
116+
result = result | ModeratorPermission.ChatOperator;
117+
break;
118+
}
119+
}
120+
}
63121

64122
return result;
65123
}
@@ -68,7 +126,7 @@ public override bool CanConvert(Type objectType)
68126
{
69127
// NOTE: Not sure if this is what is supposed to be returned
70128
// This method wasn't called in my (Sharparam) tests so unsure what it does
71-
return objectType == typeof (ModeratorPermission);
129+
return objectType == typeof(ModeratorPermission);
72130
}
73131
}
74132
}

RedditSharpTests/AuthenticatedTestsFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class AuthenticatedTestsFixture
1212
public AuthenticatedTestsFixture()
1313
{
1414
ConfigurationBuilder builder = new ConfigurationBuilder();
15-
builder.AddUserSecrets<AuthenticatedTestsFixture>()
15+
builder.AddJsonFile("private.config")
1616
.AddEnvironmentVariables();
1717
Config = builder.Build();
1818
WebAgent = new RedditSharp.BotWebAgent(Config["TestUserName"], Config["TestUserPassword"], Config["RedditClientID"], Config["RedditClientSecret"], Config["RedditRedirectURI"]);

RedditSharpTests/RedditSharpTests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@
3636
</ItemGroup>
3737

3838
<ItemGroup>
39+
<None Update="private.config">
40+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
41+
</None>
3942
<None Update="secrets.json">
4043
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4144
</None>

RedditSharpTests/Things/SubredditTests.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,33 @@ public async Task GetContributors()
2525
Assert.NotEmpty(contribs);
2626
Assert.Contains<string>(authFixture.TestUserName.ToLower(), contribs.Select(c => c.Name.ToLower()));
2727
}
28-
28+
29+
[Fact]
30+
public async Task GetModerators()
31+
{
32+
RedditSharp.WebAgent agent = new RedditSharp.WebAgent(authFixture.AccessToken);
33+
RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent);
34+
var sub = await reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]);
35+
var mods = await sub.GetModeratorsAsync();
36+
37+
Assert.NotEmpty(mods);
38+
Assert.NotEmpty(mods.Where(m => m.Permissions != RedditSharp.ModeratorPermission.None));
39+
}
40+
2941
[Fact]
3042
public async Task SubmitPost()
3143
{
3244
RedditSharp.WebAgent agent = new RedditSharp.WebAgent(authFixture.AccessToken);
33-
RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent,true);
45+
RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent, true);
3446

3547
var sub = await reddit.GetSubredditAsync(authFixture.Config["TestSubreddit"]);
36-
var post = await sub.SubmitPostAsync("ThisIsASubmittedPost", "https://github.com/CrustyJew/RedditSharp/issues/76", resubmit:true);
48+
var post = await sub.SubmitPostAsync("ThisIsASubmittedPost", "https://github.com/CrustyJew/RedditSharp/issues/76", resubmit: true);
3749
Assert.NotNull(post);
3850
await post.DelAsync();
3951
}
4052

4153
[Fact]
42-
public async Task GetRALLComments()
54+
public async Task GetRALLComments()
4355
{
4456
RedditSharp.WebAgent agent = new RedditSharp.WebAgent(authFixture.AccessToken);
4557
RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent, true);
@@ -49,14 +61,15 @@ public async Task GetRALLComments()
4961
}
5062

5163
[Fact]
52-
public async Task PageComments() {
64+
public async Task PageComments()
65+
{
5366
RedditSharp.WebAgent agent = new RedditSharp.WebAgent(authFixture.AccessToken);
5467
RedditSharp.Reddit reddit = new RedditSharp.Reddit(agent, true);
5568

5669
var comments = await reddit.RSlashAll.GetComments().Take(55).ToList();
5770

5871
Assert.Equal(55, comments.Count);
59-
72+
6073
}
6174

6275
[Fact]

0 commit comments

Comments
 (0)