Skip to content

Commit

Permalink
Add pack checker workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
melkypie committed Dec 21, 2022
1 parent ac9e92b commit d8595e0
Show file tree
Hide file tree
Showing 3 changed files with 226 additions and 17 deletions.
76 changes: 76 additions & 0 deletions .github/workflows/pack-checker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Pack checker

on:
workflow_dispatch:
inputs:
pr_number:
description: 'Pull Request number'
type: number
zip_url:
description: 'Zip file URL'
type: string
repository_url:
description: 'Repository URL'
type: string
branch:
description: 'Branch (to be used with repository_url'
type: string
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Checkout repository if provided
uses: actions/checkout@v3
if: ${{ github.event.inputs.repository_url != '' && github.event.inputs.branch != '' }}
with:
repository: ${{ github.event.inputs.repository_url }}
ref: ${{ github.event.inputs.branch }}
path: "pack"

- name: Download and extract zip if provided
if: ${{ github.event.inputs.zip_url != '' }}
env:
PACK_URL: ${{ github.event.inputs.zip_url }}
run: |
curl -o pack.zip -L ${PACK_URL}
unzip -q pack.zip -d pack-tmp/
mkdir -p pack/
mv $(find pack-tmp/ -name pack.properties -printf "%h")/* pack
- name: Checkout pull request if provided
uses: actions/checkout@v3
if: ${{ github.event.inputs.pr_number != '' }}
with:
repository: 'melkypie/resource-packs'
path: "pack"
- name: Checkout pull request if provided
if: ${{ github.event.inputs.pr_number != '' }}
env:
PR: ${{ github.event.inputs.pr_number }}
run: |
cd pack/
git fetch origin pull/${PR}/head:${PR}
git checkout ${PR}
- name: Download the latest vanilla sprites
uses: dsaltares/[email protected]
with:
repo: 'melkypie/sprite-exporter'
file: '.*-sprites\.zip'
regex: true
target: "./"
- name: Extract latest vanilla sprites
run: unzip -jq *-sprites.zip -d sprites/

- uses: actions/setup-java@v2
with:
java-version: 8
distribution: temurin
cache: gradle
- name: Run unneccessary file check on the pack
run: |
set -e -x
chmod +x gradlew
./gradlew test -DspriteFolder="sprites" -DpackFolder="pack" --tests "melky.resourcepacks.ResourcePacksPluginTest.checkUnneededFiles" --info --rerun-tasks
20 changes: 12 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,20 @@ repositories {
mavenCentral()
}

def runeLiteVersion = '1.8.19-SNAPSHOT'
def runeLiteVersion = 'latest.release'

dependencies {
compileOnly group: 'net.runelite', name:'client', version: runeLiteVersion

compileOnly 'org.projectlombok:lombok:1.18.4'
annotationProcessor 'org.projectlombok:lombok:1.18.4'
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'

testImplementation 'junit:junit:4.12'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.4'
testCompileOnly 'org.projectlombok:lombok:1.18.4'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
testCompileOnly 'org.projectlombok:lombok:1.18.20'
testImplementation 'org.slf4j:slf4j-simple:1.7.12'
testImplementation group: 'net.runelite', name:'client', version: runeLiteVersion, {
exclude group: 'ch.qos.logback', module: 'logback-classic'
}
testImplementation group: 'net.runelite', name:'client', version: runeLiteVersion
testImplementation group: 'net.runelite', name:'jshell', version: runeLiteVersion
}

group = 'melky.resourcepacks'
Expand All @@ -34,3 +33,8 @@ sourceCompatibility = '1.8'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

test {
systemProperty('spriteFolder', System.getProperty('spriteFolder'))
systemProperty('packFolder', System.getProperty('packFolder'))
}
147 changes: 138 additions & 9 deletions src/test/java/melky/resourcepacks/ResourcePacksPluginTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import net.runelite.client.RuneLite;
import net.runelite.client.externalplugins.ExternalPluginManager;
Expand All @@ -22,37 +24,89 @@ public static void main(String[] args) throws Exception
RuneLite.main(args);
}

/**
* Allow you to build your own sample-vanilla pack (with some drawbacks)
* Sprite 990 is custom made (is janky when using a dumper), login screen is also not being moved and also runelite's tag tab sprites are not moved. These have to be manually added
* <p>
* spriteFolder needs sprites to be dumped using correct offsets/correct max dimensions otherwise most of the sprites will be not positioned correctly (can be download from sprite-exporter repo)
* packFolder where to output the sample-vanilla pack to
*
* @throws IOException
*/
@Test
public void moveImages() throws IOException
{
String inputFolder = System.getProperty("resources.inputFolder");
String outputFolder = System.getProperty("resources.outputFolder");
if (Strings.isNullOrEmpty(inputFolder) || Strings.isNullOrEmpty(outputFolder)) {
String spriteFolder = System.getProperty("spriteFolder");
String packFolder = System.getProperty("packFolder");
if (Strings.isNullOrEmpty(spriteFolder) || Strings.isNullOrEmpty(packFolder))
{
throw new RuntimeException("inputFolder and outputFolder need to be defined");
}

for (SpriteOverride override : SpriteOverride.values()) {
for (SpriteOverride override : SpriteOverride.values())
{
// TODO:
// Grab the tag tab images from rl repo and make an exception for login screen
// Figure out why 990 is so janky
if (override.getSpriteID() < 0 || override.getSpriteID() == 990) {
if (override.getSpriteID() < 0 || override.getSpriteID() == 990)
{
continue;
}
File folder = createOrRetrieve(outputFolder + "/" + override.getFolder().toString().toLowerCase());
File folder = createOrRetrieve(packFolder + "/" + override.getFolder().toString().toLowerCase());
File destinationSprite = new File(folder, override.toString().toLowerCase().replaceFirst(override.getFolder().toString().toLowerCase() + "_", "") + ".png");
File sourceSprite = new File(inputFolder + "/" + override.getSpriteID() + "-0.png");
File sourceSprite;
if (override.getFrameID() != -1)
{
sourceSprite = new File(spriteFolder + "/" + override.getSpriteID() + "-" + override.getFrameID() + ".png");
}
else
{
sourceSprite = new File(spriteFolder + "/" + override.getSpriteID() + "-0.png");
}


if (sourceSprite.exists() && !(destinationSprite.exists() && fileContentEquals(sourceSprite, destinationSprite))) {
if (sourceSprite.exists() && !(destinationSprite.exists() && fileContentEquals(sourceSprite, destinationSprite)))
{
Files.copy(sourceSprite, destinationSprite);
log.info("Updated sprite " + override.name() + " (" + override.getSpriteID() + ")");
}
}
File outputFolderFile = new File(packFolder);
loopDirectory(outputFolderFile.listFiles(), outputFolderFile.getName(), spriteFolder, true);
}

/**
* Allow you to check whether or not a pack does not contain files that should not be in there or sprites that are the same as vanilla
* <p>
* spriteFolder needs to be dumped using correct offsets/correct max dimensions for the vanilla comparison to work
* packFolder is the path to the pack you want to be testing against
*
* @throws IOException
*/
@Test
public void checkUnneededFiles() throws IOException
{
String spriteFolder = System.getProperty("spriteFolder");
String packFolder = System.getProperty("packFolder");
if (Strings.isNullOrEmpty(spriteFolder) || Strings.isNullOrEmpty(packFolder))
{
throw new RuntimeException("spriteFolder and packFolder need to be defined");
}

File packFolderFile = new File(packFolder);
List<String> errorMessages = loopDirectory(packFolderFile.listFiles(), packFolderFile.getName(), spriteFolder, false);
for (String error : errorMessages)
{
log.info(error);
}
assert errorMessages.size() == 0;
}

private File createOrRetrieve(final String target) throws IOException
{
File outputDir = new File(target);
if (!outputDir.exists()) {
if (!outputDir.exists())
{
outputDir.mkdirs();
}

Expand Down Expand Up @@ -81,4 +135,79 @@ private boolean fileContentEquals(File file1, File file2) throws IOException
}
}
}

private List<String> loopDirectory(File[] directory, String dirName, String spriteDir, boolean delete) throws IOException
{
List<String> errorMessages = new ArrayList<String>();
if (dirName.equals(".git"))
{
return errorMessages;
}

if (directory == null)
{
errorMessages.add("\u001B[31mDirectory " + dirName + " is not needed as it is empty\u001B[0m");
return errorMessages;
}
for (File file : directory)
{
if (file.isDirectory())
{
errorMessages.addAll(loopDirectory(file.listFiles(), file.getName(), spriteDir, delete));
}
else
{
if (file.getName().contains(".png") && !file.getName().equals("icon.png"))
{
try
{
SpriteOverride override;
if (dirName.equalsIgnoreCase("other"))
{
override = SpriteOverride.valueOf(file.getName().replace(".png", "").toUpperCase());
}
else
{
override = SpriteOverride.valueOf(dirName.toUpperCase() + "_" + file.getName().replace(".png", "").toUpperCase());
}

if (override.getSpriteID() < 0)
{
continue;
}

File originalSprite;
if (override.getFrameID() != -1)
{
originalSprite = new File(spriteDir + "/" + override.getSpriteID() + "-" + override.getFrameID() + ".png");
}
else
{
originalSprite = new File(spriteDir + "/" + override.getSpriteID() + "-0.png");
}
if (fileContentEquals(file, originalSprite) && !delete)
{
errorMessages.add("\u001B[31mFile " + file.getName() + " (" + override.getSpriteID() + ") in folder " + dirName + " is the same as the vanilla sprite\u001B[0m");
}
}
catch (IllegalArgumentException e)
{
if (delete)
{
file.delete();
}
else
{
errorMessages.add("\u001B[31mFile " + file.getName() + " in folder " + dirName + " is redundant\u001B[0m");
}
}
}
else if (!file.getName().contains(".properties") && !file.getName().contains(".md") && !file.getName().equals("icon.png"))
{
errorMessages.add("\u001B[31mFound a file " + file.getName() + " in folder " + dirName + " that is not a sprite, icon, properties or markdown file\u001B[0m");
}
}
}
return errorMessages;
}
}

0 comments on commit d8595e0

Please sign in to comment.