Skip to content

GH-134 GH-153 GH-155 Fix Wrong replacement, remove chatformatter.legacycolor permission#156

Merged
vLuckyyy merged 3 commits into
masterfrom
more-usable-color-permission
Jun 24, 2025
Merged

GH-134 GH-153 GH-155 Fix Wrong replacement, remove chatformatter.legacycolor permission#156
vLuckyyy merged 3 commits into
masterfrom
more-usable-color-permission

Conversation

@vLuckyyy

@vLuckyyy vLuckyyy commented Jun 17, 2025

Copy link
Copy Markdown
Member

Fixes: GH-134 GH-153 GH-155

2025-06-17_20-31-36.mp4

… permission.

Signed-off-by: vLuckyyy <vluckyyy.biznes@gmail.com>
@coderabbitai

coderabbitai Bot commented Jun 17, 2025

Copy link
Copy Markdown

Walkthrough

The update clarifies the README permissions, showing that color and decoration permissions cover both old-style codes (like &c) and new MiniMessage tags (like ). The code now carefully checks if a user has permission for each legacy color or decoration code before applying it, using new methods that link codes to permissions. The build script removes one outdated permission node. Overall, the changes tidy up how legacy colors are handled and make permissions clearer and more precise.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c9393d2 and ab3ca29.

📒 Files selected for processing (25)
  • .gitignore (1 hunks)
  • README.md (1 hunks)
  • build.gradle.kts (1 hunks)
  • chatformatter-core/build.gradle.kts (2 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java (3 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java (4 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java (0 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/ConfiguredReplacer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java (0 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java (0 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java (0 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerRelationalPlaceholder.java (0 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/RelationalReplacer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Replacer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholderapi/PlaceholderAPIInitializer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholderapi/PlaceholderAPIReplacer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/rank/EmptyRankProvider.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultInitializer.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultRankProvider.java (1 hunks)
  • chatformatter-core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java (0 hunks)
  • chatformatter-core/src/test/java/com/eternalcode/formatter/placeholder/PapiPlaceholdersTest.java (2 hunks)
  • chatformatter-paper-plugin/build.gradle.kts (1 hunks)
💤 Files with no reviewable changes (6)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerPlaceholder.java
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlayerRelationalPlaceholder.java
  • chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostMessageProcessor.java
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderStack.java
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Placeholder.java
  • chatformatter-core/src/test/java/com/eternalcode/formatter/legacy/LegacyTest.java
✅ Files skipped from review due to trivial changes (7)
  • .gitignore
  • build.gradle.kts
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/RelationalReplacer.java
  • chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/Replacer.java
  • chatformatter-paper-plugin/build.gradle.kts
  • chatformatter-core/build.gradle.kts
  • chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultRankProvider.java
🔇 Additional comments (29)
chatformatter-core/src/test/java/com/eternalcode/formatter/placeholder/PapiPlaceholdersTest.java (3)

4-4: New import looks good!

The PlaceholderAPIInitializer import supports the updated initialization pattern.


34-36: Clean refactoring to new replacer system!

The change from playerStack() to addReplacer() with the new ConfiguredReplacer and explicit PlaceholderAPI initialization follows the updated architecture nicely. This makes the initialization more explicit and modular.


39-40: Minor comment formatting improvement.

Small formatting change to the comment is fine.

chatformatter-core/src/main/java/com/eternalcode/formatter/rank/EmptyRankProvider.java (2)

5-5: Package-private visibility is perfect here.

Good choice making this class package-private since it's only used internally by the VaultInitializer.


8-10: Simple and effective fallback logic!

The rank determination logic is clean - ops get "op" rank, everyone else gets "default". This provides a sensible fallback when Vault isn't available.

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholderapi/PlaceholderAPIReplacer.java (3)

1-1: Good package organization!

Moving PlaceholderAPI-related classes to their own package improves code organization.


8-8: Clean interface implementation!

The class properly implements both Replacer and RelationalReplacer interfaces, making it work seamlessly with the new replacer system.


11-18: Perfect delegation to PlaceholderAPI!

Both methods correctly delegate to the appropriate PlaceholderAPI methods - setPlaceholders for single player and setRelationalPlaceholders for player pairs. Clean and straightforward.

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/ConfiguredReplacer.java (2)

7-7: Great simplification with single responsibility!

The class now focuses solely on configured placeholders, which makes it cleaner and more maintainable. The separation of concerns is well done.


16-24: Clean placeholder replacement logic!

The implementation efficiently iterates through configured placeholders and applies them. Simple and effective approach.

chatformatter-core/src/main/java/com/eternalcode/formatter/rank/VaultInitializer.java (3)

7-8: Good utility class pattern!

Private constructor prevents instantiation of this utility class, which is the right approach for a static initializer.


11-13: Smart Vault detection approach!

Using Class.forName to check for Vault's presence is a clean way to handle optional dependencies. Returns the appropriate provider when available.


15-18: Excellent fallback handling!

The catch block provides a helpful warning message and gracefully falls back to EmptyRankProvider. Users will understand what features are limited without Vault.

chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/LegacyPostProcessor.java (2)

13-18: Well-configured legacy serializer setup

The new LegacyComponentSerializer configuration looks good with proper hex color support and ampersand character handling. The unusual X repeated character hex format support is a nice touch for compatibility.


20-23: Clean pattern-based replacement approach

The simplified approach using a universal pattern matcher with the serializer's deserialize method is much cleaner than the previous nested class structure. This should be more maintainable.

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholderapi/PlaceholderAPIInitializer.java (1)

11-21: Good optional dependency handling

The reflection-based detection of PlaceholderAPI is a solid approach. The warning message when PlaceholderAPI is missing will help users understand why placeholders aren't working.

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatFormatterPlugin.java (2)

44-45: Cleaner placeholder initialization

The new approach using PlaceholderAPIInitializer and a single ConfiguredReplacer is much cleaner than the previous manual setup. Good refactoring!


48-48: Improved rank provider initialization

Using VaultInitializer.initialize(server) instead of direct instantiation is a good pattern that likely handles optional dependencies better.

README.md (2)

37-37: Excellent clarification for users

The note explaining that permissions grant access to both legacy codes and MiniMessage tags will prevent a lot of user confusion. This is exactly the kind of clarity users need.


39-81: Comprehensive permissions reference

The expanded permissions table with both legacy codes and MiniMessage tags listed is very helpful. Users can now easily see what each permission actually grants access to.

chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java (3)

31-71: Much more comprehensive permission mapping

The expanded TAG_RESOLVERS_BY_PERMISSION map now covers many more decorations and features with fine-grained permissions. This gives server admins much better control over what players can use.


73-75: Better JSON compatibility

Using JSONOptions.compatibility() in the GSON serializer configuration should improve compatibility across different Adventure versions.


137-142: Fixed permission-aware legacy code handling

The refactored messagePlaceholder method now properly handles legacy codes with permission checks. The Legacy.legacyToAdventure call with the permission predicate should fix the issues mentioned in GH-134 and GH-153.

chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (4)

12-14: Good regex patterns for different formats!

Nice job covering all the legacy color code formats - standard codes, hex codes, and vanilla-style hex codes.


16-39: Clean map structure with Character keys!

Using Character keys instead of String keys is more efficient and appropriate for single-character legacy codes.


41-64: Well-organized permission mapping!

The permission names follow a clear pattern and cover all legacy codes nicely.


100-112: Smart permission checking with wildcard support!

Good implementation that checks specific permissions first and supports multiple wildcard patterns for flexibility.

chatformatter-core/src/main/java/com/eternalcode/formatter/placeholder/PlaceholderRegistry.java (2)

11-20: Nice simplification with Sets!

Much cleaner than the previous map-based approach. The simple add methods make it easy to register new replacers.


26-43: Smart iterative replacement with safety limit!

Good approach with the 10-iteration limit to prevent infinite loops while still allowing nested placeholders to resolve.

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@vLuckyyy vLuckyyy changed the title GH-134 GH-153 Fix Wrong replacement, remove chatformatter.legacycolor` permission GH-134 GH-153 Fix Wrong replacement, remove chatformatter.legacycolor permission Jun 17, 2025

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (1)

150-175: Un-permitted codes stay as “&x” – potential double parsing

selectiveLegacyToAdventure keeps disallowed codes in the string as &<code>.
Down-stream processors (MiniMessage pre-processors, etc.) might still translate them, undoing the permission check.

A quick fix is to strip them completely when not allowed:

-            return "&" + color;
+            return "";

That fully removes the styling attempt instead of giving it a second chance.

README.md (1)

59-75: Tiny nit – “etc.” could be explicit

For chatformatter.color.* you may list “all MiniMessage colour tags and legacy & codes” instead of “etc.” to mirror the explicit style used elsewhere.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 87e82b2 and 6b26127.

📒 Files selected for processing (4)
  • README.md (2 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java (1 hunks)
  • chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (3 hunks)
  • chatformatter-paper-plugin/build.gradle.kts (0 hunks)
💤 Files with no reviewable changes (1)
  • chatformatter-paper-plugin/build.gradle.kts
🔇 Additional comments (2)
chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java (1)

177-189: Wildcard helper looks good

The helper is concise and re-usable. 👍

README.md (1)

37-47: Great clarification

The note and table now make the colour/deco mapping crystal-clear. Nice!

Comment thread chatformatter-core/src/main/java/com/eternalcode/formatter/legacy/Legacy.java Outdated
Comment thread chatformatter-core/src/main/java/com/eternalcode/formatter/ChatHandlerImpl.java Outdated
Signed-off-by: vLuckyyy <vluckyyy.biznes@gmail.com>
@vLuckyyy vLuckyyy linked an issue Jun 17, 2025 that may be closed by this pull request

@CitralFlo CitralFlo left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fuck legacy <3

If it was tested with perms the code looks perfect

…ix GSON component serialization. Simplify PlaceholderRegistry. Remove code related to ampersand shadowing. Fix run paper. Make Vault and PlaceholderAPI softly dependent. Fix junit.
@Rollczi Rollczi changed the title GH-134 GH-153 Fix Wrong replacement, remove chatformatter.legacycolor permission GH-134 GH-153 GH-155 Fix Wrong replacement, remove chatformatter.legacycolor permission Jun 21, 2025
@vLuckyyy vLuckyyy merged commit 1525967 into master Jun 24, 2025
2 checks passed
@vLuckyyy vLuckyyy deleted the more-usable-color-permission branch June 24, 2025 20:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove chatformatter.legacycolor permission. Wrong replacements

4 participants