Compare commits

...
132 Commits
Author SHA1 Message Date
BenCodez ce5c469637 Update to 6.11.3 2023-03-18 19:17:00 -04:00
BenCodez 4126c4a7a1 Change default maven profile 2023-03-18 16:03:30 -04:00
Ben fb430a930b Create jitpack.yml 2023-03-18 15:57:25 -04:00
BenCodez 2c6f8c79c2 Shutdown multiproxy socket on reload if disabled 2023-03-18 14:52:23 -04:00
BenCodez 1b94f23ff2 Remove softdepend 2023-03-16 17:16:19 -04:00
BenCodez 72c0a88fc1 Load multiproxy support on reload 2023-03-15 16:49:19 -04:00
BenCodez e532987c6a Update to 1.19.4 2023-03-14 16:55:04 -04:00
BenCodez 2168d92b12 Cache almostallsites key 2023-03-07 18:46:26 -05:00
BenCodez d68758f34e Optimize placeholder caching updates 2023-03-05 17:12:32 -05:00
BenCodez e1b7844501 Undo change to bungee handling 2023-03-05 12:39:05 -05:00
BenCodez 01b6ed185b Changes to handling bungee votes 2023-03-04 18:56:35 -05:00
BenCodez 3ee31012ce Update version number to 6.11.2 2023-02-18 19:09:15 -05:00
BenCodez ba312961b8 Optimize player vote event even more 2023-02-12 20:20:50 -05:00
BenCodez a2484969ee Improve vote handling to deal with large databases 2023-02-12 18:51:32 -05:00
BenCodez 470196741c Improve getting user object 2023-02-12 17:17:23 -05:00
BenCodez 2abce5ebe7 Improve background task 2023-02-12 17:14:33 -05:00
BenCodez 20f775c119 Don't always run login/logout rewards unless needed 2023-02-12 13:53:04 -05:00
BenCodez e0821ed2b1 Minor log message change 2023-02-11 21:19:17 -05:00
BenCodez 6fbcc89fc8 Optimize player vote listener slightly 2023-02-11 17:51:13 -05:00
BenCodez 11f86194b0 Changes to how reload is handled 2023-02-11 15:55:21 -05:00
BenCodez 46c112d2ea Don't reload background task on plugin reload 2023-02-10 21:18:07 -05:00
BenCodez 0269578e5e More changes to background task 2023-02-10 21:17:17 -05:00
BenCodez fc14b19d9f Changes to vote processing 2023-02-10 21:11:49 -05:00
BenCodez 9c25f848c6 Add another test command 2023-02-09 19:16:50 -05:00
BenCodez b7f53aabfb Bug fix 2023-02-08 16:57:02 -05:00
BenCodez 926a009085 Remove extra checks 2023-02-08 16:54:34 -05:00
BenCodez f0737861de Add support for whitelist instead of blocked list on proxy 2023-02-07 19:55:00 -05:00
BenCodez 8e14a92813 Add metrics for multi-proxy support 2023-02-05 20:27:32 -05:00
BenCodez 78fc8069b3 More changes to background vote processing handling 2023-02-05 15:40:42 -05:00
BenCodez eed98ed638 Try different locking system for votes 2023-02-05 14:40:39 -05:00
BenCodez f3653c20f6 Silence no votifierevent message when using multiproxy setup 2023-02-05 12:18:59 -05:00
BenCodez 675f4bb6e9 Changes to vote handling 2023-02-04 18:05:13 -05:00
BenCodez 4dbb8b7360 Minor change to background task 2023-02-04 17:38:43 -05:00
BenCodez 5040ee2946 Support velocity booting without nuvotifier installed 2023-02-04 17:24:07 -05:00
BenCodez d7e1408c30 Fix offline broadcast not working correctly on bungee setups 2023-01-29 15:56:49 -05:00
BenCodez 73fda9027a Implement offline broadcast to bungee setups 2023-01-29 15:52:05 -05:00
BenCodez b762c6000f Fix double rewards with mutli-proxy setup 2023-01-29 14:41:08 -05:00
BenCodez 16dcd85807 Fix issues with offline voting on velocity 2023-01-29 14:32:18 -05:00
BenCodez d9b5fcf250 Fix issue on velocity 2023-01-29 14:02:29 -05:00
BenCodez b85f49010b Bug fix 2023-01-29 13:52:17 -05:00
BenCodez 42b64b86bd Add debug messages to multi-proxy setup 2023-01-29 13:28:46 -05:00
BenCodez 266014cbe2 Added /votingpluginbungee multiproxystatus 2023-01-29 13:11:10 -05:00
BenCodez 1e27e28a33 Implement multi-proxy support to velocity 2023-01-29 12:58:23 -05:00
BenCodez 1c530c18ce Change debug to log message 2023-01-27 19:24:41 -05:00
BenCodez c2ebd2251e Bug fix for multi-proxy setup 2023-01-27 19:22:23 -05:00
BenCodez c2fb84dc61 Added extra debug message 2023-01-27 18:56:08 -05:00
BenCodez 39e21bffe7 Minor fixes on multi-proxy handling 2023-01-27 16:58:28 -05:00
BenCodez 226b6eb01e Fix an issue 2023-01-27 16:49:47 -05:00
BenCodez 76a40fd889 Change handling on multi-proxy setup 2023-01-26 19:20:09 -05:00
BenCodez 32f43e7713 Fix issue on bungee login 2023-01-22 16:49:06 -05:00
BenCodez 601e57572f Update version number to 6.11.1 2023-01-21 20:38:01 -05:00
BenCodez 4a8bd40a8b Remove log message 2023-01-21 19:43:32 -05:00
BenCodez 8294e99eeb Change votifier processing 2023-01-21 19:42:16 -05:00
BenCodez 162e7f7faa Change timer handling 2023-01-21 19:11:30 -05:00
BenCodez 7463074b5a Add extra log message 2023-01-21 15:25:12 -05:00
BenCodez bbec19d5c9 Add config option to enable/disable vote queues during time change 2023-01-21 15:23:58 -05:00
BenCodez 72ed4223c4 Improve log messages on vote 2023-01-20 20:50:59 -05:00
BenCodez 603656248b Add another log message 2023-01-20 20:47:04 -05:00
BenCodez 4455a0254f Add extra debug message 2023-01-20 20:04:07 -05:00
BenCodez 3227c47d9b Changes to vote queue 2023-01-19 20:55:53 -05:00
BenCodez bf6885875f Smarter json parsing on voteurl 2023-01-19 19:15:34 -05:00
BenCodez 72934d1286 Change handling of voteparty to better handle last voted player 2023-01-18 19:59:06 -05:00
BenCodez 2a4840814d Fix offline vote processing on bungee 2023-01-17 19:00:17 -05:00
BenCodez 8b8e8acbc8 Modify handling of login on bungee 2023-01-17 17:19:36 -05:00
BenCodez a4ff2d8dcf Fix issues with velocity 2023-01-16 16:43:02 -05:00
BenCodez a6ca0c8121 Update version number to 6.11 2023-01-15 13:48:24 -05:00
BenCodez f3e88859d3 Fix a few issues 2023-01-15 13:37:33 -05:00
BenCodez 7249159ec9 Add more metrics 2023-01-15 12:51:58 -05:00
BenCodez 61c3eccb19 Changes to metrics 2023-01-14 20:41:28 -05:00
BenCodez 4ec800c83e Changes to metrics handling 2023-01-14 19:41:31 -05:00
BenCodez 20e42b0ae7 Fix issue with velocity startup 2023-01-14 15:07:17 -05:00
BenCodez d95becce22 Add geyser prefix to name on vote if needed 2023-01-11 19:06:24 -05:00
BenCodez 04fd38a10d Remove bungee geyser handle 2023-01-11 17:10:16 -05:00
BenCodez a30b2319f5 load metrics async 2023-01-11 17:00:01 -05:00
BenCodez a1b08f6dd0 Small change to voting 2023-01-10 16:50:16 -05:00
BenCodez 614193716f Change order of method 2023-01-09 18:45:15 -05:00
BenCodez b68ac4cdd5 Attempt to get geyser uuid 2023-01-09 18:44:04 -05:00
BenCodez 3767ca2883 Load secretkey.key file if using redis support and not socket method 2023-01-09 17:48:36 -05:00
BenCodez 73b7abf3e6 Add geyser prefix on bungee 2023-01-08 17:29:28 -05:00
BenCodez 285719ae28 Add geyser support to bungee 2023-01-08 17:08:59 -05:00
BenCodez 22fd1ac1e4 Fix listener not registering 2023-01-08 15:07:56 -05:00
BenCodez 6127a2ab23 Add cooldown end rewards per votesite & improve reward edit GUI's 2023-01-07 19:40:03 -05:00
BenCodez 0054b6e06f Add local time change queue handling (non bungee setups) 2023-01-06 20:59:38 -05:00
BenCodez b0f1e0bcb6 Fix vote shop closing 2023-01-06 18:59:25 -05:00
BenCodez ddd0dba728 Implement a better system to test for online servers with global data 2023-01-03 20:22:27 -05:00
BenCodez 9595164f69 Bug fixes 2023-01-03 16:43:10 -05:00
BenCodez 66092ba3fd Fix bungee time queue to actually remember time of vote 2023-01-02 20:37:50 -05:00
BenCodez 5c41c7f4c9 Improve global time handle 2023-01-02 19:36:15 -05:00
BenCodez dfa772af4b Minor change to vote party handling 2023-01-02 14:42:22 -05:00
BenCodez 78f33661aa Improvements to global data handler, handle resets, pause incoming votes 2023-01-01 22:07:52 -05:00
BenCodez 45f2bb2c72 Minor improvements to global data handling 2023-01-01 16:56:23 -05:00
BenCodez f20c7a58ac Add global data handler, WIP 2023-01-01 16:18:02 -05:00
BenCodez 4d1b37c37b Add AlmostAllSites reward 2023-01-01 16:16:43 -05:00
BenCodez d323cd7691 Store top voters before processing rest of time change event 2022-12-27 10:15:19 -05:00
BenCodez 67fc73b530 Delay top voter resetting to improve synchronization between servers 2022-12-27 10:13:38 -05:00
BenCodez 13872fd9d1 Rewrite all sites cooldown event to be a little more efficient 2022-12-19 21:09:00 -05:00
BenCodez a76da52a0a Add per site cooldown end event, enabled with config option 2022-12-19 21:01:58 -05:00
BenCodez 36fabe10a6 Add support for offline mode on bungee 2022-12-17 18:28:55 -05:00
BenCodez eada7af420 Replace placeholderapi placeholders in vote party command 2022-12-13 17:28:22 -05:00
BenCodez 63fc7d64be Update to 6.10.0 2022-12-10 19:42:03 -05:00
BenCodez 0ed5b12f8b Update to 1.19.3 2022-12-08 20:28:00 -05:00
BenCodez 504f9edbb2 Handle invalid materials on voteshop edits 2022-12-02 17:54:37 -05:00
BenCodez 8060ece2eb Update use of timers 2022-11-27 17:03:28 -05:00
BenCodez 254442fa2e Improve new topvoter sorting 2022-11-20 17:48:05 -05:00
BenCodez febead9d5a Bug fix 2022-11-20 17:27:55 -05:00
BenCodez d8cd0c278d Don't cache when sorting top voter 2022-11-20 17:10:54 -05:00
BenCodez fe0d7cd671 Change order of top voter to better handle ties 2022-11-20 14:06:07 -05:00
BenCodez c9d8878bb3 Add extra sorting to top voters 2022-11-20 14:04:30 -05:00
BenCodez 0f450e9b60 Catch NumberFormatException 2022-11-14 18:30:04 -05:00
BenCodez 667d0b544e More changes to timers 2022-10-31 18:44:24 -04:00
BenCodez 6e1e6bd928 Change to ScheduledExecutorService 2022-10-31 17:03:01 -04:00
BenCodez 1cfc447445 Add temp workaround to fix some issues 2022-10-31 16:55:27 -04:00
BenCodez 6d3e68e548 Add placeholder for players that voted in alternate broadcast 2022-10-13 15:53:12 -04:00
BenCodez 855dde196e More improvements for anysitereward with pluginmessaging 2022-10-06 20:39:21 -04:00
BenCodez d5a9e1012a Changes to pluginmessaging to fix anysiterewards 2022-10-05 16:47:36 -04:00
BenCodez f5d67833b2 Update version number to 6.9.5 2022-09-25 15:00:56 -04:00
BenCodez a1eb2f63e5 Fix cache issues on player vote 2022-09-14 20:28:19 -04:00
BenCodez a882b8d86f Undo minor change for cache on vote 2022-09-14 15:42:32 -04:00
BenCodez 0a745ae4c0 Fix issues with cache delays for cumulative/milestones 2022-09-10 15:00:48 -04:00
BenCodez d38a0549d3 Add 1 total to cumulative on local votes to prevent cumulative delay 2022-09-09 20:23:37 -04:00
BenCodez 6e6394f1fb Always update placeholder cache on background update 2022-09-08 19:21:54 -04:00
BenCodez ce58e12740 Fix error with sockets method on broadcasts 2022-09-03 20:46:51 -04:00
BenCodez 2411354a5f Added extra debug for reminders 2022-09-02 20:10:47 -04:00
BenCodez 13efd0c482 Add option for voteparty once per week 2022-08-30 19:36:06 -04:00
BenCodez 8fce74f30d Always store bungee voteparty info incase of restart 2022-08-27 20:14:36 -04:00
BenCodez 3f54c05f86 Update version number to 6.9.4 2022-08-27 19:30:43 -04:00
BenCodez dd1cf02c49 Fix voteparty setextrarequired command 2022-08-22 15:43:35 -04:00
BenCodez b462373dfc Run bstats metrics async 2022-08-20 07:54:20 -04:00
BenCodez c6e5d008d2 Update to 1.19.2 2022-08-07 14:07:31 -04:00
BenCodez 9a91561304 Improve addpoints command 2022-08-04 15:36:19 -04:00
BenCodez 1c6981e538 Change name of plugin in softdepend 2022-07-28 15:48:15 -04:00
BenCodez b6e366ff9d Update to 1.19.1 2022-07-27 18:59:58 -04:00
52 changed files with 2981 additions and 892 deletions

No files matched your search

+35
View File
@@ -62,6 +62,41 @@ Server: PleaseSet
# Can edit via /av gui
BungeeVotePartyRewards: {}
# ----------------------------------------------------------------
# Global mysql data handle for between server commmunications
# This is NOT required for bungee voting to work
# This is still a WIP, use with caution
# This will create a different table then from users storing server info to process
#
# If you use this you need to enable this on BungeeSettings.yml on each server with votingplugin
# Make sure server name is set correctly in BungeeSettings.yml or this will not work correctly
#
# Please use PLUGINMESSAGING for this, SOCKETS should work as well, but not fully tested
#
# This will make votes cache until time change has finished processing
# In the event a server is offline or time change fails, the time change process
# will continue after a set amount of time (in essense skipping a specific server)
# This will also respect blocked servers in bungeeconfig.yml
GlobalData:
Enabled: false
# Use existing mysql connection from config.yml
UseMainMySQL: true
# Mysql settings only used if above is false
Host: ''
# Default port is 3306
Port: 3306
Database: ''
Username: ''
Password: ''
# Max number of connections
MaxConnections: 1
# Must be the same on all servers
Prefix: ''
#UseSSL: true
#PublicKeyRetrieval: false
#Attempt to use mariadb driver
#UseMariaDB: false
# -----------------------------
# For socket setup below only
# -----------------------------
+13
View File
@@ -121,6 +121,8 @@ Format:
# Broadcast every x number of minutes with number of players that voted
AlternateBroadcast:
Enabled: false
# Use %players% for all players names
# Use %numberofplayers% for number of players that voted
Broadcast: '&6[&4Broadcast&6] &2%numberofplayers% voted in the last half hour! /vote'
# Delay in minutes
Delay: 30
@@ -373,6 +375,14 @@ StoreTopVoters:
# Most of these values can be left untouched for most setups
# ------------------------------------------------
# Enable per site cooldown events, requires more resources to use
# Requires restart
PerSiteCoolDownEvents: false
# Queue votes during a time change (doesn't apply to bungee voting)
# Votes will be given when time change is completed
QueueVotesDuringTimeChange: false
# If true vanished players are treated as if they are offline
TreatVanishAsOffline: false
@@ -382,6 +392,9 @@ DisableCoolDownCheck: false
# If true, disable PlayerInteractEvent (for clicking signs and skulls)
DisableInteractEvent: false
# If false plugin will use offline player UUIDs
OnlineMode: true
# Delays login event, delays vote reminding and more
# In miliseconds, 1000 = 1 second
DelayLoginEvent: 0
@@ -17,6 +17,12 @@ FirstVoteToday: {}
AllSites:
Messages:
Player: '&aYou voted on all sites in 1 day!'
# Give a reward for voting on all sites minus 1
# Similar to allsites
#AlmostAllSites:
# Messages:
# Player: '&aYou almost voted on all sites in 1 day!'
# If true only cumulative reward at a time can be given
@@ -74,6 +80,8 @@ VoteParty:
ResetMonthly: false
# If true, will give voteparty only once per day
OnlyOncePerDay: false
# If true, will give voteparty once per week only
OnlyOncePerWeek: false
# Reset extra votes
ResetExtraVotesMonthly: false
# Count votes from /av vote?
+7
View File
@@ -2,6 +2,7 @@ VoteSites:
# VoteSite key
# Used for saving data for votesites
# Use a short name if you can
# No spaces or dots
ExampleVoteSite:
# Enable voteSite
# If false, votesite will not be loaded by plugin
@@ -60,6 +61,12 @@ VoteSites:
DisplayItem:
Material: 'DIAMOND'
Amount: 1
# Reward to run when cooldown ends for this votesite
# Enable PerSiteCoolDownEvents in Config.yml to use this
#CoolDownEndRewards:
# Messages:
# Player: '&aTime to go vote on site1'
# Rewards to give
# https://github.com/BenCodez/AdvancedCore/wiki/Rewards
+73 -17
View File
@@ -19,6 +19,51 @@ Prefix: ''
#Attempt to use mariadb driver
#UseMariaDB: false
# Online mode for UUIDS
# Offline mode setups are not fully tested and are not supported currently
OnlineMode: true
# ----------------------------------------------------------------
# Global mysql data handle for between server commmunications
# This is NOT required for bungee voting to work
# This is still a WIP, use with caution
# This will create a different table then from users storing server info to process
#
# If you use this you need to enable this on BungeeSettings.yml on each server with votingplugin
# Make sure server name is set correctly in BungeeSettings.yml or this will not work correctly
#
# Please use PLUGINMESSAGING for this, SOCKETS should work as well, but not fully tested
#
# This will make votes cache until time change has finished processing
# In the event a server is offline or time change fails, the time change process
# will continue after a set amount of time (in essense skipping a specific server)
# This will also respect blocked servers
GlobalData:
Enabled: false
# Use existing connection above
UseMainMySQL: true
# Mysql settings only used if above is false
Host: ''
# Default port is 3306
Port: 3306
Database: ''
Username: ''
Password: ''
# Max number of connections
MaxConnections: 1
# Must be the same on all servers
Prefix: ''
#UseSSL: true
#PublicKeyRetrieval: false
#Attempt to use mariadb driver
#UseMariaDB: false
# Time offset for time changes
# Must match on all servers
TimeHourOffSet: 0
# ----------------------------------------------------------------
Debug: false
# Have a reward on each server
# If false, will send to online server only
@@ -28,6 +73,11 @@ SendVotesToAllServers: true
BlockedServers:
- hub
# Similar to BlockServers
# If a server is listed then blockedservers is ignored
WhiteListedServers: []
# What type of bungee setup
# Requires restart and set on all servers
# https://github.com/BenCodez/VotingPlugin/wiki/Bungeecoord-Setups
@@ -47,14 +97,20 @@ PointsOnVote: 1
# If true, bungee will handle adding totals
# If false, spigot servers will EACH set their own totals
# If false, AllowUnJoined should false on bungee, spigot servers will handle that
# Recommened to leave true, setting to false setups are currently unsupported
# If false, AllowUnJoined should be enabled on bungee, spigot servers will handle that
# Recommeneded to leave enabled, setups with this disabled are currently unsupported
BungeeManageTotals: true
# Tell servers to broadcast
# Set DisableBroadcast to true on spigot servers (BungeeSettings.yml) as well
Broadcast: true
# Geyser settings
# This may or may not work
# Does not work on velocity currently
GeyserSupport: false
GeyserPrefix: '.'
VoteParty:
# If enabled, will trigger vote party reward
# in BungeeSettings.yml under BungeeVotePartyReward
@@ -82,34 +138,34 @@ VoteParty:
# Votes will be forwarded when specific player is online
WaitForUserOnline: false
# ----------------------------
# SOCKET Settings
# ONLY for SOCKET method
# ----------------------------
# Options available here:
# https://github.com/BenCodez/VotingPlugin/wiki/Bungee-Setup-SOCKETS
# ----------------------------
# Redis setup
# Redis/multi proxy setup
# Experimental
# Primary server for redis needs votifier
# Set socket host on each proxy and redissockets on primary redis only
# All servers on pluginmessaging
# Primary server needs votifier and config option enabled
# Set socket host on each proxy and primary server set sub proxies
# All servers should be on pluginmessaging or sockets setup
# ----------------------------
# Support for redis
# experimental
RedisSupport: false
MultiProxySupport: false
# Enable on primary server with votifier
# Enable on primary proxy server with votifier
PrimaryServer: false
RedisSocketHost:
# If enabled, player will only get 1 reward on a server on the network
# Must be enabled on all proxies for this to work
# Must also disable sendtoallservers
MultiProxyOneGlobalReward: false
# Set this for each proxy
MultiProxySocketHost:
Host: 0.0.0.0
Port: 1234
RedisServers:
# Set other sub proxies here
MultiProxyServers:
secondproxy:
Host: 0.0.0.0
Port: 1235
+1 -2
View File
@@ -9,14 +9,13 @@ softdepend:
- Votifier
- VotifierPlus
- NuVotifier
- CMI
- Vault
- PlaceholderAPI
- ProtocolLib
- MVdWPlaceholderAPI
- AuthMe
- SuperVanish
- PremiumVanishs
- PremiumVanish
- DiscordSRV
loadbefore:
- MCPerks
+22 -2
View File
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.bencodez</groupId>
<artifactId>votingplugin</artifactId>
<version>6.9.3</version>
<version>6.11.3</version>
<packaging>jar</packaging>
<name>VotingPlugin</name>
<properties>
@@ -226,7 +226,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.19-R0.1-SNAPSHOT</version>
<version>1.19.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -275,6 +275,26 @@
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>bencodez repo</id>
<url>https://nexus.bencodez.com/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.bencodez</groupId>
<artifactId>advancedcore</artifactId>
<version>LATEST</version>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
<profile>
<id>jitpack</id>
<properties>
<build.profile.id>jitpack</build.profile.id>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
@@ -1,18 +1,29 @@
package com.bencodez.votingplugin;
import java.io.File;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
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.events.DateChangedEvent;
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.globaldata.GlobalDataHandler;
import com.bencodez.advancedcore.bungeeapi.globaldata.GlobalMySQL;
import com.bencodez.advancedcore.bungeeapi.pluginmessage.PluginMessageHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.ClientHandler;
import com.bencodez.advancedcore.bungeeapi.sockets.SocketHandler;
@@ -46,22 +57,199 @@ public class BungeeHandler implements Listener {
@Getter
private SocketHandler socketHandler;
private GlobalDataHandler globalDataHandler;
@Getter
private ScheduledExecutorService timer;
public BungeeHandler(VotingPluginMain plugin) {
this.plugin = plugin;
}
public void close() {
socketHandler.closeConnection();
clientHandler.stopConnection();
if (socketHandler != null) {
socketHandler.closeConnection();
}
if (clientHandler != null) {
clientHandler.stopConnection();
}
plugin.getServerData().setBungeeVotePartyCurrent(bungeeVotePartyCurrent);
plugin.getServerData().setBungeeVotePartyRequired(bungeeVotePartyRequired);
if (globalDataHandler != null) {
globalDataHandler.getGlobalMysql().close();
}
}
@EventHandler
public void onDateChange(DateChangedEvent event) {
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
plugin.getPluginMessaging().sendPluginMessage("timeupdate", plugin.getServerDataFile().getPrevMonth() + "//"
+ plugin.getServerDataFile().getPrevDay() + "//" + plugin.getServerDataFile().getPrevWeekDay());
/*
* @EventHandler public void onDateChange(DateChangedEvent event) { if
* (method.equals(BungeeMethod.PLUGINMESSAGING)) {
* plugin.getPluginMessaging().sendPluginMessage("timeupdate",
* plugin.getServerDataFile().getPrevMonth() + "//" +
* plugin.getServerDataFile().getPrevDay() + "//" +
* plugin.getServerDataFile().getPrevWeekDay()); } }
*/
public void checkGlobalData() {
HashMap<String, DataValue> data = globalDataHandler.getExact(plugin.getBungeeSettings().getServer());
// plugin.debug(data.toString());
if (data.containsKey("ForceUpdate")) {
boolean b = checkGlobalDataTimeValue(data.get("ForceUpdate"));
if (b) {
if (plugin.getStorageType().equals(UserStorage.MYSQL)) {
plugin.getMysql().clearCacheBasic();
}
plugin.getUserManager().getDataManager().clearCache();
plugin.setUpdate(true);
plugin.update();
globalDataHandler.setBoolean(plugin.getBungeeSettings().getServer(), "ForceUpdate", false);
}
}
boolean forceUpdate = false;
if (checkGlobalDataTime(TimeType.MONTH, data)) {
forceUpdate = true;
}
if (checkGlobalDataTime(TimeType.WEEK, data)) {
forceUpdate = true;
}
if (checkGlobalDataTime(TimeType.DAY, data)) {
forceUpdate = true;
}
if (forceUpdate) {
HashMap<String, DataValue> dataToSet = new HashMap<String, DataValue>();
dataToSet.put("FinishedProcessing", new DataValueBoolean(true));
dataToSet.put("Processing", new DataValueBoolean(false));
globalDataHandler.setData(plugin.getBungeeSettings().getServer(), dataToSet);
}
}
public boolean checkGlobalDataTimeValue(DataValue data) {
if (data.isBoolean()) {
return data.getBoolean();
}
return Boolean.valueOf(data.getString());
}
public boolean checkGlobalDataTime(TimeType type, HashMap<String, DataValue> data) {
boolean isProcessing = false;
if (data.containsKey(type.toString())) {
DataValue value = data.get(type.toString());
boolean b = checkGlobalDataTimeValue(value);
if (b) {
long lastUpdated = Long.valueOf(data.get("LastUpdated").getString()).longValue();
plugin.debug("LastUpdated: " + lastUpdated);
if (LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli() - lastUpdated > 1000 * 60 * 60
* 1) {
plugin.getLogger().warning("Ignore bungee time change since it was more than 1 hour ago");
return false;
}
globalDataHandler.setBoolean(plugin.getBungeeSettings().getServer(), "Processing", true);
isProcessing = true;
plugin.debug("Detected time change from bungee: " + type.toString());
plugin.getTimeChecker().forceChanged(type, false, true, true);
globalDataHandler.setBoolean(plugin.getBungeeSettings().getServer(), type.toString(), false);
}
}
return isProcessing;
}
public void loadGlobalMysql() {
if (plugin.getBungeeSettings().isGloblalDataEnabled()) {
if (timer != null) {
timer.shutdown();
try {
timer.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.shutdownNow();
}
timer = Executors.newScheduledThreadPool(1);
timer.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
checkGlobalData();
}
}, 60, 10, TimeUnit.SECONDS);
timer.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
globalDataHandler.setString(plugin.getBungeeSettings().getServer(), "LastOnline",
"" + LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli());
}
}, 1, 60, TimeUnit.MINUTES);
if (globalDataHandler != null) {
globalDataHandler.getGlobalMysql().close();
}
if (plugin.getBungeeSettings().isGloblalDataUseMainMySQL()
&& plugin.getStorageType().equals(UserStorage.MYSQL)) {
globalDataHandler = new GlobalDataHandler(
new GlobalMySQL("VotingPlugin_GlobalData", plugin.getMysql().getMysql()) {
@Override
public void warning(String text) {
plugin.getLogger().warning(text);
}
@Override
public void severe(String text) {
plugin.getLogger().severe(text);
}
@Override
public void debug(Exception e) {
plugin.debug(e);
}
@Override
public void debug(String text) {
plugin.debug(text);
}
});
} else {
globalDataHandler = new GlobalDataHandler(
new GlobalMySQL("VotingPlugin_GlobalData", new MysqlConfigSpigot(
plugin.getBungeeSettings().getData().getConfigurationSection("GlobalData"))) {
@Override
public void warning(String text) {
plugin.getLogger().warning(text);
}
@Override
public void severe(String text) {
plugin.getLogger().severe(text);
}
@Override
public void debug(Exception e) {
plugin.debug(e);
}
@Override
public void debug(String text) {
plugin.debug(text);
}
});
}
globalDataHandler.getGlobalMysql().alterColumnType("IgnoreTime", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("MONTH", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("WEEK", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("DAY", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("FinishedProcessing", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("Processing", "VARCHAR(5)");
globalDataHandler.getGlobalMysql().alterColumnType("LastUpdated", "MEDIUMTEXT");
globalDataHandler.getGlobalMysql().alterColumnType("ForceUpdate", "VARCHAR(5)");
plugin.getTimeChecker().setProcessingEnabled(false);
}
}
@@ -72,6 +260,8 @@ public class BungeeHandler implements Listener {
plugin.getLogger().info("Using BungeeMethod: " + method.toString());
loadGlobalMysql();
if (method.equals(BungeeMethod.MYSQL)) {
plugin.registerBungeeChannels("vp:vp");
} else if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
@@ -107,6 +297,8 @@ public class BungeeHandler implements Listener {
bungeeVotePartyCurrent = text.getVotePartyCurrent();
bungeeVotePartyRequired = text.getVotePartyRequired();
plugin.getPlaceholders().onBungeeVotePartyUpdate();
plugin.getServerData().setBungeeVotePartyCurrent(bungeeVotePartyCurrent);
plugin.getServerData().setBungeeVotePartyRequired(bungeeVotePartyRequired);
boolean setTotals = Boolean.valueOf(args.get(7));
@@ -119,24 +311,41 @@ public class BungeeHandler implements Listener {
bungeeBroadcast = Boolean.valueOf(args.get(9));
}
int num = 1;
if (args.size() > 10) {
num = Integer.valueOf(args.get(10));
}
int numberOfVotes = 1;
if (args.size() > 11) {
numberOfVotes = Integer.valueOf(args.get(11));
}
if (!bungeeBroadcast) {
if (!plugin.getBungeeSettings().isBungeeBroadcast()
&& !plugin.getBungeeSettings().isDisableBroadcast()) {
if (wasOnline || plugin.getBungeeSettings().isBungeeBroadcastAlways()) {
VoteSite site = plugin.getVoteSite(service, true);
if (site != null) {
site.broadcastVote(user, false);
broadcast = false;
if (plugin.getConfigFile().isFormatOnlyOneOfflineBroadcast() && !wasOnline) {
if (num == 1) {
user.offlineBroadcast(user, plugin.getBungeeSettings().isUseBungeecoord(),
numberOfVotes);
}
} else {
plugin.getLogger().warning("No votesite for " + service);
VoteSite site = plugin.getVoteSite(service, true);
if (site != null) {
site.broadcastVote(user, false);
broadcast = false;
} else {
plugin.getLogger().warning("No votesite for " + service);
}
}
}
}
} else {
broadcast = false;
}
user.bungeeVotePluginMessaging(service, time, text, !setTotals, wasOnline, broadcast);
user.bungeeVotePluginMessaging(service, time, text, !setTotals, wasOnline, broadcast, num);
if (plugin.getBungeeSettings().isPerServerPoints()) {
user.addPoints(plugin.getConfigFile().getPointsOnVote());
}
@@ -169,6 +378,8 @@ public class BungeeHandler implements Listener {
bungeeVotePartyCurrent = text.getVotePartyCurrent();
bungeeVotePartyRequired = text.getVotePartyRequired();
plugin.getPlaceholders().onBungeeVotePartyUpdate();
plugin.getServerData().setBungeeVotePartyCurrent(bungeeVotePartyCurrent);
plugin.getServerData().setBungeeVotePartyRequired(bungeeVotePartyRequired);
plugin.debug(
"pluginmessaging voteonline received from " + player + "/" + uuid + " on " + service);
@@ -191,25 +402,42 @@ public class BungeeHandler implements Listener {
bungeeBroadcast = Boolean.valueOf(args.get(9));
}
int num = 1;
if (args.size() > 10) {
num = Integer.valueOf(args.get(10));
}
int numberOfVotes = 1;
if (args.size() > 11) {
numberOfVotes = Integer.valueOf(args.get(11));
}
if (!bungeeBroadcast) {
if (!plugin.getBungeeSettings().isBungeeBroadcast()
&& !plugin.getBungeeSettings().isDisableBroadcast()) {
if (Boolean.valueOf(args.get(4))
|| plugin.getBungeeSettings().isBungeeBroadcastAlways()) {
VoteSite site = plugin.getVoteSite(service, true);
if (site != null) {
site.broadcastVote(user, false);
broadcast = false;
if (wasOnline || plugin.getBungeeSettings().isBungeeBroadcastAlways()) {
if (plugin.getConfigFile().isFormatOnlyOneOfflineBroadcast() && !wasOnline) {
if (num == 1) {
user.offlineBroadcast(user, plugin.getBungeeSettings().isUseBungeecoord(),
numberOfVotes);
}
} else {
plugin.getLogger().warning("No votesite for " + service);
VoteSite site = plugin.getVoteSite(service, true);
if (site != null) {
site.broadcastVote(user, false);
broadcast = false;
} else {
plugin.getLogger().warning("No votesite for " + service);
}
}
}
}
} else {
broadcast = false;
}
user.bungeeVotePluginMessaging(service, time, text, !setTotals, wasOnline, broadcast);
user.bungeeVotePluginMessaging(service, time, text, !setTotals, wasOnline, broadcast, num);
if (plugin.getBungeeSettings().isPerServerPoints()) {
user.addPoints(plugin.getConfigFile().getPointsOnVote());
}
@@ -236,12 +464,21 @@ public class BungeeHandler implements Listener {
if (args.size() > 2) {
bungeeVotePartyCurrent = Integer.parseInt(args.get(1));
bungeeVotePartyRequired = Integer.parseInt(args.get(2));
plugin.getServerData().setBungeeVotePartyCurrent(bungeeVotePartyCurrent);
plugin.getServerData().setBungeeVotePartyRequired(bungeeVotePartyRequired);
}
plugin.setUpdate(true);
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("BungeeTimeChange") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
checkGlobalData();
}
});
plugin.getPluginMessaging().add(new PluginMessageHandler("VoteBroadcast") {
@Override
public void onRecieve(String subChannel, ArrayList<String> args) {
@@ -341,6 +578,14 @@ public class BungeeHandler implements Listener {
}
});
socketHandler.add(new SocketReceiver("BungeeTimeChange") {
@Override
public void onReceive(String[] data) {
checkGlobalData();
}
});
socketHandler.add(new SocketReceiver("bungeevoteonline") {
@Override
@@ -402,7 +647,7 @@ public class BungeeHandler implements Listener {
public void onReceive(String[] data) {
if (data.length > 2) {
VoteSite site = plugin.getVoteSite(data[1], true);
String p = data[3];
String p = data[2];
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(p);
if (site != null) {
site.broadcastVote(user, false);
@@ -16,9 +16,10 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
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;
@@ -80,6 +81,7 @@ import com.bencodez.votingplugin.placeholders.MVdWPlaceholders;
import com.bencodez.votingplugin.placeholders.PlaceHolders;
import com.bencodez.votingplugin.signs.Signs;
import com.bencodez.votingplugin.specialrewards.SpecialRewards;
import com.bencodez.votingplugin.timequeue.TimeQueueHandler;
import com.bencodez.votingplugin.topvoter.TopVoter;
import com.bencodez.votingplugin.topvoter.TopVoterHandler;
import com.bencodez.votingplugin.topvoter.TopVoterPlayer;
@@ -209,7 +211,7 @@ public class VotingPluginMain extends AdvancedCorePlugin {
private boolean ymlError = false;
@Getter
private Timer voteTimer = new Timer();
private ScheduledExecutorService voteTimer;
@Getter
private UserManager votingPluginUserManager;
@@ -429,6 +431,29 @@ public class VotingPluginMain extends AdvancedCorePlugin {
}
});
addDirectlyDefinedRewards(new DirectlyDefinedReward("AlmostAllSites") {
@Override
public void createSection(String key) {
getSpecialRewardsConfig().createSection(key);
}
@Override
public ConfigurationSection getFileData() {
return getSpecialRewardsConfig().getData();
}
@Override
public void save() {
getSpecialRewardsConfig().saveData();
}
@Override
public void setData(String path, Object value) {
getSpecialRewardsConfig().setValue(path, value);
}
});
// FirstVote
addDirectlyDefinedRewards(new DirectlyDefinedReward("FirstVote") {
@@ -718,6 +743,29 @@ public class VotingPluginMain extends AdvancedCorePlugin {
getConfigVoteSites().setValue(path, value);
}
});
addDirectlyDefinedRewards(new DirectlyDefinedReward("VoteSites." + site.getKey() + ".CoolDownEndRewards") {
@Override
public void createSection(String key) {
getConfigVoteSites().createSection(key);
}
@Override
public ConfigurationSection getFileData() {
return getConfigVoteSites().getData();
}
@Override
public void save() {
getConfigVoteSites().saveData();
}
@Override
public void setData(String path, Object value) {
getConfigVoteSites().setValue(path, value);
}
});
}
// vote streaks
@@ -881,29 +929,25 @@ public class VotingPluginMain extends AdvancedCorePlugin {
@Override
public void run() {
getTimer().schedule(new TimerTask() {
getTimer().scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
if (plugin != null) {
update();
} else {
cancel();
}
}
}, 1000, 1000 * 60 * configFile.getDelayBetweenUpdates());
}, 1000, 1000 * 60 * configFile.getDelayBetweenUpdates(), TimeUnit.MILLISECONDS);
getTimer().schedule(new TimerTask() {
getTimer().scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
if (plugin != null && configFile.isExtraBackgroundUpdate()) {
basicBungeeUpdate();
} else {
cancel();
}
}
}, 1000, 1000 * 30);
}, 1000, 1000 * 30, TimeUnit.MILLISECONDS);
}
}, 40L);
@@ -954,13 +998,23 @@ public class VotingPluginMain extends AdvancedCorePlugin {
* Metrics.
*/
private void metrics() {
new VotingPluginMetrics().load(this);
new VotingPluginMetrics().load(plugin);
}
private void loadVoteTimer() {
voteTimer = Executors.newSingleThreadScheduledExecutor();
}
@Getter
private TimeQueueHandler timeQueueHandler;
@Override
public void onPostLoad() {
loadVersionFile();
getOptions().setServer(bungeeSettings.getServer());
loadVoteTimer();
if (bungeeSettings.isUseBungeecoord()) {
bungeeHandler = new BungeeHandler(this);
bungeeHandler.load();
@@ -972,6 +1026,10 @@ public class VotingPluginMain extends AdvancedCorePlugin {
}
if (!bungeeSettings.isUseBungeecoord() || !bungeeSettings.isGloblalDataEnabled()) {
this.timeQueueHandler = new TimeQueueHandler(this);
}
registerCommands();
checkVotifier();
registerEvents();
@@ -1019,7 +1077,13 @@ public class VotingPluginMain extends AdvancedCorePlugin {
topVoterHandler.register();
metrics();
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
metrics();
}
});
// javascript api
getJavascriptEngineRequests().add(new JavascriptPlaceholderRequest("User") {
@@ -1190,8 +1254,6 @@ public class VotingPluginMain extends AdvancedCorePlugin {
*/
@Override
public void onUnLoad() {
getSigns().storeSigns();
HandlerList.unregisterAll(plugin);
if (bungeeSettings.isUseBungeecoord()) {
try {
getBungeeHandler().close();
@@ -1199,6 +1261,18 @@ public class VotingPluginMain extends AdvancedCorePlugin {
debug(e);
}
}
voteTimer.shutdown();
try {
voteTimer.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
voteTimer.shutdownNow();
if (timeQueueHandler != null) {
timeQueueHandler.save();
}
getSigns().storeSigns();
HandlerList.unregisterAll(plugin);
plugin = null;
}
@@ -1255,6 +1329,10 @@ public class VotingPluginMain extends AdvancedCorePlugin {
pm.registerEvents(new PlayerInteract(this), this);
}
if (timeQueueHandler != null) {
pm.registerEvents(timeQueueHandler, plugin);
}
pm.registerEvents(new VotingPluginUpdateEvent(this), this);
/*
* if (!NMSManager.getInstance().isVersion("1.12")) { pm.registerEvents(new
@@ -1280,8 +1358,6 @@ public class VotingPluginMain extends AdvancedCorePlugin {
}
private void reloadPlugin(boolean userStorage) {
setUpdate(true);
configFile.reloadData();
configFile.loadValues();
@@ -1292,10 +1368,14 @@ public class VotingPluginMain extends AdvancedCorePlugin {
gui.reloadData();
bungeeSettings.reloadData();
if (bungeeSettings.isUseBungeecoord()) {
getBungeeHandler().loadGlobalMysql();
}
checkYMLError();
if (broadcastHandler != null) {
broadcastHandler.schelude(getConfigFile().getFormatAlternateBroadcastDelay());
broadcastHandler.schedule(getConfigFile().getFormatAlternateBroadcastDelay());
}
updateAdvancedCoreHook();
@@ -1309,14 +1389,7 @@ public class VotingPluginMain extends AdvancedCorePlugin {
voteReminding.loadRemindChecking();
coolDownCheck.checkEnabled();
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
update();
}
});
setUpdate(true);
}
private void setupFiles() {
@@ -1418,7 +1491,7 @@ public class VotingPluginMain extends AdvancedCorePlugin {
voteToday.put(user.getTopVoterPlayer(), times);
}
}
if (!extraBackgroundUpdate) {
if (extraBackgroundUpdate) {
if (user.isOnline()) {
user.offVote();
}
@@ -1450,13 +1523,15 @@ public class VotingPluginMain extends AdvancedCorePlugin {
tempTopVoter = null;
checkFirstTimeLoaded();
time1 = ((System.currentTimeMillis() - time1) / 1000);
long totalTime = ((System.currentTimeMillis() - startTime) / 1000);
plugin.debug("Background task finished. Final processing took " + time1
+ " seconds. Total time: " + totalTime + " seconds");
plugin.getUserManager().getDataManager().clearNonNeededCachedUsers();
plugin.extraDebug("Current cached users: "
+ plugin.getUserManager().getDataManager().getUserDataCache().keySet().size());
checkFirstTimeLoaded();
} catch (Exception ex) {
if (plugin != null) {
plugin.getLogger().info("Looks like something went wrong");
@@ -1476,6 +1551,7 @@ public class VotingPluginMain extends AdvancedCorePlugin {
public void checkFirstTimeLoaded() {
if (!firstTimeLoaded) {
if (getGui().isChestVoteTopUseSkull()) {
int maxToLoad = 200;
for (TopVoter top : topVoter.keySet()) {
@@ -178,38 +178,29 @@ public class VotingPluginMetrics {
@Override
public String call() throws Exception {
int total = UserManager.getInstance().getAllUUIDs().size();
if (total < 1000) {
return "<1000";
if (total > 800000) {
return ">800000";
} else if (total > 700000) {
return "700000-800000";
} else if (total > 600000) {
return "600000-700000";
} else if (total > 500000) {
return "500000-600000";
} else if (total > 400000) {
return "400000-500000";
} else if (total > 300000) {
return "300000-400000";
} else if (total > 200000) {
return "200000-300000";
} else if (total > 100000) {
return "100000-200000";
} else if (total > 10000) {
return ">10000";
} else {
return "1000-10000";
return ">10000-100000";
}
return "<10000";
}
}));
int users = UserManager.getInstance().getAllUUIDs().size();
if (users > 1000) {
metrics.addCustomChart(new BStatsMetrics.SimplePie("number_of_users_in_thousands", new Callable<String>() {
@Override
public String call() throws Exception {
int total = UserManager.getInstance().getAllUUIDs().size() / 1000;
return "" + total;
}
}));
}
if (users > 10000) {
metrics.addCustomChart(
new BStatsMetrics.SimplePie("number_of_users_in_thousands_plus_10", new Callable<String>() {
@Override
public String call() throws Exception {
int total = UserManager.getInstance().getAllUUIDs().size() / 1000;
return "" + total;
}
}));
}
metrics.addCustomChart(new BStatsMetrics.SimplePie("data_storage", new Callable<String>() {
@Override
@@ -300,8 +291,33 @@ public class VotingPluginMetrics {
return "" + plugin.getBungeeSettings().isTriggerVotifierEvent();
}
}));
metrics.addCustomChart(new BStatsMetrics.SimplePie("globaldata_enabled", new Callable<String>() {
@Override
public String call() throws Exception {
return "" + plugin.getBungeeSettings().isGloblalDataEnabled();
}
}));
if (plugin.getBungeeSettings().isGloblalDataEnabled()) {
metrics.addCustomChart(new BStatsMetrics.SimplePie("globaldata_usemainmysql", new Callable<String>() {
@Override
public String call() throws Exception {
return "" + plugin.getBungeeSettings().isGloblalDataUseMainMySQL();
}
}));
}
}
metrics.addCustomChart(new BStatsMetrics.SimplePie("persitecooldownevents", new Callable<String>() {
@Override
public String call() throws Exception {
return "" + plugin.getConfigFile().isPerSiteCoolDownEvents();
}
}));
metrics.addCustomChart(new BStatsMetrics.SimplePie("geyserprefixsupport", new Callable<String>() {
@Override
@@ -2,9 +2,10 @@ package com.bencodez.votingplugin.broadcast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -16,12 +17,12 @@ import com.bencodez.votingplugin.user.UserManager;
public class BroadcastHandler {
private VotingPluginMain plugin;
private Timer timer;
private ScheduledExecutorService timer;
ConcurrentLinkedQueue<String> votedPlayers = new ConcurrentLinkedQueue<String>();
public BroadcastHandler(VotingPluginMain plugin, int delay) {
this.plugin = plugin;
schelude(delay);
schedule(delay);
}
public void check() {
@@ -32,8 +33,16 @@ public class BroadcastHandler {
}
String bc = StringParser.getInstance()
.colorize(plugin.getConfigFile().getFormatAlternateBroadcastBroadcast());
String playersText = "";
while (!votedPlayers.isEmpty()) {
playersText += votedPlayers.remove();
if (!votedPlayers.isEmpty()) {
playersText += ", ";
}
}
HashMap<String, String> placeholders = new HashMap<String, String>();
placeholders.put("numberofplayers", "" + size);
placeholders.put("players", playersText);
bc = StringParser.getInstance().replacePlaceHolder(bc, placeholders);
ArrayList<Player> players = new ArrayList<Player>();
for (Player p : Bukkit.getOnlinePlayers()) {
@@ -50,19 +59,19 @@ public class BroadcastHandler {
votedPlayers.add(player);
}
public void schelude(int delay) {
public void schedule(int delay) {
if (timer != null) {
timer.cancel();
timer = new Timer();
timer.shutdownNow();
timer = Executors.newScheduledThreadPool(1);
} else {
timer = new Timer();
timer = Executors.newScheduledThreadPool(1);
}
timer.schedule(new TimerTask() {
timer.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
check();
}
}, 1000 * 60, 1000 * 60 * delay);
}, 60, 60 * delay, TimeUnit.SECONDS);
}
}
@@ -29,12 +29,32 @@ public class Config {
return getData().getStringList("BlockedServers");
}
public List<String> getWhiteListedServers() {
return getData().getStringList("WhiteListedServers");
}
public boolean getBroadcast() {
return getData().getBoolean("Broadcast", false);
}
public boolean getRedisSupport() {
return getData().getBoolean("RedisSupport", false);
public boolean getGeyserSupport() {
return getData().getBoolean("GeyserSupport", false);
}
public String getGeyserPrefix() {
return getData().getString("GeyserPrefix", ".");
}
public boolean getOnlineMode() {
return getData().getBoolean("OnlineMode", true);
}
public boolean getGlobalDataEnabled() {
return getData().getBoolean("GlobalData.Enabled", false);
}
public boolean getGlobalDataUseMainMySQL() {
return getData().getBoolean("GlobalData.UseMainMySQL", true);
}
public String getBungeeHost() {
@@ -53,18 +73,38 @@ public class Config {
return getData().getInt("BungeeServer.Port", 1297);
}
public int getRedisSocketHostPort() {
return getData().getInt("RedisSocketHost.Port", 1297);
}
public String getRedisSocketHostHost() {
return getData().getString("RedisSocketHost.Host", "");
}
public boolean getDebug() {
return getData().getBoolean("Debug", false);
}
public boolean getMultiProxySupport() {
return getData().getBoolean("MultiProxySupport", false);
}
public int getMultiProxySocketHostPort() {
return getData().getInt("MultiProxySocketHost.Port", 1297);
}
public String getMultiProxySocketHostHost() {
return getData().getString("MultiProxySocketHost.Host", "");
}
public boolean getMultiProxyOneGlobalReward() {
return getData().getBoolean("MultiProxyOneGlobalReward", false);
}
public Configuration getMultiProxyServersConfiguration(String s) {
return getData().getSection("MultiProxyServers." + s);
}
public Collection<String> getMultiProxyServers() {
return getData().getSection("MultiProxyServers").getKeys();
}
public boolean getPrimaryServer() {
return getData().getBoolean("PrimaryServer", false);
}
public String getFallBack() {
return getData().getString("FallBackServer", "");
}
@@ -81,14 +121,6 @@ public class Config {
return getData().getSection("SpigotServers." + s);
}
public Configuration getRedisServersConfiguration(String s) {
return getData().getSection("RedisServers." + s);
}
public Collection<String> getRedisServers() {
return getData().getSection("RedisServers").getKeys();
}
public Collection<String> getSpigotServers() {
return getData().getSection("SpigotServers").getKeys();
}
@@ -97,10 +129,6 @@ public class Config {
return getData().getBoolean("WaitForUserOnline", false);
}
public boolean getPrimaryServer() {
return getData().getBoolean("PrimaryServer", false);
}
public boolean getVotePartyEnabled() {
return getData().getBoolean("VoteParty.Enabled", false);
}
@@ -1,49 +0,0 @@
package com.bencodez.votingplugin.bungee;
import com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI;
import com.imaginarycode.minecraft.redisbungee.events.PlayerChangedServerNetworkEvent;
import com.imaginarycode.minecraft.redisbungee.events.PlayerJoinedNetworkEvent;
import lombok.Getter;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
@Deprecated
public class RedisBungee implements Listener {
@Getter
private boolean enabled;
private VotingPluginBungee plugin;
public RedisBungee(VotingPluginBungee plugin) {
this.plugin = plugin;
if (plugin.getConfig().getRedisSupport()) {
plugin.getProxy().getPluginManager().registerListener(plugin, this);
plugin.getLogger().info("Loaded expiremental redis support");
enabled = true;
} else {
enabled = false;
}
}
@EventHandler
public void playerJoinedNetworkEvent(PlayerJoinedNetworkEvent event) {
plugin.login(plugin.getProxy().getPlayer(event.getUuid()));
}
@EventHandler
public void playerChangedServerNetworkEventt(PlayerChangedServerNetworkEvent event) {
plugin.login(plugin.getProxy().getPlayer(event.getUuid()));
}
public boolean isOnline(ProxiedPlayer p) {
return RedisBungeeAPI.getRedisBungeeApi().isPlayerOnline(p.getUniqueId());
}
public void destroy() {
if (!enabled) {
return;
}
plugin.getProxy().getPluginManager().unregisterListener(this);
}
}
@@ -1,24 +0,0 @@
package com.bencodez.votingplugin.bungee;
import lombok.Getter;
import lombok.Setter;
public abstract class TimeHandle {
@Getter
@Setter
private String month;
@Getter
@Setter
private int day;
@Getter
@Setter
private int week;
public TimeHandle(String month, int day, int week) {
this.month = month;
this.day = day;
this.week = week;
}
public abstract void save();
}
@@ -4,6 +4,8 @@ import java.io.File;
import java.io.IOException;
import java.util.Collection;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
import lombok.Getter;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
@@ -52,6 +54,13 @@ public class VoteCache {
section.set("Text", voteData.getText());
}
public void addTimedVote(int num, VoteTimeQueue voteTimedQueue) {
Configuration section = getData().getSection("TimedVoteCache." + num);
section.set("Name", voteTimedQueue.getName());
section.set("Service", voteTimedQueue.getService());
section.set("Time", voteTimedQueue.getTime());
}
public void addVoteOnline(String player, int num, OfflineBungeeVote voteData) {
Configuration section = getData().getSection("OnlineCache." + player + "." + num);
section.set("Name", voteData.getPlayerName());
@@ -84,6 +93,14 @@ public class VoteCache {
return getData().getSection("VoteCache").getKeys();
}
public Configuration getTimedVoteCache(String key) {
return getData().getSection("TimedVoteCache." + key);
}
public Collection<String> getTimedVoteCache() {
return getData().getSection("TimedVoteCache").getKeys();
}
public Collection<String> getServerVotes(String server) {
return getData().getSection("VoteCache." + server).getKeys();
}
@@ -16,6 +16,7 @@ public class VoteEventBungee implements net.md_5.bungee.api.plugin.Listener {
public void onVote(VotifierEvent event) {
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
Vote vote = event.getVote();
@@ -24,11 +25,13 @@ public class VoteEventBungee implements net.md_5.bungee.api.plugin.Listener {
if (serviceSite.isEmpty()) {
serviceSite = "Empty";
vote.setServiceName(serviceSite);
}
plugin.vote(vote.getUsername(), serviceSite, true, null, null);
plugin.vote(vote.getUsername(), serviceSite, true, true, 0, null, null);
}
});
}
}
@@ -11,32 +11,45 @@ import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.CodeSource;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import com.bencodez.advancedcore.api.misc.ArrayUtils;
import com.bencodez.advancedcore.api.misc.encryption.EncryptionHandler;
import com.bencodez.advancedcore.api.misc.jsonparser.JsonParser;
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.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.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.votingplugin.timequeue.VoteTimeQueue;
import com.bencodez.votingplugin.topvoter.TopVoter;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -63,7 +76,9 @@ public class VotingPluginBungee extends Plugin implements Listener {
private HashMap<String, ClientHandler> clientHandles;
private HashMap<String, ClientHandler> redisClientHandles;
private HashMap<String, ClientHandler> multiproxyClientHandles;
private SocketHandler multiproxySocketHandler;
@Getter
private Config config;
@@ -80,17 +95,20 @@ public class VotingPluginBungee extends Plugin implements Listener {
private SocketHandler socketHandler;
private SocketHandler redisSocketHandler;
private VoteCache voteCacheFile;
private boolean votifierEnabled = true;
@Getter
private TimeHandle timeHandle;
private ConcurrentHashMap<UUID, String> uuidPlayerNameCache = new ConcurrentHashMap<UUID, String>();
@Getter
private BungeeTimeChecker bungeeTimeChecker;
private boolean enabled;
@Getter
private GlobalDataHandlerProxy globalDataHandler;
public synchronized void checkCachedVotes(String server) {
if (getProxy().getServerInfo(server) != null) {
if (!getProxy().getServerInfo(server).getPlayers().isEmpty()) {
@@ -98,11 +116,13 @@ public class VotingPluginBungee extends Plugin implements Listener {
ArrayList<OfflineBungeeVote> c = cachedVotes.get(server);
ArrayList<OfflineBungeeVote> newSet = new ArrayList<OfflineBungeeVote>();
if (!c.isEmpty()) {
int num = 1;
int numberOfVotes = c.size();
for (OfflineBungeeVote cache : c) {
boolean toSend = true;
if (getConfig().getWaitForUserOnline()) {
ProxiedPlayer p = getProxy().getPlayer(UUID.fromString(cache.getUuid()));
if (isOnline(p)) {
if (!isOnline(p)) {
toSend = false;
} else if (p != null && p.isConnected()
&& !p.getServer().getInfo().getName().equals(server)) {
@@ -115,7 +135,9 @@ public class VotingPluginBungee extends Plugin implements Listener {
cache.getService(), "" + cache.getTime(), Boolean.FALSE.toString(),
"" + cache.isRealVote(), cache.getText(),
"" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast());
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast(),
"" + num, "" + numberOfVotes);
num++;
} else {
debug("Not sending vote because user isn't on server " + server + ": "
+ cache.toString());
@@ -138,13 +160,20 @@ public class VotingPluginBungee extends Plugin implements Listener {
server = getProxy().getPlayer(UUID.fromString(uuid)).getServer().getInfo().getName();
}
if (!config.getBlockedServers().contains(server)) {
int num = 1;
int numberOfVotes = c.size();
for (OfflineBungeeVote cache : c) {
sendPluginMessageServer(server, "VoteOnline", cache.getPlayerName(), cache.getUuid(),
cache.getService(), "" + cache.getTime(), Boolean.FALSE.toString(),
"" + cache.isRealVote(), cache.getText(), "" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast());
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast(), "" + num,
"" + numberOfVotes);
num++;
}
cachedOnlineVotes.put(uuid, new ArrayList<OfflineBungeeVote>());
if (getConfig().getMultiProxySupport() && getConfig().getMultiProxyOneGlobalReward()) {
sendMultiProxyServerMessage("ClearVote", player.getName(), uuid);
}
}
}
}
@@ -156,6 +185,10 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
}
public void debug2(String msg) {
debug(msg);
}
public UUID fetchUUID(String playerName) throws Exception {
if (playerName == null || playerName.equalsIgnoreCase("null")) {
return null;
@@ -191,27 +224,34 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
public String getUUID(String playerName) {
ProxiedPlayer p = getProxy().getPlayer(playerName);
if (p != null && p.isConnected()) {
return p.getUniqueId().toString();
if (config.getOnlineMode()) {
ProxiedPlayer p = getProxy().getPlayer(playerName);
if (p != null && p.isConnected()) {
return p.getUniqueId().toString();
}
for (Entry<UUID, String> entry : uuidPlayerNameCache.entrySet()) {
if (entry.getValue().equalsIgnoreCase(playerName)) {
return entry.getKey().toString();
}
}
if (mysql != null) {
String str = mysql.getUUID(playerName);
if (str != null) {
return str;
}
}
if (nonVotedPlayersCache != null) {
return nonVotedPlayersCache.playerExists(playerName);
}
return "";
} else {
return UUID.nameUUIDFromBytes(("OfflinePlayer:" + playerName).getBytes(StandardCharsets.UTF_8)).toString();
}
for (Entry<UUID, String> entry : uuidPlayerNameCache.entrySet()) {
if (entry.getValue().equalsIgnoreCase(playerName)) {
return entry.getKey().toString();
}
}
if (mysql != null) {
String str = mysql.getUUID(playerName);
if (str != null) {
return str;
}
}
if (nonVotedPlayersCache != null) {
return nonVotedPlayersCache.playerExists(playerName);
}
return "";
}
private int getValue(ArrayList<Column> cols, String column, int toAdd) {
@@ -234,6 +274,16 @@ public class VotingPluginBungee extends Plugin implements Listener {
return toAdd;
}
@Getter
private Queue<VoteTimeQueue> timeChangeQueue = new ConcurrentLinkedQueue<VoteTimeQueue>();
public void processQueue() {
while (getTimeChangeQueue().size() > 0) {
VoteTimeQueue vote = getTimeChangeQueue().remove();
vote(vote.getName(), vote.getService(), true, false, vote.getTime(), null, null);
}
}
private void loadMysql() {
mysql = new BungeeMySQL(this, "VotingPlugin_Users", config.getData()) {
@@ -245,6 +295,127 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
};
ArrayList<String> servers = new ArrayList<String>();
for (String s : getAvailableAllServers()) {
servers.add(s);
}
if (config.getGlobalDataEnabled()) {
if (config.getGlobalDataUseMainMySQL()) {
globalDataHandler = new GlobalDataHandlerProxy(
new GlobalMySQL("VotingPlugin_GlobalData", getMysql().getMysql()) {
@Override
public void warning(String text) {
getLogger().warning(text);
}
@Override
public void severe(String text) {
getLogger().severe(text);
}
@Override
public void debug(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
debug2(text);
}
}, servers) {
@Override
public void onTimeChangedFinished(TimeType type) {
getMysql().wipeColumnData(TopVoter.of(type).getColumnName());
if (!config.getGlobalDataEnabled()) {
return;
}
for (String s : getAvailableAllServers()) {
getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessage(s, "BungeeTimeChange");
}
}
processQueue();
}
@Override
public void onTimeChangedFailed(String server, TimeType type) {
getGlobalDataHandler().setBoolean(server, type.toString(), false);
}
};
} else {
globalDataHandler = new GlobalDataHandlerProxy(new GlobalMySQL("VotingPlugin_GlobalData",
new MysqlConfigBungee(config.getData().getSection("GlobalData"))) {
@Override
public void warning(String text) {
getLogger().warning(text);
}
@Override
public void severe(String text) {
getLogger().severe(text);
}
@Override
public void debug(Exception e) {
if (config.getDebug()) {
e.printStackTrace();
}
}
@Override
public void debug(String text) {
debug2(text);
}
}, servers) {
@Override
public void onTimeChangedFinished(TimeType type) {
getMysql().wipeColumnData(TopVoter.of(type).getColumnName());
if (!config.getGlobalDataEnabled()) {
return;
}
for (String s : getAvailableAllServers()) {
getGlobalDataHandler().setBoolean(s, "ForceUpdate", true);
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
sendPluginMessageServer(s, "BungeeTimeChange", "");
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessage(s, "BungeeTimeChange");
}
}
processQueue();
}
@Override
public void onTimeChangedFailed(String server, TimeType type) {
getGlobalDataHandler().setBoolean(server, type.toString(), false);
}
};
}
getGlobalDataHandler().getGlobalMysql().alterColumnType("IgnoreTime", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("MONTH", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("WEEK", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("DAY", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("FinishedProcessing", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("Processing", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("ForceUpdate", "VARCHAR(5)");
getGlobalDataHandler().getGlobalMysql().alterColumnType("LastUpdated", "MEDIUMTEXT");
}
// column types
getMysql().alterColumnType("TopVoterIgnore", "VARCHAR(5)");
getMysql().alterColumnType("CheckWorld", "VARCHAR(5)");
@@ -333,30 +504,41 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
}
}
timeHandle.save();
if (!timeChangeQueue.isEmpty()) {
int num = 0;
for (VoteTimeQueue vote : timeChangeQueue) {
voteCacheFile.addTimedVote(num, vote);
num++;
}
}
voteCacheFile.save();
nonVotedPlayersCache.save();
if (mysql != null) {
mysql.shutdown();
}
getLogger().info("VotingPlugin disabled");
enabled = false;
}
private VoteEventBungee voteEventBungee;
@Override
public void onEnable() {
enabled = true;
try {
Class.forName("com.vexsoftware.votifier.bungee.events.VotifierEvent");
} catch (ClassNotFoundException e) {
votifierEnabled = false;
getLogger().warning("Votifier event not found, not loading votifier event");
}
if (votifierEnabled) {
try {
getProxy().getPluginManager().registerListener(this, new VoteEventBungee(this));
getProxy().getPluginManager().registerListener(this, this);
voteEventBungee = new VoteEventBungee(this);
getProxy().getPluginManager().registerListener(this, voteEventBungee);
} catch (Exception e) {
votifierEnabled = false;
}
}
getProxy().getPluginManager().registerListener(this, this);
config = new Config(this);
config.load();
@@ -381,27 +563,149 @@ public class VotingPluginBungee extends Plugin implements Listener {
method = BungeeMethod.PLUGINMESSAGING;
}
bungeeTimeChecker = new BungeeTimeChecker(config.getData().getInt("TimeHourOffSet")) {
@Override
public void warning(String text) {
getLogger().warning(text);
}
@Override
public void timeChanged(TimeType type, boolean fake, boolean pre, boolean post) {
if (!config.getGlobalDataEnabled()) {
return;
}
for (String s : getAvailableAllServers()) {
if (getGlobalDataHandler().getGlobalMysql().containsKey(s)) {
String lastOnlineStr = getGlobalDataHandler().getString(s, "LastOnline");
long lastOnline = 0;
try {
lastOnline = Long.valueOf(lastOnlineStr);
} catch (NumberFormatException e) {
e.printStackTrace();
}
if (LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli() - lastOnline < 1000
* 60 * 60 * 12) {
// server has been online within the 12 hours
HashMap<String, DataValue> dataToSet = new HashMap<String, DataValue>();
dataToSet.put("LastUpdated", new DataValueString(
"" + LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli()));
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");
}
} else {
getLogger().warning("Server " + s + " hasn't been online recently");
}
} else {
getLogger().warning("Server " + s + " global data handler disabled?");
}
}
globalDataHandler.onTimeChange(type);
}
@Override
public void setPrevWeek(int week) {
voteCacheFile.getData().set("Time.Week", week);
voteCacheFile.save();
}
@Override
public void setPrevMonth(String text) {
voteCacheFile.getData().set("Time.Month", text);
voteCacheFile.save();
}
@Override
public void setPrevDay(int day) {
voteCacheFile.getData().set("Time.Day", day);
voteCacheFile.save();
}
@Override
public void setLastUpdated() {
voteCacheFile.getData().set("Time.LastUpdated", System.currentTimeMillis());
voteCacheFile.save();
}
@Override
public void setIgnoreTime(boolean ignore) {
voteCacheFile.getData().set("Time.IgnoreTime", ignore);
voteCacheFile.save();
}
@Override
public boolean isIgnoreTime() {
return voteCacheFile.getData().getBoolean("Time.IgnoreTime");
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void info(String text) {
getLogger().info(text);
}
@Override
public int getPrevWeek() {
return voteCacheFile.getData().getInt("Time.Week");
}
@Override
public String getPrevMonth() {
return voteCacheFile.getData().getString("Time.Month");
}
@Override
public int getPrevDay() {
return voteCacheFile.getData().getInt("Time.Day");
}
@Override
public long getLastUpdated() {
return voteCacheFile.getData().getLong("Time.LastUpdated");
}
@Override
public void debug(String text) {
debug2(text);
}
};
this.getProxy().registerChannel("vp:vp");
if (mysqlLoaded) {
uuidPlayerNameCache = mysql.getRowsUUIDNameQuery();
voteCacheFile = new VoteCache(this);
voteCacheFile.load();
bungeeTimeChecker.loadTimer();
nonVotedPlayersCache = new NonVotedPlayersCache(this);
nonVotedPlayersCache.load();
timeHandle = new TimeHandle(voteCacheFile.getData().getString("Time.Month", ""),
voteCacheFile.getData().getInt("Time.Day"), voteCacheFile.getData().getInt("Time.Week")) {
@Override
public void save() {
voteCacheFile.getData().set("Time.Month", timeHandle.getMonth());
voteCacheFile.getData().set("Time.Day", timeHandle.getDay());
voteCacheFile.getData().set("Time.Week", timeHandle.getWeek());
try {
for (String key : voteCacheFile.getTimedVoteCache()) {
Configuration data = voteCacheFile.getTimedVoteCache(key);
timeChangeQueue.add(
new VoteTimeQueue(data.getString("Name"), data.getString("Service"), data.getLong("Time")));
}
};
processQueue();
} catch (Exception e) {
e.printStackTrace();
}
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
@@ -441,6 +745,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
@Override
public void run() {
for (String server : cachedVotes.keySet()) {
checkCachedVotes(server);
}
@@ -449,7 +754,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
checkOnlineVotes(getProxy().getPlayer(UUID.fromString(player)), player, null);
}
}
}, 15l, 30l, TimeUnit.SECONDS);
}, 60l, 60l, TimeUnit.SECONDS);
getProxy().getScheduler().schedule(this, new Runnable() {
@@ -517,39 +822,11 @@ public class VotingPluginBungee extends Plugin implements Listener {
votePartyVotes = voteCacheFile.getVotePartyCurrentVotes();
}
if (getConfig().getRedisSupport()) {
redisSocketHandler = new SocketHandler(getDescription().getVersion(), config.getRedisSocketHostHost(),
config.getRedisSocketHostPort(), encryptionHandler, config.getDebug()) {
loadMultiProxySupport();
@Override
public void log(String str) {
getLogger().info(str);
}
};
redisSocketHandler.add(new SocketReceiver() {
@Override
public void onReceive(String[] data) {
if (data.length > 8) {
if (data[0].equalsIgnoreCase("Vote")) {
// todo
// sendRedisServerMessage("Vote", uuid, player, service, "" + votePartyVotes,""
// + currentVotePartyVotesRequired, "" + time, "" + realVote, text.toString());
vote(data[2], data[3], Boolean.valueOf(data[7]), new BungeeMessageData(data[8]), data[1]);
}
}
}
});
clientHandles = new HashMap<String, ClientHandler>();
for (
String s : config.getRedisServers()) {
Configuration d = config.getRedisServersConfiguration(s);
redisClientHandles.put(s, new ClientHandler(d.getString("Host", ""), d.getInt("Port", 1234),
encryptionHandler, config.getDebug()));
if (!votifierEnabled) {
if (!(getConfig().getMultiProxySupport() && !getConfig().getPrimaryServer())) {
getLogger().warning("Votifier event not found, not loading votifier event");
}
}
@@ -573,6 +850,16 @@ public class VotingPluginBungee extends Plugin implements Listener {
metrics.addCustomChart(
new BStatsMetricsBungee.SimplePie("waitforuseronline", () -> "" + getConfig().getWaitForUserOnline()));
metrics.addCustomChart(
new BStatsMetricsBungee.SimplePie("globaldata_enabled", () -> "" + getConfig().getGlobalDataEnabled()));
if (getConfig().getGlobalDataEnabled()) {
metrics.addCustomChart(new BStatsMetricsBungee.SimplePie("globaldata_usemainmysql",
() -> "" + getConfig().getGlobalDataUseMainMySQL()));
}
metrics.addCustomChart(new BStatsMetricsBungee.SimplePie("multi_proxy_support_enabled",
() -> "" + getConfig().getMultiProxySupport()));
if (!buildNumber.equals("NOTSET")) {
metrics.addCustomChart(new BStatsMetricsBungee.SimplePie("dev_build_number", () -> "" + buildNumber));
}
@@ -586,6 +873,63 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
}
public void loadMultiProxySupport() {
if (getConfig().getMultiProxySupport()) {
if (encryptionHandler == null) {
encryptionHandler = new EncryptionHandler(new File(getDataFolder(), "secretkey.key"));
}
multiproxySocketHandler = new SocketHandler(getDescription().getVersion(),
config.getMultiProxySocketHostHost(), config.getMultiProxySocketHostPort(), encryptionHandler,
config.getDebug()) {
@Override
public void log(String str) {
getLogger().info(str);
}
};
multiproxySocketHandler.add(new SocketReceiver() {
@Override
public void onReceive(String[] data) {
if (data.length > 0) {
if (data[0].equalsIgnoreCase("Status")) {
getLogger().info("Multi-proxy status message received");
} else if (data[0].equalsIgnoreCase("ClearVote")) {
cachedOnlineVotes.remove(data[2]);
}
}
if (data.length > 8) {
if (data[0].equalsIgnoreCase("Vote")) {
vote(data[2], data[3], Boolean.valueOf(data[7]), true, 0, new BungeeMessageData(data[8]),
data[1]);
} else if (data[0].equalsIgnoreCase("VoteOnline")) {
vote(data[2], data[3], Boolean.valueOf(data[7]), true, 0, new BungeeMessageData(data[8]),
data[1]);
}
}
}
});
multiproxyClientHandles = new HashMap<String, ClientHandler>();
for (
String s : config.getMultiProxyServers()) {
Configuration d = config.getMultiProxyServersConfiguration(s);
multiproxyClientHandles.put(s, new ClientHandler(d.getString("Host", ""), d.getInt("Port", 1234),
encryptionHandler, config.getDebug()));
}
getLogger().info("Loaded multi-proxy support");
} else {
if (multiproxySocketHandler != null) {
multiproxySocketHandler.getServer().close();
}
}
}
@EventHandler
public void onLogin(PostLoginEvent event) {
getProxy().getScheduler().runAsync(this, new Runnable() {
@@ -609,20 +953,21 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
public void login(ProxiedPlayer p) {
if (isOnline(p)) {
if (p.getServer() != null && p.getServer().getInfo() != null) {
final String server = p.getServer().getInfo().getName();
final ProxiedPlayer proixedPlayer = p;
getProxy().getScheduler().runAsync(this, new Runnable() {
if (p != null && p.getServer() != null && p.getServer().getInfo() != null) {
final String server = p.getServer().getInfo().getName();
final ProxiedPlayer proixedPlayer = p;
getProxy().getScheduler().schedule(this, new Runnable() {
@Override
public void run() {
@Override
public void run() {
if (isOnline(p)) {
checkCachedVotes(server);
checkOnlineVotes(proixedPlayer, proixedPlayer.getUniqueId().toString(), server);
}
});
}
}
}, 1, TimeUnit.SECONDS);
}
}
@EventHandler
@@ -655,18 +1000,15 @@ public class VotingPluginBungee extends Plugin implements Listener {
return;
} else if (subchannel.equalsIgnoreCase("login")) {
String player = in.readUTF();
debug("Login: " + player);
String uuid = in.readUTF();
String server = "";
if (size > 2) {
server = in.readUTF();
}
debug("Login: " + player + "/" + uuid + " " + server);
ProxiedPlayer p = getProxy().getPlayer(player);
login(p);
return;
} else if (subchannel.equalsIgnoreCase("timeupdate")) {
String str = in.readUTF();
String[] data = str.split(Pattern.quote("//"));
if (data.length == 3) {
timeHandle.setMonth(data[0]);
timeHandle.setDay(Integer.parseInt(data[1]));
timeHandle.setWeek(Integer.parseInt(data[2]));
}
} else {
// reforward message
out.writeUTF(subchannel);
@@ -674,7 +1016,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
for (int i = 0; i < size; i++) {
out.writeUTF(in.readUTF());
}
for (String send : getProxy().getServers().keySet()) {
for (String send : getAvailableAllServers()) {
if (getProxy().getServers().get(send).getPlayers().size() > 0) {
getProxy().getServers().get(send).sendData("vp:vp".toLowerCase(), outstream.toByteArray());
}
@@ -718,6 +1060,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
e.printStackTrace();
}
}
loadMultiProxySupport();
}
public void sendPluginMessageServer(String server, String channel, String... messageData) {
@@ -747,8 +1090,8 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
}
public void sendRedisServerMessage(String... messageData) {
for (ClientHandler h : redisClientHandles.values()) {
public void sendMultiProxyServerMessage(String... messageData) {
for (ClientHandler h : multiproxyClientHandles.values()) {
h.sendMessage(messageData);
}
}
@@ -796,40 +1139,60 @@ public class VotingPluginBungee extends Plugin implements Listener {
if (method.equals(BungeeMethod.SOCKETS)) {
sendServerMessage("status");
} else if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
for (String s : getProxy().getServers().keySet()) {
if (!config.getBlockedServers().contains(s)) {
ServerInfo info = getProxy().getServerInfo(s);
if (info.getPlayers().isEmpty()) {
getLogger().info("No players on server " + s + " to send test status message");
} else {
// send
getLogger().info("Sending request for status message on " + s);
sendPluginMessageServer(s, "Status", s);
}
for (String s : getAvailableAllServers()) {
ServerInfo info = getProxy().getServerInfo(s);
if (info.getPlayers().isEmpty()) {
getLogger().info("No players on server " + s + " to send test status message");
} else {
getLogger().info("Ignoring blocked server " + s);
// send
getLogger().info("Sending request for status message on " + s);
sendPluginMessageServer(s, "Status", s);
}
}
}
}
public synchronized void vote(String player, String service, boolean realVote, BungeeMessageData text,
String uuid) {
public synchronized void vote(String player, String service, boolean realVote, boolean timeQueue, long queueTime,
BungeeMessageData text, String uuid) {
try {
if (player == null || player.isEmpty()) {
getLogger().info("No name from vote on " + service);
return;
}
if (uuid == null) {
if (timeQueue) {
if (getConfig().getGlobalDataEnabled()) {
if (getGlobalDataHandler().isTimeChangedHappened()) {
timeChangeQueue.add(new VoteTimeQueue(player, service,
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
getLogger().info("Cachcing vote from " + player + "/" + service
+ " because time change is happening right now");
return;
}
}
}
if (uuid == null || uuid.isEmpty()) {
uuid = getUUID(player);
}
if (uuid.isEmpty()) {
if (config.getGeyserSupport()) {
if (!player.startsWith(config.getGeyserPrefix())) {
uuid = getUUID(config.getGeyserPrefix() + player);
player = config.getGeyserPrefix() + player;
}
}
}
if (uuid.isEmpty()) {
if (config.getAllowUnJoined()) {
debug("Fetching UUID online, since allowunjoined is enabled");
UUID u = null;
try {
u = fetchUUID(player);
if (config.getOnlineMode()) {
u = fetchUUID(player);
}
} catch (Exception e) {
if (getConfig().getDebug()) {
e.printStackTrace();
@@ -848,7 +1211,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
player = getProperName(uuid, player);
if (!getConfig().getPrimaryServer()) {
if (getConfig().getPrimaryServer() || !getConfig().getMultiProxySupport()) {
addVoteParty();
if (getConfig().getBungeeManageTotals()) {
@@ -887,50 +1250,53 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
long time = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
if (queueTime != 0) {
time = queueTime;
}
ProxiedPlayer p = getProxy().getPlayer(UUID.fromString(uuid));
if (method.equals(BungeeMethod.PLUGINMESSAGING)) {
if (config.getSendVotesToAllServers()) {
for (String s : getProxy().getServers().keySet()) {
if (!config.getBlockedServers().contains(s)) {
ServerInfo info = getProxy().getServerInfo(s);
boolean forceCache = false;
ProxiedPlayer p = getProxy().getPlayer(UUID.fromString(uuid));
if (!isOnline(p) && getConfig().getWaitForUserOnline()) {
forceCache = true;
debug("Forcing vote to cache");
}
if (config.getBroadcast()) {
sendPluginMessageServer(s, "VoteBroadcast", uuid, player, service);
}
if (info.getPlayers().isEmpty() || forceCache) {
// cache
if (!cachedVotes.containsKey(s)) {
cachedVotes.put(s, new ArrayList<OfflineBungeeVote>());
}
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
sendPluginMessageServer(s, "Vote", player, uuid, service, "" + time,
Boolean.TRUE.toString(), "" + realVote, text.toString(),
"" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast());
}
for (String s : getAvailableAllServers()) {
ServerInfo info = getProxy().getServerInfo(s);
boolean forceCache = false;
if (!isOnline(p) && getConfig().getWaitForUserOnline()) {
forceCache = true;
debug("Forcing vote to cache");
}
if (config.getBroadcast()) {
sendPluginMessageServer(s, "VoteBroadcast", uuid, player, service);
}
if (info.getPlayers().isEmpty() || forceCache) {
// cache
if (!cachedVotes.containsKey(s)) {
cachedVotes.put(s, new ArrayList<OfflineBungeeVote>());
}
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
sendPluginMessageServer(s, "Vote", player, uuid, service, "" + time,
Boolean.TRUE.toString(), "" + realVote, text.toString(),
"" + getConfig().getBungeeManageTotals(),
"" + BungeeVersion.getPluginMessageVersion(), "" + config.getBroadcast(), "1", "1");
}
}
} else {
ProxiedPlayer p = getProxy().getPlayer(UUID.fromString(uuid));
if (isOnline(p) && !config.getBlockedServers().contains(p.getServer().getInfo().getName())) {
sendPluginMessageServer(p.getServer().getInfo().getName(), "VoteOnline", player, uuid, service,
"" + time, Boolean.TRUE.toString(), "" + realVote, text.toString(),
"" + getConfig().getBungeeManageTotals(), "" + BungeeVersion.getPluginMessageVersion(),
"" + config.getBroadcast());
"" + config.getBroadcast(), "1", "1");
if (getConfig().getMultiProxySupport() && getConfig().getMultiProxyOneGlobalReward()) {
sendMultiProxyServerMessage("ClearVote", player, uuid);
}
} else {
if (!cachedOnlineVotes.containsKey(uuid)) {
cachedOnlineVotes.put(uuid, new ArrayList<OfflineBungeeVote>());
@@ -943,7 +1309,7 @@ public class VotingPluginBungee extends Plugin implements Listener {
cachedOnlineVotes.put(uuid, list);
debug("Caching online vote for " + player + " on " + service);
}
for (String s : getProxy().getServers().keySet()) {
for (String s : getAvailableAllServers()) {
if (config.getBroadcast()) {
sendPluginMessageServer(s, "VoteBroadcast", uuid, player, service);
}
@@ -955,9 +1321,22 @@ public class VotingPluginBungee extends Plugin implements Listener {
} else if (method.equals(BungeeMethod.SOCKETS)) {
sendSocketVote(player, service, text);
}
if (getConfig().getRedisSupport() && getConfig().getPrimaryServer()) {
sendRedisServerMessage("Vote", uuid, player, service, "" + votePartyVotes,
"" + currentVotePartyVotesRequired, "" + time, "" + realVote, text.toString());
if (getConfig().getMultiProxySupport() && getConfig().getPrimaryServer()) {
if (!getConfig().getMultiProxyOneGlobalReward()) {
debug("Seending global proxy vote message");
sendMultiProxyServerMessage("Vote", uuid, player, service, "" + votePartyVotes,
"" + currentVotePartyVotesRequired, "" + time, "" + realVote, text.toString());
} else {
// check if reward should've already been given
if (!(isOnline(p) && !config.getBlockedServers().contains(p.getServer().getInfo().getName()))) {
debug("Sending global proxy voteonline message");
sendMultiProxyServerMessage("VoteOnline", uuid, player, service, "" + votePartyVotes,
"" + currentVotePartyVotesRequired, "" + time, "" + realVote, text.toString());
} else {
debug("Not sending global proxy message for voteonline, player already got reward");
}
}
}
} catch (Exception e) {
e.printStackTrace();
@@ -965,6 +1344,21 @@ public class VotingPluginBungee extends Plugin implements Listener {
}
public Set<String> getAvailableAllServers() {
Set<String> servers = new HashSet<String>();
if (config.getWhiteListedServers().isEmpty()) {
for (String s : getProxy().getServers().keySet()) {
if (!config.getBlockedServers().contains(s)) {
servers.add(s);
}
}
} else {
servers.addAll(config.getWhiteListedServers());
}
return servers;
}
private int votePartyVotes = 0;
private int currentVotePartyVotesRequired = 0;
@@ -1,5 +1,7 @@
package com.bencodez.votingplugin.bungee;
import com.bencodez.advancedcore.api.time.TimeType;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.plugin.Command;
@@ -28,10 +30,16 @@ public class VotingPluginBungeeCommand extends Command {
if (args.length >= 2) {
String user = args[1];
String site = args[2];
bungee.vote(user, site, false, null, null);
bungee.vote(user, site, false, true, 0, null, null);
sender.sendMessage(new TextComponent("Sending vote"));
}
}
if (args[0].equalsIgnoreCase("forcetimechange")) {
if (args.length >= 2) {
bungee.getBungeeTimeChecker().forceChanged(TimeType.getTimeType(args[1]));
sender.sendMessage(new TextComponent("Triggering time change: " + args[1]));
}
}
if (args[0].equalsIgnoreCase("status")) {
if (bungee.getMethod().equals(BungeeMethod.SOCKETS)) {
sender.sendMessage(new TextComponent(
@@ -46,6 +54,10 @@ public class VotingPluginBungeeCommand extends Command {
new TextComponent("&aNot using socket/pluginmessage method, command unavailable"));
}
}
if (args[0].equalsIgnoreCase("multiproxystatus")) {
bungee.sendMultiProxyServerMessage("Status");
sender.sendMessage(new TextComponent("&aSending status message"));
}
if (args[0].equalsIgnoreCase("help")) {
TextComponent[] msg = new TextComponent[4];
msg[0] = new TextComponent("&avotingpluginbungee reload - Reload plugin");
@@ -25,12 +25,24 @@ public class Config extends VelocityYMLFile {
return getStringList(getNode("BlockedServers"), new ArrayList<String>());
}
public List<String> getWhiteListedServers() {
return getStringList(getNode("WhiteListedServers"), new ArrayList<String>());
}
public boolean getBroadcast() {
return getBoolean(getNode("Broadcast"), false);
}
public String getBungeeHost() {
return getString(getNode("BungeeServer", "Host"), "");
public boolean getOnlineMode() {
return getBoolean(getNode("OnlineMode"), true);
}
public boolean getGlobalDataEnabled() {
return getBoolean(getNode("GlobalData", "Enabled"), false);
}
public boolean getGlobalDataUseMainMySQL() {
return getBoolean(getNode("GlobalData", "UseMainMySQL"), true);
}
public boolean getBungeeManageTotals() {
@@ -41,6 +53,10 @@ public class Config extends VelocityYMLFile {
return getString(getNode("BungeeMethod"), "PLUGINMESSAGING");
}
public String getBungeeHost() {
return getString(getNode("BungeeServer", "Host"), "");
}
public int getBungeePort() {
return getInt(getNode("BungeeServer", "Port"), 1297);
}
@@ -108,4 +124,41 @@ public class Config extends VelocityYMLFile {
public boolean getWaitForUserOnline() {
return getBoolean(getNode("WaitForUserOnline"), false);
}
public boolean getMultiProxySupport() {
return getBoolean(getNode("MultiProxySupport"), false);
}
public boolean getMultiProxyOneGlobalReward() {
return getBoolean(getNode("MultiProxyOneGlobalReward"), false);
}
public boolean getGeyserSupport() {
return getBoolean(getNode("GeyserSupport"), false);
}
public boolean getPrimaryServer() {
return getBoolean(getNode("PrimaryServer"), false);
}
public String getGeyserPrefix() {
return getString(getNode("GeyserPrefix"), "*");
}
public ConfigurationNode getMultiProxyServers(String s) {
return getNode("MultiProxyServers", s);
}
public @NonNull Collection<? extends ConfigurationNode> getMultiProxyServers() {
return getNode("MultiProxyServers").getChildrenMap().values();
}
public String getMultiProxySocketHostHost() {
return getString(getNode("MultiProxySocketHost", "Host"), "");
}
public int getMultiProxySocketHostPort() {
return getInt(getNode("MultiProxySocketHost", "Port"), 1297);
}
}
@@ -5,6 +5,7 @@ import java.util.Collection;
import com.bencodez.advancedcore.bungeeapi.velocity.VelocityYMLFile;
import com.bencodez.votingplugin.bungee.OfflineBungeeVote;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
import ninja.leaping.configurate.ConfigurationNode;
@@ -49,6 +50,13 @@ public class VoteCache extends VelocityYMLFile {
getNode(path, "Text").setValue(voteData.getText());
}
public void addTimedVote(int num, VoteTimeQueue voteTimedQueue) {
String[] path = new String[] { "TimedVoteCache", "" + num };
getNode(path, "Name").setValue(voteTimedQueue.getName());
getNode(path, "Service").setValue(voteTimedQueue.getService());
getNode(path, "Time").setValue(voteTimedQueue.getTime());
}
public void addVoteOnline(String player, int num, OfflineBungeeVote voteData) {
String[] path = new String[] { "OnlineCache", player, "" + num };
@@ -70,6 +78,10 @@ public class VoteCache extends VelocityYMLFile {
return getKeys(getNode("OnlineCache", name));
}
public ConfigurationNode getTimedVoteCache(String name) {
return getNode("TimedVoteCache", name);
}
public ConfigurationNode getOnlineVotes(String name, String num) {
return getNode("OnlineCache", name, num);
}
@@ -82,6 +94,10 @@ public class VoteCache extends VelocityYMLFile {
return getKeys(getNode("VoteCache"));
}
public Collection<String> getTimedVoteCache() {
return getKeys(getNode("TimedVoteCache"));
}
public Collection<String> getServerVotes(String server) {
return getKeys(getNode("OnlineCache", server));
}
@@ -0,0 +1,32 @@
package com.bencodez.votingplugin.bungee.velocity;
import com.velocitypowered.api.event.Subscribe;
import com.vexsoftware.votifier.velocity.event.VotifierEvent;
public class VoteEventVelocity {
private VotingPluginVelocity plugin;
public VoteEventVelocity(VotingPluginVelocity plugin) {
this.plugin = plugin;
}
@Subscribe
public void onVotifierEvent(VotifierEvent event) {
final String serviceSiteVote = event.getVote().getServiceName();
final String name = event.getVote().getUsername();
plugin.getTimer().execute(new Runnable() {
@Override
public void run() {
String serviceSite = serviceSiteVote;
plugin.getLogger().info("Vote received " + name + " from service site " + serviceSite);
if (serviceSite.isEmpty()) {
serviceSite = "Empty";
}
plugin.vote(name, serviceSite, true, false, 0, null, null);
}
});
}
}
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,6 @@
package com.bencodez.votingplugin.bungee.velocity;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.votingplugin.bungee.BungeeMethod;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.SimpleCommand;
@@ -33,10 +34,16 @@ public class VotingPluginVelocityCommand implements SimpleCommand {
if (args.length >= 2) {
String user = args[1];
String site = args[2];
plugin.vote(user, site, false);
plugin.vote(user, site, false, true, 0, null, null);
source.sendMessage(Component.text("Sending vote").color(NamedTextColor.AQUA));
}
}
if (args[0].equalsIgnoreCase("forcetimechange")) {
if (args.length >= 2) {
plugin.getBungeeTimeChecker().forceChanged(TimeType.getTimeType(args[1]));
source.sendMessage(Component.text("Triggering time change: " + args[1]).color(NamedTextColor.AQUA));
}
}
if (args[0].equalsIgnoreCase("status")) {
if (plugin.getMethod().equals(BungeeMethod.SOCKETS)) {
source.sendMessage(
@@ -53,6 +60,10 @@ public class VotingPluginVelocityCommand implements SimpleCommand {
.color(NamedTextColor.AQUA));
}
}
if (args[0].equalsIgnoreCase("multiproxystatus")) {
plugin.sendMultiProxyServerMessage("Status");
source.sendMessage(Component.text("Sending status message").color(NamedTextColor.AQUA));
}
if (args[0].equalsIgnoreCase("help")) {
String[] msg = new String[4];
msg[0] = "votingpluginbungee reload - Reload plugin";
@@ -371,14 +371,14 @@ public class CommandLoader {
@Override
public void execute(CommandSender sender, String[] args) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(args[1]);
user.cache();
int newTotal = 0;
synchronized (pointLock) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(args[1]);
user.cache();
int newTotal = 0;
newTotal = user.addPoints(Integer.parseInt(args[3]));
sender.sendMessage(StringParser.getInstance().colorize("&cGave " + args[1] + " " + args[3]
+ " points" + ", " + args[1] + " now has " + newTotal + " points"));
}
sender.sendMessage(StringParser.getInstance().colorize("&cGave " + args[1] + " " + args[3]
+ " points" + ", " + args[1] + " now has " + newTotal + " points"));
}
});
@@ -868,15 +868,22 @@ public class CommandLoader {
public void execute(CommandSender sender, String[] args) {
sendMessage(sender, "&cTriggering vote for all voting sites...");
for (VoteSite site : plugin.getVoteSites()) {
PlayerVoteEvent voteEvent = new PlayerVoteEvent(site, args[1], site.getServiceSite(), false);
if (voteEvent.getVoteSite() != null) {
if (!voteEvent.getVoteSite().isVaidServiceSite()) {
sendMessage(sender,
"&cPossible issue with service site, has the server gotten the vote from "
+ voteEvent.getServiceSite() + "?");
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
PlayerVoteEvent voteEvent = new PlayerVoteEvent(site, args[1], site.getServiceSite(),
false);
if (voteEvent.getVoteSite() != null) {
if (!voteEvent.getVoteSite().isVaidServiceSite()) {
sendMessage(sender,
"&cPossible issue with service site, has the server gotten the vote from "
+ voteEvent.getServiceSite() + "?");
}
}
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
}
plugin.getServer().getPluginManager().callEvent(voteEvent);
});
}
if (plugin.isYmlError()) {
@@ -893,17 +900,24 @@ public class CommandLoader {
public void execute(CommandSender sender, String[] args) {
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(args[2], true), args[1], args[2],
false);
sendMessage(sender, "&cTriggering vote...");
if (voteEvent.getVoteSite() != null) {
if (!voteEvent.getVoteSite().isVaidServiceSite()) {
sendMessage(sender, "&cPossible issue with service site, has the server gotten the vote from "
+ voteEvent.getServiceSite() + "?");
}
}
plugin.getServer().getPluginManager().callEvent(voteEvent);
sendMessage(sender, "&cTriggering vote...");
if (plugin.isYmlError()) {
sendMessage(sender, "&3Detected yml error, please check server log for details");
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
});
if (plugin.isYmlError()) {
sendMessage(sender, "&3Detected yml error, please check server log for details");
}
}
}
@@ -926,7 +940,13 @@ public class CommandLoader {
+ voteEvent.getServiceSite() + "?");
}
}
plugin.getServer().getPluginManager().callEvent(voteEvent);
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
});
if (plugin.isYmlError()) {
sendMessage(sender, "&3Detected yml error, please check server log for details");
@@ -999,6 +1019,21 @@ public class CommandLoader {
}
});
plugin.getAdminVoteCommand()
.add(new CommandHandler(new String[] { "User", "(Player)", "ForceCoolDownEndRewards", "(Sitename)" },
"VotingPlugin.Commands.AdminVote.ForceCoolDownEndRewards|" + adminPerm,
"Trigger CoolDownEndRewards manually") {
@Override
public void execute(CommandSender sender, String[] args) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(args[1]);
plugin.getRewardHandler().giveReward(user, plugin.getVoteSite(args[3], true).getSiteData(),
"CoolDownEndRewards", new RewardOptions());
sendMessage(sender, "&cCoolDownEndRewards forced on votesite " + args[3]);
}
});
plugin.getAdminVoteCommand().add(new CommandHandler(new String[] { "VoteSite", "(sitename)", "Create" },
"VotingPlugin.Commands.AdminVote.VoteSite.Edit|" + adminPerm, "Create VoteSite") {
@@ -1201,7 +1236,7 @@ public class CommandLoader {
plugin.getAdminVoteCommand()
.add(new CommandHandler(new String[] { "Test", "(Player)", "(sitename)", "(number)" },
"VotingPlugin.Commands.AdminVote.Test|" + adminPerm, "Test voting times") {
"VotingPlugin.Commands.AdminVote.Test|" + adminPerm, "Test voting speed, for debug") {
@Override
public void execute(CommandSender sender, String[] args) {
@@ -1212,9 +1247,22 @@ public class CommandLoader {
}
});
plugin.getAdminVoteCommand()
.add(new CommandHandler(new String[] { "TestSpam", "(Player)", "(sitename)", "(number)" },
"VotingPlugin.Commands.AdminVote.TestSpam|" + adminPerm, "Test voting spam speed, for debug") {
@Override
public void execute(CommandSender sender, String[] args) {
VoteTester.getInstance().testSpam(Integer.parseInt(args[3]), args[1], args[2]);
if (isPlayer(sender)) {
sendMessage(sender, "&cSee console for details");
}
}
});
plugin.getAdminVoteCommand()
.add(new CommandHandler(new String[] { "TestReward", "(Player)", "(reward)", "(number)" },
"VotingPlugin.Commands.AdminVote.TestReward|" + adminPerm, "Test reward times") {
"VotingPlugin.Commands.AdminVote.TestReward|" + adminPerm, "Test reward speed, for debug") {
@Override
public void execute(CommandSender sender, String[] args) {
@@ -1243,7 +1291,7 @@ public class CommandLoader {
@Override
public void execute(CommandSender sender, String[] args) {
plugin.getVoteParty().giveRewards(plugin.getBungeeSettings().isUseBungeecoord());
plugin.getVoteParty().giveRewards(null, plugin.getBungeeSettings().isUseBungeecoord());
}
});
@@ -1280,8 +1328,8 @@ public class CommandLoader {
@Override
public void execute(CommandSender sender, String[] args) {
plugin.getServerData().setVotePartyExtraRequired(Integer.parseInt(args[1]));
sendMessage(sender, "&cSet VotePartyExtraRequired to " + args[1]);
plugin.getServerData().setVotePartyExtraRequired(Integer.parseInt(args[2]));
sendMessage(sender, "&cSet VotePartyExtraRequired to " + args[2]);
}
});
@@ -1398,6 +1446,18 @@ public class CommandLoader {
}
});
plugin.getAdminVoteCommand().add(new CommandHandler(new String[] { "User", "(player)", "ForceAlmostAllSites" },
"VotingPlugin.Commands.AdminVote.ForceAllSites|" + adminPerm, "Force a almostallsites reward") {
@Override
public void execute(CommandSender sender, String[] args) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(args[1]);
plugin.getSpecialRewards().giveAlmostAllSitesRewards(user, user.isOnline(),
plugin.getBungeeSettings().isUseBungeecoord());
sendMessage(sender, "&cAlmostAllSites forced");
}
});
plugin.getAdminVoteCommand().add(new CommandHandler(new String[] { "User", "(player)", "ForceFirstVote" },
"VotingPlugin.Commands.AdminVote.ForceFirstVote|" + adminPerm, "Force a firstvote reward") {
@@ -131,6 +131,15 @@ public class AdminGUI {
}
});
buttons.add(new BInventoryButton(new ItemBuilder(Material.STONE, 1).setName("&cEdit AlmostAllSites reward")) {
@Override
public void onClick(ClickEvent clickEvent) {
RewardEditGUI.getInstance().openRewardGUI(clickEvent.getPlayer(),
plugin.getRewardHandler().getDirectlyDefined("AlmostAllSites"));
}
});
buttons.add(new BInventoryButton(new ItemBuilder(Material.STONE, 1).setName("&cEdit AnySiteRewards")) {
@Override
@@ -242,7 +251,13 @@ public class AdminGUI {
if (ob != null) {
VoteSite site = (VoteSite) ob;
PlayerVoteEvent voteEvent = new PlayerVoteEvent(site, value, site.getServiceSite(), false);
plugin.getServer().getPluginManager().callEvent(voteEvent);
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
});
}
}
}, ArrayUtils.getInstance().convert(playerNames)).usingMethod(InputMethod.INVENTORY)
@@ -370,6 +385,29 @@ public class AdminGUI {
});
}
if (voteSite.getSiteData().isList("CoolDownEndRewards")) {
inv.addButton(new EditGUIButton(new EditGUIValueList("CoolDownEndRewards",
voteSite.getSiteData().getStringList("CoolDownEndRewards")) {
@Override
public void setValue(Player p, ArrayList<String> rewards) {
VoteSite voteSite = (VoteSite) getInv().getMeta(player, "VoteSite");
plugin.getConfigVoteSites().set(voteSite.getKey(), "CoolDownEndRewards", rewards);
plugin.reload();
}
}));
} else {
inv.addButton(new BInventoryButton(new ItemBuilder(Material.DISPENSER, 1).setName("&cCoolDownEndRewards")) {
@Override
public void onClick(ClickEvent clickEvent) {
RewardEditGUI.getInstance().openRewardGUI(clickEvent.getPlayer(), plugin.getRewardHandler()
.getDirectlyDefined("VoteSites." + voteSite.getKey() + ".CoolDownEndRewards"));
}
});
}
inv.openInventory(player);
}
}
@@ -85,7 +85,7 @@ public class AdminVoteVoteShopItem extends GUIHandler {
// display item
ConfigurationSection displayItemData = plugin.getGui().getChestShopIdentifierSection(identifier);
inv.addButton(new EditGUIButton(new ItemBuilder(Material.valueOf(displayItemData.getString("Material")), 1),
inv.addButton(new EditGUIButton(new ItemBuilder(displayItemData.getString("Material")).setAmount(1),
new EditGUIValueString("Material", displayItemData.getString("Material")) {
@Override
@@ -98,7 +98,7 @@ public class VoteShop extends GUIHandler {
int points = plugin.getGui().getChestShopIdentifierCost(identifier);
if (identifier != null) {
if (plugin.getGui().getChestVoteShopCloseGUI(identifier)) {
event.getButton().getInv().closeInv(player, null);
event.closeInventory();
}
// limit fail-safe, should never be needed, except in rare cases
@@ -81,6 +81,14 @@ public class BungeeSettings extends YMLFile {
@Getter
private boolean disableBroadcast = false;
@ConfigDataBoolean(path = "GlobalData.UseMainMySQL")
@Getter
private boolean globlalDataUseMainMySQL = true;
@ConfigDataBoolean(path = "GlobalData.Enabled")
@Getter
private boolean globlalDataEnabled = false;
public BungeeSettings(VotingPluginMain plugin) {
super(plugin, new File(plugin.getDataFolder(), "BungeeSettings.yml"));
}
@@ -33,6 +33,14 @@ public class Config extends YMLFile {
@Getter
private boolean addTotals = true;
@ConfigDataBoolean(path = "PerSiteCoolDownEvents")
@Getter
private boolean perSiteCoolDownEvents = false;
@ConfigDataBoolean(path = "QueueVotesDuringTimeChange")
@Getter
private boolean queueVotesDuringTimeChange = false;
@ConfigDataBoolean(path = "AllowUnjoined")
@Getter
private boolean allowUnjoined = false;
@@ -19,6 +19,9 @@ public class SpecialRewardsConfig extends YMLFile {
@Getter
private String allSitesRewardPath = "AllSites";
@Getter
private String almostAllSitesRewardPath = "AlmostAllSites";
@Getter
private String anySiteRewardsPath = "AnySiteRewards";
@@ -271,6 +274,10 @@ public class SpecialRewardsConfig extends YMLFile {
return getData().getBoolean("VoteParty.OnlyOncePerDay");
}
public boolean getVotePartyOnlyOncePerWeek() {
return getData().getBoolean("VoteParty.OnlyOncePerWeek");
}
public boolean getVotePartyResetEachDay() {
return getData().getBoolean("VoteParty.ResetEachDay");
}
@@ -1,10 +1,11 @@
package com.bencodez.votingplugin.cooldown;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -15,20 +16,24 @@ import com.bencodez.advancedcore.api.user.AdvancedCoreUser;
import com.bencodez.advancedcore.api.user.UserStartup;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.PlayerVoteCoolDownEndEvent;
import com.bencodez.votingplugin.events.PlayerVoteSiteCoolDownEndEvent;
import com.bencodez.votingplugin.objects.VoteSite;
import com.bencodez.votingplugin.user.VotingPluginUser;
public class CoolDownCheck implements Listener {
private VotingPluginMain plugin;
private Set<UUID> uuids = new HashSet<UUID>();
private HashMap<UUID, ScheduledFuture<?>> perSiteTasks = new HashMap<UUID, ScheduledFuture<?>>();
private HashMap<UUID, ScheduledFuture<?>> allSiteTasks = new HashMap<UUID, ScheduledFuture<?>>();
public CoolDownCheck(VotingPluginMain plugin) {
this.plugin = plugin;
this.timer = new Timer();
this.timer = Executors.newScheduledThreadPool(1);
}
private Timer timer;
private ScheduledExecutorService timer;
private boolean cooldownCheckEnabled = false;
@@ -45,12 +50,18 @@ public class CoolDownCheck implements Listener {
check(plugin.getVotingPluginUserManager().getVotingPluginUser(uuid));
}
public void vote(VotingPluginUser user) {
public void checkPerSite(UUID uuid) {
checkPerSite(plugin.getVotingPluginUserManager().getVotingPluginUser(uuid));
}
public void vote(VotingPluginUser user, VoteSite site) {
if (cooldownCheckEnabled) {
UUID uuid = UUID.fromString(user.getUUID());
if (!uuids.contains(uuid)) {
schedule(user);
}
schedule(user);
}
if (plugin.getConfigFile().isPerSiteCoolDownEvents()) {
user.setCoolDownCheckSite(site, Boolean.FALSE);
schedulePerSite(user);
}
}
@@ -60,10 +71,53 @@ public class CoolDownCheck implements Listener {
user.setCoolDownCheck(false);
PlayerVoteCoolDownEndEvent event = new PlayerVoteCoolDownEndEvent(user);
plugin.getServer().getPluginManager().callEvent(event);
uuids.remove(UUID.fromString(user.getUUID()));
allSiteTasks.remove(user.getJavaUUID());
} else if (!coolDownCheck) {
schedule(user);
}
}
public synchronized void checkPerSite(VotingPluginUser user) {
if (plugin.getConfigFile().isPerSiteCoolDownEvents()) {
HashMap<VoteSite, Boolean> coolDownChecks = user.getCoolDownCheckSiteList();
boolean changed = false;
for (VoteSite site : plugin.getVoteSites()) {
if (user.canVoteSite(site)) {
if (!coolDownChecks.containsKey(site) || !coolDownChecks.get(site).booleanValue()) {
coolDownChecks.put(site, Boolean.TRUE);
changed = true;
PlayerVoteSiteCoolDownEndEvent event = new PlayerVoteSiteCoolDownEndEvent(user, site);
plugin.getServer().getPluginManager().callEvent(event);
}
}
}
if (changed) {
user.setCoolDownCheckSite(coolDownChecks);
}
}
schedulePerSite(user);
}
public void schedulePerSite(VotingPluginUser user) {
final UUID uuid = UUID.fromString(user.getUUID());
long time = user.getNextTimeFirstSiteAvailable();
if (time > 0) {
if (perSiteTasks.containsKey(uuid)) {
perSiteTasks.get(uuid).cancel(false);
perSiteTasks.remove(uuid);
}
plugin.devDebug("PerSiteCoolDownEvent schedule time: " + time);
ScheduledFuture<?> scheduledFuture = timer.schedule(new Runnable() {
@Override
public void run() {
checkPerSite(uuid);
}
}, time + 2, TimeUnit.SECONDS);
perSiteTasks.put(uuid, scheduledFuture);
}
}
@@ -72,39 +126,47 @@ public class CoolDownCheck implements Listener {
long time = user.getNextTimeAllSitesAvailable();
if (time > 0) {
user.setCoolDownCheck(true);
uuids.add(uuid);
timer.schedule(new TimerTask() {
if (allSiteTasks.containsKey(uuid)) {
allSiteTasks.get(uuid).cancel(false);
allSiteTasks.remove(uuid);
}
ScheduledFuture<?> scheduledFuture = timer.schedule(new Runnable() {
@Override
public void run() {
check(uuid);
}
}, time * 1000 + 1500);
}, time + 2, TimeUnit.SECONDS);
allSiteTasks.put(uuid, scheduledFuture);
}
}
public void load() {
if (cooldownCheckEnabled) {
plugin.addUserStartup(new UserStartup() {
@Override
public void onStartUp(AdvancedCoreUser advancedcoreUser) {
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(advancedcoreUser);
plugin.addUserStartup(new UserStartup() {
@Override
public void onStartUp(AdvancedCoreUser advancedcoreUser) {
VotingPluginUser user = plugin.getVotingPluginUserManager().getVotingPluginUser(advancedcoreUser);
if (cooldownCheckEnabled) {
check(user);
}
@Override
public void onStart() {
if (plugin.getConfigFile().isPerSiteCoolDownEvents()) {
checkPerSite(user);
}
}
@Override
public void onFinish() {
@Override
public void onStart() {
}
});
}
}
@Override
public void onFinish() {
}
});
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@@ -112,4 +174,11 @@ public class CoolDownCheck implements Listener {
plugin.getRewardHandler().giveReward(event.getPlayer(), plugin.getSpecialRewardsConfig().getData(),
"VoteCoolDownEndedReward", new RewardOptions());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onCoolDownEnd(PlayerVoteSiteCoolDownEndEvent event) {
plugin.getRewardHandler().giveReward(event.getPlayer(), event.getSite().getSiteData(), "CoolDownEndRewards",
new RewardOptions());
}
}
@@ -1,8 +1,10 @@
package com.bencodez.votingplugin.data;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.bukkit.Bukkit;
@@ -12,6 +14,7 @@ import org.bukkit.configuration.ConfigurationSection;
import com.bencodez.advancedcore.api.misc.ArrayUtils;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.signs.SignHandler;
import com.bencodez.votingplugin.timequeue.VoteTimeQueue;
// TODO: Auto-generated Javadoc
/**
@@ -157,7 +160,16 @@ public class ServerData {
public boolean isLastVotePartySameDay() {
int num = getData().getInt("LastVoteParty", 0);
if (num != plugin.getTimeChecker().getTime().getDayOfYear()) {
if (num == plugin.getTimeChecker().getTime().getDayOfYear()) {
return true;
}
return false;
}
public boolean isLastVotePartySameWeek() {
int num = getData().getInt("LastVotePartyWeek", -1);
if (num == plugin.getTimeChecker().getTime().get(WeekFields.of(Locale.getDefault()).weekOfYear())
&& num != -1) {
return true;
}
return false;
@@ -264,6 +276,12 @@ public class ServerData {
saveData();
}
public void updateLastVotePartyWeek() {
getData().set("LastVotePartyWeek",
plugin.getTimeChecker().getTime().get(WeekFields.of(Locale.getDefault()).weekOfYear()));
saveData();
}
public int getBungeeVotePartyCurrent() {
return getData().getInt("BungeeVotePartyCurrent");
}
@@ -288,4 +306,28 @@ public class ServerData {
public void updateValues() {
setVersion();
}
public void addTimeVoted(int num, VoteTimeQueue vote) {
getData().set("TimedVoteCache." + num + ".Name", vote.getName());
getData().set("TimedVoteCache." + num + ".Service", vote.getService());
getData().set("TimedVoteCache." + num + ".Time", vote.getTime());
saveData();
}
public Set<String> getTimedVoteCacheKeys() {
if (getData().isConfigurationSection("TimedVoteCache")) {
return getData().getConfigurationSection("TimedVoteCache").getKeys(false);
} else {
return new HashSet<String>();
}
}
public ConfigurationSection getTimedVoteCacheSection(String num) {
return getData().getConfigurationSection("TimedVoteCache." + num);
}
public void clearTimedVoteCache() {
getData().set("TimedVoteCache", null);
saveData();
}
}
@@ -80,6 +80,10 @@ public class PlayerVoteEvent extends Event {
@Setter
private boolean broadcast = true;
@Getter
@Setter
private int voteNumber = 1;
public PlayerVoteEvent(VoteSite voteSite, String voteUsername, String serviceSite, boolean realVote) {
super(true);
this.player = voteUsername;
@@ -0,0 +1,58 @@
package com.bencodez.votingplugin.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import com.bencodez.votingplugin.objects.VoteSite;
import com.bencodez.votingplugin.user.VotingPluginUser;
import lombok.Getter;
import lombok.Setter;
// TODO: Auto-generated Javadoc
/**
* The Class PlayerVoteEvent.
*/
public class PlayerVoteSiteCoolDownEndEvent extends Event {
/** The Constant handlers. */
private static final HandlerList handlers = new HandlerList();
/**
* Gets the handler list.
*
* @return the handler list
*/
public static HandlerList getHandlerList() {
return handlers;
}
@Getter
@Setter
private boolean cancelled;
@Getter
@Setter
private VotingPluginUser player;
@Getter
@Setter
private VoteSite site;
public PlayerVoteSiteCoolDownEndEvent(VotingPluginUser user, VoteSite site) {
super(true);
player = user;
this.site = site;
}
/*
* (non-Javadoc)
*
* @see org.bukkit.event.Event#getHandlers()
*/
@Override
public HandlerList getHandlers() {
return handlers;
}
}
@@ -3,7 +3,7 @@ package com.bencodez.votingplugin.events;
import lombok.Getter;
public enum SpecialRewardType {
ALLSITE, CUMMULATIVE, FIRSTVOTE, FIRSTVOTETODAY, MILESTONE, VOTESTREAK;
ALLSITE, CUMMULATIVE, FIRSTVOTE, FIRSTVOTETODAY, MILESTONE, VOTESTREAK, ALMOSTALLSITES;
@Getter
private int amount = -1;
@@ -1,7 +1,5 @@
package com.bencodez.votingplugin.listeners;
import java.util.TimerTask;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -51,7 +49,8 @@ public class PlayerJoinEvent implements Listener {
if (plugin.getBungeeSettings().isUseBungeecoord()
&& plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)) {
plugin.getPluginMessaging().sendPluginMessage("Login", user.getPlayerName(), user.getUUID());
plugin.getPluginMessaging().sendPluginMessage("Login", user.getPlayerName(), user.getUUID(),
plugin.getBungeeSettings().getServer());
}
}
@@ -74,7 +73,7 @@ public class PlayerJoinEvent implements Listener {
public void onPlayerQuit(PlayerQuitEvent event) {
if (plugin != null && plugin.isEnabled()) {
final java.util.UUID uuid = event.getPlayer().getUniqueId();
plugin.getLoginTimer().schedule(new TimerTask() {
plugin.getLoginTimer().execute(new Runnable() {
@Override
public void run() {
@@ -84,7 +83,7 @@ public class PlayerJoinEvent implements Listener {
user.dontCache();
user.logoutRewards();
}
}, 0);
});
}
}
}
@@ -3,10 +3,9 @@ package com.bencodez.votingplugin.listeners;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.TimerTask;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -27,8 +26,6 @@ import com.bencodez.votingplugin.user.VotingPluginUser;
*/
public class PlayerVoteListener implements Listener {
private static Object object = new Object();
private VotingPluginMain plugin;
/**
@@ -48,9 +45,11 @@ public class PlayerVoteListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onplayerVote(PlayerVoteEvent event) {
if (!plugin.isEnabled()) {
plugin.getLogger().warning("Plugin disabled, ignoring vote");
return;
}
String playerName = event.getPlayer();
plugin.debug("Processing PlayerVoteEvent: " + playerName + "/" + event.getServiceSite());
if (!PlayerUtils.getInstance().isValidUser(playerName, plugin.getConfigFile().isAllowUnJoinedCheckServer())) {
if (!plugin.getConfigFile().isAllowUnjoined()) {
plugin.getLogger().warning("Player " + playerName
@@ -63,7 +62,7 @@ public class PlayerVoteListener implements Listener {
}
if (playerName.isEmpty()) {
plugin.getLogger().warning("Empty player name for vote");
plugin.getLogger().warning("Empty player name from vote, ignoring");
return;
}
@@ -106,7 +105,13 @@ public class PlayerVoteListener implements Listener {
if (event.getVotingPluginUser() != null) {
user = event.getVotingPluginUser();
} else {
user = UserManager.getInstance().getVotingPluginUser(playerName);
Player p = Bukkit.getPlayerExact(playerName);
if (p != null) {
// player online
user = UserManager.getInstance().getVotingPluginUser(p);
} else {
user = UserManager.getInstance().getVotingPluginUser(playerName);
}
}
if (voteSite.isWaitUntilVoteDelay() && !user.canVoteSite(voteSite)) {
@@ -114,129 +119,119 @@ public class PlayerVoteListener implements Listener {
return;
}
synchronized (object) {
if (!plugin.isEnabled()) {
return;
}
// reupdate cache
user.clearCache();
user.cache();
final String uuid = user.getUUID();
user.updateName(true);
// reupdate cache
user.clearCache();
user.cache();
// vote party
plugin.getVoteParty().vote(user, event.isRealVote(), event.isForceBungee());
user.updateName(true);
if (event.isBroadcast() && !plugin.getBungeeSettings().isDisableBroadcast()) {
// broadcast vote if enabled in config
if (plugin.getConfigFile().isBroadcastVotesEnabled()
&& (plugin.getBungeeSettings().isBungeeBroadcast() || !event.isBungee())) {
if (!plugin.getConfigFile().getFormatBroadcastWhenOnline() || user.isOnline()) {
voteSite.broadcastVote(user);
}
// vote party
plugin.getVoteParty().vote(user, event.isRealVote(), event.isForceBungee());
if (event.isBroadcast() && !plugin.getBungeeSettings().isDisableBroadcast()) {
// broadcast vote if enabled in config
if (plugin.getConfigFile().isBroadcastVotesEnabled()
&& (plugin.getBungeeSettings().isBungeeBroadcast() || !event.isBungee())) {
if (!plugin.getConfigFile().getFormatBroadcastWhenOnline() || user.isOnline()) {
voteSite.broadcastVote(user);
}
}
}
if (plugin.getBroadcastHandler() != null) {
plugin.getBroadcastHandler().onVote(playerName);
if (plugin.getBroadcastHandler() != null) {
plugin.getBroadcastHandler().onVote(playerName);
}
// update last vote time
if (event.getTime() != 0) {
user.setTime(voteSite, event.getTime());
} else {
user.setTime(voteSite);
}
// try logging to file
if (plugin.getConfigFile().isLogVotesToFile()) {
try {
plugin.logVote(LocalDateTime.now().atZone(ZoneId.systemDefault()).toLocalDateTime(), playerName,
voteSite.getKey());
} catch (Exception e) {
e.printStackTrace();
}
}
// update last vote time
if (event.getTime() != 0) {
user.setTime(voteSite, event.getTime());
} else {
user.setTime(voteSite);
// check first vote rewards
plugin.getSpecialRewards().checkFirstVote(user, event.isForceBungee());
plugin.getSpecialRewards().checkFirstVoteToday(user, event.isForceBungee());
if (user.isReminded() && plugin.getConfigFile().getVoteRemindingRemindOnlyOnce()) {
user.setReminded(false);
}
// check if player has voted on all sites in one day
if (((user.isOnline() || voteSite.isGiveOffline()) && plugin.getOptions().isProcessRewards())
|| event.isBungee()) {
boolean online = true;
if (event.isBungee()) {
online = event.isWasOnline();
}
plugin.getCoolDownCheck().vote(user);
// try logging to file
if (plugin.getConfigFile().isLogVotesToFile()) {
try {
plugin.logVote(LocalDateTime.now().atZone(ZoneId.systemDefault()).toLocalDateTime(), playerName,
voteSite.getKey());
} catch (Exception e) {
e.printStackTrace();
}
}
// check first vote rewards
plugin.getSpecialRewards().checkFirstVote(user, event.isForceBungee());
plugin.getSpecialRewards().checkFirstVoteToday(user, event.isForceBungee());
if (user.isReminded() && plugin.getConfigFile().getVoteRemindingRemindOnlyOnce()) {
user.setReminded(false);
}
// check if player has voted on all sites in one day
if (((user.isOnline() || voteSite.isGiveOffline()) && plugin.getOptions().isProcessRewards())
|| event.isBungee()) {
boolean online = true;
if (event.isBungee()) {
online = event.isWasOnline();
}
user.playerVote(voteSite, online, false, event.isForceBungee());
user.playerVote(voteSite, online, false, event.isForceBungee());
if (event.getVoteNumber() == 1) {
user.sendVoteEffects(online);
if (plugin.getConfigFile().isCloseInventoryOnVote()) {
user.closeInv();
}
} else {
user.addOfflineVote(voteSite.getKey());
plugin.debug(
"Offline vote set for " + playerName + " (" + user.getUUID() + ") on " + voteSite.getKey());
}
// add to total votes
if ((plugin.getConfigFile().isCountFakeVotes() || event.isRealVote()) && event.isAddTotals()) {
if (plugin.getConfigFile().isAddTotals()) {
user.addTotal();
user.addTotalDaily();
user.addTotalWeekly();
}
user.addPoints();
if (plugin.getConfigFile().isCloseInventoryOnVote()) {
user.closeInv();
}
} else {
user.addOfflineVote(voteSite.getKey());
plugin.debug("Offline vote set for " + playerName + " (" + user.getUUID() + ") on " + voteSite.getKey());
}
user.checkDayVoteStreak(event.isForceBungee());
// add to total votes
if ((plugin.getConfigFile().isCountFakeVotes() || event.isRealVote()) && event.isAddTotals()) {
if (plugin.getConfigFile().isAddTotals()) {
user.addTotal();
user.addTotalDaily();
user.addTotalWeekly();
}
user.addPoints();
}
user.checkDayVoteStreak(event.isForceBungee());
// other rewards
plugin.getSpecialRewards().checkAllSites(user, event.isForceBungee());
plugin.getSpecialRewards().checkCumualativeVotes(user, event.getBungeeTextTotals(), event.isForceBungee());
plugin.getSpecialRewards().checkMilestone(user, event.getBungeeTextTotals(), event.isForceBungee());
// other rewards
plugin.getSpecialRewards().checkAllSites(user, event.isForceBungee());
plugin.getSpecialRewards().checkAlmostAllSites(user, event.isForceBungee());
plugin.getSpecialRewards().checkCumualativeVotes(user, event.getBungeeTextTotals(), event.isForceBungee());
plugin.getSpecialRewards().checkMilestone(user, event.getBungeeTextTotals(), event.isForceBungee());
plugin.getCoolDownCheck().vote(user, voteSite);
final String uuid = user.getUUID();
if (plugin.getBungeeSettings().isUseBungeecoord()) {
if (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.MYSQL)) {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
if (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.MYSQL)) {
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
@Override
public void run() {
if (Bukkit.getOnlinePlayers().size() > 0) {
plugin.getPluginMessaging().sendPluginMessage("VoteUpdate", uuid);
}
@Override
public void run() {
if (Bukkit.getOnlinePlayers().size() > 0) {
plugin.getPluginMessaging().sendPluginMessage("VoteUpdate", uuid);
}
}, 40);
}
}
PlayerPostVoteEvent postVoteEvent = new PlayerPostVoteEvent(voteSite, user, event.isRealVote(),
event.isForceBungee());
plugin.getServer().getPluginManager().callEvent(postVoteEvent);
plugin.getTimer().schedule(new TimerTask() {
@Override
public void run() {
VotingPluginUser user = plugin.getVotingPluginUserManager()
.getVotingPluginUser(UUID.fromString(uuid));
if (!user.isOnline()) {
user.clearCache();
}
}
}, 1000 * 5);
}, 40);
}
}
PlayerPostVoteEvent postVoteEvent = new PlayerPostVoteEvent(voteSite, user, event.isRealVote(),
event.isForceBungee());
plugin.getServer().getPluginManager().callEvent(postVoteEvent);
if (!user.isOnline()) {
user.clearCache();
}
plugin.setUpdate(true);
plugin.extraDebug("Finished vote processing: " + playerName + "/" + uuid);
}
}
@@ -1,7 +1,6 @@
package com.bencodez.votingplugin.listeners;
import java.util.ArrayList;
import java.util.TimerTask;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -65,53 +64,66 @@ public class VotiferEvent implements Listener {
plugin.debug("VoteSite: " + voteSite);
plugin.debug("IP: " + IP);
plugin.getVoteTimer().schedule(new TimerTask() {
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
plugin.getServerData().addServiceSite(voteSite);
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getBungeeSettings().isVotifierBypass()
&& (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.SOCKETS))) {
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");
return;
}
String voteSiteNameStr = plugin.getVoteSiteName(false, voteSite);
try {
plugin.getServerData().addServiceSite(voteSite);
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getBungeeSettings().isVotifierBypass()
&& (plugin.getBungeeHandler().getMethod().equals(BungeeMethod.PLUGINMESSAGING)
|| plugin.getBungeeHandler().getMethod().equals(BungeeMethod.SOCKETS))) {
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");
return;
}
String voteSiteNameStr = plugin.getVoteSiteName(false, voteSite);
ArrayList<String> sites = plugin.getConfigVoteSites().getVoteSitesNames(false);
boolean createSite = false;
if (sites != null) {
if (!ArrayUtils.getInstance().containsIgnoreCase(sites, voteSiteNameStr)) {
ArrayList<String> sites = plugin.getConfigVoteSites().getVoteSitesNames(false);
boolean createSite = false;
if (sites != null) {
if (!ArrayUtils.getInstance().containsIgnoreCase(sites, voteSiteNameStr)) {
createSite = true;
}
} else {
createSite = true;
}
} else {
createSite = true;
}
if (plugin.getConfigFile().isAutoCreateVoteSites() && createSite) {
plugin.getLogger().warning("VoteSite with service site '" + voteSiteNameStr
+ "' does not exist, attempting to generate...");
plugin.getConfigVoteSites().generateVoteSite(voteSiteNameStr);
if (plugin.getConfigFile().isAutoCreateVoteSites() && createSite) {
plugin.getLogger().warning("VoteSite with service site '" + voteSiteNameStr
+ "' does not exist, attempting to generate...");
plugin.getConfigVoteSites().generateVoteSite(voteSiteNameStr);
plugin.getLogger().info("Current known service sites: "
+ ArrayUtils.getInstance().makeStringList(plugin.getServerData().getServiceSites()));
}
plugin.getLogger().info("Current known service sites: "
+ ArrayUtils.getInstance().makeStringList(plugin.getServerData().getServiceSites()));
}
String voteSiteName = plugin.getVoteSiteName(true, voteSite);
if (plugin.getTimeChecker().isActiveProcessing()
&& plugin.getConfigFile().isQueueVotesDuringTimeChange()) {
// time change in progress
plugin.debug("Adding vote to time queue " + voteUsername + "/" + voteSite);
plugin.getTimeQueueHandler().addVote(voteUsername, voteSite);
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(voteSiteName, true), voteUsername,
voteSite, true);
plugin.getServer().getPluginManager().callEvent(voteEvent);
return;
}
if (voteEvent.isCancelled()) {
plugin.debug("Vote cancelled");
return;
String voteSiteName = plugin.getVoteSiteName(true, voteSite);
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(voteSiteName, true),
voteUsername, voteSite, true);
plugin.getServer().getPluginManager().callEvent(voteEvent);
if (voteEvent.isCancelled()) {
plugin.debug("Vote cancelled");
return;
}
} catch (Exception e) {
plugin.getLogger().severe("Error occured during vote processing");
e.printStackTrace();
}
}
}, 0);
});
}
}
@@ -172,7 +172,8 @@ public class VoteSite {
}
public String getVoteURL(boolean json) {
if (!plugin.getConfigFile().isFormatCommandsVoteForceLinks() || !json) {
if (!plugin.getConfigFile().isFormatCommandsVoteForceLinks() || !json
|| StringParser.getInstance().containsJson(voteURL)) {
return voteURL;
} else {
if (!voteURL.startsWith("http")) {
@@ -763,16 +763,19 @@ public class PlaceHolders {
@Override
public void onChange(AdvancedCoreUser user, String... keys) {
VotingPluginUser vpUser = UserManager.getInstance().getVotingPluginUser(user);
if (!vpUser.isCached()) {
vpUser.dontCache();
}
for (PlaceHolder<VotingPluginUser> placeholder : placeholders) {
if (placeholder.isUsesCache()) {
for (String key : keys) {
if (placeholder.getUpdateDataKey().equalsIgnoreCase(key)) {
VotingPluginUser vpUser = UserManager.getInstance().getVotingPluginUser(user);
user.dontCache();
for (String ident : placeholder.getCache().keySet()) {
placeholder.getCache().get(ident).put(vpUser.getJavaUUID(),
placeholder.placeholderRequest(vpUser, ident));
plugin.devDebug("Updated placeholder cache for " + vpUser.getUUID() + " on " + key);
String value = placeholder.placeholderRequest(vpUser, ident);
placeholder.getCache().get(ident).put(vpUser.getJavaUUID(), value);
plugin.devDebug("Updated placeholder cache for " + vpUser.getUUID() + " on " + key
+ " with " + value);
}
@@ -811,19 +814,15 @@ public class PlaceHolders {
public void onUpdate(VotingPluginUser user) {
for (PlaceHolder<VotingPluginUser> placeholder : placeholders) {
if (placeholder.isUsesCache()) {
if (!placeholder.getIdentifier().startsWith("Top_") || placeholder.getCache().isEmpty()
|| placeholder.getUpdateDataKey().isEmpty()) {
for (String ident : placeholder.getCache().keySet()) {
placeholder.getCache().get(ident).put(user.getJavaUUID(),
placeholder.placeholderRequest(user, ident));
}
for (String ident : placeholder.getCache().keySet()) {
placeholder.getCache().get(ident).put(user.getJavaUUID(),
placeholder.placeholderRequest(user, ident));
}
}
}
}
public void onUpdate() {
ArrayList<String> uuids = UserManager.getInstance().getAllUUIDs();
while (!placeholdersToSetCacheOn.isEmpty()) {
String toCache = placeholdersToSetCacheOn.poll();
for (NonPlayerPlaceHolder<VotingPluginUser> placeholder : nonPlayerPlaceholders) {
@@ -858,24 +857,6 @@ public class PlaceHolders {
}
}
}
for (String uuid : uuids) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid));
user.dontCache();
for (PlaceHolder<VotingPluginUser> placeholder : placeholders) {
if (placeholder.isUsesCache()) {
if (placeholder.getIdentifier().startsWith("Top_")) {
for (String ident : placeholder.getCache().keySet()) {
if (ident != null) {
placeholder.getCache().get(ident).put(user.getJavaUUID(),
placeholder.placeholderRequest(user, ident));
} else {
plugin.debug("ident null: " + placeholder.getIdentifier());
}
}
}
}
}
}
}
}
@@ -49,6 +49,22 @@ public class SpecialRewards {
return checkAllVotes;
}
public boolean checkAlmostAllSites(VotingPluginUser user, boolean forceBungee) {
boolean checkAllVotes = user.checkAlmostAllVotes();
if (checkAllVotes) {
int currentDay = LocalDateTime.now().getDayOfYear();
int day = user.getGottenAlmostAllSitesDay();
if (currentDay == day) {
checkAllVotes = false;
plugin.debug("Not giving almostallsites, already gotten today");
} else {
user.setGottenAlmostAllSitesDay(currentDay);
giveAlmostAllSitesRewards(user, user.isOnline(), forceBungee);
}
}
return checkAllVotes;
}
public boolean checkCumualativeVotes(VotingPluginUser user, BungeeMessageData bungeeMessageData,
boolean forceBungee) {
boolean gotCumulativeAny = false;
@@ -283,6 +299,18 @@ public class SpecialRewards {
new RewardOptions().setServer(forceBungee).setOnline(online));
}
public void giveAlmostAllSitesRewards(VotingPluginUser user, boolean online, boolean forceBungee) {
PlayerSpecialRewardEvent event = new PlayerSpecialRewardEvent(user, SpecialRewardType.ALMOSTALLSITES);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
plugin.getRewardHandler().giveReward(user, plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getAlmostAllSitesRewardPath(),
new RewardOptions().setServer(forceBungee).setOnline(online));
}
public void giveCumulativeVoteReward(VotingPluginUser user, boolean online, int cumulative, boolean forceBungee) {
PlayerSpecialRewardEvent event = new PlayerSpecialRewardEvent(user,
SpecialRewardType.CUMMULATIVE.setAmount(cumulative));
@@ -294,7 +322,7 @@ public class SpecialRewards {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getCumulativeRewardsPath(cumulative)).setServer(forceBungee)
.setOnline(online).withPlaceHolder("Cumulative", "" + cumulative).send(user);
.setOnline(online).withPlaceHolder("Cumulative", "" + cumulative).send(user);
}
public void giveFirstVoteRewards(VotingPluginUser user, boolean online, boolean forceBungee) {
@@ -331,7 +359,7 @@ public class SpecialRewards {
}
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getMilestoneRewardsPath(milestone)).setOnline(online)
.withPlaceHolder("Milestone", "" + milestone).setServer(forceBungee).send(user);
.withPlaceHolder("Milestone", "" + milestone).setServer(forceBungee).send(user);
}
public void giveVoteStreakReward(VotingPluginUser user, boolean online, String type, String string, int votes,
@@ -345,8 +373,7 @@ public class SpecialRewards {
}
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getVoteStreakRewardsPath(type, string)).setOnline(online)
.withPlaceHolder("Type", type).setServer(forceBungee).withPlaceHolder("Streak", "" + votes)
.send(user);
.withPlaceHolder("Type", type).setServer(forceBungee).withPlaceHolder("Streak", "" + votes).send(user);
}
}
@@ -2,6 +2,8 @@ package com.bencodez.votingplugin.test;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import com.bencodez.advancedcore.api.rewards.Reward;
import com.bencodez.advancedcore.api.rewards.RewardOptions;
import com.bencodez.votingplugin.VotingPluginMain;
@@ -20,55 +22,95 @@ public class VoteTester {
private VotingPluginMain plugin = VotingPluginMain.plugin;
public void testRewards(int amount, String name, String rewardName) {
long time1 = System.currentTimeMillis();
ArrayList<Long> timesPerReward = new ArrayList<Long>();
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(name);
Reward reward = plugin.getRewardHandler().getReward(rewardName);
int rewardsGiven = 0;
for (int i = 0; i < amount; i++) {
long start1 = System.currentTimeMillis();
if (reward.canGiveReward(user, new RewardOptions())) {
rewardsGiven++;
plugin.getRewardHandler().giveReward(user, reward, new RewardOptions().setIgnoreRequirements(true));
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
long time1 = System.currentTimeMillis();
ArrayList<Long> timesPerReward = new ArrayList<Long>();
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(name);
Reward reward = plugin.getRewardHandler().getReward(rewardName);
int rewardsGiven = 0;
for (int i = 0; i < amount; i++) {
long start1 = System.currentTimeMillis();
if (reward.canGiveReward(user, new RewardOptions())) {
rewardsGiven++;
plugin.getRewardHandler().giveReward(user, reward,
new RewardOptions().setIgnoreRequirements(true));
}
long start2 = System.currentTimeMillis();
timesPerReward.add(start2 - start1);
}
long time2 = System.currentTimeMillis();
long time = time2 - time1;
long timeTotal = 0;
for (Long t : timesPerReward) {
timeTotal += t.longValue();
}
long timePerRewardAvg = timeTotal / timesPerReward.size();
VotingPluginMain.plugin.getLogger()
.info("Time to process rewards (" + amount + "): " + time + " ms, average per reward "
+ timePerRewardAvg + " ms. " + VotingPluginMain.plugin.getStorageType() + ", "
+ UserManager.getInstance().getAllUUIDs().size() + " users. " + rewardsGiven
+ " rewards given");
}
long start2 = System.currentTimeMillis();
timesPerReward.add(start2 - start1);
}
long time2 = System.currentTimeMillis();
long time = time2 - time1;
long timeTotal = 0;
for (Long t : timesPerReward) {
timeTotal += t.longValue();
}
long timePerRewardAvg = timeTotal / timesPerReward.size();
VotingPluginMain.plugin.getLogger().info("Time to process rewards (" + amount + "): " + time
+ " ms, average per reward " + timePerRewardAvg + " ms. " + VotingPluginMain.plugin.getStorageType()
+ ", " + UserManager.getInstance().getAllUUIDs().size() + " users. " + rewardsGiven + " rewards given");
});
}
public void testVotes(int amount, String name, String site) {
long time1 = System.currentTimeMillis();
ArrayList<Long> timesPerVote = new ArrayList<Long>();
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
long time1 = System.currentTimeMillis();
ArrayList<Long> timesPerVote = new ArrayList<Long>();
for (int i = 0; i < amount; i++) {
long start1 = System.currentTimeMillis();
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(site, false), name,
plugin.getVoteSiteServiceSite(site), false);
plugin.getServer().getPluginManager().callEvent(voteEvent);
long start2 = System.currentTimeMillis();
timesPerVote.add(start2 - start1);
}
long time2 = System.currentTimeMillis();
long time = time2 - time1;
long timeTotal = 0;
for (Long t : timesPerVote) {
timeTotal += t.longValue();
}
long timePerVoteAvg = timeTotal / timesPerVote.size();
VotingPluginMain.plugin.getLogger()
.info("Time to process votes (" + amount + "): " + time + " ms, average per vote "
+ timePerVoteAvg + " ms. " + VotingPluginMain.plugin.getStorageType() + ", "
+ UserManager.getInstance().getAllUUIDs().size() + " users. "
+ VotingPluginMain.plugin.getVoteSites().size() + " votesites");
}
});
}
public void testSpam(int amount, String name, String site) {
for (int i = 0; i < amount; i++) {
long start1 = System.currentTimeMillis();
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(site, false), name,
plugin.getVoteSiteServiceSite(site), false);
plugin.getServer().getPluginManager().callEvent(voteEvent);
long start2 = System.currentTimeMillis();
timesPerVote.add(start2 - start1);
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
plugin.getVoteTimer().submit(new Runnable() {
@Override
public void run() {
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(site, false), name,
plugin.getVoteSiteServiceSite(site), false);
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
});
}
});
}
long time2 = System.currentTimeMillis();
long time = time2 - time1;
long timeTotal = 0;
for (Long t : timesPerVote) {
timeTotal += t.longValue();
}
long timePerVoteAvg = timeTotal / timesPerVote.size();
VotingPluginMain.plugin.getLogger()
.info("Time to process votes (" + amount + "): " + time + " ms, average per vote " + timePerVoteAvg
+ " ms. " + VotingPluginMain.plugin.getStorageType() + ", "
+ UserManager.getInstance().getAllUUIDs().size() + " users. "
+ VotingPluginMain.plugin.getVoteSites().size() + " votesites");
}
}
@@ -0,0 +1,89 @@
package com.bencodez.votingplugin.timequeue;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.bencodez.advancedcore.api.time.events.DateChangedEvent;
import com.bencodez.votingplugin.VotingPluginMain;
import com.bencodez.votingplugin.events.PlayerVoteEvent;
import lombok.Getter;
public class TimeQueueHandler implements Listener {
@Getter
private Queue<VoteTimeQueue> timeChangeQueue = new ConcurrentLinkedQueue<VoteTimeQueue>();
private VotingPluginMain plugin;
public TimeQueueHandler(VotingPluginMain plugin) {
this.plugin = plugin;
load();
}
public void processQueue() {
while (getTimeChangeQueue().size() > 0) {
VoteTimeQueue vote = getTimeChangeQueue().remove();
PlayerVoteEvent voteEvent = new PlayerVoteEvent(
plugin.getVoteSite(plugin.getVoteSiteName(true, vote.getService()), true), vote.getName(),
vote.getService(), true);
voteEvent.setTime(voteEvent.getTime());
plugin.getServer().getPluginManager().callEvent(voteEvent);
if (voteEvent.isCancelled()) {
plugin.debug("Vote cancelled");
return;
}
}
}
public void addVote(String voteUsername, String voteSiteName) {
timeChangeQueue.add(new VoteTimeQueue(voteUsername, voteSiteName,
LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void postTimeChange(DateChangedEvent event) {
plugin.getVoteTimer().schedule(new Runnable() {
@Override
public void run() {
processQueue();
}
}, 5, TimeUnit.SECONDS);
}
public void load() {
for (String str : plugin.getServerData().getTimedVoteCacheKeys()) {
ConfigurationSection data = plugin.getServerData().getTimedVoteCacheSection(str);
timeChangeQueue
.add(new VoteTimeQueue(data.getString("Name"), data.getString("Service"), data.getLong("Time")));
}
plugin.getServerData().clearTimedVoteCache();
plugin.getVoteTimer().schedule(new Runnable() {
@Override
public void run() {
processQueue();
}
}, 120, TimeUnit.SECONDS);
}
public void save() {
if (!timeChangeQueue.isEmpty()) {
int num = 0;
for (VoteTimeQueue vote : timeChangeQueue) {
plugin.getServerData().addTimeVoted(num, vote);
num++;
}
}
timeChangeQueue.clear();
}
}
@@ -0,0 +1,22 @@
package com.bencodez.votingplugin.timequeue;
import lombok.Getter;
import lombok.Setter;
public class VoteTimeQueue {
@Getter
@Setter
private String name;
@Getter
@Setter
private String service;
@Getter
@Setter
private long time;
public VoteTimeQueue(String name, String service, long time) {
this.name = name;
this.service = service;
this.time = time;
}
}
@@ -2,6 +2,7 @@ package com.bencodez.votingplugin.topvoter;
import java.util.ArrayList;
import com.bencodez.advancedcore.api.time.TimeType;
import com.bencodez.votingplugin.VotingPluginMain;
public enum TopVoter {
@@ -107,4 +108,17 @@ public enum TopVoter {
}
return TopVoter.AllTime;
}
public static TopVoter of(TimeType type) {
switch (type) {
case DAY:
return Daily;
case MONTH:
return Monthly;
case WEEK:
return Weekly;
default:
return null;
}
}
}
@@ -120,6 +120,11 @@ public class TopVoterHandler implements Listener {
public void onDayChange(DayChangeEvent event) {
synchronized (VotingPluginMain.plugin) {
long startTime = System.currentTimeMillis();
if (plugin.getConfigFile().getStoreTopVotersDaily()) {
plugin.getLogger().info("Saving TopVoters Daily");
storeTopVoters(TopVoter.Daily);
}
for (String uuid : UserManager.getInstance().getAllUUIDs()) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid), false);
user.dontCache();
@@ -141,11 +146,6 @@ public class TopVoterHandler implements Listener {
user.clearTempCache();
}
if (plugin.getConfigFile().getStoreTopVotersDaily()) {
plugin.getLogger().info("Saving TopVoters Daily");
storeTopVoters(TopVoter.Daily);
}
try {
if (plugin.getSpecialRewardsConfig().isEnableDailyRewards()) {
HashMap<Integer, String> places = handlePlaces(
@@ -182,8 +182,25 @@ public class TopVoterHandler implements Listener {
resetVoteShopLimit(shopIdent);
}
}
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
resetTotals(TopVoter.Daily);
// give time for other servers to catch up
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getTopVoterHandler().bungeeHandleResets()) {
plugin.debug("Delaying time change 10 seconds for other servers to catchup");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (!bungeeHandleResets()) {
resetTotals(TopVoter.Daily);
}
if (plugin.getStorageType().equals(UserStorage.MYSQL)) {
plugin.getMysql().clearCacheBasic();
@@ -274,7 +291,19 @@ public class TopVoterHandler implements Listener {
resetVoteShopLimit(shopIdent);
}
}
resetTotals(TopVoter.Monthly);
// give time for other servers to catch up
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getTopVoterHandler().bungeeHandleResets()) {
plugin.debug("Delaying time change 10 seconds for other servers to catchup");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (!bungeeHandleResets()) {
resetTotals(TopVoter.Monthly);
}
if (plugin.getStorageType().equals(UserStorage.MYSQL)) {
plugin.getMysql().clearCacheBasic();
@@ -295,6 +324,11 @@ public class TopVoterHandler implements Listener {
public void onWeekChange(WeekChangeEvent event) {
long startTime = System.currentTimeMillis();
synchronized (VotingPluginMain.plugin) {
if (plugin.getConfigFile().getStoreTopVotersWeekly()) {
plugin.getLogger().info("Saving TopVoters Weekly");
storeTopVoters(TopVoter.Weekly);
}
for (String uuid : UserManager.getInstance().getAllUUIDs()) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid), false);
user.dontCache();
@@ -322,11 +356,6 @@ public class TopVoterHandler implements Listener {
user.clearTempCache();
}
if (plugin.getConfigFile().getStoreTopVotersWeekly()) {
plugin.getLogger().info("Saving TopVoters Weekly");
storeTopVoters(TopVoter.Weekly);
}
try {
if (plugin.getSpecialRewardsConfig().isEnableWeeklyAwards()) {
HashMap<Integer, String> places = handlePlaces(
@@ -363,7 +392,19 @@ public class TopVoterHandler implements Listener {
resetVoteShopLimit(shopIdent);
}
}
resetTotals(TopVoter.Weekly);
// give time for other servers to catch up
if (plugin.getBungeeSettings().isUseBungeecoord() && !plugin.getTopVoterHandler().bungeeHandleResets()) {
plugin.debug("Delaying time change 10 seconds for other servers to catchup");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (!bungeeHandleResets()) {
resetTotals(TopVoter.Weekly);
}
if (plugin.getStorageType().equals(UserStorage.MYSQL)) {
plugin.getMysql().clearCacheBasic();
@@ -395,6 +436,16 @@ public class TopVoterHandler implements Listener {
plugin.getUserManager().removeAllKeyValues(topVoter.getColumnName(), DataType.INTEGER);
}
public boolean bungeeHandleResets() {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
if (plugin.getBungeeSettings().isGloblalDataEnabled()) {
return true;
}
}
return false;
}
public LinkedHashMap<TopVoterPlayer, Integer> sortByValues(LinkedHashMap<TopVoterPlayer, Integer> map,
final boolean order) {
@@ -405,9 +456,17 @@ public class TopVoterHandler implements Listener {
@Override
public int compare(Entry<TopVoterPlayer, Integer> o1, Entry<TopVoterPlayer, Integer> o2) {
if (order) {
return o1.getValue().compareTo(o2.getValue());
int result = (o1.getValue()).compareTo(o2.getValue());
if (result != 0) {
return result;
}
return o2.getKey().getLastVoteTime().compareTo(o1.getKey().getLastVoteTime());
} else {
return o2.getValue().compareTo(o1.getValue());
int result = (o2.getValue()).compareTo(o1.getValue());
if (result != 0) {
return result;
}
return o1.getKey().getLastVoteTime().compareTo(o2.getKey().getLastVoteTime());
}
}
@@ -19,9 +19,14 @@ public class TopVoterPlayer {
@Setter
private String playerName;
public TopVoterPlayer(UUID uuid, String playerName) {
@Getter
@Setter
private Long lastVoteTime;
public TopVoterPlayer(UUID uuid, String playerName, Long lastVoteTime) {
this.uuid = uuid;
this.playerName = playerName;
this.lastVoteTime = lastVoteTime;
}
public ItemStack getPlayerHead() {
@@ -63,6 +63,7 @@ public class UserManager {
if (plugin.getConfigFile().isExtraAllSitesCheck()) {
manager.addKey(new UserDataKeyInt(getGottenAllSitesDayPath()));
}
manager.addKey(new UserDataKeyInt(getGottenAlmostAllSitesDayPath()));
}
public String getGottenAllSitesDayPath() {
@@ -72,6 +73,13 @@ public class UserManager {
return "AllSitesLast";
}
public String getGottenAlmostAllSitesDayPath() {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
return "AlmostAllSitesLast_" + plugin.getBungeeSettings().getServerNameStorage();
}
return "AlmostAllSitesLast";
}
public ArrayList<String> getAllUUIDs() {
return plugin.getUserManager().getAllUUIDs();
}
@@ -90,7 +98,7 @@ public class UserManager {
}
public VotingPluginUser getVotingPluginUser(Player player) {
return getVotingPluginUser(player.getName());
return getVotingPluginUser(player.getUniqueId(), player.getName());
}
@SuppressWarnings("deprecation")
@@ -171,6 +171,7 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
voteEvent.setBungeeTextTotals(text);
voteEvent.setVotingPluginUser(this);
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
}
@@ -186,12 +187,14 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
voteEvent.setBungeeTextTotals(text);
voteEvent.setVotingPluginUser(this);
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
}
public void bungeeVotePluginMessaging(String service, long time, BungeeMessageData text, boolean setTotals,
boolean wasOnline, boolean broadcast) {
boolean wasOnline, boolean broadcast, int num) {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
plugin.debug("Pluginmessaging vote for " + getPlayerName() + " on " + service);
PlayerVoteEvent voteEvent = new PlayerVoteEvent(plugin.getVoteSite(service, true), getPlayerName(), service,
@@ -204,7 +207,9 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
voteEvent.setBungeeTextTotals(text);
voteEvent.setWasOnline(wasOnline);
voteEvent.setBroadcast(broadcast);
voteEvent.setVoteNumber(num);
plugin.getServer().getPluginManager().callEvent(voteEvent);
}
}
@@ -278,6 +283,13 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
}
public boolean checkAlmostAllVotes() {
if (getSitesNotVotedOn() == 1) {
return true;
}
return false;
}
/**
* Check all votes.
*
@@ -371,7 +383,11 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
if (str == null || str.isEmpty() || str.equals("null")) {
return 0;
}
return Long.parseLong(str);
try {
return Long.parseLong(str);
} catch (NumberFormatException e) {
return 0;
}
}
public boolean getDisableBroadcast() {
@@ -382,6 +398,11 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
return getData().getInt(plugin.getVotingPluginUserManager().getGottenAllSitesDayPath(), 0, isWaitForCache());
}
public int getGottenAlmostAllSitesDay() {
return getData().getInt(plugin.getVotingPluginUserManager().getGottenAlmostAllSitesDayPath(), 0,
isWaitForCache());
}
public HashMap<String, Boolean> getHasGottenMilestone() {
HashMap<String, Boolean> hasGottenMilestone = new HashMap<String, Boolean>();
ArrayList<String> milestoneList = getUserData().getStringList(getGottenMilestonesPath());
@@ -411,6 +432,31 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
return getData().getInt("LastMonthTotal", isCacheData(), isWaitForCache());
}
public HashMap<VoteSite, Boolean> getCoolDownCheckSiteList() {
HashMap<VoteSite, Boolean> coolDownChecks = new HashMap<VoteSite, Boolean>();
ArrayList<String> coolDownCheck = getData().getStringList(getCoolDownCheckSitePath(), isCacheData(),
isWaitForCache());
for (String str : coolDownCheck) {
String[] data = str.split("//");
if (data.length > 1 && plugin.hasVoteSite(data[0])) {
VoteSite site = plugin.getVoteSite(data[0], true);
if (site != null) {
Boolean b = Boolean.valueOf(data[1]);
coolDownChecks.put(site, b);
}
}
}
return coolDownChecks;
}
public boolean getCoolDownCheckSite(VoteSite site) {
HashMap<VoteSite, Boolean> coolDownChecks = getCoolDownCheckSiteList();
if (coolDownChecks.containsKey(site)) {
return coolDownChecks.get(site).booleanValue();
}
return false;
}
public HashMap<VoteSite, Long> getLastVotes() {
HashMap<VoteSite, Long> lastVotes = new HashMap<VoteSite, Long>();
ArrayList<String> LastVotesList = getUserData().getStringList("LastVotes");
@@ -433,6 +479,16 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
return lastVotes;
}
public Long getLastVoteTime() {
Long time = Long.valueOf(0);
for (Long value : getLastVotes().values()) {
if (value.longValue() > time) {
time = value;
}
}
return time;
}
/**
* Gets the last vote times sorted.
*
@@ -552,22 +608,22 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
public void giveDailyTopVoterAward(int place, String path) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getDailyAwardRewardsPath(path)).withPlaceHolder("place", "" + place)
.withPlaceHolder("topvoter", "Daily").withPlaceHolder("votes", "" + getTotal(TopVoter.Daily))
.setOnline(isOnline()).send(this);
.withPlaceHolder("topvoter", "Daily").withPlaceHolder("votes", "" + getTotal(TopVoter.Daily))
.setOnline(isOnline()).send(this);
}
public void giveMonthlyTopVoterAward(int place, String path) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getMonthlyAwardRewardsPath(path)).withPlaceHolder("place", "" + place)
.withPlaceHolder("topvoter", "Monthly")
.withPlaceHolder("votes", "" + getTotal(TopVoter.Monthly)).setOnline(isOnline()).send(this);
.withPlaceHolder("topvoter", "Monthly").withPlaceHolder("votes", "" + getTotal(TopVoter.Monthly))
.setOnline(isOnline()).send(this);
}
public void giveWeeklyTopVoterAward(int place, String path) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getWeeklyAwardRewardsPath(path)).withPlaceHolder("place", "" + place)
.withPlaceHolder("topvoter", "Weekly").withPlaceHolder("votes", "" + getTotal(TopVoter.Weekly))
.setOnline(isOnline()).send(this);
.withPlaceHolder("topvoter", "Weekly").withPlaceHolder("votes", "" + getTotal(TopVoter.Weekly))
.setOnline(isOnline()).send(this);
}
/**
@@ -641,11 +697,15 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
}
public void loginRewards() {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), "LoginRewards").send(this);
if (plugin.getRewardHandler().hasRewards(plugin.getSpecialRewardsConfig().getData(), "LoginRewards")) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), "LoginRewards").send(this);
}
}
public void logoutRewards() {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), "LogoutRewards").send(this);
if (plugin.getRewardHandler().hasRewards(plugin.getSpecialRewardsConfig().getData(), "LogoutRewards")) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(), "LogoutRewards").send(this);
}
}
/**
@@ -659,7 +719,7 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
Player player = getPlayer();
if (player != null) {
plugin.extraDebug("Checking offline vote site votes for " + player.getName());
plugin.extraDebug("Checking offline votes for " + player.getName());
boolean topVoterIngorePerm = player.hasPermission("VotingPlugin.TopVoter.Ignore");
if (isTopVoterIgnore() != topVoterIngorePerm) {
@@ -813,6 +873,10 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
getData().setInt(plugin.getVotingPluginUserManager().getGottenAllSitesDayPath(), day);
}
public void setGottenAlmostAllSitesDay(int day) {
getData().setInt(plugin.getVotingPluginUserManager().getGottenAlmostAllSitesDayPath(), day);
}
public void setHasGotteMilestone(int votesRequired, boolean b) {
HashMap<String, Boolean> hasGottenMilestone = getHasGottenMilestone();
hasGottenMilestone.put("" + votesRequired, b);
@@ -830,7 +894,7 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
public String getGottenMilestonesPath() {
if (plugin.getBungeeSettings().isPerServerMilestones()) {
return plugin.getOptions().getServer() + "_" + "GottenMilestones";
return plugin.getBungeeSettings().getServerNameStorage() + "_" + "GottenMilestones";
}
return "GottenMileStones";
}
@@ -860,18 +924,41 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
getUserData().setStringList("LastVotes", data);
}
public void setCoolDownCheckSite(HashMap<VoteSite, Boolean> coolDownChecks) {
ArrayList<String> data = new ArrayList<String>();
for (Entry<VoteSite, Boolean> entry : coolDownChecks.entrySet()) {
String str = entry.getKey().getKey() + "//" + entry.getValue().toString();
data.add(str);
}
getUserData().setStringList(getCoolDownCheckSitePath(), data);
}
public void setCoolDownCheckSite(VoteSite site, boolean value) {
HashMap<VoteSite, Boolean> coolDownChecks = getCoolDownCheckSiteList();
coolDownChecks.put(site, Boolean.valueOf(value));
setCoolDownCheckSite(coolDownChecks);
}
public void setMilestoneCount(int value) {
getData().setInt("MilestoneCount", value);
}
public String getCoolDownCheckPath() {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
return "CoolDownCheck_" + plugin.getBungeeSettings().getServer();
return "CoolDownCheck_" + plugin.getBungeeSettings().getServerNameStorage();
} else {
return "CoolDownCheck";
}
}
public String getCoolDownCheckSitePath() {
if (plugin.getBungeeSettings().isUseBungeecoord()) {
return "CoolDownCheck_" + plugin.getBungeeSettings().getServerNameStorage() + "_Sites";
} else {
return "CoolDownCheck" + "_Sites";
}
}
public void setCoolDownCheck(boolean coolDownCheck) {
getData().setBoolean(getCoolDownCheckPath(), coolDownCheck);
}
@@ -1264,7 +1351,7 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
}
public TopVoterPlayer getTopVoterPlayer() {
return new TopVoterPlayer(UUID.fromString(getUUID()), getPlayerName());
return new TopVoterPlayer(UUID.fromString(getUUID()), getPlayerName(), getLastOnline());
}
public long getNextTimeAllSitesAvailable() {
@@ -1279,4 +1366,18 @@ public class VotingPluginUser extends com.bencodez.advancedcore.api.user.Advance
return longest;
}
public long getNextTimeFirstSiteAvailable() {
long shortest = 0;
for (VoteSite site : plugin.getVoteSites()) {
if (!canVoteSite(site)) {
long seconds = voteNextDurationTime(site);
if (shortest == 0 || seconds < shortest) {
shortest = seconds;
}
}
}
return shortest;
}
}
@@ -59,30 +59,41 @@ public class VoteParty implements Listener {
}
}
public void check(boolean forceBungee) {
if (getTotalVotes() >= getVotesRequired() && ((plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerDay()
&& plugin.getServerData().isLastVotePartySameDay())
|| !plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerDay())) {
if (plugin.getSpecialRewardsConfig().isVotePartyResetCount()) {
setTotalVotes(getTotalVotes() - getVotesRequired());
}
public void check(VotingPluginUser user, boolean forceBungee) {
if (getTotalVotes() < getVotesRequired()) {
return;
}
if (plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerDay()
&& plugin.getServerData().isLastVotePartySameDay()) {
return;
}
if (plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerWeek()
&& plugin.getServerData().isLastVotePartySameWeek()) {
return;
}
if (plugin.getSpecialRewardsConfig().isVotePartyResetCount()) {
setTotalVotes(getTotalVotes() - getVotesRequired());
}
VotePartyEvent event = new VotePartyEvent();
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
VotePartyEvent event = new VotePartyEvent();
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
giveRewards(forceBungee);
giveRewards(user, forceBungee);
if (plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRquired() > 0) {
plugin.getServerData().setVotePartyExtraRequired(plugin.getServerData().getVotePartyExtraRequired()
+ plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRquired());
}
if (plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRquired() > 0) {
plugin.getServerData().setVotePartyExtraRequired(plugin.getServerData().getVotePartyExtraRequired()
+ plugin.getSpecialRewardsConfig().getVotePartyIncreaseVotesRquired());
}
if (plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerDay()) {
plugin.getServerData().updateLastVoteParty();
}
if (plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerDay()) {
plugin.getServerData().updateLastVoteParty();
}
if (plugin.getSpecialRewardsConfig().getVotePartyOnlyOncePerWeek()) {
plugin.getServerData().updateLastVotePartyWeek();
}
}
@@ -103,7 +114,13 @@ public class VoteParty implements Listener {
placeholders.put("neededvotes", "" + neededVotes);
placeholders.put("votes", "" + votes);
msg = ArrayUtils.getInstance().colorize(ArrayUtils.getInstance().replacePlaceHolder(msg, placeholders));
sender.sendMessage(ArrayUtils.getInstance().convert(msg));
if (sender instanceof Player) {
Player p = (Player) sender;
sender.sendMessage(
ArrayUtils.getInstance().convert(ArrayUtils.getInstance().replacePlaceHolders(msg, p)));
} else {
sender.sendMessage(ArrayUtils.getInstance().convert(msg));
}
} else {
sender.sendMessage(StringParser.getInstance().colorize("&cVoteParty not enabled"));
}
@@ -164,14 +181,12 @@ public class VoteParty implements Listener {
public void giveReward(VotingPluginUser user, boolean online, boolean useBungee) {
new RewardBuilder(plugin.getSpecialRewardsConfig().getData(),
plugin.getSpecialRewardsConfig().getVotePartyRewardsPath())
.setOnline(online)
.withPlaceHolder("VotesRequired",
"" + plugin.getSpecialRewardsConfig().getVotePartyVotesRequired())
.setServer(useBungee).send(user);
plugin.getSpecialRewardsConfig().getVotePartyRewardsPath()).setOnline(online)
.withPlaceHolder("VotesRequired", "" + plugin.getSpecialRewardsConfig().getVotePartyVotesRequired())
.setServer(useBungee).send(user);
}
public void giveRewards(boolean forceBungee) {
public void giveRewards(VotingPluginUser orgUser, boolean forceBungee) {
MiscUtils.getInstance().broadcast(plugin.getSpecialRewardsConfig().getVotePartyBroadcast());
for (final String cmd : plugin.getSpecialRewardsConfig().getVotePartyCommands()) {
@@ -189,8 +204,14 @@ public class VoteParty implements Listener {
plugin.debug("Trying to give all players vote party");
ArrayList<String> alreadyGotten = new ArrayList<String>();
for (Player p : Bukkit.getOnlinePlayers()) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(p);
user.dontCache();
VotingPluginUser user;
if (orgUser != null && orgUser.getJavaUUID().equals(p.getUniqueId())) {
user = orgUser;
} else {
user = UserManager.getInstance().getVotingPluginUser(p);
user.dontCache();
}
if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) {
giveReward(user, forceBungee);
}
@@ -198,8 +219,14 @@ public class VoteParty implements Listener {
}
for (String uuid : UserManager.getInstance().getAllUUIDs()) {
if (!alreadyGotten.contains(uuid)) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid));
user.dontCache();
VotingPluginUser user;
if (orgUser != null && orgUser.getJavaUUID().toString().equals(uuid)) {
user = orgUser;
} else {
user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid));
user.dontCache();
}
if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) {
giveReward(user, forceBungee);
}
@@ -209,8 +236,13 @@ public class VoteParty implements Listener {
plugin.debug("Trying to give all voted players vote party");
plugin.debug(ArrayUtils.getInstance().makeStringList(getVotedUsers()));
for (String uuid : getVotedUsers()) {
VotingPluginUser user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid));
user.dontCache();
VotingPluginUser user;
if (orgUser != null && orgUser.getJavaUUID().toString().equals(uuid)) {
user = orgUser;
} else {
user = UserManager.getInstance().getVotingPluginUser(UUID.fromString(uuid));
user.dontCache();
}
if (!plugin.getSpecialRewardsConfig().isVotePartyGiveOnlinePlayersOnly() || user.isOnline()) {
giveReward(user, forceBungee);
}
@@ -288,7 +320,7 @@ public class VoteParty implements Listener {
if (plugin.getSpecialRewardsConfig().getVotePartyCountOfflineVotes() || user.isOnline()) {
addTotal(user);
addVotePlayer(user);
check(forceBungee);
check(user, forceBungee);
}
}
}
@@ -1,9 +1,10 @@
package com.bencodez.votingplugin.votereminding;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -24,7 +25,7 @@ public class VoteReminding {
/** The plugin. */
private VotingPluginMain plugin;
private Timer timer;
private ScheduledExecutorService timer;
@Getter
private ConcurrentHashMap<UUID, Boolean> remindersEnabled = new ConcurrentHashMap<UUID, Boolean>();
@@ -61,11 +62,11 @@ public class VoteReminding {
*/
public void loadRemindChecking() {
if (timer != null) {
timer.cancel();
timer.shutdownNow();
}
if (plugin.getConfigFile().getVoteRemindingRemindDelay() > 0) {
timer = new Timer();
timer.schedule(new TimerTask() {
timer = Executors.newScheduledThreadPool(1);
timer.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
@@ -75,10 +76,10 @@ public class VoteReminding {
checkRemind(user);
}
} else {
cancel();
timer.shutdown();
}
}
}, 1000 * 30, plugin.getConfigFile().getVoteRemindingRemindDelay() * 1000 * 60);
}, 30, plugin.getConfigFile().getVoteRemindingRemindDelay() * 60, TimeUnit.SECONDS);
}
}
@@ -104,6 +105,7 @@ public class VoteReminding {
public boolean shouldRemind(VotingPluginUser user) {
if (remindersEnabled.containsKey(user.getJavaUUID())) {
if (!remindersEnabled.get(user.getJavaUUID()).booleanValue()) {
return false;
}
}
@@ -115,6 +117,7 @@ public class VoteReminding {
return user.canVoteAny();
}
} else {
plugin.debug(user.getUUID() + " no need to remind because plaeyr has VotingPlugin.NoRemind");
return false;
}
}
@@ -132,7 +135,11 @@ public class VoteReminding {
}
plugin.debug(user.getPlayerName() + " was reminded!");
} else {
plugin.debug("Not reminding for " + user.getUUID());
}
} else {
plugin.debug(user.getUUID() + " has no permission for reminders");
}
}
}
+4
View File
@@ -0,0 +1,4 @@
install:
- echo "Running a custom install command"
- cd VotingPlugin
- mvn install -DskipTests -P jitpack