Skip to content

Commit ae37832

Browse files
committed
Improve user permission data caching; update upstream
1 parent 417671d commit ae37832

File tree

9 files changed

+152
-32
lines changed

9 files changed

+152
-32
lines changed

LuckPerms

patchs.patch

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,34 @@ index 0be4e97e1..bf66ed15d 100644
248248
prefixed(text()
249249
.color(AQUA)
250250
.append(text("- ", WHITE))
251+
diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java
252+
index f1ae13665..bbbd40edc 100644
253+
--- a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java
254+
+++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/UserHousekeeper.java
255+
@@ -75,7 +75,7 @@ public class UserHousekeeper implements Runnable {
256+
257+
public void cleanup(UUID uuid) {
258+
// unload users which aren't online and who haven't been online (or tried to login) recently
259+
- if (this.recentlyUsed.contains(uuid) || this.recentlyUsedApi.contains(uuid) || this.plugin.getBootstrap().isPlayerOnline(uuid)) {
260+
+ if (this.recentlyUsed.contains(uuid) || this.recentlyUsedApi.contains(uuid) || uuid.getMostSignificantBits() == 0L) {
261+
return;
262+
}
263+
264+
@@ -108,4 +108,14 @@ public class UserHousekeeper implements Runnable {
265+
this.unit = unit;
266+
}
267+
}
268+
+
269+
+ public static class Access {
270+
+ public static ExpiringSet<UUID> recentlyUsed(UserHousekeeper i) {
271+
+ return i.recentlyUsed;
272+
+ }
273+
+
274+
+ public static ExpiringSet<UUID> recentlyUsedApi(UserHousekeeper i) {
275+
+ return i.recentlyUsedApi;
276+
+ }
277+
+ }
278+
}
251279
diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java b/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java
252280
index 2680ab00e..c904d6fbd 100644
253281
--- a/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java
@@ -284,6 +312,38 @@ index a4287a7d0..df176f333 100644
284312
+
285313
+ default boolean isHoverEventSupported() { return false; }
286314
}
315+
diff --git a/common/src/main/java/me/lucko/luckperms/common/util/ExpiringSet.java b/common/src/main/java/me/lucko/luckperms/common/util/ExpiringSet.java
316+
index 8ed2535d9..aef840178 100644
317+
--- a/common/src/main/java/me/lucko/luckperms/common/util/ExpiringSet.java
318+
+++ b/common/src/main/java/me/lucko/luckperms/common/util/ExpiringSet.java
319+
@@ -27,6 +27,9 @@ package me.lucko.luckperms.common.util;
320+
321+
import com.github.benmanes.caffeine.cache.Cache;
322+
323+
+import java.util.ArrayList;
324+
+import java.util.Collection;
325+
+import java.util.Map;
326+
import java.util.concurrent.TimeUnit;
327+
328+
/**
329+
@@ -57,4 +60,17 @@ public class ExpiringSet<E> {
330+
public void remove(E item) {
331+
this.cache.invalidate(item);
332+
}
333+
+
334+
+ public Collection<E> snapshot() {
335+
+ ArrayList<E> rsp = new ArrayList<>();
336+
+ long currentTime = System.currentTimeMillis();
337+
+ for (Map.Entry<E, Long> e : cache.asMap().entrySet()) {
338+
+ E k = e.getKey();
339+
+ Long v = e.getValue();
340+
+ if (v != null && v > currentTime) {
341+
+ rsp.add(k);
342+
+ }
343+
+ }
344+
+ return rsp;
345+
+ }
346+
}
287347
diff --git a/common/src/main/java/me/lucko/luckperms/common/verbose/VerboseListener.java b/common/src/main/java/me/lucko/luckperms/common/verbose/VerboseListener.java
288348
index 22c082368..063585fce 100644
289349
--- a/common/src/main/java/me/lucko/luckperms/common/verbose/VerboseListener.java
@@ -298,7 +358,7 @@ index 22c082368..063585fce 100644
298358
return;
299359
}
300360
diff --git a/settings.gradle b/settings.gradle
301-
index db3bdea62..b88ed5914 100644
361+
index 17a0c9c99..b88ed5914 100644
302362
--- a/settings.gradle
303363
+++ b/settings.gradle
304364
@@ -1,7 +1,6 @@
@@ -309,7 +369,7 @@ index db3bdea62..b88ed5914 100644
309369
maven {
310370
url 'https://maven.fabricmc.net/'
311371
}
312-
@@ -14,15 +13,4 @@ include (
372+
@@ -14,18 +13,4 @@ include (
313373
'api',
314374
'common',
315375
'common:loader-utils',
@@ -322,6 +382,9 @@ index db3bdea62..b88ed5914 100644
322382
- 'fabric',
323383
- 'nukkit',
324384
- 'nukkit:loader',
325-
- 'sponge', 'sponge:sponge-service', 'sponge:sponge-service-api8',
385+
- 'sponge',
386+
- 'sponge:loader',
387+
- 'sponge:sponge-service',
388+
- 'sponge:sponge-service-api8',
326389
- 'velocity'
327390
)

src/main/kotlin/io/github/karlatemp/luckperms/mirai/LPMiraiBootstrap.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -169,22 +169,21 @@ object LPMiraiBootstrap : KotlinPlugin(
169169
}
170170

171171
override fun getPlayerCount(): Int {
172-
return CACHED_USERS.size
172+
return 0
173173
}
174174

175175
override fun getPlayerList(): MutableCollection<String> {
176-
return CACHED_USERS.keys().asSequence()
177-
.map { it.toString() }
178-
.toHashSet()
176+
return mutableListOf()
179177
}
180178

181179
override fun getOnlinePlayers(): MutableCollection<UUID> {
182-
return CACHED_USERS.keys().asSequence()
183-
.map { UUID(MAGIC_UUID_HIGH_BITS, it) }
184-
.toHashSet()
180+
return mutableListOf()
185181
}
186182

187183
override fun isPlayerOnline(uniqueId: UUID): Boolean {
184+
if (uniqueId.mostSignificantBits == 0L) { // System
185+
return true
186+
}
188187
return uniqueId.mostSignificantBits == MAGIC_UUID_HIGH_BITS
189188
}
190189

src/main/kotlin/io/github/karlatemp/luckperms/mirai/LPMiraiPlugin.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import io.github.karlatemp.luckperms.mirai.internal.LPPermissionService
2525
import io.github.karlatemp.luckperms.mirai.internal.LPPermissionService.uuid
2626
import io.github.karlatemp.luckperms.mirai.internal.Magic_NO_PERMISSION_CHECK
2727
import io.github.karlatemp.luckperms.mirai.internal.OpenApiImpl
28+
import io.github.karlatemp.luckperms.mirai.logging.DebugKit
2829
import me.lucko.luckperms.common.api.LuckPermsApiProvider
2930
import me.lucko.luckperms.common.calculator.CalculatorFactory
3031
import me.lucko.luckperms.common.command.CommandManager
@@ -49,6 +50,8 @@ import me.lucko.luckperms.common.tasks.CacheHousekeepingTask
4950
import me.lucko.luckperms.common.tasks.ExpireTemporaryTask
5051
import me.lucko.luckperms.common.util.MoreFiles
5152
import net.luckperms.api.LuckPerms
53+
import net.luckperms.api.event.user.UserLoadEvent
54+
import net.luckperms.api.event.user.UserUnloadEvent
5255
import net.luckperms.api.query.QueryOptions
5356
import net.mamoe.mirai.console.command.*
5457
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
@@ -359,5 +362,11 @@ object LPMiraiPlugin : AbstractLuckPermsPlugin() {
359362
override fun performFinalSetup() {
360363
LPMiraiBootstrap.logger.info { "Registering internal users...." }
361364
connectionListener0.loadInternalUsers()
365+
apiProvider.eventBus.subscribe(UserLoadEvent::class.java) { event ->
366+
DebugKit.log { "[S] User Loaded: ${event.user.friendlyName}(${event.user.uniqueId})" }
367+
}
368+
apiProvider.eventBus.subscribe(UserUnloadEvent::class.java) { event ->
369+
DebugKit.log { "[S] User Unloaded: ${event.user.friendlyName}(${event.user.uniqueId})" }
370+
}
362371
}
363372
}

src/main/kotlin/io/github/karlatemp/luckperms/mirai/LPconstants.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
package io.github.karlatemp.luckperms.mirai
1313

1414
import me.lucko.luckperms.common.sender.Sender
15+
import me.lucko.luckperms.common.util.ExpiringSet
1516
import java.util.*
16-
import java.util.concurrent.ConcurrentHashMap
17+
import java.util.concurrent.TimeUnit
1718

1819
const val MAGIC_UUID_HIGH_BITS: Long =
1920
0x14768AEEFFA88746L
2021

21-
val CACHED_USERS = ConcurrentHashMap<Long, Unit>()
2222
val UUID_CONSOLE = Sender.CONSOLE_UUID!!
2323
val UUID_ANY_MEMBER_SELECTOR = UUID(0, 1)
2424
val UUID_ANY_GROUP_SELECTOR = UUID(0, 2)

src/main/kotlin/io/github/karlatemp/luckperms/mirai/MiraiConnectionListener.kt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,18 @@ class MiraiConnectionListener : AbstractConnectionListener(LPMiraiPlugin) {
3232

3333
fun recUsr(id: Long) {
3434
val uid = UUID(MAGIC_UUID_HIGH_BITS, id)
35-
DebugKit.log { "Checking user object for $id..." }
3635
val loaded = LPMiraiPlugin.apiProvider.userManager.getUser(uid)
3736
if (loaded == null) {
38-
DebugKit.log { "User object of $id not create. Creating..." }
37+
DebugKit.log { "Registered $id with $uid" }
3938
loadUser(uid, id.toString())
4039
recordConnection(uid)
4140
}
4241
}
4342

43+
override fun recordConnection(uniqueId: UUID?) {
44+
// noop
45+
}
46+
4447
internal fun loadInternalUsers() {
4548
fun rec(uid: UUID, name: String) {
4649
// UUID_ANY_MEMBER_SELECTOR
@@ -58,16 +61,5 @@ class MiraiConnectionListener : AbstractConnectionListener(LPMiraiPlugin) {
5861
}
5962

6063
fun registerListeners() {
61-
LPMiraiBootstrap.globalEventChannel().subscribeAlways<MessageEvent>(
62-
priority = EventPriority.HIGHEST
63-
) {
64-
loadInternalUsers()
65-
recUsr(sender.id)
66-
message.forEach { elm ->
67-
if (elm is At) {
68-
recUsr(elm.target)
69-
}
70-
}
71-
}
7264
}
7365
}

src/main/kotlin/io/github/karlatemp/luckperms/mirai/commands/SwitchDebugCommand.kt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
package io.github.karlatemp.luckperms.mirai.commands
1313

14+
import io.github.karlatemp.luckperms.mirai.LPMiraiPlugin
15+
import io.github.karlatemp.luckperms.mirai.MAGIC_UUID_HIGH_BITS
1416
import io.github.karlatemp.luckperms.mirai.internal.LPPermissionService
1517
import io.github.karlatemp.luckperms.mirai.internal.LuckPermsPermission
1618
import io.github.karlatemp.luckperms.mirai.internal.OpenApiImpl
@@ -21,12 +23,11 @@ import me.lucko.luckperms.common.command.abstraction.SingleCommand
2123
import me.lucko.luckperms.common.command.access.CommandPermission
2224
import me.lucko.luckperms.common.command.spec.CommandSpec
2325
import me.lucko.luckperms.common.command.utils.ArgumentList
26+
import me.lucko.luckperms.common.model.manager.user.UserHousekeeper
2427
import me.lucko.luckperms.common.plugin.LuckPermsPlugin
2528
import me.lucko.luckperms.common.sender.Sender
2629
import me.lucko.luckperms.common.util.Predicates
2730
import net.mamoe.mirai.console.permission.AbstractPermitteeId
28-
import net.mamoe.mirai.console.permission.PermissionId
29-
import net.mamoe.mirai.console.permission.PermitteeId
3031

3132
internal object SwitchDebugCommand : SingleCommand(
3233
CommandSpec.LPM_DEBUG,
@@ -48,7 +49,19 @@ internal object SwitchDebugCommand : SingleCommand(
4849
newLine("status - View LuckPermsMirai status")
4950
newLine("logger - Enable/Disable debug logger.")
5051
newLine("trust - Temporarily trust full access to another user. (UNSAFE)")
52+
newLine("check - check [mirai user identity] [lp permission node] Check a permission via mirai permission api")
5153
})
54+
"loadedUsr" -> {
55+
sender.sendmsg(buildString {
56+
LPMiraiPlugin.userManager.all.forEach { (uid, usr) ->
57+
newLine {
58+
append(uid)
59+
append(" -> ")
60+
append(usr.plainDisplayName)
61+
}
62+
}
63+
})
64+
}
5265
"status" -> {
5366
sender.sendmsg(buildString {
5467
newLine("LuckPerms Mirai - Dev Kit")
@@ -67,6 +80,27 @@ internal object SwitchDebugCommand : SingleCommand(
6780
newLine()
6881
newLine("LPM DebugLogger: " + (if (DebugKit.isDebugEnabled) "ON" else "OFF"))
6982
newLine("Trusted Users: " + DebugKit.trustedUsers)
83+
val keeper = LPMiraiPlugin.userManager.houseKeeper
84+
val ru = UserHousekeeper.Access.recentlyUsed(keeper)
85+
val rua = UserHousekeeper.Access.recentlyUsedApi(keeper)
86+
newLine("UserHousekeeper.recentlyUsed:")
87+
ru.snapshot().forEach { uid ->
88+
newLine {
89+
append(uid)
90+
if (uid.mostSignificantBits == MAGIC_UUID_HIGH_BITS) {
91+
append(" -> ").append(uid.leastSignificantBits)
92+
}
93+
}
94+
}
95+
newLine("UserHousekeeper.recentlyUsedApi:")
96+
rua.snapshot().forEach { uid ->
97+
newLine {
98+
append(uid)
99+
if (uid.mostSignificantBits == MAGIC_UUID_HIGH_BITS) {
100+
append(" -> ").append(uid.leastSignificantBits)
101+
}
102+
}
103+
}
70104
})
71105
}
72106
"trust" -> {

src/main/kotlin/io/github/karlatemp/luckperms/mirai/internal/LPPermissionService.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ import me.lucko.luckperms.common.cacheddata.result.TristateResult
2323
import me.lucko.luckperms.common.cacheddata.type.PermissionCache
2424
import me.lucko.luckperms.common.verbose.VerboseCheckTarget
2525
import me.lucko.luckperms.common.verbose.event.CheckOrigin
26-
import me.lucko.luckperms.common.verbose.event.PermissionCheckEvent
2726
import net.luckperms.api.query.QueryOptions
2827
import net.luckperms.api.util.Tristate
2928
import net.mamoe.mirai.console.extensions.PermissionServiceProvider
3029
import net.mamoe.mirai.console.permission.*
3130
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
31+
import net.mamoe.mirai.utils.debug
3232
import java.util.*
3333
import java.util.concurrent.ConcurrentHashMap
3434
import kotlin.reflect.KClass
@@ -298,7 +298,21 @@ internal object LPPermissionService : PermissionService<LuckPermsPermission> {
298298
val permissionData = usr.cachedData.getPermissionData(
299299
LPMiraiPlugin.contextManager.getQueryOptions(permitteeId)
300300
)
301-
DebugKit.log { "UUID $user with lnum ${user.leastSignificantBits}, permissions = ${permissionData.permissionMap}" }
301+
DebugKit.ifDebug {
302+
val logger = LPMiraiBootstrap.logger
303+
logger.debug { "UUID $user with lnum ${user.leastSignificantBits}, permissions: " }
304+
permissionData.permissionMap.forEach { (k, v) ->
305+
logger.debug { " $k -> $v" }
306+
}
307+
logger.debug { "Query options: " }
308+
val opts = permissionData.queryOptions
309+
logger.debug { " `- mode: ${opts.mode()}, flags: ${opts.flags()}" }
310+
logger.debug { " `- options: ${opts.options()}" }
311+
logger.debug { " `- contexts:" }
312+
opts.context().forEach { ctx ->
313+
logger.debug { " `- ${ctx.key} -> ${ctx.value}" }
314+
}
315+
}
302316
return testPermission(permission, permissionData, permission)
303317
|| DebugKit.isTrusted(permitteeId)
304318
}

src/main/kotlin/io/github/karlatemp/luckperms/mirai/logging/DebugKit.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111

1212
package io.github.karlatemp.luckperms.mirai.logging
1313

14-
import io.github.karlatemp.luckperms.mirai.LPMiraiPlugin
14+
import io.github.karlatemp.luckperms.mirai.LPMiraiBootstrap
1515
import net.mamoe.mirai.console.permission.AbstractPermitteeId
1616
import net.mamoe.mirai.console.permission.PermitteeId
17+
import net.mamoe.mirai.utils.debug
1718
import kotlin.contracts.ExperimentalContracts
1819
import kotlin.contracts.InvocationKind
1920
import kotlin.contracts.contract
@@ -29,7 +30,15 @@ internal object DebugKit {
2930
inline fun log(msg: () -> String) {
3031
contract { callsInPlace(msg, InvocationKind.AT_MOST_ONCE) }
3132
if (isDebugEnabled) {
32-
LPMiraiPlugin.logger.info("[DEBUG] ${msg()}")
33+
LPMiraiBootstrap.logger.debug { "[DEBUG] ${msg()}" }
34+
}
35+
}
36+
37+
@OptIn(ExperimentalContracts::class)
38+
inline fun ifDebug(act: () -> Unit) {
39+
contract { callsInPlace(act, InvocationKind.AT_MOST_ONCE) }
40+
if (isDebugEnabled) {
41+
act()
3342
}
3443
}
3544

0 commit comments

Comments
 (0)