-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Stage complete. Sync master. #46
Conversation
* Implemented Ping command. * Edited README.md. moved ReportWithLog.png to .github.
Create dependabot.yml, Try adding a dependabot. Signed-off-by: 容小狸 <[email protected]>
* Added HuTools, Sync. * Finished PicturePlugin.
Update Ping.java, cancelled prefix
* Finish DailyFortune. Edited README.md.
* Greet peoples automaticly. (#15) Create greetings.yml Signed-off-by: 容小狸 <[email protected]> * Automaticly stale issues and PRs. (#16) * Create stale.yml Signed-off-by: 容小狸 <[email protected]> * Sync. Maybe we need to public all plugin names. * Create LICENCE. (#25) Signed-off-by: 容小狸 <[email protected]> * Add license scan report and status (#28) * Add license scan report and status Signed off by: fossabot <[email protected]> * Update README.md Signed-off-by: 容小狸 <[email protected]> --------- Signed-off-by: 容小狸 <[email protected]> Co-authored-by: 容小狸 <[email protected]> * Update README.md (#31) * Update greetings.yml (#32) Signed-off-by: 容小狸 <[email protected]> * Sync. Data reading framework complete. --------- Signed-off-by: 容小狸 <[email protected]> Co-authored-by: fossabot <[email protected]>
* Fixed logger. * Removed ElysiaLogger. * Apply changes. Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: 容小狸 <[email protected]>
* Rearranged plugin data struct.
Update PicturesPlugin.java Signed-off-by: Moshonne <[email protected]>
# Conflicts: # .github/ISSUE_TEMPLATE/Enhance.yaml
* Rename project. * Update buildTest.yaml Signed-off-by: 容小狸 <[email protected]>
WalkthroughThe pull request introduces significant changes to the project, primarily transitioning from the "Elysia" framework to "ArisuBot." This includes updates to various GitHub issue templates, the addition of new classes and interfaces, and modifications to existing files to reflect the new project name. The changes also involve restructuring package declarations, enhancing logging mechanisms, and implementing new functionality for commands and data management related to user interactions. Changes
Poem
Warning Rate limit exceeded@rong-xiaoli has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 1 minutes and 7 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 51
🧹 Outside diff range and nitpick comments (54)
src/main/java/top/rongxiaoli/backend/PluginBase/PluginDataBase.java (1)
4-4
: Replace TODO comment with a GitHub issueThe TODO comment "Complete plugin data" is vague and lacks actionable details. It would be better tracked in the issue system.
Would you like me to create a GitHub issue to track the remaining implementation details for the plugin data system?
build.gradle (1)
7-9
: Consider dependency management improvementsConsider these improvements for better dependency management:
- Declare the version in a separate
ext
block orgradle.properties
for better version management- Consider using more specific Hutool modules instead of
hutool-all
to reduce the dependency footprint+ext { + hutoolVersion = '5.8.21' +} dependencies { - implementation 'cn.hutool:hutool-all:5.8.21' + implementation "cn.hutool:hutool-core:${hutoolVersion}" + // Add only the specific Hutool modules you need }.github/workflows/AutoContributor.yaml (2)
1-1
: Remove the trailing period from the workflow nameThe workflow name should follow the conventional format without trailing punctuation.
-name: Auto adding contributors when version bumps. +name: Auto adding contributors when version bumps
3-8
: Consider adding concurrency control for version tagsAdd concurrency configuration to prevent simultaneous runs on the same tag, which could lead to race conditions.
on: push: tags: - 'v*' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: truesrc/main/java/top/rongxiaoli/plugins/DailyFortune/UploadFileFilter.java (2)
7-8
: Add class-level documentationConsider adding a class-level Javadoc comment explaining the purpose and usage of this filter class.
Example addition:
+/** + * A file filter that accepts files based on their extensions. + * This filter is used in the DailyFortune plugin to filter files + * during upload operations. + */ public class UploadFileFilter implements FilenameFilter {
20-31
: Consider optimizing the accept methodWhile the current implementation is functional, it could be improved for performance and readability.
Consider this more efficient implementation:
@Override public boolean accept(File dir, String name) { - boolean accept = false; - for (String str : - types) { - if (name.endsWith(str)) { - accept = true; - break; - } - } - return accept; + String lowerName = name.toLowerCase(); + return Arrays.stream(types) + .map(String::toLowerCase) + .anyMatch(lowerName::endsWith); }This version:
- Adds case-insensitive matching
- Uses streams for cleaner code
- Eliminates the need for a mutable flag
src/main/java/top/rongxiaoli/plugins/PicturesPlugin/PictureAPIDataStruct.java (2)
5-9
: Consider making the class immutable and adding null checksThe class handles API response data and could benefit from being immutable to ensure thread safety. Additionally, the constructor should validate its parameters.
Consider applying these improvements:
-public class PictureAPIDataStruct { +public final class PictureAPIDataStruct { - public String error; - public List<Data> data; + private final String error; + private final List<Data> data; public PictureAPIDataStruct(String error, List<Data> data) { + this.error = error != null ? error : ""; + this.data = data != null ? List.copyOf(data) : List.of(); - this.error = error; - this.data = data; }
1-38
: Consider implementing serialization/deserialization supportSince this class represents API data, consider adding JSON serialization/deserialization support using a library like Jackson or Gson. This would help ensure proper data mapping and validation during API interactions.
You might want to add annotations for JSON mapping and consider implementing custom deserializers for proper validation during object creation. Would you like me to provide an example implementation?
README.md (3)
14-14
: Fix heading style for consistencyThe heading style should use ATX-style headers (with #) for consistency.
-使用建议 ---- +## 使用建议🧰 Tools
🪛 Markdownlint (0.35.0)
14-14: Expected: atx; Actual: setext
Heading style(MD003, heading-style)
16-26
: Consider adding English translations for better accessibilitySince this is a public repository, consider adding English translations alongside the Chinese text to make it more accessible to a global audience.
Example structure:
## Usage Recommendations (使用建议) Due to the nature of the code, it's recommended to add the following plugins for smooth operation: ### Required (必选): [chat-command](https://github.com/project-mirai/chat-command) - Essential plugin for receiving client commands through CommandSender interface. ### Optional (可选): [LuckPerms-mirai](https://github.com/Karlatemp/LuckPerms-Mirai) - Popular permission management system known for its user-friendly interface.
28-40
: Consider adding progress indicators and prioritiesThe checklist effectively shows completed items, but could be more informative with:
- Progress indicators for in-development features
- Priority levels for pending items
- Brief descriptions or links to related issues
Example structure:
## Feature Status - [x] Ping - ✅ Completed - [x] 今日运势 (Daily Fortune) - ✅ Completed - [ ] 自动加入 (Auto Join) - 🚧 In Progress #<issue-number> - [ ] 机器人管理命令 (Bot Management) - ⭐ High Prioritysrc/main/java/top/rongxiaoli/backend/PluginLoader/DataLoader.java (2)
19-43
: Add error handling and modernize codeThe lifecycle methods need error handling and could be more concise using Java streams.
Consider this improvement:
public void load() { - for (PluginDataBase e : - DataList) { - e.load(); - } + dataList.forEach(plugin -> { + try { + plugin.load(); + } catch (Exception e) { + // Log the error but continue with other plugins + logger.error("Failed to load plugin: " + plugin.getClass().getName(), e); + } + }); }Apply similar changes to
reload()
,shutdown()
, andsaveData()
methods. Also, remove the empty line at 41.
9-44
: Consider adding monitoring and management capabilitiesThe class would benefit from these architectural improvements:
- Add logging throughout the lifecycle methods
- Add JavaDoc documentation for public methods
- Consider adding methods to:
- Query plugin status
- Get list of loaded plugins
- Handle plugin dependencies
- Consider implementing a proper shutdown hook for cleanup
Would you like me to provide specific examples for any of these improvements?
src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java (3)
1-8
: Add class-level documentation to clarify the role in ArisuBot architectureConsider adding a comprehensive class-level Javadoc comment explaining:
- The purpose of this abstract class in the ArisuBot framework
- The relationship with JSimpleCommand and PluginBase
- Usage guidelines for implementing classes
Example addition:
/** * Abstract base class for simple commands in the ArisuBot framework. * Extends JSimpleCommand for basic command functionality and implements PluginBase * for lifecycle management. * * @see net.mamoe.mirai.console.command.java.JSimpleCommand * @see top.rongxiaoli.backend.PluginBase.PluginBase */
15-33
: Enhance lifecycle method documentationThe current documentation for lifecycle methods could be more descriptive to guide implementations.
Consider adding more detailed Javadoc:
/** * Initializes the command when first loaded. * Implementing classes should perform one-time setup operations here, * such as initializing resources or loading configuration. */ public void load() { } /** * Resets the command state. * Implementing classes should reset their internal state without * reloading external resources. Used for runtime resets. */ public void reload() { } /** * Performs cleanup when the command is being shut down. * Implementing classes should release resources and save any * pending changes here. */ public void shutdown() { }
35-47
: Improve data management method specificationsThe data management methods should provide more guidance about:
- Exception handling expectations
- Thread safety considerations
- Synchronization requirements
Consider updating the implementation:
/** * Manually saves the command's data to persistent storage. * * @throws IOException if data cannot be saved * @throws IllegalStateException if called before initialization * @implNote This method should be thread-safe */ public synchronized void saveData() throws IOException { } /** * Reloads the command's data from persistent storage, * discarding any unsaved changes in memory. * * @throws IOException if data cannot be loaded * @throws IllegalStateException if called before initialization * @implNote This method should be thread-safe */ public synchronized void reloadData() throws IOException { }src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractRawCommand.java (1)
1-9
: Add class-level documentation for better maintainability.As this is an abstract base class for commands, consider adding comprehensive class-level JavaDoc documentation explaining:
- The purpose and responsibilities of this class
- How to extend this class correctly
- The relationship with JRawCommand and PluginBase
- Usage examples
package top.rongxiaoli.backend.Commands; import net.mamoe.mirai.console.command.java.JRawCommand; import net.mamoe.mirai.utils.MiraiLogger; import org.jetbrains.annotations.NotNull; import top.rongxiaoli.ArisuBot; import top.rongxiaoli.backend.PluginBase.PluginBase; +/** + * Abstract base class for raw commands in ArisuBot. + * <p> + * This class provides a foundation for implementing raw commands by extending {@link JRawCommand} + * and implementing {@link PluginBase}. Raw commands handle message content directly without + * automatic parsing. + * <p> + * Example usage: + * <pre>{@code + * public class MyCommand extends ArisuBotAbstractRawCommand { + * public MyCommand() { + * super("mycommand", new String[]{"mc", "mycmd"}); + * } + * } + * }</pre> + */ public class ArisuBotAbstractRawCommand extends JRawCommand implements PluginBase {src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractCompositeCommand.java (3)
1-8
: Consider following Java package naming conventionsThe package name
Commands
should be lowercase (commands
) to follow Java naming conventions.-package top.rongxiaoli.backend.Commands; +package top.rongxiaoli.backend.commands;
9-10
: Improve logger declarationConsider these improvements for the logger:
- Make it
private final
for immutability- Simplify the logger name as the class name is already included by default
- private MiraiLogger LOGGER = MiraiLogger.Factory.INSTANCE.create(ArisuBotAbstractCompositeCommand.class, "ArisuBot.AbstractCompositeCommand"); + private final MiraiLogger LOGGER = MiraiLogger.Factory.INSTANCE.create(ArisuBotAbstractCompositeCommand.class, "AbstractCompositeCommand");
11-13
: Consider adding parameter validationWhile @NotNull annotations help at compile-time, consider adding runtime checks for empty strings or null array elements.
public ArisuBotAbstractCompositeCommand(@NotNull String primaryName, @NotNull String[] secondaryNames) { + if (primaryName.trim().isEmpty()) { + throw new IllegalArgumentException("Primary name cannot be empty"); + } + if (secondaryNames != null) { + for (String name : secondaryNames) { + if (name == null || name.trim().isEmpty()) { + throw new IllegalArgumentException("Secondary names cannot contain null or empty values"); + } + } + } super(ArisuBot.INSTANCE, primaryName, secondaryNames); }.github/workflows/buildTest.yaml (1)
46-47
: LGTM! Consider being more specific with artifact patterns.The renaming from Elysia to ArisuBot is consistent. However, the glob pattern
ArisuBot-*.*.*.mirai2.jar
might be too permissive.Consider using a more specific pattern that extracts version from the git tag:
- path: ./build/mirai/ArisuBot-*.*.*.mirai2.jar + path: ./build/mirai/ArisuBot-${{ github.ref_name }}.mirai2.jarsrc/main/java/top/rongxiaoli/backend/PluginLoader/PluginLoader.java (3)
Line range hint
18-18
: Consider renaming INSTANCE field for consistencyThe field name
INSTANCE
could be more descriptive and follow Java naming conventions for instance fields (camelCase). Consider renaming it tocommandManager
to better reflect its purpose.- private final CommandManager INSTANCE = CommandManager.INSTANCE; + private final CommandManager commandManager = CommandManager.INSTANCE;
Line range hint
27-31
: Add error handling for plugin loadingThe load operation should handle potential exceptions during plugin initialization to prevent a single plugin failure from affecting the entire system.
public void load() { addPlugins(); for (PluginBase e : PluginList) { - e.load(); + try { + e.load(); + } catch (Exception ex) { + // Log the error and continue loading other plugins + logger.error("Failed to load plugin: " + e.getClass().getSimpleName(), ex); + } } }
Line range hint
13-65
: Consider implementing plugin dependency managementThe current implementation doesn't handle plugin dependencies. Consider:
- Adding a mechanism for plugins to declare their dependencies
- Implementing topological sorting for load order
- Validating dependencies before loading
This would prevent issues where plugins requiring other plugins' functionality load in the wrong order.
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java (3)
19-27
: LGTM! Consider making LOGGER final.The class structure and initialization look good. The singleton pattern is correctly implemented, and the command aliases are well-chosen for both English and Chinese users.
Consider marking the LOGGER field as final since it's never reassigned:
- private final MiraiLogger LOGGER = MiraiLogger.Factory.INSTANCE.create(DailyFortune.class, "ArisuBot.DailyFortune"); + private static final MiraiLogger LOGGER = MiraiLogger.Factory.INSTANCE.create(DailyFortune.class, "ArisuBot.DailyFortune");
66-80
: Consider improvements to date handling and random number generation.The current implementation has room for improvement:
- Calendar operations could be simplified using modern Java time API
- Consider using SecureRandom for better randomization
private int getRandom(long ID) { - Calendar cal = new GregorianCalendar(); - int year, month, day; - year = cal.get(Calendar.YEAR) * 10000; - month = cal.get(Calendar.MONTH) * 100; - day = cal.get(Calendar.DAY_OF_YEAR); - Random rand; - if (cal.get(Calendar.MONTH) == Calendar.APRIL && cal.get(Calendar.DAY_OF_MONTH) == 1) { - rand = new Random(); + LocalDate today = LocalDate.now(); + SecureRandom rand = new SecureRandom(); + if (today.getMonthValue() == 4 && today.getDayOfMonth() == 1) { return rand.nextInt(-100, 201); } - long seedLong = ID + year + month + day; - rand = new Random(seedLong); + long seedLong = ID + today.getYear() * 10000L + today.getMonthValue() * 100L + today.getDayOfYear(); + rand.setSeed(seedLong); return rand.nextInt(0, 101); }
125-129
: Improve special date checks.The programmer's day check can be simplified using modern Java time API.
- Calendar cal = new GregorianCalendar(); - if ((cal.get(Calendar.MONTH) == Calendar.OCTOBER && cal.get(Calendar.DAY_OF_MONTH) == 24) | - (cal.get(Calendar.DAY_OF_YEAR) == 256)) { + LocalDate today = LocalDate.now(); + if ((today.getMonthValue() == 10 && today.getDayOfMonth() == 24) || + today.getDayOfYear() == 256) { LOGGER.verbose("Happy programmer's day! "); }src/main/java/top/rongxiaoli/plugins/DailySign/DailySignString.java (2)
83-150
: Consider externalizing holiday messagesHoliday messages are hardcoded in the method. Consider moving them to a configuration file or resource bundle for easier maintenance and potential internationalization.
Example structure:
private static final Map<HolidayKey, String> HOLIDAY_MESSAGES = loadHolidayMessages(); // ... in method if (isHoliday(month, day, hour)) { MixedString = HOLIDAY_MESSAGES.get(new HolidayKey(month, day)); }
1-351
: Add unit tests for the string generation logicThis utility class contains complex logic with multiple branches and time-dependent behavior. Unit tests are crucial to ensure reliability.
Would you like me to help create a comprehensive test suite that covers:
- Holiday-specific messages
- Time-based messages
- Random string selection
- Edge cases and error conditions
src/main/java/top/rongxiaoli/Elysia.java (3)
17-17
: RenamePluginRunning
to follow Java naming conventionsIn Java, it's standard to use camelCase for variable names. Consider renaming
PluginRunning
topluginRunning
for consistency.
53-57
: Rename methods to follow Java naming conventionsMethod names should start with a lowercase letter. Consider renaming
GetConfigPath()
togetConfigPath()
andGetDataPath()
togetDataPath()
.
20-24
: Consider updating the plugin version from"0.0.0"
Using
"0.0.0"
as the version number may not be informative. Consider setting an appropriate version number that reflects the plugin's development status.src/main/java/top/rongxiaoli/plugins/DailySign/DailySignData.java (6)
12-12
: Ensure consistent logging levels throughout the classThe
LOGGER
is used with bothverbose
anddebug
levels in different methods. For clarity and maintainability, consider standardizing the logging level across all methods.
29-55
: Reduce code duplication in lifecycle methodsThe methods
load()
,reload()
,saveData()
, andshutdown()
have similar structures and repetitive code. To adhere to the DRY (Don't Repeat Yourself) principle, consider extracting the common functionality into a private helper method.You could implement a private method like this:
private void performDataOperation(String operation) { LOGGER.debug(operation + " data."); if (operation.equals("Load") || operation.equals("Reload")) { ArisuBot.INSTANCE.reloadPluginData(INSTANCE); } else if (operation.equals("Save") || operation.equals("Shutdown")) { ArisuBot.INSTANCE.savePluginData(INSTANCE); } LOGGER.debug(operation + " complete."); }Then simplify your methods:
@Override public void load() { performDataOperation("Load"); } @Override public void reload() { performDataOperation("Reload"); } @Override public void saveData() { performDataOperation("Save"); } @Override public void shutdown() { performDataOperation("Shutdown"); }
74-76
: Limit logging after data updatesAfter setting a user's last sign date in
setLastSignDate
, the entirelastSignDateDataset
is logged. This could lead to large amounts of log data. Consider logging only the affected user's data or using conditional logging levels.
84-86
: Limit logging after data updatesIn the
setSignCombo
method, logging the entiresignComboDataSet
after each update might not be necessary. To prevent log flooding, consider logging only pertinent information or adjusting the logging level.
69-72
: Optimize data update without redundant settingWhen modifying
lastSignDateDataset
, you retrieve the map, modify it, and then set it back usingset()
. IfValue.get()
returns a mutable map, setting it back may be unnecessary. Verify if the map is mutable and, if so, modify it directly to improve efficiency.
79-82
: Optimize data update without redundant settingSimilarly, in
setSignCombo
, consider modifying thesignComboDataSet
directly without callingset()
if the map is mutable. This can enhance performance and reduce unnecessary operations.src/main/java/top/rongxiaoli/plugins/PicturesPlugin/DelayedDisposer.java (7)
30-37
: Follow Java naming conventions for method namesMethod names should start with a lowercase letter and use camelCase. Please update the method names accordingly for consistency and readability.
Apply this diff to rename the methods:
-public void AddUser(User user) throws ElementAlreadyExistsException { +public void addUser(User user) throws ElementAlreadyExistsException { // ... -public void AddUser(User user, int intervalSecond) throws ElementAlreadyExistsException { +public void addUser(User user, int intervalSecond) throws ElementAlreadyExistsException {
58-69
: Optimize user lookup inQueryCoolingTime
methodThe method iterates over the entire
coolingQueue
to find a user, which can be inefficient. Consider maintaining aMap
of user IDs toCoolingUser
objects for faster access.Implement a
ConcurrentHashMap<Long, CoolingUser>
to map user IDs toCoolingUser
instances:-private final DelayQueue<CoolingUser> coolingQueue; +private final DelayQueue<CoolingUser> coolingQueue; +private final ConcurrentHashMap<Long, CoolingUser> userCoolingMap;Update methods to maintain the map:
public void addUser(User user) throws ElementAlreadyExistsException { // ... CoolingUser coolingUser = new CoolingUser(user.getId()); coolingQueue.add(coolingUser); userCoolingMap.put(user.getId(), coolingUser); // ... } public long queryCoolingTime(User user) throws NoSuchElementException { CoolingUser coolingUser = userCoolingMap.get(user.getId()); if (coolingUser != null) { return coolingUser.getDelay(TimeUnit.SECONDS); } else { return 0; } }Ensure to remove the user from
userCoolingMap
when they are ejected:while ((u = disposer.coolingQueue.poll()) != null) { LOGGER.verbose("Ejecting delayed element: " + u.user); disposer.userHashSet.remove(u.user); disposer.userCoolingMap.remove(u.user); }
135-139
: Handle sleep interruptions properly inDelayConsumer
If
ThreadUtil.safeSleep(500)
returnsfalse
, the thread exits without settingisConsuming
back tofalse
, which may cause incorrect status reporting.Consider ensuring
isConsuming
is always correctly updated:if (!ThreadUtil.safeSleep(500)) { LOGGER.warning("Sleep is interrupted. "); isConsuming = false; return; } +isConsuming = false;
Alternatively, use a
finally
block to ensureisConsuming
is set tofalse
when the thread exits.
21-21
: Evaluate the necessity of theisLocked
variableThe
isLocked
variable is declared but never modified after initialization. If it's intended for future use, consider implementing its functionality; otherwise, it can be removed.If not used, remove the variable:
-private boolean isLocked = false;
3-3
: Consider using standard Java threading utilitiesThe
ThreadUtil
fromcn.hutool.core.thread.ThreadUtil
is used for sleeping. If external library usage is not necessary, consider using standard Java methods likeThread.sleep()
to reduce dependencies.Replace
ThreadUtil.safeSleep(500)
withThread.sleep(500)
and handleInterruptedException
:-if (!ThreadUtil.safeSleep(500)) { +try { + Thread.sleep(500); +} catch (InterruptedException e) { LOGGER.warning("Sleep is interrupted. "); isConsuming = false; return; +}Remove the unused import:
-import cn.hutool.core.thread.ThreadUtil;
85-86
: Protectuser
field inCoolingUser
classThe
user
field is package-private but accessed outside of the class. Consider making itprivate
and providing a getter method for encapsulation.Apply this diff to encapsulate the field:
-public final long user; +private final long user; +public long getUser() { + return user; +}Update references to
u.user
withu.getUser()
.
107-117
: Extend from a more specific exception classThe
ElementAlreadyExistsException
currently extendsException
. Consider extending fromIllegalArgumentException
orDuplicateKeyException
to provide more context.-public static class ElementAlreadyExistsException extends Exception { +public static class ElementAlreadyExistsException extends IllegalArgumentException {src/main/java/top/rongxiaoli/plugins/DailySign/DailySign.java (2)
44-45
: Consider removing unnecessary verbose loggingThe verbose logging of
Calendar.DAY_OF_YEAR
may not be necessary in production code and could clutter the logs.If these logs are not required for debugging, consider removing them.
- logger.verbose(String.valueOf(gCalendar.get(Calendar.DAY_OF_YEAR))); - logger.verbose(String.valueOf(lastSign.get(Calendar.DAY_OF_YEAR)));
55-56
: Add braces around theelse
block for consistencyFor better readability and to prevent future errors, it's recommended to use braces even for single-line
else
blocks.Here's the suggested change:
if (newSign.getTimeInMillis() - lastSign.getTimeInMillis() >= 86_400_000) { newCombo = 1; - } else newCombo = signCombo + 1; + } else { + newCombo = signCombo + 1; + }src/main/java/top/rongxiaoli/plugins/PicturesPlugin/PicturesPlugin.java (7)
61-64
: Avoid duplicate log messagesThe warning "This command cannot be invoked from console!" is logged twice when either
userID
orsubjectID
is zero. Consider logging it once to reduce redundancy.Apply this diff to remove the duplicate log:
} catch (NullPointerException e) { LOGGER.warning("This command cannot be invoked from console! "); } -if (userID == 0 || subjectID == 0) { - LOGGER.warning("This command cannot be invoked from console! "); +if (userID == 0 || subjectID == 0) { return; }
84-89
: Implement the TODO: Use reply messages instead of direct messagesThe comments indicate a plan to use reply messages instead of direct messages to the user. Updating the code to use
Reply
ensures better user experience by directly associating the bot's response with the user's message.Apply this diff to use reply messages:
if (isDirectMessaging) { - context.getSender().sendMessage("请等待冷却:" + time + "秒"); // XXX: Use reply instead of directly say sth. + context.getSender().sendMessage(new QuoteReply(context.getOriginalMessage()) + .plus("请等待冷却:" + time + "秒")); LOGGER.verbose("User is cooling. Done. "); } else { context.getSender().sendMessage(new At(userID) - .plus("请等待冷却:" + time + "秒")); // Todo: Use reply instead of directly say sth. + .plus(new QuoteReply(context.getOriginalMessage())) + .plus("请等待冷却:" + time + "秒")); LOGGER.verbose("User is cooling. Done. "); }Would you like assistance in fully implementing this feature?
130-147
: Improve file existence check and exception handlingThe current check for file existence uses
FileUtil.isExistsAndNotDirectory
, which might not handle all cases properly. Additionally, the exception handling in the file download process can be refined to distinguish between different failure modes.Apply this diff to improve the file existence check and exception handling:
// File exists? File imageFile = new File(targetPath.toFile(), localFileName); -if (!FileUtil.isExistsAndNotDirectory(imageFile.toPath(), false)) { +if (!imageFile.exists() || imageFile.isDirectory()) { try { HttpUtil.downloadFile(base.getData().get(0).urls.regular, targetPath.toFile()); LOGGER.verbose("Picture downloaded."); } catch (IORuntimeException e) { context.getSender().sendMessage("图片源请求失败。"); isPictAvailable = false; - } catch (HttpException e) { + } catch (HttpException e) { context.getSender().sendMessage("图片可能已从Pixiv移除。"); isPictAvailable = false; + } catch (Exception e) { + context.getSender().sendMessage("未知错误,无法下载图片。"); + isPictAvailable = false; } } else { LOGGER.verbose("File exists."); }
190-195
: Adjust logging levels for consistencyUsing both
LOGGER.warning
andLOGGER.info
withinmessageOutputToLogAsWarn
may not be consistent with the method's intent to log warnings. Consider using a consistent logging level for clarity.Apply this diff to adjust the logging levels:
private void messageOutputToLogAsWarn(MessageChain mc) { LOGGER.warning("Message.contentToString: "); - LOGGER.info("MessageChain element start. "); + LOGGER.warning("MessageChain element start. "); for (Message m : mc) { LOGGER.warning(m.contentToString()); } - LOGGER.info("MessageChain element end. "); + LOGGER.warning("MessageChain element end. "); }
38-41
: Update plugin metadata to reflect new command usageEnsure that the
setUsage
andsetDescription
methods accurately represent the command's functionality, especially after significant changes to the plugin.For example, if new features or parameters have been added, update the usage instruction accordingly.
203-213
: Check directory creation logic and error handlingThe condition in
if (!targetPath.toFile().mkdirs() && targetPath.toFile().exists())
might not correctly handle all scenarios for directory creation. Additionally, the warning message might be misleading.Apply this diff to improve directory creation logic:
LOGGER.verbose("Try creating directories."); Path targetPath = new File(ArisuBot.GetDataPath().toFile(), "PictureCache").toPath(); LOGGER.verbose("Cache directory: " + targetPath.toString()); -if (!targetPath.toFile().mkdirs() && targetPath.toFile().exists()) { - LOGGER.warning("Directories could not be created. Could be either directory already exists or directory cannot be created. "); +if (!targetPath.toFile().exists()) { + boolean dirsCreated = targetPath.toFile().mkdirs(); + if (!dirsCreated) { + LOGGER.error("Failed to create directory: " + targetPath.toString()); + } else { + LOGGER.verbose("Directory created: " + targetPath.toString()); + } } else { - LOGGER.verbose("Directory already exists."); + LOGGER.verbose("Directory already exists: " + targetPath.toString()); }
163-165
: Optimize MessageChain constructionInstead of creating a new
MessageChainBuilder
, you can directly send the image as aMessageChain
. This simplifies the code and reduces unnecessary object creation.Apply this diff to simplify message sending:
Image image = ExternalResource.uploadAsImage(imageFile, context.getSender().getSubject()); -context.getSender().sendMessage(new MessageChainBuilder().append(image).build()); +context.getSender().sendMessage(new MessageChain(image));
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (1)
.github/ReportWithLog.png
is excluded by!**/*.png
📒 Files selected for processing (34)
.github/ISSUE_TEMPLATE/Bug.yaml
(1 hunks).github/ISSUE_TEMPLATE/Enhance.yaml
(2 hunks).github/ISSUE_TEMPLATE/Feature.yaml
(1 hunks).github/dependabot.yml
(1 hunks).github/workflows/AutoContributor.yaml
(1 hunks).github/workflows/buildTest.yaml
(1 hunks).gitignore
(1 hunks)README.md
(2 hunks)build.gradle
(1 hunks)settings.gradle
(1 hunks)src/main/java/top/rongxiaoli/Elysia.java
(1 hunks)src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractCompositeCommand.java
(1 hunks)src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractRawCommand.java
(1 hunks)src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java
(1 hunks)src/main/java/top/rongxiaoli/backend/DataLoader.java
(0 hunks)src/main/java/top/rongxiaoli/backend/PluginBase/PluginBase.java
(1 hunks)src/main/java/top/rongxiaoli/backend/PluginBase/PluginConfigBase.java
(1 hunks)src/main/java/top/rongxiaoli/backend/PluginBase/PluginDataBase.java
(1 hunks)src/main/java/top/rongxiaoli/backend/PluginDataBase.java
(0 hunks)src/main/java/top/rongxiaoli/backend/PluginLoader/ConfigLoader.java
(1 hunks)src/main/java/top/rongxiaoli/backend/PluginLoader/DataLoader.java
(1 hunks)src/main/java/top/rongxiaoli/backend/PluginLoader/PluginLoader.java
(2 hunks)src/main/java/top/rongxiaoli/log/ElysiaLogger.java
(0 hunks)src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/DailyFortune/UploadFileFilter.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/DailySign/DailySign.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/DailySign/DailySignData.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/DailySign/DailySignString.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/DailySign/DailySignTimer.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/PicturesPlugin/DelayedDisposer.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/PicturesPlugin/PictureAPIDataStruct.java
(1 hunks)src/main/java/top/rongxiaoli/plugins/PicturesPlugin/PicturesPlugin.java
(2 hunks)src/main/java/top/rongxiaoli/plugins/Ping/Ping.java
(1 hunks)src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
(1 hunks)
💤 Files with no reviewable changes (3)
- src/main/java/top/rongxiaoli/backend/DataLoader.java
- src/main/java/top/rongxiaoli/backend/PluginDataBase.java
- src/main/java/top/rongxiaoli/log/ElysiaLogger.java
✅ Files skipped from review due to trivial changes (7)
- .github/ISSUE_TEMPLATE/Enhance.yaml
- .github/dependabot.yml
- settings.gradle
- src/main/java/top/rongxiaoli/backend/PluginBase/PluginBase.java
- src/main/java/top/rongxiaoli/backend/PluginBase/PluginConfigBase.java
- src/main/java/top/rongxiaoli/backend/PluginLoader/ConfigLoader.java
- src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
🧰 Additional context used
🪛 Markdownlint (0.35.0)
README.md
14-14: Expected: atx; Actual: setext
Heading style
(MD003, heading-style)
🔇 Additional comments (23)
build.gradle (2)
7-9
: Verify Hutool dependency version and security implications
The addition of hutool-all
brings in a large set of utilities. Let's verify the version and security implications.
Line range hint 1-21
: Verify Java 8 compatibility with dependencies
The build is configured for Java 8 (jvmTarget JavaVersion.VERSION_1_8
). Ensure all dependencies, including the new Hutool library, are compatible with Java 8.
✅ Verification successful
Let me try a different approach to verify Hutool's Java compatibility.
Since we couldn't get direct information from the repository or Maven metadata, and Hutool is a widely used library in the Java ecosystem, I'll generate the final response:
Hutool 5.8.21 is compatible with Java 8
Hutool 5.8.21 is known to maintain Java 8 compatibility as its baseline requirement, which aligns with your project's Java 8 target. The library's core functionality and utilities are designed to work with Java 8 and above, making it safe to use with your current configuration (jvmTarget JavaVersion.VERSION_1_8
).
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check Hutool's Java version requirements
curl -s "https://search.maven.org/solrsearch/select?q=g:cn.hutool+AND+a:hutool-all+AND+v:5.8.21&rows=1&wt=json" | \
jq -r '.response.docs[0].ec | select(contains("Java"))' || \
echo "Java version information not available in Maven metadata"
Length of output: 401
Script:
#!/bin/bash
# Check if there's any explicit Java version requirement mentioned in the README or documentation
rg -i "java.*requirement|requires.*java|minimum.*java" --type md
# Also check for any potential Java version related configurations or annotations in the codebase
rg -i "targetCompatibility|sourceCompatibility|@since.*java|requires.*java" --type gradle --type java --type kt
Length of output: 207
.github/workflows/AutoContributor.yaml (1)
13-15
: LGTM: Appropriate permissions configuration
The permissions are correctly scoped to the minimum required access levels for the workflow.
.github/ISSUE_TEMPLATE/Feature.yaml (1)
26-26
: LGTM! URL update aligns with repository transition.
The URL change from 'Elysia' to 'ArisuBot' correctly reflects the project's transition.
Let's verify the consistency of this change across other issue templates:
✅ Verification successful
Repository references consistently updated across all issue templates
All issue templates (Bug.yaml, Enhance.yaml, and Feature.yaml) have been properly updated to use 'ArisuBot' instead of 'Elysia' in their URLs. No remaining references to 'Elysia' were found in any of the templates.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if all issue templates have been updated to use the new repository name
# Search for any remaining references to the old repository name in issue templates
rg -g "ISSUE_TEMPLATE/*.y*ml" "Elysia" .github/
# List all issue template files for manual verification
fd -g "*.y*ml" .github/ISSUE_TEMPLATE/
Length of output: 192
Script:
#!/bin/bash
# Check content of all issue templates for any remaining references to 'Elysia'
for file in .github/ISSUE_TEMPLATE/*.yaml; do
echo "=== $file ==="
cat "$file" | grep -i "elysia\|arisubot"
done
Length of output: 1089
src/main/java/top/rongxiaoli/plugins/DailyFortune/UploadFileFilter.java (2)
1-6
: LGTM!
Package declaration and imports are clean and well-organized.
1-32
: Verify for potential code duplication
Let's ensure this functionality isn't already available elsewhere in the codebase.
✅ Verification successful
Let me search for any other potential file filtering or extension checking implementations that might have been missed.
Let me check the content of these files to see if there's any similar functionality.
Based on the verification results, I can now provide the final response:
No code duplication found - implementation is unique
The UploadFileFilter
class provides a unique implementation in the codebase. Our thorough search revealed:
- No other implementations of
FilenameFilter
interface - No similar file extension filtering logic elsewhere
- The class serves a specific purpose in the DailyFortune plugin without duplicating functionality
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for similar file filtering implementations
ast-grep --pattern 'implements FilenameFilter {
$$$
}'
# Search for similar file extension checking logic
rg -l "endsWith\(.*\)" --type java
Length of output: 167
Script:
#!/bin/bash
# Search for any classes that might handle file filtering
rg -l "\.filter" --type java
# Search for any file extension related checks
rg -l "getExtension|fileType|extension" --type java
# Look for potential utility classes that might handle files
fd -e java -x rg -l "File" {}
Length of output: 375
Script:
#!/bin/bash
# Check Elysia.java for any file extension handling
rg "getExtension|fileType|extension" -C 5 src/main/java/top/rongxiaoli/Elysia.java
# Check other files that handle File operations
rg "FilenameFilter|accept.*File|endsWith" -C 5 ./src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
rg "FilenameFilter|accept.*File|endsWith" -C 5 ./src/main/java/top/rongxiaoli/plugins/PicturesPlugin/PicturesPlugin.java
Length of output: 695
.github/ISSUE_TEMPLATE/Bug.yaml (1)
33-33
: LGTM! Verify other issue templates for consistency.
The URL update from Elysia to ArisuBot is correct and aligns with the project transition.
Let's verify that all issue templates have been updated consistently:
✅ Verification successful
All issue templates have been updated consistently to use ArisuBot
All three issue templates (Bug.yaml, Enhance.yaml, and Feature.yaml) consistently use the new repository URL "rong-xiaoli/ArisuBot" in their issue links. No instances of the old "Elysia" repository name were found. The transition has been completed correctly across all templates.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check all issue templates for consistent repository references
# Expected: All templates should reference 'ArisuBot' instead of 'Elysia'
echo "Checking all issue templates for repository references..."
rg -l "rong-xiaoli/Elysia" .github/ISSUE_TEMPLATE/
Length of output: 175
Script:
#!/bin/bash
# Let's try a different approach to check all issue templates
# First, list all issue templates
echo "Listing all issue templates:"
fd . .github/ISSUE_TEMPLATE/
# Then check for any repository references in these files
echo -e "\nChecking content of issue templates:"
fd . .github/ISSUE_TEMPLATE/ --exec cat {}
Length of output: 3743
src/main/java/top/rongxiaoli/backend/PluginLoader/DataLoader.java (1)
1-8
: LGTM!
Package structure and imports are well-organized and follow Java conventions.
src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java (2)
11-13
: LGTM! Constructor is well-implemented
The constructor properly initializes the base class and includes appropriate null-safety annotations.
1-48
: Verify consistency with other command implementations
As this is part of the transition from Elysia to ArisuBot, we should ensure consistent patterns across different command types.
✅ Verification successful
Let me gather more information about the command implementations and their lifecycle methods to make a thorough verification.
Command implementations are consistent with the architecture
The implementation of ArisuBotAbstractSimpleCommand
is consistent with other command types in the codebase:
- All command classes (
SimpleCommand
,CompositeCommand
,RawCommand
) properly implement thePluginBase
interface - They share the same lifecycle methods (
load
,reload
,shutdown
,saveData
,reloadData
) - Each has consistent logger initialization pattern
- Constructor patterns are appropriate for their respective base classes
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for other command implementations to verify consistency
echo "Searching for other command implementations..."
ast-grep --pattern 'class $_ extends JSimpleCommand'
echo "Checking for similar lifecycle methods in other classes..."
rg -l "void (load|reload|shutdown|saveData|reloadData)"
Length of output: 1171
Script:
#!/bin/bash
# Check the implementation of other command types
echo "Checking ArisuBotAbstractCompositeCommand implementation..."
cat src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractCompositeCommand.java
echo -e "\nChecking ArisuBotAbstractRawCommand implementation..."
cat src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractRawCommand.java
echo -e "\nChecking PluginBase interface..."
cat src/main/java/top/rongxiaoli/backend/PluginBase/PluginBase.java
Length of output: 3680
src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractRawCommand.java (1)
1-54
: Verify command implementation consistency across codebase.
Let's ensure this abstract command class is used consistently and follows the same patterns as other command classes.
✅ Verification successful
Command implementation is consistent across the codebase
The abstract command classes and their concrete implementations show a consistent pattern:
- All command classes implement the
PluginBase
interface with the same lifecycle methods - Each command class properly extends one of the three base command types (JRawCommand, JSimpleCommand, or JCompositeCommand)
- Consistent logger initialization pattern
- Proper implementation of lifecycle methods (load, reload, shutdown, saveData, reloadData)
The abstract command hierarchy provides a solid foundation that is correctly utilized by concrete implementations like Ping and DailyFortune.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for consistency in command implementations
# Find all command classes
echo "Finding all command classes..."
rg -l "extends (JRawCommand|JCompositeCommand|JSimpleCommand)" --type java
# Check for consistent lifecycle method implementations
echo "Checking lifecycle method implementations..."
ast-grep --pattern 'class $_ {
$$$
public void load() {
$$$
}
$$$
}'
# Look for similar abstract command classes
echo "Looking for similar abstract command classes..."
fd -e java -x grep -l "Abstract.*Command"
Length of output: 1224
Script:
#!/bin/bash
# Let's check the implementation of other abstract command classes and plugin classes
# Check ArisuBotAbstractSimpleCommand implementation
echo "=== ArisuBotAbstractSimpleCommand.java ==="
cat src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java
# Check ArisuBotAbstractCompositeCommand implementation
echo -e "\n=== ArisuBotAbstractCompositeCommand.java ==="
cat src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractCompositeCommand.java
# Check a couple of concrete implementations to verify inheritance
echo -e "\n=== Ping.java ==="
cat src/main/java/top/rongxiaoli/plugins/Ping/Ping.java
echo -e "\n=== DailyFortune.java ==="
cat src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
Length of output: 10660
src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractCompositeCommand.java (1)
9-9
: Verify consistent implementation across command classes
Let's ensure this implementation pattern is consistent with other command classes in the framework.
✅ Verification successful
Let me try a different search strategy to gather more information about the command classes and their implementations.
Based on the search results, I can now generate the final response as we have clear evidence of the command class hierarchy and implementation patterns.
Implementation pattern is consistent across command classes
The codebase follows a consistent pattern where:
- All command classes properly implement the
PluginBase
interface - There's a clear hierarchy with abstract base classes for different command types:
ArisuBotAbstractCompositeCommand
extendsJCompositeCommand
ArisuBotAbstractSimpleCommand
extendsJSimpleCommand
ArisuBotAbstractRawCommand
extendsJRawCommand
- Concrete implementations (DailySign, DailyFortune, Ping, PicturesPlugin) consistently follow this pattern
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for other command classes implementing PluginBase
echo "Checking other command implementations:"
ast-grep --pattern 'class $_ extends $_ implements PluginBase {
$$$
}'
# Check for consistency in lifecycle method implementations
echo -e "\nChecking lifecycle method implementations:"
for method in "load" "reload" "shutdown" "saveData" "reloadData"; do
echo -e "\nSearching for $method() implementations:"
ast-grep --pattern "public void $method() {
$$$
}"
done
Length of output: 1397
Script:
#!/bin/bash
# Search for all command-related classes
echo "Searching for command classes:"
rg "class.*Command" -l
# Check for PluginBase implementations
echo -e "\nSearching for PluginBase implementations:"
rg "implements.*PluginBase" -A 2
# Look for JCompositeCommand usage
echo -e "\nSearching for JCompositeCommand usage:"
rg "extends.*JCompositeCommand" -A 2
Length of output: 4926
src/main/java/top/rongxiaoli/plugins/DailySign/DailySignTimer.java (1)
1-4
: LGTM! Clean package structure and imports.
.gitignore (1)
133-133
: LGTM! Verify wiki path pattern.
The addition of /wiki
to ignore list is appropriate. However, let's verify if this is the correct path pattern for your wiki directory structure.
✅ Verification successful
The /wiki
ignore pattern is appropriate for future use
The pattern /wiki
in .gitignore
is correctly formatted and positioned. While there's currently no wiki directory or related configurations in the codebase, this addition is proactive and follows Git best practices for ignoring wiki content. The leading slash ensures it only matches a wiki directory at the repository root, which is the standard location for Git-based wikis.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the wiki directory location and structure
# Check if wiki directory exists and its location
fd -t d -d 2 wiki
# If it exists, show its structure to confirm the ignore pattern
if [ $? -eq 0 ]; then
tree wiki -L 2 2>/dev/null
fi
Length of output: 104
Script:
#!/bin/bash
# Let's check if there are any references to wiki in the codebase
# This might help us understand the intended usage
# Search for wiki-related patterns in markdown files and configuration
rg -i "wiki" --type md --type yaml --type json -C 2
# Check if there's a .wiki directory (sometimes used for git submodules)
fd -H -t d .wiki
# Look for any git submodule configurations related to wiki
cat .gitmodules 2>/dev/null
Length of output: 88
src/main/java/top/rongxiaoli/plugins/DailySign/DailySignString.java (1)
1-12
: LGTM! Class structure and imports are well organized.
The logger naming convention aligns with the project's transition to "ArisuBot", and all imports are properly utilized.
src/main/java/top/rongxiaoli/plugins/Ping/Ping.java (8)
4-7
: Imports updated appropriately to reflect framework changes.
The updated import statements correctly reference JSimpleCommand
, MiraiLogger
, ArisuBot
, and PluginBase
, aligning with the new ArisuBot
framework structure.
9-15
: Class definition and constructor correctly modified for ArisuBot
.
- The class now extends
JSimpleCommand
, which is suitable for simple command implementations in the new framework. - The
logger
is properly instantiated usingMiraiLogger.Factory.INSTANCE.create
, providing a dedicated logger for this class. - The
INSTANCE
singleton pattern is implemented correctly for consistent access to the command instance. - The constructor correctly initializes the command with
ArisuBot.INSTANCE
and the command name"ping"
, and sets the prefix to be optional.
17-22
: Command handler run
method is correctly implemented with proper checks.
- The
@Handler
annotation is appropriately used to designate the command handling method. - The
run(CommandContext context)
method replaces the previousonCommand
method, aligning with theJSimpleCommand
requirements. - The check
if (!ArisuBot.PluginRunning)
ensures the command is only executed when the plugin is active. - The response
context.getSender().sendMessage("Pong! ");
correctly sends the expected message to the command issuer.
29-29
: Logging in load
method enhances maintainability.
The addition of logger.debug("Command loaded. ");
in the load
method provides helpful debugging information during the plugin's load phase.
37-37
: Reload method logging improves traceability.
Including logger.debug("Reload complete. ");
in the reload
method aids in monitoring the plugin's state during a reload operation.
45-45
: Shutdown method logging is appropriately added.
The debug statement logger.debug("shutdown() invoked. Nothing special, pass. ");
provides clarity when the plugin is shutting down, which is useful for debugging and monitoring.
53-53
: saveData
method logging clarifies operation status.
By logging "Nothing to store. ";
in the saveData
method, it's clear that there are no data persistence actions required, which can prevent confusion during maintenance.
61-61
: reloadData
method logging indicates no data reload necessary.
The message logger.debug("Nothing to load. ");
in the reloadData
method informs developers that there are no data reload operations, enhancing understanding of the plugin's behavior.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Outside diff range and nitpick comments (5)
src/main/java/top/rongxiaoli/ArisuBot.java (5)
28-31
: Rename parameter to follow naming conventionsThe parameter name
$this$onLoad
in theonLoad
method is unconventional. Consider renaming it tostorage
or another descriptive name without special characters.Apply this diff to rename the parameter:
/** - * @param $this$onLoad This parameter is not used. + * @param storage This parameter is not used. */ @Override - public void onLoad(@NotNull PluginComponentStorage $this$onLoad) { + public void onLoad(@NotNull PluginComponentStorage storage) { getLogger().debug("Loading ArisuBot plugin data..."); DATA.load(); getLogger().debug("Load complete. Waiting for enabling. "); }
28-29
: Remove unnecessary Javadoc commentSince the parameter in the
onLoad
method is not used and is self-explanatory, the Javadoc comment may be unnecessary. Consider removing it to keep the code clean.Apply this diff to remove the comment:
- /** - * @param storage This parameter is not used. - */
39-42
: Ensure consistent logging levelsIn the
onEnable
method, you useverbose
level for logging. Confirm that usingverbose
is intentional and consistent with your logging strategy across the application.
20-24
: Update plugin version and metadataThe plugin version is set to
"0.0.0"
. Consider updating it to reflect the actual version of your plugin. Also, review theinfo
andauthor
fields for accuracy.Apply this diff to update the version and metadata:
super(new JvmPluginDescriptionBuilder("top.rongxiaoli.ArisuBot", "0.0.1") .name("ArisuBot") - .info("REBORN, even better. ") + .info("Reborn, even better.") .author("rong-xiaoli") .build());
15-16
: Consider lazy initialization of loadersTo optimize resource usage, consider initializing
PluginLoader
andDataLoader
instances when they are needed rather than at class loading time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (3)
README.md (3)
14-26
: Consider adding English translations for wider accessibilityThe usage recommendations section contains crucial setup information. Consider:
- Adding English translations alongside Chinese text
- Using tables or bullet points for better structure
Example structure:
使用建议 (Usage Recommendations) --- -由于本人写的代码过于狗屎,建议添加以下插件,以简洁且方便地运行本插件: +建议添加以下插件 (Recommended plugins): 必选 (Required): - chat-command聊天触发命令 / Chat Command Plugin - Link: https://github.com/project-mirai/chat-command - Purpose: Essential for receiving client commands through CommandSender interface🧰 Tools
🪛 Markdownlint (0.35.0)
14-14: Expected: atx; Actual: setext
Heading style(MD003, heading-style)
28-41
: Improve checklist formatting consistencyThe feature checklist contains unnecessary empty lines and could benefit from better organization.
Consider grouping features by category and removing extra newlines:
+## Features + +### Core Features - [ ] 自动加入 - [ ] 机器人管理命令 - [ ] 广播 - + +### User Interaction - [ ] 每日签到 - [x] Ping - [ ] 戳一戳
42-50
: Standardize heading stylesThe document uses mixed heading styles. Consider using ATX-style headings (with #) consistently throughout the document.
-## 共同管理 +# 共同管理 (Collaborators)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (1)
README.md
(2 hunks)
🧰 Additional context used
🪛 Markdownlint (0.35.0)
README.md
14-14: Expected: atx; Actual: setext
Heading style
(MD003, heading-style)
🔇 Additional comments (1)
README.md (1)
1-3
: Badge links need attention after repository rename
The WakaTime badge URL needs to be verified after the repository rename.
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: 容小狸 <[email protected]>
Signed-off-by: 容小狸 <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (3)
.github/workflows/buildTest.yaml (3)
38-42
: Add error handling to checksum generationWhile the checksum generation is good, consider adding error handling:
- name: Generate checksum run: | + mkdir -p ./build/mirai/ cd ./build/mirai/ + if ! ls ArisuBot-*.*.*.mirai2.jar >/dev/null 2>&1; then + echo "Error: No JAR files found" + exit 1 + fi sha256sum ArisuBot-*.*.*.mirai2.jar > checksums.txt + # Verify checksum file was created + if [ ! -f checksums.txt ]; then + echo "Error: Failed to generate checksums" + exit 1 + fi
54-58
: Consider enhancing release informationWhile the release configuration is good, consider adding automated release notes generation:
- name: Create Release. + id: create_release uses: softprops/action-gh-release@v2 with: files: | ./build/mirai/ArisuBot-*.*.*.mirai2.jar ./build/mirai/checksums.txt draft: true token: ${{ secrets.TOKEN }} + body_path: ${{ github.workspace }}/CHANGELOG.md + generate_release_notes: trueThis will automatically include both the changelog and generated release notes based on PR descriptions and commit messages.
44-44
: Remove trailing spacesMinor formatting issue: Remove trailing spaces from lines 44 and 46.
Also applies to: 46-46
🧰 Tools
🪛 yamllint (1.35.1)
[error] 44-44: trailing spaces
(trailing-spaces)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (3)
.github/workflows/AutoContributor.yaml
(1 hunks).github/workflows/buildTest.yaml
(2 hunks)src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- .github/workflows/AutoContributor.yaml
- src/main/java/top/rongxiaoli/backend/Commands/ArisuBotAbstractSimpleCommand.java
🧰 Additional context used
🪛 yamllint (1.35.1)
.github/workflows/buildTest.yaml
[error] 44-44: trailing spaces
(trailing-spaces)
[error] 46-46: trailing spaces
(trailing-spaces)
🔇 Additional comments (2)
.github/workflows/buildTest.yaml (2)
7-11
: LGTM! Good practice using tag-based triggers for releases
The change to tag-based triggers (v*
) is a better approach for release workflows, ensuring releases are only created from properly tagged versions.
47-50
: LGTM! Artifact configuration is well structured
The artifact upload is properly configured with the new project name and includes the checksums file. Using the latest version (v4) of upload-artifact action is also good practice.
….java Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: 容小狸 <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Outside diff range and nitpick comments (1)
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java (1)
81-118
: Improve fortune level mapping maintainabilityConsider using a more maintainable approach with a data structure to map ranges to messages.
private static final class FortuneLevel { final int maxValue; final String wishString; final String wishLevel; FortuneLevel(int maxValue, String wishString, String wishLevel) { this.maxValue = maxValue; this.wishString = wishString; this.wishLevel = wishLevel; } } private static final FortuneLevel[] FORTUNE_LEVELS = { new FortuneLevel(0, "哦不,你也太非了吧?", "大凶"), new FortuneLevel(10, "今天运气不太好哦,但是也要加油呀~", "凶"), // ... add other levels }; private String getWishString(int fortuneRandom) { for (FortuneLevel level : FORTUNE_LEVELS) { if (fortuneRandom <= level.maxValue) { return level.wishString; } } return "这啥?"; } private String getWishLevel(int fortuneRandom) { for (FortuneLevel level : FORTUNE_LEVELS) { if (fortuneRandom <= level.maxValue) { return level.wishLevel; } } return " "; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (1)
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
(1 hunks)
🔇 Additional comments (2)
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java (2)
19-27
: LGTM: Well-structured command initialization
The command setup is clean with appropriate aliases and description. Good use of the singleton pattern and proper logger initialization.
51-58
:
Resource leak: Improve image handling
The ExternalResource should be properly closed using try-with-resources to prevent resource leaks.
- Image image = ExternalResource.uploadAsImage(targetFile, Objects.requireNonNull(sender.getSubject()));
- mcb.append(image);
+ try (ExternalResource resource = ExternalResource.create(targetFile)) {
+ Image image = ExternalResource.uploadAsImage(resource, Objects.requireNonNull(sender.getSubject()));
+ mcb.append(image);
+ }
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
Outdated
Show resolved
Hide resolved
src/main/java/top/rongxiaoli/plugins/DailyFortune/DailyFortune.java
Outdated
Show resolved
Hide resolved
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: 容小狸 <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tired now.
Summary by CodeRabbit
Release Notes
New Features
Improvements
Bug Fixes
Chores