├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ └── maven.yml ├── logo.png ├── testing ├── database_2_4_X.db ├── database_2_5_X.db └── database_2_8_X.db ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .travis.yml ├── common ├── src │ ├── main │ │ ├── resources │ │ │ └── db │ │ │ │ └── migrations │ │ │ │ ├── mariadb │ │ │ │ ├── 0__Conversion.sql │ │ │ │ ├── 2__Add_whitelisted.sql │ │ │ │ └── 1__Initial_database.sql │ │ │ │ ├── mysql │ │ │ │ ├── 0__Conversion.sql │ │ │ │ ├── 2__Add_whitelisted.sql │ │ │ │ └── 1__Initial_database.sql │ │ │ │ ├── sqlite │ │ │ │ ├── 0__Conversion.sql │ │ │ │ ├── 2__Add_whitelisted.sql │ │ │ │ └── 1__Initial_database.sql │ │ │ │ ├── h2 │ │ │ │ ├── 2__Add_whitelisted.sql │ │ │ │ └── 1__Initial_database.sql │ │ │ │ └── postgresql │ │ │ │ └── 1__Initial_database.sql │ │ └── java │ │ │ └── com │ │ │ └── alessiodp │ │ │ └── oreannouncer │ │ │ └── common │ │ │ ├── utils │ │ │ ├── BlocksFoundResult.java │ │ │ ├── OAPlayerUtils.java │ │ │ ├── OreAnnouncerPermission.java │ │ │ └── CoordinateUtils.java │ │ │ ├── commands │ │ │ ├── utils │ │ │ │ ├── OACommandData.java │ │ │ │ └── OASubCommand.java │ │ │ ├── list │ │ │ │ └── CommonCommands.java │ │ │ ├── OACommandManager.java │ │ │ ├── sub │ │ │ │ ├── CommandVersion.java │ │ │ │ ├── CommandReload.java │ │ │ │ ├── CommandHelp.java │ │ │ │ ├── CommandAlerts.java │ │ │ │ └── CommandWhitelist.java │ │ │ └── main │ │ │ │ └── CommandOA.java │ │ │ ├── storage │ │ │ ├── sql │ │ │ │ └── dao │ │ │ │ │ ├── players │ │ │ │ │ ├── H2PlayersDao.java │ │ │ │ │ ├── SQLitePlayersDao.java │ │ │ │ │ ├── OAPlayerRowMapper.java │ │ │ │ │ ├── PlayersDao.java │ │ │ │ │ └── PostgreSQLPlayersDao.java │ │ │ │ │ ├── TopPlayerRowMapper.java │ │ │ │ │ ├── StatsPlayerRowMapper.java │ │ │ │ │ ├── blocksfound │ │ │ │ │ ├── BlocksFoundResultRowMapper.java │ │ │ │ │ └── BlocksFoundRowMapper.java │ │ │ │ │ └── blocks │ │ │ │ │ ├── BlockDestroyRowMapper.java │ │ │ │ │ ├── SQLiteBlocksDao.java │ │ │ │ │ ├── H2BlocksDao.java │ │ │ │ │ ├── BlocksDao.java │ │ │ │ │ └── PostgreSQLBlocksDao.java │ │ │ └── interfaces │ │ │ │ └── IOADatabase.java │ │ │ ├── blocks │ │ │ └── objects │ │ │ │ ├── BlockDestroy.java │ │ │ │ ├── BlockLocationImpl.java │ │ │ │ ├── BlockData.java │ │ │ │ ├── Alert.java │ │ │ │ └── BlockFound.java │ │ │ ├── addons │ │ │ ├── OAAddonManager.java │ │ │ └── external │ │ │ │ ├── hooks │ │ │ │ └── LLAPIHook.java │ │ │ │ └── LLAPIHandler.java │ │ │ ├── messaging │ │ │ ├── OAMessageDispatcher.java │ │ │ └── OAPacket.java │ │ │ ├── listeners │ │ │ └── JoinLeaveListener.java │ │ │ ├── events │ │ │ └── EventManager.java │ │ │ ├── configuration │ │ │ └── OAConfigurationManager.java │ │ │ ├── players │ │ │ └── PlayerManager.java │ │ │ └── api │ │ │ └── ApiHandler.java │ └── test │ │ └── java │ │ └── com │ │ └── alessiodp │ │ └── oreannouncer │ │ └── common │ │ ├── messaging │ │ └── OAPacketTest.java │ │ └── utils │ │ └── TestCoordinateUtils.java └── pom.xml ├── crowdin.yml ├── bungeecord ├── src │ ├── main │ │ ├── resources │ │ │ └── bungee.yml │ │ └── java │ │ │ └── com │ │ │ └── alessiodp │ │ │ └── oreannouncer │ │ │ └── bungeecord │ │ │ ├── utils │ │ │ └── BungeeMessageUtils.java │ │ │ ├── addons │ │ │ ├── BungeeOAAddonManager.java │ │ │ └── external │ │ │ │ └── BungeeMetricsHandler.java │ │ │ ├── bootstrap │ │ │ └── BungeeOreAnnouncerBootstrap.java │ │ │ ├── players │ │ │ ├── objects │ │ │ │ └── BungeeOAPlayerImpl.java │ │ │ └── BungeePlayerManager.java │ │ │ ├── messaging │ │ │ ├── bungee │ │ │ │ └── BungeeOABungeecordDispatcher.java │ │ │ ├── BungeeOAMessenger.java │ │ │ ├── BungeeOAMessageListener.java │ │ │ └── BungeeOAMessageDispatcher.java │ │ │ ├── commands │ │ │ ├── main │ │ │ │ └── BungeeCommandOA.java │ │ │ └── BungeeOACommandManager.java │ │ │ ├── configuration │ │ │ ├── data │ │ │ │ ├── BungeeMessages.java │ │ │ │ └── BungeeConfigMain.java │ │ │ └── BungeeOAConfigurationManager.java │ │ │ ├── listeners │ │ │ └── BungeeJoinLeaveListener.java │ │ │ ├── blocks │ │ │ └── BungeeBlockManager.java │ │ │ ├── events │ │ │ └── BungeeEventManager.java │ │ │ └── BungeeOreAnnouncerPlugin.java │ └── test │ │ └── java │ │ └── com │ │ └── alessiodp │ │ └── oreannouncer │ │ └── bungeecord │ │ └── configuration │ │ └── BungeeConfigurationTest.java ├── pom.xml └── dependency-reduced-pom.xml ├── api ├── src │ └── main │ │ └── java │ │ └── com │ │ └── alessiodp │ │ └── oreannouncer │ │ └── api │ │ ├── events │ │ ├── Cancellable.java │ │ ├── OreAnnouncerEvent.java │ │ ├── bungee │ │ │ ├── BungeeOreAnnouncerEvent.java │ │ │ └── common │ │ │ │ ├── BungeeOreAnnouncerBlockDestroyEvent.java │ │ │ │ ├── BungeeOreAnnouncerAlertEvent.java │ │ │ │ └── BungeeOreAnnouncerAdvancedAlertEvent.java │ │ ├── common │ │ │ ├── IAlertFoundEvent.java │ │ │ ├── IBlockDestroyEvent.java │ │ │ ├── IAlertEvent.java │ │ │ └── IAdvancedAlertEvent.java │ │ └── bukkit │ │ │ ├── BukkitOreAnnouncerEvent.java │ │ │ └── common │ │ │ ├── BukkitOreAnnouncerBlockDestroyEvent.java │ │ │ ├── BukkitOreAnnouncerAlertEvent.java │ │ │ └── BukkitOreAnnouncerAdvancedAlertEvent.java │ │ ├── interfaces │ │ ├── OABlockFound.java │ │ ├── OABlockDestroy.java │ │ ├── BlockLocation.java │ │ └── OAPlayer.java │ │ └── OreAnnouncer.java └── pom.xml ├── bukkit └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── alessiodp │ │ │ └── oreannouncer │ │ │ └── bukkit │ │ │ ├── bootstrap │ │ │ └── BukkitOreAnnouncerBootstrap.java │ │ │ ├── players │ │ │ ├── objects │ │ │ │ └── BukkitOAPlayerImpl.java │ │ │ └── BukkitPlayerManager.java │ │ │ ├── messaging │ │ │ ├── bungee │ │ │ │ ├── BukkitOABungeecordDispatcher.java │ │ │ │ └── BukkitOABungeecordListener.java │ │ │ ├── BukkitOAMessageListener.java │ │ │ ├── BukkitOAMessenger.java │ │ │ └── BukkitOAMessageDispatcher.java │ │ │ ├── commands │ │ │ ├── main │ │ │ │ └── BukkitCommandOA.java │ │ │ ├── BukkitOACommandManager.java │ │ │ └── sub │ │ │ │ └── BukkitCommandDebug.java │ │ │ ├── utils │ │ │ └── BukkitMessageUtils.java │ │ │ ├── configuration │ │ │ ├── BukkitOAConfigurationManager.java │ │ │ └── data │ │ │ │ └── BukkitConfigMain.java │ │ │ ├── listeners │ │ │ ├── BukkitJoinLeaveListener.java │ │ │ └── BukkitBlockListener.java │ │ │ ├── addons │ │ │ ├── external │ │ │ │ ├── BukkitMetricsHandler.java │ │ │ │ ├── PlaceholderAPIHandler.java │ │ │ │ ├── hooks │ │ │ │ │ ├── PAPIHook.java │ │ │ │ │ └── DiscordSRVHook.java │ │ │ │ ├── EssentialsChatHandler.java │ │ │ │ └── MMOItemsHandler.java │ │ │ └── BukkitOAAddonManager.java │ │ │ ├── events │ │ │ └── BukkitEventManager.java │ │ │ ├── BukkitOreAnnouncerPlugin.java │ │ │ └── blocks │ │ │ └── BukkitBlockManager.java │ └── resources │ │ └── plugin.yml │ └── test │ └── java │ └── com │ └── alessiodp │ └── oreannouncer │ └── bukkit │ └── configuration │ └── BukkitConfigurationTest.java ├── .gitignore ├── README.md └── output └── pom.xml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://paypal.me/AlessioDP -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlessioDP/OreAnnouncer/HEAD/logo.png -------------------------------------------------------------------------------- /testing/database_2_4_X.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlessioDP/OreAnnouncer/HEAD/testing/database_2_4_X.db -------------------------------------------------------------------------------- /testing/database_2_5_X.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlessioDP/OreAnnouncer/HEAD/testing/database_2_5_X.db -------------------------------------------------------------------------------- /testing/database_2_8_X.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlessioDP/OreAnnouncer/HEAD/testing/database_2_8_X.db -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlessioDP/OreAnnouncer/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: 3 | - openjdk8 4 | - openjdk11 5 | - openjdk15 6 | branches: 7 | only: 8 | - master -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mariadb/0__Conversion.sql: -------------------------------------------------------------------------------- 1 | -- MySQL database 2 | DROP TABLE IF EXISTS `versions`; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mysql/0__Conversion.sql: -------------------------------------------------------------------------------- 1 | -- MySQL database 2 | DROP TABLE IF EXISTS `versions`; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/sqlite/0__Conversion.sql: -------------------------------------------------------------------------------- 1 | -- SQLite database 2 | DROP TABLE IF EXISTS versions; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/h2/2__Add_whitelisted.sql: -------------------------------------------------------------------------------- 1 | -- H2 database 2 | ALTER TABLE `players` ADD `whitelisted` INT DEFAULT 0 NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mariadb/2__Add_whitelisted.sql: -------------------------------------------------------------------------------- 1 | -- MySQL database 2 | ALTER TABLE `players` ADD `whitelisted` INTEGER DEFAULT 0 NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mysql/2__Add_whitelisted.sql: -------------------------------------------------------------------------------- 1 | -- MySQL database 2 | ALTER TABLE `players` ADD `whitelisted` INTEGER DEFAULT 0 NOT NULL; -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/sqlite/2__Add_whitelisted.sql: -------------------------------------------------------------------------------- 1 | -- SQLite database 2 | ALTER TABLE `players` ADD COLUMN 'whitelisted' INTEGER DEFAULT 0 NOT NULL; -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /bukkit/src/main/resources/bukkit/messages.yml 3 | translation: /locales/bukkit/messages_%two_letters_code%.yml 4 | - source: /bungeecord/src/main/resources/bungee/messages.yml 5 | translation: /locales/bungeecord/messages_%two_letters_code%.yml -------------------------------------------------------------------------------- /bungeecord/src/main/resources/bungee.yml: -------------------------------------------------------------------------------- 1 | name: ${plugin.name} 2 | description: ${plugin.description} 3 | author: ${plugin.author} 4 | website: ${plugin.website} 5 | version: ${plugin.version} 6 | main: com.alessiodp.oreannouncer.bungeecord.bootstrap.BungeeOreAnnouncerBootstrap 7 | softDepends: [LastLoginAPI] -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/utils/BlocksFoundResult.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.utils; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class BlocksFoundResult { 9 | private long timestamp; 10 | private int total; 11 | } 12 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/utils/BungeeMessageUtils.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.utils; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.utils.MessageUtils; 5 | 6 | public class BungeeMessageUtils extends MessageUtils { 7 | public BungeeMessageUtils(OreAnnouncerPlugin plugin) { 8 | super(plugin); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/utils/OACommandData.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.utils; 2 | 3 | import com.alessiodp.core.common.commands.utils.CommandData; 4 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | public class OACommandData extends CommandData { 9 | @Getter @Setter private OAPlayerImpl player; 10 | } 11 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/addons/BungeeOAAddonManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.addons; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.oreannouncer.common.addons.OAAddonManager; 5 | import lombok.NonNull; 6 | 7 | public class BungeeOAAddonManager extends OAAddonManager { 8 | public BungeeOAAddonManager(@NonNull ADPPlugin plugin) { 9 | super(plugin); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/Cancellable.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events; 2 | 3 | public interface Cancellable { 4 | /** 5 | * Is the event cancelled? 6 | * 7 | * @return Returns {@code true} if the event is cancelled 8 | */ 9 | boolean isCancelled(); 10 | 11 | /** 12 | * Set the event as cancelled 13 | * 14 | * @param cancel {@code True} to cancel 15 | */ 16 | void setCancelled(boolean cancel); 17 | } 18 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/bootstrap/BukkitOreAnnouncerBootstrap.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.bootstrap; 2 | 3 | import com.alessiodp.core.bukkit.bootstrap.ADPBukkitBootstrap; 4 | import com.alessiodp.oreannouncer.bukkit.BukkitOreAnnouncerPlugin; 5 | 6 | public class BukkitOreAnnouncerBootstrap extends ADPBukkitBootstrap { 7 | public BukkitOreAnnouncerBootstrap() { 8 | plugin = new BukkitOreAnnouncerPlugin(this); 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/bootstrap/BungeeOreAnnouncerBootstrap.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.bootstrap; 2 | 3 | import com.alessiodp.core.bungeecord.bootstrap.ADPBungeeBootstrap; 4 | import com.alessiodp.oreannouncer.bungeecord.BungeeOreAnnouncerPlugin; 5 | 6 | public class BungeeOreAnnouncerBootstrap extends ADPBungeeBootstrap { 7 | public BungeeOreAnnouncerBootstrap() { 8 | plugin = new BungeeOreAnnouncerPlugin(this); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/list/CommonCommands.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.list; 2 | 3 | import com.alessiodp.core.common.commands.list.ADPCommand; 4 | 5 | public enum CommonCommands implements ADPCommand { 6 | OA, 7 | 8 | ALERTS, 9 | HELP, 10 | DEBUG, 11 | LOG, 12 | RELOAD, 13 | STATS, 14 | TOP, 15 | VERSION, 16 | WHITELIST; 17 | 18 | @Override 19 | public String getOriginalName() { 20 | return this.name(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/players/objects/BukkitOAPlayerImpl.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.players.objects; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 5 | 6 | import java.util.UUID; 7 | 8 | public class BukkitOAPlayerImpl extends OAPlayerImpl { 9 | 10 | public BukkitOAPlayerImpl(OreAnnouncerPlugin plugin, UUID uuid) { 11 | super(plugin, uuid); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/players/H2PlayersDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.players; 2 | 3 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 4 | 5 | public interface H2PlayersDao extends PlayersDao { 6 | String QUERY_INSERT = "MERGE INTO `players` (`uuid`, `alerts`, `whitelisted`) VALUES (?, ?, ?)"; 7 | 8 | @Override 9 | @SqlUpdate(QUERY_INSERT) 10 | void insert(String uuid, boolean alerts, boolean whitelisted); 11 | } 12 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/players/objects/BungeeOAPlayerImpl.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.players.objects; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 5 | 6 | import java.util.UUID; 7 | 8 | public class BungeeOAPlayerImpl extends OAPlayerImpl { 9 | 10 | public BungeeOAPlayerImpl(OreAnnouncerPlugin plugin, UUID uuid) { 11 | super(plugin, uuid); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/players/SQLitePlayersDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.players; 2 | 3 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 4 | 5 | public interface SQLitePlayersDao extends PlayersDao { 6 | String QUERY_INSERT = "INSERT OR REPLACE INTO `players` (`uuid`, `alerts`, `whitelisted`) VALUES (?, ?, ?)"; 7 | 8 | @Override 9 | @SqlUpdate(QUERY_INSERT) 10 | void insert(String uuid, boolean alerts, boolean whitelisted); 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | .gradle 3 | **/build/ 4 | 5 | # Ignore Gradle GUI config 6 | gradle-app.setting 7 | 8 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 9 | !gradle-wrapper.jar 10 | 11 | # Cache of project 12 | .gradletasknamecache 13 | 14 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 15 | # gradle/wrapper/gradle-wrapper.properties 16 | 17 | # IntelliJ project files 18 | .idea 19 | *.iml 20 | out 21 | gen 22 | 23 | # Maven 24 | log/ 25 | target/ 26 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/messaging/bungee/BukkitOABungeecordDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.messaging.bungee; 2 | 3 | import com.alessiodp.core.bukkit.messaging.bungee.BukkitBungeecordDispatcher; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public class BukkitOABungeecordDispatcher extends BukkitBungeecordDispatcher { 8 | public BukkitOABungeecordDispatcher(@NotNull ADPPlugin plugin) { 9 | super(plugin, true, false, false); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/messaging/bungee/BungeeOABungeecordDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.messaging.bungee; 2 | 3 | import com.alessiodp.core.bungeecord.messaging.bungee.BungeeBungeecordDispatcher; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | public class BungeeOABungeecordDispatcher extends BungeeBungeecordDispatcher { 8 | public BungeeOABungeecordDispatcher(@NotNull ADPPlugin plugin) { 9 | super(plugin, false, true, false); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: maven 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "04:00" 8 | open-pull-requests-limit: 10 9 | ignore: 10 | - dependency-name: "org.yaml:snakeyaml" 11 | - dependency-name: "com.h2database:h2" 12 | - dependency-name: "com.zaxxer:HikariCP" 13 | - dependency-name: "org.mariadb.jdbc:mariadb-java-client" 14 | - dependency-name: "mysql:mysql-connector-java" 15 | - dependency-name: "org.postgresql:postgresql" 16 | - dependency-name: "org.xerial:sqlite-jdbc" -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/messaging/BukkitOAMessageListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.messaging; 2 | 3 | import com.alessiodp.core.bukkit.messaging.BukkitMessageListener; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.oreannouncer.bukkit.messaging.bungee.BukkitOABungeecordListener; 6 | import lombok.NonNull; 7 | 8 | public class BukkitOAMessageListener extends BukkitMessageListener { 9 | 10 | public BukkitOAMessageListener(@NonNull ADPPlugin plugin) { 11 | super(plugin, new BukkitOABungeecordListener(plugin)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/TopPlayerRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao; 2 | 3 | import com.alessiodp.core.common.utils.Pair; 4 | import org.jdbi.v3.core.mapper.RowMapper; 5 | import org.jdbi.v3.core.statement.StatementContext; 6 | 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | 10 | public class TopPlayerRowMapper implements RowMapper> { 11 | public Pair map(ResultSet rs, StatementContext ctx) throws SQLException { 12 | return new Pair<>(rs.getString("player"), rs.getInt("total")); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/blocks/objects/BlockDestroy.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.blocks.objects; 2 | 3 | import com.alessiodp.oreannouncer.api.interfaces.OABlockDestroy; 4 | import lombok.AllArgsConstructor; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.Getter; 7 | import lombok.ToString; 8 | 9 | import java.util.UUID; 10 | 11 | @AllArgsConstructor 12 | @EqualsAndHashCode 13 | @ToString 14 | public class BlockDestroy implements OABlockDestroy { 15 | @Getter private final UUID player; 16 | @Getter private final String materialName; 17 | @Getter private final int destroyCount; 18 | } 19 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/interfaces/OABlockFound.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.interfaces; 2 | 3 | import java.util.UUID; 4 | 5 | public interface OABlockFound { 6 | /** 7 | * Get the player {@link UUID} 8 | * 9 | * @return Returns the {@link UUID} of the player 10 | */ 11 | UUID getPlayer(); 12 | 13 | /** 14 | * Get the material name of the block 15 | * 16 | * @return Returns the name of the block 17 | */ 18 | String getMaterialName(); 19 | 20 | /** 21 | * Get the number of found blocks 22 | * 23 | * @return Returns the number of found blocks 24 | */ 25 | int getFound(); 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/StatsPlayerRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao; 2 | 3 | import com.alessiodp.core.common.utils.Pair; 4 | import org.jdbi.v3.core.mapper.RowMapper; 5 | import org.jdbi.v3.core.statement.StatementContext; 6 | 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | 10 | public class StatsPlayerRowMapper implements RowMapper> { 11 | public Pair map(ResultSet rs, StatementContext ctx) throws SQLException { 12 | return new Pair<>(rs.getString("material_name"), rs.getInt("total")); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/messaging/BungeeOAMessenger.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.messaging; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.messaging.ADPMessenger; 5 | 6 | public class BungeeOAMessenger extends ADPMessenger { 7 | public BungeeOAMessenger(ADPPlugin plugin) { 8 | super(plugin); 9 | messageDispatcher = new BungeeOAMessageDispatcher(plugin); 10 | messageListener = new BungeeOAMessageListener(plugin); 11 | } 12 | 13 | @Override 14 | public void reload() { 15 | messageDispatcher.register(); 16 | messageListener.register(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/interfaces/OABlockDestroy.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.interfaces; 2 | 3 | import java.util.UUID; 4 | 5 | public interface OABlockDestroy { 6 | /** 7 | * Get the player {@link UUID} 8 | * 9 | * @return Returns the {@link UUID} of the player 10 | */ 11 | UUID getPlayer(); 12 | 13 | /** 14 | * Get the material name of the block 15 | * 16 | * @return Returns the name of the block 17 | */ 18 | String getMaterialName(); 19 | 20 | /** 21 | * Get the number of destroyed blocks 22 | * 23 | * @return Returns the number of destroyed blocks 24 | */ 25 | int getDestroyCount(); 26 | } 27 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/messaging/BungeeOAMessageListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.messaging; 2 | 3 | import com.alessiodp.core.bungeecord.messaging.BungeeMessageListener; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.oreannouncer.bungeecord.messaging.bungee.BungeeOABungeecordListener; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public class BungeeOAMessageListener extends BungeeMessageListener { 9 | 10 | public BungeeOAMessageListener(@NotNull ADPPlugin plugin) { 11 | super( 12 | plugin, 13 | new BungeeOABungeecordListener(plugin), 14 | null 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/commands/main/BungeeCommandOA.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.commands.main; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.commands.main.CommandOA; 5 | import com.alessiodp.oreannouncer.common.commands.sub.CommandDebug; 6 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 7 | 8 | public class BungeeCommandOA extends CommandOA { 9 | public BungeeCommandOA(OreAnnouncerPlugin plugin) { 10 | super(plugin); 11 | 12 | if (ConfigMain.OREANNOUNCER_DEBUG_COMMAND) 13 | register(new CommandDebug(plugin, this)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/h2/1__Initial_database.sql: -------------------------------------------------------------------------------- 1 | -- H2 database 2 | CREATE TABLE IF NOT EXISTS `players` ( 3 | `uuid` CHAR(36) NOT NULL PRIMARY KEY, 4 | `alerts` INT DEFAULT 1 NOT NULL 5 | ); 6 | 7 | CREATE TABLE IF NOT EXISTS `blocks` ( 8 | `player` CHAR(36) NOT NULL, 9 | `material_name` VARCHAR(100) NOT NULL, 10 | `destroyed` INT DEFAULT 0, 11 | PRIMARY KEY (`player`, `material_name`) 12 | ); 13 | 14 | CREATE TABLE IF NOT EXISTS `blocks_found` ( 15 | `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 16 | `player` CHAR(36) NOT NULL, 17 | `material_name` VARCHAR(100) NOT NULL, 18 | `timestamp` INT NOT NULL, 19 | `found` INT DEFAULT 0 20 | ); -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/sqlite/1__Initial_database.sql: -------------------------------------------------------------------------------- 1 | -- SQLite database 2 | CREATE TABLE IF NOT EXISTS `players` ( 3 | 'uuid' VARCHAR NOT NULL PRIMARY KEY, 4 | 'alerts' INTEGER DEFAULT 1 NOT NULL 5 | ); 6 | 7 | CREATE TABLE IF NOT EXISTS `blocks` ( 8 | 'player' VARCHAR NOT NULL, 9 | 'material_name' VARCHAR NOT NULL, 10 | 'destroyed' INTEGER DEFAULT 0, 11 | PRIMARY KEY ('player', 'material_name') 12 | ); 13 | 14 | CREATE TABLE IF NOT EXISTS `blocks_found` ( 15 | 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 16 | 'player' VARCHAR NOT NULL, 17 | 'material_name' VARCHAR NOT NULL, 18 | 'timestamp' INTEGER NOT NULL, 19 | 'found' INTEGER DEFAULT 0 20 | ); -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/OreAnnouncerEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events; 2 | 3 | import com.alessiodp.oreannouncer.api.interfaces.OreAnnouncerAPI; 4 | import org.jetbrains.annotations.NotNull; 5 | 6 | public interface OreAnnouncerEvent { 7 | /** 8 | * Get the OreAnnouncer API instance 9 | * 10 | * @return Returns the {@link OreAnnouncerAPI} 11 | */ 12 | @NotNull 13 | OreAnnouncerAPI getApi(); 14 | 15 | /** 16 | * Set the OreAnnouncer API instance. Used by OreAnnouncer instance to let you hook directly to the main API. 17 | * 18 | * @param instance {@link OreAnnouncerAPI} instance to set 19 | */ 20 | void setApi(OreAnnouncerAPI instance); 21 | } 22 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bungee/BungeeOreAnnouncerEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bungee; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.OreAnnouncerAPI; 5 | import net.md_5.bungee.api.plugin.Event; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public abstract class BungeeOreAnnouncerEvent extends Event implements OreAnnouncerEvent { 9 | private OreAnnouncerAPI api; 10 | 11 | @Override 12 | @NotNull 13 | public OreAnnouncerAPI getApi() { 14 | return api; 15 | } 16 | 17 | @Override 18 | public void setApi(OreAnnouncerAPI instance) { 19 | api = instance; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mysql/1__Initial_database.sql: -------------------------------------------------------------------------------- 1 | -- MySQL database 2 | CREATE TABLE IF NOT EXISTS `players` ( 3 | `uuid` CHAR(36) NOT NULL PRIMARY KEY, 4 | `alerts` INTEGER DEFAULT 1 NOT NULL 5 | ); 6 | 7 | CREATE TABLE IF NOT EXISTS `blocks` ( 8 | `player` CHAR(36) NOT NULL, 9 | `material_name` VARCHAR(100) NOT NULL, 10 | `destroyed` INTEGER DEFAULT 0, 11 | PRIMARY KEY (`player`, `material_name`) 12 | ); 13 | 14 | CREATE TABLE IF NOT EXISTS `blocks_found` ( 15 | `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 16 | `player` CHAR(36) NOT NULL, 17 | `material_name` VARCHAR(100) NOT NULL, 18 | `timestamp` INTEGER NOT NULL, 19 | `found` INTEGER DEFAULT 0 20 | ); -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/mariadb/1__Initial_database.sql: -------------------------------------------------------------------------------- 1 | -- MariaDB database 2 | CREATE TABLE IF NOT EXISTS `players` ( 3 | `uuid` CHAR(36) NOT NULL PRIMARY KEY, 4 | `alerts` INTEGER DEFAULT 1 NOT NULL 5 | ); 6 | 7 | CREATE TABLE IF NOT EXISTS `blocks` ( 8 | `player` CHAR(36) NOT NULL, 9 | `material_name` VARCHAR(100) NOT NULL, 10 | `destroyed` INTEGER DEFAULT 0, 11 | PRIMARY KEY (`player`, `material_name`) 12 | ); 13 | 14 | CREATE TABLE IF NOT EXISTS `blocks_found` ( 15 | `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, 16 | `player` CHAR(36) NOT NULL, 17 | `material_name` VARCHAR(100) NOT NULL, 18 | `timestamp` INTEGER NOT NULL, 19 | `found` INTEGER DEFAULT 0 20 | ); -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/addons/external/BungeeMetricsHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.addons.external; 2 | 3 | import com.alessiodp.core.bungeecord.addons.external.bstats.bungeecord.Metrics; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.core.common.addons.external.MetricsHandler; 6 | import lombok.NonNull; 7 | import net.md_5.bungee.api.plugin.Plugin; 8 | 9 | public class BungeeMetricsHandler extends MetricsHandler { 10 | public BungeeMetricsHandler(@NonNull ADPPlugin plugin) { 11 | super(plugin); 12 | } 13 | 14 | @Override 15 | protected void registerMetrics() { 16 | new Metrics((Plugin) plugin.getBootstrap(), plugin.getBstatsId()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Java CI with Maven 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | java-version: [11, 16, 17] 18 | 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Set up JDK 22 | uses: actions/setup-java@v2.3.0 23 | with: 24 | distribution: adopt 25 | java-version: ${{ matrix.java-version }} 26 | - name: Build with Maven 27 | run: mvn -B package --file pom.xml 28 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/common/IAlertFoundEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 5 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | public interface IAlertFoundEvent extends OreAnnouncerEvent { 9 | /** 10 | * Get the target player of the alert 11 | * 12 | * @return Returns the {@link OAPlayer} 13 | */ 14 | @NotNull 15 | OAPlayer getPlayer(); 16 | 17 | /** 18 | * Get the block 19 | * 20 | * @return Returns the {@link OABlock} 21 | */ 22 | @NotNull 23 | OABlock getBlock(); 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/resources/db/migrations/postgresql/1__Initial_database.sql: -------------------------------------------------------------------------------- 1 | -- PostgreSQL database 2 | CREATE TABLE IF NOT EXISTS players ( 3 | "uuid" CHAR(36) NOT NULL PRIMARY KEY, 4 | "alerts" BOOL DEFAULT TRUE NOT NULL, 5 | "whitelisted" BOOL DEFAULT FALSE NOT NULL 6 | ); 7 | 8 | CREATE TABLE IF NOT EXISTS blocks ( 9 | "player" CHAR(36) NOT NULL, 10 | "material_name" VARCHAR(100) NOT NULL, 11 | "destroyed" INTEGER DEFAULT 0, 12 | PRIMARY KEY ("player", "material_name") 13 | ); 14 | 15 | CREATE TABLE IF NOT EXISTS blocks_found ( 16 | "id" SERIAL PRIMARY KEY, 17 | "player" CHAR(36) NOT NULL, 18 | "material_name" VARCHAR(100) NOT NULL, 19 | "timestamp" INTEGER NOT NULL, 20 | "found" INTEGER DEFAULT 0 21 | ); -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/players/BukkitPlayerManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.players; 2 | 3 | import com.alessiodp.oreannouncer.bukkit.players.objects.BukkitOAPlayerImpl; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.players.PlayerManager; 6 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 7 | 8 | import java.util.UUID; 9 | 10 | public class BukkitPlayerManager extends PlayerManager { 11 | 12 | public BukkitPlayerManager(OreAnnouncerPlugin plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | public OAPlayerImpl initializePlayer(UUID playerUUID) { 18 | return new BukkitOAPlayerImpl(plugin, playerUUID); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/configuration/data/BungeeMessages.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.configuration.data; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 5 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 6 | import lombok.Getter; 7 | 8 | public class BungeeMessages extends Messages { 9 | @Getter private final String fileName = "messages.yml"; 10 | @Getter private final String resourceName = "bungee/messages.yml"; 11 | @Getter private final int latestVersion = OAConstants.VERSION_BUNGEE_MESSAGES; 12 | 13 | 14 | public BungeeMessages(OreAnnouncerPlugin plugin) { 15 | super(plugin); 16 | } 17 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | # OreAnnouncer 4 | OreAnnouncer is a plugin for Minecraft servers that collects data whenever a player digs an ore (can be set with any block). 5 | You can send an alert to users/admins or just store every block they destroy to easily track x-ray players. 6 | 7 | [Official project page here!](https://alessiodp.com/oreannouncer/) 8 | 9 | ## Downloads 10 | [Download from Spigot](http://www.spigotmc.org/resources/oreannouncer.33464/) 11 | [Download from Bukkit](https://dev.bukkit.org/projects/oreannouncer) 12 | 13 | ## Documentation 14 | [Documentation page here](https://alessiodp.com/docs/oreannouncer). 15 | 16 | ## License 17 | [Read the license here](https://github.com/AlessioDP/OreAnnouncer/blob/master/LICENSE). -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocksfound/BlocksFoundResultRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocksfound; 2 | 3 | import com.alessiodp.oreannouncer.common.utils.BlocksFoundResult; 4 | import org.jdbi.v3.core.mapper.RowMapper; 5 | import org.jdbi.v3.core.statement.StatementContext; 6 | 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | 10 | public class BlocksFoundResultRowMapper implements RowMapper { 11 | @Override 12 | public BlocksFoundResult map(ResultSet rs, StatementContext ctx) throws SQLException { 13 | if (rs.getInt("total") > 0) { 14 | return new BlocksFoundResult(rs.getLong("time"), rs.getInt("total")); 15 | } 16 | return null; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/players/BungeePlayerManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.players; 2 | 3 | import com.alessiodp.oreannouncer.bungeecord.players.objects.BungeeOAPlayerImpl; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.players.PlayerManager; 6 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 7 | 8 | import java.util.UUID; 9 | 10 | public class BungeePlayerManager extends PlayerManager { 11 | 12 | public BungeePlayerManager(OreAnnouncerPlugin plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | public OAPlayerImpl initializePlayer(UUID playerUUID) { 18 | return new BungeeOAPlayerImpl(plugin, playerUUID); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/configuration/BungeeOAConfigurationManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.configuration; 2 | 3 | import com.alessiodp.oreannouncer.bungeecord.configuration.data.BungeeConfigMain; 4 | import com.alessiodp.oreannouncer.bungeecord.configuration.data.BungeeMessages; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import com.alessiodp.oreannouncer.common.configuration.OAConfigurationManager; 7 | 8 | public class BungeeOAConfigurationManager extends OAConfigurationManager { 9 | 10 | public BungeeOAConfigurationManager(OreAnnouncerPlugin plugin) { 11 | super(plugin); 12 | 13 | getConfigs().add(new BungeeConfigMain(plugin)); 14 | getConfigs().add(new BungeeMessages(plugin)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocks/BlockDestroyRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocks; 2 | 3 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockDestroy; 4 | import org.jdbi.v3.core.mapper.RowMapper; 5 | import org.jdbi.v3.core.statement.StatementContext; 6 | 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | import java.util.UUID; 10 | 11 | public class BlockDestroyRowMapper implements RowMapper { 12 | @Override 13 | public BlockDestroy map(ResultSet rs, StatementContext ctx) throws SQLException { 14 | return new BlockDestroy( 15 | UUID.fromString(rs.getString("player")), 16 | rs.getString("material_name"), 17 | rs.getInt("destroyed") 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/messaging/BukkitOAMessenger.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.messaging; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.messaging.ADPMessenger; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | 7 | public class BukkitOAMessenger extends ADPMessenger { 8 | public BukkitOAMessenger(ADPPlugin plugin) { 9 | super(plugin); 10 | messageDispatcher = new BukkitOAMessageDispatcher(plugin); 11 | messageListener = new BukkitOAMessageListener(plugin); 12 | } 13 | 14 | @Override 15 | public void reload() { 16 | if (((OreAnnouncerPlugin) plugin).isBungeeCordEnabled()) { 17 | messageDispatcher.register(); 18 | messageListener.register(); 19 | } else { 20 | disable(); 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocksfound/BlocksFoundRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocksfound; 2 | 3 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockFound; 4 | import org.jdbi.v3.core.mapper.RowMapper; 5 | import org.jdbi.v3.core.statement.StatementContext; 6 | 7 | import java.sql.ResultSet; 8 | import java.sql.SQLException; 9 | import java.util.UUID; 10 | 11 | public class BlocksFoundRowMapper implements RowMapper { 12 | @Override 13 | public BlockFound map(ResultSet rs, StatementContext ctx) throws SQLException { 14 | return new BlockFound( 15 | UUID.fromString(rs.getString("player")), 16 | rs.getString("material_name"), 17 | rs.getInt("timestamp"), 18 | rs.getInt("found") 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/addons/OAAddonManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.addons; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.addons.AddonManager; 5 | import com.alessiodp.core.common.configuration.Constants; 6 | import com.alessiodp.oreannouncer.common.addons.external.LLAPIHandler; 7 | import lombok.NonNull; 8 | 9 | public abstract class OAAddonManager extends AddonManager { 10 | private final LLAPIHandler llapiHandler; 11 | 12 | public OAAddonManager(@NonNull ADPPlugin plugin) { 13 | super(plugin); 14 | llapiHandler = new LLAPIHandler(plugin); 15 | } 16 | 17 | @Override 18 | public void loadAddons() { 19 | plugin.getLoggerManager().logDebug(Constants.DEBUG_ADDON_INIT, true); 20 | 21 | llapiHandler.init(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/messaging/OAMessageDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.messaging; 2 | 3 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockData; 4 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 5 | 6 | public interface OAMessageDispatcher { 7 | void sendUpdatePlayer(OAPlayerImpl player); 8 | 9 | void sendAlert(BlockData blockData, String messageUser, String messageAdmin, String messageConsole); 10 | 11 | void sendAlertCount(BlockData blockData, String messageUser, String messageAdmin, String messageConsole); 12 | 13 | void sendAlertTNT(BlockData blockData, String messageUser, String messageAdmin, String messageConsole); 14 | 15 | void sendBlockDestroy(BlockData blockData); 16 | 17 | void sendBlockFound(BlockData blockData); 18 | } 19 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/commands/main/BukkitCommandOA.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.commands.main; 2 | 3 | import com.alessiodp.oreannouncer.bukkit.commands.sub.BukkitCommandDebug; 4 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import com.alessiodp.oreannouncer.common.commands.main.CommandOA; 7 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 8 | 9 | public class BukkitCommandOA extends CommandOA { 10 | public BukkitCommandOA(OreAnnouncerPlugin plugin) { 11 | super(plugin); 12 | 13 | description = BukkitConfigMain.COMMANDS_MAIN_OA_DESCRIPTION; 14 | 15 | if (ConfigMain.OREANNOUNCER_DEBUG_COMMAND) 16 | register(new BukkitCommandDebug(plugin, this)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/listeners/JoinLeaveListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.listeners; 2 | 3 | import com.alessiodp.core.common.user.User; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import lombok.RequiredArgsConstructor; 6 | 7 | @RequiredArgsConstructor 8 | public abstract class JoinLeaveListener { 9 | protected final OreAnnouncerPlugin plugin; 10 | 11 | protected void onPlayerJoin(User user) { 12 | // Make it async 13 | plugin.getScheduler().runAsync(() -> { 14 | plugin.getPlayerManager().loadPlayer(user.getUUID()); 15 | plugin.getLoginAlertsManager().sendAlerts(user); 16 | }); 17 | } 18 | 19 | protected void onPlayerQuit(User user) { 20 | // Make it async 21 | plugin.getScheduler().runAsync(() -> plugin.getPlayerManager().unloadPlayer(user.getUUID())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/blocks/objects/BlockLocationImpl.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.blocks.objects; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | 8 | @AllArgsConstructor 9 | public class BlockLocationImpl implements BlockLocation { 10 | @Getter private String world; 11 | @Getter private double x; 12 | @Getter private double y; 13 | @Getter private double z; 14 | @Getter private float yaw; 15 | @Getter private float pitch; 16 | 17 | public BlockLocationImpl(ADPLocation location) { 18 | world = location.getWorld(); 19 | x = location.getX(); 20 | y = location.getY(); 21 | z = location.getZ(); 22 | yaw = location.getYaw(); 23 | pitch = location.getPitch(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/utils/BukkitMessageUtils.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.utils; 2 | 3 | import com.alessiodp.oreannouncer.bukkit.addons.external.PlaceholderAPIHandler; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 6 | import com.alessiodp.oreannouncer.common.utils.MessageUtils; 7 | 8 | public class BukkitMessageUtils extends MessageUtils { 9 | public BukkitMessageUtils(OreAnnouncerPlugin plugin) { 10 | super(plugin); 11 | } 12 | 13 | @Override 14 | public String convertPlayerPlaceholders(String message, OAPlayerImpl player) { 15 | String ret = super.convertPlayerPlaceholders(message, player); 16 | if (player != null) 17 | ret = PlaceholderAPIHandler.getPlaceholders(player.getPlayerUUID(), ret); 18 | return ret; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/configuration/BukkitOAConfigurationManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.configuration; 2 | 3 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 4 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitMessages; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import com.alessiodp.oreannouncer.common.configuration.OAConfigurationManager; 7 | import com.alessiodp.oreannouncer.common.configuration.data.Blocks; 8 | 9 | public class BukkitOAConfigurationManager extends OAConfigurationManager { 10 | 11 | public BukkitOAConfigurationManager(OreAnnouncerPlugin plugin) { 12 | super(plugin); 13 | 14 | getConfigs().add(new BukkitConfigMain(plugin)); 15 | getConfigs().add(new BukkitMessages(plugin)); 16 | getConfigs().add(new Blocks(plugin)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/blocks/objects/BlockData.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.blocks.objects; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Accessors(chain = true) 12 | public class BlockData implements Serializable { 13 | private final OAPlayerImpl player; 14 | private final OABlockImpl block; 15 | private int number; 16 | 17 | private boolean alertUsers; 18 | private boolean alertAdmins; 19 | private ADPLocation location; 20 | private int lightLevel; 21 | private long elapsed = -1L; 22 | 23 | public BlockData(OAPlayerImpl player, OABlockImpl block, int number) { 24 | this.player = player; 25 | this.block = block; 26 | this.number = number; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/OACommandManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.CommandManager; 5 | import com.alessiodp.core.common.commands.utils.CommandData; 6 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 7 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 8 | 9 | import java.util.LinkedList; 10 | 11 | public abstract class OACommandManager extends CommandManager { 12 | protected OACommandManager(ADPPlugin plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | public void prepareCommands() { 18 | commandOrder = new LinkedList<>(); 19 | commandOrder.addAll(ConfigMain.COMMANDS_ORDER); 20 | } 21 | 22 | @Override 23 | public CommandData initializeCommandData() { 24 | return new OACommandData(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/blocks/objects/Alert.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.blocks.objects; 2 | 3 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import lombok.experimental.Accessors; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | @NoArgsConstructor 10 | @Data 11 | @Accessors(chain = true) 12 | public class Alert { 13 | private String messageUser = ""; 14 | private String messageAdmin = ""; 15 | private String messageConsole = ""; 16 | 17 | private BlockData data; 18 | @Nullable private String sound = ConfigMain.ALERTS_SOUND_DEFAULT; 19 | @Nullable private String serverId; 20 | 21 | public Alert(String messageUser, String messageAdmin, String messageConsole) { 22 | this.messageUser = messageUser; 23 | this.messageAdmin = messageAdmin; 24 | this.messageConsole = messageConsole; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/common/IBlockDestroyEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 5 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 6 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public interface IBlockDestroyEvent extends OreAnnouncerEvent { 10 | /** 11 | * Get the player who destroy the block 12 | * 13 | * @return Returns the {@link OAPlayer} 14 | */ 15 | @NotNull 16 | OAPlayer getPlayer(); 17 | 18 | /** 19 | * Get the block 20 | * 21 | * @return Returns the {@link OABlock} 22 | */ 23 | @NotNull 24 | OABlock getBlock(); 25 | 26 | /** 27 | * Get the block location 28 | * 29 | * @return Returns the {@link BlockLocation} 30 | */ 31 | @NotNull 32 | BlockLocation getBlockLocation(); 33 | } 34 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocks/SQLiteBlocksDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocks; 2 | 3 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 4 | 5 | public interface SQLiteBlocksDao extends BlocksDao { 6 | String QUERY_UPDATE = "INSERT INTO `blocks` (`player`, `material_name`, `destroyed`)" + 7 | " VALUES (?, ?, ?)" + 8 | " ON CONFLICT (`player`, `material_name`) DO" + 9 | " UPDATE SET destroyed = destroyed + excluded.destroyed"; 10 | String QUERY_SET = "INSERT INTO `blocks` (`player`, `material_name`, `destroyed`)" + 11 | " VALUES (?, ?, ?)" + 12 | " ON CONFLICT (`player`, `material_name`) DO" + 13 | " UPDATE SET destroyed = excluded.destroyed"; 14 | 15 | @Override 16 | @SqlUpdate(QUERY_UPDATE) 17 | void update(String uuid, String materialName, int destroyed); 18 | 19 | @Override 20 | @SqlUpdate(QUERY_SET) 21 | void set(String uuid, String materialName, int destroyed); 22 | } 23 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/configuration/data/BungeeConfigMain.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.configuration.data; 2 | 3 | import com.alessiodp.core.common.configuration.ConfigOption; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 6 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 7 | import lombok.Getter; 8 | 9 | import java.util.List; 10 | 11 | public class BungeeConfigMain extends ConfigMain { 12 | @Getter private final String fileName = "config.yml"; 13 | @Getter private final String resourceName = "bungee/config.yml"; 14 | @Getter private final int latestVersion = OAConstants.VERSION_BUNGEE_CONFIG; 15 | 16 | // Blocks settings 17 | @ConfigOption(path = "blocks.list-allowed") 18 | public static List BLOCKS_LISTALLOWED; 19 | 20 | public BungeeConfigMain(OreAnnouncerPlugin plugin) { 21 | super(plugin); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocks/H2BlocksDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocks; 2 | 3 | import org.jdbi.v3.sqlobject.customizer.Bind; 4 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 5 | 6 | public interface H2BlocksDao extends BlocksDao { 7 | String QUERY_UPDATE = "MERGE INTO `blocks`" + 8 | " USING DUAL ON player = :player AND material_name = :material_name" + 9 | " WHEN MATCHED THEN UPDATE SET `destroyed`=`destroyed` + :destroyed" + 10 | " WHEN NOT MATCHED THEN INSERT VALUES (:player, :material_name, :destroyed)"; 11 | String QUERY_SET = "MERGE INTO `blocks` (`player`, `material_name`, `destroyed`) VALUES (?, ?, ?)"; 12 | 13 | @Override 14 | @SqlUpdate(QUERY_UPDATE) 15 | void update(@Bind("player") String uuid, @Bind("material_name") String materialName, @Bind("destroyed") int destroyed); 16 | 17 | @Override 18 | @SqlUpdate(QUERY_SET) 19 | void set(String uuid, String materialName, int destroyed); 20 | } 21 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/utils/OAPlayerUtils.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.utils; 2 | 3 | import com.alessiodp.core.common.commands.list.ADPCommand; 4 | import com.alessiodp.core.common.user.User; 5 | import com.alessiodp.core.common.utils.IPlayerUtils; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 8 | import lombok.NonNull; 9 | import lombok.RequiredArgsConstructor; 10 | 11 | import java.util.HashSet; 12 | import java.util.Set; 13 | 14 | @RequiredArgsConstructor 15 | public class OAPlayerUtils implements IPlayerUtils { 16 | private final OreAnnouncerPlugin plugin; 17 | 18 | @Override 19 | public Set getAllowedCommands(@NonNull User user) { 20 | Set ret = new HashSet<>(); 21 | OAPlayerImpl player = plugin.getPlayerManager().getPlayer(user.getUUID()); 22 | if (player != null) { 23 | ret = player.getAllowedCommands(); 24 | } 25 | return ret; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/interfaces/BlockLocation.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.interfaces; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | public interface BlockLocation { 6 | /** 7 | * Gets the world name of the location 8 | * 9 | * @return Returns the world name 10 | */ 11 | @NotNull 12 | String getWorld(); 13 | 14 | /** 15 | * Get the x-coordinate of the location 16 | * 17 | * @return Returns the x-coordinate 18 | */ 19 | double getX(); 20 | 21 | /** 22 | * Get the y-coordinate of the location 23 | * 24 | * @return Returns the y-coordinate 25 | */ 26 | double getY(); 27 | 28 | /** 29 | * Get the z-coordinate of the location 30 | * 31 | * @return Returns the z-coordinate 32 | */ 33 | double getZ(); 34 | 35 | /** 36 | * Get the yaw of the location 37 | * 38 | * @return Returns the yaw 39 | */ 40 | float getYaw(); 41 | 42 | /** 43 | * Get the pitch of the location 44 | * 45 | * @return Returns the pitch 46 | */ 47 | float getPitch(); 48 | } 49 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/players/OAPlayerRowMapper.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.players; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 6 | import org.jdbi.v3.core.mapper.RowMapper; 7 | import org.jdbi.v3.core.statement.StatementContext; 8 | 9 | import java.sql.ResultSet; 10 | import java.sql.SQLException; 11 | import java.util.UUID; 12 | 13 | public class OAPlayerRowMapper implements RowMapper { 14 | @Override 15 | public OAPlayerImpl map(ResultSet rs, StatementContext ctx) throws SQLException { 16 | OAPlayerImpl ret = ((OreAnnouncerPlugin) ADPPlugin.getInstance()).getPlayerManager().initializePlayer(UUID.fromString(rs.getString("uuid"))); 17 | ret.setAccessible(true); 18 | ret.setAlertsOn(rs.getBoolean("alerts")); 19 | ret.setWhitelisted(rs.getBoolean("whitelisted")); 20 | ret.setAccessible(false); 21 | return ret; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bukkit/BukkitOreAnnouncerEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bukkit; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.OreAnnouncerAPI; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public class BukkitOreAnnouncerEvent extends Event implements OreAnnouncerEvent { 10 | private OreAnnouncerAPI api; 11 | private static final HandlerList HANDLERS = new HandlerList(); 12 | 13 | public BukkitOreAnnouncerEvent(boolean async) { 14 | super(async); 15 | } 16 | 17 | @Override 18 | @NotNull 19 | public OreAnnouncerAPI getApi() { 20 | return api; 21 | } 22 | 23 | @Override 24 | public void setApi(OreAnnouncerAPI instance) { 25 | api = instance; 26 | } 27 | 28 | @Override 29 | @NotNull 30 | public HandlerList getHandlers() { 31 | return HANDLERS; 32 | } 33 | 34 | public static HandlerList getHandlerList() { 35 | return HANDLERS; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/commands/BukkitOACommandManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.commands; 2 | 3 | import com.alessiodp.core.bukkit.commands.utils.BukkitCommandUtils; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.oreannouncer.bukkit.commands.main.BukkitCommandOA; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.commands.OACommandManager; 8 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 9 | 10 | import java.util.ArrayList; 11 | 12 | public class BukkitOACommandManager extends OACommandManager { 13 | 14 | public BukkitOACommandManager(ADPPlugin plugin) { 15 | super(plugin); 16 | } 17 | 18 | @Override 19 | public void prepareCommands() { 20 | super.prepareCommands(); 21 | commandUtils = new BukkitCommandUtils(plugin, ConfigMain.COMMANDS_MISC_ON, ConfigMain.COMMANDS_MISC_OFF); 22 | } 23 | 24 | @Override 25 | public void registerCommands() { 26 | mainCommands = new ArrayList<>(); 27 | mainCommands.add(new BukkitCommandOA((OreAnnouncerPlugin) plugin)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/listeners/BukkitJoinLeaveListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.listeners; 2 | 3 | import com.alessiodp.core.bukkit.user.BukkitUser; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.listeners.JoinLeaveListener; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.EventPriority; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.player.PlayerJoinEvent; 10 | import org.bukkit.event.player.PlayerQuitEvent; 11 | 12 | public class BukkitJoinLeaveListener extends JoinLeaveListener implements Listener { 13 | 14 | public BukkitJoinLeaveListener(OreAnnouncerPlugin plugin) { 15 | super(plugin); 16 | } 17 | 18 | @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) 19 | public void onPlayerJoin(PlayerJoinEvent event) { 20 | super.onPlayerJoin(new BukkitUser(plugin, event.getPlayer())); 21 | } 22 | 23 | @EventHandler(ignoreCancelled = true) 24 | public void onPlayerQuit(PlayerQuitEvent event) { 25 | super.onPlayerQuit(new BukkitUser(plugin, event.getPlayer())); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/listeners/BungeeJoinLeaveListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.listeners; 2 | 3 | import com.alessiodp.core.bungeecord.user.BungeeUser; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.listeners.JoinLeaveListener; 6 | import net.md_5.bungee.api.event.PlayerDisconnectEvent; 7 | import net.md_5.bungee.api.event.PostLoginEvent; 8 | import net.md_5.bungee.api.plugin.Listener; 9 | import net.md_5.bungee.event.EventHandler; 10 | import net.md_5.bungee.event.EventPriority; 11 | 12 | public class BungeeJoinLeaveListener extends JoinLeaveListener implements Listener { 13 | 14 | public BungeeJoinLeaveListener(OreAnnouncerPlugin plugin) { 15 | super(plugin); 16 | } 17 | 18 | @EventHandler(priority = EventPriority.LOW) 19 | public void onPlayerJoin(PostLoginEvent event) { 20 | super.onPlayerJoin(new BungeeUser(plugin, event.getPlayer())); 21 | } 22 | 23 | @EventHandler 24 | public void onPlayerQuit(PlayerDisconnectEvent event) { 25 | super.onPlayerQuit(new BungeeUser(plugin, event.getPlayer())); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/commands/BungeeOACommandManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.commands; 2 | 3 | import com.alessiodp.core.bungeecord.commands.utils.BungeeCommandUtils; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.oreannouncer.bungeecord.commands.main.BungeeCommandOA; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.commands.OACommandManager; 8 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 9 | 10 | import java.util.ArrayList; 11 | 12 | public class BungeeOACommandManager extends OACommandManager { 13 | 14 | public BungeeOACommandManager(ADPPlugin plugin) { 15 | super(plugin); 16 | } 17 | 18 | @Override 19 | public void prepareCommands() { 20 | super.prepareCommands(); 21 | commandUtils = new BungeeCommandUtils(plugin, ConfigMain.COMMANDS_MISC_ON, ConfigMain.COMMANDS_MISC_OFF); 22 | } 23 | 24 | @Override 25 | public void registerCommands() { 26 | mainCommands = new ArrayList<>(); 27 | mainCommands.add(new BungeeCommandOA((OreAnnouncerPlugin) plugin)); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/blocks/objects/BlockFound.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.blocks.objects; 2 | 3 | import com.alessiodp.core.common.utils.CommonUtils; 4 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 5 | import com.alessiodp.oreannouncer.api.interfaces.OABlockFound; 6 | import lombok.AllArgsConstructor; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.Getter; 9 | import lombok.ToString; 10 | 11 | import java.util.UUID; 12 | 13 | @AllArgsConstructor 14 | @EqualsAndHashCode(doNotUseGetters = true) 15 | @ToString 16 | public class BlockFound implements OABlockFound { 17 | @Getter private final UUID player; 18 | @Getter private final String materialName; 19 | @Getter private final long timestamp; 20 | @Getter private final int found; 21 | 22 | public BlockFound(UUID player, String materialName, int found) { 23 | this(player, materialName, System.currentTimeMillis() / 1000, found); 24 | } 25 | 26 | public BlockFound(UUID player, OABlock block, int found) { 27 | this(player, block, System.currentTimeMillis() / 1000, found); 28 | } 29 | 30 | public BlockFound(UUID player, OABlock block, long timestamp, int found) { 31 | this(player, CommonUtils.toUpperCase(block.getMaterialName()), timestamp, found); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bungee/common/BungeeOreAnnouncerBlockDestroyEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bungee.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bungee.BungeeOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IBlockDestroyEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BungeeOreAnnouncerBlockDestroyEvent extends BungeeOreAnnouncerEvent implements IBlockDestroyEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final BlockLocation blockLocation; 14 | 15 | public BungeeOreAnnouncerBlockDestroyEvent(OAPlayer player, OABlock block, BlockLocation blockLocation) { 16 | this.player = player; 17 | this.block = block; 18 | this.blockLocation = blockLocation; 19 | } 20 | 21 | @NotNull 22 | @Override 23 | public OAPlayer getPlayer() { 24 | return player; 25 | } 26 | 27 | @NotNull 28 | @Override 29 | public OABlock getBlock() { 30 | return block; 31 | } 32 | 33 | @NotNull 34 | @Override 35 | public BlockLocation getBlockLocation() { 36 | return blockLocation; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bukkit/common/BukkitOreAnnouncerBlockDestroyEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bukkit.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bukkit.BukkitOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IBlockDestroyEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BukkitOreAnnouncerBlockDestroyEvent extends BukkitOreAnnouncerEvent implements IBlockDestroyEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final BlockLocation blockLocation; 14 | 15 | public BukkitOreAnnouncerBlockDestroyEvent(OAPlayer player, OABlock block, BlockLocation blockLocation) { 16 | super(true); 17 | this.player = player; 18 | this.block = block; 19 | this.blockLocation = blockLocation; 20 | } 21 | 22 | @NotNull 23 | @Override 24 | public OAPlayer getPlayer() { 25 | return player; 26 | } 27 | 28 | @NotNull 29 | @Override 30 | public OABlock getBlock() { 31 | return block; 32 | } 33 | 34 | @NotNull 35 | @Override 36 | public BlockLocation getBlockLocation() { 37 | return blockLocation; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/OreAnnouncer.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api; 2 | 3 | import com.alessiodp.oreannouncer.api.interfaces.OreAnnouncerAPI; 4 | 5 | public final class OreAnnouncer { 6 | private static OreAnnouncerAPI api = null; 7 | private static boolean flagHook = false; 8 | 9 | private OreAnnouncer() { 10 | } 11 | 12 | /** 13 | * Get the {@link OreAnnouncerAPI} instance 14 | * 15 | * @return Returns the {@link OreAnnouncerAPI} interface 16 | * @throws IllegalStateException if OreAnnouncerAPI has not been initialized, in other words, 17 | * OreAnnouncerAPI has not been loaded 18 | */ 19 | public static OreAnnouncerAPI getApi() throws IllegalStateException { 20 | flagHook = true; 21 | if (api == null) 22 | throw new IllegalStateException("OreAnnouncerAPI has not been initialized"); 23 | return api; 24 | } 25 | 26 | /** 27 | * Set the OreAnnouncer API instance. This should not be used. 28 | * 29 | * @param instance The OreAnnouncerAPI instance. 30 | */ 31 | public static void setApi(OreAnnouncerAPI instance) { 32 | api = instance; 33 | } 34 | 35 | /** 36 | * Flag to know if OreAnnouncer has been hooked 37 | * 38 | * @return Returns true if the API has been hooked at least one time 39 | */ 40 | public static boolean isFlagHook() { 41 | return flagHook; 42 | } 43 | } -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/players/PlayersDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.players; 2 | 3 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 4 | import org.jdbi.v3.sqlobject.config.RegisterRowMapper; 5 | import org.jdbi.v3.sqlobject.statement.SqlQuery; 6 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 7 | 8 | import java.util.Optional; 9 | 10 | public interface PlayersDao { 11 | String QUERY_INSERT = "INSERT INTO `players` (`uuid`, `alerts`, `whitelisted`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE alerts=VALUES(alerts), whitelisted=VALUES(whitelisted)"; 12 | String QUERY_REMOVE = "DELETE FROM `players` WHERE uuid = ?"; 13 | String QUERY_GET = "SELECT * FROM `players` WHERE uuid = ?"; 14 | String QUERY_COUNT_ALL = "SELECT count(*) FROM `players`"; 15 | String QUERY_DELETE_ALL = "DELETE FROM `players`"; 16 | 17 | @SqlUpdate(QUERY_INSERT) 18 | void insert(String uuid, boolean alerts, boolean whitelisted); 19 | 20 | @SqlUpdate(QUERY_REMOVE) 21 | void remove(String uuid); 22 | 23 | @SqlQuery(QUERY_GET) 24 | @RegisterRowMapper(OAPlayerRowMapper.class) 25 | Optional getPlayer(String uuid); 26 | 27 | @SqlQuery(QUERY_COUNT_ALL) 28 | int countAll(); 29 | 30 | @SqlUpdate(QUERY_DELETE_ALL) 31 | void deleteAll(); 32 | } 33 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/blocks/BungeeBlockManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.blocks; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.blocks.BlockManager; 6 | import com.alessiodp.oreannouncer.common.blocks.objects.OABlockImpl; 7 | 8 | import java.util.UUID; 9 | 10 | public class BungeeBlockManager extends BlockManager { 11 | 12 | public BungeeBlockManager(OreAnnouncerPlugin plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | public boolean existsMaterial(String materialName) { 18 | // BungeeCord cannot check if a block is valid 19 | // Return true if not empty (used on block list setup) 20 | return !materialName.isEmpty(); 21 | } 22 | 23 | @Override 24 | public boolean isBlockMarked(ADPLocation blockLocation, MarkType markType) { 25 | // Nothing to do 26 | return false; 27 | } 28 | 29 | @Override 30 | public boolean markBlock(ADPLocation blockLocation, OABlockImpl block, MarkType markType) { 31 | // Nothing to do 32 | return false; 33 | } 34 | 35 | @Override 36 | public void unmarkBlock(ADPLocation blockLocation, MarkType markType) { 37 | // Nothing to do 38 | } 39 | 40 | @Override 41 | public String parsePAPI(UUID playerUuid, String message) { 42 | return message; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/common/IAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 5 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 6 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public interface IAlertEvent extends OreAnnouncerEvent { 10 | 11 | /** 12 | * Get the target player of the alert 13 | * 14 | * @return Returns the {@link OAPlayer} 15 | */ 16 | @NotNull 17 | OAPlayer getPlayer(); 18 | 19 | /** 20 | * Get the block 21 | * 22 | * @return Returns the {@link OABlock} 23 | */ 24 | @NotNull 25 | OABlock getBlock(); 26 | 27 | /** 28 | * Get the number of blocks that have been found 29 | * 30 | * @return Returns the number of blocks 31 | */ 32 | int getNumberOfBlocks(); 33 | 34 | /** 35 | * Get the location of the player when he found the blocks 36 | * 37 | * @return Returns the {@link BlockLocation} 38 | */ 39 | BlockLocation getLocation(); 40 | 41 | /** 42 | * Get the light level 43 | * 44 | * @return Returns the light level 45 | */ 46 | int getLightLevel(); 47 | 48 | /** 49 | * Get the height level 50 | * 51 | * @return Returns the height level 52 | */ 53 | int getHeightLevel(); 54 | } 55 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/addons/external/hooks/LLAPIHook.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.addons.external.hooks; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.configuration.Constants; 5 | import com.alessiodp.lastloginapi.api.LastLogin; 6 | import com.alessiodp.lastloginapi.api.interfaces.LastLoginAPI; 7 | import com.alessiodp.lastloginapi.api.interfaces.LastLoginPlayer; 8 | import lombok.NonNull; 9 | import lombok.RequiredArgsConstructor; 10 | 11 | import java.util.HashSet; 12 | import java.util.Set; 13 | import java.util.UUID; 14 | 15 | @RequiredArgsConstructor 16 | public class LLAPIHook { 17 | @NonNull private final ADPPlugin plugin; 18 | private LastLoginAPI api; 19 | 20 | public boolean register() { 21 | boolean ret = false; 22 | try { 23 | api = LastLogin.getApi(); 24 | ret = true; 25 | } catch (Exception ex) { 26 | plugin.getLoggerManager().logError(String.format(Constants.DEBUG_ADDON_OUTDATED, "LastLoginAPI")); 27 | ex.printStackTrace(); 28 | } 29 | return ret; 30 | } 31 | 32 | public String getPlayerName(UUID uuid) { 33 | return api.getPlayer(uuid).getName(); 34 | } 35 | 36 | public Set getPlayerByName(String name) { 37 | Set ret = new HashSet<>(); 38 | Set players = api.getPlayerByName(name); 39 | for (LastLoginPlayer pl : players) { 40 | ret.add(pl.getPlayerUUID()); 41 | } 42 | return ret; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/players/PostgreSQLPlayersDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.players; 2 | 3 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 4 | import org.jdbi.v3.sqlobject.config.RegisterRowMapper; 5 | import org.jdbi.v3.sqlobject.statement.SqlQuery; 6 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 7 | 8 | import java.util.Optional; 9 | 10 | public interface PostgreSQLPlayersDao extends PlayersDao { 11 | String QUERY_INSERT = "INSERT INTO players (\"uuid\", \"alerts\", \"whitelisted\")" + 12 | " VALUES (?, ?, ?)" + 13 | " ON CONFLICT (\"uuid\") DO UPDATE SET alerts=EXCLUDED.alerts, whitelisted=EXCLUDED.whitelisted"; 14 | String QUERY_REMOVE = "DELETE FROM players WHERE uuid = ?"; 15 | String QUERY_GET = "SELECT * FROM players WHERE uuid = ?"; 16 | String QUERY_COUNT_ALL = "SELECT count(*) FROM players"; 17 | String QUERY_DELETE_ALL = "DELETE FROM players"; 18 | 19 | @Override 20 | @SqlUpdate(QUERY_INSERT) 21 | void insert(String uuid, boolean alerts, boolean whitelisted); 22 | 23 | @Override 24 | @SqlUpdate(QUERY_REMOVE) 25 | void remove(String uuid); 26 | 27 | @Override 28 | @SqlQuery(QUERY_GET) 29 | @RegisterRowMapper(OAPlayerRowMapper.class) 30 | Optional getPlayer(String uuid); 31 | 32 | @Override 33 | @SqlQuery(QUERY_COUNT_ALL) 34 | int countAll(); 35 | 36 | @SqlUpdate(QUERY_DELETE_ALL) 37 | void deleteAll(); 38 | } 39 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/common/IAdvancedAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 5 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 6 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | public interface IAdvancedAlertEvent extends OreAnnouncerEvent { 10 | 11 | /** 12 | * Get the target player of the alert 13 | * 14 | * @return Returns the {@link OAPlayer} 15 | */ 16 | @NotNull 17 | OAPlayer getPlayer(); 18 | 19 | /** 20 | * Get the block 21 | * 22 | * @return Returns the {@link OABlock} 23 | */ 24 | @NotNull 25 | OABlock getBlock(); 26 | 27 | /** 28 | * Get the total of blocks found by the start of elapsed time 29 | * 30 | * @return Returns the total of blocks 31 | */ 32 | int getTotalBlocks(); 33 | 34 | /** 35 | * Get the elapsed time of this alert 36 | * 37 | * @return The elapsed time 38 | */ 39 | long getElapsedTime(); 40 | 41 | /** 42 | * Get the location of the player when he found the blocks 43 | * 44 | * @return Returns the {@link BlockLocation} 45 | */ 46 | BlockLocation getLocation(); 47 | 48 | /** 49 | * Get the light level 50 | * 51 | * @return Returns the light level 52 | */ 53 | int getLightLevel(); 54 | 55 | /** 56 | * Get the height level 57 | * 58 | * @return Returns the height level 59 | */ 60 | int getHeightLevel(); 61 | } 62 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/messaging/bungee/BukkitOABungeecordListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.messaging.bungee; 2 | 3 | import com.alessiodp.core.bukkit.messaging.bungee.BukkitBungeecordListener; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.core.common.messaging.MessageChannel; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 8 | import com.alessiodp.oreannouncer.common.messaging.OAPacket; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | public class BukkitOABungeecordListener extends BukkitBungeecordListener { 12 | public BukkitOABungeecordListener(@NotNull ADPPlugin plugin) { 13 | super(plugin, false, true, false); 14 | } 15 | 16 | @Override 17 | protected void handlePacket(byte[] bytes, @NotNull MessageChannel messageChannel) { 18 | if (messageChannel != MessageChannel.SUB) 19 | return; // Handle only packets for sub channel 20 | 21 | OAPacket packet = OAPacket.read(plugin, bytes); 22 | if (packet != null) { 23 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_MESSAGING_RECEIVED, packet.getType().name(), messageChannel.getId()), true); 24 | if (packet.getType() == OAPacket.PacketType.UPDATE_PLAYER) { 25 | if (((OreAnnouncerPlugin) plugin).getPlayerManager().reloadPlayer(packet.getPlayerUuid())) { 26 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_MESSAGING_LISTEN_UPDATE_PLAYER, 27 | packet.getPlayerUuid().toString()), true); 28 | } 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/events/EventManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.events; 2 | 3 | import com.alessiodp.core.common.events.EventDispatcher; 4 | import com.alessiodp.oreannouncer.api.events.OreAnnouncerEvent; 5 | import com.alessiodp.oreannouncer.api.events.common.IAdvancedAlertEvent; 6 | import com.alessiodp.oreannouncer.api.events.common.IAlertEvent; 7 | import com.alessiodp.oreannouncer.api.events.common.IBlockDestroyEvent; 8 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 9 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 10 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 11 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 12 | import lombok.NonNull; 13 | import lombok.RequiredArgsConstructor; 14 | 15 | @RequiredArgsConstructor 16 | public abstract class EventManager { 17 | @NonNull protected final OreAnnouncerPlugin plugin; 18 | @NonNull protected final EventDispatcher eventDispatcher; 19 | 20 | public final void callEvent(OreAnnouncerEvent event) { 21 | event.setApi(plugin.getApi()); 22 | eventDispatcher.callEvent(event); 23 | } 24 | 25 | public abstract IAlertEvent prepareAlertEvent(OAPlayer player, OABlock block, int number, BlockLocation location, int lightLevel, int heightLevel); 26 | public abstract IAdvancedAlertEvent prepareAdvancedEvent(OAPlayer player, OABlock block, int total, long elapsedTime, BlockLocation location, int lightLevel, int heightLevel); 27 | public abstract IBlockDestroyEvent prepareBlockDestroyEvent(OAPlayer player, OABlock block, BlockLocation blockLocation); 28 | } 29 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/commands/sub/BukkitCommandDebug.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 5 | import com.alessiodp.core.common.utils.ADPLocation; 6 | import com.alessiodp.oreannouncer.common.commands.sub.CommandDebug; 7 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.entity.Player; 10 | 11 | public class BukkitCommandDebug extends CommandDebug { 12 | 13 | public BukkitCommandDebug(ADPPlugin plugin, ADPMainCommand mainCommand) { 14 | super(plugin, mainCommand); 15 | } 16 | 17 | @Override 18 | protected ADPLocation getPlayerLocation(OAPlayerImpl player) { 19 | Player bukkitPlayer = Bukkit.getPlayer(player.getPlayerUUID()); 20 | if (bukkitPlayer != null) 21 | return new ADPLocation( 22 | bukkitPlayer.getLocation().getWorld() != null ? bukkitPlayer.getLocation().getWorld().getName() : "", 23 | bukkitPlayer.getLocation().getX(), 24 | bukkitPlayer.getLocation().getY(), 25 | bukkitPlayer.getLocation().getZ(), 26 | bukkitPlayer.getLocation().getYaw(), 27 | bukkitPlayer.getLocation().getPitch() 28 | ); 29 | return super.getPlayerLocation(player); 30 | } 31 | 32 | @Override 33 | protected int getPlayerLightLevel(OAPlayerImpl player) { 34 | Player bukkitPlayer = Bukkit.getPlayer(player.getPlayerUUID()); 35 | if (bukkitPlayer != null) 36 | return bukkitPlayer.getLocation().getBlock().getLightLevel(); 37 | return super.getPlayerLightLevel(player); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/BukkitMetricsHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external; 2 | 3 | import com.alessiodp.core.bukkit.addons.external.bstats.bukkit.Metrics; 4 | import com.alessiodp.core.bukkit.addons.external.bstats.charts.SimplePie; 5 | import com.alessiodp.core.common.ADPPlugin; 6 | import com.alessiodp.core.common.addons.external.MetricsHandler; 7 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 8 | import lombok.NonNull; 9 | import org.bukkit.plugin.java.JavaPlugin; 10 | 11 | public class BukkitMetricsHandler extends MetricsHandler { 12 | public BukkitMetricsHandler(@NonNull ADPPlugin plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | protected void registerMetrics() { 18 | Metrics metrics = new Metrics((JavaPlugin) plugin.getBootstrap(), plugin.getBstatsId()); 19 | 20 | metrics.addCustomChart(new SimplePie("type_of_announce_used", () -> { 21 | if (ConfigMain.ALERTS_ENABLE) { 22 | if (ConfigMain.ALERTS_COORDINATES_ENABLE) 23 | return "Coordinates"; 24 | return "Normal"; 25 | } 26 | return "Disabled"; 27 | })); 28 | 29 | metrics.addCustomChart(new SimplePie("use_randomizer", () -> { 30 | if (ConfigMain.ALERTS_COORDINATES_ENABLE && ConfigMain.ALERTS_COORDINATES_HIDE_ENABLE) 31 | return "Enabled"; 32 | return "Disabled"; 33 | })); 34 | 35 | metrics.addCustomChart(new SimplePie("use_statistics", () -> { 36 | if (ConfigMain.STATS_ENABLE) 37 | return "Enabled"; 38 | return "Disabled"; 39 | })); 40 | 41 | metrics.addCustomChart(new SimplePie("type_of_database_used", () -> plugin.getDatabaseManager().getDatabaseType().getFormattedName())); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/PlaceholderAPIHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external; 2 | 3 | import com.alessiodp.core.common.configuration.Constants; 4 | import com.alessiodp.oreannouncer.bukkit.addons.external.hooks.PAPIHook; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import lombok.NonNull; 7 | import lombok.RequiredArgsConstructor; 8 | import org.bukkit.Bukkit; 9 | 10 | import java.util.UUID; 11 | 12 | @RequiredArgsConstructor 13 | public class PlaceholderAPIHandler { 14 | @NonNull private final OreAnnouncerPlugin plugin; 15 | private static final String ADDON_NAME = "PlaceholderAPI"; 16 | private static boolean firstTime = true; 17 | private static boolean active; 18 | private static PAPIHook hook; 19 | 20 | public void init() { 21 | if (active) { 22 | // Already active, print hooked then return 23 | plugin.getLoggerManager().log(String.format(Constants.DEBUG_ADDON_HOOKED, ADDON_NAME), true); 24 | return; 25 | } 26 | 27 | if (firstTime) { 28 | firstTime = false; // Register PAPI only one time, this is called by server thread on startup (async not supported) 29 | if (Bukkit.getPluginManager().isPluginEnabled(ADDON_NAME)) { 30 | hook = new PAPIHook(plugin); 31 | 32 | if (hook.register()) { 33 | active = true; 34 | 35 | plugin.getLoggerManager().log(String.format(Constants.DEBUG_ADDON_HOOKED, ADDON_NAME), true); 36 | } 37 | } 38 | } 39 | } 40 | 41 | public static String getPlaceholders(UUID uuid, String message) { 42 | String ret = message; 43 | if (active && hook != null) 44 | ret = hook.parsePlaceholders(Bukkit.getOfflinePlayer(uuid), message); 45 | return ret; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/BukkitOAAddonManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.oreannouncer.bukkit.addons.external.DiscordSRVHandler; 5 | import com.alessiodp.oreannouncer.bukkit.addons.external.EssentialsChatHandler; 6 | import com.alessiodp.oreannouncer.bukkit.addons.external.ItemModsHandler; 7 | import com.alessiodp.oreannouncer.bukkit.addons.external.MMOItemsHandler; 8 | import com.alessiodp.oreannouncer.bukkit.addons.external.PlaceholderAPIHandler; 9 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 10 | import com.alessiodp.oreannouncer.common.addons.OAAddonManager; 11 | import lombok.NonNull; 12 | 13 | public class BukkitOAAddonManager extends OAAddonManager { 14 | private final DiscordSRVHandler discordSRV; 15 | private final EssentialsChatHandler essentialsChat; 16 | private final ItemModsHandler itemMods; 17 | private final MMOItemsHandler mmoItems; 18 | private final PlaceholderAPIHandler placeholderAPI; 19 | 20 | public BukkitOAAddonManager(@NonNull ADPPlugin plugin) { 21 | super(plugin); 22 | 23 | discordSRV = new DiscordSRVHandler((OreAnnouncerPlugin) plugin); 24 | essentialsChat = new EssentialsChatHandler((OreAnnouncerPlugin) plugin); 25 | itemMods = new ItemModsHandler((OreAnnouncerPlugin) plugin); 26 | mmoItems = new MMOItemsHandler((OreAnnouncerPlugin) plugin); 27 | placeholderAPI = new PlaceholderAPIHandler((OreAnnouncerPlugin) plugin); 28 | } 29 | 30 | @Override 31 | public void loadAddons() { 32 | super.loadAddons(); 33 | 34 | discordSRV.init(); 35 | essentialsChat.init(); 36 | itemMods.init(); 37 | mmoItems.init(); 38 | placeholderAPI.init(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/interfaces/OAPlayer.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.interfaces; 2 | 3 | import java.util.Set; 4 | import java.util.UUID; 5 | 6 | public interface OAPlayer { 7 | /** 8 | * Get the player {@link UUID} 9 | * 10 | * @return Returns the {@link UUID} of the player 11 | */ 12 | UUID getPlayerUUID(); 13 | 14 | /** 15 | * Get the name 16 | * 17 | * @return Returns the name of the player 18 | */ 19 | String getName(); 20 | 21 | /** 22 | * Have the player alerts messages enabled? 23 | * 24 | * @return Returns true if the player have alerts on 25 | */ 26 | boolean haveAlertsOn(); 27 | 28 | /** 29 | * Set alerts on/off 30 | * 31 | * @param alerts True to enable alerts 32 | */ 33 | void setAlertsOn(boolean alerts); 34 | 35 | /** 36 | * Is the player whitelisted? 37 | * 38 | * @return Returns true if the player is whitelisted 39 | */ 40 | boolean isWhitelisted(); 41 | 42 | /** 43 | * Add or remove the player from the whitelist 44 | * 45 | * @param whitelisted True to whitelist 46 | */ 47 | void setWhitelisted(boolean whitelisted); 48 | 49 | /** 50 | * Get block destroy stats of the player 51 | * 52 | * @param block The block 53 | * @return Returns the {@link OABlockDestroy} instance 54 | */ 55 | OABlockDestroy getBlockDestroy(OABlock block); 56 | 57 | /** 58 | * Set/update a block destroy of the player 59 | * 60 | * @param blockDestroy The {@link OABlockDestroy} to set/update 61 | */ 62 | void setBlockDestroy(OABlockDestroy blockDestroy); 63 | 64 | /** 65 | * Get all blocks destroy stats of the player 66 | * 67 | * @return Returns a set of {@link OABlockDestroy} 68 | */ 69 | Set getAllBlockDestroy(); 70 | } 71 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/addons/external/LLAPIHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.addons.external; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.configuration.Constants; 5 | import com.alessiodp.core.common.user.User; 6 | import com.alessiodp.oreannouncer.common.addons.external.hooks.LLAPIHook; 7 | import lombok.NonNull; 8 | 9 | import java.util.HashSet; 10 | import java.util.Set; 11 | import java.util.UUID; 12 | 13 | public class LLAPIHandler { 14 | private static ADPPlugin plugin; 15 | private static final String ADDON_NAME = "LastLoginAPI"; 16 | private static boolean active; 17 | private static LLAPIHook hook; 18 | 19 | public LLAPIHandler(@NonNull ADPPlugin adpPlugin) { 20 | plugin = adpPlugin; 21 | } 22 | 23 | public void init() { 24 | active = false; 25 | if (plugin.isPluginEnabled(ADDON_NAME)) { 26 | hook = new LLAPIHook(plugin); 27 | if (hook.register()) { 28 | active = true; 29 | 30 | plugin.getLoggerManager().log(String.format(Constants.DEBUG_ADDON_HOOKED, ADDON_NAME), true); 31 | } 32 | } 33 | } 34 | 35 | public static String getPlayerName(UUID uuid) { 36 | String ret; 37 | if (active) { 38 | ret = hook.getPlayerName(uuid); 39 | } else { 40 | User user = plugin.getPlayer(uuid); 41 | ret = user != null ? user.getName() : "Unknown"; 42 | } 43 | return ret; 44 | } 45 | 46 | public static Set getPlayerByName(String name) { 47 | Set ret; 48 | if (active) { 49 | ret = hook.getPlayerByName(name); 50 | } else { 51 | ret = new HashSet<>(); 52 | User user = plugin.getPlayerByName(name); 53 | if (user != null) 54 | ret.add(user.getUUID()); 55 | } 56 | 57 | return ret; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bungee/common/BungeeOreAnnouncerAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bungee.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bungee.BungeeOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IAlertEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BungeeOreAnnouncerAlertEvent extends BungeeOreAnnouncerEvent implements IAlertEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final int number; 14 | private final BlockLocation location; 15 | private final int lightLevel; 16 | private final int heightLevel; 17 | 18 | public BungeeOreAnnouncerAlertEvent(OAPlayer player, OABlock block, int number, BlockLocation location, int lightLevel, int heightLevel) { 19 | this.player = player; 20 | this.block = block; 21 | this.number = number; 22 | this.location = location; 23 | this.lightLevel = lightLevel; 24 | this.heightLevel = heightLevel; 25 | } 26 | 27 | @NotNull 28 | @Override 29 | public OAPlayer getPlayer() { 30 | return player; 31 | } 32 | 33 | @NotNull 34 | @Override 35 | public OABlock getBlock() { 36 | return block; 37 | } 38 | 39 | @Override 40 | public int getNumberOfBlocks() { 41 | return number; 42 | } 43 | 44 | @Override 45 | public BlockLocation getLocation() { 46 | return location; 47 | } 48 | 49 | @Override 50 | public int getLightLevel() { 51 | return lightLevel; 52 | } 53 | 54 | @Override 55 | public int getHeightLevel() { 56 | return heightLevel; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/utils/OreAnnouncerPermission.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.utils; 2 | 3 | import com.alessiodp.core.common.commands.utils.ADPPermission; 4 | 5 | public enum OreAnnouncerPermission implements ADPPermission { 6 | 7 | USER_ALERTS_SEE ("oreannouncer.user.alerts.see"), 8 | USER_ALERTS_SEE_SERVER ("oreannouncer.user.alerts.see.server."), 9 | USER_ALERTS_TOGGLE ("oreannouncer.user.alerts.toggle"), 10 | USER_HELP ("oreannouncer.user.help"), 11 | USER_STATS ("oreannouncer.user.stats"), 12 | USER_STATS_DESTROY ("oreannouncer.user.stats.destroy"), 13 | USER_STATS_FOUND ("oreannouncer.user.stats.found"), 14 | USER_TOP ("oreannouncer.user.top"), 15 | USER_TOP_DESTROY ("oreannouncer.user.top.destroy"), 16 | USER_TOP_FOUND ("oreannouncer.user.top.found"), 17 | 18 | ADMIN_ALERTS_SEE ("oreannouncer.admin.alerts.see"), 19 | ADMIN_ALERTS_SEE_SERVER ("oreannouncer.admin.alerts.see.server."), 20 | ADMIN_BYPASS_ALERTS ("oreannouncer.admin.bypass.alerts"), 21 | ADMIN_BYPASS_DESTROY ("oreannouncer.admin.bypass.destroy"), 22 | ADMIN_BYPASS_FOUND ("oreannouncer.admin.bypass.found"), 23 | ADMIN_BYPASS_EXECUTE_COMMANDS ("oreannouncer.admin.bypass.execute.commands"), 24 | ADMIN_DEBUG ("oreannouncer.admin.debug"), 25 | ADMIN_LOG ("oreannouncer.admin.log"), 26 | ADMIN_RELOAD ("oreannouncer.admin.reload"), 27 | ADMIN_STATS_OTHER ("oreannouncer.admin.stats.other"), 28 | ADMIN_VERSION ("oreannouncer.admin.version"), 29 | ADMIN_WARNINGS ("oreannouncer.admin.warnings"), 30 | ADMIN_WHITELIST ("oreannouncer.admin.whitelist"); 31 | 32 | private final String perm; 33 | OreAnnouncerPermission(String t) { 34 | perm = t; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return perm; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bukkit/common/BukkitOreAnnouncerAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bukkit.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bukkit.BukkitOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IAlertEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BukkitOreAnnouncerAlertEvent extends BukkitOreAnnouncerEvent implements IAlertEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final int number; 14 | private final BlockLocation location; 15 | private final int lightLevel; 16 | private final int heightLevel; 17 | 18 | public BukkitOreAnnouncerAlertEvent(OAPlayer player, OABlock block, int number, BlockLocation location, int lightLevel, int heightLevel) { 19 | super(true); 20 | this.player = player; 21 | this.block = block; 22 | this.number = number; 23 | this.location = location; 24 | this.lightLevel = lightLevel; 25 | this.heightLevel = heightLevel; 26 | } 27 | 28 | @NotNull 29 | @Override 30 | public OAPlayer getPlayer() { 31 | return player; 32 | } 33 | 34 | @NotNull 35 | @Override 36 | public OABlock getBlock() { 37 | return block; 38 | } 39 | 40 | @Override 41 | public int getNumberOfBlocks() { 42 | return number; 43 | } 44 | 45 | @Override 46 | public BlockLocation getLocation() { 47 | return location; 48 | } 49 | 50 | @Override 51 | public int getLightLevel() { 52 | return lightLevel; 53 | } 54 | 55 | @Override 56 | public int getHeightLevel() { 57 | return heightLevel; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | oreannouncer 9 | com.alessiodp.oreannouncer 10 | 2.8.5 11 | 12 | 13 | oreannouncer-api 14 | 15 | 16 | ${basedir}/target 17 | 18 | 19 | maven-compiler-plugin 20 | ${maven.compiler.version} 21 | 22 | ${maven.compiler.source} 23 | ${maven.compiler.target} 24 | 25 | 26 | 27 | org.apache.maven.plugins 28 | maven-javadoc-plugin 29 | ${maven.javadoc-plugin.version} 30 | 31 | 32 | attach-javadocs 33 | 34 | jar 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | org.jetbrains 45 | annotations 46 | ${dev.annotations} 47 | provided 48 | 49 | 50 | org.spigotmc 51 | spigot-api 52 | ${libs.api.spigot} 53 | provided 54 | 55 | 56 | net.md-5 57 | bungeecord-api 58 | ${libs.api.bungeecord} 59 | provided 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bungee/common/BungeeOreAnnouncerAdvancedAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bungee.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bungee.BungeeOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IAdvancedAlertEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BungeeOreAnnouncerAdvancedAlertEvent extends BungeeOreAnnouncerEvent implements IAdvancedAlertEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final int total; 14 | private final long elapsedTime; 15 | private final BlockLocation location; 16 | private final int lightLevel; 17 | private final int heightLevel; 18 | 19 | public BungeeOreAnnouncerAdvancedAlertEvent(OAPlayer player, OABlock block, int total, long elapsedTime, BlockLocation location, int lightLevel, int heightLevel) { 20 | this.player = player; 21 | this.block = block; 22 | this.total = total; 23 | this.elapsedTime = elapsedTime; 24 | this.location = location; 25 | this.lightLevel = lightLevel; 26 | this.heightLevel = heightLevel; 27 | } 28 | 29 | @NotNull 30 | @Override 31 | public OAPlayer getPlayer() { 32 | return player; 33 | } 34 | 35 | @NotNull 36 | @Override 37 | public OABlock getBlock() { 38 | return block; 39 | } 40 | 41 | @Override 42 | public int getTotalBlocks() { 43 | return total; 44 | } 45 | 46 | @Override 47 | public long getElapsedTime() { 48 | return elapsedTime; 49 | } 50 | 51 | @Override 52 | public BlockLocation getLocation() { 53 | return location; 54 | } 55 | 56 | @Override 57 | public int getLightLevel() { 58 | return lightLevel; 59 | } 60 | 61 | @Override 62 | public int getHeightLevel() { 63 | return heightLevel; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /api/src/main/java/com/alessiodp/oreannouncer/api/events/bukkit/common/BukkitOreAnnouncerAdvancedAlertEvent.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.api.events.bukkit.common; 2 | 3 | import com.alessiodp.oreannouncer.api.events.bukkit.BukkitOreAnnouncerEvent; 4 | import com.alessiodp.oreannouncer.api.events.common.IAdvancedAlertEvent; 5 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class BukkitOreAnnouncerAdvancedAlertEvent extends BukkitOreAnnouncerEvent implements IAdvancedAlertEvent { 11 | private final OAPlayer player; 12 | private final OABlock block; 13 | private final int total; 14 | private final long elapsedTime; 15 | private final BlockLocation location; 16 | private final int lightLevel; 17 | private final int heightLevel; 18 | 19 | public BukkitOreAnnouncerAdvancedAlertEvent(OAPlayer player, OABlock block, int total, long elapsedTime, BlockLocation location, int lightLevel, int heightLevel) { 20 | super(true); 21 | this.player = player; 22 | this.block = block; 23 | this.total = total; 24 | this.elapsedTime = elapsedTime; 25 | this.location = location; 26 | this.lightLevel = lightLevel; 27 | this.heightLevel = heightLevel; 28 | } 29 | 30 | @NotNull 31 | @Override 32 | public OAPlayer getPlayer() { 33 | return player; 34 | } 35 | 36 | @NotNull 37 | @Override 38 | public OABlock getBlock() { 39 | return block; 40 | } 41 | 42 | @Override 43 | public int getTotalBlocks() { 44 | return total; 45 | } 46 | 47 | @Override 48 | public long getElapsedTime() { 49 | return elapsedTime; 50 | } 51 | 52 | @Override 53 | public BlockLocation getLocation() { 54 | return location; 55 | } 56 | 57 | @Override 58 | public int getLightLevel() { 59 | return lightLevel; 60 | } 61 | 62 | @Override 63 | public int getHeightLevel() { 64 | return heightLevel; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/events/BukkitEventManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.events; 2 | 3 | import com.alessiodp.core.bukkit.events.BukkitEventDispatcher; 4 | import com.alessiodp.oreannouncer.api.events.bukkit.common.BukkitOreAnnouncerAdvancedAlertEvent; 5 | import com.alessiodp.oreannouncer.api.events.bukkit.common.BukkitOreAnnouncerAlertEvent; 6 | import com.alessiodp.oreannouncer.api.events.bukkit.common.BukkitOreAnnouncerBlockDestroyEvent; 7 | import com.alessiodp.oreannouncer.api.events.common.IAdvancedAlertEvent; 8 | import com.alessiodp.oreannouncer.api.events.common.IAlertEvent; 9 | import com.alessiodp.oreannouncer.api.events.common.IBlockDestroyEvent; 10 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 11 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 12 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 13 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 14 | import com.alessiodp.oreannouncer.common.events.EventManager; 15 | import lombok.NonNull; 16 | 17 | public class BukkitEventManager extends EventManager { 18 | public BukkitEventManager(@NonNull OreAnnouncerPlugin plugin) { 19 | super(plugin, new BukkitEventDispatcher(plugin)); 20 | } 21 | 22 | @Override 23 | public IAlertEvent prepareAlertEvent(OAPlayer player, OABlock block, int number, BlockLocation location, int lightLevel, int heightLevel) { 24 | return new BukkitOreAnnouncerAlertEvent(player, block, number, location, lightLevel, heightLevel); 25 | } 26 | 27 | @Override 28 | public IAdvancedAlertEvent prepareAdvancedEvent(OAPlayer player, OABlock block, int total, long elapsedTime, BlockLocation location, int lightLevel, int heightLevel) { 29 | return new BukkitOreAnnouncerAdvancedAlertEvent(player, block, total, elapsedTime, location, lightLevel, heightLevel); 30 | } 31 | 32 | @Override 33 | public IBlockDestroyEvent prepareBlockDestroyEvent(OAPlayer player, OABlock block, BlockLocation blockLocation) { 34 | return new BukkitOreAnnouncerBlockDestroyEvent(player, block, blockLocation); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/events/BungeeEventManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.events; 2 | 3 | import com.alessiodp.core.bungeecord.events.BungeeEventDispatcher; 4 | import com.alessiodp.oreannouncer.api.events.bungee.common.BungeeOreAnnouncerAdvancedAlertEvent; 5 | import com.alessiodp.oreannouncer.api.events.bungee.common.BungeeOreAnnouncerAlertEvent; 6 | import com.alessiodp.oreannouncer.api.events.bungee.common.BungeeOreAnnouncerBlockDestroyEvent; 7 | import com.alessiodp.oreannouncer.api.events.common.IAdvancedAlertEvent; 8 | import com.alessiodp.oreannouncer.api.events.common.IAlertEvent; 9 | import com.alessiodp.oreannouncer.api.events.common.IBlockDestroyEvent; 10 | import com.alessiodp.oreannouncer.api.interfaces.BlockLocation; 11 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 12 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 13 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 14 | import com.alessiodp.oreannouncer.common.events.EventManager; 15 | import lombok.NonNull; 16 | 17 | public class BungeeEventManager extends EventManager { 18 | public BungeeEventManager(@NonNull OreAnnouncerPlugin plugin) { 19 | super(plugin, new BungeeEventDispatcher(plugin)); 20 | } 21 | 22 | @Override 23 | public IAlertEvent prepareAlertEvent(OAPlayer player, OABlock block, int number, BlockLocation location, int lightLevel, int heightLevel) { 24 | return new BungeeOreAnnouncerAlertEvent(player, block, number, location, lightLevel, heightLevel); 25 | } 26 | 27 | @Override 28 | public IAdvancedAlertEvent prepareAdvancedEvent(OAPlayer player, OABlock block, int total, long elapsedTime, BlockLocation location, int lightLevel, int heightLevel) { 29 | return new BungeeOreAnnouncerAdvancedAlertEvent(player, block, total, elapsedTime, location, lightLevel, heightLevel); 30 | } 31 | 32 | @Override 33 | public IBlockDestroyEvent prepareBlockDestroyEvent(OAPlayer player, OABlock block, BlockLocation blockLocation) { 34 | return new BungeeOreAnnouncerBlockDestroyEvent(player, block, blockLocation); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/interfaces/IOADatabase.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.interfaces; 2 | 3 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 4 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockDestroy; 5 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockFound; 6 | import com.alessiodp.oreannouncer.common.blocks.objects.OABlockImpl; 7 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 8 | import com.alessiodp.oreannouncer.common.storage.OADatabaseManager; 9 | import com.alessiodp.oreannouncer.common.utils.BlocksFoundResult; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import java.util.LinkedHashMap; 13 | import java.util.List; 14 | import java.util.Set; 15 | import java.util.UUID; 16 | 17 | public interface IOADatabase { 18 | void updatePlayer(OAPlayerImpl player); 19 | OAPlayerImpl getPlayer(UUID playerUuid); 20 | 21 | void updateBlockDestroy(BlockDestroy blockDestroy); 22 | void setBlockDestroy(BlockDestroy blockDestroy); 23 | BlockDestroy getBlockDestroy(UUID player, @Nullable OABlock block); 24 | Set getAllBlockDestroy(UUID player); 25 | 26 | void insertBlockFound(BlockFound blockFound); 27 | @Nullable BlocksFoundResult getBlockFound(UUID player, @Nullable OABlock block, long rangeTime); 28 | List getLogBlocks(@Nullable OAPlayerImpl player, @Nullable OABlock block, int limit, int offset); 29 | int getLogBlocksNumber(@Nullable OAPlayerImpl player, @Nullable OABlock block); 30 | 31 | LinkedHashMap getTopPlayers(OADatabaseManager.ValueType orderBy, @Nullable OABlockImpl block, int limit, int offset); 32 | int getTopPlayersNumber(OADatabaseManager.ValueType orderBy, @Nullable OABlockImpl block); 33 | 34 | int getTopPlayerPosition(UUID player, OADatabaseManager.ValueType orderBy, @Nullable OABlockImpl block); 35 | 36 | int getTotalDestroy(@Nullable OABlock block); 37 | int getTotalFound(@Nullable OABlock block); 38 | 39 | LinkedHashMap getStatsPlayer(OADatabaseManager.ValueType valueType, UUID player); 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/configuration/OAConfigurationManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.configuration; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.configuration.ConfigurationFile; 5 | import com.alessiodp.core.common.configuration.ConfigurationManager; 6 | import com.alessiodp.core.common.storage.StorageType; 7 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 8 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 9 | import com.alessiodp.oreannouncer.common.configuration.data.Blocks; 10 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 11 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 12 | 13 | public abstract class OAConfigurationManager extends ConfigurationManager { 14 | public OAConfigurationManager(ADPPlugin plugin) { 15 | super(plugin); 16 | 17 | getConfigs().add(new Blocks((OreAnnouncerPlugin) plugin)); 18 | } 19 | 20 | @Override 21 | protected boolean isAutoUpgradeEnabled() { 22 | return false; 23 | } 24 | 25 | @Override 26 | protected void performChanges() { 27 | plugin.getDatabaseManager().setDatabaseType(StorageType.getEnum(ConfigMain.STORAGE_TYPE_DATABASE)); 28 | plugin.getLoginAlertsManager().setPermission(OreAnnouncerPermission.ADMIN_WARNINGS); 29 | checkOutdatedConfigs(Messages.OREANNOUNCER_CONFIGURATION_OUTDATED); 30 | } 31 | 32 | public Blocks getBlocks() { 33 | for (ConfigurationFile cf : getConfigs()) { 34 | if (cf instanceof Blocks) 35 | return (Blocks) cf; 36 | } 37 | throw new IllegalStateException("No Blocks configuration file found"); 38 | } 39 | 40 | public ConfigMain getConfigMain() { 41 | for (ConfigurationFile cf : getConfigs()) { 42 | if (cf instanceof ConfigMain) 43 | return (ConfigMain) cf; 44 | } 45 | throw new IllegalStateException("No ConfigMain configuration file found"); 46 | } 47 | 48 | public Messages getMessages() { 49 | for (ConfigurationFile cf : getConfigs()) { 50 | if (cf instanceof Messages) 51 | return (Messages) cf; 52 | } 53 | throw new IllegalStateException("No Messages configuration file found"); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/hooks/PAPIHook.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external.hooks; 2 | 3 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 4 | import com.alessiodp.oreannouncer.common.addons.internal.OAPlaceholder; 5 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 6 | import lombok.NonNull; 7 | import lombok.RequiredArgsConstructor; 8 | import me.clip.placeholderapi.PlaceholderAPI; 9 | import me.clip.placeholderapi.expansion.PlaceholderExpansion; 10 | import org.bukkit.OfflinePlayer; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | @RequiredArgsConstructor 16 | public class PAPIHook extends PlaceholderExpansion { 17 | @NonNull private final OreAnnouncerPlugin plugin; 18 | 19 | @Override 20 | public boolean canRegister() { 21 | return true; 22 | } 23 | 24 | @Override 25 | public String getName() { 26 | return plugin.getPluginName(); 27 | } 28 | 29 | @Override 30 | public String getIdentifier() { 31 | return "oreannouncer"; 32 | } 33 | 34 | @Override 35 | public String getAuthor() { 36 | return "AlessioDP"; 37 | } 38 | 39 | @Override 40 | public String getVersion() { 41 | return plugin.getVersion(); 42 | } 43 | 44 | @Override 45 | public boolean persist(){ 46 | return true; 47 | } 48 | 49 | @Override 50 | public List getPlaceholders() { 51 | List ret = new ArrayList<>(); 52 | for (OAPlaceholder placeholder : OAPlaceholder.values()) { 53 | ret.add("%" + getIdentifier() + "_" + placeholder.getSyntax() + "%"); 54 | } 55 | return ret; 56 | } 57 | 58 | public String parsePlaceholders(OfflinePlayer player, String msg) { 59 | return PlaceholderAPI.setPlaceholders(player, msg); 60 | } 61 | 62 | @Override 63 | public String onRequest(OfflinePlayer offlinePlayer, String identifier) { 64 | if (offlinePlayer != null) { 65 | OAPlayerImpl player = plugin.getPlayerManager().getPlayer(offlinePlayer.getUniqueId()); 66 | 67 | OAPlaceholder placeholder = OAPlaceholder.getPlaceholder(identifier); 68 | 69 | if (placeholder != null) 70 | return placeholder.formatPlaceholder(player, identifier); 71 | } 72 | return null; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/configuration/data/BukkitConfigMain.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.configuration.data; 2 | 3 | import com.alessiodp.core.common.configuration.ConfigOption; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 6 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 7 | import lombok.Getter; 8 | 9 | public class BukkitConfigMain extends ConfigMain { 10 | @Getter private final String fileName = "config.yml"; 11 | @Getter private final String resourceName = "bukkit/config.yml"; 12 | @Getter private final int latestVersion = OAConstants.VERSION_BUKKIT_CONFIG; 13 | 14 | // OreAnnouncer settings 15 | @ConfigOption(path = "oreannouncer.bungeecord.enable") 16 | public static boolean OREANNOUNCER_BUNGEECORD_ENABLE; 17 | @ConfigOption(path = "oreannouncer.bungeecord.server-name") 18 | public static String OREANNOUNCER_BUNGEECORD_SERVER_NAME; 19 | @ConfigOption(path = "oreannouncer.bungeecord.server-id") 20 | public static String OREANNOUNCER_BUNGEECORD_SERVER_ID; 21 | 22 | 23 | // Alerts settings 24 | @ConfigOption(path = "alerts.discordsrv.enable") 25 | public static boolean ALERTS_DISCORDSRV_ENABLE; 26 | @ConfigOption(path = "alerts.discordsrv.message-format") 27 | public static String ALERTS_DISCORDSRV_MESSAGE_FORMAT; 28 | @ConfigOption(path = "alerts.discordsrv.embed-avatars") 29 | public static boolean ALERTS_DISCORDSRV_EMBED_AVATARS; 30 | @ConfigOption(path = "alerts.discordsrv.channels.user") 31 | public static String ALERTS_DISCORDSRV_CHANNELS_USER; 32 | @ConfigOption(path = "alerts.discordsrv.channels.admin") 33 | public static String ALERTS_DISCORDSRV_CHANNELS_ADMIN; 34 | 35 | 36 | // Blocks settings 37 | @ConfigOption(path = "blocks.itemmods.enable") 38 | public static boolean BLOCKS_ITEMMODS_ENABLE; 39 | @ConfigOption(path = "blocks.mmoitems.enable") 40 | public static boolean BLOCKS_MMOITEMS_ENABLE; 41 | 42 | // Commands 43 | @ConfigOption(path = "commands.main-commands.oa.description") 44 | public static String COMMANDS_MAIN_OA_DESCRIPTION; 45 | 46 | 47 | public BukkitConfigMain(OreAnnouncerPlugin plugin) { 48 | super(plugin); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/sub/CommandVersion.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 5 | import com.alessiodp.core.common.commands.utils.CommandData; 6 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 7 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 8 | import com.alessiodp.oreannouncer.common.commands.utils.OASubCommand; 9 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 10 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 11 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 12 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 13 | 14 | public class CommandVersion extends OASubCommand { 15 | 16 | public CommandVersion(ADPPlugin plugin, ADPMainCommand mainCommand) { 17 | super( 18 | plugin, 19 | mainCommand, 20 | CommonCommands.VERSION, 21 | OreAnnouncerPermission.ADMIN_VERSION, 22 | ConfigMain.COMMANDS_SUB_VERSION, 23 | true 24 | ); 25 | 26 | syntax = baseSyntax(); 27 | 28 | description = Messages.HELP_CMD_DESCRIPTIONS_VERSION; 29 | help = Messages.HELP_CMD_VERSION; 30 | } 31 | 32 | @Override 33 | public String getRunCommand() { 34 | return baseSyntax(); 35 | } 36 | 37 | @Override 38 | public boolean preRequisites(CommandData commandData) { 39 | return handlePreRequisitesWithPermission(commandData); 40 | } 41 | 42 | @Override 43 | public void onCommand(CommandData commandData) { 44 | OAPlayerImpl player = ((OACommandData) commandData).getPlayer(); 45 | 46 | // Command starts 47 | String version = plugin.getVersion(); 48 | String newVersion = plugin.getAdpUpdater().getFoundVersion().isEmpty() ? version : plugin.getAdpUpdater().getFoundVersion(); 49 | String message = version.equals(newVersion) ? Messages.CMD_VERSION_UPDATED : Messages.CMD_VERSION_OUTDATED; 50 | 51 | sendMessage(commandData.getSender(), player, message 52 | .replace("%version%", version) 53 | .replace("%newversion%", newVersion) 54 | .replace("%platform%", plugin.getPlatform().getName())); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/sub/CommandReload.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 5 | import com.alessiodp.core.common.commands.utils.CommandData; 6 | import com.alessiodp.core.common.user.User; 7 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 8 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 9 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 10 | import com.alessiodp.oreannouncer.common.commands.utils.OASubCommand; 11 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 12 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 13 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 14 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 15 | 16 | public class CommandReload extends OASubCommand { 17 | 18 | public CommandReload(ADPPlugin plugin, ADPMainCommand mainCommand) { 19 | super( 20 | plugin, 21 | mainCommand, 22 | CommonCommands.RELOAD, 23 | OreAnnouncerPermission.ADMIN_RELOAD, 24 | ConfigMain.COMMANDS_SUB_RELOAD, 25 | true 26 | ); 27 | 28 | syntax = baseSyntax(); 29 | 30 | description = Messages.HELP_CMD_DESCRIPTIONS_RELOAD; 31 | help = Messages.HELP_CMD_RELOAD; 32 | } 33 | 34 | @Override 35 | public String getRunCommand() { 36 | return baseSyntax(); 37 | } 38 | 39 | @Override 40 | public boolean preRequisites(CommandData commandData) { 41 | User sender = commandData.getSender(); 42 | if (sender.isPlayer()) { 43 | // If the sender is a player 44 | OAPlayerImpl player = ((OreAnnouncerPlugin) plugin).getPlayerManager().getPlayer(sender.getUUID()); 45 | 46 | if (player != null && !sender.hasPermission(permission)) { 47 | player.sendNoPermission(permission); 48 | return false; 49 | } 50 | 51 | ((OACommandData) commandData).setPlayer(player); 52 | } 53 | return true; 54 | } 55 | 56 | @Override 57 | public void onCommand(CommandData commandData) { 58 | OAPlayerImpl player = ((OACommandData) commandData).getPlayer(); 59 | 60 | plugin.reloadConfiguration(); 61 | 62 | sendMessage(commandData.getSender(), player, Messages.OREANNOUNCER_COMMON_CONFIGRELOAD); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/EssentialsChatHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external; 2 | 3 | import com.alessiodp.core.common.configuration.Constants; 4 | import com.alessiodp.core.common.utils.Color; 5 | import com.alessiodp.core.common.utils.CommonUtils; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.addons.internal.OAPlaceholder; 8 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 9 | import lombok.NonNull; 10 | import lombok.RequiredArgsConstructor; 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.event.EventHandler; 13 | import org.bukkit.event.Listener; 14 | import org.bukkit.event.player.AsyncPlayerChatEvent; 15 | import org.bukkit.plugin.Plugin; 16 | 17 | import java.util.regex.Matcher; 18 | import java.util.regex.Pattern; 19 | 20 | @RequiredArgsConstructor 21 | public class EssentialsChatHandler implements Listener { 22 | @NonNull private final OreAnnouncerPlugin plugin; 23 | private static final String ADDON_NAME = "EssentialsChat"; 24 | private final Pattern PATTERN = Pattern.compile("\\{oreannouncer_([a-z_]+)}", Pattern.CASE_INSENSITIVE); 25 | 26 | public void init() { 27 | if (Bukkit.getPluginManager().getPlugin(ADDON_NAME) != null) { 28 | ((Plugin) plugin.getBootstrap()).getServer().getPluginManager().registerEvents(this, ((Plugin) plugin.getBootstrap())); 29 | 30 | plugin.getLoggerManager().log(String.format(Constants.DEBUG_ADDON_HOOKED, ADDON_NAME), true); 31 | } 32 | } 33 | 34 | 35 | @EventHandler 36 | public void onChatPlayer(AsyncPlayerChatEvent event) { 37 | String old = event.getFormat(); 38 | if (CommonUtils.toLowerCase(old).contains("{oreannouncer_")) { 39 | // Bypass useless checks if this isn't an OreAnnouncer placeholder 40 | boolean somethingChanged = false; 41 | OAPlayerImpl player = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); 42 | 43 | Matcher mat = PATTERN.matcher(old); 44 | while (mat.find()) { 45 | String base = mat.group(0); 46 | String identifier = mat.group(1); 47 | if (identifier != null) { 48 | OAPlaceholder placeholder = OAPlaceholder.getPlaceholder(identifier); 49 | if (placeholder != null) { 50 | old = old.replace(base, Color.translateAlternateColorCodes(placeholder.formatPlaceholder(player, identifier))); 51 | somethingChanged = true; 52 | } 53 | } 54 | } 55 | 56 | if(somethingChanged) 57 | event.setFormat(old); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/sub/CommandHelp.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.list.ADPCommand; 5 | import com.alessiodp.core.common.commands.utils.ADPExecutableCommand; 6 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 7 | import com.alessiodp.core.common.commands.utils.CommandData; 8 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 9 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 10 | import com.alessiodp.oreannouncer.common.commands.utils.OASubCommand; 11 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 12 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 13 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 14 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 15 | 16 | import java.util.Map; 17 | import java.util.Set; 18 | 19 | public class CommandHelp extends OASubCommand { 20 | 21 | public CommandHelp(ADPPlugin plugin, ADPMainCommand mainCommand) { 22 | super( 23 | plugin, 24 | mainCommand, 25 | CommonCommands.HELP, 26 | OreAnnouncerPermission.USER_HELP, 27 | ConfigMain.COMMANDS_SUB_HELP, 28 | false 29 | ); 30 | 31 | syntax = baseSyntax(); 32 | 33 | description = Messages.HELP_CMD_DESCRIPTIONS_HELP; 34 | help = Messages.HELP_CMD_HELP; 35 | } 36 | 37 | @Override 38 | public boolean preRequisites(CommandData commandData) { 39 | return handlePreRequisitesWithPermission(commandData); 40 | } 41 | 42 | @Override 43 | public void onCommand(CommandData commandData) { 44 | OAPlayerImpl player = ((OACommandData) commandData).getPlayer(); 45 | 46 | // Command starts 47 | player.sendMessage(Messages.HELP_HEADER); 48 | 49 | Set allowedCommands = player.getAllowedCommands(); 50 | for(Map.Entry e : plugin.getCommandManager().getOrderedCommands().entrySet()) { 51 | if (allowedCommands.contains(e.getKey()) && e.getValue().isListedInHelp()) { 52 | player.sendMessage(e.getValue().getHelp() 53 | .replace("%syntax%", e.getValue().getSyntaxForUser(commandData.getSender())) 54 | .replace("%description%", e.getValue().getDescription()) 55 | .replace("%run_command%", e.getValue().getRunCommand()) 56 | .replace("%perform_command%", Messages.HELP_PERFORM_COMMAND)); 57 | } 58 | } 59 | 60 | player.sendMessage(Messages.HELP_FOOTER); 61 | } 62 | } -------------------------------------------------------------------------------- /bungeecord/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | oreannouncer 9 | com.alessiodp.oreannouncer 10 | 2.8.5 11 | 12 | 13 | oreannouncer-bungeecord 14 | 15 | 16 | install 17 | 18 | 19 | . 20 | true 21 | ${basedir}/src/main/resources/ 22 | 23 | **/*.yml 24 | 25 | 26 | 27 | 28 | 29 | maven-compiler-plugin 30 | ${maven.compiler.version} 31 | 32 | ${maven.compiler.source} 33 | ${maven.compiler.target} 34 | 35 | 36 | 37 | org.apache.maven.plugins 38 | maven-shade-plugin 39 | ${maven.shade.version} 40 | 41 | 42 | 43 | com.alessiodp.oreannouncer:oreannouncer-bungeecord 44 | com.alessiodp.core:core-bungeecord 45 | 46 | 47 | 48 | 49 | *:* 50 | 51 | META-INF/MANIFEST.MF 52 | 53 | 54 | 55 | 56 | 57 | 58 | package 59 | 60 | shade 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | com.alessiodp.core 71 | core-bungeecord 72 | ${libs.adpcore} 73 | compile 74 | 75 | 76 | com.alessiodp.oreannouncer 77 | oreannouncer-common 78 | ${project.version} 79 | compile 80 | 81 | 82 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/utils/OASubCommand.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.utils; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.list.ADPCommand; 5 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 6 | import com.alessiodp.core.common.commands.utils.ADPPermission; 7 | import com.alessiodp.core.common.commands.utils.ADPSubCommand; 8 | import com.alessiodp.core.common.commands.utils.CommandData; 9 | import com.alessiodp.core.common.user.User; 10 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 11 | import com.alessiodp.oreannouncer.common.addons.external.LLAPIHandler; 12 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 13 | import lombok.NonNull; 14 | 15 | import java.util.Set; 16 | import java.util.UUID; 17 | 18 | public abstract class OASubCommand extends ADPSubCommand { 19 | public OASubCommand(@NonNull ADPPlugin plugin, @NonNull ADPMainCommand mainCommand, @NonNull ADPCommand command, @NonNull ADPPermission permission, @NonNull String commandName, boolean executableByConsole) { 20 | super(plugin, mainCommand, command, permission, commandName, executableByConsole); 21 | } 22 | 23 | public void sendMessage(User receiver, OAPlayerImpl playerReceiver, String message) { 24 | if (receiver.isPlayer()) 25 | playerReceiver.sendMessage(message); 26 | else 27 | receiver.sendMessage(message, true); 28 | } 29 | 30 | public OAPlayerImpl playerLookup(String playerName) { 31 | OAPlayerImpl ret = null; 32 | User targetUser = plugin.getPlayerByName(playerName); 33 | if (targetUser != null) { 34 | ret = ((OreAnnouncerPlugin) plugin).getPlayerManager().getPlayer(targetUser.getUUID()); 35 | } else { 36 | Set targetPlayersUuid = LLAPIHandler.getPlayerByName(playerName); 37 | if (targetPlayersUuid.size() > 0) { 38 | ret = ((OreAnnouncerPlugin) plugin).getPlayerManager().getPlayer(targetPlayersUuid.iterator().next()); 39 | } 40 | } 41 | return ret; 42 | } 43 | 44 | protected boolean handlePreRequisitesWithPermission(CommandData commandData) { 45 | User sender = commandData.getSender(); 46 | if (sender.isPlayer()) { 47 | OAPlayerImpl player = ((OreAnnouncerPlugin) plugin).getPlayerManager().getPlayer(sender.getUUID()); 48 | 49 | // Checks for command prerequisites 50 | if (!sender.hasPermission(permission)) { 51 | player.sendNoPermission(permission); 52 | return false; 53 | } 54 | 55 | ((OACommandData) commandData).setPlayer(player); 56 | } 57 | return true; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/sub/CommandAlerts.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 5 | import com.alessiodp.core.common.commands.utils.CommandData; 6 | import com.alessiodp.core.common.user.User; 7 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 8 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 9 | import com.alessiodp.oreannouncer.common.commands.utils.OASubCommand; 10 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 11 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 12 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 13 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 14 | import lombok.NonNull; 15 | 16 | import java.util.List; 17 | 18 | public class CommandAlerts extends OASubCommand { 19 | 20 | public CommandAlerts(ADPPlugin plugin, ADPMainCommand mainCommand) { 21 | super( 22 | plugin, 23 | mainCommand, 24 | CommonCommands.ALERTS, 25 | OreAnnouncerPermission.USER_ALERTS_TOGGLE, 26 | ConfigMain.COMMANDS_SUB_ALERTS, 27 | false 28 | ); 29 | 30 | syntax = String.format("%s [%s/%s]", 31 | baseSyntax(), 32 | ConfigMain.COMMANDS_MISC_ON, 33 | ConfigMain.COMMANDS_MISC_OFF 34 | ); 35 | 36 | description = Messages.HELP_CMD_DESCRIPTIONS_ALERTS; 37 | help = Messages.HELP_CMD_ALERTS; 38 | } 39 | 40 | @Override 41 | public boolean preRequisites(CommandData commandData) { 42 | return handlePreRequisitesWithPermission(commandData); 43 | } 44 | 45 | @Override 46 | public void onCommand(CommandData commandData) { 47 | OAPlayerImpl player = ((OACommandData) commandData).getPlayer(); 48 | 49 | // Command handling 50 | Boolean alerts = plugin.getCommandManager().getCommandUtils().handleOnOffCommand(player.haveAlertsOn(), commandData.getArgs()); 51 | if (alerts == null) { 52 | player.sendMessage(Messages.OREANNOUNCER_SYNTAX_WRONGMESSAGE 53 | .replace("%syntax%", syntax)); 54 | return; 55 | } 56 | 57 | // Command starts 58 | player.setAlertsOn(alerts); 59 | 60 | if (alerts) { 61 | player.sendMessage(Messages.CMD_ALERTS_TOGGLEON); 62 | } else { 63 | player.sendMessage(Messages.CMD_ALERTS_TOGGLEOFF); 64 | } 65 | } 66 | 67 | @Override 68 | public List onTabComplete(@NonNull User sender, String[] args) { 69 | return plugin.getCommandManager().getCommandUtils().tabCompleteOnOff(args); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/MMOItemsHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external; 2 | 3 | import com.alessiodp.core.common.configuration.Constants; 4 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import lombok.RequiredArgsConstructor; 7 | import net.Indyuce.mmoitems.MMOItems; 8 | import net.Indyuce.mmoitems.api.block.CustomBlock; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.block.Block; 11 | import org.bukkit.inventory.ItemStack; 12 | 13 | import java.util.Optional; 14 | 15 | @RequiredArgsConstructor 16 | public class MMOItemsHandler { 17 | private final OreAnnouncerPlugin plugin; 18 | private static final String ADDON_NAME = "MMOItems"; 19 | private static boolean active; 20 | private static MMOItems mmoItems; 21 | 22 | public void init() { 23 | active = false; 24 | if (BukkitConfigMain.BLOCKS_MMOITEMS_ENABLE 25 | && Bukkit.getPluginManager().isPluginEnabled(ADDON_NAME)) { 26 | mmoItems = MMOItems.plugin; 27 | if (mmoItems != null) { 28 | active = true; 29 | 30 | plugin.getLoggerManager().log(String.format(Constants.DEBUG_ADDON_HOOKED, ADDON_NAME), true); 31 | } 32 | } 33 | } 34 | 35 | public static boolean isPluginBlock(Block block) { 36 | return active && mmoItems.getCustomBlocks().getFromBlock(block.getBlockData()).isPresent(); 37 | } 38 | 39 | public static boolean isPluginItemStack(ItemStack itemStack) { 40 | return active && mmoItems.getCustomBlocks().getAll().stream().anyMatch(customBlock -> customBlock.getItem() != null && customBlock.getItem().equals(itemStack)); 41 | } 42 | 43 | public static String getNameByBlock(Block block) { 44 | if (active) { 45 | Optional opt = mmoItems.getCustomBlocks().getFromBlock(block.getBlockData()); 46 | if (opt.isPresent()) 47 | return "MMOITEMS_" + opt.get().getId(); 48 | } 49 | return ""; 50 | } 51 | 52 | public static String getNameByItemStack(ItemStack itemStack) { 53 | if (active) { 54 | Optional opt = mmoItems.getCustomBlocks().getAll().stream().filter(customBlock -> customBlock.getItem() != null && customBlock.getItem().equals(itemStack)).findAny(); 55 | if (opt.isPresent()) 56 | return "MMOITEMS_" + opt.get().getId(); 57 | } 58 | return ""; 59 | } 60 | 61 | public static ItemStack getItemStackByName(String materialName) { 62 | try { 63 | int id = Integer.parseInt(materialName.substring(9)); 64 | return mmoItems.getCustomBlocks().getBlock(id).getItem(); 65 | } catch (NumberFormatException | NullPointerException ignored) {} 66 | return null; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/messaging/BungeeOAMessageDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.messaging; 2 | 3 | import com.alessiodp.core.bungeecord.messaging.BungeeMessageDispatcher; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.core.common.messaging.MessageChannel; 6 | import com.alessiodp.oreannouncer.bungeecord.messaging.bungee.BungeeOABungeecordDispatcher; 7 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockData; 8 | import com.alessiodp.oreannouncer.common.messaging.OAMessageDispatcher; 9 | import com.alessiodp.oreannouncer.common.messaging.OAPacket; 10 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 11 | import lombok.NonNull; 12 | import org.jetbrains.annotations.NotNull; 13 | 14 | public class BungeeOAMessageDispatcher extends BungeeMessageDispatcher implements OAMessageDispatcher { 15 | public BungeeOAMessageDispatcher(@NonNull ADPPlugin plugin) { 16 | super( 17 | plugin, 18 | new BungeeOABungeecordDispatcher(plugin), 19 | null 20 | ); 21 | } 22 | 23 | private void sendPacketToBungeecord(@NotNull OAPacket packet) { 24 | bungeeDispatcher.sendPacket(packet, MessageChannel.SUB); 25 | } 26 | 27 | @Override 28 | public void sendUpdatePlayer(OAPlayerImpl player) { 29 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.UPDATE_PLAYER) 30 | .setPlayerUuid(player.getPlayerUUID())); 31 | } 32 | 33 | @Override 34 | public void sendAlert(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 35 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT) 36 | .setData(blockData) 37 | .setMessages(messageUser, messageAdmin, messageConsole)); 38 | } 39 | 40 | @Override 41 | public void sendAlertCount(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 42 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT_COUNT) 43 | .setData(blockData) 44 | .setMessages(messageUser, messageAdmin, messageConsole)); 45 | } 46 | 47 | @Override 48 | public void sendAlertTNT(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 49 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT_TNT) 50 | .setData(blockData) 51 | .setMessages(messageUser, messageAdmin, messageConsole)); 52 | } 53 | 54 | @Override 55 | public void sendBlockDestroy(BlockData blockData) { 56 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.DESTROY) 57 | .setData(blockData)); 58 | } 59 | 60 | @Override 61 | public void sendBlockFound(BlockData blockData) { 62 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.FOUND) 63 | .setData(blockData)); 64 | } 65 | 66 | private OAPacket makePacket(OAPacket.PacketType type) { 67 | return (OAPacket) new OAPacket() 68 | .setVersion(plugin.getVersion()) 69 | .setType(type); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/messaging/OAPacket.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.messaging; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.configuration.Constants; 5 | import com.alessiodp.core.common.messaging.ADPPacket; 6 | import com.alessiodp.core.common.utils.ADPLocation; 7 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockData; 8 | import lombok.AllArgsConstructor; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.Getter; 11 | import lombok.ToString; 12 | 13 | import java.io.ByteArrayInputStream; 14 | import java.io.ObjectInput; 15 | import java.io.ObjectInputStream; 16 | import java.io.Serializable; 17 | import java.util.UUID; 18 | 19 | @EqualsAndHashCode(callSuper = true) 20 | @ToString 21 | public class OAPacket extends ADPPacket { 22 | // Common 23 | @Getter private String source; 24 | 25 | @Getter private UUID playerUuid; 26 | @Getter private Data data; 27 | @Getter private Messages messages; 28 | 29 | public static OAPacket read(ADPPlugin plugin, byte[] bytes) { 30 | OAPacket ret = null; 31 | 32 | try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes)) { 33 | ObjectInput in = new ObjectInputStream(bis); 34 | ret = (OAPacket) in.readObject(); 35 | } catch (Exception ex) { 36 | plugin.getLoggerManager().logError(String.format(Constants.DEBUG_LOG_MESSAGING_FAILED_READ, ex.getMessage())); 37 | } 38 | return ret; 39 | } 40 | 41 | public OAPacket setSource(String source) { 42 | this.source = source; 43 | return this; 44 | } 45 | 46 | public OAPacket setPlayerUuid(UUID playerUuid) { 47 | this.playerUuid = playerUuid; 48 | return this; 49 | } 50 | 51 | public OAPacket setData(BlockData blockData) { 52 | this.data = new Data( 53 | blockData.getPlayer().getPlayerUUID(), 54 | blockData.getBlock().getMaterialName(), 55 | blockData.getNumber(), 56 | blockData.getLocation(), 57 | blockData.getLightLevel(), 58 | (int) blockData.getLocation().getY() 59 | ); 60 | return this; 61 | } 62 | 63 | public OAPacket setDataRaw(Data data) { 64 | this.data = data; 65 | return this; 66 | } 67 | 68 | public OAPacket setMessages(String user, String admin, String console) { 69 | this.messages = new Messages(user, admin, console); 70 | return this; 71 | } 72 | 73 | public enum PacketType { 74 | UPDATE_PLAYER, ALERT, ALERT_TNT, ALERT_COUNT, DESTROY, FOUND 75 | } 76 | 77 | @EqualsAndHashCode 78 | @ToString 79 | @AllArgsConstructor 80 | public static class Data implements Serializable { 81 | @Getter UUID player; 82 | @Getter String block; 83 | @Getter int number; 84 | @Getter ADPLocation location; 85 | @Getter int lightLevel; 86 | @Getter int heightLevel; 87 | } 88 | 89 | @EqualsAndHashCode 90 | @ToString 91 | @AllArgsConstructor 92 | public static class Messages implements Serializable { 93 | @Getter String user; 94 | @Getter String admin; 95 | @Getter String console; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/messaging/BukkitOAMessageDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.messaging; 2 | 3 | import com.alessiodp.core.bukkit.messaging.BukkitMessageDispatcher; 4 | import com.alessiodp.core.common.ADPPlugin; 5 | import com.alessiodp.core.common.messaging.MessageChannel; 6 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 7 | import com.alessiodp.oreannouncer.bukkit.messaging.bungee.BukkitOABungeecordDispatcher; 8 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockData; 9 | import com.alessiodp.oreannouncer.common.messaging.OAMessageDispatcher; 10 | import com.alessiodp.oreannouncer.common.messaging.OAPacket; 11 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 12 | import lombok.NonNull; 13 | import org.jetbrains.annotations.NotNull; 14 | 15 | 16 | public class BukkitOAMessageDispatcher extends BukkitMessageDispatcher implements OAMessageDispatcher { 17 | public BukkitOAMessageDispatcher(@NonNull ADPPlugin plugin) { 18 | super(plugin, new BukkitOABungeecordDispatcher(plugin)); 19 | } 20 | 21 | private void sendPacketToBungeecord(@NotNull OAPacket packet) { 22 | bungeeDispatcher.sendPacket(packet.setSource(BukkitConfigMain.OREANNOUNCER_BUNGEECORD_SERVER_ID), MessageChannel.MAIN); 23 | } 24 | 25 | @Override 26 | public void sendUpdatePlayer(OAPlayerImpl player) { 27 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.UPDATE_PLAYER) 28 | .setPlayerUuid(player.getPlayerUUID())); 29 | } 30 | 31 | @Override 32 | public void sendAlert(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 33 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT) 34 | .setData(blockData) 35 | .setMessages(messageUser, messageAdmin, messageConsole)); 36 | } 37 | 38 | @Override 39 | public void sendAlertCount(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 40 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT_COUNT) 41 | .setData(blockData) 42 | .setMessages(messageUser, messageAdmin, messageConsole)); 43 | } 44 | 45 | @Override 46 | public void sendAlertTNT(BlockData blockData, String messageUser, String messageAdmin, String messageConsole) { 47 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.ALERT_TNT) 48 | .setData(blockData) 49 | .setMessages(messageUser, messageAdmin, messageConsole)); 50 | } 51 | 52 | @Override 53 | public void sendBlockDestroy(BlockData blockData) { 54 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.DESTROY) 55 | .setData(blockData)); 56 | } 57 | 58 | @Override 59 | public void sendBlockFound(BlockData blockData) { 60 | sendPacketToBungeecord(makePacket(OAPacket.PacketType.FOUND) 61 | .setData(blockData)); 62 | } 63 | 64 | private OAPacket makePacket(OAPacket.PacketType type) { 65 | return (OAPacket) new OAPacket() 66 | .setVersion(plugin.getVersion()) 67 | .setType(type); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /bungeecord/src/main/java/com/alessiodp/oreannouncer/bungeecord/BungeeOreAnnouncerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord; 2 | 3 | import com.alessiodp.core.bungeecord.addons.internal.BungeeJsonHandler; 4 | import com.alessiodp.core.bungeecord.scheduling.ADPBungeeScheduler; 5 | import com.alessiodp.core.common.bootstrap.ADPBootstrap; 6 | import com.alessiodp.core.common.configuration.Constants; 7 | import com.alessiodp.oreannouncer.bungeecord.addons.BungeeOAAddonManager; 8 | import com.alessiodp.oreannouncer.bungeecord.addons.external.BungeeMetricsHandler; 9 | import com.alessiodp.oreannouncer.bungeecord.blocks.BungeeBlockManager; 10 | import com.alessiodp.oreannouncer.bungeecord.commands.BungeeOACommandManager; 11 | import com.alessiodp.oreannouncer.bungeecord.configuration.BungeeOAConfigurationManager; 12 | import com.alessiodp.oreannouncer.bungeecord.events.BungeeEventManager; 13 | import com.alessiodp.oreannouncer.bungeecord.listeners.BungeeJoinLeaveListener; 14 | import com.alessiodp.oreannouncer.bungeecord.messaging.BungeeOAMessenger; 15 | import com.alessiodp.oreannouncer.bungeecord.players.BungeePlayerManager; 16 | import com.alessiodp.oreannouncer.bungeecord.utils.BungeeMessageUtils; 17 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 18 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 19 | import lombok.Getter; 20 | import net.md_5.bungee.api.plugin.Plugin; 21 | import net.md_5.bungee.api.plugin.PluginManager; 22 | 23 | public class BungeeOreAnnouncerPlugin extends OreAnnouncerPlugin { 24 | @Getter private final int bstatsId = OAConstants.PLUGIN_BSTATS_BUNGEE_ID; 25 | 26 | public BungeeOreAnnouncerPlugin(ADPBootstrap bootstrap) { 27 | super(bootstrap); 28 | } 29 | 30 | @Override 31 | protected void initializeCore() { 32 | scheduler = new ADPBungeeScheduler(this); 33 | configurationManager = new BungeeOAConfigurationManager(this); 34 | messageUtils = new BungeeMessageUtils(this); 35 | messenger = new BungeeOAMessenger(this); 36 | 37 | super.initializeCore(); 38 | } 39 | 40 | @Override 41 | protected void loadCore() { 42 | blockManager = new BungeeBlockManager(this); 43 | playerManager = new BungeePlayerManager(this); 44 | commandManager = new BungeeOACommandManager(this); 45 | 46 | super.loadCore(); 47 | } 48 | 49 | @Override 50 | protected void postHandle() { 51 | addonManager = new BungeeOAAddonManager(this); 52 | eventManager = new BungeeEventManager(this); 53 | 54 | super.postHandle(); 55 | 56 | new BungeeMetricsHandler(this); 57 | } 58 | 59 | @Override 60 | protected void initializeJsonHandler() { 61 | jsonHandler = new BungeeJsonHandler(this); 62 | } 63 | 64 | @Override 65 | protected void registerListeners() { 66 | getLoggerManager().logDebug(Constants.DEBUG_PLUGIN_REGISTERING, true); 67 | Plugin plugin = (Plugin) getBootstrap(); 68 | PluginManager pm = plugin.getProxy().getPluginManager(); 69 | pm.registerListener(plugin, new BungeeJoinLeaveListener(this)); 70 | } 71 | 72 | @Override 73 | public boolean isBungeeCordEnabled() { 74 | return false; 75 | } 76 | 77 | @Override 78 | public String getServerName() { 79 | return ""; 80 | } 81 | 82 | @Override 83 | public String getServerId() { 84 | return ""; 85 | } 86 | } 87 | 88 | -------------------------------------------------------------------------------- /bukkit/src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: ${plugin.name} 2 | description: ${plugin.description} 3 | author: ${plugin.author} 4 | website: ${plugin.website} 5 | version: ${plugin.version} 6 | main: com.alessiodp.oreannouncer.bukkit.bootstrap.BukkitOreAnnouncerBootstrap 7 | api-version: 1.13 8 | softdepend: [DiscordSRV, ItemMods, LastLoginAPI, MMOItems, PlaceholderAPI] 9 | permissions: 10 | oreannouncer.user.alerts.see: 11 | description: See user alerts 12 | oreannouncer.user.alerts.toggle: 13 | description: Allow access to /oa alerts 14 | oreannouncer.user.help: 15 | description: Allow access to /oa help 16 | oreannouncer.user.stats: 17 | description: Allow access to /oa stats 18 | oreannouncer.user.stats.destroy: 19 | description: Allow access to only /oa stats with destroy type 20 | default: false 21 | oreannouncer.user.stats.found: 22 | description: Allow access to only /oa stats with found type 23 | default: false 24 | oreannouncer.user.top: 25 | description: Allow access to /oa top 26 | oreannouncer.user.top.destroy: 27 | description: Allow access to only /oa top with destroy order 28 | default: false 29 | oreannouncer.user.top.found: 30 | description: Allow access to only /oa top with found order 31 | default: false 32 | oreannouncer.admin.alerts.see: 33 | description: See admin alerts 34 | oreannouncer.admin.bypass.alerts: 35 | description: Bypass alerts on block destroy 36 | oreannouncer.admin.bypass.destroy: 37 | description: Bypass destroy count on block destroy 38 | oreannouncer.admin.bypass.found: 39 | description: Bypass found count on block destroy 40 | oreannouncer.admin.bypass.execute.commands: 41 | description: Bypass command execution 42 | oreannouncer.admin.debug: 43 | description: Allow access to /oa debug 44 | oreannouncer.admin.log: 45 | description: Allow access to /oa log 46 | oreannouncer.admin.reload: 47 | description: Allow access to /oa reload 48 | oreannouncer.admin.stats.other: 49 | description: Allow access to /oa stats on other players 50 | oreannouncer.admin.version: 51 | description: Allow access to /oa version 52 | oreannouncer.admin.warnings: 53 | description: Send an alert if there is an error 54 | oreannouncer.admin.whitelist: 55 | description: Allow access to /oa whitelist 56 | 57 | oreannouncer.user.*: 58 | default: op 59 | description: All user permissions 60 | children: 61 | oreannouncer.user.alerts.see: true 62 | oreannouncer.user.alerts.toggle: true 63 | oreannouncer.user.help: true 64 | oreannouncer.user.stats: true 65 | oreannouncer.user.top: true 66 | oreannouncer.admin.*: 67 | default: op 68 | description: All admin permissions 69 | children: 70 | oreannouncer.user.*: true 71 | oreannouncer.admin.alerts.see: true 72 | oreannouncer.admin.bypass.alerts: true 73 | oreannouncer.admin.bypass.destroy: true 74 | oreannouncer.admin.bypass.found: true 75 | oreannouncer.admin.bypass.execute.commands: true 76 | oreannouncer.admin.debug: true 77 | oreannouncer.admin.log: true 78 | oreannouncer.admin.reload: true 79 | oreannouncer.admin.stats.other: true 80 | oreannouncer.admin.version: true 81 | oreannouncer.admin.warnings: true 82 | oreannouncer.admin.whitelist: true -------------------------------------------------------------------------------- /common/src/test/java/com/alessiodp/oreannouncer/common/messaging/OAPacketTest.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.messaging; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import org.junit.jupiter.api.BeforeAll; 6 | import org.junit.jupiter.api.Test; 7 | 8 | import java.io.IOException; 9 | import java.util.UUID; 10 | 11 | import static org.junit.jupiter.api.Assertions.assertEquals; 12 | import static org.junit.jupiter.api.Assertions.assertNotEquals; 13 | import static org.junit.jupiter.api.Assertions.assertNotNull; 14 | import static org.mockito.Mockito.mock; 15 | import static org.mockito.Mockito.when; 16 | 17 | public class OAPacketTest { 18 | private static final OreAnnouncerPlugin mockPlugin = mock(OreAnnouncerPlugin.class); 19 | private static final String VERSION = "1"; 20 | 21 | @BeforeAll 22 | public static void setUp() { 23 | when(mockPlugin.getVersion()).thenReturn(VERSION); 24 | } 25 | 26 | @Test 27 | public void testBuildBasic() throws IOException { 28 | makePacket() 29 | .setType(OAPacket.PacketType.values()[0]) 30 | .build(); 31 | } 32 | 33 | @Test 34 | public void testBuildAdvanced() throws IOException { 35 | byte[] raw = ((OAPacket) makePacket() 36 | .setType(OAPacket.PacketType.values()[0])) 37 | .setDataRaw(new OAPacket.Data( 38 | UUID.randomUUID(), 39 | "material", 40 | 1, 41 | new ADPLocation("world", 0, 0, 0, 0, 0), 42 | 1, 43 | 0 44 | )) 45 | .build(); 46 | assertNotNull(raw); 47 | } 48 | 49 | @Test 50 | public void testReadBasic() throws IOException { 51 | OAPacket packet = (OAPacket) makePacket() 52 | .setType(OAPacket.PacketType.values()[0]); 53 | 54 | OAPacket newPacket = OAPacket.read(mockPlugin, packet.build()); 55 | 56 | assertEquals(packet, newPacket); 57 | } 58 | 59 | @Test 60 | public void testReadBasicFail() throws IOException { 61 | OAPacket packet = (OAPacket) makePacket() 62 | .setType(OAPacket.PacketType.values()[0]); 63 | 64 | OAPacket newPacket = OAPacket.read(mockPlugin, packet.build()); 65 | packet = packet.setSource("different"); 66 | assertNotEquals(packet, newPacket); 67 | } 68 | 69 | @Test 70 | public void testReadAdvanced() throws IOException { 71 | OAPacket packet = ((OAPacket) makePacket() 72 | .setType(OAPacket.PacketType.values()[0])) 73 | .setDataRaw(new OAPacket.Data( 74 | UUID.randomUUID(), 75 | "material", 76 | 1, 77 | new ADPLocation("world", 0, 0, 0, 0, 0), 78 | 1, 79 | 0 80 | )); 81 | 82 | OAPacket newPacket = OAPacket.read(mockPlugin, packet.build()); 83 | 84 | assertEquals(packet, newPacket); 85 | } 86 | 87 | @Test 88 | public void testReadAdvancedFail() throws IOException { 89 | OAPacket packet = ((OAPacket) makePacket() 90 | .setType(OAPacket.PacketType.values()[0])) 91 | .setDataRaw(new OAPacket.Data( 92 | UUID.randomUUID(), 93 | "material", 94 | 1, 95 | new ADPLocation("world", 0, 0, 0, 0, 0), 96 | 1, 97 | 0 98 | )); 99 | 100 | OAPacket newPacket = OAPacket.read(mockPlugin, packet.build()); 101 | 102 | packet.setSource("another"); 103 | 104 | assertNotEquals(packet, newPacket); 105 | } 106 | 107 | private OAPacket makePacket() { 108 | return (OAPacket) new OAPacket().setVersion(VERSION); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /bukkit/src/test/java/com/alessiodp/oreannouncer/bukkit/configuration/BukkitConfigurationTest.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.configuration; 2 | 3 | import com.alessiodp.core.common.addons.external.simpleyaml.configuration.file.YamlFile; 4 | import com.alessiodp.core.common.configuration.ConfigOption; 5 | import com.alessiodp.core.common.configuration.ConfigurationFile; 6 | import com.alessiodp.core.common.logging.logger.ADPLogger; 7 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 8 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitMessages; 9 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 10 | import org.junit.jupiter.api.BeforeAll; 11 | import org.junit.jupiter.api.Test; 12 | import org.junit.jupiter.api.io.TempDir; 13 | 14 | import java.lang.reflect.Field; 15 | import java.nio.file.Path; 16 | import java.util.Collections; 17 | import java.util.List; 18 | 19 | import static org.junit.jupiter.api.Assertions.assertNotNull; 20 | import static org.mockito.ArgumentMatchers.anyString; 21 | import static org.mockito.Mockito.doAnswer; 22 | import static org.mockito.Mockito.mock; 23 | import static org.mockito.Mockito.when; 24 | 25 | public class BukkitConfigurationTest { 26 | private static final OreAnnouncerPlugin mockPlugin = mock(OreAnnouncerPlugin.class); 27 | 28 | @BeforeAll 29 | public static void setUp() { 30 | ADPLogger testLogger = mock(ADPLogger.class); 31 | doAnswer((params) -> { 32 | //System.out.println((String) params.getArgument(0)); 33 | return null; 34 | }).when(testLogger).info(anyString()); 35 | doAnswer((params) -> { 36 | System.err.println((String) params.getArgument(0)); 37 | return null; 38 | }).when(testLogger).error(anyString()); 39 | when(mockPlugin.getLogger()).thenReturn(testLogger); 40 | 41 | when(mockPlugin.getResource(anyString())).thenAnswer((a) -> ClassLoader.getSystemResourceAsStream(a.getArgument(0))); 42 | } 43 | 44 | @Test 45 | public void testConfigMain(@TempDir Path tempDir) throws IllegalAccessException { 46 | BukkitConfigMain configMain = new BukkitConfigMain(mockPlugin); 47 | 48 | List skipPaths = Collections.emptyList(); 49 | 50 | testConfiguration(configMain, skipPaths, tempDir); 51 | } 52 | 53 | @Test 54 | public void testMessages(@TempDir Path tempDir) throws IllegalAccessException { 55 | BukkitMessages messages = new BukkitMessages(mockPlugin); 56 | 57 | List skipPaths = Collections.emptyList(); 58 | 59 | testConfiguration(messages, skipPaths, tempDir); 60 | } 61 | 62 | private void testConfiguration(ConfigurationFile configurationFile, List skipPaths, Path tempDir) throws IllegalAccessException { 63 | Field[] fields = configurationFile.getClass().getFields(); 64 | 65 | // Initialize YAML 66 | configurationFile.initializeConfiguration(tempDir); 67 | YamlFile yf = configurationFile.getConfiguration(); 68 | 69 | // Check fields 70 | for (Field f : fields) { 71 | ConfigOption co = f.getAnnotation(ConfigOption.class); 72 | if (co != null && !skippablePath(co.path(), skipPaths)) { 73 | Object value = yf.get(co.path()); 74 | assertNotNull(value, "The " + configurationFile.getClass().getSimpleName() + " path '" + co.path() + "' is null."); 75 | f.set(null, value); 76 | } 77 | } 78 | } 79 | 80 | private boolean skippablePath(String path, List skipPaths) { 81 | for (String sp : skipPaths) { 82 | if (path.startsWith(sp)) 83 | return true; 84 | } 85 | return false; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/addons/external/hooks/DiscordSRVHook.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.addons.external.hooks; 2 | 3 | import com.alessiodp.core.common.configuration.Constants; 4 | import com.alessiodp.core.common.utils.CommonUtils; 5 | import com.alessiodp.oreannouncer.bukkit.addons.external.DiscordSRVHandler; 6 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 7 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 8 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 9 | import github.scarsz.discordsrv.DiscordSRV; 10 | import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel; 11 | import github.scarsz.discordsrv.objects.MessageFormat; 12 | import github.scarsz.discordsrv.util.DiscordUtil; 13 | import lombok.NonNull; 14 | import lombok.RequiredArgsConstructor; 15 | 16 | import java.awt.*; 17 | import java.util.function.Function; 18 | 19 | @RequiredArgsConstructor 20 | public class DiscordSRVHook { 21 | @NonNull private final OreAnnouncerPlugin plugin; 22 | 23 | private DiscordSRV api; 24 | 25 | public boolean register() { 26 | boolean ret = false; 27 | try { 28 | api = DiscordSRV.getPlugin(); 29 | 30 | ret = true; 31 | } catch (Exception ex) { 32 | plugin.getLoggerManager().logError(String.format(Constants.DEBUG_ADDON_OUTDATED, "DiscordSRV")); 33 | ex.printStackTrace(); 34 | } 35 | return ret; 36 | } 37 | 38 | public void sendMessageText(Function parser, String channel, String message) { 39 | if (message != null && !message.isEmpty()) { 40 | TextChannel textChannel = api.getDestinationTextChannelForGameChannelName(channel); 41 | if (textChannel != null) { 42 | DiscordUtil.queueMessage(textChannel, parser.apply(message)); 43 | } 44 | } 45 | } 46 | 47 | public void sendMessageEmbed(OAPlayerImpl player, Function parser, String channel, DiscordSRVHandler.DiscordSRVAlertEmbed embed) { 48 | if (embed != null && embed.hasContent()) { 49 | TextChannel textChannel = api.getDestinationTextChannelForGameChannelName(channel); 50 | if (textChannel != null) { 51 | MessageFormat mf = new MessageFormat(); 52 | CommonUtils.ifNonNullDo(parseHexColor(embed.getColor()), mf::setColor); 53 | CommonUtils.ifNonEmptyDo(embed.getAuthorName(), txt -> mf.setAuthorName(parser.apply(txt))); 54 | CommonUtils.ifNonEmptyDo(embed.getTitle(), txt -> mf.setTitle(parser.apply(txt))); 55 | CommonUtils.ifNonEmptyDo(embed.getDescription(), txt -> mf.setDescription(parser.apply(txt))); 56 | CommonUtils.ifNonEmptyDo(embed.getFooter(), txt -> mf.setFooterText(parser.apply(txt))); 57 | 58 | if (BukkitConfigMain.ALERTS_DISCORDSRV_EMBED_AVATARS && player != null) { 59 | mf.setAuthorImageUrl(DiscordSRV.getAvatarUrl(player.getName(), player.getPlayerUUID())); 60 | } 61 | 62 | DiscordUtil.queueMessage(textChannel, DiscordSRV.translateMessage(mf, (content, needEscape) -> content)); 63 | } 64 | } 65 | } 66 | 67 | private Color parseHexColor(String hex) { 68 | Color ret = null; 69 | if (hex != null && !hex.isEmpty()) { 70 | String parsedHex = hex.trim(); 71 | if (!parsedHex.startsWith("#")) parsedHex = "#" + parsedHex; 72 | if (parsedHex.length() == 7) { 73 | ret = new Color( 74 | Integer.valueOf(parsedHex.substring(1, 3), 16), 75 | Integer.valueOf(parsedHex.substring(3, 5), 16), 76 | Integer.valueOf(parsedHex.substring(5, 7), 16) 77 | ); 78 | } 79 | } 80 | return ret; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/BukkitOreAnnouncerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit; 2 | 3 | import com.alessiodp.core.bukkit.addons.internal.BukkitJsonHandler; 4 | import com.alessiodp.core.bukkit.addons.internal.SpigotJsonHandler; 5 | import com.alessiodp.core.bukkit.scheduling.ADPBukkitScheduler; 6 | import com.alessiodp.core.common.bootstrap.ADPBootstrap; 7 | import com.alessiodp.core.common.configuration.Constants; 8 | import com.alessiodp.oreannouncer.bukkit.addons.BukkitOAAddonManager; 9 | import com.alessiodp.oreannouncer.bukkit.addons.external.BukkitMetricsHandler; 10 | import com.alessiodp.oreannouncer.bukkit.blocks.BukkitBlockManager; 11 | import com.alessiodp.oreannouncer.bukkit.bootstrap.BukkitOreAnnouncerBootstrap; 12 | import com.alessiodp.oreannouncer.bukkit.commands.BukkitOACommandManager; 13 | import com.alessiodp.oreannouncer.bukkit.configuration.BukkitOAConfigurationManager; 14 | import com.alessiodp.oreannouncer.bukkit.configuration.data.BukkitConfigMain; 15 | import com.alessiodp.oreannouncer.bukkit.events.BukkitEventManager; 16 | import com.alessiodp.oreannouncer.bukkit.listeners.BukkitBlockListener; 17 | import com.alessiodp.oreannouncer.bukkit.listeners.BukkitJoinLeaveListener; 18 | import com.alessiodp.oreannouncer.bukkit.messaging.BukkitOAMessenger; 19 | import com.alessiodp.oreannouncer.bukkit.players.BukkitPlayerManager; 20 | import com.alessiodp.oreannouncer.bukkit.utils.BukkitMessageUtils; 21 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 22 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 23 | import lombok.Getter; 24 | import org.bukkit.plugin.Plugin; 25 | import org.bukkit.plugin.PluginManager; 26 | 27 | 28 | public class BukkitOreAnnouncerPlugin extends OreAnnouncerPlugin { 29 | @Getter private final int bstatsId = OAConstants.PLUGIN_BSTATS_BUKKIT_ID; 30 | 31 | public BukkitOreAnnouncerPlugin(ADPBootstrap bootstrap) { 32 | super(bootstrap); 33 | } 34 | 35 | @Override 36 | protected void initializeCore() { 37 | scheduler = new ADPBukkitScheduler(this); 38 | configurationManager = new BukkitOAConfigurationManager(this); 39 | messageUtils = new BukkitMessageUtils(this); 40 | messenger = new BukkitOAMessenger(this); 41 | 42 | super.initializeCore(); 43 | } 44 | 45 | @Override 46 | protected void loadCore() { 47 | blockManager = new BukkitBlockManager(this); 48 | playerManager = new BukkitPlayerManager(this); 49 | commandManager = new BukkitOACommandManager(this); 50 | 51 | super.loadCore(); 52 | } 53 | 54 | @Override 55 | protected void postHandle() { 56 | addonManager = new BukkitOAAddonManager(this); 57 | eventManager = new BukkitEventManager(this); 58 | 59 | super.postHandle(); 60 | 61 | new BukkitMetricsHandler(this); 62 | } 63 | 64 | @Override 65 | protected void initializeJsonHandler() { 66 | if (((BukkitOreAnnouncerBootstrap) getBootstrap()).isSpigot()) 67 | jsonHandler = new SpigotJsonHandler(this); 68 | else 69 | jsonHandler = new BukkitJsonHandler(this); 70 | } 71 | 72 | @Override 73 | protected void registerListeners() { 74 | getLoggerManager().logDebug(Constants.DEBUG_PLUGIN_REGISTERING, true); 75 | PluginManager pm = ((Plugin) getBootstrap()).getServer().getPluginManager(); 76 | pm.registerEvents(new BukkitBlockListener(this), ((Plugin) getBootstrap())); 77 | pm.registerEvents(new BukkitJoinLeaveListener(this), ((Plugin) getBootstrap())); 78 | } 79 | 80 | @Override 81 | public boolean isBungeeCordEnabled() { 82 | return BukkitConfigMain.OREANNOUNCER_BUNGEECORD_ENABLE; 83 | } 84 | 85 | @Override 86 | public String getServerName() { 87 | return BukkitConfigMain.OREANNOUNCER_BUNGEECORD_SERVER_NAME; 88 | } 89 | 90 | @Override 91 | public String getServerId() { 92 | return BukkitConfigMain.OREANNOUNCER_BUNGEECORD_SERVER_ID; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/players/PlayerManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.players; 2 | 3 | import com.alessiodp.core.common.user.User; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.blocks.objects.OABlockImpl; 6 | import com.alessiodp.oreannouncer.common.configuration.OAConstants; 7 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 8 | import com.alessiodp.oreannouncer.common.storage.OADatabaseManager; 9 | import com.alessiodp.oreannouncer.common.utils.BlocksFoundResult; 10 | import lombok.Getter; 11 | import lombok.NonNull; 12 | 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | import java.util.UUID; 16 | 17 | public abstract class PlayerManager { 18 | protected final OreAnnouncerPlugin plugin; 19 | 20 | @Getter private final HashMap cachePlayers; 21 | 22 | public PlayerManager(@NonNull OreAnnouncerPlugin plugin) { 23 | this.plugin = plugin; 24 | cachePlayers = new HashMap<>(); 25 | } 26 | 27 | public void reload() { 28 | cachePlayers.clear(); 29 | 30 | for (User user : plugin.getOnlinePlayers()) { 31 | loadPlayer(user.getUUID()); 32 | } 33 | } 34 | 35 | public abstract OAPlayerImpl initializePlayer(UUID playerUUID); 36 | 37 | public OAPlayerImpl loadPlayer(UUID uuid) { 38 | OAPlayerImpl ret = getPlayer(uuid); 39 | getCachePlayers().put(uuid, ret); 40 | return ret; 41 | } 42 | 43 | public boolean reloadPlayer(UUID uuid) { 44 | // Reload the player from database 45 | // Used by packet UPDATE_PLAYER 46 | if (getCachePlayers().containsKey(uuid)) { 47 | unloadPlayer(uuid); 48 | loadPlayer(uuid); 49 | 50 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_PLAYER_RELOADED, uuid.toString()), true); 51 | return true; 52 | } 53 | return false; 54 | } 55 | 56 | public void unloadPlayer(UUID uuid) { 57 | getCachePlayers().remove(uuid); 58 | } 59 | 60 | public OAPlayerImpl getPlayer(UUID uuid) { 61 | OAPlayerImpl ret = null; 62 | if (uuid != null) { 63 | ret = getCachePlayers().get(uuid); 64 | if (ret != null) { 65 | // Get player from online list 66 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_PLAYER_GET_LIST, ret.getName(), ret.getPlayerUUID()), true); 67 | } else { 68 | // Get player from database 69 | ret = plugin.getDatabaseManager().getPlayer(uuid); 70 | 71 | // Load new player 72 | if (ret == null) { 73 | ret = initializePlayer(uuid); 74 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_PLAYER_GET_NEW, ret.getName(), ret.getPlayerUUID()), true); 75 | } else { 76 | plugin.getLoggerManager().logDebug(String.format(OAConstants.DEBUG_PLAYER_GET_DATABASE, ret.getName(), ret.getPlayerUUID()), true); 77 | } 78 | } 79 | } 80 | return ret; 81 | } 82 | 83 | public int getTotalBlocksDestroy(OAPlayerImpl player, OABlockImpl block) { 84 | int ret = 0; 85 | if (player != null) { 86 | Map blocks = plugin.getDatabaseManager().getStatsPlayer(OADatabaseManager.ValueType.DESTROY, player.getPlayerUUID()); 87 | for (Map.Entry e : blocks.entrySet()) { 88 | if (block == null || block.equals(e.getKey())) 89 | ret = ret + e.getValue(); 90 | } 91 | } 92 | return ret; 93 | } 94 | 95 | public int getTotalBlocksFound(OAPlayerImpl player, OABlockImpl block, long sinceTimestamp) { 96 | int ret = 0; 97 | if (player != null) { 98 | BlocksFoundResult res = plugin.getDatabaseManager().getBlockFound(player.getPlayerUUID(), block, sinceTimestamp); 99 | if (res != null) 100 | ret = res.getTotal(); 101 | } 102 | return ret; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/api/ApiHandler.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.api; 2 | 3 | import com.alessiodp.core.common.utils.CommonUtils; 4 | import com.alessiodp.oreannouncer.api.interfaces.OABlock; 5 | import com.alessiodp.oreannouncer.api.interfaces.OABlockDestroy; 6 | import com.alessiodp.oreannouncer.api.interfaces.OABlockFound; 7 | import com.alessiodp.oreannouncer.api.interfaces.OAPlayer; 8 | import com.alessiodp.oreannouncer.api.interfaces.OreAnnouncerAPI; 9 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 10 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockDestroy; 11 | import com.alessiodp.oreannouncer.common.blocks.objects.OABlockImpl; 12 | import com.alessiodp.oreannouncer.common.configuration.data.Blocks; 13 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 14 | import com.alessiodp.oreannouncer.common.storage.OADatabaseManager; 15 | import lombok.NonNull; 16 | import lombok.RequiredArgsConstructor; 17 | import org.jetbrains.annotations.NotNull; 18 | import org.jetbrains.annotations.Nullable; 19 | 20 | import java.util.HashMap; 21 | import java.util.LinkedHashMap; 22 | import java.util.LinkedList; 23 | import java.util.Map; 24 | import java.util.UUID; 25 | 26 | @RequiredArgsConstructor 27 | public class ApiHandler implements OreAnnouncerAPI { 28 | @NonNull private final OreAnnouncerPlugin plugin; 29 | 30 | @Override 31 | public void reloadPlugin() { 32 | plugin.reloadConfiguration(); 33 | } 34 | 35 | @Override 36 | public boolean isBungeeCordEnabled() { 37 | return plugin.isBungeeCordEnabled(); 38 | } 39 | 40 | @Override 41 | public OAPlayer getOAPlayer(UUID uuid) { 42 | return plugin.getPlayerManager().getPlayer(uuid); 43 | } 44 | 45 | @Override 46 | public LinkedHashMap getTopPlayersByDestroy(int numberOfPlayers, OABlock block, int offset) { 47 | return getTopPlayers(OADatabaseManager.ValueType.DESTROY, numberOfPlayers, block, offset); 48 | } 49 | 50 | @Override 51 | public LinkedHashMap getTopPlayersByFound(int numberOfPlayers, OABlock block, int offset) { 52 | return getTopPlayers(OADatabaseManager.ValueType.FOUND, numberOfPlayers, block, offset); 53 | } 54 | 55 | private LinkedHashMap getTopPlayers(OADatabaseManager.ValueType order, int numberOfPlayers, OABlock block, int offset) { 56 | LinkedHashMap ret = new LinkedHashMap<>(); 57 | HashMap players = plugin.getDatabaseManager().getTopPlayers(order, (OABlockImpl) block, numberOfPlayers, offset); 58 | for (Map.Entry e : players.entrySet()) { 59 | OAPlayerImpl player = plugin.getPlayerManager().getPlayer(e.getKey()); 60 | if (player != null) 61 | ret.put(player, e.getValue()); 62 | } 63 | return ret; 64 | } 65 | 66 | @Override 67 | public LinkedList getLogBlocks(int limit, OAPlayer player, OABlock block, int offset) { 68 | return new LinkedList<>(plugin.getDatabaseManager().getLogBlocks((OAPlayerImpl) player, block, limit, offset)); 69 | } 70 | 71 | @Nullable 72 | @Override 73 | public OABlock getBlock(@NotNull String materialName) { 74 | return Blocks.searchBlock(materialName); 75 | } 76 | 77 | @Override 78 | public OABlock addBlock(@NotNull String materialName) { 79 | OABlockImpl ret = null; 80 | if (!Blocks.existsBlock(materialName)) { 81 | ret = new OABlockImpl(plugin, CommonUtils.toUpperCase(materialName)); 82 | ret.updateBlock(); 83 | } 84 | return ret; 85 | } 86 | 87 | @Override 88 | public void removeBlock(@NotNull OABlock block) { 89 | ((OABlockImpl) block).removeBlock(); 90 | } 91 | 92 | @Override 93 | public OABlockDestroy makeBlockDestroy(@NotNull UUID playerUuid, @NotNull OABlock block, int destroyCount) { 94 | return new BlockDestroy(playerUuid, block.getMaterialName(), destroyCount); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /output/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | oreannouncer 9 | com.alessiodp.oreannouncer 10 | 2.8.5 11 | 12 | 13 | output 14 | 15 | 16 | true 17 | 18 | 19 | 20 | install 21 | ${basedir}/target 22 | ${project.parent.name}-${project.version} 23 | 24 | 25 | org.apache.maven.plugins 26 | maven-shade-plugin 27 | ${maven.shade.version} 28 | 29 | 30 | 31 | com.alessiodp.oreannouncer:* 32 | 33 | 34 | 35 | 36 | com.alessiodp.core 37 | com.alessiodp.oreannouncer.core 38 | 39 | 40 | 41 | org.h2 42 | com.alessiodp.oreannouncer.libs.h2 43 | 44 | 45 | com.zaxxer.hikari 46 | com.alessiodp.oreannouncer.libs.hikari 47 | 48 | 49 | org.jdbi 50 | com.alessiodp.oreannouncer.libs.jdbi 51 | 52 | 53 | org.mariadb 54 | com.alessiodp.oreannouncer.libs.mariadb 55 | 56 | 57 | com.mysql 58 | com.alessiodp.oreannouncer.libs.mysql 59 | 60 | 61 | org.postgresql 62 | com.alessiodp.oreannouncer.libs.postgresql 63 | 64 | 65 | jdk.nashorn 66 | com.alessiodp.oreannouncer.libs.nashorn 67 | 68 | 69 | 70 | 71 | *:* 72 | 73 | META-INF/MANIFEST.MF 74 | META-INF/** 75 | 76 | 77 | 78 | 79 | 80 | 81 | package 82 | 83 | shade 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | com.alessiodp.oreannouncer 94 | oreannouncer-common 95 | ${project.version} 96 | compile 97 | 98 | 99 | com.alessiodp.oreannouncer 100 | oreannouncer-bukkit 101 | ${project.version} 102 | compile 103 | 104 | 105 | com.alessiodp.oreannouncer 106 | oreannouncer-bungeecord 107 | ${project.version} 108 | compile 109 | 110 | 111 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/utils/CoordinateUtils.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.utils; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 5 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 6 | import com.google.common.base.Strings; 7 | import lombok.AllArgsConstructor; 8 | import lombok.RequiredArgsConstructor; 9 | 10 | import java.util.ArrayList; 11 | 12 | @RequiredArgsConstructor 13 | public class CoordinateUtils { 14 | private final OreAnnouncerPlugin plugin; 15 | 16 | public String replaceCoordinates(String message, ADPLocation location, boolean hideEnabled) { 17 | String ret = message; 18 | if (ConfigMain.ALERTS_COORDINATES_ENABLE) { 19 | ArrayList coords = new ArrayList<>(); 20 | if (ret.contains(CoordinateAxis.X.toString())) 21 | coords.add(new Coordinate( 22 | CoordinateAxis.X, 23 | location.getX(), 24 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_X ? false : null)); 25 | if (ret.contains(CoordinateAxis.Y.toString())) 26 | coords.add(new Coordinate( 27 | CoordinateAxis.Y, 28 | location.getY(), 29 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Y ? false : null)); 30 | if (ret.contains(CoordinateAxis.Z.toString())) 31 | coords.add(new Coordinate( 32 | CoordinateAxis.Z, 33 | location.getZ(), 34 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Z ? false : null)); 35 | 36 | if (ConfigMain.ALERTS_COORDINATES_HIDE_ENABLE && hideEnabled) { 37 | for (int c=0; c < ConfigMain.ALERTS_COORDINATES_HIDE_COUNT; c++) { 38 | ArrayList visibleCoordinates = getVisibleCoordinates(coords); 39 | 40 | if (visibleCoordinates.size() == 0) 41 | break; 42 | 43 | // Randomly choose one of them 44 | int chosen = (int) (Math.random() * visibleCoordinates.size()); 45 | 46 | // Set chosen one into hidden 47 | visibleCoordinates.get(chosen).hidden = true; 48 | } 49 | } 50 | boolean isJson = plugin.getJsonHandler().isJson(message); 51 | for (Coordinate coord : coords) { 52 | ret = ret.replace(coord.axis.placeholder, coord.parseValue(isJson)); 53 | } 54 | } 55 | return ret; 56 | } 57 | 58 | private ArrayList getVisibleCoordinates(ArrayList coordinates) { 59 | ArrayList ret = new ArrayList<>(); 60 | for (Coordinate coord : coordinates) { 61 | if (coord.hidden != null && !coord.hidden) { 62 | ret.add(coord); 63 | } 64 | } 65 | return ret; 66 | } 67 | 68 | @AllArgsConstructor 69 | private static final class Coordinate { 70 | private final CoordinateAxis axis; 71 | private final double value; 72 | // If null, this coordinate does not support hide 73 | private Boolean hidden; 74 | 75 | private String parseValue(boolean isJson) { 76 | String ret = Integer.toString((int) value); 77 | if (hidden != null && hidden) { 78 | if (ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_ENABLE) { 79 | int num = ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_FIXEDLENGTH; 80 | if (num <= 0) 81 | num = ret.length() - (value < 0 ? 1 : 0); 82 | 83 | ret = Strings.repeat(ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_CHARACTER, num); 84 | } 85 | 86 | if (isJson) { 87 | ret = ConfigMain.ALERTS_COORDINATES_HIDE_FORMAT_JSON.replace("%coordinate%", ret); 88 | } else { 89 | ret = ConfigMain.ALERTS_COORDINATES_HIDE_FORMAT_TEXT.replace("%coordinate%", ret); 90 | } 91 | } 92 | return ret; 93 | } 94 | } 95 | 96 | @AllArgsConstructor 97 | public enum CoordinateAxis { 98 | X("%x%"), 99 | Y("%y%"), 100 | Z("%z%"); 101 | 102 | private final String placeholder; 103 | 104 | @Override 105 | public String toString() {return placeholder;} 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /bungeecord/dependency-reduced-pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | oreannouncer 5 | com.alessiodp.oreannouncer 6 | 2.8.5 7 | 8 | 4.0.0 9 | oreannouncer-bungeecord 10 | 11 | install 12 | 13 | 14 | . 15 | true 16 | ${basedir}/src/main/resources/ 17 | 18 | **/*.yml 19 | 20 | 21 | 22 | 23 | 24 | maven-compiler-plugin 25 | ${maven.compiler.version} 26 | 27 | ${maven.compiler.source} 28 | ${maven.compiler.target} 29 | 30 | 31 | 32 | maven-shade-plugin 33 | ${maven.shade.version} 34 | 35 | 36 | package 37 | 38 | shade 39 | 40 | 41 | 42 | 43 | 44 | 45 | com.alessiodp.oreannouncer:oreannouncer-bungeecord 46 | com.alessiodp.core:core-bungeecord 47 | 48 | 49 | 50 | 51 | *:* 52 | 53 | META-INF/MANIFEST.MF 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | com.alessiodp.oreannouncer 64 | oreannouncer-common 65 | 2.8.5 66 | compile 67 | 68 | 69 | org.projectlombok 70 | lombok 71 | 1.18.24 72 | provided 73 | 74 | 75 | org.mockito 76 | mockito-inline 77 | 4.11.0 78 | test 79 | 80 | 81 | mockito-core 82 | org.mockito 83 | 84 | 85 | 86 | 87 | org.junit.jupiter 88 | junit-jupiter 89 | 5.9.1 90 | test 91 | 92 | 93 | junit-jupiter-api 94 | org.junit.jupiter 95 | 96 | 97 | junit-jupiter-params 98 | org.junit.jupiter 99 | 100 | 101 | junit-jupiter-engine 102 | org.junit.jupiter 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /bungeecord/src/test/java/com/alessiodp/oreannouncer/bungeecord/configuration/BungeeConfigurationTest.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bungeecord.configuration; 2 | 3 | import com.alessiodp.core.common.addons.external.simpleyaml.configuration.file.YamlFile; 4 | import com.alessiodp.core.common.configuration.ConfigOption; 5 | import com.alessiodp.core.common.configuration.ConfigurationFile; 6 | import com.alessiodp.core.common.logging.logger.ADPLogger; 7 | import com.alessiodp.oreannouncer.bungeecord.configuration.data.BungeeConfigMain; 8 | import com.alessiodp.oreannouncer.bungeecord.configuration.data.BungeeMessages; 9 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 10 | import org.junit.jupiter.api.BeforeAll; 11 | import org.junit.jupiter.api.Test; 12 | import org.junit.jupiter.api.io.TempDir; 13 | 14 | import java.lang.reflect.Field; 15 | import java.nio.file.Path; 16 | import java.util.Arrays; 17 | import java.util.Collections; 18 | import java.util.List; 19 | 20 | import static org.junit.jupiter.api.Assertions.assertNotNull; 21 | import static org.mockito.ArgumentMatchers.anyString; 22 | import static org.mockito.Mockito.doAnswer; 23 | import static org.mockito.Mockito.mock; 24 | import static org.mockito.Mockito.when; 25 | 26 | public class BungeeConfigurationTest { 27 | private static final OreAnnouncerPlugin mockPlugin = mock(OreAnnouncerPlugin.class); 28 | 29 | @BeforeAll 30 | public static void setUp() { 31 | ADPLogger testLogger = mock(ADPLogger.class); 32 | doAnswer((params) -> { 33 | //System.out.println((String) params.getArgument(0)); 34 | return null; 35 | }).when(testLogger).info(anyString()); 36 | doAnswer((params) -> { 37 | System.err.println((String) params.getArgument(0)); 38 | return null; 39 | }).when(testLogger).error(anyString()); 40 | when(mockPlugin.getLogger()).thenReturn(testLogger); 41 | 42 | when(mockPlugin.getResource(anyString())).thenAnswer((a) -> ClassLoader.getSystemResourceAsStream(a.getArgument(0))); 43 | } 44 | 45 | @Test 46 | public void testConfigMain(@TempDir Path tempDir) throws IllegalAccessException { 47 | BungeeConfigMain configMain = new BungeeConfigMain(mockPlugin); 48 | 49 | List skipPaths = Arrays.asList( 50 | "alerts.sound", 51 | "alerts.coordinates", 52 | "blocks.bypass", 53 | "blocks.warn", 54 | "blocks.light-level", 55 | "blocks.height-level", 56 | "blocks.tnt", 57 | "stats.blacklist", 58 | "stats.advanced-count.default", 59 | "execute-commands" 60 | ); 61 | 62 | testConfiguration(configMain, skipPaths, tempDir); 63 | } 64 | 65 | @Test 66 | public void testMessages(@TempDir Path tempDir) throws IllegalAccessException { 67 | BungeeMessages messages = new BungeeMessages(mockPlugin); 68 | 69 | List skipPaths = Collections.singletonList( 70 | "alerts." 71 | ); 72 | 73 | testConfiguration(messages, skipPaths, tempDir); 74 | } 75 | 76 | private void testConfiguration(ConfigurationFile configurationFile, List skipPaths, Path tempDir) throws IllegalAccessException { 77 | Field[] fields = configurationFile.getClass().getFields(); 78 | 79 | // Initialize YAML 80 | configurationFile.initializeConfiguration(tempDir); 81 | YamlFile yf = configurationFile.getConfiguration(); 82 | 83 | // Check fields 84 | for (Field f : fields) { 85 | ConfigOption co = f.getAnnotation(ConfigOption.class); 86 | if (co != null && !skippablePath(co.path(), skipPaths)) { 87 | Object value = yf.get(co.path()); 88 | assertNotNull(value, "The " + configurationFile.getClass().getSimpleName() + " path '" + co.path() + "' is null."); 89 | f.set(null, value); 90 | } 91 | } 92 | } 93 | 94 | private boolean skippablePath(String path, List skipPaths) { 95 | for (String sp : skipPaths) { 96 | if (path.startsWith(sp)) 97 | return true; 98 | } 99 | return false; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /common/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | oreannouncer 9 | com.alessiodp.oreannouncer 10 | 2.8.5 11 | 12 | 13 | oreannouncer-common 14 | 15 | 16 | clean package install 17 | 18 | 19 | true 20 | ${basedir}/src/main/resources/ 21 | 22 | 23 | 24 | 25 | maven-compiler-plugin 26 | ${maven.compiler.version} 27 | 28 | ${maven.compiler.source} 29 | ${maven.compiler.target} 30 | 31 | 32 | 33 | org.apache.maven.plugins 34 | maven-shade-plugin 35 | ${maven.shade.version} 36 | 37 | 38 | 39 | com.alessiodp.core:core-common 40 | 41 | 42 | 43 | 44 | *:* 45 | 46 | META-INF/MANIFEST.MF 47 | 48 | 49 | 50 | 51 | 52 | 53 | package 54 | 55 | shade 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | com.alessiodp.core 66 | core-common 67 | ${libs.adpcore} 68 | compile 69 | 70 | 71 | com.alessiodp.oreannouncer 72 | oreannouncer-api 73 | ${project.version} 74 | compile 75 | 76 | 77 | com.alessiodp.lastloginapi 78 | lastloginapi-api 79 | ${libs.llapi} 80 | provided 81 | 82 | 83 | org.jetbrains 84 | annotations 85 | ${dev.annotations} 86 | 87 | 88 | 89 | 90 | com.h2database 91 | h2 92 | ${libs.h2} 93 | test 94 | 95 | 96 | com.zaxxer 97 | HikariCP 98 | ${libs.hikaricp} 99 | test 100 | 101 | 102 | org.mariadb.jdbc 103 | mariadb-java-client 104 | ${libs.mariadb} 105 | test 106 | 107 | 108 | mysql 109 | mysql-connector-java 110 | ${libs.mysql} 111 | test 112 | 113 | 114 | org.postgresql 115 | postgresql 116 | ${libs.postgresql} 117 | test 118 | 119 | 120 | org.xerial 121 | sqlite-jdbc 122 | ${libs.sqlite} 123 | test 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocks/BlocksDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocks; 2 | 3 | import com.alessiodp.core.common.utils.Pair; 4 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockDestroy; 5 | import com.alessiodp.oreannouncer.common.storage.sql.dao.StatsPlayerRowMapper; 6 | import com.alessiodp.oreannouncer.common.storage.sql.dao.TopPlayerRowMapper; 7 | import org.jdbi.v3.sqlobject.config.RegisterRowMapper; 8 | import org.jdbi.v3.sqlobject.customizer.Bind; 9 | import org.jdbi.v3.sqlobject.customizer.BindList; 10 | import org.jdbi.v3.sqlobject.statement.SqlQuery; 11 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 12 | 13 | import java.util.List; 14 | import java.util.Optional; 15 | import java.util.Set; 16 | import java.util.stream.Stream; 17 | 18 | public interface BlocksDao { 19 | String QUERY_UPDATE = "INSERT INTO `blocks` (`player`, `material_name`, `destroyed`)" + 20 | " VALUES (?, ?, ?)" + 21 | " ON DUPLICATE KEY" + 22 | " UPDATE destroyed=`destroyed` + VALUES(`destroyed`)"; 23 | String QUERY_SET = "INSERT INTO `blocks` (`player`, `material_name`, `destroyed`)" + 24 | " VALUES (?, ?, ?)" + 25 | " ON DUPLICATE KEY" + 26 | " UPDATE destroyed=VALUES(`destroyed`)"; 27 | String QUERY_GET = "SELECT * FROM `blocks` WHERE player = ? AND material_name = ?"; 28 | String QUERY_GET_ALL = "SELECT * FROM `blocks` WHERE player = ?"; 29 | String QUERY_GET_TOP_PLAYERS = "SELECT `player`, sum(`destroyed`) AS `total` FROM `blocks` WHERE material_name in () GROUP BY `player` ORDER BY `total` DESC LIMIT :limit OFFSET :offset"; 30 | String QUERY_GET_TOP_PLAYERS_NUMBER = "SELECT count(DISTINCT `player`) FROM `blocks` WHERE material_name in ()"; 31 | String QUERY_GET_TOP_PLAYERS_LIST = "SELECT `player`, sum(`destroyed`) AS `total` FROM `blocks` WHERE material_name in () GROUP BY `player` ORDER BY `total` DESC"; 32 | String QUERY_GET_STATS = "SELECT `material_name`, `destroyed` AS total FROM `blocks` WHERE material_name in () AND player = :player"; 33 | String QUERY_TOTAL = "SELECT sum(`destroyed`) FROM `blocks` WHERE material_name in ()"; 34 | String QUERY_COUNT_ALL = "SELECT count(*) FROM `blocks`"; 35 | String QUERY_DELETE_ALL = "DELETE FROM `blocks`"; 36 | 37 | @SqlUpdate(QUERY_UPDATE) 38 | void update(String uuid, String materialName, int destroyed); 39 | 40 | @SqlUpdate(QUERY_SET) 41 | void set(String uuid, String materialName, int destroyed); 42 | 43 | @SqlQuery(QUERY_GET) 44 | @RegisterRowMapper(BlockDestroyRowMapper.class) 45 | Optional get(String uuid, String materialName); 46 | 47 | @SqlQuery(QUERY_GET_ALL) 48 | @RegisterRowMapper(BlockDestroyRowMapper.class) 49 | Set getAll(String uuid); 50 | 51 | @SqlQuery(QUERY_GET_TOP_PLAYERS) 52 | @RegisterRowMapper(TopPlayerRowMapper.class) 53 | List> getTopPlayers(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials, @Bind("limit") int limit, @Bind("offset") int offset); 54 | 55 | @SqlQuery(QUERY_GET_TOP_PLAYERS_NUMBER) 56 | int getTopPlayersNumber(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 57 | 58 | @SqlQuery(QUERY_GET_TOP_PLAYERS_LIST) 59 | @RegisterRowMapper(TopPlayerRowMapper.class) 60 | Stream> getTopPlayersList(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 61 | 62 | @SqlQuery(QUERY_GET_STATS) 63 | @RegisterRowMapper(StatsPlayerRowMapper.class) 64 | List> getStatsPlayer(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials, @Bind("player") String uuid); 65 | 66 | @SqlQuery(QUERY_TOTAL) 67 | int getTotal(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 68 | 69 | @SqlQuery(QUERY_COUNT_ALL) 70 | int countAll(); 71 | 72 | @SqlUpdate(QUERY_DELETE_ALL) 73 | void deleteAll(); 74 | } 75 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/main/CommandOA.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.main; 2 | 3 | import com.alessiodp.core.common.commands.list.ADPCommand; 4 | import com.alessiodp.core.common.commands.utils.ADPExecutableCommand; 5 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 6 | import com.alessiodp.core.common.user.User; 7 | import com.alessiodp.core.common.utils.Color; 8 | import com.alessiodp.core.common.utils.CommonUtils; 9 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 10 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 11 | import com.alessiodp.oreannouncer.common.commands.sub.CommandAlerts; 12 | import com.alessiodp.oreannouncer.common.commands.sub.CommandHelp; 13 | import com.alessiodp.oreannouncer.common.commands.sub.CommandLog; 14 | import com.alessiodp.oreannouncer.common.commands.sub.CommandReload; 15 | import com.alessiodp.oreannouncer.common.commands.sub.CommandStats; 16 | import com.alessiodp.oreannouncer.common.commands.sub.CommandTop; 17 | import com.alessiodp.oreannouncer.common.commands.sub.CommandVersion; 18 | import com.alessiodp.oreannouncer.common.commands.sub.CommandWhitelist; 19 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 20 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 21 | 22 | import java.util.HashMap; 23 | import java.util.Map; 24 | 25 | public class CommandOA extends ADPMainCommand { 26 | 27 | public CommandOA(OreAnnouncerPlugin plugin) { 28 | super(plugin, CommonCommands.OA, ConfigMain.COMMANDS_MAIN_OA_COMMAND, true); 29 | 30 | aliases = ConfigMain.COMMANDS_MAIN_OA_ALIASES; 31 | subCommands = new HashMap<>(); 32 | subCommandsByEnum = new HashMap<>(); 33 | tabSupport = ConfigMain.COMMANDS_TABSUPPORT; 34 | 35 | register(new CommandHelp(plugin, this)); 36 | register(new CommandReload(plugin, this)); 37 | register(new CommandVersion(plugin, this)); 38 | 39 | if (ConfigMain.ALERTS_ENABLE) 40 | register(new CommandAlerts(plugin, this)); 41 | 42 | if (ConfigMain.STATS_ENABLE) { 43 | register(new CommandStats(plugin, this)); 44 | if (ConfigMain.STATS_TOP_ENABLE) 45 | register(new CommandTop(plugin, this)); 46 | 47 | if (ConfigMain.STATS_ADVANCED_COUNT_ENABLE && ConfigMain.STATS_ADVANCED_COUNT_LOG_ENABLE) 48 | register(new CommandLog(plugin, this)); 49 | } 50 | 51 | if (ConfigMain.WHITELIST_ENABLE) { 52 | register(new CommandWhitelist(plugin, this)); 53 | } 54 | } 55 | 56 | @Override 57 | public boolean onCommand(User sender, String command, String[] args) { 58 | String subCommand; 59 | if (sender.isPlayer()) { 60 | if (args.length == 0) { 61 | // Set /llapi to /llapi help 62 | subCommand = CommonUtils.toLowerCase(ConfigMain.COMMANDS_SUB_HELP); 63 | } else { 64 | subCommand = CommonUtils.toLowerCase(args[0]); 65 | } 66 | 67 | if (exists(subCommand)) { 68 | plugin.getCommandManager().getCommandUtils().executeCommand(sender, getCommandName(), getSubCommand(subCommand), args); 69 | } else { 70 | sender.sendMessage(Messages.OREANNOUNCER_COMMON_INVALIDCMD, true); 71 | } 72 | } else { 73 | // Console 74 | if (args.length > 0) { 75 | subCommand = CommonUtils.toLowerCase(args[0]); 76 | if (exists(subCommand) && getSubCommand(subCommand).isExecutableByConsole()) { 77 | plugin.getCommandManager().getCommandUtils().executeCommand(sender, getCommandName(), getSubCommand(subCommand), args); 78 | } else { 79 | plugin.getLogger().info(Color.translateAndStripColor(Messages.OREANNOUNCER_COMMON_INVALIDCMD)); 80 | } 81 | } else { 82 | // Print help 83 | plugin.getLogger().info(Messages.HELP_CONSOLEHELP_HEADER); 84 | for(Map.Entry e : plugin.getCommandManager().getOrderedCommands().entrySet()) { 85 | if (e.getValue().isExecutableByConsole() && e.getValue().isListedInHelp()) { 86 | plugin.getLogger().info(Messages.HELP_CONSOLEHELP_COMMAND 87 | .replace("%command%", e.getValue().getConsoleSyntax()) 88 | .replace("%description%", e.getValue().getDescription())); 89 | } 90 | } 91 | } 92 | } 93 | return true; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/storage/sql/dao/blocks/PostgreSQLBlocksDao.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.storage.sql.dao.blocks; 2 | 3 | import com.alessiodp.core.common.utils.Pair; 4 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockDestroy; 5 | import com.alessiodp.oreannouncer.common.storage.sql.dao.StatsPlayerRowMapper; 6 | import com.alessiodp.oreannouncer.common.storage.sql.dao.TopPlayerRowMapper; 7 | import org.jdbi.v3.sqlobject.config.RegisterRowMapper; 8 | import org.jdbi.v3.sqlobject.customizer.Bind; 9 | import org.jdbi.v3.sqlobject.customizer.BindList; 10 | import org.jdbi.v3.sqlobject.statement.SqlQuery; 11 | import org.jdbi.v3.sqlobject.statement.SqlUpdate; 12 | 13 | import java.util.List; 14 | import java.util.Optional; 15 | import java.util.Set; 16 | import java.util.stream.Stream; 17 | 18 | public interface PostgreSQLBlocksDao extends BlocksDao { 19 | String QUERY_UPDATE = "INSERT INTO blocks (\"player\", \"material_name\", \"destroyed\")" + 20 | " VALUES (?, ?, ?)" + 21 | " ON CONFLICT (\"player\", \"material_name\") DO UPDATE SET destroyed = blocks.destroyed + EXCLUDED.destroyed"; 22 | String QUERY_SET = "INSERT INTO blocks (\"player\", \"material_name\", \"destroyed\")" + 23 | " VALUES (?, ?, ?)" + 24 | " ON CONFLICT (\"player\", \"material_name\") DO UPDATE SET destroyed=EXCLUDED.destroyed"; 25 | String QUERY_GET = "SELECT * FROM blocks WHERE player = ? AND material_name = ?"; 26 | String QUERY_GET_ALL = "SELECT * FROM blocks WHERE player = ?"; 27 | String QUERY_GET_TOP_PLAYERS = "SELECT \"player\", sum(\"destroyed\") AS \"total\" FROM blocks WHERE material_name in () GROUP BY \"player\" ORDER BY \"total\" DESC LIMIT :limit OFFSET :offset"; 28 | String QUERY_GET_TOP_PLAYERS_NUMBER = "SELECT count(DISTINCT \"player\") FROM blocks WHERE material_name in ()"; 29 | String QUERY_GET_TOP_PLAYERS_LIST = "SELECT \"player\", sum(\"destroyed\") AS \"total\" FROM blocks WHERE material_name in () GROUP BY \"player\" ORDER BY \"total\" DESC"; 30 | String QUERY_GET_STATS = "SELECT \"material_name\", \"destroyed\" AS total FROM blocks WHERE material_name in () AND player = :player"; 31 | String QUERY_TOTAL = "SELECT sum(\"destroyed\") FROM blocks WHERE material_name in ()"; 32 | String QUERY_COUNT_ALL = "SELECT count(*) FROM blocks"; 33 | String QUERY_DELETE_ALL = "DELETE FROM blocks"; 34 | 35 | @Override 36 | @SqlUpdate(QUERY_UPDATE) 37 | void update(String uuid, String materialName, int destroyed); 38 | 39 | @Override 40 | @SqlUpdate(QUERY_SET) 41 | void set(String uuid, String materialName, int destroyed); 42 | 43 | @Override 44 | @SqlQuery(QUERY_GET) 45 | @RegisterRowMapper(BlockDestroyRowMapper.class) 46 | Optional get(String uuid, String materialName); 47 | 48 | @Override 49 | @SqlQuery(QUERY_GET_ALL) 50 | @RegisterRowMapper(BlockDestroyRowMapper.class) 51 | Set getAll(String uuid); 52 | 53 | @Override 54 | @SqlQuery(QUERY_GET_TOP_PLAYERS) 55 | @RegisterRowMapper(TopPlayerRowMapper.class) 56 | List> getTopPlayers(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials, @Bind("limit") int limit, @Bind("offset") int offset); 57 | 58 | @Override 59 | @SqlQuery(QUERY_GET_TOP_PLAYERS_NUMBER) 60 | int getTopPlayersNumber(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 61 | 62 | @SqlQuery(QUERY_GET_TOP_PLAYERS_LIST) 63 | @RegisterRowMapper(TopPlayerRowMapper.class) 64 | Stream> getTopPlayersList(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 65 | 66 | @Override 67 | @SqlQuery(QUERY_GET_STATS) 68 | @RegisterRowMapper(StatsPlayerRowMapper.class) 69 | List> getStatsPlayer(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials, @Bind("player") String uuid); 70 | 71 | @Override 72 | @SqlQuery(QUERY_TOTAL) 73 | int getTotal(@BindList(value = "materials", onEmpty = BindList.EmptyHandling.NULL_VALUE) List materials); 74 | 75 | @Override 76 | @SqlQuery(QUERY_COUNT_ALL) 77 | int countAll(); 78 | 79 | @SqlUpdate(QUERY_DELETE_ALL) 80 | void deleteAll(); 81 | } 82 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/blocks/BukkitBlockManager.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.blocks; 2 | 3 | import com.alessiodp.core.common.utils.ADPLocation; 4 | import com.alessiodp.core.common.utils.CommonUtils; 5 | import com.alessiodp.oreannouncer.bukkit.addons.external.DiscordSRVHandler; 6 | import com.alessiodp.oreannouncer.bukkit.addons.external.ItemModsHandler; 7 | import com.alessiodp.oreannouncer.bukkit.addons.external.MMOItemsHandler; 8 | import com.alessiodp.oreannouncer.bukkit.addons.external.PlaceholderAPIHandler; 9 | import com.alessiodp.oreannouncer.bukkit.bootstrap.BukkitOreAnnouncerBootstrap; 10 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 11 | import com.alessiodp.oreannouncer.common.blocks.BlockManager; 12 | import com.alessiodp.oreannouncer.common.blocks.objects.BlockData; 13 | import com.alessiodp.oreannouncer.common.blocks.objects.OABlockImpl; 14 | import org.bukkit.Bukkit; 15 | import org.bukkit.Location; 16 | import org.bukkit.Material; 17 | import org.bukkit.block.Block; 18 | import org.bukkit.metadata.FixedMetadataValue; 19 | 20 | import java.util.UUID; 21 | 22 | public class BukkitBlockManager extends BlockManager { 23 | 24 | public BukkitBlockManager(OreAnnouncerPlugin plugin) { 25 | super(plugin); 26 | } 27 | 28 | @Override 29 | public void sendGlobalAlert(BlockData data, AlertType type) { 30 | super.sendGlobalAlert(data, type); 31 | DiscordSRVHandler.dispatchAlerts(data, type); 32 | } 33 | 34 | @Override 35 | public boolean existsMaterial(String materialName) { 36 | return Material.getMaterial(CommonUtils.toUpperCase(materialName)) != null 37 | || CommonUtils.toUpperCase(materialName).startsWith("ITEMMODS_") 38 | || CommonUtils.toUpperCase(materialName).startsWith("MMOITEMS_"); 39 | } 40 | 41 | public String getBlockType(Block block) { 42 | if (ItemModsHandler.isPluginBlock(block)) { 43 | return ItemModsHandler.getNameByBlock(block); 44 | } else if (MMOItemsHandler.isPluginBlock(block)) { 45 | return MMOItemsHandler.getNameByBlock(block); 46 | } 47 | return block.getType().name(); 48 | } 49 | 50 | @SuppressWarnings("ConstantConditions") 51 | @Override 52 | public boolean isBlockMarked(ADPLocation blockLocation, MarkType markType) { 53 | boolean ret = false; 54 | Block bukkitBlock = new Location( 55 | Bukkit.getWorld(blockLocation.getWorld()), 56 | blockLocation.getX(), 57 | blockLocation.getY(), 58 | blockLocation.getZ(), 59 | blockLocation.getYaw(), 60 | blockLocation.getPitch()).getBlock(); 61 | if (bukkitBlock != null 62 | && bukkitBlock.hasMetadata(markType.getMark())) { 63 | ret = true; 64 | } 65 | return ret; 66 | } 67 | 68 | @SuppressWarnings("ConstantConditions") 69 | @Override 70 | public boolean markBlock(ADPLocation blockLocation, OABlockImpl block, MarkType markType) { 71 | boolean ret = false; 72 | Block bukkitBlock = new Location( 73 | Bukkit.getWorld(blockLocation.getWorld()), 74 | blockLocation.getX(), 75 | blockLocation.getY(), 76 | blockLocation.getZ(), 77 | blockLocation.getYaw(), 78 | blockLocation.getPitch()).getBlock(); 79 | if (bukkitBlock != null 80 | && (block.getMaterialName().equalsIgnoreCase(getBlockType(bukkitBlock)) || block.getVariants().contains(getBlockType(bukkitBlock))) 81 | && !bukkitBlock.hasMetadata(markType.getMark())) { 82 | bukkitBlock.setMetadata(markType.getMark(), new FixedMetadataValue((BukkitOreAnnouncerBootstrap) plugin.getBootstrap(), true)); 83 | ret = true; 84 | } 85 | return ret; 86 | } 87 | 88 | @SuppressWarnings("ConstantConditions") 89 | @Override 90 | public void unmarkBlock(ADPLocation blockLocation, MarkType markType) { 91 | Block block = new Location( 92 | Bukkit.getWorld(blockLocation.getWorld()), 93 | blockLocation.getX(), 94 | blockLocation.getY(), 95 | blockLocation.getZ(), 96 | blockLocation.getYaw(), 97 | blockLocation.getPitch()).getBlock(); 98 | if (block != null && block.hasMetadata(markType.getMark())) { 99 | block.removeMetadata(markType.getMark(), (BukkitOreAnnouncerBootstrap) plugin.getBootstrap()); 100 | 101 | } 102 | } 103 | 104 | @Override 105 | protected String parsePAPI(UUID playerUuid, String message) { 106 | return PlaceholderAPIHandler.getPlaceholders(playerUuid, message); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /bukkit/src/main/java/com/alessiodp/oreannouncer/bukkit/listeners/BukkitBlockListener.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.bukkit.listeners; 2 | 3 | import com.alessiodp.core.bukkit.user.BukkitUser; 4 | import com.alessiodp.core.common.utils.ADPLocation; 5 | import com.alessiodp.oreannouncer.bukkit.blocks.BukkitBlockManager; 6 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 7 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 8 | import com.alessiodp.oreannouncer.common.listeners.BlockListener; 9 | import org.bukkit.Material; 10 | import org.bukkit.block.Block; 11 | import org.bukkit.enchantments.Enchantment; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.entity.TNTPrimed; 14 | import org.bukkit.event.EventHandler; 15 | import org.bukkit.event.EventPriority; 16 | import org.bukkit.event.Listener; 17 | import org.bukkit.event.block.BlockBreakEvent; 18 | import org.bukkit.event.block.BlockPlaceEvent; 19 | import org.bukkit.event.entity.EntityExplodeEvent; 20 | 21 | import java.util.ArrayList; 22 | import java.util.Set; 23 | 24 | public class BukkitBlockListener extends BlockListener implements Listener { 25 | 26 | public BukkitBlockListener(OreAnnouncerPlugin plugin) { 27 | super(plugin); 28 | } 29 | 30 | @SuppressWarnings({"deprecation", "ConstantConditions", "RedundantCast"}) 31 | @EventHandler(priority=EventPriority.MONITOR) 32 | public void onBlockBreak(BlockBreakEvent event) { 33 | if (!event.isCancelled()) { 34 | // Get enchantments 35 | int enchantmentLevel; 36 | try { 37 | enchantmentLevel = event.getPlayer().getInventory().getItemInMainHand().getEnchantmentLevel(Enchantment.SILK_TOUCH); 38 | } catch (NoSuchMethodError ex) { 39 | // MC 1.8 40 | enchantmentLevel = event.getPlayer().getInventory().getItemInHand().getEnchantmentLevel(Enchantment.SILK_TOUCH); 41 | } 42 | 43 | super.onBlockBreak( 44 | new BukkitUser(plugin, event.getPlayer()), 45 | ((BukkitBlockManager) plugin.getBlockManager()).getBlockType(event.getBlock()), 46 | event.getPlayer().getLastTwoTargetBlocks((Set) null,1).get(0).getLightLevel(), 47 | enchantmentLevel > 0, 48 | new ADPLocation( 49 | event.getBlock().getLocation().getWorld().getName(), 50 | event.getBlock().getLocation().getX(), 51 | event.getBlock().getLocation().getY(), 52 | event.getBlock().getLocation().getZ(), 53 | event.getBlock().getLocation().getYaw(), 54 | event.getBlock().getLocation().getPitch() 55 | ) 56 | ); 57 | } 58 | } 59 | 60 | @SuppressWarnings("ConstantConditions") 61 | @EventHandler(priority=EventPriority.MONITOR) 62 | public void onBlockPlace(BlockPlaceEvent event) { 63 | if (!event.isCancelled() && ConfigMain.BLOCKS_BYPASS_PLAYERBLOCKS) 64 | super.onBlockPlace( 65 | new BukkitUser(plugin, event.getPlayer()), 66 | ((BukkitBlockManager) plugin.getBlockManager()).getBlockType(event.getBlock()), 67 | new ADPLocation( 68 | event.getBlock().getLocation().getWorld().getName(), 69 | event.getBlock().getLocation().getX(), 70 | event.getBlock().getLocation().getY(), 71 | event.getBlock().getLocation().getZ(), 72 | event.getBlock().getLocation().getYaw(), 73 | event.getBlock().getLocation().getPitch() 74 | )); 75 | } 76 | 77 | @EventHandler(priority=EventPriority.MONITOR) 78 | public void onTNTExplode(EntityExplodeEvent event) { 79 | if (event.getEntity() instanceof TNTPrimed 80 | && !event.isCancelled() 81 | && ConfigMain.BLOCKS_TNT_MINING_ALERT_ON) { 82 | final BukkitUser user = ( 83 | ConfigMain.BLOCKS_TNT_MINING_CATCH_PLAYER 84 | && ((TNTPrimed) event.getEntity()).getSource() != null 85 | && ((TNTPrimed) event.getEntity()).getSource() instanceof Player 86 | ) ? new BukkitUser(plugin, ((TNTPrimed) event.getEntity()).getSource()) : null; 87 | ArrayList blocks = new ArrayList<>(); 88 | for (Block block : event.blockList()) { 89 | blocks.add(((BukkitBlockManager) plugin.getBlockManager()).getBlockType(block)); 90 | } 91 | plugin.getScheduler().runAsync(() -> super.onTNTExplode( 92 | user, 93 | blocks, 94 | new ADPLocation( 95 | event.getLocation().getWorld() != null ? event.getLocation().getWorld().getName() : "", 96 | event.getLocation().getX(), 97 | event.getLocation().getY(), 98 | event.getLocation().getZ(), 99 | event.getLocation().getYaw(), 100 | event.getLocation().getPitch() 101 | ))); 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /common/src/test/java/com/alessiodp/oreannouncer/common/utils/TestCoordinateUtils.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.utils; 2 | 3 | import com.alessiodp.core.common.addons.internal.JsonHandler; 4 | import com.alessiodp.core.common.utils.ADPLocation; 5 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 6 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 7 | import org.junit.jupiter.api.BeforeAll; 8 | import org.junit.jupiter.api.BeforeEach; 9 | import org.junit.jupiter.api.Test; 10 | 11 | import static org.junit.jupiter.api.Assertions.assertEquals; 12 | import static org.mockito.ArgumentMatchers.any; 13 | import static org.mockito.Mockito.mock; 14 | import static org.mockito.Mockito.when; 15 | 16 | public class TestCoordinateUtils { 17 | private static CoordinateUtils coordinateUtils; 18 | private static ADPLocation location; 19 | private final static String COORDINATES = "%x%,%y%,%z%"; 20 | 21 | @BeforeAll 22 | public static void setUp() { 23 | OreAnnouncerPlugin mockPlugin = mock(OreAnnouncerPlugin.class); 24 | coordinateUtils = new CoordinateUtils(mockPlugin); 25 | location = new ADPLocation( 26 | "world", 27 | 1, 28 | -2, 29 | 3, 30 | 4, 31 | 5 32 | ); 33 | 34 | JsonHandler mockJsonHandler = mock(JsonHandler.class); 35 | when(mockPlugin.getJsonHandler()).thenReturn(mockJsonHandler); 36 | when(mockJsonHandler.isJson(any())).thenReturn(false); 37 | } 38 | 39 | @BeforeEach 40 | public void setUpEach() { 41 | // Global configuration 42 | ConfigMain.ALERTS_COORDINATES_ENABLE = true; 43 | ConfigMain.ALERTS_COORDINATES_HIDE_ENABLE = true; 44 | ConfigMain.ALERTS_COORDINATES_HIDE_FORMAT_TEXT = "&k%coordinate%"; 45 | ConfigMain.ALERTS_COORDINATES_HIDE_COUNT = 3; 46 | ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_ENABLE = true; 47 | ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_CHARACTER = "?"; 48 | ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_FIXEDLENGTH = 4; 49 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_X = false; 50 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Y = false; 51 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Z = false; 52 | } 53 | 54 | @Test 55 | public void testCoordinatesDisabled() { 56 | // Configuration 57 | ConfigMain.ALERTS_COORDINATES_ENABLE = false; 58 | 59 | // Test 60 | assertEquals(COORDINATES, coordinateUtils.replaceCoordinates(COORDINATES, location, false)); 61 | } 62 | 63 | @Test 64 | public void testCoordinatesNormal() { 65 | // Configuration 66 | ConfigMain.ALERTS_COORDINATES_HIDE_ENABLE = false; 67 | 68 | // Test 69 | assertEquals("1,-2,3", coordinateUtils.replaceCoordinates(COORDINATES, location, true)); 70 | } 71 | 72 | @Test 73 | public void testCoordinatesObfuscate() { 74 | // Test 1 75 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_X = true; 76 | assertEquals("&k????,-2,3", coordinateUtils.replaceCoordinates(COORDINATES, location, true)); 77 | 78 | // Test 2 79 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Y = true; 80 | assertEquals("&k????,&k????,3", coordinateUtils.replaceCoordinates(COORDINATES, location, true)); 81 | 82 | // Test 3 83 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Z = true; 84 | assertEquals("&k????,&k????,&k????", coordinateUtils.replaceCoordinates(COORDINATES, location, true)); 85 | 86 | // Test 4 87 | ConfigMain.ALERTS_COORDINATES_HIDE_OBFUSCATION_FIXEDLENGTH = 0; 88 | assertEquals("&k?,&k?,&k?", coordinateUtils.replaceCoordinates(COORDINATES, location, true)); 89 | } 90 | 91 | @Test 92 | public void testCoordinatesObfuscateRandomize() { 93 | // Configuration 94 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_X = true; 95 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Y = true; 96 | ConfigMain.ALERTS_COORDINATES_HIDE_HIDE_Z = true; 97 | 98 | // Test 1 99 | ConfigMain.ALERTS_COORDINATES_HIDE_COUNT = 1; 100 | assertEquals(countObfuscations(coordinateUtils.replaceCoordinates(COORDINATES, location, true)), 1); 101 | 102 | // Test 2 103 | ConfigMain.ALERTS_COORDINATES_HIDE_COUNT = 2; 104 | assertEquals(countObfuscations(coordinateUtils.replaceCoordinates(COORDINATES, location, true)), 2); 105 | 106 | // Test 3 107 | ConfigMain.ALERTS_COORDINATES_HIDE_COUNT = 3; 108 | assertEquals(countObfuscations(coordinateUtils.replaceCoordinates(COORDINATES, location, true)), 3); 109 | } 110 | 111 | private int countObfuscations(String result) { 112 | int ret = 0; 113 | for (String str : result.split(",")) { 114 | if ("&k????".equals(str)) 115 | ret++; 116 | } 117 | return ret; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /common/src/main/java/com/alessiodp/oreannouncer/common/commands/sub/CommandWhitelist.java: -------------------------------------------------------------------------------- 1 | package com.alessiodp.oreannouncer.common.commands.sub; 2 | 3 | import com.alessiodp.core.common.ADPPlugin; 4 | import com.alessiodp.core.common.commands.utils.ADPMainCommand; 5 | import com.alessiodp.core.common.commands.utils.CommandData; 6 | import com.alessiodp.core.common.user.User; 7 | import com.alessiodp.oreannouncer.common.OreAnnouncerPlugin; 8 | import com.alessiodp.oreannouncer.common.commands.list.CommonCommands; 9 | import com.alessiodp.oreannouncer.common.commands.utils.OACommandData; 10 | import com.alessiodp.oreannouncer.common.commands.utils.OASubCommand; 11 | import com.alessiodp.oreannouncer.common.configuration.data.ConfigMain; 12 | import com.alessiodp.oreannouncer.common.configuration.data.Messages; 13 | import com.alessiodp.oreannouncer.common.players.objects.OAPlayerImpl; 14 | import com.alessiodp.oreannouncer.common.utils.OreAnnouncerPermission; 15 | import lombok.NonNull; 16 | 17 | import java.util.Collections; 18 | import java.util.List; 19 | 20 | public class CommandWhitelist extends OASubCommand { 21 | 22 | public CommandWhitelist(ADPPlugin plugin, ADPMainCommand mainCommand) { 23 | super( 24 | plugin, 25 | mainCommand, 26 | CommonCommands.WHITELIST, 27 | OreAnnouncerPermission.ADMIN_WHITELIST, 28 | ConfigMain.COMMANDS_SUB_WHITELIST, 29 | true 30 | ); 31 | 32 | syntax = String.format("%s [%s/%s] <%s>", 33 | baseSyntax(), 34 | ConfigMain.COMMANDS_MISC_ADD, 35 | ConfigMain.COMMANDS_MISC_REMOVE, 36 | ConfigMain.COMMANDS_MISC_PLAYER 37 | ); 38 | 39 | description = Messages.HELP_CMD_DESCRIPTIONS_WHITELIST; 40 | help = Messages.HELP_CMD_WHITELIST; 41 | } 42 | 43 | @Override 44 | public boolean preRequisites(CommandData commandData) { 45 | return handlePreRequisitesWithPermission(commandData); 46 | } 47 | 48 | @Override 49 | public void onCommand(CommandData commandData) { 50 | User sender = commandData.getSender(); 51 | OAPlayerImpl player = ((OACommandData) commandData).getPlayer(); 52 | 53 | // Command handling 54 | OAPlayerImpl targetPlayer; 55 | CommandType commandType = CommandType.TOGGLE; 56 | if (commandData.getArgs().length == 2) { 57 | // Toggle 58 | targetPlayer = playerLookup(commandData.getArgs()[1]); 59 | if (targetPlayer == null) { 60 | sendMessage(sender, player, Messages.OREANNOUNCER_COMMON_PLAYER_NOT_FOUND 61 | .replace("%player%", commandData.getArgs()[1])); 62 | return; 63 | } 64 | } else if (commandData.getArgs().length == 3) { 65 | // Add or remove 66 | if (commandData.getArgs()[1].equalsIgnoreCase(ConfigMain.COMMANDS_MISC_ADD)) 67 | commandType = CommandType.ADD; 68 | else if (commandData.getArgs()[1].equalsIgnoreCase(ConfigMain.COMMANDS_MISC_REMOVE)) 69 | commandType = CommandType.REMOVE; 70 | else { 71 | sendMessage(sender, player, Messages.OREANNOUNCER_SYNTAX_WRONGMESSAGE 72 | .replace("%syntax%", syntax)); 73 | return; 74 | } 75 | 76 | targetPlayer = playerLookup(commandData.getArgs()[2]); 77 | if (targetPlayer == null) { 78 | sendMessage(sender, player, Messages.OREANNOUNCER_COMMON_PLAYER_NOT_FOUND 79 | .replace("%player%", commandData.getArgs()[2])); 80 | return; 81 | } 82 | } else { 83 | sendMessage(sender, player, Messages.OREANNOUNCER_SYNTAX_WRONGMESSAGE 84 | .replace("%syntax%", syntax)); 85 | return; 86 | } 87 | 88 | // Command starts 89 | boolean toggledValue; 90 | switch (commandType) { 91 | case ADD: 92 | toggledValue = true; 93 | break; 94 | case REMOVE: 95 | toggledValue = false; 96 | break; 97 | case TOGGLE: 98 | default: 99 | toggledValue = !targetPlayer.isWhitelisted(); 100 | break; 101 | } 102 | 103 | targetPlayer.setWhitelisted(toggledValue); 104 | 105 | if (toggledValue) { 106 | sendMessage(sender, player, ((OreAnnouncerPlugin) plugin).getMessageUtils().convertPlayerPlaceholders(Messages.CMD_WHITELIST_ADDED, targetPlayer)); 107 | } else { 108 | sendMessage(sender, player, ((OreAnnouncerPlugin) plugin).getMessageUtils().convertPlayerPlaceholders(Messages.CMD_WHITELIST_REMOVED, targetPlayer)); 109 | } 110 | } 111 | 112 | @Override 113 | public List onTabComplete(@NonNull User sender, String[] args) { 114 | if (args.length == 2) 115 | return plugin.getCommandManager().getCommandUtils().tabCompletePlayerList(args, 1); 116 | else if (args.length == 3) 117 | return plugin.getCommandManager().getCommandUtils().tabCompletePlayerList(args, 2); 118 | return Collections.emptyList(); 119 | } 120 | 121 | private enum CommandType { 122 | TOGGLE, ADD, REMOVE 123 | } 124 | } 125 | --------------------------------------------------------------------------------