Compare commits

...
73 Commits
Author SHA1 Message Date
BenCodez b8acfe20ec Update version number to 6.19 2025-08-24 15:48:12 -06:00
BenCodez 110aaf096e Refactor player name retrieval to match casing from UUID cache 2025-08-24 13:30:53 -06:00
Ben 171975c3d3 Merge pull request #1457 from BenCodez/dependabot/maven/VotingPlugin/org.apache.maven.plugins-maven-javadoc-plugin-3.11.3
Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.2 to 3.11.3 in /VotingPlugin
2025-08-18 18:47:52 -06:00
dependabot[bot] ac96d277c5 Bump org.apache.maven.plugins:maven-javadoc-plugin in /VotingPlugin
Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.11.2 to 3.11.3.
- [Release notes](https://github.com/apache/maven-javadoc-plugin/releases)
- [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.11.2...maven-javadoc-plugin-3.11.3)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-javadoc-plugin
  dependency-version: 3.11.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 09:18:02 +00:00
BenCodez b1ad952950 Add debug message for DiscordSRV leaderboard updates 2025-08-17 13:37:18 -06:00
BenCodez ca30bcb183 Fix clearing discord message id with command 2025-08-15 16:56:13 -06:00
BenCodez eecd975731 Add debug logging and minor changes for discord top voters 2025-08-13 15:52:53 -06:00
BenCodez aa55b10e50 Implement delay handling for global message sending on PLUGINMESSAGING
Added to handle cases where too many pluginmessages causes messages to
be skipped, subject to change
2025-08-10 14:16:08 -06:00
BenCodez 64f59f8195 Update WaitForUserOnline setting to true for consistent reward behavior 2025-08-10 13:09:43 -06:00
BenCodez a51e041430 Add command to clear Discord message ID for top voter
This will force a new discord message to be sent
2025-08-10 12:19:42 -06:00
BenCodez b39f768a46 Add support for multiple top voter types in DiscordSRV integration 2025-08-06 19:33:44 -06:00
BenCodez e98bc49add Parse placeholders on discord message reward 2025-08-05 17:00:00 -06:00
BenCodez 8b2209aa59 Attempt fixing player name casing in offline while player is offline 2025-08-03 15:02:21 -06:00
BenCodez 58a0e85d00 Prevent redundant updates to last vote time for a specific vote site 2025-08-03 13:31:53 -06:00
BenCodez 3febfa4056 Update vote times in all possible cases 2025-08-03 13:31:28 -06:00
BenCodez e5668c862a Fix player name casing in offline mode Bungee and Velocity proxies
Will attempt to correct while player is online
2025-08-01 16:26:54 -06:00
BenCodez fd4c6a3954 Restore bungeeVoteParty data on all methods on startup 2025-08-01 16:16:14 -06:00
BenCodez 9e9472680a Remove unused command aliases from plugin configuration 2025-07-31 16:55:56 -06:00
Ben cbecd7be30 Merge pull request #1452 from BenCodez/dependabot/maven/VotingPlugin/com.discordsrv-discordsrv-1.30.0
Bump com.discordsrv:discordsrv from 1.29.0 to 1.30.0 in /VotingPlugin
2025-07-28 16:26:03 -06:00
dependabot[bot] fcb1af77cf Bump com.discordsrv:discordsrv from 1.29.0 to 1.30.0 in /VotingPlugin
Bumps com.discordsrv:discordsrv from 1.29.0 to 1.30.0.

---
updated-dependencies:
- dependency-name: com.discordsrv:discordsrv
  dependency-version: 1.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-28 08:27:53 +00:00
BenCodez 5d9b5b7b6c Add configurable titles and rank display for DiscordSRV top voters 2025-07-26 20:26:04 -06:00
BenCodez d26d61a6f0 Fix formatting of vote count display in Discord embed 2025-07-24 15:55:15 -06:00
BenCodez 3f885aa358 Check DiscordSRV status on initialization 2025-07-22 18:45:19 -06:00
Ben d088f2e91a Merge pull request #1449 from BenCodez/dependabot/maven/VotingPlugin/com.discordsrv-discordsrv-1.29.0
Bump com.discordsrv:discordsrv from 1.26.0 to 1.29.0 in /VotingPlugin
2025-07-21 17:27:56 -06:00
dependabot[bot] a536c53dd9 Bump com.discordsrv:discordsrv from 1.26.0 to 1.29.0 in /VotingPlugin
Bumps com.discordsrv:discordsrv from 1.26.0 to 1.29.0.

---
updated-dependencies:
- dependency-name: com.discordsrv:discordsrv
  dependency-version: 1.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 08:06:43 +00:00
Ben 5d2d6f0763 Merge pull request #1440 from BenCodez/dependabot/maven/VotingPlugin/net.md-5-bungeecord-api-1.21-R0.3
Bump net.md-5:bungeecord-api from 1.21-R0.2 to 1.21-R0.3 in /VotingPlugin
2025-07-20 20:26:50 -06:00
BenCodez 0848ed83c2 Add DiscordSRV integration for top voter updates and injected reward 2025-07-20 16:08:08 -06:00
ben 1771fe0889 Update to 1.21.8 2025-07-19 21:23:35 -06:00
ben ce5b197e8b Don't always close inventory on VoteURL 2025-07-19 15:16:43 -06:00
ben 15489d9c64 Modify how slots are set in VoteURL GUI 2025-07-18 19:37:42 -06:00
ben 758632b5a5 Fix redis messages showing up in logs without debug enabled 2025-07-17 16:05:52 -06:00
ben 3dc45b6a63 Add extra items to VoteURL first 2025-07-15 19:02:55 -06:00
ben 26c9ad98bc Change MYSQL method to use MYSQL to communicate between servers
Works like PLUGINMESSAGING, SOCKETS, REDIS, or MQTT
2025-07-13 20:28:59 -06:00
BenCodez ee2531af1e Modify shutdown order 2025-07-06 16:16:16 -06:00
BenCodez 461e5f8413 Cancel more timers on velocity shutdown 2025-07-05 20:38:34 -06:00
BenCodez 1c5acbd1a1 Improve resource cleanup in VotingPluginProxy shutdown method
- Added socketHandler connection closure
- Added redisHandler resource cleanup
- Shutdown globalDataHandler if initialized
- Ensured proper cleanup of all handlers
- Maintained existing bungeeTimeChecker shutdown logic
- Set `enabled` to false after cleanup
2025-07-05 14:48:17 -06:00
BenCodez e855c01854 Stop timer on velocity shutdown 2025-07-05 08:57:30 -06:00
BenCodez aeec7d9d17 Shutdown bungeeTimeChecker during proxy disable process.
- Added `bungeeTimeChecker.shutdown()` in `VotingPluginProxy`.
- Ensures proper cleanup of `bungeeTimeChecker`.
- Prevents potential resource leaks during proxy shutdown.
- Maintains consistency in shutdown logic.
- Improves reliability of proxy disable functionality.
- Minor code enhancement for better resource management.
2025-07-04 15:46:30 -06:00
BenCodez 4861c041e4 Add ResetMilestonesMonthly to proxy 2025-07-01 08:58:23 -06:00
BenCodez d1c6752240 Update version number to 6.18.8-SNAPSHOT 2025-06-30 18:48:11 -06:00
BenCodez caa7058363 Update version number to 6.18.7 2025-06-30 18:41:45 -06:00
BenCodez b67f6a509c Fix waituntilvotedelay on proxy with better handling 2025-06-30 16:53:00 -06:00
BenCodez 0edc09dc80 Update to 1.21.7 2025-06-30 16:14:27 -06:00
BenCodez 19e597e094 Remove version check on startup 2025-06-30 15:53:54 -06:00
BenCodez bfc838bfaa Add wait until vote delay feature on proxy
- Implemented vote delay checks in `VotingPluginProxy`.
- Added methods to handle vote delay logic in `Config` classes.
- Updated `VotingPluginProxyConfig` with new vote delay methods.
- Extended `bungeeconfig.yml` with `WaitUntilVoteDelay` settings.
- Improved vote handling to skip votes if delay conditions are unmet.
- Enhanced logging for skipped votes due to delay.
2025-06-29 15:57:32 -06:00
BenCodez 9cda17e89e Update version number to 6.18.7-SNAPSHOT 2025-06-22 15:50:59 -06:00
BenCodez 54a573a445 Update version number to 6.18.6 2025-06-22 15:32:45 -06:00
BenCodez 5432b2a0d3 Update to 1.21.6 2025-06-22 13:03:30 -06:00
Ben 13d3a614ed Merge pull request #1441 from Kawi16/master
Update AdvancedCore version
2025-06-20 15:49:55 -06:00
Alessandro f9641e158d Update plugin.yml to include NLogin 2025-06-20 06:24:14 +00:00
Alessandro a0c1f64aac Update config to include NLogin 2025-06-20 06:23:44 +00:00
BenCodez 1f88cb0261 Improve vote site generation by replacing spaces with underscores. 2025-06-19 16:03:05 -06:00
dependabot[bot] 71ccf6a7b0 Bump net.md-5:bungeecord-api in /VotingPlugin
Bumps [net.md-5:bungeecord-api](https://github.com/SpigotMC/BungeeCord) from 1.21-R0.2 to 1.21-R0.3.
- [Commits](https://github.com/SpigotMC/BungeeCord/commits)

---
updated-dependencies:
- dependency-name: net.md-5:bungeecord-api
  dependency-version: 1.21-R0.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-16 06:57:36 +00:00
BenCodez 47a42d2bc8 Add configuration option to enable /av javascript command
- Introduced `EnableJavascriptCommand` in `Config.yml`
- Default value for `EnableJavascriptCommand` set to `false`
2025-06-03 20:04:12 -06:00
BenCodez ac41787c1e Simplify internal api for mysql on proxy 2025-05-26 20:05:35 -06:00
BenCodez ed4e3968da Add requiresPlayerOnline check to improve vote caching logic.
- Added `requiresPlayerOnline` method to `BungeeMethod` enum.
- Updated vote caching logic to use `requiresPlayerOnline` check.
- Ensured caching occurs only when required by the method.
- Improved clarity of conditions in `VotingPluginProxy`.
- Enhanced flexibility for different `BungeeMethod` implementations.
2025-05-26 18:31:54 -06:00
BenCodez 09da81cc4e Add MQTT proxy method, internal rewrites to cross server communication 2025-05-25 17:06:23 -06:00
BenCodez fd35c43c16 Update version to 6.18.6-SNAPSHOT 2025-05-23 20:54:02 -06:00
BenCodez 8060f594c3 Add filters to exclude specific META-INF files in Maven shade plugin 2025-05-23 20:37:19 -06:00
BenCodez 39aa7062a5 Update version number to 6.18.5 2025-05-23 20:18:56 -06:00
BenCodez 7ff7fbb7cb Update to AdvancedCore changes 2025-05-17 21:29:49 -06:00
BenCodez 231817314b Modify handling of nonvoted players to not cache in offline mode
- change package name of multi-proxy
2025-05-13 17:59:07 -06:00
BenCodez a20f10d978 Use mysql/sqlite from simpleapi 2025-05-13 12:58:55 -06:00
BenCodez 997beaae28 Modify handling of offline reward checking in offline mode 2025-05-11 21:07:55 -06:00
BenCodez 9acc5861b7 Modified handling of placeholder cache for offline mode 2025-05-02 11:30:17 -06:00
BenCodez f299847d46 Modify handling of caching for offline mode 2025-05-02 08:23:45 -06:00
BenCodez 87ff48366c Modofy handling of getting VotingPluginUser to account for offline mode 2025-04-26 12:26:14 -06:00
BenCodez 3dde76dcde Fix voteparty velocity broadcast 2025-04-22 14:08:42 -06:00
BenCodez 237713a799 Fix velocity voteparty broadcast not being colorized 2025-04-22 13:35:16 -06:00
BenCodez 23141d4ec1 Fix handling of allowunjoined on backend servers 2025-04-21 09:48:48 -06:00
Ben 2cfbaf4de8 Merge pull request #1434 from BenCodez/dependabot/maven/VotingPlugin/org.junit.jupiter-junit-jupiter-engine-5.12.2
Bump org.junit.jupiter:junit-jupiter-engine from 5.12.1 to 5.12.2 in /VotingPlugin
2025-04-14 12:30:47 -06:00
dependabot[bot] c31b83fcd3 Bump org.junit.jupiter:junit-jupiter-engine in /VotingPlugin
Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.12.1 to 5.12.2.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.12.1...r5.12.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 5.12.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 06:07:25 +00:00
BenCodez 4cfd887c33 Update version number to 6.18.5-SNAPSHOT 2025-04-13 15:52:53 -06:00
42 changed files with 2157 additions and 718 deletions

No files matched your search

+26 -13
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.bencodez</groupId>
<artifactId>votingplugin</artifactId>
<version>6.18.4</version>
<version>6.19</version>
<packaging>jar</packaging>
<name>VotingPlugin</name>
<properties>
@@ -95,6 +95,14 @@
<include>**</include>
</includes>
</filter>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<relocations>
<relocation>
@@ -121,11 +129,6 @@
<shadedPattern>
${project.groupId}.votingplugin.mysqlapi</shadedPattern>
</relocation>
<relocation>
<pattern>com.zaxxer.HikariCP</pattern>
<shadedPattern>
${project.groupId}.votingplugin.HikariCP</shadedPattern>
</relocation>
<relocation>
<pattern>com.zaxxer.hikari</pattern>
<shadedPattern>
@@ -206,12 +209,16 @@
<url>
https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>scarsz</id>
<url>https://nexus.scarsz.me/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.21.5-R0.1-SNAPSHOT</version>
<version>1.21.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -223,7 +230,7 @@
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.21-R0.2</version>
<version>1.21-R0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -259,13 +266,13 @@
<dependency>
<groupId>com.bencodez</groupId>
<artifactId>advancedcore</artifactId>
<version>3.7.15</version>
<version>3.7.18</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.12.1</version>
<version>5.12.2</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -274,6 +281,12 @@
<version>5.15.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.30.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
@@ -356,7 +369,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.2</version>
<version>3.11.3</version>
<executions>
<execution>
<id>attach-javadocs</id>
@@ -431,7 +444,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.2</version>
<version>3.11.3</version>
<executions>
<execution>
<id>attach-javadocs</id>
@@ -573,7 +586,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.2</version>
<version>3.11.3</version>
<executions>
<execution>
<id>attach-javadocs</id>
@@ -1,6 +1,7 @@
package com.bencodez.votingplugin;
import java.io.File;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
@@ -9,30 +10,37 @@ import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.eclipse.paho.client.mqttv3.MqttException;
import com.bencodez.advancedcore.api.misc.MiscUtils;
import com.bencodez.advancedcore.api.misc.encryption.EncryptionHandler;
import com.bencodez.advancedcore.api.rewards.RewardBuilder;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.advancedcore.api.user.UserStorage;
import com.bencodez.advancedcore.api.user.usercache.value.DataValue;
import com.bencodez.advancedcore.api.user.usercache.value.DataValueBoolean;
import com.bencodez.advancedcore.api.user.userstorage.mysql.api.config.MysqlConfigSpigot;
import com.bencodez.advancedcore.bungeeapi.GlobalMessage.GlobalMessageHandler;
import com.bencodez.advancedcore.bungeeapi.GlobalMessage.GlobalMessageListener;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalDataHandler;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalMySQL;
import com.bencodez.advancedcore.bungeeapi.pluginmessage.PluginMessageHandler;
import com.bencodez.advancedcore.bungeeapi.redis.RedisHandler;
import com.bencodez.advancedcore.bungeeapi.redis.RedisListener;
import com.bencodez.advancedcore.bungeeapi.sockets.ClientHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketReceiver;
import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.simpleapi.encryption.EncryptionHandler;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.simpleapi.servercomm.global.GlobalMessageHandler;
import com.bencodez.simpleapi.servercomm.global.GlobalMessageListener;
import com.bencodez.simpleapi.servercomm.mqtt.MqttHandler;
import com.bencodez.simpleapi.servercomm.mqtt.MqttHandler.MessageHandler;
import com.bencodez.simpleapi.servercomm.mqtt.MqttServerComm;
import com.bencodez.simpleapi.servercomm.mysql.BackendMessenger;
import com.bencodez.simpleapi.servercomm.pluginmessage.PluginMessageHandler;
import com.bencodez.simpleapi.servercomm.redis.RedisHandler;
import com.bencodez.simpleapi.servercomm.redis.RedisListener;
import com.bencodez.simpleapi.servercomm.sockets.ClientHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketReceiver;
import com.bencodez.simpleapi.sql.data.DataValue;
import com.bencodez.simpleapi.sql.data.DataValueBoolean;
import com.bencodez.simpleapi.sql.mysql.config.MysqlConfigSpigot;
import com.bencodez.votingplugin.objects.VoteSite;
import com.bencodez.votingplugin.proxy.BungeeMessageData;
import com.bencodez.votingplugin.proxy.BungeeMethod;
@@ -74,6 +82,9 @@ public class BungeeHandler implements Listener {
private Thread redisThread;
@Getter
private BackendMessenger backendMysqlMessenger;
public BungeeHandler(VotingPluginMain plugin) {
this.plugin = plugin;
}
@@ -161,6 +172,10 @@ public class BungeeHandler implements Listener {
}
public void close() {
if (backendMysqlMessenger != null) {
backendMysqlMessenger.shutdown();
}
if (socketHandler != null) {
socketHandler.closeConnection();
}
@@ -188,7 +203,14 @@ public class BungeeHandler implements Listener {
@Override
public void sendMessage(String subChannel, String... messageData) {
if (method.equals(BungeeMethod.MYSQL)) {
plugin.getPluginMessaging().sendPluginMessage(subChannel, messageData);
// plugin.getPluginMessaging().sendPluginMessage(subChannel, messageData);
try {
backendMysqlMessenger.sendToProxy(subChannel + "%l%" + String.join("%l%", messageData));
} catch (SQLException e) {
e.printStackTrace();
}
} else if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
plugin.getPluginMessaging().sendPluginMessage(subChannel, messageData);
} else if (method.equals(BungeeMethod.SOCKETS)) {
@@ -202,6 +224,17 @@ public class BungeeHandler implements Listener {
list.addAll(ArrayUtils.convert(messageData));
redisHandler.sendMessage(plugin.getBungeeSettings().getRedisPrefix() + "VotingPlugin",
ArrayUtils.convert(list));
} else if (method.equals(BungeeMethod.MQTT)) {
ArrayList<String> list = new ArrayList<>();
list.add(subChannel);
list.addAll(ArrayUtils.convert(messageData));
try {
mqttHandler.publish(plugin.getBungeeSettings().getMqttPrefix() + "votingplugin/servers/proxy",
String.join(":", list));
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
@@ -399,11 +432,6 @@ public class BungeeHandler implements Listener {
user.offVote();
if (args.size() > 3 && plugin.getBungeeSettings().isPerServerMilestones()) {
BungeeMessageData text = new BungeeMessageData(args.get(3));
plugin.getSpecialRewards().checkMilestone(user, text, true);
}
if (args.size() > 2) {
bungeeVotePartyCurrent = Integer.parseInt(args.get(1));
bungeeVotePartyRequired = Integer.parseInt(args.get(2));
@@ -411,6 +439,26 @@ public class BungeeHandler implements Listener {
plugin.getServerData().setBungeeVotePartyRequired(bungeeVotePartyRequired);
}
if (args.size() > 3 && plugin.getBungeeSettings().isPerServerMilestones()) {
BungeeMessageData text = new BungeeMessageData(args.get(3));
plugin.getSpecialRewards().checkMilestone(user, text, true);
}
if (args.size() > 5) {
String service = args.get(4);
String data = args.get(5);
if (MessageAPI.isLong(data)) {
long time = Long.valueOf(data);
if (time > 0) {
user.setTime(plugin.getVoteSite(service, true), time);
} else {
if (plugin.getBungeeSettings().isBungeeDebug()) {
plugin.debug("Invalid last vote time received from bungee: " + time);
}
}
}
}
plugin.setUpdate(true);
}
});
@@ -502,6 +550,27 @@ public class BungeeHandler implements Listener {
if (method.equals(BungeeMethod.MYSQL)) {
plugin.registerBungeeChannels(plugin.getBungeeSettings().getPluginMessagingChannel());
try {
backendMysqlMessenger = new BackendMessenger("VotingPlugin",
plugin.getMysql().getMysql().getConnectionManager().getDataSource(),
plugin.getOptions().getServer(), msg -> {
plugin.debug("Proxy sent: " + msg.payload);
String[] message = msg.payload.split(Pattern.quote("%l%"));
if (message.length > 0) {
ArrayList<String> list = new ArrayList<>();
for (int i = 1; i < message.length; i++) {
list.add(message[i]);
}
globalMessageHandler.onMessage(message[0], list);
}
});
} catch (SQLException e) {
e.printStackTrace();
}
} else if (method.equals(BungeeMethod.REDIS)) {
redisHandler = new RedisHandler(plugin.getBungeeSettings().getRedisHost(),
plugin.getBungeeSettings().getRedisPort(), plugin.getBungeeSettings().getRedisUsername(),
@@ -516,7 +585,9 @@ public class BungeeHandler implements Listener {
@Override
protected void onMessage(String channel, String[] message) {
plugin.getLogger().info(channel + ArrayUtils.makeStringList(ArrayUtils.convert(message)));
if (plugin.getBungeeSettings().isBungeeDebug()) {
plugin.debug(channel + " " + ArrayUtils.makeStringList(ArrayUtils.convert(message)));
}
if (message.length > 0) {
ArrayList<String> list = new ArrayList<>();
for (int i = 1; i < message.length; i++) {
@@ -543,88 +614,24 @@ public class BungeeHandler implements Listener {
plugin.registerBungeeChannels(plugin.getBungeeSettings().getPluginMessagingChannel());
if (plugin.getBungeeSettings().isPluginMessageEncryption()) {
encryptionHandler = new EncryptionHandler(new File(plugin.getDataFolder(), "secretkey.key"));
encryptionHandler = new EncryptionHandler(plugin.getName(),
new File(plugin.getDataFolder(), "secretkey.key"));
plugin.getPluginMessaging().setEncryptionHandler(encryptionHandler);
}
bungeeVotePartyCurrent = plugin.getServerData().getBungeeVotePartyCurrent();
bungeeVotePartyRequired = plugin.getServerData().getBungeeVotePartyRequired();
plugin.getPluginMessaging().setDebug(plugin.getBungeeSettings().isBungeeDebug());
plugin.getPluginMessaging().add(new PluginMessageHandler("Vote") {
plugin.getPluginMessaging().add(new PluginMessageHandler() {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("Vote", args);
}
});
globalMessageHandler.onMessage(subChannel, args);
plugin.getPluginMessaging().add(new PluginMessageHandler("VoteOnline") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VoteOnline", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VoteUpdate") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VoteUpdate", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("BungeeTimeChange") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("BungeeTimeChange", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VoteBroadcast") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VoteBroadcast", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VoteBroadcastOffline") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VoteBroadcastOffline", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("Status") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("Status", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("ServerName") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("ServerName", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VotePartyBungee") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VotePartyBungee", args);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VotePartyBroadcast") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
globalMessageHandler.onMessage("VotePartyBroadcast", args);
}
});
} else if (method.equals(BungeeMethod.SOCKETS)) {
encryptionHandler = new EncryptionHandler(new File(plugin.getDataFolder(), "secretkey.key"));
encryptionHandler = new EncryptionHandler(plugin.getName(),
new File(plugin.getDataFolder(), "secretkey.key"));
clientHandler = new ClientHandler(plugin.getBungeeSettings().getBungeeServerHost(),
plugin.getBungeeSettings().getBungeeServerPort(), encryptionHandler,
@@ -640,158 +647,55 @@ public class BungeeHandler implements Listener {
}
};
socketHandler.add(new SocketReceiver("bungeevote") {
socketHandler.add(new SocketReceiver() {
@Override
public void onReceive(String[] data) {
if (data.length > 5) {
plugin.extraDebug("BungeeVote from " + data[2] + ", processing");
String uuid = data[1];
VotingPluginUser user = null;
if (!uuid.isEmpty()) {
user = plugin.getVotingPluginUserManager().getVotingPluginUser(UUID.fromString(uuid));
} else {
user = plugin.getVotingPluginUserManager().getVotingPluginUser(data[2]);
}
user.cache();
if (plugin.getBungeeSettings().isPerServerPoints()) {
user.addPoints(plugin.getConfigFile().getPointsOnVote());
}
user.bungeeVote(data[3], new BungeeMessageData(data[4]), !Boolean.valueOf(data[5]));
}
globalMessageHandler.onMessage(data[0], ArrayUtils.convertAndRemoveFirst(data));
}
});
socketHandler.add(new SocketReceiver("BungeeTimeChange") {
@Override
public void onReceive(String[] data) {
checkGlobalData();
} else if (method.equals(BungeeMethod.MQTT)) {
try {
String id = plugin.getBungeeSettings().getMqttClientID();
if (id.isEmpty()) {
id = plugin.getOptions().getServer();
}
});
mqttHandler = new MqttHandler(new MqttServerComm(plugin.getBungeeSettings().getMqttClientID(),
plugin.getBungeeSettings().getMqttBrokerURL(), plugin.getBungeeSettings().getMqttUsername(),
plugin.getBungeeSettings().getMqttPassword()), 2);
mqttHandler.subscribe(plugin.getBungeeSettings().getMqttPrefix() + "votingplugin/servers/"
+ plugin.getOptions().getServer(), new MessageHandler() {
socketHandler.add(new SocketReceiver("bungeevoteonline") {
@Override
public void onMessage(String topic, String payload) {
String[] message = payload.split(":");
@Override
public void onReceive(String[] data) {
if (data.length > 5) {
plugin.extraDebug("BungeeVoteOnline from " + data[2] + ", processing");
String uuid = data[1];
VotingPluginUser user = null;
if (!uuid.isEmpty()) {
user = plugin.getVotingPluginUserManager().getVotingPluginUser(UUID.fromString(uuid));
} else {
user = plugin.getVotingPluginUserManager().getVotingPluginUser(data[2]);
}
user.cache();
if (plugin.getBungeeSettings().isPerServerPoints()) {
user.addPoints(plugin.getConfigFile().getPointsOnVote());
}
user.bungeeVoteOnline(data[3], new BungeeMessageData(data[4]), !Boolean.valueOf(data[5]));
}
}
});
socketHandler.add(new SocketReceiver("BroadcastOffline") {
@Override
public void onReceive(String[] data) {
if (data.length > 2) {
String votes = data[0];
String p = data[1];
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(p);
user.offlineBroadcast(user, false, Integer.parseInt(votes));
}
}
});
socketHandler.add(new SocketReceiver("BungeeBroadcast") {
@Override
public void onReceive(String[] data) {
if (data.length > 2) {
VoteSite site = plugin.getVoteSite(data[1], true);
String p = data[3];
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(p);
if (site != null) {
site.broadcastVote(user, false);
} else {
plugin.getLogger().warning("No votesite for " + data[1]);
}
}
}
});
socketHandler.add(new SocketReceiver("Broadcast") {
@Override
public void onReceive(String[] data) {
if (data.length > 2) {
VoteSite site = plugin.getVoteSite(data[1], true);
String p = data[2];
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(p);
if (site != null) {
site.broadcastVote(user, false);
} else {
plugin.getLogger().warning("No votesite for " + data[1]);
}
}
}
});
socketHandler.add(new SocketReceiver("Status") {
@Override
public void onReceive(String[] data) {
if (data.length > 0) {
plugin.getLogger().info("Received status command, sending status back");
sendData("StatusOkay", plugin.getOptions().getServer());
}
}
});
socketHandler.add(new SocketReceiver("BungeeUpdate") {
@Override
public void onReceive(String[] data) {
plugin.setUpdate(true);
}
});
socketHandler.add(new SocketReceiver("VotePartyBungee") {
@Override
public void onReceive(String[] data) {
for (Player p : Bukkit.getOnlinePlayers()) {
new RewardBuilder(plugin.getBungeeSettings().getData(), "BungeeVotePartyRewards").send(p);
}
}
});
socketHandler.add(new SocketReceiver("VotePartyBroadcast") {
@Override
public void onReceive(String[] data) {
String broadcast = data[0];
MiscUtils.getInstance().broadcast(broadcast);
}
});
if (plugin.getOptions().getServer().equalsIgnoreCase("pleaseset")) {
plugin.getLogger().warning("Server name for bungee voting is not set, please set it");
if (message.length > 0) {
globalMessageHandler.onMessage(message[0],
ArrayUtils.convertAndRemoveFirst(message));
}
}
});
} catch (MqttException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
bungeeVotePartyCurrent = plugin.getServerData().getBungeeVotePartyCurrent();
bungeeVotePartyRequired = plugin.getServerData().getBungeeVotePartyRequired();
if (plugin.getOptions().getServer().equalsIgnoreCase("pleaseset")) {
plugin.getLogger().warning("Server name for bungee voting is not set, please set it");
}
}
@Getter
private MqttHandler mqttHandler;
public void loadGlobalMysql() {
if (plugin.getBungeeSettings().isGloblalDataEnabled()) {
if (timer != null) {
@@ -828,12 +732,12 @@ public class BungeeHandler implements Listener {
new GlobalMySQL("VotingPlugin_GlobalData", plugin.getMysql().getMysql()) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
plugin.debug(e);
}
@Override
public void debug(String text) {
public void debugLog(String text) {
plugin.debug(text);
}
@@ -843,7 +747,7 @@ public class BungeeHandler implements Listener {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
plugin.getLogger().severe(text);
}
@@ -858,12 +762,12 @@ public class BungeeHandler implements Listener {
plugin.getBungeeSettings().getData().getConfigurationSection("GlobalData"))) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
plugin.debug(e);
}
@Override
public void debug(String text) {
public void debugLog(String text) {
plugin.debug(text);
}
@@ -873,7 +777,7 @@ public class BungeeHandler implements Listener {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
plugin.getLogger().severe(text);
}
@@ -55,11 +55,10 @@ import com.bencodez.advancedcore.api.rewards.injected.RewardInjectInt;
import com.bencodez.advancedcore.api.rewards.injected.RewardInjectValidator;
import com.bencodez.advancedcore.api.rewards.injectedrequirement.RequirementInjectConfigurationSection;
import com.bencodez.advancedcore.api.user.AdvancedCoreUser;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.advancedcore.logger.Logger;
import com.bencodez.simpleapi.file.YMLConfig;
import com.bencodez.simpleapi.nms.NMSManager;
import com.bencodez.simpleapi.skull.SkullCache;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.simpleapi.updater.Updater;
import com.bencodez.votingplugin.broadcast.BroadcastHandler;
import com.bencodez.votingplugin.commands.CommandLoader;
@@ -76,6 +75,7 @@ import com.bencodez.votingplugin.config.ShopFile;
import com.bencodez.votingplugin.config.SpecialRewardsConfig;
import com.bencodez.votingplugin.cooldown.CoolDownCheck;
import com.bencodez.votingplugin.data.ServerData;
import com.bencodez.votingplugin.discord.DiscordHandler;
import com.bencodez.votingplugin.listeners.BlockBreak;
import com.bencodez.votingplugin.listeners.PlayerInteract;
import com.bencodez.votingplugin.listeners.PlayerJoinEvent;
@@ -247,6 +247,9 @@ public class VotingPluginMain extends AdvancedCorePlugin {
private boolean firstTimeLoaded = false;
@Getter
private DiscordHandler discordHandler;
public void addDirectlyDefinedRewards(DirectlyDefinedReward directlyDefinedReward) {
getRewardHandler().addDirectlyDefined(directlyDefinedReward);
}
@@ -339,6 +342,7 @@ public class VotingPluginMain extends AdvancedCorePlugin {
* @param uuid the uuid
* @return the user
*/
@Deprecated
public VotingPluginUser getUser(UUID uuid) {
return getVotingPluginUserManager().getVotingPluginUser(uuid);
}
@@ -1198,6 +1202,12 @@ public class VotingPluginMain extends AdvancedCorePlugin {
mvdwPlaceholders.loadMVdWPlaceholders();
}
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV") && configFile.isDiscordSRVEnabled()) {
discordHandler = new DiscordHandler(this);
discordHandler.load();
debug("DiscordSRV enabled, loading DiscordSRV handler");
}
// Add rewards
getRewardHandler().addInjectedReward(new RewardInjectInt("Points", 0) {
@@ -1384,18 +1394,6 @@ public class VotingPluginMain extends AdvancedCorePlugin {
public void onPreLoad() {
plugin = this;
// disable plugin for older versions below 1.12
if (NMSManager.getInstance().isVersion("1.7", "1.8", "1.9", "1.10", "1.11")) {
plugin.getLogger().severe("Detected running " + Bukkit.getVersion()
+ ", this version is not supported on this build, read the plugin page. Disabling...");
if (!configFile.isOverrideVersionDisable()) {
Bukkit.getPluginManager().disablePlugin(this);
return;
}
plugin.getLogger().warning("Overriding version disable, beware of using this! This may cause issues!");
}
setupFiles();
loadVoteSites();
@@ -1712,6 +1710,11 @@ public class VotingPluginMain extends AdvancedCorePlugin {
checkFirstTimeLoaded();
if (discordHandler != null) {
plugin.extraDebug("Attempting to update DiscordSRV leaderboard");
discordHandler.updateDiscordLeaderboard();
}
plugin.getUserManager().getDataManager().clearNonNeededCachedUsers();
plugin.extraDebug("Current cached users: "
+ plugin.getUserManager().getDataManager().getUserDataCache().keySet().size());
@@ -31,8 +31,6 @@ import com.bencodez.advancedcore.api.messages.PlaceholderUtils;
import com.bencodez.advancedcore.api.misc.PlayerManager;
import com.bencodez.advancedcore.api.rewards.RewardOptions;
import com.bencodez.advancedcore.api.user.UserStorage;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.advancedcore.api.user.userstorage.DataType;
import com.bencodez.advancedcore.api.valuerequest.ValueRequest;
import com.bencodez.advancedcore.api.valuerequest.listeners.BooleanListener;
import com.bencodez.advancedcore.api.valuerequest.listeners.StringListener;
@@ -43,6 +41,8 @@ import com.bencodez.simpleapi.command.TabCompleteHandle;
import com.bencodez.simpleapi.command.TabCompleteHandler;
import com.bencodez.simpleapi.debug.DebugLevel;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.simpleapi.updater.Updater;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.commands.executers.CommandAliases;
@@ -1069,7 +1069,7 @@ public class CommandLoader {
sender.sendMessage(MessageAPI.colorize("&cClearing gotten milestones for all players..."));
plugin.getUserManager().removeAllKeyValues(path, DataType.STRING);
for (Player p : Bukkit.getOnlinePlayers()) {
plugin.getUserManager().getDataManager().cacheUser(p.getUniqueId());
plugin.getUserManager().getDataManager().cacheUser(p.getUniqueId(), p.getName());
}
sender.sendMessage(
MessageAPI.colorize("&cFinished clearing gotten milestones for all players"));
@@ -1842,6 +1842,21 @@ public class CommandLoader {
}
});
plugin.getAdminVoteCommand()
.add(new CommandHandler(plugin, new String[] { "ClearDiscordMessageID", "(topvoter)" },
"VotingPlugin.Commands.AdminVote.ClearDiscordMessageID",
"Clear discord message ID for top voter", true, true) {
@Override
public void execute(CommandSender sender, String[] args) {
String topVoter = args[1];
TopVoter top = TopVoter.getTopVoter(topVoter);
plugin.getServerData().setTopVoterMessageId(top, 0);
plugin.getDiscordHandler().getTopVoterMessageIds().put(top, 0L);
sendMessage(sender, "&cCleared discord message ID for " + top.toString());
}
});
plugin.getAdminVoteCommand().add(new CommandHandler(plugin, new String[] {},
"VotingPlugin.Commands.AdminVote|" + adminPerm, "Base command") {
@@ -28,6 +28,7 @@ import com.bencodez.votingplugin.user.VotingPluginUser;
public class AdminVoteTopPoints extends GUIHandler {
@SuppressWarnings("unused")
private int page;
private VotingPluginMain plugin;
private VotingPluginUser user;
@@ -186,8 +186,26 @@ public class VoteURL extends GUIHandler {
@Override
public void onChest(Player player) {
// normal GUI
BInventory inv = new BInventory(plugin.getGui().getChestVoteURLName());
if (!plugin.getConfigFile().isAlwaysCloseInventory()) {
inv.dontClose();
}
for (final String str : plugin.getGui().getChestVoteURLExtraItems()) {
inv.addButton(new BInventoryButton(new ItemBuilder(plugin.getGui().getChestVoteURLExtraItemsItem(str))) {
@Override
public void onClick(ClickEvent clickEvent) {
new RewardBuilder(plugin.getGui().getData(),
"CHEST.VoteURL.ExtraItems." + str + "." + clickEvent.getButton().getLastRewardsPath(player))
.setGiveOffline(false).send(clickEvent.getPlayer());
}
});
}
if (plugin.getGui().isChestVoteURLViewAllUrlsButtonEnabled()) {
ItemBuilder builderAll = getItemAll();
@@ -195,6 +213,7 @@ public class VoteURL extends GUIHandler {
@Override
public void onClick(ClickEvent event) {
event.closeInventory();
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(event.getPlayer());
json = true;
if (event.getClick().equals(ClickType.SHIFT_LEFT)
@@ -218,6 +237,15 @@ public class VoteURL extends GUIHandler {
if (voteSite.getPermissionToView().isEmpty() || player.hasPermission(voteSite.getPermissionToView())) {
ItemBuilder builder = getItemVoteSite(voteSite);
if (startSlot >= 0) {
if (inv.isSlotTaken(startSlot)) {
boolean found = false;
while (!found) {
startSlot++;
if (!inv.isSlotTaken(startSlot)) {
found = true;
}
}
}
builder.setSlot(startSlot);
startSlot++;
}
@@ -226,6 +254,7 @@ public class VoteURL extends GUIHandler {
@Override
public void onClick(ClickEvent event) {
event.closeInventory();
Player player = event.getPlayer();
if (player != null) {
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(player);
@@ -252,21 +281,6 @@ public class VoteURL extends GUIHandler {
}
}
for (
final String str : plugin.getGui().getChestVoteURLExtraItems()) {
inv.addButton(new BInventoryButton(new ItemBuilder(plugin.getGui().getChestVoteURLExtraItemsItem(str))) {
@Override
public void onClick(ClickEvent clickEvent) {
new RewardBuilder(plugin.getGui().getData(),
"CHEST.VoteURL.ExtraItems." + str + "." + clickEvent.getButton().getLastRewardsPath(player))
.setGiveOffline(false).send(clickEvent.getPlayer());
}
});
}
if (plugin.getGui().isChestVoteURLBackButton()) {
inv.addButton(plugin.getCommandLoader().getBackButton(user));
}
@@ -58,6 +58,26 @@ public class BungeeSettings extends YMLFile {
@ConfigDataInt(path = "Redis.Port")
@Getter
private int RedisPort = 6379;
@ConfigDataString(path = "MQTT.ClientID")
@Getter
private String mqttClientID = "";
@ConfigDataString(path = "MQTT.BrokerURL")
@Getter
private String mqttBrokerURL = "tcp://localhost:1883";
@ConfigDataString(path = "MQTT.Username")
@Getter
private String mqttUsername = "";
@ConfigDataString(path = "MQTT.Password")
@Getter
private String mqttPassword = "";
@ConfigDataString(path = "MQTT.Prefix")
@Getter
private String mqttPrefix = "";
@ConfigDataString(path = "BungeeServer.Host")
@Getter
@@ -14,6 +14,7 @@ import com.bencodez.simpleapi.file.annotation.ConfigDataBoolean;
import com.bencodez.simpleapi.file.annotation.ConfigDataInt;
import com.bencodez.simpleapi.file.annotation.ConfigDataKeys;
import com.bencodez.simpleapi.file.annotation.ConfigDataListString;
import com.bencodez.simpleapi.file.annotation.ConfigDataLong;
import com.bencodez.simpleapi.file.annotation.ConfigDataString;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.placeholders.PlaceholderCacheLevel;
@@ -67,6 +68,134 @@ public class Config extends YMLFile {
@Getter
private boolean preloadSkulls = false;
@ConfigDataBoolean(path = "DiscordSRV.Enabled")
@Getter
private boolean discordSRVEnabled = false;
@ConfigDataBoolean(path = "DiscordSRV.TopVoter.AllTime.Enabled")
@Getter
private boolean discordSRVTopVoterAllTimeEnabled = false;
@ConfigDataLong(path = "DiscordSRV.TopVoter.AllTime.Channel")
@Getter
private long discordSRVTopVoterAllTimeChannel = 0;
@ConfigDataString(path = "DiscordSRV.TopVoter.AllTime.Title")
@Getter
private String discordSRVTopVoterAllTimeTitle = "All Time Top Voters";
@ConfigDataString(path = "DiscordSRV.TopVoter.AllTime.RankDisplay")
@Getter
private String discordSRVTopVoterAllTimeRankDisplay = "%rank%: &6%player% - %votes% Votes";
@ConfigDataBoolean(path = "DiscordSRV.TopVoter.Monthly.Enabled")
@Getter
private boolean discordSRVTopVoterMonthlyEnabled = false;
@ConfigDataLong(path = "DiscordSRV.TopVoter.Monthly.Channel")
@Getter
private long discordSRVTopVoterMonthlyChannel = 0;
@ConfigDataString(path = "DiscordSRV.TopVoter.Monthly.Title")
@Getter
private String discordSRVTopVoterMonthlyTitle = "Top Voters of the Month";
@ConfigDataString(path = "DiscordSRV.TopVoter.Monthly.RankDisplay")
@Getter
private String discordSRVTopVoterMonthlyRankDisplay = "%rank%: &6%player% - %votes% Votes";
@ConfigDataBoolean(path = "DiscordSRV.TopVoter.Weekly.Enabled")
@Getter
private boolean discordSRVTopVoterWeeklyEnabled = false;
@ConfigDataLong(path = "DiscordSRV.TopVoter.Weekly.Channel")
@Getter
private long discordSRVTopVoterWeeklyChannel = 0;
@ConfigDataString(path = "DiscordSRV.TopVoter.Weekly.Title")
@Getter
private String discordSRVTopVoterWeeklyTitle = "Top Voters of the Week";
@ConfigDataString(path = "DiscordSRV.TopVoter.Weekly.RankDisplay")
@Getter
private String discordSRVTopVoterWeeklyRankDisplay = "%rank%: &6%player% - %votes% Votes";
@ConfigDataBoolean(path = "DiscordSRV.TopVoter.Daily.Enabled")
@Getter
private boolean discordSRVTopVoterDailyEnabled = false;
@ConfigDataLong(path = "DiscordSRV.TopVoter.Daily.Channel")
@Getter
private long discordSRVTopVoterDailyChannel = 0;
@ConfigDataString(path = "DiscordSRV.TopVoter.Daily.Title")
@Getter
private String discordSRVTopVoterDailyTitle = "Top Voters of the Day";
@ConfigDataString(path = "DiscordSRV.TopVoter.Daily.RankDisplay")
@Getter
private String discordSRVTopVoterDailyRankDisplay = "%rank%: &6%player% - %votes% Votes";
public boolean isDiscordSRVTopVoterEnabled(TopVoter topVoter) {
switch (topVoter) {
case AllTime:
return isDiscordSRVTopVoterAllTimeEnabled();
case Monthly:
return isDiscordSRVTopVoterMonthlyEnabled();
case Weekly:
return isDiscordSRVTopVoterWeeklyEnabled();
case Daily:
return isDiscordSRVTopVoterDailyEnabled();
default:
return false;
}
}
public long getDiscordSRVTopVoterChannel(TopVoter topVoter) {
switch (topVoter) {
case AllTime:
return getDiscordSRVTopVoterAllTimeChannel();
case Monthly:
return getDiscordSRVTopVoterMonthlyChannel();
case Weekly:
return getDiscordSRVTopVoterWeeklyChannel();
case Daily:
return getDiscordSRVTopVoterDailyChannel();
default:
return 0;
}
}
public String getDiscordSRVTopVoterTitle(TopVoter topVoter) {
switch (topVoter) {
case AllTime:
return getDiscordSRVTopVoterAllTimeTitle();
case Monthly:
return getDiscordSRVTopVoterMonthlyTitle();
case Weekly:
return getDiscordSRVTopVoterWeeklyTitle();
case Daily:
return getDiscordSRVTopVoterDailyTitle();
default:
return "";
}
}
public String getDiscordSRVTopVoterRankDisplay(TopVoter topVoter) {
switch (topVoter) {
case AllTime:
return getDiscordSRVTopVoterAllTimeRankDisplay();
case Monthly:
return getDiscordSRVTopVoterMonthlyRankDisplay();
case Weekly:
return getDiscordSRVTopVoterWeeklyRankDisplay();
case Daily:
return getDiscordSRVTopVoterDailyRankDisplay();
default:
return "";
}
}
@ConfigDataBoolean(path = "AllowUnJoinedCheckServer")
@Getter
private boolean allowUnJoinedCheckServer = true;
@@ -41,7 +41,7 @@ public class ConfigVoteSites extends YMLFile {
public void generateVoteSite(String siteName) {
if (plugin.getConfigFile().isAutoCreateVoteSites()) {
String org = siteName;
siteName = siteName.replace(".", "_");
siteName = siteName.replace(".", "_").replace(" ", "_");
plugin.getLogger().warning("VoteSite " + siteName + " does not exist with the servicesite '" + org
+ "', creating one, set AutoCreateVoteSites to false to prevent this");
setEnabled(siteName, true);
@@ -16,7 +16,7 @@ import org.bukkit.event.Listener;
import com.bencodez.advancedcore.api.rewards.RewardOptions;
import com.bencodez.advancedcore.api.user.AdvancedCoreUser;
import com.bencodez.advancedcore.api.user.UserStartup;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.PlayerVoteCoolDownEndEvent;
import com.bencodez.votingplugin.events.PlayerVoteSiteCoolDownEndEvent;
@@ -16,6 +16,7 @@ import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.signs.SignHandler;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
import com.bencodez.votingplugin.topvoter.TopVoter;
// TODO: Auto-generated Javadoc
/**
@@ -244,6 +245,15 @@ public class ServerData {
plugin.getServerDataFile().reloadData();
}
public long getTopVoterMessageId(TopVoter top) {
return getData().getLong("DiscordSRV.TopVoterMessageId." + top.toString(), 0);
}
public void setTopVoterMessageId(TopVoter top, long messageId) {
getData().set("DiscordSRV.TopVoterMessageId." + top.toString(), messageId);
saveData();
}
/**
* Removes the sign.
*
@@ -0,0 +1,146 @@
package com.bencodez.votingplugin.discord;
import java.awt.Color;
import java.time.Instant;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;
import org.bukkit.configuration.ConfigurationSection;
import com.bencodez.advancedcore.api.messages.PlaceholderUtils;
import com.bencodez.advancedcore.api.rewards.Reward;
import com.bencodez.advancedcore.api.rewards.injected.RewardInjectConfigurationSection;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.topvoter.TopVoter;
import com.bencodez.votingplugin.topvoter.TopVoterPlayer;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.api.Subscribe;
import github.scarsz.discordsrv.api.events.DiscordReadyEvent;
import github.scarsz.discordsrv.dependencies.jda.api.EmbedBuilder;
import github.scarsz.discordsrv.dependencies.jda.api.JDA;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import github.scarsz.discordsrv.util.DiscordUtil;
import lombok.Getter;
public class DiscordHandler {
private final VotingPluginMain plugin;
@Getter
private final HashMap<TopVoter, Long> topVoterMessageIds = new HashMap<TopVoter, Long>();
private final AtomicBoolean discordReady = new AtomicBoolean(false);
public DiscordHandler(VotingPluginMain plugin) {
this.plugin = plugin;
for (TopVoter top : TopVoter.values()) {
long savedId = plugin.getServerData().getTopVoterMessageId(top);
topVoterMessageIds.put(top, savedId);
}
}
/** Call this early, e.g. from onEnable() in main plugin class */
public void load() {
DiscordSRV.api.subscribe(this);
plugin.getLogger().info("DiscordHandler loaded; awaiting Discord readiness.");
// if DiscordSRV is already up and running, mark it ready now
if (DiscordUtil.getJda().getStatus() == JDA.Status.CONNECTED) {
discordReady.set(true);
plugin.getLogger().info("DiscordSRV was already ready; manual update now available.");
}
plugin.getRewardHandler().addInjectedReward(new RewardInjectConfigurationSection("DiscordSRV") {
@Override
public String onRewardRequested(Reward arg0, com.bencodez.advancedcore.api.user.AdvancedCoreUser user,
ConfigurationSection section, HashMap<String, String> placeholders) {
if (section.getBoolean("Enabled")) {
String msg = PlaceholderUtils
.replacePlaceHolder(section.getString("Message", "Please set a message"), placeholders);
msg = PlaceholderUtils.replacePlaceHolders(user.getOfflinePlayer(), msg);
sendRewardMessage(msg, section.getString("ChannelID", "0"));
}
return null;
}
});
}
/** Fired once JDA is fully initialized */
@Subscribe
public void onDiscordReady(DiscordReadyEvent event) {
discordReady.set(true);
plugin.getLogger().info("DiscordSRV is ready; manual update now available.");
}
/**
* Public method to update the Top Voter message on demand. Checks Discord
* readiness internally.
*/
public void updateDiscordLeaderboard() {
if (!discordReady.get()) {
plugin.getLogger().warning("DiscordSRV not ready yet; cannot update Top Voters.");
return;
}
for (TopVoter top : TopVoter.values()) {
if (plugin.getConfigFile().isDiscordSRVTopVoterEnabled(top)) {
plugin.debug("Updating Discord Top Voter: " + top.toString());
updateTopVoterMessageId(top);
}
}
}
public void updateTopVoterMessageId(TopVoter top) {
long channelId = plugin.getConfigFile().getDiscordSRVTopVoterChannel(top);
LinkedHashMap<TopVoterPlayer, Integer> topVoters = plugin.getTopVoter(top);
String title = plugin.getConfigFile().getDiscordSRVTopVoterTitle(top);
String rankDisplay = plugin.getConfigFile().getDiscordSRVTopVoterRankDisplay(top);
EmbedBuilder eb = new EmbedBuilder().setTitle(title).setColor(Color.CYAN).setTimestamp(Instant.now());
int rank = 1;
for (Entry<TopVoterPlayer, Integer> entry : topVoters.entrySet()) {
if (rank > 10)
break;
String line = rankDisplay.replace("%rank%", String.valueOf(rank))
.replace("%player%", entry.getKey().getPlayerName())
.replace("%votes%", String.valueOf(entry.getValue()));
eb.addField("", line, false);
rank++;
}
TextChannel channel = DiscordUtil.getJda().getTextChannelById(channelId);
if (channel == null) {
plugin.getLogger().warning("Discord channel ID " + channelId + " not found: " + top.toString());
return;
}
if (topVoterMessageIds.get(top) <= 0) {
channel.sendMessageEmbeds(eb.build()).queue(msg -> {
long newId = msg.getIdLong();
topVoterMessageIds.put(top, newId);
plugin.getServerData().setTopVoterMessageId(top, newId);
plugin.getLogger().info("Posted new Top Voters " + top.toString() + " (ID: " + newId + ")");
}, err -> plugin.getLogger()
.warning("Error sending Top Voters " + top.toString() + ": " + err.getMessage()));
} else {
channel.editMessageEmbedsById(topVoterMessageIds.get(top), eb.build())
.queue(m -> plugin.getLogger()
.info("Edited Top Voters " + top.toString() + " (ID: " + topVoterMessageIds.get(top) + ")"),
err -> plugin.getLogger()
.warning("Error editing Top Voters" + top.toString() + ": " + err.getMessage()));
}
}
public void sendRewardMessage(String message, String channelId) {
TextChannel channel = DiscordUtil.getJda().getTextChannelById(channelId);
if (channel != null) {
channel.sendMessage(message).queue();
} else {
plugin.getLogger().warning("Discord channel ID " + channelId + " not found for reward message.");
}
}
}
@@ -8,7 +8,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
import com.bencodez.advancedcore.listeners.AdvancedCoreLoginEvent;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.proxy.BungeeMethod;
import com.bencodez.votingplugin.user.VotingPluginUser;
// TODO: Auto-generated Javadoc
@@ -50,9 +49,7 @@ public class PlayerJoinEvent implements Listener {
plugin.getPlaceholders().onUpdate(user, true);
if (plugin.getBungeeSettings().isUseBungeecoord()
&& (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.REDIS))) {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
plugin.getBungeeHandler().getGlobalMessageHandler().sendMessage("Login", user.getPlayerName(),
user.getUUID(), plugin.getBungeeSettings().getServer());
}
@@ -76,14 +73,14 @@ public class PlayerJoinEvent implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerQuit(PlayerQuitEvent event) {
if (plugin != null && plugin.isEnabled()) {
final java.util.UUID uuid = event.getPlayer().getUniqueId();
final Player player = event.getPlayer();
plugin.getLoginTimer().execute(new Runnable() {
@Override
public void run() {
VotingPluginMain.plugin.getAdvancedTab().remove(uuid);
VotingPluginMain.plugin.getAdvancedTab().remove(player.getUniqueId());
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(uuid);
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(player);
user.dontCache();
user.logoutRewards();
plugin.getPlaceholders().onLogout(user);
@@ -3,6 +3,7 @@ package com.bencodez.votingplugin.listeners;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -16,7 +17,6 @@ import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.PlayerPostVoteEvent;
import com.bencodez.votingplugin.events.PlayerVoteEvent;
import com.bencodez.votingplugin.objects.VoteSite;
import com.bencodez.votingplugin.proxy.BungeeMethod;
import com.bencodez.votingplugin.topvoter.TopVoter;
import com.bencodez.votingplugin.user.VotingPluginUser;
@@ -51,6 +51,7 @@ public class PlayerVoteListener implements Listener {
String playerName = event.getPlayer();
plugin.debug("Processing PlayerVoteEvent: " + playerName + "/" + event.getServiceSite());
boolean notValid = false;
if (!PlayerManager.getInstance().isValidUser(playerName, plugin.getConfigFile().isAllowUnJoinedCheckServer())) {
if (!playerName.startsWith(plugin.getOptions().getBedrockPlayerPrefix())
&& !plugin.getOptions().getBedrockPlayerPrefix().isEmpty()) {
@@ -59,16 +60,22 @@ public class PlayerVoteListener implements Listener {
plugin.getConfigFile().isAllowUnJoinedCheckServer())) {
plugin.debug("Detected a bedrock user without bedrock prefix, adjusting");
playerName = plugin.getOptions().getBedrockPlayerPrefix() + playerName;
} else {
notValid = true;
}
} else {
if (!plugin.getConfigFile().isAllowUnjoined()) {
plugin.getLogger().warning("Player " + playerName
+ " has not joined before, disregarding vote, set AllowUnjoined to true to prevent this");
if (event.isBungee() && plugin.getBungeeSettings().isRemoveInvalidUsers()) {
plugin.getVotingPluginUserManager().getVotingPluginUser(playerName).remove();
}
return;
notValid = true;
}
}
if (notValid) {
if (!plugin.getConfigFile().isAllowUnjoined()) {
plugin.getLogger().warning("Player " + playerName
+ " has not joined before, disregarding vote, set AllowUnjoined to true to prevent this");
if (event.isBungee() && plugin.getBungeeSettings().isRemoveInvalidUsers()) {
plugin.getVotingPluginUserManager().getVotingPluginUser(playerName).remove();
}
return;
}
}
@@ -120,6 +127,15 @@ public class PlayerVoteListener implements Listener {
// player online
user = plugin.getVotingPluginUserManager().getVotingPluginUser(p);
} else {
// attempt to get exact name from cache matching casing
if (!plugin.getOptions().isOnlineMode()) {
for (Entry<String, String> entry : plugin.getUuidNameCache().entrySet()) {
if (entry.getValue().equalsIgnoreCase(playerName)) {
playerName = entry.getValue();
break;
}
}
}
user = plugin.getVotingPluginUserManager().getVotingPluginUser(playerName);
}
}
@@ -251,21 +267,6 @@ public class PlayerVoteListener implements Listener {
plugin.getSpecialRewards().checkMilestone(user, event.getBungeeTextTotals(), event.isForceBungee());
plugin.getCoolDownCheck().vote(user, voteSite);
if (plugin.getBungeeSettings().isUseBungeecoord()) {
if (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.MYSQL)) {
plugin.getBukkitScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
@Override
public void run() {
if (Bukkit.getOnlinePlayers().size() > 0) {
plugin.getBungeeHandler().getGlobalMessageHandler().sendMessage("VoteUpdate", uuid);
}
}
}, 2);
}
}
PlayerPostVoteEvent postVoteEvent = new PlayerPostVoteEvent(voteSite, user, event.isRealVote(),
event.isForceBungee(), voteTime);
plugin.getServer().getPluginManager().callEvent(postVoteEvent);
@@ -72,9 +72,11 @@ public class VotiferEvent implements Listener {
plugin.getServerData().addServiceSite(voteSite);
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getBungeeSettings().isVotifierBypass()
&& (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.SOCKETS))) {
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.SOCKETS)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.MQTT)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.REDIS))) {
plugin.getLogger().severe(
"Ignoring vote from votifier since pluginmessaging or socket bungee method is enabled, this means you aren't setup correctly for those methods, please check: https://github.com/BenCodez/VotingPlugin/wiki/Bungeecord-Setups");
"Ignoring vote from votifier since pluginmessaging, socket, redis, or mqtt bungee method is enabled, this means you aren't setup correctly for those methods, please check: https://github.com/BenCodez/VotingPlugin/wiki/Bungeecord-Setups");
return;
}
String matchSite = "";
@@ -16,7 +16,6 @@ import com.bencodez.advancedcore.api.rewards.RewardBuilder;
import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.proxy.BungeeMethod;
import com.bencodez.votingplugin.user.VotingPluginUser;
import lombok.Getter;
@@ -118,17 +117,9 @@ public class VoteSite {
}
if (checkBungee && plugin.getBungeeSettings().isBungeeBroadcast()
&& plugin.getBungeeSettings().isUseBungeecoord()) {
if (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.SOCKETS)) {
plugin.getBungeeHandler().sendData("Broadcast", getServiceSite(), user.getPlayerName());
} else if (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.MYSQL)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
String uuid = user.getUUID();
String service = getServiceSite();
if (Bukkit.getOnlinePlayers().size() > 0) {
plugin.getPluginMessaging().sendPluginMessage("VoteBroadcast", uuid, service);
}
}
String uuid = user.getUUID();
String service = getServiceSite();
plugin.getBungeeHandler().getGlobalMessageHandler().sendMessage("VoteBroadcast", uuid, service);
} else {
String bc = MessageAPI.colorize(plugin.getConfigFile().getFormatBroadCastMsg());
@@ -180,6 +180,8 @@ public class PlaceHolders {
}
}
UUID uuid = user.getJavaUUID();
for (PlaceHolder<VotingPluginUser> placeholder : placeholders) {
try {
if (placeholder.matches(identifier)) {
@@ -190,11 +192,11 @@ public class PlaceHolders {
CalculatingPlaceholder<VotingPluginUser> cPlaceholder = (CalculatingPlaceholder<VotingPluginUser>) placeholder;
if (placeholder.isUsesCache() && placeholder.isCached(identifier)) {
ConcurrentHashMap<UUID, String> cache = placeholder.getCache().get(identifier);
if (cache.containsKey(p.getUniqueId())) {
if (cPlaceholder.getCacheData().containsKey(user.getJavaUUID())) {
if (cache.containsKey(uuid)) {
if (cPlaceholder.getCacheData().containsKey(uuid)) {
return cPlaceholder.placeholderRequest(user, identifier);
}
return cache.get(p.getUniqueId());
return cache.get(uuid);
} else if (!forceProcess) {
schedulePlaceholderCheck(user);
return "...";
@@ -226,8 +228,9 @@ public class PlaceHolders {
}
if (placeholder.isUsesCache() && placeholder.isCached(identifier)) {
ConcurrentHashMap<UUID, String> cache = placeholder.getCache().get(identifier);
if (cache.containsKey(p.getUniqueId())) {
return cache.get(p.getUniqueId());
if (cache.containsKey(uuid)) {
return cache.get(uuid);
} else if (!forceProcess) {
schedulePlaceholderCheck(user);
return "...";
@@ -1,7 +1,11 @@
package com.bencodez.votingplugin.proxy;
public enum BungeeMethod {
MYSQL, PLUGINMESSAGING, SOCKETS, REDIS;
MYSQL, PLUGINMESSAGING, SOCKETS, REDIS, MQTT;
public boolean requiresPlayerOnline() {
return this == PLUGINMESSAGING;
}
public static BungeeMethod getByName(String str) {
for (BungeeMethod method : values()) {
@@ -1,6 +1,7 @@
package com.bencodez.votingplugin.proxy;
import lombok.Getter;
import lombok.Setter;
public class OfflineBungeeVote {
@@ -11,6 +12,7 @@ public class OfflineBungeeVote {
@Getter
private String service;
@Getter
@Setter
private String text;
@Getter
private long time;
@@ -0,0 +1,549 @@
package com.bencodez.votingplugin.proxy;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.simpleapi.sql.data.DataValue;
import com.bencodez.simpleapi.sql.data.DataValueInt;
import com.bencodez.simpleapi.sql.data.DataValueString;
import com.bencodez.simpleapi.sql.mysql.config.MysqlConfig;
import com.bencodez.simpleapi.sql.mysql.queries.Query;
import lombok.Getter;
public abstract class ProxyMysqlUserTable {
private List<String> columns = Collections.synchronizedList(new ArrayList<String>());
private List<String> intColumns = new ArrayList<>();
// private HashMap<String, ArrayList<Column>> table;
// ConcurrentMap<String, ArrayList<Column>> table = new
// ConcurrentHashMap<String, ArrayList<Column>>();
@Getter
private com.bencodez.simpleapi.sql.mysql.MySQL mysql;
private String name;
private Object object2 = new Object();
private Object object3 = new Object();
private Object object4 = new Object();
private Set<String> uuids = Collections.synchronizedSet(new HashSet<String>());
public abstract void logSevere(String string);
public abstract void logInfo(String string);
public ProxyMysqlUserTable(String tableName, MysqlConfig config, boolean debug) {
if (config.hasTableNameSet()) {
tableName = config.getTableName();
}
name = tableName;
if (config.getTablePrefix() != null) {
name = config.getTablePrefix() + tableName;
}
mysql = new com.bencodez.simpleapi.sql.mysql.MySQL(config.getMaxThreads()) {
@Override
public void debug(SQLException e) {
if (debug) {
e.printStackTrace();
}
}
@Override
public void severe(String string) {
logSevere(string);
}
@Override
public void debug(String msg) {
if (debug) {
logInfo("MYSQL DEBUG: " + msg);
}
}
};
if (!mysql.connect(config)) {
}
try {
Query q = new Query(mysql, "USE `" + config.getDatabase() + "`;");
q.executeUpdateAsync();
} catch (SQLException e) {
severe("Failed to send use database query: " + config.getDatabase() + " Error: " + e.getMessage());
debug(e);
}
String sql = "CREATE TABLE IF NOT EXISTS " + getName() + " (";
sql += "uuid VARCHAR(37),";
sql += "PRIMARY KEY ( uuid )";
sql += ");";
Query query;
try {
query = new Query(mysql, sql);
query.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
loadData();
// tempoary to improve performance from old tables
// addToQue("ALTER TABLE " + getName() + " MODIFY uuid VARCHAR(37);");
alterColumnType("uuid", "VARCHAR(37)");
}
public void addColumn(String column, DataType dataType) {
synchronized (object3) {
String sql = "ALTER TABLE " + getName() + " ADD COLUMN `" + column + "` text" + ";";
try {
Query query = new Query(mysql, sql);
query.executeUpdate();
getColumns().add(column);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void alterColumnType(String column, String newType) {
checkColumn(column, DataType.STRING);
try {
new Query(mysql, "ALTER TABLE " + getName() + " MODIFY `" + column + "` " + newType + ";")
.executeUpdateAsync();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (newType.contains("INT")) {
if (!intColumns.contains(column)) {
intColumns.add(column);
}
}
}
public void checkColumn(String column, DataType dataType) {
synchronized (object4) {
if (!getColumns().contains(column)) {
if (!getColumnsQueury().contains(column)) {
addColumn(column, dataType);
}
}
}
}
public void clearCache() {
clearCacheBasic();
}
public void clearCacheBasic() {
columns.clear();
columns.addAll(getColumnsQueury());
uuids.clear();
uuids.addAll(getUuidsQuery());
}
public void close() {
mysql.disconnect();
}
public boolean containsKeyQuery(String index) {
String sqlStr = "SELECT uuid FROM " + getName() + ";";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(sqlStr)) {
ResultSet rs = sql.executeQuery();
/*
* Query query = new Query(mysql, sql); ResultSet rs = query.executeQuery();
*/
while (rs.next()) {
if (rs.getString("uuid").equals(index)) {
rs.close();
return true;
}
}
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return false;
}
public void copyColumnData(String columnFromName, String columnToName) {
checkColumn(columnFromName, DataType.STRING);
checkColumn(columnToName, DataType.STRING);
String sql = "UPDATE `" + getName() + "` SET `" + columnToName + "` = `" + columnFromName + "`;";
try {
Query query = new Query(mysql, sql);
query.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public abstract void debug(SQLException e);
public List<String> getColumns() {
if (columns == null || columns.size() == 0) {
loadData();
}
return columns;
}
public ArrayList<String> getColumnsQueury() {
ArrayList<String> columns = new ArrayList<>();
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement("SHOW COLUMNS FROM `" + getName() + "`;")) {
ResultSet rs = sql.executeQuery();
while (rs.next()) {
String columnName = rs.getString(1);
columns.add(columnName);
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
return columns;
}
public ArrayList<Column> getExactQuery(Column column) {
ArrayList<Column> result = new ArrayList<>();
String query = "SELECT * FROM " + getName() + " WHERE `" + column.getName() + "`='"
+ column.getValue().getString() + "';";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(query)) {
ResultSet rs = sql.executeQuery();
/*
* Query sql = new Query(mysql, query); sql.setParameter(1,
* column.getValue().toString()); ResultSet rs = sql.executeQuery();
*/
if (rs.next()) {
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
String columnName = rs.getMetaData().getColumnLabel(i);
Column rCol = null;
if (intColumns.contains(columnName)) {
rCol = new Column(columnName, DataType.INTEGER);
rCol.setValue(new DataValueInt(rs.getInt(i)));
} else {
rCol = new Column(columnName, DataType.STRING);
rCol.setValue(new DataValueString(rs.getString(i)));
}
result.add(rCol);
}
}
rs.close();
return result;
} catch (SQLException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
}
for (String col : getColumns()) {
result.add(new Column(col, DataType.STRING));
}
return result;
}
public String getName() {
return name;
}
public ArrayList<String> getNamesQuery() {
ArrayList<String> uuids = new ArrayList<>();
checkColumn("PlayerName", DataType.STRING);
ArrayList<Column> rows = getRowsNameQuery();
if (rows != null) {
for (Column c : rows) {
if (c.getValue().isString()) {
uuids.add(c.getValue().getString());
}
}
}
return uuids;
}
public ArrayList<Column> getRowsNameQuery() {
ArrayList<Column> result = new ArrayList<>();
String sqlStr = "SELECT PlayerName FROM " + getName() + ";";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(sqlStr)) {
ResultSet rs = sql.executeQuery();
/*
* Query query = new Query(mysql, sql); ResultSet rs = query.executeQuery();
*/
while (rs.next()) {
Column rCol = new Column("PlayerName", new DataValueString(rs.getString("PlayerName")));
result.add(rCol);
}
sql.close();
conn.close();
} catch (SQLException e) {
}
return result;
}
public ArrayList<Column> getRowsQuery() {
ArrayList<Column> result = new ArrayList<>();
String sqlStr = "SELECT uuid FROM " + getName() + ";";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(sqlStr)) {
ResultSet rs = sql.executeQuery();
/*
* Query query = new Query(mysql, sql); ResultSet rs = query.executeQuery();
*/
while (rs.next()) {
Column rCol = new Column("uuid", new DataValueString(rs.getString("uuid")));
result.add(rCol);
}
rs.close();
} catch (SQLException e) {
return null;
}
return result;
}
public ConcurrentHashMap<UUID, String> getRowsUUIDNameQuery() {
ConcurrentHashMap<UUID, String> uuidNames = new ConcurrentHashMap<>();
String sqlStr = "SELECT UUID, PlayerName FROM " + getName() + ";";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(sqlStr)) {
ResultSet rs = sql.executeQuery();
/*
* Query query = new Query(mysql, sql); ResultSet rs = query.executeQuery();
*/
while (rs.next()) {
String uuid = rs.getString("uuid");
String playerName = rs.getString("PlayerName");
if (uuid != null && !uuid.isEmpty() && !uuid.equals("null") && playerName != null) {
uuidNames.put(UUID.fromString(uuid), playerName);
}
}
sql.close();
conn.close();
} catch (SQLException e) {
}
return uuidNames;
}
public String getUUID(String playerName) {
String query = "SELECT uuid FROM " + getName() + " WHERE " + "PlayerName" + "='" + playerName + "';";
try (Connection conn = mysql.getConnectionManager().getConnection();
PreparedStatement sql = conn.prepareStatement(query)) {
ResultSet rs = sql.executeQuery();
/*
* Query sql = new Query(mysql, query); ResultSet rs = sql.executeQuery();
*/
if (rs.next()) {
String uuid = rs.getString("uuid");
if (uuid != null && !uuid.isEmpty()) {
rs.close();
return uuid;
}
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
}
return null;
}
public Set<String> getUuids() {
if (uuids == null || uuids.size() == 0) {
uuids.clear();
uuids.addAll(getUuidsQuery());
return uuids;
}
return uuids;
}
public ArrayList<String> getUuidsQuery() {
ArrayList<String> uuids = new ArrayList<>();
ArrayList<Column> rows = getRowsQuery();
for (Column c : rows) {
if (c.getValue().isString()) {
uuids.add(c.getValue().getString());
}
}
return uuids;
}
public void insert(String index, String column, DataValue value) {
insertQuery(index, Arrays.asList(new Column(column, value)));
}
public void insertQuery(String index, List<Column> cols) {
String query = "INSERT IGNORE " + getName() + " ";
query += "set uuid='" + index + "', ";
for (int i = 0; i < cols.size(); i++) {
Column col = cols.get(i);
if (i == cols.size() - 1) {
if (col.getValue().isString()) {
query += "`" + col.getName() + "`='" + col.getValue().getString() + "';";
} else if (col.getValue().isBoolean()) {
query += "`" + col.getName() + "`='" + col.getValue().getBoolean() + "';";
} else if (col.getValue().isInt()) {
query += "`" + col.getName() + "`='" + col.getValue().getInt() + "';";
}
} else {
if (col.getValue().isString()) {
query += "`" + col.getName() + "`='" + col.getValue().getString() + "', ";
} else if (col.getValue().isBoolean()) {
query += "`" + col.getName() + "`='" + col.getValue().getBoolean() + "', ";
} else if (col.getValue().isInt()) {
query += "`" + col.getName() + "`='" + col.getValue().getInt() + "', ";
}
}
}
try {
uuids.add(index);
new Query(mysql, query).executeUpdateAsync();
} catch (SQLException e) {
e.printStackTrace();
}
}
public boolean isIntColumn(String key) {
return intColumns.contains(key);
}
public void loadData() {
columns = getColumnsQueury();
}
public abstract void severe(String str);
public void shutdown() {
mysql.disconnect();
}
public void update(String index, List<Column> cols) {
for (Column col : cols) {
checkColumn(col.getName(), col.getDataType());
}
if (getUuids().contains(index)) {
synchronized (object2) {
String query = "UPDATE " + getName() + " SET ";
for (int i = 0; i < cols.size(); i++) {
Column col = cols.get(i);
if (i == cols.size() - 1) {
if (col.getValue().isString()) {
query += "`" + col.getName() + "`='" + col.getValue().getString() + "'";
} else if (col.getValue().isBoolean()) {
query += "`" + col.getName() + "`='" + col.getValue().getBoolean() + "'";
} else if (col.getValue().isInt()) {
query += "`" + col.getName() + "`='" + col.getValue().getInt() + "'";
}
} else {
if (col.getValue().isString()) {
query += "`" + col.getName() + "`='" + col.getValue().getString() + "', ";
} else if (col.getValue().isBoolean()) {
query += "`" + col.getName() + "`='" + col.getValue().getBoolean() + "', ";
} else if (col.getValue().isInt()) {
query += "`" + col.getName() + "`='" + col.getValue().getInt() + "', ";
}
}
}
query += " WHERE `uuid`=";
query += "'" + index + "';";
try {
Query q = new Query(mysql, query);
q.executeUpdateAsync();
} catch (SQLException e) {
e.printStackTrace();
}
}
} else {
insertQuery(index, cols);
}
}
public void update(String index, String column, DataValue value) {
checkColumn(column, value.getType());
if (getUuids().contains(index)) {
synchronized (object2) {
String query = "UPDATE " + getName() + " SET ";
if (value.isString()) {
query += column + "='" + value.getString() + "'";
} else if (value.isBoolean()) {
query += column + "='" + value.getBoolean() + "'";
} else if (value.isInt()) {
query += column + "='" + value.getInt() + "'";
}
query += " WHERE `uuid`=";
query += "'" + index + "';";
try {
Query q = new Query(mysql, query);
q.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
} else {
insert(index, column, value);
}
}
public void wipeColumnData(String columnName, DataType dataType) {
checkColumn(columnName, dataType);
String sql = "UPDATE " + getName() + " SET " + columnName + " = " + dataType.getNoValue() + ";";
try {
Query query = new Query(mysql, sql);
query.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@@ -9,6 +9,8 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.SQLException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
@@ -23,28 +25,38 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import org.eclipse.paho.client.mqttv3.MqttException;
import com.bencodez.advancedcore.api.misc.encryption.EncryptionHandler;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.advancedcore.api.user.usercache.value.DataValue;
import com.bencodez.advancedcore.api.user.usercache.value.DataValueBoolean;
import com.bencodez.advancedcore.api.user.usercache.value.DataValueInt;
import com.bencodez.advancedcore.api.user.usercache.value.DataValueString;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalDataHandlerProxy;
import com.bencodez.advancedcore.bungeeapi.mysql.ProxyMySQL;
import com.bencodez.advancedcore.bungeeapi.redis.RedisHandler;
import com.bencodez.advancedcore.bungeeapi.redis.RedisListener;
import com.bencodez.advancedcore.bungeeapi.sockets.ClientHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketReceiver;
import com.bencodez.advancedcore.bungeeapi.time.BungeeTimeChecker;
import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.simpleapi.encryption.EncryptionHandler;
import com.bencodez.simpleapi.json.JsonParser;
import com.bencodez.votingplugin.proxy.global.multiproxy.MultiProxyHandler;
import com.bencodez.votingplugin.proxy.global.multiproxy.MultiProxyMethod;
import com.bencodez.votingplugin.proxy.global.multiproxy.MultiProxyServerSocketConfiguration;
import com.bencodez.votingplugin.proxy.global.multiproxy.MultiProxyServerSocketConfigurationBungee;
import com.bencodez.simpleapi.servercomm.global.GlobalMessageListener;
import com.bencodez.simpleapi.servercomm.global.GlobalMessageProxyHandler;
import com.bencodez.simpleapi.servercomm.mqtt.MqttHandler;
import com.bencodez.simpleapi.servercomm.mqtt.MqttHandler.MessageHandler;
import com.bencodez.simpleapi.servercomm.mqtt.MqttServerComm;
import com.bencodez.simpleapi.servercomm.mysql.ProxyMessenger;
import com.bencodez.simpleapi.servercomm.redis.RedisHandler;
import com.bencodez.simpleapi.servercomm.redis.RedisListener;
import com.bencodez.simpleapi.servercomm.sockets.ClientHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketReceiver;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.simpleapi.sql.data.DataValue;
import com.bencodez.simpleapi.sql.data.DataValueBoolean;
import com.bencodez.simpleapi.sql.data.DataValueInt;
import com.bencodez.simpleapi.sql.data.DataValueString;
import com.bencodez.votingplugin.proxy.multiproxy.MultiProxyHandler;
import com.bencodez.votingplugin.proxy.multiproxy.MultiProxyMethod;
import com.bencodez.votingplugin.proxy.multiproxy.MultiProxyServerSocketConfiguration;
import com.bencodez.votingplugin.proxy.multiproxy.MultiProxyServerSocketConfigurationBungee;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -63,7 +75,7 @@ public abstract class VotingPluginProxy {
@Getter
@Setter
private ProxyMySQL proxyMySQL;
private ProxyMysqlUserTable proxyMySQL;
private EncryptionHandler encryptionHandler;
@@ -109,6 +121,41 @@ public abstract class VotingPluginProxy {
@Getter
private Queue<VoteTimeQueue> timeChangeQueue = new ConcurrentLinkedQueue<>();
@Getter
private MqttHandler mqttHandler;
@Getter
private GlobalMessageProxyHandler globalMessageProxyHandler;
@Getter
private ProxyMessenger proxyMysqlMessenger;
public void resetMilestoneCountInVotes() {
// Iterate through cached online votes
for (Map.Entry<String, ArrayList<OfflineBungeeVote>> entry : cachedOnlineVotes.entrySet()) {
ArrayList<OfflineBungeeVote> votes = entry.getValue();
for (OfflineBungeeVote vote : votes) {
String updatedText = updateMilestoneCount(vote.getText());
vote.setText(updatedText);
}
}
// Iterate through cached votes
for (Map.Entry<String, ArrayList<OfflineBungeeVote>> entry : cachedVotes.entrySet()) {
ArrayList<OfflineBungeeVote> votes = entry.getValue();
for (OfflineBungeeVote vote : votes) {
String updatedText = updateMilestoneCount(vote.getText());
vote.setText(updatedText);
}
}
}
private String updateMilestoneCount(String text) {
BungeeMessageData data = new BungeeMessageData(text);
data.setMilestoneCount(0); // Reset milestone count to 0
return data.toString();
}
public VotingPluginProxy() {
enabled = true;
@@ -181,6 +228,11 @@ public abstract class VotingPluginProxy {
@Override
public void timeChanged(TimeType type, boolean fake, boolean pre, boolean post) {
if (type.equals(TimeType.MONTH) && getConfig().getResetMilestonesMonthly()) {
debug("Resetting milestones for month change");
resetMilestoneCountInVotes();
}
if (getConfig().getVoteCacheTime() > 0) {
checkVoteCacheTime();
}
@@ -188,6 +240,7 @@ public abstract class VotingPluginProxy {
warn("Global data not enabled, ignoring time change event");
return;
}
int delay = 1;
for (String s : getAllAvailableServers()) {
if (getGlobalDataHandler().getGlobalMysql().containsKey(s)) {
String lastOnlineStr = getGlobalDataHandler().getString(s, "LastOnline");
@@ -207,11 +260,8 @@ public abstract class VotingPluginProxy {
dataToSet.put("FinishedProcessing", new DataValueBoolean(false));
dataToSet.put(type.toString(), new DataValueBoolean(true));
getGlobalDataHandler().setData(s, dataToSet);
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessage(s, "BungeeTimeChange");
}
globalMessageProxyHandler.sendMessage(s, delay, "BungeeTimeChange", "");
delay++;
} else {
warn("Server " + s + " hasn't been online recently");
}
@@ -250,6 +300,7 @@ public abstract class VotingPluginProxy {
public abstract void broadcast(String message);
public synchronized void checkCachedVotes(String server) {
int delay = 1;
if (isServerValid(server)) {
if (isSomeoneOnlineServer(server)) {
if (cachedVotes.containsKey(server) && !getConfig().getBlockedServers().contains(server)) {
@@ -270,12 +321,13 @@ public abstract class VotingPluginProxy {
}
if (toSend) {
sendMessageServer(server, "Vote", cache.getPlayerName(), cache.getUuid(),
cache.getService(), "" + cache.getTime(), Boolean.FALSE.toString(),
"" + cache.isRealVote(), cache.getText(),
globalMessageProxyHandler.sendMessage(server, delay, "Vote", cache.getPlayerName(),
cache.getUuid(), cache.getService(), "" + cache.getTime(),
Boolean.FALSE.toString(), "" + cache.isRealVote(), cache.getText(),
"" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + getConfig().getBroadcast(),
"" + num, "" + numberOfVotes);
delay++;
num++;
} else {
debug("Not sending vote because user isn't on server " + server + ": "
@@ -292,6 +344,7 @@ public abstract class VotingPluginProxy {
}
public synchronized void checkOnlineVotes(String player, String uuid, String server) {
int delay = 1;
if (isPlayerOnline(player) && cachedOnlineVotes.containsKey(uuid)) {
ArrayList<OfflineBungeeVote> c = cachedOnlineVotes.get(uuid);
if (!c.isEmpty()) {
@@ -302,11 +355,12 @@ public abstract class VotingPluginProxy {
int num = 1;
int numberOfVotes = c.size();
for (OfflineBungeeVote cache : c) {
sendMessageServer(server, "VoteOnline", cache.getPlayerName(), cache.getUuid(),
cache.getService(), "" + cache.getTime(), Boolean.FALSE.toString(),
globalMessageProxyHandler.sendMessage(server, delay, "VoteOnline", cache.getPlayerName(),
cache.getUuid(), cache.getService(), "" + cache.getTime(), Boolean.FALSE.toString(),
"" + cache.isRealVote(), cache.getText(), "" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + getConfig().getBroadcast(), "" + num,
"" + numberOfVotes);
delay++;
num++;
}
cachedOnlineVotes.put(uuid, new ArrayList<>());
@@ -480,12 +534,28 @@ public abstract class VotingPluginProxy {
method = BungeeMethod.PLUGINMESSAGING;
}
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
if (method.equals(BungeeMethod.MYSQL)) {
try {
proxyMysqlMessenger = new ProxyMessenger("VotingPlugin",
getProxyMySQL().getMysql().getConnectionManager().getDataSource(), msg -> {
debug("Got from " + msg.sourceServerId + ": " + msg.payload);
String[] data = msg.payload.split(Pattern.quote("%l%"));
globalMessageProxyHandler.onMessage(data[0], ArrayUtils.convertAndRemoveFirst(data));
});
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
if (getConfig().getPluginMessageEncryption()) {
encryptionHandler = new EncryptionHandler(new File(getDataFolderPlugin(), "secretkey.key"));
encryptionHandler = new EncryptionHandler("VotingPlugin",
new File(getDataFolderPlugin(), "secretkey.key"));
}
} else if (method.equals(BungeeMethod.SOCKETS)) {
encryptionHandler = new EncryptionHandler(new File(getDataFolderPlugin(), "secretkey.key"));
encryptionHandler = new EncryptionHandler("VotingPlugin", new File(getDataFolderPlugin(), "secretkey.key"));
socketHandler = new SocketHandler(getPluginVersion(), getConfig().getBungeeHost(),
getConfig().getBungeePort(), encryptionHandler, getConfig().getDebug()) {
@@ -501,27 +571,9 @@ public abstract class VotingPluginProxy {
@Override
public void onReceive(String[] data) {
if (data.length > 1) {
if (data.length > 2) {
if (data[0].equalsIgnoreCase("Broadcast")) {
sendServerMessage(data);
}
}
globalMessageProxyHandler.onMessage(data[0].toLowerCase(),
ArrayUtils.convertAndRemoveFirst(data));
}
}
});
socketHandler.add(new SocketReceiver() {
@Override
public void onReceive(String[] data) {
if (data.length > 1) {
if (data[0].equalsIgnoreCase("StatusOkay")) {
String server = data[1];
log("Voting communicaton okay with " + server);
}
}
}
});
@@ -553,22 +605,9 @@ public abstract class VotingPluginProxy {
@Override
protected void onMessage(String channel, String[] message) {
if (message.length > 0) {
if (message[0].equalsIgnoreCase("statusokay")) {
String server = message[1];
log("Status okay for " + server);
} else if (message[0].equalsIgnoreCase("TimeChangeFinished")) {
} else if (message[0].equalsIgnoreCase("login")) {
String player = message[1];
String uuid = message[2];
String server = "";
if (message.length > 3) {
server = message[3];
}
debug("Login: " + player + "/" + uuid + " " + server);
addNonVotedPlayer(uuid, player);
login(player, uuid, server);
if (message.length > 0) {
globalMessageProxyHandler.onMessage(message[0].toLowerCase(),
ArrayUtils.convertAndRemoveFirst(message));
}
}
}
@@ -582,12 +621,117 @@ public abstract class VotingPluginProxy {
}
});
} else if (method.equals(BungeeMethod.MQTT)) {
// use MqttHander
try {
mqttHandler = new MqttHandler(new MqttServerComm(getConfig().getMqttClientID(),
getConfig().getMqttBrokerURL(), getConfig().getMqttUsername(), getConfig().getMqttPassword()),
2);
mqttHandler.subscribe(getConfig().getMqttPrefix() + "votingplugin/servers/proxy", new MessageHandler() {
@Override
public void onMessage(String topic, String payload) {
debug("Received mqtt message: " + topic + " - " + payload);
String[] message = payload.split(":");
if (message.length > 0) {
globalMessageProxyHandler.onMessage(message[0].toLowerCase(),
ArrayUtils.convertAndRemoveFirst(message));
}
}
});
} catch (MqttException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
currentVotePartyVotesRequired =
getConfig().getVotePartyVotesRequired() + getVoteCacheVotePartyIncreaseVotesRequired();
votePartyVotes = getVoteCacheCurrentVotePartyVotes();
globalMessageProxyHandler = new GlobalMessageProxyHandler() {
@Override
public void sendMessage(String server, int delay, String channel, String... messageData) {
switch (method) {
case MQTT:
sendMqttMessageServer(server, channel, messageData);
break;
case MYSQL:
// sendPluginMessageServer(server, channel, messageData);
try {
proxyMysqlMessenger.sendToBackend(server, channel + "%l%" + String.join("%l%", messageData));
} catch (SQLException e) {
e.printStackTrace();
}
break;
case PLUGINMESSAGING:
sendPluginMessageServer(server, delay, channel, messageData);
break;
case REDIS:
sendRedisMessageServer(server, channel, messageData);
break;
case SOCKETS:
ArrayList<String> data = new ArrayList<>();
data.add(channel);
data.addAll(ArrayUtils.convert(messageData));
sendServerMessageServer(server, ArrayUtils.convert(data));
break;
default:
break;
}
}
};
globalMessageProxyHandler.addListener(new GlobalMessageListener("login") {
@Override
public void onReceive(ArrayList<String> message) {
if (message.size() < 2) {
logSevere("Invalid login message received: " + message);
return;
}
String player = message.get(0);
String uuid = message.get(1);
String server = "";
if (message.size() > 2) {
server = message.get(2);
}
debug("Login: " + player + "/" + uuid + " " + server);
login(player, uuid, server);
}
});
globalMessageProxyHandler.addListener(new GlobalMessageListener("statusokay") {
@Override
public void onReceive(ArrayList<String> message) {
String server = message.get(0);
log("Status okay for " + server);
}
});
globalMessageProxyHandler.addListener(new GlobalMessageListener("voteupdate") {
@Override
public void onReceive(ArrayList<String> message) {
int delay = 1;
for (String send : getAllAvailableServers()) {
globalMessageProxyHandler.sendMessage(send, delay, "VoteUpdate", ArrayUtils.convert(message));
delay++;
}
}
});
loadMultiProxySupport();
}
@@ -730,7 +874,9 @@ public abstract class VotingPluginProxy {
public abstract void log(String message);
public void login(String playerName, String uuid, String serverName) {
addNonVotedPlayer(uuid, playerName);
if (getConfig().getOnlineMode()) { // no need to cache in offline mode
addNonVotedPlayer(uuid, playerName);
}
if (isPlayerOnline(playerName)) {
if (getConfig().getGlobalDataEnabled()) {
if (getGlobalDataHandler().isTimeChangedHappened()) {
@@ -752,6 +898,10 @@ public abstract class VotingPluginProxy {
public void onDisable() {
if (getProxyMysqlMessenger() != null) {
getProxyMysqlMessenger().shutdown();
}
if (getProxyMySQL() != null) {
getProxyMySQL().shutdown();
}
@@ -759,6 +909,20 @@ public abstract class VotingPluginProxy {
multiProxyHandler.close();
}
if (socketHandler != null) {
socketHandler.closeConnection();
}
if (redisHandler != null) {
redisHandler.close();
}
bungeeTimeChecker.shutdown();
if (getGlobalDataHandler() != null) {
getGlobalDataHandler().shutdown();
}
enabled = false;
}
@@ -768,8 +932,6 @@ public abstract class VotingPluginProxy {
@Override
public void run() {
try {
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(outstream);
String subchannel = "";
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
subchannel = encryptionHandler.decrypt(in.readUTF());
@@ -778,7 +940,7 @@ public abstract class VotingPluginProxy {
}
int size = in.readInt();
debug("Received plugin message, processing...");
debug("Received plugin message, processing..." + subchannel + " " + size);
String data = "";
if (size > 0) {
@@ -789,39 +951,9 @@ public abstract class VotingPluginProxy {
}
}
String[] list = data.split("/a/");
// check for status message returns
if (subchannel.equalsIgnoreCase("statusokay")) {
String server = list[0];
log("Status okay for " + server);
return;
} else if (subchannel.equalsIgnoreCase("TimeChangeFinished")) {
// not used currently
} else if (subchannel.equalsIgnoreCase("login")) {
String player = list[0];
String uuid = list[1];
String server = list[2];
debug("Login: " + player + "/" + uuid + " " + server);
login(player, uuid, server);
return;
} else if (subchannel.equalsIgnoreCase("VoteUpdate")) {
out.writeUTF(subchannel);
out.writeInt(size);
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
out.writeUTF(encryptionHandler.encrypt(data));
} else {
out.writeUTF(data);
}
for (String send : getAllAvailableServers()) {
if (isSomeoneOnlineServer(send)) {
sendPluginMessageData(send, getConfig().getPluginMessageChannel().toLowerCase(),
outstream.toByteArray(), false);
}
}
} else {
debug("Ignoring plugin message: " + subchannel);
if (list.length > 0) {
globalMessageProxyHandler.onMessage(subchannel.toLowerCase(), ArrayUtils.convert(list));
}
} catch (Exception e) {
e.printStackTrace();
@@ -876,46 +1008,54 @@ public abstract class VotingPluginProxy {
public abstract void reloadCore(boolean mysql);
public void sendMessageServer(String server, String channel, String... messageData) {
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
sendPluginMessageServer(server, channel, messageData);
} else if (method.equals(BungeeMethod.REDIS)) {
sendRedisMessageServer(server, channel, messageData);
}
}
/*
* public void sendMessageServer(String server, String channel, String...
* messageData) { if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
* sendPluginMessageServer(server, channel, messageData); } else if
* (method.equals(BungeeMethod.REDIS)) { sendRedisMessageServer(server, channel,
* messageData); } else if (method.equals(BungeeMethod.MQTT)) {
* sendMqttMessageServer(server, channel, messageData); } }
*/
public abstract void sendPluginMessageData(String server, String channel, byte[] data, boolean queue);
public void sendPluginMessageServer(String server, String channel, String... messageData) {
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(byteOutStream);
try {
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
out.writeUTF(encryptionHandler.encrypt(channel));
} else {
out.writeUTF(channel);
}
out.writeInt(messageData.length);
public void sendPluginMessageServer(String server, int delay, String channel, String... messageData) {
getScheduler().schedule(new Runnable() {
String data = "";
for (String message : messageData) {
data += message + "/a/";
@Override
public void run() {
ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(byteOutStream);
try {
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
out.writeUTF(encryptionHandler.encrypt(channel));
} else {
out.writeUTF(channel);
}
out.writeInt(messageData.length);
String data = "";
for (String message : messageData) {
data += message + "/a/";
}
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
out.writeUTF(encryptionHandler.encrypt(data));
} else {
out.writeUTF(data);
}
if (isSomeoneOnlineServer(server)) {
sendPluginMessageData(server, getConfig().getPluginMessageChannel().toLowerCase(),
byteOutStream.toByteArray(), false);
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
debug("Sending plugin message " + server + " " + channel + " "
+ ArrayUtils.makeStringList(ArrayUtils.convert(messageData)));
}
if (getConfig().getPluginMessageEncryption() && encryptionHandler != null) {
out.writeUTF(encryptionHandler.encrypt(data));
} else {
out.writeUTF(data);
}
if (isSomeoneOnlineServer(server)) {
sendPluginMessageData(server, getConfig().getPluginMessageChannel().toLowerCase(),
byteOutStream.toByteArray(), false);
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
debug("Sending plugin message " + server + " " + channel + " "
+ ArrayUtils.makeStringList(ArrayUtils.convert(messageData)));
}, delay * 5, TimeUnit.MILLISECONDS);
}
public void sendRedisMessageServer(String server, String channel, String... messageData) {
@@ -925,6 +1065,18 @@ public abstract class VotingPluginProxy {
redisHandler.sendMessage(getConfig().getRedisPrefix() + "VotingPlugin_" + server, ArrayUtils.convert(list));
}
public void sendMqttMessageServer(String server, String channel, String... messageData) {
ArrayList<String> list = new ArrayList<>();
list.add(channel);
list.addAll(ArrayUtils.convert(messageData));
try {
mqttHandler.publish(getConfig().getMqttPrefix() + "votingplugin/servers/" + server, String.join(":", list));
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendServerMessage(String... messageData) {
for (ClientHandler h : clientHandles.values()) {
h.sendMessage(messageData);
@@ -940,51 +1092,15 @@ public abstract class VotingPluginProxy {
public void sendServerNameMessage() {
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
for (String s : getAllAvailableServers()) {
sendPluginMessageServer(s, "ServerName", s);
sendPluginMessageServer(s, 1, "ServerName", s);
}
}
}
public void sendSocketVote(String name, String service, BungeeMessageData text) {
String uuid = getUUID(name);
if (getConfig().getSendVotesToAllServers()) {
sendServerMessage("bungeevote", uuid, name, service, text.toString(),
"" + getConfig().getBungeeManageTotals());
if (getConfig().getBroadcast()) {
sendServerMessage("BungeeBroadcast", service, uuid, name);
}
} else {
// online server only
String server = "";
if (isPlayerOnline(name)) {
server = getCurrentPlayerServer(name);
} else {
server = getConfig().getFallBack();
}
if (getConfig().getBlockedServers().contains(server)) {
server = getConfig().getFallBack();
}
sendServerMessageServer(server, "bungeevoteonline", uuid, name, service, text.toString(),
"" + getConfig().getBungeeManageTotals());
if (getConfig().getBroadcast()) {
sendServerMessage("BungeeBroadcast", service, uuid, name);
}
sendServerMessage("BungeeUpdate");
}
}
public void sendVoteParty(String server) {
if (isSomeoneOnlineServer(server)) {
if (method.equals(BungeeMethod.PLUGINMESSAGING) || method.equals(BungeeMethod.REDIS)) {
sendMessageServer(server, "VotePartyBungee");
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessageServer(server, "VotePartyBungee");
}
globalMessageProxyHandler.sendMessage(server, 1, "VotePartyBungee", "");
}
}
@@ -1009,20 +1125,117 @@ public abstract class VotingPluginProxy {
public abstract void setVoteCacheVotePartyIncreaseVotesRequired(int votes);
public void status() {
if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessage("status");
} else if (method.equals(BungeeMethod.PLUGINMESSAGING) || method.equals(BungeeMethod.REDIS)) {
for (String s : getAllAvailableServers()) {
if (!isSomeoneOnlineServer(s)) {
log("No players on server " + s
+ " to send test status message, please retest with someone online");
} else {
// send
log("Sending request for status message on " + s);
sendMessageServer(s, "Status", s);
for (String s : getAllAvailableServers()) {
if (!isSomeoneOnlineServer(s)) {
log("No players on server " + s + " to send test status message, please retest with someone online");
} else {
// send
log("Sending request for status message on " + s);
globalMessageProxyHandler.sendMessage(s, 1, "Status", s);
}
}
}
public String getWaitUntilDelaySiteFromService(String service) {
for (String site : getConfig().getWaitUntilVoteDelaySites()) {
if (getConfig().getWaitUntilVoteDelayService(site).equalsIgnoreCase(service)) {
return site;
}
}
return "";
}
private long getLastVotesTime(String uuid, ArrayList<Column> cols, String site, String service) {
long mostRecentTime = 0;
// Check cached online votes
if (cachedOnlineVotes.containsKey(uuid)) {
ArrayList<OfflineBungeeVote> onlineVotes = cachedOnlineVotes.get(uuid);
for (OfflineBungeeVote vote : onlineVotes) {
if (vote.getService().equalsIgnoreCase(service)) {
mostRecentTime = Math.max(mostRecentTime, vote.getTime());
}
}
}
// Check cached votes
for (ArrayList<OfflineBungeeVote> votes : cachedVotes.values()) {
for (OfflineBungeeVote vote : votes) {
if (vote.getUuid().equals(uuid) && vote.getService().equalsIgnoreCase(service)) {
mostRecentTime = Math.max(mostRecentTime, vote.getTime());
}
}
}
for (Column d : cols) {
if (d.getName().equalsIgnoreCase("LastVotes")) {
DataValue value = d.getValue();
String[] list = value.getString().split("%line%");
for (String str : list) {
String[] data = str.split("//");
if (data[0].equalsIgnoreCase(site)) {
mostRecentTime = Math.max(mostRecentTime, Long.valueOf(data[1]));
}
}
}
}
return mostRecentTime;
}
public boolean checkVoteDelay(String uuid, String service, ArrayList<Column> data) {
String site = getWaitUntilDelaySiteFromService(service);
if (site.isEmpty()) {
debug("No service site set for " + service + ", skipping vote delay check");
return true;
}
int voteDelay = getConfig().getWaitUntilVoteDelayVoteDelay(site);
int voteDelayMin = getConfig().getWaitUntilVoteDelayVoteDelayMin(site);
long lastVote = getLastVotesTime(uuid, data, site, service);
if (lastVote == 0) {
debug("No last vote time found for " + uuid + "/" + service + ", skipping vote delay check");
return true;
}
try {
LocalDateTime now = getBungeeTimeChecker().getTime();
LocalDateTime lastVoteTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(lastVote), ZoneId.systemDefault())
.plusHours(getConfig().getTimeHourOffSet());
if (!getConfig().getWaitUntilVoteDelayVoteDelayDaily(site)) {
if (voteDelay == 0 && voteDelayMin == 0) {
debug("Vote delay is 0 for " + site + ", skipping vote delay check");
return true;
}
LocalDateTime nextvote = lastVoteTime.plusHours((long) voteDelay).plusMinutes((long) voteDelayMin);
return now.isAfter(nextvote);
}
LocalDateTime resetTime = lastVoteTime.withHour(getConfig().getWaitUntilVoteDelayVoteDelayHour(site))
.withMinute(0).withSecond(0);
LocalDateTime resetTimeTomorrow = resetTime.plusHours(24);
if (lastVoteTime.isBefore(resetTime)) {
if (now.isAfter(resetTime)) {
debug("Vote delay is met for " + uuid + "/" + service + ", vote can be processed");
return true;
}
} else {
if (now.isAfter(resetTimeTomorrow)) {
debug("Vote delay is met for " + uuid + "/" + service + ", vote can be processed");
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
debug("Vote delay is not met for " + uuid + "/" + service + ", skipping vote");
return false;
}
public synchronized void vote(String player, String service, boolean realVote, boolean timeQueue, long queueTime,
@@ -1047,7 +1260,8 @@ public abstract class VotingPluginProxy {
if (uuid == null || uuid.isEmpty()) {
uuid = getUUID(player);
if (uuid.isEmpty() && !player.startsWith(getConfig().getBedrockPlayerPrefix())) {
if (uuid.isEmpty() && !getConfig().getBedrockPlayerPrefix().isEmpty()
&& !player.startsWith(getConfig().getBedrockPlayerPrefix())) {
String uuid1 = getUUID(getConfig().getBedrockPlayerPrefix() + player);
if (!uuid1.isEmpty()) {
debug("Detected bedrock player without prefix, adjusting...");
@@ -1107,6 +1321,11 @@ public abstract class VotingPluginProxy {
ArrayList<Column> data = getProxyMySQL()
.getExactQuery(new Column("uuid", new DataValueString(uuid)));
if (!checkVoteDelay(uuid, service, data)) {
log("Vote delay is not met for " + player + "/" + service + ", skipping vote");
return;
}
int allTimeTotal = getValue(data, "AllTimeTotal", 1);
int monthTotal = getValue(data, "MonthTotal", 1);
int dateMonthTotal = -1;
@@ -1160,71 +1379,69 @@ public abstract class VotingPluginProxy {
time = queueTime;
}
if (method.equals(BungeeMethod.PLUGINMESSAGING) || method.equals(BungeeMethod.REDIS)) {
if (getConfig().getSendVotesToAllServers()) {
for (String s : getAllAvailableServers()) {
boolean forceCache = false;
if (!isPlayerOnline(player) && getConfig().getWaitForUserOnline()) {
forceCache = true;
debug("Forcing vote to cache");
}
if (getConfig().getBroadcast()) {
sendMessageServer(s, "VoteBroadcast", uuid, player, service);
}
if (!isSomeoneOnlineServer(s) || forceCache) {
// cache
if (!cachedVotes.containsKey(s)) {
cachedVotes.put(s, new ArrayList<>());
}
ArrayList<OfflineBungeeVote> list = cachedVotes.get(s);
list.add(new OfflineBungeeVote(player, uuid, service, time, realVote, text.toString()));
cachedVotes.put(s, list);
debug("Caching vote for " + player + " on " + service + " for " + s);
} else {
// send
sendMessageServer(s, "Vote", player, uuid, service, "" + time, Boolean.TRUE.toString(),
"" + realVote, text.toString(), "" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + getConfig().getBroadcast(), "1",
"1");
}
if (getConfig().getSendVotesToAllServers()) {
for (String s : getAllAvailableServers()) {
boolean forceCache = false;
if (!isPlayerOnline(player) && getConfig().getWaitForUserOnline()) {
forceCache = true;
debug("Forcing vote to cache");
}
} else {
if (isPlayerOnline(player) && getAllAvailableServers().contains(getCurrentPlayerServer(player))) {
sendMessageServer(getCurrentPlayerServer(player), "VoteOnline", player, uuid, service,
"" + time, Boolean.TRUE.toString(), "" + realVote, text.toString(),
if (getConfig().getBroadcast()) {
globalMessageProxyHandler.sendMessage(s, 1, "VoteBroadcast", uuid, player, service);
}
if ((!isSomeoneOnlineServer(s) && method.requiresPlayerOnline()) || forceCache) {
// cache
if (!cachedVotes.containsKey(s)) {
cachedVotes.put(s, new ArrayList<>());
}
ArrayList<OfflineBungeeVote> list = cachedVotes.get(s);
list.add(new OfflineBungeeVote(player, uuid, service, time, realVote, text.toString()));
cachedVotes.put(s, list);
debug("Caching vote for " + player + " on " + service + " for " + s);
} else {
// send
globalMessageProxyHandler.sendMessage(s, 2, "Vote", player, uuid, service, "" + time,
Boolean.TRUE.toString(), "" + realVote, text.toString(),
"" + getConfig().getBungeeManageTotals(), "" + BungeeVersion.getPluginMessageVersion(),
"" + getConfig().getBroadcast(), "1", "1");
if (getConfig().getMultiProxySupport() && getConfig().getMultiProxyOneGlobalReward()) {
multiProxyHandler.sendMultiProxyServerMessage("ClearVote", player, uuid);
}
} else {
if (!cachedOnlineVotes.containsKey(uuid)) {
cachedOnlineVotes.put(uuid, new ArrayList<>());
}
ArrayList<OfflineBungeeVote> list = cachedOnlineVotes.get(uuid);
if (list == null) {
list = new ArrayList<>();
}
list.add(new OfflineBungeeVote(player, uuid, service, time, realVote, text.toString()));
cachedOnlineVotes.put(uuid, list);
debug("Caching online vote for " + player + " on " + service);
}
for (String s : getAllAvailableServers()) {
if (getConfig().getBroadcast()) {
sendMessageServer(s, "VoteBroadcast", uuid, player, service);
}
sendMessageServer(s, "VoteUpdate", uuid, "" + votePartyVotes,
"" + currentVotePartyVotesRequired, text.toString());
}
}
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendSocketVote(player, service, text);
} else {
if (isPlayerOnline(player) && getAllAvailableServers().contains(getCurrentPlayerServer(player))) {
globalMessageProxyHandler.sendMessage(getCurrentPlayerServer(player), 1, "VoteOnline", player, uuid,
service, "" + time, Boolean.TRUE.toString(), "" + realVote, text.toString(),
"" + getConfig().getBungeeManageTotals(), "" + BungeeVersion.getPluginMessageVersion(),
"" + getConfig().getBroadcast(), "1", "1");
if (getConfig().getMultiProxySupport() && getConfig().getMultiProxyOneGlobalReward()) {
multiProxyHandler.sendMultiProxyServerMessage("ClearVote", player, uuid);
}
} else {
if (!cachedOnlineVotes.containsKey(uuid)) {
cachedOnlineVotes.put(uuid, new ArrayList<>());
}
ArrayList<OfflineBungeeVote> list = cachedOnlineVotes.get(uuid);
if (list == null) {
list = new ArrayList<>();
}
list.add(new OfflineBungeeVote(player, uuid, service, time, realVote, text.toString()));
cachedOnlineVotes.put(uuid, list);
debug("Caching online vote for " + player + " on " + service);
}
int delay = 2;
for (String s : getAllAvailableServers()) {
if (getConfig().getBroadcast()) {
globalMessageProxyHandler.sendMessage(s, delay, "VoteBroadcast", uuid, player, service);
}
globalMessageProxyHandler.sendMessage(s, delay + 1, "VoteUpdate", uuid, "" + votePartyVotes,
"" + currentVotePartyVotesRequired, text.toString(), service, "" + time);
delay += 2;
}
}
if (getConfig().getMultiProxySupport() && getConfig().getPrimaryServer()) {
if (!getConfig().getMultiProxyOneGlobalReward()) {
debug("Seending global proxy vote message");
@@ -1251,4 +1468,6 @@ public abstract class VotingPluginProxy {
}
public abstract void warn(String message);
public abstract ScheduledExecutorService getScheduler();
}
@@ -70,6 +70,7 @@ public class VotingPluginProxyCommand {
return "&aChecking status via sockets. Check console for details.";
case PLUGINMESSAGING:
case MYSQL:
case REDIS:
plugin.status();
plugin.sendServerNameMessage();
@@ -28,6 +28,16 @@ public interface VotingPluginProxyConfig {
public boolean getDebug();
public String getMqttClientID();
public String getMqttBrokerURL();
public String getMqttUsername();
public String getMqttPassword();
public String getMqttPrefix();
public String getFallBack();
public boolean getGlobalDataEnabled();
@@ -120,6 +130,20 @@ public interface VotingPluginProxyConfig {
public List<String> getWhiteListedServers();
public Collection<String> getWaitUntilVoteDelaySites();
public String getWaitUntilVoteDelayService(String site);
public int getWaitUntilVoteDelayVoteDelay(String site);
public int getWaitUntilVoteDelayVoteDelayMin(String site);
public boolean getResetMilestonesMonthly();
public int getWaitUntilVoteDelayVoteDelayHour(String site);
public boolean getWaitUntilVoteDelayVoteDelayDaily(String site);
public void load();
public void save();
@@ -33,226 +33,306 @@ public class Config implements VotingPluginProxyConfig {
return map;
}
@Override
public boolean getAllowUnJoined() {
return getData().getBoolean("AllowUnJoined", false);
}
@Override
public String getBedrockPlayerPrefix() {
return getData().getString("BedrockPlayerPrefix", ".");
}
@Override
public List<String> getBlockedServers() {
return getData().getStringList("BlockedServers");
}
@Override
public boolean getBroadcast() {
return getData().getBoolean("Broadcast", false);
}
@Override
public String getBungeeHost() {
return getData().getString("BungeeServer.Host", "");
}
@Override
public boolean getBungeeManageTotals() {
return getData().getBoolean("BungeeManageTotals", true);
}
@Override
public String getBungeeMethod() {
return getData().getString("BungeeMethod", "SOCKETS");
}
@Override
public int getBungeePort() {
return getData().getInt("BungeeServer.Port", 1297);
}
@Override
public boolean getDebug() {
return getData().getBoolean("Debug", false);
}
@Override
public String getFallBack() {
return getData().getString("FallBackServer", "");
}
@Override
public boolean getGlobalDataEnabled() {
return getData().getBoolean("GlobalData.Enabled", false);
}
@Override
public boolean getGlobalDataUseMainMySQL() {
return getData().getBoolean("GlobalData.UseMainMySQL", true);
}
@Override
public int getLimitVotePoints() {
return getData().getInt("LimitVotePoints", -1);
}
@Override
public int getMaxAmountOfVotesPerDay() {
return getData().getInt("MaxAmountOfVotesPerDay", -1);
}
@Override
public String getMultiProxyMethod() {
return getData().getString("MultiProxyMethod", "SOCKET");
}
@Override
public boolean getMultiProxyOneGlobalReward() {
return getData().getBoolean("MultiProxyOneGlobalReward", false);
}
@Override
public String getMultiProxyRedisHost() {
return getData().getString("MultiProxyRedis.Host", "");
}
@Override
public String getMultiProxyRedisPassword() {
return getData().getString("MultiProxyRedis.Password", "");
}
@Override
public int getMultiProxyRedisPort() {
return getData().getInt("MultiProxyRedis.Port", 6379);
}
@Override
public boolean getMultiProxyRedisUseExistingConnection() {
return getData().getBoolean("MultiProxyRedis.UseExistingConnection", false);
}
@Override
public String getMultiProxyRedisUsername() {
return getData().getString("MultiProxyRedis.Username", "");
}
@Override
public Collection<String> getMultiProxyServers() {
return getData().getSection("MultiProxyServers").getKeys();
}
@Override
public Map<String, Object> getMultiProxyServersConfiguration(String s) {
return configToMap(getData().getSection("MultiProxyServers." + s));
}
@Override
public String getMultiProxySocketHostHost() {
return getData().getString("MultiProxySocketHost.Host", "");
}
@Override
public int getMultiProxySocketHostPort() {
return getData().getInt("MultiProxySocketHost.Port", 1297);
}
@Override
public boolean getMultiProxySupport() {
return getData().getBoolean("MultiProxySupport", false);
}
@Override
public boolean getOnlineMode() {
return getData().getBoolean("OnlineMode", true);
}
@Override
public int getPointsOnVote() {
return getData().getInt("PointsOnVote", 1);
}
@Override
public boolean getPrimaryServer() {
return getData().getBoolean("PrimaryServer", false);
}
@Override
public String getProxyServerName() {
return getData().getString("ProxyServerName", "SOCKET");
}
@Override
public List<String> getProxyServers() {
return getData().getStringList("ProxyServers");
}
@Override
public String getRedisHost() {
return getData().getString("Redis.Host", "");
}
@Override
public String getRedisPassword() {
return getData().getString("Redis.Password", "");
}
@Override
public int getRedisPort() {
return getData().getInt("Redis.Port", 6379);
}
@Override
public String getRedisPrefix() {
return getData().getString("Redis.Prefix", "");
}
@Override
public String getRedisUsername() {
return getData().getString("Redis.Username", "");
}
@Override
public boolean getSendVotesToAllServers() {
return getData().getBoolean("SendVotesToAllServers");
}
@Override
public Map<String, Object> getSpigotServerConfiguration(String s) {
return configToMap(getData().getSection("SpigotServers." + s));
}
@Override
public Collection<String> getSpigotServers() {
return getData().getSection("SpigotServers").getKeys();
}
@Override
public boolean getStoreMonthTotalsWithDate() {
return getData().getBoolean("StoreMonthTotalsWithDate", false);
}
@Override
public boolean getTimeChangeFailSafeBypass() {
return getData().getBoolean("TimeChangeFailSafeBypass", false);
}
@Override
public int getTimeHourOffSet() {
return getData().getInt("TimeHourOffSet");
}
@Override
public String getTimeZone() {
return getData().getString("TimeZone", "");
}
@Override
public boolean getUseMonthDateTotalsAsPrimaryTotal() {
return getData().getBoolean("UseMonthDateTotalsAsPrimaryTotal", false);
}
@Override
public boolean getUUIDLookup() {
return getData().getBoolean("UUIDLookup", true);
}
@Override
public int getVoteCacheTime() {
return getData().getInt("VoteCacheTime", -1);
}
@Override
public String getVotePartyBroadcast() {
return getData().getString("VoteParty.Broadcast", "");
}
@Override
public List<String> getVotePartyBungeeCommands() {
return getData().getStringList("VoteParty.BungeeCommands");
}
@Override
public boolean getVotePartyEnabled() {
return getData().getBoolean("VoteParty.Enabled", false);
}
@Override
public int getVotePartyIncreaseVotesRequired() {
return getData().getInt("VoteParty.IncreaseVotesRequired", 0);
}
@Override
public boolean getVotePartySendToAllServers() {
return getData().getBoolean("VoteParty.SendToAllServers", true);
}
@Override
public List<String> getVotePartyServersToSend() {
return getData().getStringList("VoteParty.ServersToSend");
}
@Override
public int getVotePartyVotesRequired() {
return getData().getInt("VoteParty.VotesRequired", 100);
}
@Override
public boolean getWaitForUserOnline() {
return getData().getBoolean("WaitForUserOnline", false);
return getData().getBoolean("WaitForUserOnline", true);
}
@Override
public List<String> getWhiteListedServers() {
return getData().getStringList("WhiteListedServers");
}
@Override
public String getMqttClientID() {
return getData().getString("MQTT.ClientID", "proxy");
}
@Override
public String getMqttBrokerURL() {
return getData().getString("MQTT.BrokerURL", "tcp://localhost:1883");
}
@Override
public String getMqttUsername() {
return getData().getString("MQTT.Username", "");
}
@Override
public String getMqttPassword() {
return getData().getString("MQTT.Password", "");
}
@Override
public String getMqttPrefix() {
return getData().getString("MQTT.Prefix", "");
}
public void load() {
if (!bungee.getDataFolder().exists()) {
bungee.getDataFolder().mkdir();
@@ -294,4 +374,39 @@ public class Config implements VotingPluginProxyConfig {
return getData().getBoolean("PluginMessageEncryption", false);
}
@Override
public Collection<String> getWaitUntilVoteDelaySites() {
return getData().getSection("WaitUntilVoteDelay").getKeys();
}
@Override
public String getWaitUntilVoteDelayService(String site) {
return getData().getString("WaitUntilVoteDelay." + site + ".ServiceSite", "");
}
@Override
public int getWaitUntilVoteDelayVoteDelay(String site) {
return getData().getInt("WaitUntilVoteDelay." + site + ".VoteDelay", 24);
}
@Override
public boolean getWaitUntilVoteDelayVoteDelayDaily(String site) {
return getData().getBoolean("WaitUntilVoteDelay." + site + ".VoteDelayDaily", false);
}
@Override
public int getWaitUntilVoteDelayVoteDelayHour(String site) {
return getData().getInt("WaitUntilVoteDelay." + site + ".VoteDelayDailyHour", 0);
}
@Override
public int getWaitUntilVoteDelayVoteDelayMin(String site) {
return getData().getInt("WaitUntilVoteDelay." + site + ".VoteDelayMin", 0);
}
@Override
public boolean getResetMilestonesMonthly() {
return getData().getBoolean("ResetMilestonesMonthly", false);
}
}
@@ -15,19 +15,21 @@ import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.advancedcore.api.user.userstorage.DataType;
import com.bencodez.advancedcore.api.user.userstorage.mysql.api.config.MysqlConfigBungee;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalDataHandlerProxy;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalMySQL;
import com.bencodez.advancedcore.bungeeapi.mysql.BungeeMySQL;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.simpleapi.sql.mysql.config.MysqlConfigBungee;
import com.bencodez.votingplugin.proxy.BungeeMethod;
import com.bencodez.votingplugin.proxy.BungeeVersion;
import com.bencodez.votingplugin.proxy.OfflineBungeeVote;
import com.bencodez.votingplugin.proxy.ProxyMysqlUserTable;
import com.bencodez.votingplugin.proxy.VotingPluginProxy;
import com.bencodez.votingplugin.proxy.VotingPluginProxyConfig;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
@@ -63,6 +65,9 @@ public class VotingPluginBungee extends Plugin implements Listener {
@Getter
private VotingPluginProxy votingPluginProxy;
@Getter
private ScheduledExecutorService timer;
public void debug(String msg) {
if (config.getDebug()) {
getLogger().info("Debug: " + msg);
@@ -136,7 +141,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
private void loadMysql() {
votingPluginProxy.setProxyMySQL(new BungeeMySQL(this, "VotingPlugin_Users", config.getData()) {
votingPluginProxy.setProxyMySQL(new ProxyMysqlUserTable("VotingPlugin_Users",
new MysqlConfigBungee(config.getData()), config.getDebug()) {
@Override
public void debug(SQLException e) {
@@ -144,6 +150,23 @@ public class VotingPluginBungee extends Plugin implements Listener {
e.printStackTrace();
}
}
@Override
public void logSevere(String string) {
getLogger().severe(string);
}
@Override
public void logInfo(String string) {
getLogger().info(string);
}
@Override
public void severe(String string) {
getLogger().severe(string);
}
});
ArrayList<String> servers = new ArrayList<>();
@@ -157,14 +180,14 @@ public class VotingPluginBungee extends Plugin implements Listener {
new GlobalMySQL("VotingPlugin_GlobalData", getVotingPluginProxy().getProxyMySQL().getMysql()) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
public void debugLog(String text) {
debug2(text);
}
@@ -175,7 +198,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
getLogger().severe(text);
}
@@ -206,11 +229,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
for (String s : getAvailableAllServers()) {
getVotingPluginProxy().getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (getVotingPluginProxy().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
getVotingPluginProxy().sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (getVotingPluginProxy().getMethod().equals(BungeeMethod.SOCKETS)) {
getVotingPluginProxy().sendServerMessage(s, "BungeeTimeChange");
}
getVotingPluginProxy().getGlobalMessageProxyHandler().sendMessage(s, 1, "BungeeTimeChange",
"");
}
getVotingPluginProxy().processQueue();
@@ -223,14 +243,14 @@ public class VotingPluginBungee extends Plugin implements Listener {
new MysqlConfigBungee(config.getData().getSection("GlobalData"))) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
public void debugLog(String text) {
debug2(text);
}
@@ -241,7 +261,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
getLogger().severe(text);
}
@@ -274,11 +294,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
for (String s : getAvailableAllServers()) {
getVotingPluginProxy().getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (getVotingPluginProxy().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
getVotingPluginProxy().sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (getVotingPluginProxy().getMethod().equals(BungeeMethod.SOCKETS)) {
getVotingPluginProxy().sendServerMessage(s, "BungeeTimeChange");
}
getVotingPluginProxy().getGlobalMessageProxyHandler().sendMessage(s, 1,
"BungeeTimeChange", "");
}
getVotingPluginProxy().processQueue();
@@ -395,6 +412,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
voteCacheFile.save();
nonVotedPlayersCache.save();
timer.shutdownNow();
getLogger().info("VotingPlugin disabled");
}
@@ -402,6 +421,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
@Override
public void onEnable() {
timer = Executors.newScheduledThreadPool(1);
getProxy().getPluginManager().registerListener(this, this);
config = new Config(this);
@@ -455,6 +476,11 @@ public class VotingPluginBungee extends Plugin implements Listener {
public String getUUID(String playerName) {
if (!config.getOnlineMode()) {
// correct casing
ProxiedPlayer p = getProxy().getPlayer(playerName);
if (p != null && p.isConnected()) {
playerName = p.getName();
}
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8))
.toString();
}
@@ -620,6 +646,11 @@ public class VotingPluginBungee extends Plugin implements Listener {
reloadPlugin(mysql);
}
@Override
public ScheduledExecutorService getScheduler() {
return timer;
}
};
try {
Class.forName("com.vexsoftware.votifier.bungee.events.VotifierEvent");
@@ -1,16 +1,16 @@
package com.bencodez.votingplugin.proxy.global.multiproxy;
package com.bencodez.votingplugin.proxy.multiproxy;
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import com.bencodez.advancedcore.api.misc.encryption.EncryptionHandler;
import com.bencodez.advancedcore.bungeeapi.redis.RedisHandler;
import com.bencodez.advancedcore.bungeeapi.redis.RedisListener;
import com.bencodez.advancedcore.bungeeapi.sockets.ClientHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketReceiver;
import com.bencodez.simpleapi.encryption.EncryptionHandler;
import com.bencodez.simpleapi.servercomm.redis.RedisHandler;
import com.bencodez.simpleapi.servercomm.redis.RedisListener;
import com.bencodez.simpleapi.servercomm.sockets.ClientHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketHandler;
import com.bencodez.simpleapi.servercomm.sockets.SocketReceiver;
import com.bencodez.votingplugin.proxy.BungeeMessageData;
import lombok.Getter;
@@ -83,7 +83,7 @@ public abstract class MultiProxyHandler {
if (getMultiProxySupportEnabled()) {
if (getMultiProxyMethod().equals(MultiProxyMethod.SOCKETS)) {
if (getEncryptionHandler() == null) {
setEncryptionHandler(new EncryptionHandler(new File(getPluginDataFolder(), "secretkey.key")));
setEncryptionHandler(new EncryptionHandler("VotingPlugin",new File(getPluginDataFolder(), "secretkey.key")));
}
if (multiproxySocketHandler != null) {
@@ -1,4 +1,4 @@
package com.bencodez.votingplugin.proxy.global.multiproxy;
package com.bencodez.votingplugin.proxy.multiproxy;
public enum MultiProxyMethod {
SOCKETS, REDIS;
@@ -1,4 +1,4 @@
package com.bencodez.votingplugin.proxy.global.multiproxy;
package com.bencodez.votingplugin.proxy.multiproxy;
public interface MultiProxyServerSocketConfiguration {
String getHost();
@@ -1,4 +1,4 @@
package com.bencodez.votingplugin.proxy.global.multiproxy;
package com.bencodez.votingplugin.proxy.multiproxy;
import java.util.Map;
@@ -1,4 +1,4 @@
package com.bencodez.votingplugin.proxy.global.multiproxy;
package com.bencodez.votingplugin.proxy.multiproxy;
import ninja.leaping.configurate.ConfigurationNode;
@@ -2,6 +2,7 @@ package com.bencodez.votingplugin.proxy.velocity;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -19,90 +20,113 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
super(file);
}
@Override
public boolean getAllowUnJoined() {
return getBoolean(getNode("AllowUnJoined"), false);
}
@Override
public String getBedrockPlayerPrefix() {
return getString(getNode("BedrockPlayerPrefix"), ".");
}
@Override
public List<String> getBlockedServers() {
return getStringList(getNode("BlockedServers"), new ArrayList<>());
}
@Override
public boolean getBroadcast() {
return getBoolean(getNode("Broadcast"), false);
}
@Override
public String getBungeeHost() {
return getString(getNode("BungeeServer", "Host"), "");
}
@Override
public boolean getBungeeManageTotals() {
return getBoolean(getNode("BungeeManageTotals"), true);
}
@Override
public String getBungeeMethod() {
return getString(getNode("BungeeMethod"), "PLUGINMESSAGING");
}
@Override
public int getBungeePort() {
return getInt(getNode("BungeeServer", "Port"), 1297);
}
@Override
public boolean getDebug() {
return getBoolean(getNode("Debug"), false);
}
@Override
public String getFallBack() {
return getString(getNode("FallBackServer"), "");
}
@Override
public boolean getGlobalDataEnabled() {
return getBoolean(getNode("GlobalData", "Enabled"), false);
}
@Override
public boolean getGlobalDataUseMainMySQL() {
return getBoolean(getNode("GlobalData", "UseMainMySQL"), true);
}
@Override
public int getLimitVotePoints() {
return getInt(getNode("LimitVotePoints"), -1);
}
@Override
public int getMaxAmountOfVotesPerDay() {
return getInt(getNode("MaxAmountOfVotesPerDay"), -1);
}
@Override
public String getMultiProxyMethod() {
return getString(getNode("MultiProxyMethod"), "SOCKET");
}
@Override
public boolean getMultiProxyOneGlobalReward() {
return getBoolean(getNode("MultiProxyOneGlobalReward"), false);
}
@Override
public String getMultiProxyRedisHost() {
return getString(getNode("MultiProxyRedis", "Host"), "");
}
@Override
public String getMultiProxyRedisPassword() {
return getString(getNode("MultiProxyRedis", "Password"), "");
}
@Override
public int getMultiProxyRedisPort() {
return getInt(getNode("MultiProxyRedis", "Port"), 6379);
}
@Override
public boolean getMultiProxyRedisUseExistingConnection() {
return getBoolean(getNode("MultiProxyRedis", "UseExistingConnection"), false);
}
@Override
public String getMultiProxyRedisUsername() {
return getString(getNode("MultiProxyRedis", "Username"), "");
}
@Override
public @NonNull List<String> getMultiProxyServers() {
return getChildrenAsList(getNode("MultiProxyServers"));
}
@@ -117,18 +141,22 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
return children;
}
@Override
public Map<String, Object> getMultiProxyServersConfiguration(String s) {
return configToMap(getNode("MultiProxyServers", s));
}
@Override
public String getMultiProxySocketHostHost() {
return getString(getNode("MultiProxySocketHost", "Host"), "");
}
@Override
public int getMultiProxySocketHostPort() {
return getInt(getNode("MultiProxySocketHost", "Port"), 1297);
}
@Override
public boolean getMultiProxySupport() {
return getBoolean(getNode("MultiProxySupport"), false);
}
@@ -137,54 +165,91 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
return getNode("MySQL");
}
@Override
public boolean getOnlineMode() {
return getBoolean(getNode("OnlineMode"), true);
}
@Override
public int getPointsOnVote() {
return getInt(getNode("PointsOnVote"), 1);
}
@Override
public boolean getPrimaryServer() {
return getBoolean(getNode("PrimaryServer"), false);
}
@Override
public String getProxyServerName() {
return getString(getNode("ProxyServerName"), "SOCKET");
}
@Override
public List<String> getProxyServers() {
return getStringList(getNode("ProxyServers"), new ArrayList<>());
}
@Override
public String getRedisHost() {
return getString(getNode("Redis", "Host"), "");
}
@Override
public String getRedisPassword() {
return getString(getNode("Redis", "Password"), "");
}
@Override
public int getRedisPort() {
return getInt(getNode("Redis", "Port"), 6379);
}
@Override
public String getRedisPrefix() {
return getString(getNode("Redis", "Prefix"), "");
}
@Override
public String getRedisUsername() {
return getString(getNode("Redis", "Username"), "");
}
@Override
public boolean getSendVotesToAllServers() {
return getBoolean(getNode("SendVotesToAllServers"), true);
}
@Override
public Map<String, Object> getSpigotServerConfiguration(String s) {
return configToMap(getNode("SpigotServers", s));
}
@Override
public String getMqttClientID() {
return getString(getNode("MQTT", "ClientID"), "proxy");
}
@Override
public String getMqttBrokerURL() {
return getString(getNode("MQTT", "BrokerURL"), "tcp://localhost:1883");
}
@Override
public String getMqttUsername() {
return getString(getNode("MQTT", "Username"), "");
}
@Override
public String getMqttPassword() {
return getString(getNode("MQTT", "Password"), "");
}
@Override
public String getMqttPrefix() {
return getString(getNode("MQTT", "Prefix"), "");
}
public Map<String, Object> configToMap(ConfigurationNode config) {
Map<String, Object> map = new HashMap<>();
if (config != null) {
@@ -195,42 +260,52 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
return map;
}
@Override
public @NonNull List<String> getSpigotServers() {
return getChildrenAsList(getNode("SpigotServers"));
}
@Override
public boolean getStoreMonthTotalsWithDate() {
return getBoolean(getNode("StoreMonthTotalsWithDate"), false);
}
@Override
public boolean getTimeChangeFailSafeBypass() {
return getBoolean(getNode("TimeChangeFailSafeBypass"), false);
}
@Override
public boolean getUseMonthDateTotalsAsPrimaryTotal() {
return getBoolean(getNode("UseMonthDateTotalsAsPrimaryTotal"), false);
}
@Override
public boolean getUUIDLookup() {
return getBoolean(getNode("UUIDLookup"), true);
}
@Override
public int getVoteCacheTime() {
return getInt(getNode("VoteCacheTime"), -1);
}
@Override
public String getVotePartyBroadcast() {
return getString(getVotePartyNode().getNode("Broadcast"), "");
}
@Override
public List<String> getVotePartyBungeeCommands() {
return getStringList(getVotePartyNode().getNode("BungeeCommands"), new ArrayList<>());
}
@Override
public boolean getVotePartyEnabled() {
return getBoolean(getVotePartyNode().getNode("Enabled"), false);
}
@Override
public int getVotePartyIncreaseVotesRequired() {
return getInt(getVotePartyNode().getNode("IncreaseVotesRequired"), 0);
}
@@ -239,22 +314,27 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
return getNode("VoteParty");
}
@Override
public boolean getVotePartySendToAllServers() {
return getBoolean(getVotePartyNode().getNode("SendToAllServers"), false);
}
@Override
public List<String> getVotePartyServersToSend() {
return getStringList(getVotePartyNode().getNode("ServersToSend"), new ArrayList<>());
}
@Override
public int getVotePartyVotesRequired() {
return getInt(getVotePartyNode().getNode("VotesRequired"), 100);
}
@Override
public boolean getWaitForUserOnline() {
return getBoolean(getNode("WaitForUserOnline"), false);
return getBoolean(getNode("WaitForUserOnline"), true);
}
@Override
public List<String> getWhiteListedServers() {
return getStringList(getNode("WhiteListedServers"), new ArrayList<>());
}
@@ -285,4 +365,39 @@ public class Config extends VelocityYMLFile implements VotingPluginProxyConfig {
return getBoolean(getNode("PluginMessageEncryption"), false);
}
@Override
public Collection<String> getWaitUntilVoteDelaySites() {
return getChildrenAsList(getNode("WaitUntilVoteDelay"));
}
@Override
public String getWaitUntilVoteDelayService(String site) {
return getString(getNode("WaitUntilVoteDelay", site, "ServiceSite"), "");
}
@Override
public int getWaitUntilVoteDelayVoteDelay(String site) {
return getInt(getNode("WaitUntilVoteDelay", site, "VoteDelay"), 24);
}
@Override
public boolean getWaitUntilVoteDelayVoteDelayDaily(String site) {
return getBoolean(getNode("WaitUntilVoteDelay", site, "VoteDelayDaily"), false);
}
@Override
public int getWaitUntilVoteDelayVoteDelayHour(String site) {
return getInt(getNode("WaitUntilVoteDelay", site, "VoteDelayDailyHour"), 0);
}
@Override
public int getWaitUntilVoteDelayVoteDelayMin(String site) {
return getInt(getNode("WaitUntilVoteDelay", site, "VoteDelayMin"), 0);
}
@Override
public boolean getResetMilestonesMonthly() {
return getBoolean(getNode("ResetMilestonesMonthly"), false);
}
}
@@ -31,15 +31,15 @@ import org.bstats.velocity.Metrics;
import org.slf4j.Logger;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.advancedcore.api.user.userstorage.DataType;
import com.bencodez.advancedcore.api.user.userstorage.mysql.api.config.MysqlConfigVelocity;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalDataHandlerProxy;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalMySQL;
import com.bencodez.advancedcore.bungeeapi.mysql.VelocityMySQL;
import com.bencodez.simpleapi.file.velocity.VelocityYMLFile;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.simpleapi.sql.mysql.config.MysqlConfigVelocity;
import com.bencodez.votingplugin.proxy.BungeeMethod;
import com.bencodez.votingplugin.proxy.BungeeVersion;
import com.bencodez.votingplugin.proxy.OfflineBungeeVote;
import com.bencodez.votingplugin.proxy.ProxyMysqlUserTable;
import com.bencodez.votingplugin.proxy.VotingPluginProxy;
import com.bencodez.votingplugin.proxy.VotingPluginProxyConfig;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
@@ -59,9 +59,10 @@ import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.scheduler.ScheduledTask;
import lombok.Getter;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import ninja.leaping.configurate.ConfigurationNode;
import ninja.leaping.configurate.yaml.YAMLConfigurationLoader;
@@ -191,20 +192,31 @@ public class VotingPluginVelocity {
}
private void loadMysql() {
votingPluginProxy.setProxyMySQL(new VelocityMySQL("VotingPlugin_Users", config) {
votingPluginProxy.setProxyMySQL(
new ProxyMysqlUserTable("VotingPlugin_Users", new MysqlConfigVelocity(config), config.getDebug()) {
@Override
public void debug(SQLException e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(SQLException e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void severe(String str) {
getLogger().error(str);
}
});
@Override
public void severe(String str) {
getLogger().error(str);
}
@Override
public void logSevere(String string) {
logger.error(string);
}
@Override
public void logInfo(String string) {
logger.info(string);
}
});
ArrayList<String> servers = new ArrayList<>();
for (String s : getAvailableAllServers()) {
@@ -217,14 +229,14 @@ public class VotingPluginVelocity {
new GlobalMySQL("VotingPlugin_GlobalData", getVotingPluginProxy().getProxyMySQL().getMysql()) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
public void debugLog(String text) {
debug2(text);
}
@@ -234,7 +246,7 @@ public class VotingPluginVelocity {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
logger.error(text);
}
@@ -265,11 +277,8 @@ public class VotingPluginVelocity {
}
for (String s : getAvailableAllServers()) {
getVotingPluginProxy().getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (getVotingPluginProxy().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
getVotingPluginProxy().sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (getVotingPluginProxy().getMethod().equals(BungeeMethod.SOCKETS)) {
getVotingPluginProxy().sendServerMessage(s, "BungeeTimeChange");
}
getVotingPluginProxy().getGlobalMessageProxyHandler().sendMessage(s, 1, "BungeeTimeChange",
"");
}
getVotingPluginProxy().processQueue();
@@ -280,14 +289,14 @@ public class VotingPluginVelocity {
new GlobalMySQL("VotingPlugin_GlobalData", new MysqlConfigVelocity("GlobalData", config)) {
@Override
public void debug(Exception e) {
public void debugEx(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
public void debugLog(String text) {
debug2(text);
}
@@ -297,7 +306,7 @@ public class VotingPluginVelocity {
}
@Override
public void severe(String text) {
public void logSevere(String text) {
logger.error(text);
}
@@ -328,11 +337,8 @@ public class VotingPluginVelocity {
}
for (String s : getAvailableAllServers()) {
getVotingPluginProxy().getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (getVotingPluginProxy().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
getVotingPluginProxy().sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (getVotingPluginProxy().getMethod().equals(BungeeMethod.SOCKETS)) {
getVotingPluginProxy().sendServerMessage(s, "BungeeTimeChange");
}
getVotingPluginProxy().getGlobalMessageProxyHandler().sendMessage(s, 1, "BungeeTimeChange",
"");
}
getVotingPluginProxy().processQueue();
@@ -440,17 +446,27 @@ public class VotingPluginVelocity {
num++;
}
}
getVotingPluginProxy().onDisable();
voteCacheFile.save();
nonVotedPlayersCache.save();
getVotingPluginProxy().onDisable();
if (voteCheckTask != null)
voteCheckTask.cancel();
if (cacheSaveTask != null)
cacheSaveTask.cancel();
timer.shutdownNow();
logger.info("VotingPlugin disabled");
}
@Getter
public VotingPluginProxy votingPluginProxy;
private ScheduledTask voteCheckTask;
private ScheduledTask cacheSaveTask;
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
File configFile = new File(dataDirectory.toFile(), "bungeeconfig.yml");
@@ -496,7 +512,8 @@ public class VotingPluginVelocity {
@Override
public void broadcast(String message) {
server.getAllPlayers().forEach(player -> player.sendMessage(Component.text(message)));
server.getAllPlayers().forEach(
player -> player.sendMessage(LegacyComponentSerializer.legacyAmpersand().deserialize(message)));
}
@Override
@@ -539,6 +556,18 @@ public class VotingPluginVelocity {
public String getUUID(String playerName) {
if (!config.getOnlineMode()) {
// correct case
if (server.getPlayer(playerName).isPresent()) {
Player p = server.getPlayer(playerName).get();
if (p != null && p.isActive()) {
playerName = p.getUsername();
}
}
for (Entry<UUID, String> entry : getVotingPluginProxy().getUuidPlayerNameCache().entrySet()) {
if (entry.getValue().equalsIgnoreCase(playerName)) {
playerName = entry.getValue();
}
}
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8))
.toString();
}
@@ -715,6 +744,11 @@ public class VotingPluginVelocity {
reloadPlugin(mysql);
}
@Override
public ScheduledExecutorService getScheduler() {
return timer;
}
};
try {
@@ -822,7 +856,7 @@ public class VotingPluginVelocity {
voteCacheFile.clearData();
server.getScheduler().buildTask(this, () -> {
voteCheckTask = server.getScheduler().buildTask(this, () -> {
if (getVotingPluginProxy().getGlobalDataHandler() == null
|| !getVotingPluginProxy().getGlobalDataHandler().isTimeChangedHappened()) {
for (String server : getVotingPluginProxy().getCachedVotes().keySet()) {
@@ -838,7 +872,7 @@ public class VotingPluginVelocity {
}
}).delay(120, TimeUnit.SECONDS).repeat(60, TimeUnit.SECONDS).schedule();
server.getScheduler().buildTask(this, () -> {
cacheSaveTask = server.getScheduler().buildTask(this, () -> {
if (nonVotedPlayersCache != null) {
debug("Checking nonvotedplayerscache.yml...");
nonVotedPlayersCache.check();
@@ -28,11 +28,11 @@ import com.bencodez.advancedcore.api.time.events.MonthChangeEvent;
import com.bencodez.advancedcore.api.time.events.PreDateChangedEvent;
import com.bencodez.advancedcore.api.time.events.WeekChangeEvent;
import com.bencodez.advancedcore.api.user.UserStorage;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.advancedcore.api.user.userstorage.DataType;
import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.simpleapi.file.YMLFileHandler;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.user.VotingPluginUser;
@@ -15,7 +15,7 @@ import com.bencodez.advancedcore.api.user.usercache.UserDataManager;
import com.bencodez.advancedcore.api.user.usercache.keys.UserDataKeyBoolean;
import com.bencodez.advancedcore.api.user.usercache.keys.UserDataKeyInt;
import com.bencodez.advancedcore.api.user.usercache.keys.UserDataKeyString;
import com.bencodez.advancedcore.api.user.userstorage.Column;
import com.bencodez.simpleapi.sql.Column;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.topvoter.TopVoter;
@@ -24,9 +24,9 @@ import com.bencodez.advancedcore.api.misc.MiscUtils;
import com.bencodez.advancedcore.api.rewards.RewardBuilder;
import com.bencodez.advancedcore.api.rewards.RewardOptions;
import com.bencodez.advancedcore.api.user.AdvancedCoreUser;
import com.bencodez.advancedcore.api.user.usercache.value.DataValue;
import com.bencodez.advancedcore.api.user.usercache.value.DataValueInt;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.simpleapi.sql.data.DataValue;
import com.bencodez.simpleapi.sql.data.DataValueInt;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.PlayerReceivePointsEvent;
import com.bencodez.votingplugin.events.PlayerVoteEvent;
@@ -1389,6 +1389,9 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
}
Player player = getPlayer();
if (!plugin.getOptions().isOnlineMode()) {
player = Bukkit.getPlayer(getPlayerName());
}
if (player == null) {
return;
}
@@ -1823,6 +1826,12 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
*/
public void setTime(VoteSite voteSite, Long time) {
HashMap<VoteSite, Long> lastVotes = getLastVotes();
if (lastVotes != null && lastVotes.containsKey(voteSite)) {
if (lastVotes.get(voteSite).longValue() == time.longValue()) {
plugin.debug("Not setting last vote time for " + voteSite.getKey() + ", already set to " + time);
return;
}
}
lastVotes.put(voteSite, time);
setLastVotes(lastVotes);
}
@@ -20,9 +20,9 @@ import com.bencodez.advancedcore.api.rewards.RewardBuilder;
import com.bencodez.advancedcore.api.time.events.DayChangeEvent;
import com.bencodez.advancedcore.api.time.events.MonthChangeEvent;
import com.bencodez.advancedcore.api.time.events.WeekChangeEvent;
import com.bencodez.advancedcore.api.user.userstorage.DataType;
import com.bencodez.simpleapi.array.ArrayUtils;
import com.bencodez.simpleapi.messages.MessageAPI;
import com.bencodez.simpleapi.sql.DataType;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.VotePartyEvent;
import com.bencodez.votingplugin.user.VotingPluginUser;
@@ -11,10 +11,11 @@ UseBungeecord: false
# Requires restart and set on all servers
# https://github.com/BenCodez/VotingPlugin/wiki/Bungeecord-Setups
# Available:
# SOCKETS
# PLUGINMESSAGING (Recommended)
# MYSQL
# REDIS (2nd Most Recommended)
# MQTT
# MYSQL
# SOCKETS (Not recommended)
BungeeMethod: PLUGINMESSAGING
# Use Redis for between server communication, set BungeeMethod to REDIS to use this
@@ -26,6 +27,16 @@ Redis:
Password: ''
# Set a prefix from an entire proxy network if using multi-proxy setup below
Prefix: ''
MQTT:
# clientid must be unique on each server
# Default will use the server name below
#ClientID: 'server1'
BrokerURL: "tcp://localhost:1883"
Username: ''
Password: ''
# Set a prefix from an entire proxy network if using mutli-proxy setup below
Prefix: ''
# Enables more debug messages for communication between servers
# Use /votingpluginbungee status for testing communication
+62 -2
View File
@@ -480,8 +480,8 @@ TreatVanishAsOffline: false
# In miliseconds, 1000 = 1 second
DelayLoginEvent: 0
# Wait until user is logged in with AuthMe
# Requires AuthMe or LoginSecurity
# Wait until user is logged in with AuthMe or NLogin
# Requires AuthMe or LoginSecurity or NLogin
WaitUntilLoggedIn: true
###########################################
@@ -569,6 +569,9 @@ OnlineMode: true
# Disable javascript processing in messages/rewards
DisableJavascript: false
# Enable command /av javascript (javascript)
EnableJavascriptCommand: false
# If true, number of vote shop purchases will be tracked
# Data will be tracked in serverdata.yml, may change in the future
# No commands to view data currently
@@ -611,6 +614,63 @@ StoreMonthTotalsWithDate: false
# This setting may be very buggy as it's in early stages
UseMonthDateTotalsAsPrimaryTotal: false
###########################################
# DiscordSRV settings
###########################################
DiscordSRV:
# Enable DiscordSRV support
# Also enables using rewards in discord
Enabled: false
# Show live top voter counts in discord
TopVoter:
AllTime:
# If true, will send top voter messages to discord
# Will send a message show top 10 voters
Enabled: false
# DiscordSRV channel to send messages to
Channel: 1234565 # Replace with your channel ID
Title: 'All Time Top Voters'
RankDisplay: '%rank%: &6%player% - %votes% Votes'
Monthly:
# If true, will send top voter messages to discord
# Will send a message show top 10 voters
Enabled: false
# DiscordSRV channel to send messages to
Channel: 1234565 # Replace with your channel ID
Title: 'Top Voters of the Month'
RankDisplay: '%rank%: &6%player% - %votes% Votes'
Weekly:
# If true, will send top voter messages to discord
# Will send a message show top 10 voters
Enabled: false
# DiscordSRV channel to send messages to
Channel: 1234565 # Replace with your channel ID
Title: 'Top Voters of the Week'
RankDisplay: '%rank%: &6%player% - %votes% Votes'
Daily:
# If true, will send top voter messages to discord
# Will send a message show top 10 voters
Enabled: false
# DiscordSRV channel to send messages to
Channel: 1234565 # Replace with your channel ID
Title: 'Top Voters of the Day'
RankDisplay: '%rank%: &6%player% - %votes% Votes'
###########################################
# Skull settings
###########################################
@@ -55,9 +55,7 @@ GlobalData:
#Attempt to use mariadb driver
#UseMariaDB: false
# Time offset for time changes
# Must match on all servers
TimeHourOffSet: 0
####################################################################################
@@ -79,12 +77,22 @@ WhiteListedServers: []
# Requires restart and set on all servers
# https://github.com/BenCodez/VotingPlugin/wiki/Bungeecoord-Setups
# Available:
# SOCKETS
# PLUGINMESSAGING (Recommended)
# MYSQL
# REDIS
# MQTT
# SOCKETS
# MYSQL (Not recommended)
BungeeMethod: PLUGINMESSAGING
######################################################################################
# Settings for each setup below
###########################################
# PLUGINMESSAGING settings
###########################################
# Default is vp:vp, can be changed to prevent potential exploits
# Must match on all servers
# This setting requires a restart
@@ -96,6 +104,10 @@ PluginMessageChannel: "vp:vp"
# This setting requires a restart
PluginMessageEncryption: false
###########################################
# REDIS Settings
###########################################
# Use Redis for between server communication, set BungeeMethod to REDIS to use this
Redis:
Host: localhost
@@ -104,6 +116,33 @@ Redis:
Password: ''
# Set a prefix from an entire proxy network if using mutli-proxy setup below
Prefix: ''
###########################################
# SOCKETS Settings
###########################################
# Settings hidden to avoid confusion, highly recommend other methods first
# Settings available here https://github.com/BenCodez/VotingPlugin/wiki/Bungee-Setup-SOCKETS
###########################################
# MQTT Settings
###########################################
MQTT:
# clientid must be unique on each server
ClientID: 'proxy'
BrokerURL: "tcp://localhost:1883"
Username: ''
Password: ''
# Set a prefix from an entire proxy network if using mutli-proxy setup below
Prefix: ''
######################################################################################
# Votes will be forwarded when specific player is online
# If set to false, rewards should still reward when player logs in even when false
# but it can fail to reward, this setting has no effect if sendtoallservers is false
WaitForUserOnline: true
# If false, votes will be checked if user is a valid player that has joined to server
# Works for PLUGINMESSAGING and SOCKETS methods only
@@ -121,7 +160,7 @@ BungeeManageTotals: true
# Tell servers to broadcast
# Set DisableBroadcast to true on spigot servers (BungeeSettings.yml) as well
Broadcast: true
Broadcast: false
# Geyser/bedrock player settings
# https://github.com/BenCodez/VotingPlugin/wiki/Bedrock-Player-Support
@@ -142,6 +181,10 @@ MaxAmountOfVotesPerDay: -1
# Maxium amount of vote points possible, -1 to disable
LimitVotePoints: -1
# Time offset for time changes
# Must match on all servers
TimeHourOffSet: 0
VoteParty:
# If enabled, will trigger vote party reward
# in BungeeSettings.yml under BungeeVotePartyReward
@@ -161,18 +204,32 @@ VoteParty:
Broadcast: '&aVote party has been reached!'
# Online mode for UUIDS
# Offline mode setups are not fully tested and are not supported currently
# If using mixed uuids (premium and cracked players leave this enabled and disable UUIDLookup below)
# More details here: https://github.com/BenCodez/VotingPlugin/wiki/Online-Offline-Mode
OnlineMode: true
# If true plugin will atempt to lookup uuids if none exist
UUIDLookup: true
# Should be enabled if enabled on backend servers
ResetMilestonesMonthly: false
# If you use this plugin will ignore votes from these service sites for said amount of time
WaitUntilVoteDelay:
# sitename must match what's in VoteSites.yml on backend servers
SITENAME:
# Set service site here and vote delay
ServiceSite: SERVICESITE
VoteDelay: 24
VoteDelayMin: 0
# If true it resets based on the day isntead
VoteDelayDaily: false
VoteDelayDailyHour: 0
###########################################
# Month Date Totals
# Experimental feature
# Settings must match on backend servers
# https://github.com/BenCodez/VotingPlugin/wiki/Month-Date-Totals
###########################################
# Experimental
@@ -188,15 +245,6 @@ StoreMonthTotalsWithDate: false
# This setting may be very buggy as it's in early stages
UseMonthDateTotalsAsPrimaryTotal: false
##########################################
# PLUGINMESSAGING Settings
##########################################
# Applies to PLUGINMESSAGING only
# Votes will be forwarded when specific player is online
# If set to false, rewards should still reward when player logs in (by default)
WaitForUserOnline: false
##########################################
# Multi-proxy setup
@@ -223,7 +271,7 @@ MultiProxyOneGlobalReward: false
MultiProxyMethod: SOCKET
##########################################
# REDIS Settings
# REDIS multi-proxy settings
##########################################
# Set multiproxymethod to REDIS to use redis
@@ -247,7 +295,7 @@ ProxyServers:
- proxy3
##########################################
# SOCKET settings for mutli-proxy
# SOCKET multi-proxy settings
##########################################
# Set this for each proxy
+2 -5
View File
@@ -17,6 +17,8 @@ softdepend:
- SuperVanish
- PremiumVanish
- LuckPerms
- nLogin
- DiscordSRV
loadbefore:
- MCPerks
api-version: 1.13
@@ -85,9 +87,6 @@ commands:
votechoices:
description: A command
alaises: vchoices
votegivepoints:
description: A command
alaises: vgivepoints
adminvotehelp:
description: Open adminvote help
aliases: avhelp
@@ -170,8 +169,6 @@ commands:
adminvoteresyncmilestonesalreadygiven:
description: Command Alias
aliases: avresyncmilestonesalreadygiven
votesetprimaryaccount:
description: Command Alias
adminvoteclearofflinevotes:
description: Command Alias
aliases: avclearofflinevotes
@@ -2,14 +2,9 @@
package com.bencodez.votingplugin.tests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;
import java.io.FileNotFoundException;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
@@ -18,10 +13,10 @@ import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalDataHandlerProxy;
import com.bencodez.advancedcore.bungeeapi.mysql.ProxyMySQL;
import com.bencodez.votingplugin.proxy.ProxyMysqlUserTable;
import com.bencodez.votingplugin.proxy.VotingPluginProxy;
import com.bencodez.votingplugin.proxy.VotingPluginProxyConfig;
import com.bencodez.votingplugin.proxy.global.multiproxy.MultiProxyHandler;
import com.bencodez.votingplugin.proxy.multiproxy.MultiProxyHandler;
public class VotingPluginProxyTest {
@@ -29,7 +24,7 @@ public class VotingPluginProxyTest {
private VotingPluginProxyTestImpl votingPluginProxy;
@Mock
private ProxyMySQL proxyMySQL;
private ProxyMysqlUserTable proxyMySQL;
@Mock
private VotingPluginProxyConfig config;
@@ -72,37 +67,7 @@ public class VotingPluginProxyTest {
assertEquals(1, spyProxy.getVotePartyVotes());
}
@Test
void testFetchUUID_Success() throws Exception {
String playerName = "TestPlayer";
String apiResponse = "{\"id\":\"aed922d6-5f64-43ce-8b98-efa8e4e288d3\",\"name\":\"TestPlayer\"}";
// Mock the URL connection and response
HttpURLConnectionMock.setupMockHttpURLConnection(playerName, 200, apiResponse);
UUID uuid = votingPluginProxy.fetchUUID(playerName);
assertNotNull(uuid);
assertEquals("aed922d6-5f64-43ce-8b98-efa8e4e288d3", uuid.toString());
}
@Test
void testFetchUUID_NotFound() throws Exception {
String playerName = "NonExistentPlayer";
String apiResponse = "{}";
// Mock the URL connection and response
HttpURLConnectionMock.setupMockHttpURLConnection(playerName, 400, apiResponse);
UUID uuid = null;
try {
uuid = votingPluginProxy.fetchUUID(playerName);
} catch (FileNotFoundException e) {
// Expected exception for non-existent player
}
assertNull(uuid);
}
@Test
void testAddCurrentVotePartyVotes() {
@@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ScheduledExecutorService;
import org.mockito.Mockito;
@@ -199,4 +200,9 @@ public class VotingPluginProxyTestImpl extends VotingPluginProxy {
// TODO Auto-generated method stub
}
@Override
public ScheduledExecutorService getScheduler() {
return null;
}
}