Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
235 changes: 69 additions & 166 deletions .github/workflows/build-and-release.yml
Original file line number Diff line number Diff line change
@@ -1,177 +1,80 @@
name: Build and Release

on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
push:
branches:
- "**"
tags:
- "v*"
workflow_dispatch:

jobs:
build:
name: Build (Maven)
runs-on: ubuntu-latest

permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Get commit message
id: commit_message
run: echo "message=$(git log --format=%B -n 1 ${{ github.sha }})" >> $GITHUB_OUTPUT

- name: Check if release commit
id: check_release
run: |
if [[ "${{ steps.commit_message.outputs.message }}" =~ ^release:\ [0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "is_release=true" >> $GITHUB_OUTPUT
echo "version=$(echo '${{ steps.commit_message.outputs.message }}' | sed 's/release: //')" >> $GITHUB_OUTPUT
else
echo "is_release=false" >> $GITHUB_OUTPUT
echo "version=beta-${{ github.run_number }}" >> $GITHUB_OUTPUT
fi

- name: Update version in pom.xml
run: |
mvn versions:set -DnewVersion=${{ steps.check_release.outputs.version }}
mvn versions:commit

- name: Build with Maven
run: mvn clean compile package

- name: Run tests
run: mvn test

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: skyeblock-${{ steps.check_release.outputs.version }}
path: target/*.jar
retention-days: 90

- name: Create Beta Release
if: steps.check_release.outputs.is_release == 'false'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: beta-${{ github.run_number }}
release_name: Beta Release ${{ github.run_number }}
body: |
## Beta Release ${{ github.run_number }}

This is an automated beta release built from commit ${{ github.sha }}.

**Changes:**
- ${{ steps.commit_message.outputs.message }}

**Note:** This is a beta release and may contain bugs. Use at your own risk.
draft: false
prerelease: true

- name: Upload Beta Release Asset
if: steps.check_release.outputs.is_release == 'false'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_beta_release.outputs.upload_url }}
asset_path: target/skyeblock-${{ steps.check_release.outputs.version }}.jar
asset_name: skyeblock-beta-${{ github.run_number }}.jar
asset_content_type: application/java-archive

- name: Generate Changelog
if: steps.check_release.outputs.is_release == 'true'
id: changelog
run: |
# Get the previous release tag
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")

if [ -z "$PREV_TAG" ]; then
# If no previous tag, get all commits
CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges)
else
# Get commits since last tag
CHANGELOG=$(git log ${PREV_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
fi

# Save changelog to file
echo "## What's Changed" > changelog.md
echo "" >> changelog.md
echo "$CHANGELOG" >> changelog.md
echo "" >> changelog.md
echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREV_TAG}...v${{ steps.check_release.outputs.version }}" >> changelog.md

# Set output for use in release
echo "changelog<<EOF" >> $GITHUB_OUTPUT
cat changelog.md >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT

- name: Create Release
if: steps.check_release.outputs.is_release == 'true'
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.check_release.outputs.version }}
release_name: Release v${{ steps.check_release.outputs.version }}
body: ${{ steps.changelog.outputs.changelog }}
draft: false
prerelease: false

- name: Upload Release Asset
if: steps.check_release.outputs.is_release == 'true'
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: target/skyeblock-${{ steps.check_release.outputs.version }}.jar
asset_name: skyeblock-${{ steps.check_release.outputs.version }}.jar
asset_content_type: application/java-archive

code-quality:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Java 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
cache: maven

- name: Build with Maven
run: mvn -B -ntp clean verify

- name: Select plugin JAR
id: jar
shell: bash
run: |
set -euo pipefail
if [ ! -d target ]; then
echo "target directory not found" >&2
exit 1
fi

# Prefer the shaded/final plugin jar. Exclude common non-plugin artifacts.
jar_path=$(ls -1S target/*.jar 2>/dev/null | grep -Evi '(^|/)(original-|.*-sources\.jar$|.*-javadoc\.jar$)' | head -n 1 || true)
if [ -z "${jar_path}" ]; then
echo "No suitable JAR found under target/*.jar" >&2
ls -la target || true
exit 1
fi

echo "path=${jar_path}" >> "$GITHUB_OUTPUT"
echo "name=$(basename "${jar_path}")" >> "$GITHUB_OUTPUT"

- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.jar.outputs.name }}
path: ${{ steps.jar.outputs.path }}
if-no-files-found: error
retention-days: 30

release:
name: Release (GitHub)
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest

needs: build
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2

- name: Run Maven verify
run: mvn clean verify

- name: Check code formatting (optional)
run: |
if mvn help:describe -Dplugin=com.spotify.fmt:fmt-maven-plugin 2>/dev/null; then
mvn fmt:check
else
echo "Code formatting plugin not configured, skipping..."
fi
continue-on-error: true
- name: Download build artifact
uses: actions/download-artifact@v4
with:
path: dist

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
generate_release_notes: true
files: |
dist/**/*.jar
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ target/maven-status/
target/generated-sources/
target/classes/
target/original-*.jar
target/*


# META-INF directory in target
target/META-INF/
70 changes: 70 additions & 0 deletions permissions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# SkyeBlock Permissions

This document lists all permissions defined in the plugin and the defaults shipped in `plugin.yml`.

## Roles / Bundles

| Role / Node | Includes | Default |
| --- | --- | --- |
| `skyeblock.*` | Everything in this file | `op` |
| `skyeblock.player` | All player commands and warps (no gamerule admin bypass) | `true` |
| `skyeblock.admin` | Admin commands (/sba), high-level management | `op` |
| `skyeblock.gamerule.*` | All gamerule nodes (must be explicitly granted) | `false` |

## Core Commands

| Command | Permission | Default |
| --- | --- | --- |
| `/sb`, `/island`, `/is` | `skyeblock.island` | `true` |
| `/visit` | `skyeblock.island.visit` | `true` |
| `/island vote` | `skyeblock.island.vote` | `true` |
| `/island edit` (title/desc/icon) | `skyeblock.island.edit` | `true` |
| `/island coop` | `skyeblock.island.coop` | `true` |
| `/island lock` / `unlock` | `skyeblock.island.lock` | `true` |
| `/island set home|visit` | `skyeblock.island.set` | `true` |
| `/delete` (self delete) | `skyeblock.island.delete` | `true` |
| `/islandpermissions` | `skyeblock.island.permissions` | `true` |
| `/hub` | `skyeblock.hub` | `true` |
| `/spawn` | `skyeblock.spawn` | `true` |
| `/warp` | `skyeblock.warp` | `true` |
| `/createisland` | `skyeblock.island.create` | `true` |

## Warp Permissions

| Permission | Use | Default |
| --- | --- | --- |
| `skyeblock.warp.spawn` | Spawn warp | `true` |
| `skyeblock.warp.nether` | Nether resource world warp | `true` |
| `skyeblock.warp.end` | End resource world warp | `true` |
| `skyeblock.warp.pvp` | PvP arena warp | `true` |
| `skyeblock.warp.shop` | Shop/market warp | `true` |
| `skyeblock.admin.warp` | Admin warp management (/warpadmin) | `op` |

## Admin / Staff

| Command | Permission | Default |
| --- | --- | --- |
| `/sba ...` (admin suite) | `skyeblock.admin` | `op` |
| `/convertislands` | `skyeblock.admin.convert` | `op` |
| `/warpadmin ...` | `skyeblock.admin.warp` | `op` |
| `/mobspawning ...` | `skyeblock.admin.mobspawning` | `op` |

## Gamerule Access

- Global bypass: `skyeblock.gamerules.adminbypass` (see all gamerules) — default `op`.
- Common bundle: `skyeblock.settings.gamerules` — default `false`, grants the listed gamerules below.
- Full bundle: `skyeblock.gamerule.*` — default `false` (must be explicitly granted).

### Individual Gamerule Nodes (all default `false`)
`skyeblock.gamerule.dodaylightcycle`, `skyeblock.gamerule.doweathercycle`, `skyeblock.gamerule.keepinventory`, `skyeblock.gamerule.mobgriefing`, `skyeblock.gamerule.domobspawning`, `skyeblock.gamerule.dofiretick`, `skyeblock.gamerule.falldamage`, `skyeblock.gamerule.firedamage`, `skyeblock.gamerule.drowningdamage`, `skyeblock.gamerule.doinsomnia`, `skyeblock.gamerule.doimmediaterespawn`, `skyeblock.gamerule.announceadvancements`, `skyeblock.gamerule.disableelytraMovementcheck`, `skyeblock.gamerule.dolimitedcrafting`, `skyeblock.gamerule.naturalregeneration`, `skyeblock.gamerule.reduceddebuginfo`, `skyeblock.gamerule.sendcommandfeedback`, `skyeblock.gamerule.showdeathmessages`, `skyeblock.gamerule.doentitydrops`, `skyeblock.gamerule.dotiledrops`, `skyeblock.gamerule.domobloot`, `skyeblock.gamerule.dopatrolspawning`, `skyeblock.gamerule.dotraderSpawning`, `skyeblock.gamerule.forgivedeadplayers`, `skyeblock.gamerule.universalanger`, `skyeblock.gamerule.randomtickspeed`, `skyeblock.gamerule.spawnradius`, `skyeblock.gamerule.maxentitycramming`, `skyeblock.gamerule.maxcommandchainlength`, `skyeblock.gamerule.playerssleepingpercentage`.

## Quick Assignment Examples

- **Default players**: grant `skyeblock.player` (already default `true`).
- **Trusted players with gamerules**: grant `skyeblock.settings.gamerules` or specific `skyeblock.gamerule.*` entries.
- **Admins**: grant `skyeblock.admin` (includes /sba) plus `skyeblock.admin.warp` and `skyeblock.admin.mobspawning` as needed.
- **Everything**: grant `skyeblock.*` (OPs have this by default).

## Source of Truth

All permission definitions are declared in [src/main/resources/plugin.yml](src/main/resources/plugin.yml).
22 changes: 18 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>skyeblock.nobleskye.dev</groupId>
<artifactId>skyeblock</artifactId>
<version>3.1.0-1.21.10</version>
<version>3.2.0-1.21.10</version>
<packaging>jar</packaging>

<name>SkyeBlock</name>
Expand Down Expand Up @@ -36,8 +36,12 @@
<url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io/</url>
</repository>
</repositories>

Expand Down Expand Up @@ -68,7 +72,7 @@

<!-- ProtocolLib -->
<dependency>
<groupId>com.comphenix.protocol</groupId>
<groupId>com.github.dmulloy2</groupId>
<artifactId>ProtocolLib</artifactId>
<version>5.3.0</version>
<scope>provided</scope>
Expand All @@ -90,6 +94,16 @@
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.schem</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.schem</include>
</includes>
</resource>
</resources>
<plugins>
Expand Down
Loading
Loading