Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1ed771eb3 | ||
|
|
08a4d9d6b1 | ||
|
|
7ef8dcfd64 | ||
|
|
5bedf88b4c | ||
|
|
1d241651b5 | ||
|
|
3ff2bfa412 | ||
|
|
3a508c693b | ||
|
|
a4c5ff921e | ||
|
|
137e9dc7d6 |
@@ -9,6 +9,22 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
* Profiles save automatically, so there is no need to save after changes.
|
* Profiles save automatically, so there is no need to save after changes.
|
||||||
*/
|
*/
|
||||||
public interface ServerProfile extends Profile {
|
public interface ServerProfile extends Profile {
|
||||||
|
/**
|
||||||
|
* Get the server ID.
|
||||||
|
*
|
||||||
|
* @return The server ID.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
String getServerID();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the local server ID.
|
||||||
|
*
|
||||||
|
* @return The local server ID.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
String getLocalServerID();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the server profile.
|
* Load the server profile.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.price;
|
package com.willfp.eco.core.price;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
import com.willfp.eco.core.placeholder.context.PlaceholderContext;
|
import com.willfp.eco.core.placeholder.context.PlaceholderContext;
|
||||||
import com.willfp.eco.core.price.impl.PriceFree;
|
import com.willfp.eco.core.price.impl.PriceFree;
|
||||||
@@ -158,12 +159,27 @@ public final class ConfiguredPrice implements Price {
|
|||||||
if (!(
|
if (!(
|
||||||
config.has("value")
|
config.has("value")
|
||||||
&& config.has("type")
|
&& config.has("type")
|
||||||
&& config.has("display")
|
|
||||||
)) {
|
)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
String formatString = config.getString("display");
|
String formatString;
|
||||||
|
|
||||||
|
String langConfig = Eco.get().getEcoPlugin().getLangYml()
|
||||||
|
.getSubsections("price-display")
|
||||||
|
.stream()
|
||||||
|
.filter(section -> section.getString("type").equalsIgnoreCase(config.getString("type")))
|
||||||
|
.findFirst()
|
||||||
|
.map(section -> section.getString("display"))
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
|
if (langConfig != null) {
|
||||||
|
formatString = langConfig;
|
||||||
|
} else if (config.has("display")) {
|
||||||
|
formatString = config.getString("display");
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Price price = Prices.create(
|
Price price = Prices.create(
|
||||||
config.getString("value"),
|
config.getString("value"),
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ import com.willfp.eco.internal.spigot.integrations.shop.ShopDeluxeSellwands
|
|||||||
import com.willfp.eco.internal.spigot.integrations.shop.ShopEconomyShopGUI
|
import com.willfp.eco.internal.spigot.integrations.shop.ShopEconomyShopGUI
|
||||||
import com.willfp.eco.internal.spigot.integrations.shop.ShopShopGuiPlus
|
import com.willfp.eco.internal.spigot.integrations.shop.ShopShopGuiPlus
|
||||||
import com.willfp.eco.internal.spigot.integrations.shop.ShopZShop
|
import com.willfp.eco.internal.spigot.integrations.shop.ShopZShop
|
||||||
|
import com.willfp.eco.internal.spigot.metrics.PlayerflowHandler
|
||||||
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy
|
import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy
|
||||||
import com.willfp.eco.internal.spigot.recipes.CraftingRecipeListener
|
import com.willfp.eco.internal.spigot.recipes.CraftingRecipeListener
|
||||||
@@ -261,10 +262,13 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
|
|||||||
ProfileSaver(this, profileHandler).startTicking()
|
ProfileSaver(this, profileHandler).startTicking()
|
||||||
|
|
||||||
this.scheduler.runTimer(
|
this.scheduler.runTimer(
|
||||||
{ getProxy(PacketHandlerProxy::class.java).clearDisplayFrames() },
|
|
||||||
this.configYml.getInt("display-frame-ttl").toLong(),
|
this.configYml.getInt("display-frame-ttl").toLong(),
|
||||||
this.configYml.getInt("display-frame-ttl").toLong()
|
this.configYml.getInt("display-frame-ttl").toLong(),
|
||||||
)
|
) { getProxy(PacketHandlerProxy::class.java).clearDisplayFrames() }
|
||||||
|
|
||||||
|
if (this.configYml.getBool("playerflow")) {
|
||||||
|
PlayerflowHandler(this.scheduler).startTicking()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun handleAfterLoad() {
|
override fun handleAfterLoad() {
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ import com.willfp.eco.core.data.PlayerProfile
|
|||||||
import com.willfp.eco.core.data.Profile
|
import com.willfp.eco.core.data.Profile
|
||||||
import com.willfp.eco.core.data.ServerProfile
|
import com.willfp.eco.core.data.ServerProfile
|
||||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||||
|
import com.willfp.eco.core.data.keys.PersistentDataKeyType
|
||||||
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
||||||
|
import com.willfp.eco.util.namespacedKeyOf
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@@ -64,15 +66,43 @@ class EcoPlayerProfile(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val serverIDKey = PersistentDataKey(
|
||||||
|
namespacedKeyOf("eco", "server_id"),
|
||||||
|
PersistentDataKeyType.STRING,
|
||||||
|
""
|
||||||
|
)
|
||||||
|
|
||||||
|
private val localServerIDKey = PersistentDataKey(
|
||||||
|
namespacedKeyOf("eco", "local_server_id"),
|
||||||
|
PersistentDataKeyType.STRING,
|
||||||
|
""
|
||||||
|
)
|
||||||
|
|
||||||
class EcoServerProfile(
|
class EcoServerProfile(
|
||||||
data: MutableMap<PersistentDataKey<*>, Any>,
|
data: MutableMap<PersistentDataKey<*>, Any>,
|
||||||
handler: DataHandler,
|
handler: DataHandler,
|
||||||
localHandler: DataHandler
|
localHandler: DataHandler
|
||||||
) : EcoProfile(data, serverProfileUUID, handler, localHandler), ServerProfile {
|
) : EcoProfile(data, serverProfileUUID, handler, localHandler), ServerProfile {
|
||||||
|
override fun getServerID(): String {
|
||||||
|
if (this.read(serverIDKey).isBlank()) {
|
||||||
|
this.write(serverIDKey, UUID.randomUUID().toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.read(serverIDKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getLocalServerID(): String {
|
||||||
|
if (this.read(localServerIDKey).isBlank()) {
|
||||||
|
this.write(localServerIDKey, UUID.randomUUID().toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.read(localServerIDKey)
|
||||||
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "EcoServerProfile"
|
return "EcoServerProfile"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val PersistentDataKey<*>.isLocal: Boolean
|
private val PersistentDataKey<*>.isLocal: Boolean
|
||||||
get() = EcoPlugin.getPlugin(this.key.namespace)?.isUsingLocalStorage == true
|
get() = this == localServerIDKey || EcoPlugin.getPlugin(this.key.namespace)?.isUsingLocalStorage == true
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.metrics
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco
|
||||||
|
import com.willfp.eco.core.config.json
|
||||||
|
import com.willfp.eco.core.data.ServerProfile
|
||||||
|
import com.willfp.eco.core.scheduling.Scheduler
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import java.net.URI
|
||||||
|
import java.net.http.HttpClient
|
||||||
|
import java.net.http.HttpRequest
|
||||||
|
import java.net.http.HttpResponse
|
||||||
|
|
||||||
|
private const val PLAYERFLOW_URL = "https://playerflow.auxilor.io/api/v1/ping"
|
||||||
|
|
||||||
|
private val client = HttpClient.newBuilder().build()
|
||||||
|
|
||||||
|
class PlayerflowHandler(
|
||||||
|
private val scheduler: Scheduler
|
||||||
|
) {
|
||||||
|
internal fun startTicking() {
|
||||||
|
scheduler.runAsyncTimer(1200L, 1200L) {
|
||||||
|
makeRequest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeRequest() {
|
||||||
|
val body = json {
|
||||||
|
"uuid" to ServerProfile.load().localServerID
|
||||||
|
"players" to Bukkit.getOnlinePlayers().size
|
||||||
|
"plugins" to Eco.get().loadedPlugins
|
||||||
|
}.toPlaintext()
|
||||||
|
|
||||||
|
val request = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(PLAYERFLOW_URL))
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(body))
|
||||||
|
.build()
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.send(request, HttpResponse.BodyHandlers.ofString())
|
||||||
|
} catch (e: Exception) {
|
||||||
|
// Silently fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -91,3 +91,9 @@ use-immediate-placeholder-translation-for-math: false
|
|||||||
# faster evaluation times (less CPU usage) at the expense of slightly more memory usage and
|
# faster evaluation times (less CPU usage) at the expense of slightly more memory usage and
|
||||||
# less reactive values.
|
# less reactive values.
|
||||||
math-cache-ttl: 200
|
math-cache-ttl: 200
|
||||||
|
|
||||||
|
# If anonymous usage statistics should be tracked. This is very valuable information as it
|
||||||
|
# helps understand how eco and other plugins are being used by logging player and server
|
||||||
|
# counts. This is completely anonymous and no personal information is logged. This data
|
||||||
|
# is primarily used for optimisation and server insights.
|
||||||
|
playerflow: true
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
multiple-in-craft: '&l&c! &fThis recipe requires &a%amount%&f of this item.'
|
multiple-in-craft: '&l&c! &fThis recipe requires &a%amount%&f of this item.'
|
||||||
|
|
||||||
|
# Specify default display names for prices made through ConfiguredPrice#create
|
||||||
|
# These will override any custom configured price display names.
|
||||||
|
price-display:
|
||||||
|
- type: example_type
|
||||||
|
display: "&e%value% Price"
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version = 6.60.4
|
version = 6.61.1
|
||||||
plugin-name = eco
|
plugin-name = eco
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
Reference in New Issue
Block a user