diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/providers/gathering/ProviderValueGatherer.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/providers/gathering/ProviderValueGatherer.java index f3435f2a9..056c942e9 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/providers/gathering/ProviderValueGatherer.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/providers/gathering/ProviderValueGatherer.java @@ -16,22 +16,31 @@ */ package com.djrapitops.plan.extension.implementation.providers.gathering; +import com.djrapitops.plan.exceptions.DataExtensionMethodCallException; import com.djrapitops.plan.extension.CallEvents; import com.djrapitops.plan.extension.DataExtension; import com.djrapitops.plan.extension.icon.Icon; import com.djrapitops.plan.extension.implementation.DataProviderExtractor; +import com.djrapitops.plan.extension.implementation.ProviderInformation; import com.djrapitops.plan.extension.implementation.TabInformation; +import com.djrapitops.plan.extension.implementation.providers.DataProvider; import com.djrapitops.plan.extension.implementation.providers.DataProviders; import com.djrapitops.plan.extension.implementation.providers.MethodWrapper; import com.djrapitops.plan.extension.implementation.storage.transactions.StoreIconTransaction; import com.djrapitops.plan.extension.implementation.storage.transactions.StorePluginTransaction; import com.djrapitops.plan.extension.implementation.storage.transactions.StoreTabInformationTransaction; +import com.djrapitops.plan.extension.implementation.storage.transactions.providers.StoreNumberProviderTransaction; import com.djrapitops.plan.extension.implementation.storage.transactions.results.RemoveInvalidResultsTransaction; +import com.djrapitops.plan.extension.implementation.storage.transactions.results.StorePlayerNumberResultTransaction; +import com.djrapitops.plan.extension.implementation.storage.transactions.results.StoreServerNumberResultTransaction; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.storage.database.DBSystem; import com.djrapitops.plan.storage.database.Database; +import com.djrapitops.plan.storage.database.transactions.Transaction; import java.util.UUID; +import java.util.function.BiFunction; +import java.util.function.Function; /** * Object that can be called to place data about players to the database. @@ -40,6 +49,8 @@ import java.util.UUID; */ public class ProviderValueGatherer { + private final DataExtension extension; + private final CallEvents[] callEvents; private final DataProviderExtractor extractor; private final DBSystem dbSystem; @@ -52,7 +63,8 @@ public class ProviderValueGatherer { private final StringProviderValueGatherer stringGatherer; private final TableProviderValueGatherer tableGatherer; private final GroupProviderValueGatherer groupGatherer; - + private Gatherer serverNumberGatherer; + private Gatherer playerNumberGatherer; public ProviderValueGatherer( DataExtension extension, @@ -60,7 +72,8 @@ public class ProviderValueGatherer { DBSystem dbSystem, ServerInfo serverInfo ) { - this.callEvents = extension.callExtensionMethodsOn(); + this.extension = extension; + this.callEvents = this.extension.callExtensionMethodsOn(); this.extractor = extractor; this.dbSystem = dbSystem; this.serverInfo = serverInfo; @@ -87,6 +100,13 @@ public class ProviderValueGatherer { groupGatherer = new GroupProviderValueGatherer( pluginName, extension, serverUUID, database, dataProviders ); + + serverNumberGatherer = new Gatherer<>( + Long.class, + method -> method.callMethod(extension), + StoreNumberProviderTransaction::new, + (provider, result) -> new StoreServerNumberResultTransaction(provider, serverUUID, result) + ); } public void disableMethodFromUse(MethodWrapper method) { @@ -129,7 +149,14 @@ public class ProviderValueGatherer { public void updateValues(UUID playerUUID, String playerName) { Conditions conditions = booleanGatherer.gatherBooleanDataOfPlayer(playerUUID, playerName); - numberGatherer.gatherNumberDataOfPlayer(playerUUID, playerName, conditions); + + UUID serverUUID = serverInfo.getServerUUID(); + playerNumberGatherer = new Gatherer<>( + Long.class, method -> method.callMethod(extension, playerUUID, playerName), + StoreNumberProviderTransaction::new, + (provider, result) -> new StorePlayerNumberResultTransaction(provider, serverUUID, playerUUID, result) + ); + playerNumberGatherer.gather(conditions); doubleAndPercentageGatherer.gatherDoubleDataOfPlayer(playerUUID, playerName, conditions); stringGatherer.gatherStringDataOfPlayer(playerUUID, playerName, conditions); tableGatherer.gatherTableDataOfPlayer(playerUUID, playerName, conditions); @@ -143,4 +170,68 @@ public class ProviderValueGatherer { stringGatherer.gatherStringDataOfServer(conditions); tableGatherer.gatherTableDataOfServer(conditions); } + + interface MethodCaller extends Function, T> { + default T call(DataProvider provider) { + try { + return apply(provider.getMethod()); + } catch (Exception | NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError e) { + throw new DataExtensionMethodCallException(e, provider.getProviderInformation().getPluginName(), provider.getMethod()); + } + } + } + + interface ProviderTransactionConstructor extends BiFunction, UUID, Transaction> { + default Transaction create(DataProvider provider, UUID serverUUID) { + return apply(provider, serverUUID); + } + } + + interface ResultTransactionConstructor extends BiFunction, T, Transaction> { + default Transaction create(DataProvider provider, T result) { + return apply(provider, result); + } + } + + class Gatherer { + private final Class type; + private final MethodCaller methodCaller; + private final ProviderTransactionConstructor providerTransactionConstructor; + private final ResultTransactionConstructor resultTransactionConstructor; + + public Gatherer( + Class type, + MethodCaller methodCaller, + ProviderTransactionConstructor providerTransactionConstructor, + ResultTransactionConstructor resultTransactionConstructor + ) { + this.type = type; + this.methodCaller = methodCaller; + this.providerTransactionConstructor = providerTransactionConstructor; + this.resultTransactionConstructor = resultTransactionConstructor; + } + + public void gather(Conditions conditions) { + for (DataProvider provider : dataProviders.getPlayerMethodsByType(type)) { // TODO work this out + gather(conditions, provider); + } + } + + private void gather(Conditions conditions, DataProvider provider) { + ProviderInformation information = provider.getProviderInformation(); + if (information.getCondition().map(conditions::isNotFulfilled).orElse(false)) { + return; // Condition not fulfilled + } + + T result = methodCaller.call(provider); + if (result == null) { + return; // Error during method call + } + + Database db = dbSystem.getDatabase(); + db.executeTransaction(new StoreIconTransaction(information.getIcon())); + db.executeTransaction(providerTransactionConstructor.create(provider, serverInfo.getServerUUID())); + db.executeTransaction(resultTransactionConstructor.create(provider, result)); + } + } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/providers/StoreNumberProviderTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/providers/StoreNumberProviderTransaction.java index 4ed553ad1..2ba907823 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/providers/StoreNumberProviderTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/providers/StoreNumberProviderTransaction.java @@ -19,6 +19,7 @@ package com.djrapitops.plan.extension.implementation.storage.transactions.provid import com.djrapitops.plan.extension.FormatType; import com.djrapitops.plan.extension.implementation.ProviderInformation; import com.djrapitops.plan.extension.implementation.providers.DataProvider; +import com.djrapitops.plan.extension.implementation.providers.NumberDataProvider; import com.djrapitops.plan.storage.database.sql.tables.ExtensionIconTable; import com.djrapitops.plan.storage.database.sql.tables.ExtensionPluginTable; import com.djrapitops.plan.storage.database.sql.tables.ExtensionTabTable; @@ -54,6 +55,10 @@ public class StoreNumberProviderTransaction extends ThrowawayTransaction { this.providerInformation = provider.getProviderInformation(); } + public StoreNumberProviderTransaction(DataProvider provider, UUID serverUUID) { + this(provider, NumberDataProvider.getFormatType(provider), serverUUID); + } + @Override protected void performOperations() { execute(storeProvider()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StorePlayerNumberResultTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StorePlayerNumberResultTransaction.java index c079445a9..9f2ec7f46 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StorePlayerNumberResultTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StorePlayerNumberResultTransaction.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.extension.implementation.storage.transactions.results; +import com.djrapitops.plan.extension.implementation.providers.DataProvider; import com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable; import com.djrapitops.plan.storage.database.transactions.ExecStatement; import com.djrapitops.plan.storage.database.transactions.Executable; @@ -51,6 +52,10 @@ public class StorePlayerNumberResultTransaction extends ThrowawayTransaction { this.value = value; } + public StorePlayerNumberResultTransaction(DataProvider provider, UUID serverUUID, UUID playerUUID, long value) { + this(provider.getProviderInformation().getPluginName(), serverUUID, provider.getProviderInformation().getName(), playerUUID, value); + } + @Override protected void performOperations() { execute(storeValue()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StoreServerNumberResultTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StoreServerNumberResultTransaction.java index 0990f5001..6f1ab46c4 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StoreServerNumberResultTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/StoreServerNumberResultTransaction.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.extension.implementation.storage.transactions.results; +import com.djrapitops.plan.extension.implementation.providers.DataProvider; import com.djrapitops.plan.storage.database.sql.tables.ExtensionProviderTable; import com.djrapitops.plan.storage.database.transactions.ExecStatement; import com.djrapitops.plan.storage.database.transactions.Executable; @@ -48,6 +49,10 @@ public class StoreServerNumberResultTransaction extends ThrowawayTransaction { this.value = value; } + public StoreServerNumberResultTransaction(DataProvider provider, UUID serverUUID, long value) { + this(provider.getProviderInformation().getPluginName(), serverUUID, provider.getProviderInformation().getName(), value); + } + @Override protected void performOperations() { execute(storeValue());