chore: revert Lavalink timeout to 30s, add PMD + stricter checkstyle

- LavalinkManager: httpTimeout back to 30s (stagger delays are the real fix)
- checkstyle: comprehensive ruleset from LoParkour (200-line files, complexity, naming)
- PMD: ruleset with CognitiveComplexity, CloseResource, TooManyMethods etc
- Both tools run with ignoreFailures=true (warnings only, don't block build)
This commit is contained in:
loki5512344 2026-08-06 17:53:23 +02:00
parent 10acbc5ecb
commit 74be4214aa
Signed by: boba
GPG key ID: 253067914055423B
5 changed files with 208 additions and 186 deletions

View file

@ -1,103 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd">
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="error"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java"/>
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value=".*[\\/]src[\\/]test[\\/].*"/>
</module>
<module name="FileLength">
<property name="max" value="200"/>
</module>
<module name="SuppressWarningsFilter"/>
<module name="LineLength">
<property name="max" value="120"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="message" value="Line has trailing whitespace."/>
<property name="ignorePattern"
value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>
<module name="TreeWalker">
<!-- OuterTypeFilename is disabled due to test class naming -->
<module name="OneTopLevelClass"/>
<module name="NoLineWrap">
<property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
<module name="SuppressWarningsHolder"/>
<module name="MethodLength">
<property name="max" value="80"/>
<property name="countEmpty" value="false"/>
</module>
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens" value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
<module name="CyclomaticComplexity">
<property name="max" value="20"/>
</module>
<module name="NeedBraces">
<property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
<property name="allowSingleLineStatement" value="true"/>
<module name="ParameterNumber">
<property name="max" value="7"/>
</module>
<module name="LeftCurly">
<property name="option" value="eol"/>
<module name="AvoidStarImport"/>
<module name="UnusedImports"/>
<module name="RedundantImport"/>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-zA-Z][a-zA-Z0-9]*)*$"/>
</module>
<module name="RightCurly">
<property name="option" value="same"/>
<module name="TypeName"/>
<module name="MethodName"/>
<module name="MemberName"/>
<module name="ParameterName"/>
<module name="LocalVariableName"/>
<module name="ConstantName">
<property name="format" value="^log$|^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
</module>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<property name="allowEmptyLambdas" value="true"/>
<property name="allowEmptyCatches" value="true"/>
</module>
<module name="OneStatementPerLine"/>
<module name="NeedBraces"/>
<module name="LeftCurly"/>
<module name="RightCurly"/>
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/>
<module name="DefaultComesLast"/>
<module name="MultipleVariableDeclarations"/>
<module name="OneStatementPerLine"/>
<module name="FallThrough"/>
<module name="HideUtilityClassConstructor"/>
<module name="OneTopLevelClass"/>
<module name="UpperEll"/>
<module name="ArrayTypeStyle"/>
<module name="MissingSwitchDefault"/>
<module name="FallThrough"/>
<module name="UpperEll"/>
<module name="ModifierOrder"/>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
<module name="OuterTypeFilename"/>
<module name="EmptyBlock">
<property name="option" value="text"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
</module>
<module name="TypeName">
<property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
</module>
<module name="MemberName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
</module>
<module name="LambdaParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
</module>
<module name="CatchParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
</module>
<module name="LocalVariableName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<property name="allowOneCharVarInForLoop" value="true"/>
</module>
<module name="PatternVariableName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
</module>
<module name="ConstantName">
<property name="format" value="^log(ger)?$|^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected|ignore"/>
</module>
<module name="EqualsAvoidNull"/>
<module name="NoFinalizer"/>
<module name="GenericWhitespace"/>
<module name="DefaultComesLast"/>
<module name="SimplifyBooleanReturn"/>
<module name="AvoidStarImport"/>
<module name="NoClone"/>
<module name="PackageDeclaration"/>
<module name="NPathComplexity">
<property name="max" value="50"/>
</module>
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<module name="NestedForDepth">
<property name="max" value="2"/>
</module>
<module name="NestedTryDepth">
<property name="max" value="2"/>
</module>
<module name="ClassDataAbstractionCoupling">
<property name="max" value="25"/>
<property name="severity" value="warning"/>
</module>
<module name="ClassFanOutComplexity">
<property name="max" value="30"/>
<property name="severity" value="warning"/>
</module>
<module name="MagicNumber">
<property name="ignoreNumbers" value="-1, 0, 1, 2"/>
<property name="ignoreHashCodeMethod" value="true"/>
<property name="ignoreAnnotation" value="true"/>
<property name="severity" value="warning"/>
</module>
<module name="Regexp">
<property name="format" value="System\.(out|err)\.print"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="Use a logger instead of System.out/err"/>
</module>
<module name="Regexp">
<property name="format" value="\.printStackTrace\(\)"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="Use a logger instead of printStackTrace"/>
</module>
<module name="IllegalThrows"/>
<module name="IllegalCatch">
<property name="illegalClassNames"
value="java.lang.Exception, java.lang.Throwable, java.lang.RuntimeException"/>
</module>
<module name="WhitespaceAround"/>
<module name="WhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="MissingOverride"/>
<module name="MissingDeprecated">
<property name="severity" value="warning"/>
</module>
<module name="FinalLocalVariable">
<property name="validateEnhancedForLoopVariable" value="true"/>
<property name="severity" value="warning"/>
</module>
<module name="Indentation">
<property name="basicOffset" value="2"/>
<property name="braceAdjustment" value="0"/>
@ -106,25 +153,5 @@
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="2"/>
</module>
<module name="AbbreviationAsWordInName">
<property name="allowedAbbreviationLength" value="3"/>
</module>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
<property name="allowLineBreaks" value="true"/>
</module>
<module name="ParenPad"/>
<module name="AnnotationLocation"/>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected|ignore"/>
</module>
<module name="CommentsIndentation"/>
<module name="UnusedImports"/>
<module name="RedundantImport"/>
<module name="MethodName">
<property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
</module>
</module>
</module>

View file

@ -0,0 +1,38 @@
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
<!-- IllegalCatch: defensive boundary catches in bot entry points and migration -->
<suppress checks="IllegalCatch" files=".*[\\/]bootstrap[\\/]App\.java"/>
<suppress checks="IllegalCatch" files=".*[\\/]DatabaseMigration\.java"/>
<suppress checks="IllegalCatch" files=".*[\\/]CommandExceptionHandler\.java"/>
<!-- NPathComplexity: legacy files pending refactor -->
<suppress checks="NPathComplexity" files=".*[\\/]ModerationLogger\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]VoiceChannelManager\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]PlayCommand\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]MuteCommand\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]WarnCommand\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]RankCardGenerator\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]SqlEconomyRepository\.java"/>
<suppress checks="NPathComplexity" files=".*[\\/]BlackjackService\.java"/>
<!-- FileLength: legacy files pending decomposition -->
<suppress checks="FileLength" files=".*[\\/]FeatureTables\.java"/>
<suppress checks="FileLength" files=".*[\\/]DatabaseMigration\.java"/>
<suppress checks="FileLength" files=".*[\\/]ModerationLogger\.java"/>
<suppress checks="FileLength" files=".*[\\/]VoiceChannelManager\.java"/>
<suppress checks="FileLength" files=".*[\\/]VoiceSetupPrefixCommand\.java"/>
<suppress checks="FileLength" files=".*[\\/]RadioManager\.java"/>
<suppress checks="FileLength" files=".*[\\/]MetricsCollector\.java"/>
<suppress checks="FileLength" files=".*[\\/]WarnCommand\.java"/>
<suppress checks="FileLength" files=".*[\\/]GenerateRatingsCommand\.java"/>
<suppress checks="FileLength" files=".*[\\/]BlackjackService\.java"/>
<suppress checks="FileLength" files=".*[\\/]SqlEconomyRepository\.java"/>
<suppress checks="FileLength" files=".*[\\/]GuildMusicManager\.java"/>
<suppress checks="FileLength" files=".*[\\/]QueueSlashHandler\.java"/>
<suppress checks="FileLength" files=".*[\\/]MusicBotControlHandler\.java"/>
<suppress checks="FileLength" files=".*[\\/]QueueCommands\.java"/>
</suppressions>

View file

@ -1,95 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="LokiBot PMD Rules"
<?xml version="1.0"?>
<ruleset name="Loki Bot PMD rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>PMD rules for Loki Discord Bot</description>
<description>
PMD rules complementing checkstyle. Adds checks checkstyle does not
cover: resource leaks, string ==, empty control flow, god-class/size
hints and complexity.
UnusedImports is excluded (handled by checkstyle).
</description>
<rule ref="category/java/bestpractices.xml">
<exclude name="AbstractClassWithoutAbstractMethod" />
<exclude name="AccessorMethodGeneration" />
<exclude name="ArrayIsStoredDirectly" />
<exclude name="GuardLogStatement" />
<exclude name="JUnitAssertionsShouldIncludeMessage" />
<exclude name="JUnitTestContainsTooManyAsserts" />
<exclude name="JUnitTestsShouldIncludeAssert" />
<exclude name="MethodReturnsInternalArray" />
<exclude name="PreserveStackTrace" />
<exclude name="SystemPrintln" />
<exclude name="UseVarargs" />
<!-- ===== bugs / error-prone ===== -->
<rule ref="category/java/errorprone.xml/EmptyCatchBlock"/>
<rule ref="category/java/errorprone.xml/UseEqualsToCompareStrings"/>
<rule ref="category/java/errorprone.xml/CloseResource"/>
<rule ref="category/java/errorprone.xml/UnusedNullCheckInEquals"/>
<!-- ===== dead code ===== -->
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod"/>
<rule ref="category/java/codestyle.xml/UnnecessaryImport"/>
<rule ref="category/java/bestpractices.xml/AvoidReassigningParameters"/>
<!-- ===== complexity ===== -->
<rule ref="category/java/design.xml/CyclomaticComplexity">
<properties>
<property name="methodReportLevel" value="15"/>
</properties>
</rule>
<rule ref="category/java/design.xml/CognitiveComplexity">
<properties>
<property name="reportLevel" value="15"/>
</properties>
</rule>
<rule ref="category/java/codestyle.xml">
<exclude name="AtLeastOneConstructor" />
<exclude name="AvoidFinalLocalVariable" />
<exclude name="CallSuperInConstructor" />
<exclude name="ClassNamingConventions" />
<exclude name="CommentDefaultAccessModifier" />
<exclude name="DefaultPackage" />
<exclude name="FieldDeclarationsShouldBeAtStartOfClass" />
<exclude name="LinguisticNaming" />
<exclude name="LocalVariableCouldBeFinal" />
<exclude name="LongVariable" />
<exclude name="MethodNamingConventions" />
<exclude name="OnlyOneReturn" />
<exclude name="ShortClassName" />
<exclude name="ShortMethodName" />
<exclude name="ShortVariable" />
<exclude name="TooManyStaticImports" />
<exclude name="UnnecessaryAnnotationValueElement" />
<exclude name="UseExplicitTypes" />
</rule>
<rule ref="category/java/design.xml">
<exclude name="AvoidRethrowingException" />
<exclude name="AvoidThrowingNullPointerException" />
<exclude name="AvoidThrowingRawExceptionTypes" />
<exclude name="CouplingBetweenObjects" />
<exclude name="CyclomaticComplexity" />
<exclude name="DataClass" />
<exclude name="ExcessiveImports" />
<exclude name="ExcessivePublicCount" />
<exclude name="GodClass" />
<exclude name="LawOfDemeter" />
<exclude name="LoosePackageCoupling" />
<exclude name="NcssCount" />
<exclude name="NPathComplexity" />
<exclude name="SignatureDeclareThrowsException" />
<exclude name="SingularField" />
<exclude name="TooManyFields" />
<exclude name="TooManyMethods" />
</rule>
<rule ref="category/java/errorprone.xml">
<exclude name="AssignmentInOperand" />
<exclude name="AvoidAccessibilityAlteration" />
<exclude name="AvoidDuplicateLiterals" />
<exclude name="AvoidFieldNameMatchingMethodName" />
<exclude name="AvoidLiteralsInIfCondition" />
<exclude name="CloseResource" />
<exclude name="ConstructorCallsOverridableMethod" />
<exclude name="DataflowAnomalyAnalysis" />
<exclude name="DoNotTerminateVM" />
<exclude name="EmptyCatchBlock" />
<exclude name="MissingSerialVersionUID" />
<exclude name="NonStaticInitializer" />
<exclude name="NullAssignment" />
<exclude name="ReturnEmptyArrayRatherThanNull" />
</rule>
<rule ref="category/java/multithreading.xml">
<exclude name="AvoidSynchronizedAtMethodLevel" />
<exclude name="DoNotUseThreads" />
<exclude name="UseConcurrentHashMap" />
</rule>
<rule ref="category/java/performance.xml">
<exclude name="AvoidInstantiatingObjectsInLoops" />
<exclude name="AvoidFileStream" />
<exclude name="ConsecutiveLiteralAppends" />
<exclude name="InsufficientStringBufferDeclaration" />
<exclude name="StringInstantiation" />
<exclude name="TooFewBranchesForASwitchStatement" />
<!-- ===== god-object / size hints ===== -->
<rule ref="category/java/design.xml/TooManyFields"/>
<rule ref="category/java/design.xml/TooManyMethods">
<properties>
<property name="maxmethods" value="15"/>
</properties>
</rule>
</ruleset>