From 02416f4969b8fff6fd36240b4f863d67d3c2b606 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 26 Nov 2023 16:40:01 +0100 Subject: [PATCH 1/5] Refresh some code, add auto checkstyle fix, add git related files and refresh old readme. --- .github/CODE_OF_CONDUCT.md | 128 +++++++++++ .github/CONTRIBUTING.md | 75 +++++++ .github/ISSUE_TEMPLATE/bug-report.md | 34 +++ .github/ISSUE_TEMPLATE/feature-request.md | 28 +++ .github/PULL_REQUEST_TEMPLATE.md | 37 +++ .github/workflows/gradle.yml | 45 ++-- README.md | 47 ++-- build.gradle.kts | 54 +++-- checkstyle/checkstyle.xml | 211 ++++++++++++++++++ checkstyle/suppressions.xml | 9 + renovate.json | 12 +- .../eternalcode/friends/EternalFriends.java | 47 ++-- .../configuration/CommandConfigurator.java | 16 +- .../command/handler/PermissionMessage.java | 4 +- .../implementation/FriendKickCommand.java | 2 +- .../implementation/FriendListCommand.java | 3 +- .../friends/config/ConfigManager.java | 16 +- .../config/implementation/CloseItem.java | 14 +- .../config/implementation/ConfigItemImpl.java | 17 +- .../implementation/ExampleConfigItem.java | 14 +- .../config/implementation/GuiConfig.java | 130 +++++------ .../config/implementation/MessagesConfig.java | 30 +-- .../config/implementation/PluginConfig.java | 14 +- .../database/FriendDatabaseService.java | 47 ++-- .../IgnoredPlayerDatabaseService.java | 46 ++-- .../database/InviteDatabaseService.java | 48 ++-- .../friends/friend/FriendManager.java | 4 +- .../eternalcode/friends/gui/ConfirmGui.java | 14 +- .../com/eternalcode/friends/gui/MainGui.java | 68 +++--- .../friends/gui/ReceivedInvitesGui.java | 58 +++-- .../friends/invite/InviteManager.java | 12 +- .../listener/AnnounceJoinListener.java | 2 +- .../listener/AsyncPlayerChatListener.java | 6 +- .../friends/packet/AbstractPacket.java | 27 ++- .../friends/packet/NameTagService.java | 72 +++--- .../WrapperPlayServerScoreboardTeam.java | 45 ++-- .../friends/util/AdventureUtil.java | 8 +- .../friends/util/legacy/Legacy.java | 16 +- .../util/legacy/LegacyColorProcessor.java | 2 +- 39 files changed, 1005 insertions(+), 457 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 checkstyle/checkstyle.xml create mode 100644 checkstyle/suppressions.xml diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2c08024 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +https://discord.gg/FQ7jmGBd6c. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..30f6b26 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,75 @@ +# Contributing to EternalFriends + +:Wave: Hello there! +We wholeheartedly welcome all contributions to EternalFriends and are excited to know you are considering making one. + +To ensure a robust and ideal solution, we recommend going through this guide. +Following this guide saves both your time, +and some of our core contributors are engaged in maintaining the project and reviewing proposals. + +## Submitting Bug Reports and Feature Requests + +- Before submitting a bug report or a feature request, please ensure you've done a thorough search on + our [Issues tab](https://github.com/EternalCodeTeam/EternalFriends/issues) to ensure it wasn't previously reported or + requested. + +- Our [issue template](https://github.com/EternalCodeTeam/EternalFriends/issues/new) is designed to guide you in submitting + a detailed report, which helps us greatly in understanding, recreating, and addressing the issue. + +- For feature proposals, kindly submit them under our [Issues tab](https://github.com/EternalCodeTeam/EternalFriends/issues) + using the `enhancement` tag. Describe the feature, specifying why you think it is beneficial. It would be great if you + could elaborate on its expected behavior. + +## Sending a Pull Request + +1. For significant changes, open an issue for discussion before starting your work. + +2. Fork the repository to your account. + +3. Clone the repository: + + ```bash + git clone https://github.com/EternalCodeTeam/EternalFriends.git + ``` + +4. Create a new branch: + + ```bash + git checkout -b name-your-branch-here + ``` + +5. Make the necessary changes/additions in the code. + +6. Commit the changes: + + ```bash + git commit -m "Add a detailed commit message here" + ``` + +7. Push the code back to the repository: + + ```bash + git push origin name-your-branch-here + ``` + +8. Open a pull request (PR) against the `master` branch of our repository. Describe your changes, why you believe they + are necessary, and how they improve the project. Additionally, reference any related issues. + +9. Our maintainers will review your PR. We might suggest some changes, improvements or reasoning on why the changes + should be/not being made. + +Remember, to code reviews function as a quality control and learning opportunity. +Be receptive to the suggestions made +and committed to making the suggested improvements. + +## Code of Conduct + +By participating in this project, you are expected to uphold our [Code of Conduct](.github/CODE_OF_CONDUCT.md). + +## Getting Help + +If you need help with making a contribution or using our project, please feel free to ask on +our [Discord server](https://discord.gg/FQ7jmGBd6c). +We are always happy to assist those who show an endeavor to learn! + +Thank you once again for your interest in contributing to EternalFriends and making our project even better! diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..2faad04 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,34 @@ +--- +name: Bug Report +about: Create a detailed report to help us fix a bug +labels: '๐Ÿ› bug' +--- + +# EternalFriends Bug Report + +## Describe the Bug + +Please provide a clear and comprehensive description of what the bug is. If possible, include steps to reproduce it. + +## Expected Behavior + +A description of the expected behavior is requested. + +## Screenshots + +If applicable, adding screenshots can help to explain the problem. + +## Environment Information + +- Minecraft Version: +- EternalFriends Version: +- Server Platform (e.g., Paper, Spigot): +- Server Version: +- Java Version: + +## Additional Context + +Any additional context, information, or data that might be relevant to this bug report is welcomed here. + +**Remember, the more information provided, the more likely the issue can be understood, diagnosed, and effectively +addressed expediently.** diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..73e68ab --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,28 @@ +--- +name: Feature Request +about: For suggesting an idea for this project +labels: '๐Ÿ†• feature' +--- + +# EternalFriends Feature Request + +## Summary + +A brief summary of the feature request is desired. Kindly specify the problem it addresses or the value it adds. + +## Solution Description + +A detailed description of the proposed solution is appreciated. +Details regarding its workings and visual representation are requested. + +## Alternatives + +Any considerations of alternative solutions or features? If so, their description is appreciated here. + +## Additional Context + +Any additional information (mock-ups, links to similar solutions in other plugins/games, etc.), +related to the feature request can be provided here. + +**Remember, the provision of comprehensive information enhances the understanding and evaluation of the requested +feature.** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..fb6b1e5 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,37 @@ +## Description + +Please provide a brief summary of the changes made in this PR. Include references to any related issues or discussions, +if relevant. + +Example: "This PR resolves issue #10. The issue addressed..." + +## What kind of change does this PR introduce? (Check at least one) + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update +- [ ] Refactor +- [ ] Build related changes +- [ ] Documentation code +- [ ] Other, please describe: + +Make sure your PR fulfills these requirements: + +- [ ] Tests for the changes have been added (where possible) +- [ ] Documentation (README.md, CONTRIBUTING.md) has been updated, if needed +- [ ] All new and existing tests have passed + + +## Other Information + +Please provide any additional information that you think may be relevant to this PR. + +## Checklist + +By submitting this PR, you confirm that you have completed the following: + +- [ ] I have read and understand the [CONTRIBUTING Guide](CONTRIBUTING.md) +- [ ] I have checked that no existing PRs fulfill my requirements and appear to be duplicates +- [ ] The PR title follows the guidelines defined in the contributing guide +- [ ] All tests pass locally with my changes (if applicable) +- [ ] I have performed a self-review of my own code diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 27a7f63..c9838bf 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -2,37 +2,40 @@ name: Java CI with Gradle on: push: - branches: [ "master" ] + branches: + - master pull_request: - branches: [ "master" ] jobs: build: - runs-on: ubuntu-latest - + strategy: + matrix: + java: + - 17 + fail-fast: false steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v3 + - name: Checkout + uses: actions/checkout@v4.1.0 + - name: 'Set up JDK ${{ matrix.java }}' + uses: actions/setup-java@v3.13.0 with: - java-version: '17' - distribution: 'temurin' - cache: gradle - - uses: actions/cache@v3 + distribution: adopt + java-version: '${{ matrix.java }}' + - name: Cache Gradle + uses: actions/cache@v3.3.2 with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- + path: ~/.gradle/caches + key: >- + ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', + '**/gradle-wrapper.properties') }} + restore-keys: '${{ runner.os }}-gradle-' - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Build with Gradle - run: ./gradlew clean shadowJar + - name: Build the Jar + run: './gradlew clean shadowJar' - name: Upload a Build Artifact uses: actions/upload-artifact@v3.1.3 with: - name: 'EternalFriends.jar' - path: build/libs/EternalFriends* \ No newline at end of file + name: 'EternalFriends' + path: build/libs/EternalFriends*.jar \ No newline at end of file diff --git a/README.md b/README.md index 89e1697..0a34fcc 100644 --- a/README.md +++ b/README.md @@ -14,27 +14,40 @@ -# Building +## About EternalFriends -To build EternalFriends do the following (Make sure you have JDK 17 or higher) +EternalFriends is a plugin that allows you to manage your friends' list. It is a comprehensive solution that provides +perfect friends system in your Minecraft server. -``` -./gradlew shadowJar -``` +## Plugin preview -- #### Output file will be located at build/libs +TODO here! -# Contributing +## Permission Assignments -Create a public EternalFriends fork, make changes and then create a Pull Request -See [CONTRIBUTING.md](https://github.com/EternalCodeTeam/EternalCore/blob/master/.github/CONTRIBUTING.md) to find out -more. +| Permission | Description | Sub-permissions | +|-------------------------------|----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **eternalfriends.access.all** | Gives access to all basic command functionality. By default, this is assigned to server operators. | **eternalfriends.access.gui**, **eternalfriends.access.accept**, **eternalfriends.access.deny**, **eternalfriends.access.help**, **eternalfriends.access.ignore**, **eternalfriends.access.invite**, **eternalfriends.access.kick**, **eternalfriends.access.list** | +| **eternalfriends.admin.all** | Gives access to all administrative commands. By default, this is assigned to server operators. | **eternalfriends.admin.list**, **eternalfriends.admin.reload** | -# Other Dependencies usages +## For Developers -- [LiteCommands (by Rollczi โค )](https://github.com/Rollczi/LiteCommands) -- [Spigot API](https://www.spigotmc.org/wiki/spigot-gradle/) -- [Adventure](https://docs.adventure.kyori.net/) -- [CDN](https://github.com/dzikoysk/cdn) -- [bStats](https://bstats.org/) -- [TriumphGUI](https://github.com/TriumphTeam/triumph-gui) +Details on how to contribute, build process and more can be found below. + +### Build Process + +Use the command `./gradlew shadowJar` to build the project. + +The output file `EternalFriends-.jar` will be located in the `build/libs` directory. + +### Contributions + +We wholeheartedly welcome your contributions to EternalFriends! Please refer to +our [contribution guidelines](.github/CONTRIBUTING.md) for detailed procedures on how you can contribute, and +our [code of conduct](./.github/CODE_OF_CONDUCT.md) to ensure a harmonious and welcoming community. + +### Issue Reporting + +Experiencing an issue with the plugin? Report it under +our [Issues tab](https://github.com/EternalCodeTeam/EternalFriends/issues). Be sure to provide maximum information, such as +your Minecraft version, plugin version, and relevant error messages or logs for an efficient diagnosis. \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 64c806e..39714c8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,11 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import net.minecrell.pluginyml.bukkit.BukkitPluginDescription.Permission.Default; +import net.minecrell.pluginyml.bukkit.BukkitPluginDescription.Permission.Default plugins { - id("java") + `java-library` + checkstyle + + id("org.openrewrite.rewrite") version("6.5.6") + id("com.github.johnrengelman.shadow") version "8.1.1" id("net.minecrell.plugin-yml.bukkit") version "0.6.0" id("xyz.jpenilla.run-paper") version "2.2.2" @@ -11,19 +14,32 @@ plugins { group = "com.eternalcode" version = "1.0.0" +rewrite { + activeRecipe("org.openrewrite.staticanalysis.CodeCleanup") +} + repositories { gradlePluginPortal() mavenCentral() - mavenLocal() maven { url = uri("https://papermc.io/repo/repository/maven-public/") } maven { url = uri("https://repo.panda-lang.org/releases") } maven { url = uri("https://repo.dmulloy2.net/repository/public/") } } +checkstyle { + toolVersion = "10.12.4" + + configFile = file("${rootDir}/checkstyle/checkstyle.xml") + configProperties["checkstyle.suppressions.file"] = "${rootDir}/checkstyle/suppressions.xml" + + maxErrors = 0 + maxWarnings = 0 +} + dependencies { // spigot api - compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") + compileOnly("org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT") // kyori adventure implementation("net.kyori:adventure-platform-bukkit:4.3.1") @@ -32,7 +48,7 @@ dependencies { // litecommands implementation("dev.rollczi.litecommands:bukkit-adventure:2.8.9") - // cdn + // cdn // TODO: Move to okaeri configs. implementation("net.dzikoysk:cdn:1.14.4") // bstats @@ -41,17 +57,17 @@ dependencies { // triumph gui implementation("dev.triumphteam:triumph-gui:3.1.7") - // HikariCP + // Database implementation("com.zaxxer:HikariCP:5.1.0") - - // MySQL implementation("com.mysql:mysql-connector-j:8.2.0") - // protocollib + // ProtocolLib for managing friendship nametag's compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0") + + rewrite("org.openrewrite.recipe:rewrite-static-analysis:1.1.0") } -tasks.withType { +tasks.compileJava { options.encoding = "UTF-8" } @@ -92,7 +108,7 @@ java { toolchain.languageVersion.set(JavaLanguageVersion.of(17)) } -tasks.withType { +tasks.shadowJar { archiveFileName.set("EternalFriends v${project.version}.jar") exclude( @@ -102,8 +118,10 @@ tasks.withType { "javax/**", ) + dependsOn("rewriteRun") + dependsOn("test") + mergeServiceFiles() - minimize() val prefix = "com.eternalcode.friends.libs" @@ -115,13 +133,15 @@ tasks.withType { "net.kyori", "dev.rollczi", "dev.triumphteam", - ).forEach { pack -> - relocate(pack, "$prefix.$pack") - } + ).forEach { relocate(it, prefix) } } tasks { runServer { - minecraftVersion("1.19.4") + minecraftVersion("1.20.1") + + downloadPlugins { + hangar("protocolib", "5.1.0") + } } } \ No newline at end of file diff --git a/checkstyle/checkstyle.xml b/checkstyle/checkstyle.xml new file mode 100644 index 0000000..496904e --- /dev/null +++ b/checkstyle/checkstyle.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/checkstyle/suppressions.xml b/checkstyle/suppressions.xml new file mode 100644 index 0000000..ab199b4 --- /dev/null +++ b/checkstyle/suppressions.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/renovate.json b/renovate.json index 61c1e36..4e2b878 100644 --- a/renovate.json +++ b/renovate.json @@ -15,7 +15,15 @@ "matchPackagePatterns": [ "*" ] + }, + { + "groupName": "spigot dependencies", + "groupSlug": "spigotmc", + "matchPackagePatterns": [ + "org.spigotmc*" + ] } ], - "separateMajorMinor": false -} + "separateMajorMinor": true, + "pruneStaleBranches": true +} \ No newline at end of file diff --git a/src/main/java/com/eternalcode/friends/EternalFriends.java b/src/main/java/com/eternalcode/friends/EternalFriends.java index fde277e..8d1edab 100644 --- a/src/main/java/com/eternalcode/friends/EternalFriends.java +++ b/src/main/java/com/eternalcode/friends/EternalFriends.java @@ -29,8 +29,8 @@ import com.eternalcode.friends.listener.AnnounceJoinListener; import com.eternalcode.friends.listener.AsyncPlayerChatListener; import com.eternalcode.friends.listener.EntityDamageByEntityListener; -import com.eternalcode.friends.packet.NameTagService; import com.eternalcode.friends.listener.NametagJoinQuitListener; +import com.eternalcode.friends.packet.NameTagService; import com.eternalcode.friends.util.legacy.LegacyColorProcessor; import com.zaxxer.hikari.HikariDataSource; import dev.rollczi.litecommands.LiteCommands; @@ -45,7 +45,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; -import panda.std.stream.PandaStream; import java.util.stream.Stream; @@ -114,37 +113,37 @@ public void onEnable() { this.mainGui = new MainGui(this.miniMessage, this.guiConfig, this, this.announcer, this.messages, this.inviteManager, this.friendManager, this.nameTagService); Stream.of( - new NametagJoinQuitListener(this.protocolManager, this.nameTagService, this.friendManager), - new AnnounceJoinListener(this.config, this.messages, this.friendManager, this.announcer), - new EntityDamageByEntityListener(this.friendManager), - new AsyncPlayerChatListener(this.announcer, this.messages, this.friendManager) + new NametagJoinQuitListener(this.protocolManager, this.nameTagService, this.friendManager), + new AnnounceJoinListener(this.config, this.messages, this.friendManager, this.announcer), + new EntityDamageByEntityListener(this.friendManager), + new AsyncPlayerChatListener(this.announcer, this.messages, this.friendManager) ).forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this)); - Metrics metrics = new Metrics(this, 16297); + new Metrics(this, 16297); this.liteCommands = LitePaperAdventureFactory.builder(server, "eternalfriends") - .argument(Player.class, new BukkitPlayerArgument<>(server, this.messages.argument.playerNotFound)) + .argument(Player.class, new BukkitPlayerArgument<>(server, this.messages.argument.playerNotFound)) - .invalidUsageHandler(new InvalidUsage(this.messages, this.announcer)) - .permissionHandler(new PermissionMessage(this.messages, this.announcer)) + .invalidUsageHandler(new InvalidUsage(this.messages, this.announcer)) + .permissionHandler(new PermissionMessage(this.messages, this.announcer)) - .contextualBind(Player.class, new BukkitOnlyPlayerContextual<>(this.messages.argument.playerOnly)) + .contextualBind(Player.class, new BukkitOnlyPlayerContextual<>(this.messages.argument.playerOnly)) - .commandInstance( - new FriendCommand(this.mainGui), - new FriendAcceptCommand(this.announcer, this.inviteManager, this.messages, this.nameTagService, this.friendManager), - new FriendDenyCommand(this.announcer, this.inviteManager, this.messages), - new FriendInviteCommand(this.announcer, this.inviteManager, this.messages, this.friendManager), - new FriendListCommand(this.announcer, this.messages, this.getServer(), this.friendManager), - new FriendKickCommand(this.announcer, this.messages, this.nameTagService, this.friendManager), - new FriendIgnoreCommand(this.announcer, this.messages, this.friendManager), - new FriendHelpCommand(this.announcer, this.messages), - new FriendReloadCommand(this.announcer, this.messages, this.configManager) - ) + .commandInstance( + new FriendCommand(this.mainGui), + new FriendAcceptCommand(this.announcer, this.inviteManager, this.messages, this.nameTagService, this.friendManager), + new FriendDenyCommand(this.announcer, this.inviteManager, this.messages), + new FriendInviteCommand(this.announcer, this.inviteManager, this.messages, this.friendManager), + new FriendListCommand(this.announcer, this.messages, this.getServer(), this.friendManager), + new FriendKickCommand(this.announcer, this.messages, this.nameTagService, this.friendManager), + new FriendIgnoreCommand(this.announcer, this.messages, this.friendManager), + new FriendHelpCommand(this.announcer, this.messages), + new FriendReloadCommand(this.announcer, this.messages, this.configManager) + ) - .commandEditor("friends", new CommandConfigurator(this.config)) + .commandEditor("friends", new CommandConfigurator(this.config)) - .register(); + .register(); } @Override diff --git a/src/main/java/com/eternalcode/friends/command/configuration/CommandConfigurator.java b/src/main/java/com/eternalcode/friends/command/configuration/CommandConfigurator.java index bfc3952..8a769b1 100644 --- a/src/main/java/com/eternalcode/friends/command/configuration/CommandConfigurator.java +++ b/src/main/java/com/eternalcode/friends/command/configuration/CommandConfigurator.java @@ -16,13 +16,13 @@ public State edit(State state) { PluginConfig.SubCommand subCommandsCfg = config.friendCommand.subCommands; return state - .name(config.friendCommand.main) - .editChild("kick", child -> child.name(subCommandsCfg.kick)) - .editChild("accept", child -> child.name(subCommandsCfg.accept)) - .editChild("deny", child -> child.name(subCommandsCfg.deny)) - .editChild("list", child -> child.name(subCommandsCfg.list)) - .editChild("help", child -> child.name(subCommandsCfg.help)) - .editChild("ignore", child -> child.name(subCommandsCfg.ignore)) - .editChild("invite", child -> child.name(subCommandsCfg.invite)); + .name(config.friendCommand.main) + .editChild("kick", child -> child.name(subCommandsCfg.kick)) + .editChild("accept", child -> child.name(subCommandsCfg.accept)) + .editChild("deny", child -> child.name(subCommandsCfg.deny)) + .editChild("list", child -> child.name(subCommandsCfg.list)) + .editChild("help", child -> child.name(subCommandsCfg.help)) + .editChild("ignore", child -> child.name(subCommandsCfg.ignore)) + .editChild("invite", child -> child.name(subCommandsCfg.invite)); } } diff --git a/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java b/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java index 69afb91..8b17de1 100644 --- a/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java +++ b/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java @@ -24,7 +24,7 @@ public void handle(CommandSender sender, LiteInvocation invocation, RequiredPerm Player player = (Player) sender; this.announcer.announceMessage(player.getUniqueId(), this.messages.argument.missingPermission.replace("{permission}", Joiner.on(", ") - .join(requiredPermissions.getPermissions()) - .toString())); + .join(requiredPermissions.getPermissions()) + .toString())); } } diff --git a/src/main/java/com/eternalcode/friends/command/implementation/FriendKickCommand.java b/src/main/java/com/eternalcode/friends/command/implementation/FriendKickCommand.java index 918db09..a5af292 100644 --- a/src/main/java/com/eternalcode/friends/command/implementation/FriendKickCommand.java +++ b/src/main/java/com/eternalcode/friends/command/implementation/FriendKickCommand.java @@ -32,7 +32,7 @@ public FriendKickCommand(NotificationAnnouncer announcer, MessagesConfig message @Execute(route = "kick", required = 1) @Permission("eternalfriends.access.kick") - public void kick(Player sender, @Arg @Name("player") Player target){ + public void kick(Player sender, @Arg @Name("player") Player target) { UUID senderUuid = sender.getUniqueId(); UUID targetUuid = target.getUniqueId(); diff --git a/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java b/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java index d8ba899..40d1e17 100644 --- a/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java +++ b/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java @@ -66,8 +66,7 @@ private String listOfFriends(UUID uuid, boolean adminMode) { if (adminMode) { builder.append(friendsConfig.friendListHeaderAdmin.replace("{player}", server.getOfflinePlayer(uuid).getName())); - } - else { + } else { builder.append(friendsConfig.friendListHeader); } diff --git a/src/main/java/com/eternalcode/friends/config/ConfigManager.java b/src/main/java/com/eternalcode/friends/config/ConfigManager.java index 4cffeec..26a9b4a 100644 --- a/src/main/java/com/eternalcode/friends/config/ConfigManager.java +++ b/src/main/java/com/eternalcode/friends/config/ConfigManager.java @@ -9,13 +9,11 @@ public class ConfigManager { - private final ConfigBackupService configBackupService; - private static final Cdn CDN = CdnFactory - .createYamlLike() - .getSettings() - .build(); - + .createYamlLike() + .getSettings() + .build(); + private final ConfigBackupService configBackupService; private final Set configs = new HashSet<>(); private final File dataFolder; @@ -26,17 +24,17 @@ public ConfigManager(File dataFolder, ConfigBackupService configBackupService) { public void load(T config) { CDN.load(config.resource(this.dataFolder), config) - .orThrow(RuntimeException::new); + .orThrow(RuntimeException::new); CDN.render(config, config.resource(this.dataFolder)) - .orThrow(RuntimeException::new); + .orThrow(RuntimeException::new); this.configs.add(config); } public void save(T config) { CDN.render(config, config.resource(this.dataFolder)) - .orThrow(RuntimeException::new); + .orThrow(RuntimeException::new); } public void reload() { diff --git a/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java b/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java index cc2264d..e450c45 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java @@ -18,8 +18,8 @@ public class CloseItem implements ConfigItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() - .postProcessor(new LegacyColorProcessor()) - .build(); + .postProcessor(new LegacyColorProcessor()) + .build(); public Material type = Material.STONE; @@ -34,11 +34,11 @@ public class CloseItem implements ConfigItem { @Override public GuiItem toGuiItem() { return ItemBuilder.from(this.type) - .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) - .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .flags(ItemFlag.HIDE_ATTRIBUTES) - .flags(ItemFlag.HIDE_ENCHANTS) - .asGuiItem(); + .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) + .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .flags(ItemFlag.HIDE_ATTRIBUTES) + .flags(ItemFlag.HIDE_ENCHANTS) + .asGuiItem(); } @Override diff --git a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java b/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java index 80afacc..29eb35e 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java @@ -9,6 +9,7 @@ import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; + import java.util.List; @Contextual @@ -16,8 +17,8 @@ public class ConfigItemImpl implements ConfigItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() - .postProcessor(new LegacyColorProcessor()) - .build(); + .postProcessor(new LegacyColorProcessor()) + .build(); public Material type = Material.STONE; @@ -27,11 +28,11 @@ public class ConfigItemImpl implements ConfigItem { public GuiItem toGuiItem() { return ItemBuilder.from(this.type) - .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) - .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .flags(ItemFlag.HIDE_ATTRIBUTES) - .flags(ItemFlag.HIDE_ENCHANTS) - .asGuiItem(); + .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) + .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .flags(ItemFlag.HIDE_ATTRIBUTES) + .flags(ItemFlag.HIDE_ENCHANTS) + .asGuiItem(); } @Override @@ -51,4 +52,4 @@ public ConfigItemImpl setLore(List lore) { this.lore = lore; return this; } -} \ No newline at end of file +} diff --git a/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java b/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java index d0291e5..769ce86 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java @@ -18,8 +18,8 @@ public class ExampleConfigItem implements ConfigItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() - .postProcessor(new LegacyColorProcessor()) - .build(); + .postProcessor(new LegacyColorProcessor()) + .build(); @Description("# Material from https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html") public Material type = Material.STONE; @@ -32,11 +32,11 @@ public class ExampleConfigItem implements ConfigItem { public GuiItem toGuiItem() { return ItemBuilder.from(this.type) - .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) - .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .flags(ItemFlag.HIDE_ATTRIBUTES) - .flags(ItemFlag.HIDE_ENCHANTS) - .asGuiItem(); + .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) + .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .flags(ItemFlag.HIDE_ATTRIBUTES) + .flags(ItemFlag.HIDE_ENCHANTS) + .asGuiItem(); } @Override diff --git a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java index b3dff2c..4186974 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java @@ -12,96 +12,96 @@ public class GuiConfig implements ReloadableConfig { + public MenuItems menuItems = new MenuItems(); + public Guis guis = new Guis(); + @Override public Resource resource(File folder) { return Source.of(folder, "gui.yml"); } - public MenuItems menuItems = new MenuItems(); - public Guis guis = new Guis(); - @Contextual public static class MenuItems { @Description("# options of {status} placeholder") public OnlineStatus onlineStatus = new OnlineStatus(); public FriendHead friendListHead = new FriendHead().setName("{status} &f{friend_name}") - .setLore(List.of("", "&cClick LMB", "&cto remove a friend", "")); + .setLore(List.of("", "&cClick LMB", "&cto remove a friend", "")); public FriendHead inviteListfriendHead = new FriendHead() - .setLore(List.of("", "&aClick LMB to accept invitation", "&cClick RMB to decline invitation", "")); + .setLore(List.of("", "&aClick LMB to accept invitation", "&cClick RMB to decline invitation", "")); public ExampleConfigItem nextPageItem = new ExampleConfigItem() - .setName("&aNext page") - .setType(Material.PAPER) - .setLore(List.of( - "", - "&7Click to go to the next page", - "" - )); + .setName("&aNext page") + .setType(Material.PAPER) + .setLore(List.of( + "", + "&7Click to go to the next page", + "" + )); public ConfigItemImpl previousPageItem = new ConfigItemImpl() - .setName("&cPrevious page") - .setType(Material.PAPER) - .setLore(List.of( - "", - "&7Click to go to the previous page", - "" - )); + .setName("&cPrevious page") + .setType(Material.PAPER) + .setLore(List.of( + "", + "&7Click to go to the previous page", + "" + )); public ConfigItemImpl confirmItem = new ConfigItemImpl() - .setName("&aYes") - .setType(Material.LIME_STAINED_GLASS_PANE) - .setLore(List.of( - "", - "&7Click to confirm", - "" - )); + .setName("&aYes") + .setType(Material.LIME_STAINED_GLASS_PANE) + .setLore(List.of( + "", + "&7Click to confirm", + "" + )); public ConfigItemImpl denyItem = new ConfigItemImpl() - .setName("&cNo") - .setType(Material.RED_STAINED_GLASS_PANE) - .setLore(List.of( - "", - "&7Click to cancel", - "" - )); + .setName("&cNo") + .setType(Material.RED_STAINED_GLASS_PANE) + .setLore(List.of( + "", + "&7Click to cancel", + "" + )); public ConfigItemImpl receivedInvitesItem = new ConfigItemImpl() - .setName("&aReceived invitations") - .setType(Material.BOOK) - .setLore(List.of( - "", - "&7Click to open", - "" - )); - + .setName("&aReceived invitations") + .setType(Material.BOOK) + .setLore(List.of( + "", + "&7Click to open", + "" + )); + public ConfigItemImpl sendInvitesItem = new ConfigItemImpl() - .setName("&aSending invitations") - .setType(Material.WRITABLE_BOOK) - .setLore(List.of( - "", - "&7Click to open", - "" - )); - + .setName("&aSending invitations") + .setType(Material.WRITABLE_BOOK) + .setLore(List.of( + "", + "&7Click to open", + "" + )); + public ConfigItemImpl settingItem = new ConfigItemImpl() - .setName("&aSettings") - .setType(Material.REPEATER) - .setLore(List.of( - "", - "&7Click to open", - "" - )); - + .setName("&aSettings") + .setType(Material.REPEATER) + .setLore(List.of( + "", + "&7Click to open", + "" + )); + public ConfigItemImpl backToMainMenuItem = new ConfigItemImpl() - .setName("&7Back to main menu") - .setType(Material.ARROW) - .setLore(List.of()); - + .setName("&7Back to main menu") + .setType(Material.ARROW) + .setLore(List.of()); + public CloseItem closeItem = new CloseItem() - .setName("&cClose menu") - .setType(Material.BARRIER) - .setLore(List.of()); + .setName("&cClose menu") + .setType(Material.BARRIER) + .setLore(List.of()); } @Contextual @@ -132,4 +132,4 @@ public static class OnlineStatus { public String online = "&aโ—"; public String offline = "&7โ—"; } -} \ No newline at end of file +} diff --git a/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java index 71b7d60..8a6a5a3 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java @@ -10,14 +10,14 @@ public class MessagesConfig implements ReloadableConfig { + public Argument argument = new Argument(); + public Friends friends = new Friends(); + @Override public Resource resource(File folder) { return Source.of(folder, "messages.yml"); } - public Argument argument = new Argument(); - public Friends friends = new Friends(); - @Contextual public static class Argument { public String missingPermission = "&cYou do not have permission to use this command! &7({permission})"; @@ -56,18 +56,18 @@ public static class Friends { public String inviteExpired = "&cThe friend request from this player has expired!"; public String friendJoined = "&9{friend} &ahas joined the server!"; public List helpCommand = List.of( - " ", - " &3Friends - Commands", - " &7/friends &8- &fDisplays friend menu", - " &7/friends invite &8- &fSends a friend request", - " &7/friends accept &8- &fAccepts a friend request", - " &7/friends deny &8- &fDeclines a friend request", - " &7/friends remove &8- &fRemoves a friend from the list", - " &7/friends ignore &8- &fIgnores incoming friend requests from player or turns off ignoring", - " &7/friends help &8- &fDisplays available commands", - " &7/friends list &8- &fShows list of friends", - " &7/friends reload &8- &fReloads configuration", - " " + " ", + " &3Friends - Commands", + " &7/friends &8- &fDisplays friend menu", + " &7/friends invite &8- &fSends a friend request", + " &7/friends accept &8- &fAccepts a friend request", + " &7/friends deny &8- &fDeclines a friend request", + " &7/friends remove &8- &fRemoves a friend from the list", + " &7/friends ignore &8- &fIgnores incoming friend requests from player or turns off ignoring", + " &7/friends help &8- &fDisplays available commands", + " &7/friends list &8- &fShows list of friends", + " &7/friends reload &8- &fReloads configuration", + " " ); } } diff --git a/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java index c51d8a3..d5507db 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java @@ -12,26 +12,22 @@ public class PluginConfig implements ReloadableConfig { - @Override - public Resource resource(File folder) { - return Source.of(folder, "configuration.yml"); - } - @Description("# Configuration of Database") public Database database = new Database(); - @Description("# Color of player's name tag displayed to his friends") public ChatColor friendColor = ChatColor.BLUE; - @Description("# Does server should message displayed to player when his friend joins the server?") public boolean announceFriendJoin = true; - @Description("# Configuration of command and subcommands names") public Command friendCommand = new Command(); - @Description("# Time in seconds after which invite will expire") public int inviteExpirationTime = 60; + @Override + public Resource resource(File folder) { + return Source.of(folder, "configuration.yml"); + } + @Contextual public static class Command { public String main = "friends"; diff --git a/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java b/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java index aab743d..88b8220 100644 --- a/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java @@ -23,14 +23,14 @@ public FriendDatabaseService(DataSource dataSource) { private void initTable() { try ( - Connection connection = dataSource.getConnection(); - - PreparedStatement statement = connection.prepareStatement( - "CREATE TABLE IF NOT EXISTS eternalfriends_friends(" + - "uuid_one VARCHAR(36) NOT NULL, " + - "uuid_two VARCHAR(36) NOT NULL " + - ");" - ) + Connection connection = dataSource.getConnection(); + + PreparedStatement statement = connection.prepareStatement( + "CREATE TABLE IF NOT EXISTS eternalfriends_friends(" + + "uuid_one VARCHAR(36) NOT NULL, " + + "uuid_two VARCHAR(36) NOT NULL " + + ");" + ) ) { statement.execute(); @@ -44,11 +44,11 @@ private void initTable() { public void add(UUID uuidOne, UUID uuidTwo) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "INSERT INTO eternalfriends_friends VALUES (?, ?);" - ) + PreparedStatement statement = connection.prepareStatement( + "INSERT INTO eternalfriends_friends VALUES (?, ?);" + ) ) { statement.setString(1, uuidOne.toString()); @@ -66,13 +66,13 @@ public void add(UUID uuidOne, UUID uuidTwo) { public void remove(UUID uuidOne, UUID uuidTwo) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "DELETE FROM eternalfriends_friends " + - "WHERE uuid_one = '" + uuidOne + "' AND uuid_two = '" + uuidTwo + "' " + - "OR uuid_one = '" + uuidTwo + "' AND uuid_two = '" + uuidOne + "';" - ) + PreparedStatement statement = connection.prepareStatement( + "DELETE FROM eternalfriends_friends " + + "WHERE uuid_one = '" + uuidOne + "' AND uuid_two = '" + uuidTwo + "' " + + "OR uuid_one = '" + uuidTwo + "' AND uuid_two = '" + uuidOne + "';" + ) ) { statement.execute(); @@ -87,11 +87,11 @@ public void remove(UUID uuidOne, UUID uuidTwo) { public void load(Map> friends) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "SELECT uuid_one, uuid_two FROM eternalfriends_friends;" - ) + PreparedStatement statement = connection.prepareStatement( + "SELECT uuid_one, uuid_two FROM eternalfriends_friends;" + ) ) { ResultSet resultSet = statement.executeQuery(); @@ -104,8 +104,7 @@ public void load(Map> friends) { List newFriends = new ArrayList<>(); newFriends.add(uuidTwo); friends.put(uuidOne, newFriends); - } - else { + } else { friends.get(uuidOne).add(uuidTwo); } diff --git a/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java b/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java index 7a95d38..3447828 100644 --- a/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java @@ -1,8 +1,5 @@ package com.eternalcode.friends.database; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; @@ -26,14 +23,14 @@ public IgnoredPlayerDatabaseService(DataSource dataSource) { public void initTable() { try ( - Connection connection = dataSource.getConnection(); - - PreparedStatement statement = connection.prepareStatement( - "CREATE TABLE IF NOT EXISTS eternalfriends_ignored_players(" + - "who_ignore CHAR(36) NOT NULL, " + - "is_ignored CHAR(36) NOT NULL " + - ");" - ) + Connection connection = dataSource.getConnection(); + + PreparedStatement statement = connection.prepareStatement( + "CREATE TABLE IF NOT EXISTS eternalfriends_ignored_players(" + + "who_ignore CHAR(36) NOT NULL, " + + "is_ignored CHAR(36) NOT NULL " + + ");" + ) ) { statement.execute(); @@ -47,11 +44,11 @@ public void initTable() { public void addIgnoredPlayer(UUID ignore, UUID ignored) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "INSERT INTO eternalfriends_ignored_players VALUES (?, ?);" - ) + PreparedStatement statement = connection.prepareStatement( + "INSERT INTO eternalfriends_ignored_players VALUES (?, ?);" + ) ) { statement.setString(1, ignore.toString()); @@ -69,11 +66,11 @@ public void addIgnoredPlayer(UUID ignore, UUID ignored) { public void removeIgnoredPlayer(UUID ignore, UUID ignored) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "DELETE FROM eternalfriends_ignored_players WHERE who_ignore = '" + ignore + "' AND is_ignored = '" + ignored + "';" - ) + PreparedStatement statement = connection.prepareStatement( + "DELETE FROM eternalfriends_ignored_players WHERE who_ignore = '" + ignore + "' AND is_ignored = '" + ignored + "';" + ) ) { statement.execute(); @@ -88,11 +85,11 @@ public void removeIgnoredPlayer(UUID ignore, UUID ignored) { public void load(Map> ignoredPlayers) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "SELECT who_ignore, is_ignored FROM eternalfriends_ignored_players;" - ) + PreparedStatement statement = connection.prepareStatement( + "SELECT who_ignore, is_ignored FROM eternalfriends_ignored_players;" + ) ) { ResultSet resultSet = statement.executeQuery(); @@ -105,8 +102,7 @@ public void load(Map> ignoredPlayers) { List newIgnoredPlayers = new ArrayList<>(); newIgnoredPlayers.add(ignored); ignoredPlayers.put(ignore, newIgnoredPlayers); - } - else { + } else { ignoredPlayers.get(ignore).add(ignored); } } diff --git a/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java b/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java index aafd649..e83e168 100644 --- a/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java @@ -28,15 +28,15 @@ public InviteDatabaseService(DataSource dataSource) { public void initTable() { try ( - Connection connection = dataSource.getConnection(); - - PreparedStatement statement = connection.prepareStatement( - "CREATE TABLE IF NOT EXISTS eternalfriends_invites(" + - "uuid_from CHAR(36) NOT NULL, " + - "uuid_to CHAR(36) NOT NULL, " + - "expiration_date DATETIME NOT NULL " + - ");" - ) + Connection connection = dataSource.getConnection(); + + PreparedStatement statement = connection.prepareStatement( + "CREATE TABLE IF NOT EXISTS eternalfriends_invites(" + + "uuid_from CHAR(36) NOT NULL, " + + "uuid_to CHAR(36) NOT NULL, " + + "expiration_date DATETIME NOT NULL " + + ");" + ) ) { statement.execute(); @@ -50,11 +50,11 @@ public void initTable() { public void addInvite(Invite invite) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "INSERT INTO eternalfriends_invites VALUES (?, ?, ?);" - ) + PreparedStatement statement = connection.prepareStatement( + "INSERT INTO eternalfriends_invites VALUES (?, ?, ?);" + ) ) { statement.setString(1, invite.getFrom().toString()); @@ -71,13 +71,14 @@ public void addInvite(Invite invite) { } public void removeInvite(Invite invite) { - CompletableFuture.runAsync(() -> {}); + CompletableFuture.runAsync(() -> { + }); try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "DELETE FROM eternalfriends_invites WHERE uuid_from = '" + invite.getFrom() + "' AND uuid_to = '" + invite.getTo()+"';" - ) + PreparedStatement statement = connection.prepareStatement( + "DELETE FROM eternalfriends_invites WHERE uuid_from = '" + invite.getFrom() + "' AND uuid_to = '" + invite.getTo() + "';" + ) ) { statement.execute(); @@ -95,11 +96,11 @@ public void removeInvite(UUID from, UUID to) { public void load(Map> receivedInvites, Map> sentInvites) { CompletableFuture.runAsync(() -> { try ( - Connection connection = dataSource.getConnection(); + Connection connection = dataSource.getConnection(); - PreparedStatement statement = connection.prepareStatement( - "SELECT uuid_from, uuid_to, expiration_date FROM eternalfriends_invites;" - ) + PreparedStatement statement = connection.prepareStatement( + "SELECT uuid_from, uuid_to, expiration_date FROM eternalfriends_invites;" + ) ) { ResultSet resultSet = statement.executeQuery(); @@ -113,8 +114,7 @@ public void load(Map> receivedInvites, Map if (sentInvites.containsKey(from)) { sentInvites.get(from).add(invite); - } - else { + } else { sentInvites.put(from, new ArrayList<>(List.of(invite))); } diff --git a/src/main/java/com/eternalcode/friends/friend/FriendManager.java b/src/main/java/com/eternalcode/friends/friend/FriendManager.java index 0207135..6b326fb 100644 --- a/src/main/java/com/eternalcode/friends/friend/FriendManager.java +++ b/src/main/java/com/eternalcode/friends/friend/FriendManager.java @@ -25,8 +25,8 @@ public FriendManager(FriendDatabaseService friendDatabaseService, IgnoredPlayerD this.ignoredPlayerDatabaseService = ignoredPlayerDatabaseService; this.inviteManager = inviteManager; - this.friendDatabaseService.load(this.friends); - this.ignoredPlayerDatabaseService.load(this.ignoredPlayers); + this.friendDatabaseService.load(this.friends); + this.ignoredPlayerDatabaseService.load(this.ignoredPlayers); } public void addFriends(UUID uuid, UUID friendUUID) { diff --git a/src/main/java/com/eternalcode/friends/gui/ConfirmGui.java b/src/main/java/com/eternalcode/friends/gui/ConfirmGui.java index 66bc418..6a9c706 100644 --- a/src/main/java/com/eternalcode/friends/gui/ConfirmGui.java +++ b/src/main/java/com/eternalcode/friends/gui/ConfirmGui.java @@ -12,12 +12,10 @@ public class ConfirmGui { - private GuiConfig guiConfig; - - private final MiniMessage miniMessage; - private final static int CONFIRM_ITEM_SLOT = 11; private final static int DENY_ITEM_SLOT = 15; + private final GuiConfig guiConfig; + private final MiniMessage miniMessage; public ConfirmGui(GuiConfig guiConfig, MiniMessage miniMessage) { this.guiConfig = guiConfig; @@ -32,10 +30,10 @@ public void openInventory(Player player, Runnable onConfirm, Runnable onDeny) { denyItem.setAction(event -> onDeny.run()); Gui gui = Gui.gui() - .title(this.miniMessage.deserialize(this.guiConfig.guis.confirmGuiTitle)) - .rows(3) - .disableItemTake() - .create(); + .title(this.miniMessage.deserialize(this.guiConfig.guis.confirmGuiTitle)) + .rows(3) + .disableItemTake() + .create(); gui.getFiller().fill(ItemBuilder.from(Material.GRAY_STAINED_GLASS_PANE).name(Component.text(" ")).flags(ItemFlag.HIDE_ATTRIBUTES).asGuiItem()); diff --git a/src/main/java/com/eternalcode/friends/gui/MainGui.java b/src/main/java/com/eternalcode/friends/gui/MainGui.java index 6a7da6d..4aed45c 100644 --- a/src/main/java/com/eternalcode/friends/gui/MainGui.java +++ b/src/main/java/com/eternalcode/friends/gui/MainGui.java @@ -25,6 +25,12 @@ public class MainGui { + private static final int SETTINGS_ITEM_SLOT = 49; + private static final int NEXT_PAGE_ITEM_SLOT = 53; + private static final int BACK_PAGE_ITEM_SLOT = 45; + private static final int RECEIVED_ITEM_SLOT = 48; + private static final int CLOSE_ITEM_SLOT = 49; + private static final int SEND_ITEM_SLOT = 50; private final MiniMessage miniMessage; private final GuiConfig guiConfig; private final NotificationAnnouncer announcer; @@ -36,12 +42,6 @@ public class MainGui { private final Server server; private final FriendManager friendManager; private final NameTagService nameTagService; - private static final int SETTINGS_ITEM_SLOT = 49; - private static final int NEXT_PAGE_ITEM_SLOT = 53; - private static final int BACK_PAGE_ITEM_SLOT = 45; - private static final int RECEIVED_ITEM_SLOT = 48; - private static final int CLOSE_ITEM_SLOT = 49; - private static final int SEND_ITEM_SLOT = 50; public MainGui(MiniMessage miniMessage, @@ -69,25 +69,25 @@ public void openMainGui(Player player) { final GuiConfig.MenuItems menuItems = this.guiConfig.menuItems; PaginatedGui gui = Gui.paginated() - .title(this.miniMessage.deserialize(this.guiConfig.guis.mainGuiTitle)) - .rows(6) - .pageSize(45) - .disableItemTake() - .create(); + .title(this.miniMessage.deserialize(this.guiConfig.guis.mainGuiTitle)) + .rows(6) + .pageSize(45) + .disableItemTake() + .create(); GuiItem nextPageButton = ItemBuilder.from(Material.PAPER) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(menuItems.nextPageItem.name))) - .lore(menuItems.nextPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(event -> { - gui.next(); - }); + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(menuItems.nextPageItem.name))) + .lore(menuItems.nextPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(event -> { + gui.next(); + }); GuiItem backPageButton = ItemBuilder.from(Material.PAPER) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(menuItems.previousPageItem.name))) - .lore(menuItems.previousPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(event -> { - gui.previous(); - }); + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(menuItems.previousPageItem.name))) + .lore(menuItems.previousPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(event -> { + gui.previous(); + }); GuiItem sendInvitesItem = menuItems.sendInvitesItem.toGuiItem(); sendInvitesItem.setAction(event -> { @@ -110,7 +110,7 @@ public void openMainGui(Player player) { closeItemConfig.commandOnClick.forEach(command -> { this.server.dispatchCommand(this.server.getConsoleSender(), command - .replace("{player}", whoClicked.getName())); + .replace("{player}", whoClicked.getName())); }); }); @@ -138,14 +138,14 @@ private GuiItem generateSkull(Player player, UUID friendUuid) { boolean isFriendOnline = friend != null && friend.isOnline(); final GuiItem skull = ItemBuilder.skull() - .owner(this.server.getOfflinePlayer(friendUuid)) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(this.guiConfig.menuItems.friendListHead.name - .replace("{friend_name}", isFriendOnline ? friend.getName() : this.server.getOfflinePlayer(friendUuid).getName()) - .replace("{status}", isFriendOnline ? this.guiConfig.menuItems.onlineStatus.online : this.guiConfig.menuItems.onlineStatus.offline) - ))) - .lore(this.guiConfig.menuItems.friendListHead.lore.stream() - .map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(); + .owner(this.server.getOfflinePlayer(friendUuid)) + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(this.guiConfig.menuItems.friendListHead.name + .replace("{friend_name}", isFriendOnline ? friend.getName() : this.server.getOfflinePlayer(friendUuid).getName()) + .replace("{status}", isFriendOnline ? this.guiConfig.menuItems.onlineStatus.online : this.guiConfig.menuItems.onlineStatus.offline) + ))) + .lore(this.guiConfig.menuItems.friendListHead.lore.stream() + .map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(); skull.setAction(event -> { if (!event.isLeftClick()) { @@ -155,16 +155,16 @@ private GuiItem generateSkull(Player player, UUID friendUuid) { this.confirmGUI.openInventory(player, () -> { this.friendManager.removeFriends(player.getUniqueId(), friendUuid); - if(this.server.getOfflinePlayer(friendUuid).isOnline()) { + if (this.server.getOfflinePlayer(friendUuid).isOnline()) { this.nameTagService.updateNameTagOfTwoNoFriends(player, this.server.getPlayer(friendUuid)); } this.announcer.announceMessage(player.getUniqueId(), this.messages.friends.youKickedFriend - .replace("{player}", server.getOfflinePlayer(friendUuid).getName())); + .replace("{player}", server.getOfflinePlayer(friendUuid).getName())); if (server.getOfflinePlayer(friendUuid).isOnline()) { this.announcer.announceMessage(friendUuid, this.messages.friends.friendKickedYou - .replace("{player}", player.getName())); + .replace("{player}", player.getName())); } openMainGui(player); @@ -172,4 +172,4 @@ private GuiItem generateSkull(Player player, UUID friendUuid) { }); return skull; } -} \ No newline at end of file +} diff --git a/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java b/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java index 4c23cc2..1d6ef88 100644 --- a/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java +++ b/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java @@ -26,6 +26,9 @@ public class ReceivedInvitesGui { + private static final int NEXT_PAGE_ITEM_SLOT = 53; + private static final int BACK_PAGE_ITEM_SLOT = 45; + private static final int BACK_TO_MAIN_ITEM_SLOT = 49; private final NotificationAnnouncer announcer; private final MessagesConfig messages; private final GuiConfig guiConfig; @@ -36,10 +39,6 @@ public class ReceivedInvitesGui { private final NameTagService nameTagService; private final MessagesConfig.Friends friendsConfig; - private static final int NEXT_PAGE_ITEM_SLOT = 53; - private static final int BACK_PAGE_ITEM_SLOT = 45; - private static final int BACK_TO_MAIN_ITEM_SLOT = 49; - public ReceivedInvitesGui(NotificationAnnouncer announcer, MessagesConfig messages, GuiConfig guiConfig, @@ -62,35 +61,35 @@ public ReceivedInvitesGui(NotificationAnnouncer announcer, public void openInventory(Player player, Runnable onBack) { final GuiConfig.MenuItems menuItems = this.guiConfig.menuItems; PaginatedGui gui = Gui.paginated() - .title(this.miniMessage.deserialize(this.guiConfig.guis.receivedInvitesGuiTitle)) - .rows(6) - .pageSize(45) - .disableItemTake() - .create(); + .title(this.miniMessage.deserialize(this.guiConfig.guis.receivedInvitesGuiTitle)) + .rows(6) + .pageSize(45) + .disableItemTake() + .create(); ExampleConfigItem nextPageItem = menuItems.nextPageItem; GuiItem nextPageButton = ItemBuilder.from(nextPageItem.type) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(nextPageItem.name))) - .lore(nextPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(event -> { - gui.next(); - }); + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(nextPageItem.name))) + .lore(nextPageItem.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(event -> { + gui.next(); + }); ConfigItemImpl previousPageItemCfg = menuItems.previousPageItem; GuiItem backPageButton = ItemBuilder.from(previousPageItemCfg.type) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(previousPageItemCfg.name))) - .lore(previousPageItemCfg.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(event -> { - gui.previous(); - }); + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(previousPageItemCfg.name))) + .lore(previousPageItemCfg.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(event -> { + gui.previous(); + }); ConfigItemImpl backToMainMenuItemCfg = menuItems.backToMainMenuItem; GuiItem backToMainMenuButton = ItemBuilder.from(backToMainMenuItemCfg.type) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(backToMainMenuItemCfg.name))) - .lore(backToMainMenuItemCfg.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(event -> { - onBack.run(); - }); + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(backToMainMenuItemCfg.name))) + .lore(backToMainMenuItemCfg.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(event -> { + onBack.run(); + }); generateHeads(player, gui); @@ -124,10 +123,10 @@ private void generateHeads(Player player, PaginatedGui gui) { OfflinePlayer offlinePlayer = this.server.getOfflinePlayer(invite.getFrom()); UUID friendUuid = invite.getFrom(); GuiItem skull = ItemBuilder.skull() - .owner(offlinePlayer) - .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(this.guiConfig.menuItems.inviteListfriendHead.name.replace("{friend_name}", offlinePlayer.getName())))) - .lore(this.guiConfig.menuItems.inviteListfriendHead.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .asGuiItem(); + .owner(offlinePlayer) + .name(AdventureUtil.RESET_ITEM.append(this.miniMessage.deserialize(this.guiConfig.menuItems.inviteListfriendHead.name.replace("{friend_name}", offlinePlayer.getName())))) + .lore(this.guiConfig.menuItems.inviteListfriendHead.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .asGuiItem(); skull.setAction(skullClickAction(player, friendUuid, gui)); @@ -151,8 +150,7 @@ private GuiAction skullClickAction(Player player, UUID frie this.announcer.announceMessage(playerUuid, this.friendsConfig.acceptedInvite.replace("{player}", this.server.getOfflinePlayer(friendUuid).getName())); this.announcer.announceMessage(friendUuid, this.friendsConfig.yourInvitationHasBeenAccepted.replace("{player}", player.getName())); - } - else if (event.isRightClick()) { + } else if (event.isRightClick()) { this.inviteManager.removeInvite(friendUuid, playerUuid); } diff --git a/src/main/java/com/eternalcode/friends/invite/InviteManager.java b/src/main/java/com/eternalcode/friends/invite/InviteManager.java index 8ecd0b7..749aa98 100644 --- a/src/main/java/com/eternalcode/friends/invite/InviteManager.java +++ b/src/main/java/com/eternalcode/friends/invite/InviteManager.java @@ -33,15 +33,13 @@ public void addInvite(UUID from, UUID to) { if (this.sentInvites.containsKey(from)) { this.sentInvites.get(from).add(invite); - } - else { + } else { this.sentInvites.put(from, new ArrayList<>(List.of(invite))); } if (this.receivedInvites.containsKey(to)) { this.receivedInvites.get(to).add(invite); - } - else { + } else { this.receivedInvites.put(to, new ArrayList<>(List.of(invite))); } @@ -53,15 +51,13 @@ public void addInvite(UUID from, UUID to, Instant expirationDate) { if (this.sentInvites.containsKey(from)) { this.sentInvites.get(from).add(invite); - } - else { + } else { this.sentInvites.put(from, new ArrayList<>(List.of(invite))); } if (this.receivedInvites.containsKey(to)) { this.receivedInvites.get(to).add(invite); - } - else { + } else { this.receivedInvites.put(to, new ArrayList<>(List.of(invite))); } diff --git a/src/main/java/com/eternalcode/friends/listener/AnnounceJoinListener.java b/src/main/java/com/eternalcode/friends/listener/AnnounceJoinListener.java index 0fbb3b3..30a7f08 100644 --- a/src/main/java/com/eternalcode/friends/listener/AnnounceJoinListener.java +++ b/src/main/java/com/eternalcode/friends/listener/AnnounceJoinListener.java @@ -43,7 +43,7 @@ private void announceToFriends(Player player) { } this.notificationAnnouncer.announceMessage(friendUuid, this.messagesConfig.friends.friendJoined - .replace("{friend}", friend.getName()) + .replace("{friend}", friend.getName()) ); } } diff --git a/src/main/java/com/eternalcode/friends/listener/AsyncPlayerChatListener.java b/src/main/java/com/eternalcode/friends/listener/AsyncPlayerChatListener.java index c0e8f7e..ab7b061 100644 --- a/src/main/java/com/eternalcode/friends/listener/AsyncPlayerChatListener.java +++ b/src/main/java/com/eternalcode/friends/listener/AsyncPlayerChatListener.java @@ -34,12 +34,12 @@ public void onChat(AsyncPlayerChatEvent event) { event.setCancelled(true); String message = this.messages.friends.chatFormat - .replace("{player}", player.getName()) - .replace("{message}", inputMessage.substring(1)); + .replace("{player}", player.getName()) + .replace("{message}", inputMessage.substring(1)); this.announcer.announceMessage(player.getUniqueId(), message); for (UUID friend : this.friendManager.getFriends(player.getUniqueId())) { this.announcer.announceMessage(friend, message); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/eternalcode/friends/packet/AbstractPacket.java b/src/main/java/com/eternalcode/friends/packet/AbstractPacket.java index 7be966a..d24a9a0 100644 --- a/src/main/java/com/eternalcode/friends/packet/AbstractPacket.java +++ b/src/main/java/com/eternalcode/friends/packet/AbstractPacket.java @@ -4,27 +4,26 @@ * PacketWrapper - ProtocolLib wrappers for Minecraft packets * Copyright (C) dmulloy2 * Copyright (C) Kristian S. Strangeland - * + *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + *

* You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import org.bukkit.entity.Player; - import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.google.common.base.Objects; +import org.bukkit.entity.Player; public abstract class AbstractPacket { @@ -32,11 +31,13 @@ public abstract class AbstractPacket { protected AbstractPacket(PacketContainer handle, PacketType type) { // Make sure we're given a valid packet - if (handle == null) + if (handle == null) { throw new IllegalArgumentException("Packet handle cannot be NULL."); - if (!Objects.equal(handle.getType(), type)) + } + if (!Objects.equal(handle.getType(), type)) { throw new IllegalArgumentException(handle.getHandle() - + " is not a packet of type " + type); + + " is not a packet of type " + type); + } this.handle = handle; } @@ -57,8 +58,9 @@ public void broadcastPacket() { public void recievePacket(Player sender) { try { ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, - getHandle()); - } catch (Exception e) { + getHandle()); + } + catch (Exception e) { throw new RuntimeException("Cannot recieve packet.", e); } } @@ -66,8 +68,9 @@ public void recievePacket(Player sender) { public void receivePacket(Player sender) { try { ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, - getHandle()); - } catch (Exception e) { + getHandle()); + } + catch (Exception e) { throw new RuntimeException("Cannot receive packet.", e); } } diff --git a/src/main/java/com/eternalcode/friends/packet/NameTagService.java b/src/main/java/com/eternalcode/friends/packet/NameTagService.java index c3ffd84..cb29afb 100644 --- a/src/main/java/com/eternalcode/friends/packet/NameTagService.java +++ b/src/main/java/com/eternalcode/friends/packet/NameTagService.java @@ -24,18 +24,18 @@ public NameTagService(ProtocolManager protocolManager, PluginConfig pluginConfig public void createTeamPacketOfTwoFriends(Player one, Player two) { WrapperPlayServerScoreboardTeam firstPacket = new WrapperPlayServerScoreboardTeam() - .setName(one.getName()) - .setMode(0) - .setPlayers(List.of(one.getName())) - .setNameTagVisibility("always") - .setColor(friendNameTagColor); + .setName(one.getName()) + .setMode(0) + .setPlayers(List.of(one.getName())) + .setNameTagVisibility("always") + .setColor(friendNameTagColor); WrapperPlayServerScoreboardTeam secondPacket = new WrapperPlayServerScoreboardTeam() - .setName(two.getName()) - .setMode(0) - .setPlayers(List.of(two.getName())) - .setNameTagVisibility("always") - .setColor(friendNameTagColor); + .setName(two.getName()) + .setMode(0) + .setPlayers(List.of(two.getName())) + .setNameTagVisibility("always") + .setColor(friendNameTagColor); this.protocolManager.sendServerPacket(one, secondPacket.getHandle()); this.protocolManager.sendServerPacket(two, firstPacket.getHandle()); @@ -43,18 +43,18 @@ public void createTeamPacketOfTwoFriends(Player one, Player two) { public void createTeamPacketOfTwoNoFriends(Player one, Player two) { WrapperPlayServerScoreboardTeam firstPacket = new WrapperPlayServerScoreboardTeam() - .setName(one.getName()) - .setMode(0) - .setPlayers(List.of(one.getName())) - .setNameTagVisibility("always") - .setColor(DEFAULT_PLAYER_NAME_COLOR); + .setName(one.getName()) + .setMode(0) + .setPlayers(List.of(one.getName())) + .setNameTagVisibility("always") + .setColor(DEFAULT_PLAYER_NAME_COLOR); WrapperPlayServerScoreboardTeam secondPacket = new WrapperPlayServerScoreboardTeam() - .setName(two.getName()) - .setMode(0) - .setPlayers(List.of(two.getName())) - .setNameTagVisibility("always") - .setColor(DEFAULT_PLAYER_NAME_COLOR); + .setName(two.getName()) + .setMode(0) + .setPlayers(List.of(two.getName())) + .setNameTagVisibility("always") + .setColor(DEFAULT_PLAYER_NAME_COLOR); this.protocolManager.sendServerPacket(one, secondPacket.getHandle()); this.protocolManager.sendServerPacket(two, firstPacket.getHandle()); @@ -62,14 +62,14 @@ public void createTeamPacketOfTwoNoFriends(Player one, Player two) { public void updateNameTagOfTwoFriends(Player one, Player two) { WrapperPlayServerScoreboardTeam firstPacket = new WrapperPlayServerScoreboardTeam() - .setName(one.getName()) - .setMode(2) - .setColor(friendNameTagColor); + .setName(one.getName()) + .setMode(2) + .setColor(friendNameTagColor); WrapperPlayServerScoreboardTeam secondPacket = new WrapperPlayServerScoreboardTeam() - .setName(two.getName()) - .setMode(2) - .setColor(friendNameTagColor); + .setName(two.getName()) + .setMode(2) + .setColor(friendNameTagColor); this.protocolManager.sendServerPacket(one, secondPacket.getHandle()); this.protocolManager.sendServerPacket(two, firstPacket.getHandle()); @@ -77,14 +77,14 @@ public void updateNameTagOfTwoFriends(Player one, Player two) { public void updateNameTagOfTwoNoFriends(Player one, Player two) { WrapperPlayServerScoreboardTeam firstPacket = new WrapperPlayServerScoreboardTeam() - .setName(one.getName()) - .setMode(2) - .setColor(DEFAULT_PLAYER_NAME_COLOR); + .setName(one.getName()) + .setMode(2) + .setColor(DEFAULT_PLAYER_NAME_COLOR); WrapperPlayServerScoreboardTeam secondPacket = new WrapperPlayServerScoreboardTeam() - .setName(two.getName()) - .setMode(2) - .setColor(DEFAULT_PLAYER_NAME_COLOR); + .setName(two.getName()) + .setMode(2) + .setColor(DEFAULT_PLAYER_NAME_COLOR); this.protocolManager.sendServerPacket(one, secondPacket.getHandle()); this.protocolManager.sendServerPacket(two, firstPacket.getHandle()); @@ -92,10 +92,10 @@ public void updateNameTagOfTwoNoFriends(Player one, Player two) { public void removePlayersTeam(Player player) { this.protocolManager.broadcastServerPacket( - new WrapperPlayServerScoreboardTeam() - .setName(player.getName()) - .setMode(1) - .getHandle() + new WrapperPlayServerScoreboardTeam() + .setName(player.getName()) + .setMode(1) + .getHandle() ); } } diff --git a/src/main/java/com/eternalcode/friends/packet/WrapperPlayServerScoreboardTeam.java b/src/main/java/com/eternalcode/friends/packet/WrapperPlayServerScoreboardTeam.java index 2bb272c..21a0574 100644 --- a/src/main/java/com/eternalcode/friends/packet/WrapperPlayServerScoreboardTeam.java +++ b/src/main/java/com/eternalcode/friends/packet/WrapperPlayServerScoreboardTeam.java @@ -4,37 +4,36 @@ * PacketWrapper - ProtocolLib wrappers for Minecraft packets * Copyright (C) dmulloy2 * Copyright (C) Kristian S. Strangeland - * + *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + *

* You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import java.util.Collection; -import java.util.List; -import java.util.Optional; - import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.WrappedChatComponent; - import org.bukkit.ChatColor; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + public class WrapperPlayServerScoreboardTeam extends AbstractPacket { - private final static ChatColor FRIEND_COLOR = ChatColor.BLUE; public static final PacketType TYPE = - PacketType.Play.Server.SCOREBOARD_TEAM; + PacketType.Play.Server.SCOREBOARD_TEAM; + private final static ChatColor FRIEND_COLOR = ChatColor.BLUE; public WrapperPlayServerScoreboardTeam() { super(new PacketContainer(TYPE), TYPE); @@ -55,63 +54,63 @@ public WrapperPlayServerScoreboardTeam setName(String value) { } public Optional getDisplayName() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().read(0)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().read(0)); } public WrapperPlayServerScoreboardTeam setDisplayName(WrappedChatComponent value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().write(0, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().write(0, value)); return this; } public Optional getPrefix() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().read(1)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().read(1)); } public WrapperPlayServerScoreboardTeam setPrefix(WrappedChatComponent value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().write(1, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().write(1, value)); return this; } public Optional getSuffix() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().read(2)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().read(2)); } public WrapperPlayServerScoreboardTeam setSuffix(WrappedChatComponent value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getChatComponents().write(2, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getChatComponents().write(2, value)); return this; } public Optional getNameTagVisibility() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getStrings().read(0)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getStrings().read(0)); } public WrapperPlayServerScoreboardTeam setNameTagVisibility(String value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getStrings().write(0, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getStrings().write(0, value)); return this; } public Optional getColor() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).read(0)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).read(0)); } public WrapperPlayServerScoreboardTeam setColor(ChatColor value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getEnumModifier(ChatColor.class, MinecraftReflection.getMinecraftClass("EnumChatFormat")).write(0, value)); return this; } public Optional getCollisionRule() { - return handle.getOptionalStructures().read(0).map((structure) -> structure.getStrings().read(1)); + return handle.getOptionalStructures().read(0).map(structure -> structure.getStrings().read(1)); } public WrapperPlayServerScoreboardTeam setCollisionRule(String value) { - handle.getOptionalStructures().read(0).map((structure) -> structure.getStrings().write(1, value)); + handle.getOptionalStructures().read(0).map(structure -> structure.getStrings().write(1, value)); return this; } @SuppressWarnings("unchecked") public List getPlayers() { return (List) handle.getSpecificModifier(Collection.class) - .read(0); + .read(0); } public WrapperPlayServerScoreboardTeam setPlayers(List value) { diff --git a/src/main/java/com/eternalcode/friends/util/AdventureUtil.java b/src/main/java/com/eternalcode/friends/util/AdventureUtil.java index aa30548..3baf4c9 100644 --- a/src/main/java/com/eternalcode/friends/util/AdventureUtil.java +++ b/src/main/java/com/eternalcode/friends/util/AdventureUtil.java @@ -6,10 +6,10 @@ public final class AdventureUtil { - public final static Component RESET_ITEM = Component.text() - .color(NamedTextColor.WHITE) - .decoration(TextDecoration.ITALIC, false) - .build(); + public static final Component RESET_ITEM = Component.text() + .color(NamedTextColor.WHITE) + .decoration(TextDecoration.ITALIC, false) + .build(); private AdventureUtil() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); diff --git a/src/main/java/com/eternalcode/friends/util/legacy/Legacy.java b/src/main/java/com/eternalcode/friends/util/legacy/Legacy.java index cecf90f..8274cbd 100644 --- a/src/main/java/com/eternalcode/friends/util/legacy/Legacy.java +++ b/src/main/java/com/eternalcode/friends/util/legacy/Legacy.java @@ -11,16 +11,16 @@ public class Legacy { public static final GsonComponentSerializer GSON_SERIALIZER = GsonComponentSerializer.gson(); public static final LegacyComponentSerializer SECTION_SERIALIZER = LegacyComponentSerializer.builder() - .character('ยง') - .hexColors() - .useUnusualXRepeatedCharacterHexFormat() - .build(); + .character('ยง') + .hexColors() + .useUnusualXRepeatedCharacterHexFormat() + .build(); public static final LegacyComponentSerializer AMPERSAND_SERIALIZER = LegacyComponentSerializer.builder() - .character('&') - .hexColors() - .useUnusualXRepeatedCharacterHexFormat() - .build(); + .character('&') + .hexColors() + .useUnusualXRepeatedCharacterHexFormat() + .build(); private Legacy() { throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); diff --git a/src/main/java/com/eternalcode/friends/util/legacy/LegacyColorProcessor.java b/src/main/java/com/eternalcode/friends/util/legacy/LegacyColorProcessor.java index 09f4181..3a34881 100644 --- a/src/main/java/com/eternalcode/friends/util/legacy/LegacyColorProcessor.java +++ b/src/main/java/com/eternalcode/friends/util/legacy/LegacyColorProcessor.java @@ -9,6 +9,6 @@ public class LegacyColorProcessor implements UnaryOperator { @Override public Component apply(Component component) { return component.replaceText(builder -> builder.match(Pattern.compile(".*")) - .replacement(((matchResult, builder1) -> Legacy.component(matchResult.group())))); + .replacement(((matchResult, builder1) -> Legacy.component(matchResult.group())))); } } From 78566bbf73cad193f69621f9ca36bef53ffb1773 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Sun, 26 Nov 2023 16:42:43 +0100 Subject: [PATCH 2/5] else in new line. --- .../command/implementation/FriendListCommand.java | 3 ++- .../friends/database/FriendDatabaseService.java | 3 ++- .../database/IgnoredPlayerDatabaseService.java | 3 ++- .../friends/database/InviteDatabaseService.java | 3 ++- .../eternalcode/friends/gui/ReceivedInvitesGui.java | 3 ++- .../eternalcode/friends/invite/InviteManager.java | 12 ++++++++---- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java b/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java index 40d1e17..d8ba899 100644 --- a/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java +++ b/src/main/java/com/eternalcode/friends/command/implementation/FriendListCommand.java @@ -66,7 +66,8 @@ private String listOfFriends(UUID uuid, boolean adminMode) { if (adminMode) { builder.append(friendsConfig.friendListHeaderAdmin.replace("{player}", server.getOfflinePlayer(uuid).getName())); - } else { + } + else { builder.append(friendsConfig.friendListHeader); } diff --git a/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java b/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java index 88b8220..2dba45e 100644 --- a/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/FriendDatabaseService.java @@ -104,7 +104,8 @@ public void load(Map> friends) { List newFriends = new ArrayList<>(); newFriends.add(uuidTwo); friends.put(uuidOne, newFriends); - } else { + } + else { friends.get(uuidOne).add(uuidTwo); } diff --git a/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java b/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java index 3447828..3d257f4 100644 --- a/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/IgnoredPlayerDatabaseService.java @@ -102,7 +102,8 @@ public void load(Map> ignoredPlayers) { List newIgnoredPlayers = new ArrayList<>(); newIgnoredPlayers.add(ignored); ignoredPlayers.put(ignore, newIgnoredPlayers); - } else { + } + else { ignoredPlayers.get(ignore).add(ignored); } } diff --git a/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java b/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java index e83e168..4f2e9c2 100644 --- a/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java +++ b/src/main/java/com/eternalcode/friends/database/InviteDatabaseService.java @@ -114,7 +114,8 @@ public void load(Map> receivedInvites, Map if (sentInvites.containsKey(from)) { sentInvites.get(from).add(invite); - } else { + } + else { sentInvites.put(from, new ArrayList<>(List.of(invite))); } diff --git a/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java b/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java index 1d6ef88..abc5588 100644 --- a/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java +++ b/src/main/java/com/eternalcode/friends/gui/ReceivedInvitesGui.java @@ -150,7 +150,8 @@ private GuiAction skullClickAction(Player player, UUID frie this.announcer.announceMessage(playerUuid, this.friendsConfig.acceptedInvite.replace("{player}", this.server.getOfflinePlayer(friendUuid).getName())); this.announcer.announceMessage(friendUuid, this.friendsConfig.yourInvitationHasBeenAccepted.replace("{player}", player.getName())); - } else if (event.isRightClick()) { + } + else if (event.isRightClick()) { this.inviteManager.removeInvite(friendUuid, playerUuid); } diff --git a/src/main/java/com/eternalcode/friends/invite/InviteManager.java b/src/main/java/com/eternalcode/friends/invite/InviteManager.java index 749aa98..8ecd0b7 100644 --- a/src/main/java/com/eternalcode/friends/invite/InviteManager.java +++ b/src/main/java/com/eternalcode/friends/invite/InviteManager.java @@ -33,13 +33,15 @@ public void addInvite(UUID from, UUID to) { if (this.sentInvites.containsKey(from)) { this.sentInvites.get(from).add(invite); - } else { + } + else { this.sentInvites.put(from, new ArrayList<>(List.of(invite))); } if (this.receivedInvites.containsKey(to)) { this.receivedInvites.get(to).add(invite); - } else { + } + else { this.receivedInvites.put(to, new ArrayList<>(List.of(invite))); } @@ -51,13 +53,15 @@ public void addInvite(UUID from, UUID to, Instant expirationDate) { if (this.sentInvites.containsKey(from)) { this.sentInvites.get(from).add(invite); - } else { + } + else { this.sentInvites.put(from, new ArrayList<>(List.of(invite))); } if (this.receivedInvites.containsKey(to)) { this.receivedInvites.get(to).add(invite); - } else { + } + else { this.receivedInvites.put(to, new ArrayList<>(List.of(invite))); } From 04d7ac9553b5c36598b403dd81dac9331bb8fd38 Mon Sep 17 00:00:00 2001 From: igoyek Date: Tue, 5 Dec 2023 19:22:59 +0100 Subject: [PATCH 3/5] Configuration system re-code Configuration code rewritten from cdn-configs to okoeri-configs. Took 1 hour 32 minutes --- build.gradle.kts | 7 +- .../eternalcode/friends/EternalFriends.java | 64 +++---- .../implementation/FriendReloadCommand.java | 10 +- .../friends/config/ConfigBackupService.java | 119 ------------- .../friends/config/ConfigManager.java | 47 ----- .../friends/config/ConfigurationService.java | 65 +++++++ .../friends/config/CustomRepresenter.java | 65 +++++++ .../friends/config/ReloadableConfig.java | 10 -- .../config/implementation/CloseItem.java | 31 ++-- .../config/implementation/ConfigItemImpl.java | 11 +- ...ConfigItem.java => ConfigurationItem.java} | 3 +- .../implementation/ExampleConfigItem.java | 19 +-- .../config/implementation/GuiConfig.java | 161 +++++++++--------- .../config/implementation/MessagesConfig.java | 105 +++++------- .../config/implementation/PluginConfig.java | 48 +++--- .../friends/config/reload/ReloadService.java | 20 +++ .../friends/config/reload/Reloadable.java | 6 + 17 files changed, 367 insertions(+), 424 deletions(-) delete mode 100644 src/main/java/com/eternalcode/friends/config/ConfigBackupService.java delete mode 100644 src/main/java/com/eternalcode/friends/config/ConfigManager.java create mode 100644 src/main/java/com/eternalcode/friends/config/ConfigurationService.java create mode 100644 src/main/java/com/eternalcode/friends/config/CustomRepresenter.java delete mode 100644 src/main/java/com/eternalcode/friends/config/ReloadableConfig.java rename src/main/java/com/eternalcode/friends/config/implementation/{ConfigItem.java => ConfigurationItem.java} (86%) create mode 100644 src/main/java/com/eternalcode/friends/config/reload/ReloadService.java create mode 100644 src/main/java/com/eternalcode/friends/config/reload/Reloadable.java diff --git a/build.gradle.kts b/build.gradle.kts index 39714c8..ea99bdb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,7 @@ repositories { maven { url = uri("https://papermc.io/repo/repository/maven-public/") } maven { url = uri("https://repo.panda-lang.org/releases") } maven { url = uri("https://repo.dmulloy2.net/repository/public/") } + maven { url = uri("https://storehouse.okaeri.eu/repository/maven-public/") } } checkstyle { @@ -48,8 +49,10 @@ dependencies { // litecommands implementation("dev.rollczi.litecommands:bukkit-adventure:2.8.9") - // cdn // TODO: Move to okaeri configs. - implementation("net.dzikoysk:cdn:1.14.4") + // okaeri configs + val okaeriConfigsVersion = "5.0.0-beta.5" + implementation("eu.okaeri:okaeri-configs-yaml-snakeyaml:${okaeriConfigsVersion}") + implementation("eu.okaeri:okaeri-configs-serdes-commons:${okaeriConfigsVersion}") // bstats implementation("org.bstats:bstats-bukkit:3.0.2") diff --git a/src/main/java/com/eternalcode/friends/EternalFriends.java b/src/main/java/com/eternalcode/friends/EternalFriends.java index 8d1edab..2df13e0 100644 --- a/src/main/java/com/eternalcode/friends/EternalFriends.java +++ b/src/main/java/com/eternalcode/friends/EternalFriends.java @@ -14,8 +14,7 @@ import com.eternalcode.friends.command.implementation.FriendKickCommand; import com.eternalcode.friends.command.implementation.FriendListCommand; import com.eternalcode.friends.command.implementation.FriendReloadCommand; -import com.eternalcode.friends.config.ConfigBackupService; -import com.eternalcode.friends.config.ConfigManager; +import com.eternalcode.friends.config.ConfigurationService; import com.eternalcode.friends.config.implementation.GuiConfig; import com.eternalcode.friends.config.implementation.MessagesConfig; import com.eternalcode.friends.config.implementation.PluginConfig; @@ -46,15 +45,13 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; import java.util.stream.Stream; public class EternalFriends extends JavaPlugin { private NotificationAnnouncer announcer; - private ConfigManager configManager; - private PluginConfig config; - private MessagesConfig messages; - private GuiConfig guiConfig; + private ConfigurationService configurationService; private MainGui mainGui; private InviteManager inviteManager; private NameTagService nameTagService; @@ -66,7 +63,6 @@ public class EternalFriends extends JavaPlugin { private FriendDatabaseService friendDatabaseService; private IgnoredPlayerDatabaseService ignoredPlayerDatabaseService; private InviteDatabaseService inviteDatabaseService; - private ConfigBackupService configBackupService; private HikariDataSource databaseDataSource; @@ -84,64 +80,56 @@ public void onEnable() { this.announcer = new NotificationAnnouncer(this.audienceProvider, this.miniMessage); - this.configBackupService = new ConfigBackupService(this.getDataFolder()); + this.configurationService = new ConfigurationService(); - this.configManager = new ConfigManager(this.getDataFolder(), this.configBackupService); + PluginConfig config = configurationService.create(PluginConfig.class, new File(this.getDataFolder(), "config.yml")); + MessagesConfig messages = configurationService.create(MessagesConfig.class, new File(this.getDataFolder(), "messages.yml")); + GuiConfig guiConfig = configurationService.create(GuiConfig.class, new File(this.getDataFolder(), "gui.yml")); - this.config = new PluginConfig(); - this.messages = new MessagesConfig(); - this.guiConfig = new GuiConfig(); - - this.configBackupService.createBackup(); - - this.configManager.load(this.config); - this.configManager.load(this.messages); - this.configManager.load(this.guiConfig); - - this.databaseDataSource = new DataSourceBuilder().buildHikariDataSource(this.config.database, this.getDataFolder()); + this.databaseDataSource = new DataSourceBuilder().buildHikariDataSource(config.database, this.getDataFolder()); this.friendDatabaseService = new FriendDatabaseService(this.databaseDataSource); this.ignoredPlayerDatabaseService = new IgnoredPlayerDatabaseService(this.databaseDataSource); this.inviteDatabaseService = new InviteDatabaseService(this.databaseDataSource); - this.nameTagService = new NameTagService(this.protocolManager, this.config); + this.nameTagService = new NameTagService(this.protocolManager, config); - this.inviteManager = new InviteManager(this.config, this.inviteDatabaseService); + this.inviteManager = new InviteManager(config, this.inviteDatabaseService); this.friendManager = new FriendManager(this.friendDatabaseService, this.ignoredPlayerDatabaseService, this.inviteManager); - this.mainGui = new MainGui(this.miniMessage, this.guiConfig, this, this.announcer, this.messages, this.inviteManager, this.friendManager, this.nameTagService); + this.mainGui = new MainGui(this.miniMessage, guiConfig, this, this.announcer, messages, this.inviteManager, this.friendManager, this.nameTagService); Stream.of( new NametagJoinQuitListener(this.protocolManager, this.nameTagService, this.friendManager), - new AnnounceJoinListener(this.config, this.messages, this.friendManager, this.announcer), + new AnnounceJoinListener(config, messages, this.friendManager, this.announcer), new EntityDamageByEntityListener(this.friendManager), - new AsyncPlayerChatListener(this.announcer, this.messages, this.friendManager) + new AsyncPlayerChatListener(this.announcer, messages, this.friendManager) ).forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this)); new Metrics(this, 16297); this.liteCommands = LitePaperAdventureFactory.builder(server, "eternalfriends") - .argument(Player.class, new BukkitPlayerArgument<>(server, this.messages.argument.playerNotFound)) + .argument(Player.class, new BukkitPlayerArgument<>(server, messages.argument.playerNotFound)) - .invalidUsageHandler(new InvalidUsage(this.messages, this.announcer)) - .permissionHandler(new PermissionMessage(this.messages, this.announcer)) + .invalidUsageHandler(new InvalidUsage(messages, this.announcer)) + .permissionHandler(new PermissionMessage(messages, this.announcer)) - .contextualBind(Player.class, new BukkitOnlyPlayerContextual<>(this.messages.argument.playerOnly)) + .contextualBind(Player.class, new BukkitOnlyPlayerContextual<>(messages.argument.playerOnly)) .commandInstance( new FriendCommand(this.mainGui), - new FriendAcceptCommand(this.announcer, this.inviteManager, this.messages, this.nameTagService, this.friendManager), - new FriendDenyCommand(this.announcer, this.inviteManager, this.messages), - new FriendInviteCommand(this.announcer, this.inviteManager, this.messages, this.friendManager), - new FriendListCommand(this.announcer, this.messages, this.getServer(), this.friendManager), - new FriendKickCommand(this.announcer, this.messages, this.nameTagService, this.friendManager), - new FriendIgnoreCommand(this.announcer, this.messages, this.friendManager), - new FriendHelpCommand(this.announcer, this.messages), - new FriendReloadCommand(this.announcer, this.messages, this.configManager) + new FriendAcceptCommand(this.announcer, this.inviteManager, messages, this.nameTagService, this.friendManager), + new FriendDenyCommand(this.announcer, this.inviteManager, messages), + new FriendInviteCommand(this.announcer, this.inviteManager, messages, this.friendManager), + new FriendListCommand(this.announcer, messages, this.getServer(), this.friendManager), + new FriendKickCommand(this.announcer, messages, this.nameTagService, this.friendManager), + new FriendIgnoreCommand(this.announcer, messages, this.friendManager), + new FriendHelpCommand(this.announcer, messages), + new FriendReloadCommand(this.announcer, messages, this.configurationService) ) - .commandEditor("friends", new CommandConfigurator(this.config)) + .commandEditor("friends", new CommandConfigurator(config)) .register(); } diff --git a/src/main/java/com/eternalcode/friends/command/implementation/FriendReloadCommand.java b/src/main/java/com/eternalcode/friends/command/implementation/FriendReloadCommand.java index fb2eb22..c7b3237 100644 --- a/src/main/java/com/eternalcode/friends/command/implementation/FriendReloadCommand.java +++ b/src/main/java/com/eternalcode/friends/command/implementation/FriendReloadCommand.java @@ -1,7 +1,7 @@ package com.eternalcode.friends.command.implementation; import com.eternalcode.friends.NotificationAnnouncer; -import com.eternalcode.friends.config.ConfigManager; +import com.eternalcode.friends.config.ConfigurationService; import com.eternalcode.friends.config.implementation.MessagesConfig; import dev.rollczi.litecommands.command.execute.Execute; import dev.rollczi.litecommands.command.permission.Permission; @@ -13,20 +13,20 @@ public class FriendReloadCommand { private final NotificationAnnouncer announcer; private final MessagesConfig messages; - private final ConfigManager configManager; private final MessagesConfig.Friends friendsConfig; + private final ConfigurationService configurationService; - public FriendReloadCommand(NotificationAnnouncer announcer, MessagesConfig messages, ConfigManager configManager) { + public FriendReloadCommand(NotificationAnnouncer announcer, MessagesConfig messages, ConfigurationService configurationService) { this.announcer = announcer; this.messages = messages; - this.configManager = configManager; + this.configurationService = configurationService; this.friendsConfig = this.messages.friends; } @Execute(route = "reload") @Permission("eternalfriends.admin.reload") public void reload(CommandSender sender) { - this.configManager.reload(); + this.configurationService.reload(); this.announcer.announceMessage(sender, friendsConfig.configReloaded); } diff --git a/src/main/java/com/eternalcode/friends/config/ConfigBackupService.java b/src/main/java/com/eternalcode/friends/config/ConfigBackupService.java deleted file mode 100644 index a5c900e..0000000 --- a/src/main/java/com/eternalcode/friends/config/ConfigBackupService.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.eternalcode.friends.config; - -import panda.utilities.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoUnit; - -public class ConfigBackupService { - - private static final String BACKUP_FOLDER_NAME = "backup"; - private static final String BACKUP_FILE_EXTENSION = ".bak"; - private final File dataFolder; - - public ConfigBackupService(File dataFolder) { - this.dataFolder = dataFolder; - } - - public void createBackup() { - File backupFolder = new File(this.dataFolder, BACKUP_FOLDER_NAME); - - if (!backupFolder.exists()) { - backupFolder.mkdirs(); - } - - LocalDateTime currentDateTime = LocalDateTime.now(); - String backupFolderName = BACKUP_FOLDER_NAME + "_" + currentDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm")); - File currentBackupFolder = new File(backupFolder, backupFolderName); - if (!currentBackupFolder.exists()) { - currentBackupFolder.mkdirs(); - } - - this.copyFolderContents(this.dataFolder, currentBackupFolder); - this.deleteIfOlderDirectory(backupFolder); - } - - private void copyFolderContents(File sourceFolder, File targetFolder) { - if (!sourceFolder.exists() || !sourceFolder.isDirectory()) { - return; - } - - if (!targetFolder.exists()) { - boolean targetFolderCreated = targetFolder.mkdirs(); - - if (!targetFolderCreated) { - return; - } - - } - - File[] filesToBackup = sourceFolder.listFiles(); - if (filesToBackup == null) { - return; - } - - for (File file : filesToBackup) { - if (file.isDirectory() && !file.getName().equals(BACKUP_FOLDER_NAME)) { - File subFolder = new File(targetFolder, file.getName()); - this.copyFolderContents(file, subFolder); - - continue; - } - - if (file.isFile() && !file.getName().endsWith(BACKUP_FILE_EXTENSION)) { - File backupFile = new File(targetFolder, file.getName() + BACKUP_FILE_EXTENSION); - - this.copyToBackupFile(file, backupFile); - } - } - } - - private void copyToBackupFile(File targetFolder, File path) { - try { - Files.copy(targetFolder.toPath(), path.toPath(), StandardCopyOption.REPLACE_EXISTING); - } - catch (IOException exception) { - exception.printStackTrace(); - } - } - - // delete backup folders older than 72h - private void deleteIfOlderDirectory(File backupFolder) { - File[] backupFolders = backupFolder.listFiles(File::isDirectory); - - if (backupFolders == null) { - return; - } - - for (File folder : backupFolders) { - String folderName = folder.getName(); - if (!folderName.startsWith(BACKUP_FOLDER_NAME)) { - continue; - } - - try { - LocalDate folderDate = LocalDate.parse(folderName.substring(BACKUP_FOLDER_NAME.length() + 1, folderName.lastIndexOf("_"))); - LocalTime folderTime = LocalTime.parse(folderName.substring(folderName.lastIndexOf("_") + 1).replace("-", ":")); - LocalDateTime folderDateTime = LocalDateTime.of(folderDate, folderTime); - LocalDateTime currentDateTime = LocalDateTime.now(); - - long hours = ChronoUnit.HOURS.between(folderDateTime, currentDateTime); - - if (hours > 72) { - FileUtils.delete(folder); - } - } - catch (DateTimeParseException exception) { - exception.printStackTrace(); - } - } - } -} diff --git a/src/main/java/com/eternalcode/friends/config/ConfigManager.java b/src/main/java/com/eternalcode/friends/config/ConfigManager.java deleted file mode 100644 index 26a9b4a..0000000 --- a/src/main/java/com/eternalcode/friends/config/ConfigManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.eternalcode.friends.config; - -import net.dzikoysk.cdn.Cdn; -import net.dzikoysk.cdn.CdnFactory; - -import java.io.File; -import java.util.HashSet; -import java.util.Set; - -public class ConfigManager { - - private static final Cdn CDN = CdnFactory - .createYamlLike() - .getSettings() - .build(); - private final ConfigBackupService configBackupService; - private final Set configs = new HashSet<>(); - private final File dataFolder; - - public ConfigManager(File dataFolder, ConfigBackupService configBackupService) { - this.dataFolder = dataFolder; - this.configBackupService = configBackupService; - } - - public void load(T config) { - CDN.load(config.resource(this.dataFolder), config) - .orThrow(RuntimeException::new); - - CDN.render(config, config.resource(this.dataFolder)) - .orThrow(RuntimeException::new); - - this.configs.add(config); - } - - public void save(T config) { - CDN.render(config, config.resource(this.dataFolder)) - .orThrow(RuntimeException::new); - } - - public void reload() { - configBackupService.createBackup(); - - for (ReloadableConfig config : this.configs) { - load(config); - } - } -} diff --git a/src/main/java/com/eternalcode/friends/config/ConfigurationService.java b/src/main/java/com/eternalcode/friends/config/ConfigurationService.java new file mode 100644 index 0000000..33a8767 --- /dev/null +++ b/src/main/java/com/eternalcode/friends/config/ConfigurationService.java @@ -0,0 +1,65 @@ +package com.eternalcode.friends.config; + +import com.eternalcode.friends.config.reload.Reloadable; +import eu.okaeri.configs.ConfigManager; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.serdes.commons.SerdesCommons; +import eu.okaeri.configs.yaml.snakeyaml.YamlSnakeYamlConfigurer; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.representer.Representer; +import org.yaml.snakeyaml.resolver.Resolver; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +public class ConfigurationService implements Reloadable { + + private final Set configs = new HashSet<>(); + + public T create(Class config, File file) { + T configFile = ConfigManager.create(config); + + YamlSnakeYamlConfigurer yamlConfigurer = new YamlSnakeYamlConfigurer(this.createYaml()); + + configFile + .withConfigurer(yamlConfigurer, new SerdesCommons()) + .withBindFile(file) + .withRemoveOrphans(true) + .saveDefaults() + .load(true); + + this.configs.add(configFile); + + return configFile; + } + + private Yaml createYaml() { + LoaderOptions loaderOptions = new LoaderOptions(); + Constructor constructor = new Constructor(loaderOptions); + + DumperOptions dumperOptions = new DumperOptions(); + dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO); + dumperOptions.setIndent(2); + dumperOptions.setSplitLines(false); + + Representer representer = new CustomRepresenter(dumperOptions); + Resolver resolver = new Resolver(); + + return new Yaml(constructor, representer, dumperOptions, loaderOptions, resolver); + } + + @Override + public void reload() { + for (OkaeriConfig config : this.configs) { + config.load(); + } + } + + public void save(OkaeriConfig config) { + config.save(); + } +} diff --git a/src/main/java/com/eternalcode/friends/config/CustomRepresenter.java b/src/main/java/com/eternalcode/friends/config/CustomRepresenter.java new file mode 100644 index 0000000..d928dc0 --- /dev/null +++ b/src/main/java/com/eternalcode/friends/config/CustomRepresenter.java @@ -0,0 +1,65 @@ +package com.eternalcode.friends.config; + +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.Tag; +import org.yaml.snakeyaml.representer.Represent; +import org.yaml.snakeyaml.representer.Representer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +class CustomRepresenter extends Representer { + + public CustomRepresenter(DumperOptions options) { + super(options); + this.representers.put(Integer.class, new RepresentInteger()); + this.representers.put(ArrayList.class, new RepresentList()); + this.representers.put(Boolean.class, new RepresentBoolean()); + this.representers.put(String.class, new RepresentString()); + this.representers.put(Map.class, new RepresentMap()); + this.representers.put(HashMap.class, new RepresentMap()); + this.representers.put(LinkedHashMap.class, new RepresentMap()); + } + + private class RepresentString implements Represent { + @Override + public Node representData(Object data) { + if (data instanceof String && ((String) data).contains(" ")) { + return representScalar(Tag.STR, (String) data, DumperOptions.ScalarStyle.DOUBLE_QUOTED); + } + + return representScalar(Tag.STR, data.toString(), DumperOptions.ScalarStyle.PLAIN); + } + } + + private class RepresentMap implements Represent { + public Node representData(Object data) { + return representMapping(Tag.MAP, (Map) data, DumperOptions.FlowStyle.BLOCK); + } + } + + private class RepresentBoolean implements Represent { + @Override + public Node representData(Object data) { + return representScalar(Tag.BOOL, data.toString(), DumperOptions.ScalarStyle.PLAIN); + } + } + + private class RepresentInteger implements Represent { + @Override + public Node representData(Object data) { + return representScalar(Tag.INT, data.toString(), DumperOptions.ScalarStyle.PLAIN); + } + } + + private class RepresentList implements Represent { + @Override + public Node representData(Object data) { + return representSequence(getTag(data.getClass(), Tag.SEQ), (Iterable) data, DumperOptions.FlowStyle.BLOCK); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/eternalcode/friends/config/ReloadableConfig.java b/src/main/java/com/eternalcode/friends/config/ReloadableConfig.java deleted file mode 100644 index 7bb0dd9..0000000 --- a/src/main/java/com/eternalcode/friends/config/ReloadableConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.eternalcode.friends.config; - -import net.dzikoysk.cdn.source.Resource; - -import java.io.File; - -public interface ReloadableConfig { - - Resource resource(File folder); -} diff --git a/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java b/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java index e450c45..e79bfdc 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/CloseItem.java @@ -4,41 +4,40 @@ import com.eternalcode.friends.util.legacy.LegacyColorProcessor; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.GuiItem; -import net.dzikoysk.cdn.entity.Contextual; -import net.dzikoysk.cdn.entity.Description; -import net.dzikoysk.cdn.entity.Exclude; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; +import eu.okaeri.configs.annotation.Exclude; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; import java.util.List; -@Contextual -public class CloseItem implements ConfigItem { +public class CloseItem extends OkaeriConfig implements ConfigurationItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() - .postProcessor(new LegacyColorProcessor()) - .build(); + .postProcessor(new LegacyColorProcessor()) + .build(); public Material type = Material.STONE; - public String name = "&cClose"; + public String name = "Close"; - public List lore = List.of("&fFirst line of lore"); + public List lore = List.of("First line of lore"); - @Description("# List of commands triggered on click") - @Description("# Available placeholders: {player}") + @Comment("# List of commands triggered on click") + @Comment("# Available placeholders: {player}") public List commandOnClick = List.of("give {player} stone 1", "tell {player} you received stone!"); @Override public GuiItem toGuiItem() { return ItemBuilder.from(this.type) - .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) - .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) - .flags(ItemFlag.HIDE_ATTRIBUTES) - .flags(ItemFlag.HIDE_ENCHANTS) - .asGuiItem(); + .name(AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(this.name))) + .lore(this.lore.stream().map(line -> AdventureUtil.RESET_ITEM.append(miniMessage.deserialize(line))).toList()) + .flags(ItemFlag.HIDE_ATTRIBUTES) + .flags(ItemFlag.HIDE_ENCHANTS) + .asGuiItem(); } @Override diff --git a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java b/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java index 29eb35e..3bfd205 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/ConfigItemImpl.java @@ -4,16 +4,15 @@ import com.eternalcode.friends.util.legacy.LegacyColorProcessor; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.GuiItem; -import net.dzikoysk.cdn.entity.Contextual; -import net.dzikoysk.cdn.entity.Exclude; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Exclude; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; import java.util.List; -@Contextual -public class ConfigItemImpl implements ConfigItem { +public class ConfigItemImpl extends OkaeriConfig implements ConfigurationItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() @@ -22,9 +21,9 @@ public class ConfigItemImpl implements ConfigItem { public Material type = Material.STONE; - public String name = "&fItem name"; + public String name = "Item name"; - public List lore = List.of("&fFirst line of lore", "&9Second line of lore"); + public List lore = List.of("First line of lore", "Second line of lore"); public GuiItem toGuiItem() { return ItemBuilder.from(this.type) diff --git a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItem.java b/src/main/java/com/eternalcode/friends/config/implementation/ConfigurationItem.java similarity index 86% rename from src/main/java/com/eternalcode/friends/config/implementation/ConfigItem.java rename to src/main/java/com/eternalcode/friends/config/implementation/ConfigurationItem.java index 4412e63..8638902 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/ConfigItem.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/ConfigurationItem.java @@ -5,7 +5,8 @@ import java.util.List; -public interface ConfigItem { +public interface ConfigurationItem { + T setType(Material type); T setName(String name); diff --git a/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java b/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java index 769ce86..d3da904 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/ExampleConfigItem.java @@ -4,31 +4,30 @@ import com.eternalcode.friends.util.legacy.LegacyColorProcessor; import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.GuiItem; -import net.dzikoysk.cdn.entity.Contextual; -import net.dzikoysk.cdn.entity.Description; -import net.dzikoysk.cdn.entity.Exclude; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; +import eu.okaeri.configs.annotation.Exclude; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.inventory.ItemFlag; import java.util.List; -@Contextual -public class ExampleConfigItem implements ConfigItem { +public class ExampleConfigItem extends OkaeriConfig implements ConfigurationItem { @Exclude private final MiniMessage miniMessage = MiniMessage.builder() .postProcessor(new LegacyColorProcessor()) .build(); - @Description("# Material from https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html") + @Comment("# Material from https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html") public Material type = Material.STONE; - @Description("# Name of item") - public String name = "&fItem name"; + @Comment("# Name of item") + public String name = "Item name"; - @Description("# Description of item") - public List lore = List.of("&fFirst line of lore", "&9Second line of lore", "&cThird line of lore"); + @Comment("# Description of item") + public List lore = List.of("First line of lore", "Second line of lore", "Third line of lore"); public GuiItem toGuiItem() { return ItemBuilder.from(this.type) diff --git a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java index 4186974..9ab16cf 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java @@ -1,120 +1,112 @@ package com.eternalcode.friends.config.implementation; -import com.eternalcode.friends.config.ReloadableConfig; -import net.dzikoysk.cdn.entity.Contextual; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.NameModifier; +import eu.okaeri.configs.annotation.NameStrategy; +import eu.okaeri.configs.annotation.Names; import net.dzikoysk.cdn.entity.Description; -import net.dzikoysk.cdn.source.Resource; -import net.dzikoysk.cdn.source.Source; import org.bukkit.Material; -import java.io.File; import java.util.List; -public class GuiConfig implements ReloadableConfig { +@Names(strategy = NameStrategy.HYPHEN_CASE, modifier = NameModifier.TO_LOWER_CASE) +public class GuiConfig extends OkaeriConfig { public MenuItems menuItems = new MenuItems(); public Guis guis = new Guis(); - @Override - public Resource resource(File folder) { - return Source.of(folder, "gui.yml"); - } - - @Contextual - public static class MenuItems { + public static class MenuItems extends OkaeriConfig { @Description("# options of {status} placeholder") - public OnlineStatus onlineStatus = new OnlineStatus(); + public OnlineStatus onlineStatus = new OnlineStatus(); - public FriendHead friendListHead = new FriendHead().setName("{status} &f{friend_name}") - .setLore(List.of("", "&cClick LMB", "&cto remove a friend", "")); + public FriendHead friendListHead = new FriendHead().setName("{status} {friend_name}") + .setLore(List.of("", "Click LMB", "to remove a friend", "")); public FriendHead inviteListfriendHead = new FriendHead() - .setLore(List.of("", "&aClick LMB to accept invitation", "&cClick RMB to decline invitation", "")); + .setLore(List.of("", "Click LMB to accept invitation", "Click RMB to decline invitation", "")); public ExampleConfigItem nextPageItem = new ExampleConfigItem() - .setName("&aNext page") - .setType(Material.PAPER) - .setLore(List.of( - "", - "&7Click to go to the next page", - "" - )); + .setName("Next page") + .setType(Material.PAPER) + .setLore(List.of( + "", + "Click to go to the next page", + "" + )); public ConfigItemImpl previousPageItem = new ConfigItemImpl() - .setName("&cPrevious page") - .setType(Material.PAPER) - .setLore(List.of( - "", - "&7Click to go to the previous page", - "" - )); + .setName("Previous page") + .setType(Material.PAPER) + .setLore(List.of( + "", + "Click to go to the previous page", + "" + )); public ConfigItemImpl confirmItem = new ConfigItemImpl() - .setName("&aYes") - .setType(Material.LIME_STAINED_GLASS_PANE) - .setLore(List.of( - "", - "&7Click to confirm", - "" - )); + .setName("Yes") + .setType(Material.LIME_STAINED_GLASS_PANE) + .setLore(List.of( + "", + "Click to confirm", + "" + )); public ConfigItemImpl denyItem = new ConfigItemImpl() - .setName("&cNo") - .setType(Material.RED_STAINED_GLASS_PANE) - .setLore(List.of( - "", - "&7Click to cancel", - "" - )); + .setName("No") + .setType(Material.RED_STAINED_GLASS_PANE) + .setLore(List.of( + "", + "Click to cancel", + "" + )); public ConfigItemImpl receivedInvitesItem = new ConfigItemImpl() - .setName("&aReceived invitations") - .setType(Material.BOOK) - .setLore(List.of( - "", - "&7Click to open", - "" - )); + .setName("Received invitations") + .setType(Material.BOOK) + .setLore(List.of( + "", + "Click to open", + "" + )); public ConfigItemImpl sendInvitesItem = new ConfigItemImpl() - .setName("&aSending invitations") - .setType(Material.WRITABLE_BOOK) - .setLore(List.of( - "", - "&7Click to open", - "" - )); + .setName("Sending invitations") + .setType(Material.WRITABLE_BOOK) + .setLore(List.of( + "", + "Click to open", + "" + )); public ConfigItemImpl settingItem = new ConfigItemImpl() - .setName("&aSettings") - .setType(Material.REPEATER) - .setLore(List.of( - "", - "&7Click to open", - "" - )); + .setName("Settings") + .setType(Material.REPEATER) + .setLore(List.of( + "", + "Click to open", + "" + )); public ConfigItemImpl backToMainMenuItem = new ConfigItemImpl() - .setName("&7Back to main menu") - .setType(Material.ARROW) - .setLore(List.of()); + .setName("Back to main menu") + .setType(Material.ARROW) + .setLore(List.of()); public CloseItem closeItem = new CloseItem() - .setName("&cClose menu") - .setType(Material.BARRIER) - .setLore(List.of()); + .setName("Close menu") + .setType(Material.BARRIER) + .setLore(List.of()); } - @Contextual - public static class Guis { - public String mainGuiTitle = "&bFriends"; - public String confirmGuiTitle = "&cAre you sure?"; - public String receivedInvitesGuiTitle = "&bReceived invitations"; + public static class Guis extends OkaeriConfig { + public String mainGuiTitle = "Friends"; + public String confirmGuiTitle = "Are you sure?"; + public String receivedInvitesGuiTitle = "Received invitations"; } - @Contextual - public static class FriendHead { - public String name = "&f{friend_name}"; - public List lore = List.of("&fFirst line of lore", "&9Second line of lore"); + public static class FriendHead extends OkaeriConfig { + public String name = "{friend_name}"; + public List lore = List.of("First line of lore", "Second line of lore"); public FriendHead setName(String name) { this.name = name; @@ -127,9 +119,8 @@ public FriendHead setLore(List lore) { } } - @Contextual - public static class OnlineStatus { - public String online = "&aโ—"; - public String offline = "&7โ—"; + public static class OnlineStatus extends OkaeriConfig { + public String online = "โ—"; + public String offline = "โ—"; } } diff --git a/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java index 8a6a5a3..2f1a343 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/MessagesConfig.java @@ -1,73 +1,62 @@ package com.eternalcode.friends.config.implementation; -import com.eternalcode.friends.config.ReloadableConfig; -import net.dzikoysk.cdn.entity.Contextual; -import net.dzikoysk.cdn.source.Resource; -import net.dzikoysk.cdn.source.Source; +import eu.okaeri.configs.OkaeriConfig; -import java.io.File; import java.util.List; -public class MessagesConfig implements ReloadableConfig { +public class MessagesConfig extends OkaeriConfig { public Argument argument = new Argument(); public Friends friends = new Friends(); - @Override - public Resource resource(File folder) { - return Source.of(folder, "messages.yml"); + public static class Argument extends OkaeriConfig { + public String missingPermission = "You do not have permission to use this command! ({permission})"; + public String invalidUsage = "Error! Check the correct usage of the command at /friends help [click here]."; + public String playerOnly = "This command can only be used by players!"; + public String playerNotFound = "Player not found: {player}."; } - @Contextual - public static class Argument { - public String missingPermission = "&cYou do not have permission to use this command! &7({permission})"; - public String invalidUsage = "&cError! Check the correct usage of the command at &f/friends help &8[click here]&c."; - public String playerOnly = "&cThis command can only be used by players!"; - public String playerNotFound = "&cPlayer not found: &7{player}&c."; - } - - @Contextual - public static class Friends { - public String chatFormat = "&9[FRIENDS] &f{player} &8ยป &7{message}"; - public String inviteSent = "&aInvitation to friends sent to player &f{invited}"; - public String inviteReceived = "&aYou have received a friend request from player &f{player}&a. To accept it, use the command &7/friends accept {player} &8[click], &cor to decline it, use the command &7/friends deny {player} &8[click]."; - public String cannotSendInvite = "&cYou cannot send invitation to this player!"; - public String emptyFriendList = "&cYou have no friends :("; - public String emptyFriendListAdmin = "&cThis player has no friends."; - public String acceptedInvite = "&aYou accepted a friend request from player &f{player}"; - public String yourInvitationHasBeenAccepted = "&f{player} &aaccepted your friend request."; - public String alreadyFriend = "&cThis player is already on your friends list."; - public String yourselfCommand = "&cYou cannot use this command on yourself."; - public String inviteNotFound = "&cYou have no friend request from this player or the request has expired!"; - public String playerIsNotYourFriend = "&cThis player is not on your friends list"; - public String youKickedFriend = "&cPlayer &f{player} &chas been removed from your friends list!"; - public String friendKickedYou = "&cPlayer &f{player} &cremoved you from their friends list!"; - public String friendListHeader = "&3Your friends: "; - public String friendListHeaderAdmin = "&3Friends of player &f{player}&3: "; - public String friendListPlayer = "&7{player}, "; - public String alreadyReceivedInvite = "&cYou have already received a friend request from this player!"; - public String alreadySentInvite = "&cYou have already sent an invite to this player!"; - public String inviteInstruction = "&aTo send a friend request, use the command &7/friends invite {player_name}"; - public String configReloaded = "&aConfiguration successfully reloaded!"; - public String inviteDenied = "&cYou declined the friend request from player &7{player}"; - public String yourInvitationHasBeenDenied = "&cYour invitation to &7{player} &chas been denied."; - public String youIgnoredPlayer = "&cYou will no longer receive friend requests from player &7{player}"; - public String playerNoLongerIgnored = "&aYou can now receive friend requests from player &7{player} again."; - public String inviteExpired = "&cThe friend request from this player has expired!"; - public String friendJoined = "&9{friend} &ahas joined the server!"; + public static class Friends extends OkaeriConfig { + public String chatFormat = "[FRIENDS] {player} ยป {message}"; + public String inviteSent = "Invitation to friends sent to player {invited}"; + public String inviteReceived = "You have received a friend request from player {player}. To accept it, use the command /friends accept {player} [click], or to decline it, use the command /friends deny {player} [click]."; + public String cannotSendInvite = "You cannot send invitation to this player!"; + public String emptyFriendList = "You have no friends :("; + public String emptyFriendListAdmin = "This player has no friends."; + public String acceptedInvite = "You accepted a friend request from player {player}"; + public String yourInvitationHasBeenAccepted = "{player} accepted your friend request."; + public String alreadyFriend = "This player is already on your friends list."; + public String yourselfCommand = "You cannot use this command on yourself."; + public String inviteNotFound = "You have no friend request from this player or the request has expired!"; + public String playerIsNotYourFriend = "This player is not on your friends list"; + public String youKickedFriend = "Player {player} has been removed from your friends list!"; + public String friendKickedYou = "Player {player} removed you from their friends list!"; + public String friendListHeader = "Your friends: "; + public String friendListHeaderAdmin = "Friends of player {player}: "; + public String friendListPlayer = "{player}, "; + public String alreadyReceivedInvite = "You have already received a friend request from this player!"; + public String alreadySentInvite = "You have already sent an invite to this player!"; + public String inviteInstruction = "To send a friend request, use the command /friends invite {player_name}"; + public String configReloaded = "Configuration successfully reloaded!"; + public String inviteDenied = "You declined the friend request from player {player}"; + public String yourInvitationHasBeenDenied = "Your invitation to {player} has been denied."; + public String youIgnoredPlayer = "You will no longer receive friend requests from player {player}"; + public String playerNoLongerIgnored = "You can now receive friend requests from player {player} again."; + public String inviteExpired = "The friend request from this player has expired!"; + public String friendJoined = "{friend} has joined the server!"; public List helpCommand = List.of( - " ", - " &3Friends - Commands", - " &7/friends &8- &fDisplays friend menu", - " &7/friends invite &8- &fSends a friend request", - " &7/friends accept &8- &fAccepts a friend request", - " &7/friends deny &8- &fDeclines a friend request", - " &7/friends remove &8- &fRemoves a friend from the list", - " &7/friends ignore &8- &fIgnores incoming friend requests from player or turns off ignoring", - " &7/friends help &8- &fDisplays available commands", - " &7/friends list &8- &fShows list of friends", - " &7/friends reload &8- &fReloads configuration", - " " + " ", + " Friends - Commands", + " /friends - Displays friend menu", + " /friends invite - Sends a friend request", + " /friends accept - Accepts a friend request", + " /friends deny - Declines a friend request", + " /friends remove - Removes a friend from the list", + " /friends ignore - Ignores incoming friend requests from player or turns off ignoring", + " /friends help - Displays available commands", + " /friends list - Shows list of friends", + " /friends reload - Reloads configuration", + " " ); } } diff --git a/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java index d5507db..a7cd884 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/PluginConfig.java @@ -1,41 +1,36 @@ package com.eternalcode.friends.config.implementation; -import com.eternalcode.friends.config.ReloadableConfig; import com.eternalcode.friends.database.DatabaseType; -import net.dzikoysk.cdn.entity.Contextual; -import net.dzikoysk.cdn.entity.Description; -import net.dzikoysk.cdn.source.Resource; -import net.dzikoysk.cdn.source.Source; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.*; import org.bukkit.ChatColor; -import java.io.File; +@Names(strategy = NameStrategy.HYPHEN_CASE, modifier = NameModifier.TO_LOWER_CASE) +@Header("# ") +@Header("# EternalFriends configuration file") +@Header("# Permissions:") +@Header("# - eternalfriends.access.all - gives access to all basic command functionality") +@Header("# - eternalfriends.admin.all - gives access to all administrative commands") +@Header("# ") +public class PluginConfig extends OkaeriConfig { -public class PluginConfig implements ReloadableConfig { - - @Description("# Configuration of Database") + @Comment("# Configuration of Database") public Database database = new Database(); - @Description("# Color of player's name tag displayed to his friends") + @Comment("# Color of player's name tag displayed to his friends") public ChatColor friendColor = ChatColor.BLUE; - @Description("# Does server should message displayed to player when his friend joins the server?") + @Comment("# Does server should message displayed to player when his friend joins the server?") public boolean announceFriendJoin = true; - @Description("# Configuration of command and subcommands names") + @Comment("# Configuration of command and subcommands names") public Command friendCommand = new Command(); - @Description("# Time in seconds after which invite will expire") + @Comment("# Time in seconds after which invite will expire") public int inviteExpirationTime = 60; - @Override - public Resource resource(File folder) { - return Source.of(folder, "configuration.yml"); - } - - @Contextual - public static class Command { + public static class Command extends OkaeriConfig { public String main = "friends"; public SubCommand subCommands = new SubCommand(); } - @Contextual - public static class SubCommand { + public static class SubCommand extends OkaeriConfig { public String invite = "invite"; public String accept = "accept"; public String deny = "deny"; @@ -45,13 +40,12 @@ public static class SubCommand { public String ignore = "ignore"; } - @Contextual - public static class Database { + public static class Database extends OkaeriConfig { public DatabaseType databaseType = DatabaseType.SQLITE; public String host = "localhost"; public int port = 3306; - public String username = "admin"; - public String password = "password"; - public String database = "server"; + public String username = "root"; + public String password = "Us3$tr0ngP@$$w0rd!@#"; + public String database = "eternalfriends"; } } diff --git a/src/main/java/com/eternalcode/friends/config/reload/ReloadService.java b/src/main/java/com/eternalcode/friends/config/reload/ReloadService.java new file mode 100644 index 0000000..9e1af6c --- /dev/null +++ b/src/main/java/com/eternalcode/friends/config/reload/ReloadService.java @@ -0,0 +1,20 @@ +package com.eternalcode.friends.config.reload; + +import java.util.HashSet; +import java.util.Set; + +public class ReloadService { + + private final Set reloadables = new HashSet<>(); + + public ReloadService register(Reloadable reloadable) { + this.reloadables.add(reloadable); + return this; + } + + public void reload() { + for (Reloadable reloadable : this.reloadables) { + reloadable.reload(); + } + } +} diff --git a/src/main/java/com/eternalcode/friends/config/reload/Reloadable.java b/src/main/java/com/eternalcode/friends/config/reload/Reloadable.java new file mode 100644 index 0000000..f508043 --- /dev/null +++ b/src/main/java/com/eternalcode/friends/config/reload/Reloadable.java @@ -0,0 +1,6 @@ +package com.eternalcode.friends.config.reload; + +public interface Reloadable { + + void reload(); +} From f34b607c7531abb376bf7ac61271cebe0f901cd4 Mon Sep 17 00:00:00 2001 From: igoyek Date: Tue, 5 Dec 2023 19:33:23 +0100 Subject: [PATCH 4/5] Command handlers fix Took 8 minutes --- build.gradle.kts | 3 +++ .../friends/command/handler/InvalidUsage.java | 19 +++++++++++++++---- .../command/handler/PermissionMessage.java | 13 ++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ea99bdb..99b5590 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,6 +60,9 @@ dependencies { // triumph gui implementation("dev.triumphteam:triumph-gui:3.1.7") + // panda-utilities + implementation("org.panda-lang:panda-utilities:0.5.2-alpha") + // Database implementation("com.zaxxer:HikariCP:5.1.0") implementation("com.mysql:mysql-connector-j:8.2.0") diff --git a/src/main/java/com/eternalcode/friends/command/handler/InvalidUsage.java b/src/main/java/com/eternalcode/friends/command/handler/InvalidUsage.java index 8637428..99edeff 100644 --- a/src/main/java/com/eternalcode/friends/command/handler/InvalidUsage.java +++ b/src/main/java/com/eternalcode/friends/command/handler/InvalidUsage.java @@ -6,6 +6,9 @@ import dev.rollczi.litecommands.handle.InvalidUsageHandler; import dev.rollczi.litecommands.schematic.Schematic; import org.bukkit.command.CommandSender; +import panda.utilities.text.Formatter; + +import java.util.List; public class InvalidUsage implements InvalidUsageHandler { @@ -19,10 +22,18 @@ public InvalidUsage(MessagesConfig messages, NotificationAnnouncer announcer) { @Override public void handle(CommandSender sender, LiteInvocation invocation, Schematic schematic) { - schematic.getSchematics().forEach(str -> { - this.announcer.announceMessage(sender, str); - }); + List schematics = schematic.getSchematics(); + + if (schematic.isOnlyFirst()) { + this.announcer.announceMessage(sender, this.messages.argument.invalidUsage); + return; + } + + for (String scheme : schematics) { + Formatter formatter = new Formatter() + .register("{USAGE}", scheme); - this.announcer.announceMessage(sender, messages.argument.invalidUsage); + this.announcer.announceMessage(sender, formatter.format(this.messages.argument.invalidUsage)); + } } } diff --git a/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java b/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java index 8b17de1..36c35cc 100644 --- a/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java +++ b/src/main/java/com/eternalcode/friends/command/handler/PermissionMessage.java @@ -6,7 +6,7 @@ import dev.rollczi.litecommands.command.permission.RequiredPermissions; import dev.rollczi.litecommands.handle.PermissionHandler; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +import panda.utilities.text.Formatter; import panda.utilities.text.Joiner; public class PermissionMessage implements PermissionHandler { @@ -21,10 +21,13 @@ public PermissionMessage(MessagesConfig messages, NotificationAnnouncer announce @Override public void handle(CommandSender sender, LiteInvocation invocation, RequiredPermissions requiredPermissions) { - Player player = (Player) sender; + String value = Joiner.on(", ") + .join(requiredPermissions.getPermissions()) + .toString(); - this.announcer.announceMessage(player.getUniqueId(), this.messages.argument.missingPermission.replace("{permission}", Joiner.on(", ") - .join(requiredPermissions.getPermissions()) - .toString())); + Formatter formatter = new Formatter() + .register("{PERMISSION}", value); + + this.announcer.announceMessage(sender, formatter.format(this.messages.argument.missingPermission)); } } From b26ba0a0d971acaf07920eb3e34ac9038add72fc Mon Sep 17 00:00:00 2001 From: igoyek Date: Tue, 5 Dec 2023 19:39:22 +0100 Subject: [PATCH 5/5] fix of fix :tf: Took 5 minutes --- .../eternalcode/friends/config/implementation/GuiConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java index 9ab16cf..c18011c 100644 --- a/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java +++ b/src/main/java/com/eternalcode/friends/config/implementation/GuiConfig.java @@ -1,10 +1,10 @@ package com.eternalcode.friends.config.implementation; import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; import eu.okaeri.configs.annotation.NameModifier; import eu.okaeri.configs.annotation.NameStrategy; import eu.okaeri.configs.annotation.Names; -import net.dzikoysk.cdn.entity.Description; import org.bukkit.Material; import java.util.List; @@ -16,7 +16,7 @@ public class GuiConfig extends OkaeriConfig { public Guis guis = new Guis(); public static class MenuItems extends OkaeriConfig { - @Description("# options of {status} placeholder") + @Comment("# options of {status} placeholder") public OnlineStatus onlineStatus = new OnlineStatus(); public FriendHead friendListHead = new FriendHead().setName("{status} {friend_name}")