
You are a senior Java software engineer and Minecraft Paper plugin developer. Create a production-quality Minecraft plugin named **StreakPlugin** using **Java 21**, **Paper API 1.21+**, and **Maven**. The plugin should be designed like a real open-source project with clean architecture, SOLID principles, OOP, dependency injection where appropriate, asynchronous database operations, and highly modular code. The code must be clean, documented, scalable, and easy to maintain. Never place business logic inside listeners or GUI classes. ================================================== PROJECT STRUCTURE ================================================== StreakPlugin │ ├── StreakPlugin.java │ ├── api/ │ ├── StreakAPI.java │ ├── RequestAPI.java │ ├── RewardAPI.java │ └── StatisticsAPI.java │ ├── command/ │ ├── StreakCommand.java │ ├── StreakAcceptCommand.java │ ├── StreakDenyCommand.java │ ├── StreakCancelCommand.java │ ├── StreakTopCommand.java │ └── StreakAdminCommand.java │ ├── gui/ │ ├── MainGui.java │ ├── PlayerSelectorGui.java │ ├── RequestsGui.java │ ├── RewardsGui.java │ ├── StatisticsGui.java │ ├── LeaderboardGui.java │ ├── PartnerGui.java │ └── ConfirmGui.java │ ├── listener/ │ ├── AsyncChatListener.java │ ├── JoinListener.java │ ├── QuitListener.java │ ├── InventoryClickListener.java │ ├── InventoryCloseListener.java │ └── PlayerInteractListener.java │ ├── manager/ │ ├── StreakManager.java │ ├── RequestManager.java │ ├── ChatManager.java │ ├── ProgressManager.java │ ├── RewardManager.java │ ├── RewardClaimManager.java │ ├── NotificationManager.java │ ├── StatisticsManager.java │ ├── LeaderboardManager.java │ ├── CooldownManager.java │ ├── GuiManager.java │ └── StorageManager.java │ ├── model/ │ ├── StreakData.java │ ├── StreakPair.java │ ├── StreakRequest.java │ ├── DailyProgress.java │ ├── Reward.java │ ├── RewardHistory.java │ ├── PlayerStatistics.java │ ├── LeaderboardEntry.java │ └── Notification.java │ ├── enum/ │ ├── PairStatus.java │ ├── RequestStatus.java │ ├── RewardType.java │ ├── NotificationType.java │ ├── ChatStatus.java │ └── GuiType.java │ ├── storage/ │ ├── Storage.java │ ├── SQLiteStorage.java │ ├── MySQLStorage.java │ ├── DatabaseManager.java │ └── DataSerializer.java │ ├── scheduler/ │ ├── DailyResetTask.java │ ├── ReminderTask.java │ ├── ExpireRequestTask.java │ ├── AutoSaveTask.java │ └── LeaderboardTask.java │ ├── event/ │ ├── StreakCreateEvent.java │ ├── StreakIncreaseEvent.java │ ├── StreakBreakEvent.java │ ├── StreakRewardEvent.java │ ├── RewardClaimEvent.java │ ├── StreakRequestSendEvent.java │ ├── StreakRequestAcceptEvent.java │ ├── StreakRequestDenyEvent.java │ └── DailyProgressCompleteEvent.java │ ├── service/ │ ├── ChatService.java │ ├── RewardService.java │ ├── RequestService.java │ └── StatisticsService.java │ ├── util/ │ ├── TimeUtil.java │ ├── MessageUtil.java │ ├── ItemUtil.java │ ├── HeadUtil.java │ ├── InventoryUtil.java │ ├── PlayerUtil.java │ └── ValidationUtil.java │ └── config/ ├── config.yml ├── rewards.yml ├── gui.yml ├── messages.yml └── database.yml ================================================== PLUGIN FEATURES ================================================== Create a TikTok-style friendship streak system. Players execute /streak to open the main GUI. Players can click another online player's head to send a streak request. The target player can: - Accept - Deny - Ignore After acceptance: - Both players become partners. - Only one active partner per player. - Requests automatically expire after a configurable time. ================================================== CHAT STREAK LOGIC ================================================== A streak only progresses when BOTH partners have chatted during the same day. Requirements: - Only messages sent in public chat count. - Ignore commands. - Ignore empty messages. - Ignore spam (configurable cooldown). - Only the first valid message per player counts. - Both partners must complete their chat before the daily reset. If completed: - Increase streak by one. - Save progress. - Fire custom events. - Check milestone rewards. - Send notifications. If incomplete: - Break streak. - Reset progress. - Save statistics. - Notify both players. ================================================== REWARD SYSTEM ================================================== Rewards are fully configurable in rewards.yml. Support: - Vault economy - Console commands - Player commands - Items - XP - Permissions - Custom messages - Sounds - Titles - ActionBars Example: Day 1: - $1000 Day 5: - $7000 - Diamond x1 Day 10: - Netherite - Money - Commands Every 5-day milestone should support custom rewards. ================================================== GUI SYSTEM ================================================== Create modern inventory GUIs with configurable layouts. Main GUI - Partner - Current streak - Highest streak - Today's progress - Rewards - Statistics - Pending requests - Leaderboard Player Selector GUI - Shows online player heads. - Pagination. - Search support. Requests GUI - Accept - Deny - Expiration timer Rewards GUI - Locked milestones - Unlocked milestones - Claimed rewards - Upcoming rewards Statistics GUI - Current streak - Highest streak - Total streaks - Total rewards - Days completed - Broken streaks Leaderboard GUI - Top streaks - Pagination Partner GUI - Partner information - Last chat - Progress - Join date ================================================== DATABASE ================================================== Support SQLite and MySQL. Create repositories. Automatic table creation. Prepared statements. Async loading and saving. Caching layer. ================================================== CUSTOM EVENTS ================================================== Create: - StreakCreateEvent - StreakIncreaseEvent - StreakBreakEvent - RewardClaimEvent - StreakRewardEvent - StreakRequestSendEvent - StreakRequestAcceptEvent - StreakRequestDenyEvent - DailyProgressCompleteEvent ================================================== PERFORMANCE ================================================== Never block the main server thread. Run database operations asynchronously. Cache player and streak data. Minimize database queries. Use efficient collections. ================================================== CONFIGURATION ================================================== Generate: - plugin.yml - config.yml - gui.yml - rewards.yml - messages.yml - database.yml Everything must be configurable. ================================================== OUTPUT ================================================== Generate the complete Maven project. Create every package, every class, every interface, every enum, every event, every manager, every model, every scheduler, every GUI, every configuration file, and implement production-ready code. Write code one file at a time in dependency order so the project compiles successfully from start to finish. Do not leave TODOs or placeholder implementations unless absolutely necessary.