Skip to content

Commit 4c61b92

Browse files
Add whitelist capabilities
1 parent 227c00f commit 4c61b92

File tree

7 files changed

+68
-14
lines changed

7 files changed

+68
-14
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ DiscourseGroupSync has several options that can be configured in the `config.yml
2121
# The URL of your Discourse installation (without the trailing slash)
2222
discourse-url: http://forum.example.com
2323

24+
# Message to display if kicking due to whitelist
25+
kick-message: You are not on the whitelist
26+
2427
# A mapping between Discourse groups (by integer ID) and Minecraft groups (by name)
2528
groups:
2629

@@ -40,6 +43,8 @@ groups:
4043
4144
`discourse` keys are the IDs of your chosen Discourse groups. A negative number means the absence of the group, so `discourse: -20` would target users who were not a member of group `20`. `0` is a special group meaning users who are not a member of any Discourse groups.
4245

46+
Set a `whitelist: true` field on any of the groups to enable them as a whitelist filter.
47+
4348
## Features
4449

4550
* Synchronizes Minecraft groups with Discourse groups on player join

pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131
<id>vault-repo</id>
3232
<url>http://nexus.theyeticave.net/content/repositories/pub_releases</url>
3333
</repository>
34-
<repository>
35-
<id>jitpack.io</id>
36-
<url>https://jitpack.io</url>
37-
</repository>
3834
</repositories>
3935

4036
<dependencies>

src/main/kotlin/gg/obsidian/discoursegroupsync/Configuration.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@ import java.util.*
55
class Configuration(val plugin: DiscourseGroupSync) {
66

77
var DISCOURSE_URL = ""
8+
var KICK_MESSAGE = ""
89
var GROUPS: HashSet<Group> = HashSet<Group>()
910

1011
fun load() {
1112
plugin.reloadConfig()
1213

1314
DISCOURSE_URL = plugin.getConfig().getString("discourse-url")
15+
KICK_MESSAGE = plugin.getConfig().getString("kick-message", "You are not on the whitelist")
1416

1517
for (rawDefinition in plugin.getConfig().getMapList("groups")) {
1618
val definition = rawDefinition as Map<String, Any>
1719
var discourseGroup: Int? = null
1820
var minecraftGroup: String? = null
1921
var remove = false
22+
var whitelist = false
2023

2124
if (definition.contains("discourse")) {
2225
discourseGroup = definition["discourse"] as Int
@@ -30,9 +33,18 @@ class Configuration(val plugin: DiscourseGroupSync) {
3033
remove = definition["remove"] as Boolean
3134
}
3235

36+
if (definition.contains("whitelist")) {
37+
whitelist = definition["whitelist"] as Boolean
38+
}
39+
3340
if (discourseGroup == null || minecraftGroup == null) continue
3441

35-
val group = Group(discourseGroup, minecraftGroup, remove)
42+
val group = Group(
43+
discourseGroup = discourseGroup,
44+
minecraftGroup = minecraftGroup,
45+
remove = remove,
46+
whitelist = whitelist
47+
)
3648
GROUPS.add(group)
3749
}
3850
}

src/main/kotlin/gg/obsidian/discoursegroupsync/DiscourseGroupSync.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ class DiscourseGroupSync : JavaPlugin(), Listener {
3434

3535
@EventHandler
3636
fun onJoin(e: PlayerJoinEvent) {
37-
userManager.syncGroups(e.player)
37+
val canJoin = userManager.onJoin(e.player)
38+
if (!canJoin) {
39+
e.player.kickPlayer(config.KICK_MESSAGE)
40+
}
3841
}
3942

4043
fun setupPermissions(): Boolean {
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
package gg.obsidian.discoursegroupsync
22

3-
data class Group(val discourseGroup: Int, val minecraftGroup: String, val remove: Boolean = false)
3+
data class Group(
4+
val discourseGroup: Int,
5+
val minecraftGroup: String,
6+
val remove: Boolean = false,
7+
val whitelist: Boolean = false
8+
)

src/main/kotlin/gg/obsidian/discoursegroupsync/UserManger.kt

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,17 @@ class UserManager(val plugin: DiscourseGroupSync) {
1212

1313
val httpClient = OkHttpClient()
1414

15-
fun getDiscourseUser(username: String): User {
15+
fun onJoin(player: Player): Boolean {
16+
val user = getDiscourseUser(player)
17+
18+
syncGroups(player, user)
19+
return checkWhitelist(user)
20+
}
21+
22+
fun getDiscourseUser(player: Player): User? {
23+
val username = UUIDHelper.uuidToUsername(player.uniqueId)
24+
if (username == "") return null
25+
1626
val url = plugin.config.DISCOURSE_URL + "/users/" + username + ".json"
1727
val request = Request.Builder().url(url).get().build();
1828
val response = httpClient.newCall(request).execute()
@@ -41,12 +51,32 @@ class UserManager(val plugin: DiscourseGroupSync) {
4151
return User(username = username, discourseGroups = discourseGroups)
4252
}
4353

44-
fun syncGroups(player: Player) {
45-
val username = UUIDHelper.uuidToUsername(player.uniqueId)
46-
if (username == "") return
54+
fun checkWhitelist(user: User?): Boolean {
55+
if (user == null) {
56+
for (group in plugin.config.GROUPS) {
57+
if (group.whitelist == true)
58+
return false
59+
}
60+
return true
61+
}
4762

48-
val user = getDiscourseUser(username)
63+
var canJoin = true
64+
65+
for (group in plugin.config.GROUPS) {
66+
if (group.whitelist != true) continue
67+
68+
if (user.discourseGroups.contains(group.discourseGroup)) {
69+
return true
70+
} else {
71+
canJoin = false
72+
}
73+
}
74+
75+
return canJoin
76+
}
4977

78+
fun syncGroups(player: Player, user: User?) {
79+
if (user == null) return
5080
val groupsToAdd = HashSet<String>()
5181
val groupsToRemove = HashSet<String>()
5282

@@ -82,12 +112,12 @@ class UserManager(val plugin: DiscourseGroupSync) {
82112
}
83113

84114
for (group in groupsToAdd) {
85-
plugin.logger.info("Adding $username to group $group")
115+
plugin.logger.info("Adding ${user.username} to group $group")
86116
plugin.permissions?.playerAddGroup(player, group)
87117
}
88118

89119
for (group in groupsToRemove) {
90-
plugin.logger.info("Removing $username from group $group")
120+
plugin.logger.info("Removing ${user.username} from group $group")
91121
plugin.permissions?.playerRemoveGroup(player, group)
92122
}
93123
}

src/main/resources/config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# The URL of your Discourse installation (without the trailing slash)
22
discourse-url: http://forum.example.com
33

4+
# Message to display if kicking due to whitelist
5+
kick-message: You are not on the whitelist
6+
47
# A mapping between Discourse groups (by integer ID) and Minecraft groups (by name)
58
groups:
69

0 commit comments

Comments
 (0)