-
Notifications
You must be signed in to change notification settings - Fork 5
Plugins
Marc Andre Herpers edited this page Feb 9, 2025
·
2 revisions
Shiina's plugin system allows developers to extend the functionality of the server through a robust API. This guide will walk you through creating plugins for Shiina.
- Java Development Kit (JDK) 21 or higher
- Maven or Gradle
- Basic understanding of Java
Add these dependencies to your build system:
<!-- Maven -->
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.osu-NoLimits</groupId>
<artifactId>Shiina-Web</artifactId>
<version>1906ecee69</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Maven Jar Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<!-- Exclude dependencies -->
<includeDependencies>false</includeDependencies>
<!-- Output directory -->
<outputDirectory>${project.basedir}/../builds</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
A typical plugin project structure:
my-plugin/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/plugin/
│ │ └── MyPlugin.java
│ └── resources/
│ ├── plugin.yml
│ └── modules/
│ └── myplugin/
│ └── template.html
├── pom.xml
└── README.md
Create plugin.yml
in your resources directory:
name: MyPlugin
main: com.example.plugin.MyPlugin
Create your main plugin class:
package com.example.plugin;
import dev.osunolimits.plugins.ShiinaPlugin;
import dev.osunolimits.plugins.ShiinaEventListener;
public class MyPlugin extends ShiinaPlugin {
@Override
protected void onEnable(String pluginName) {
// Plugin startup logic
}
@Override
protected void onDisable(String pluginName) {
// Plugin shutdown logic
}
}
Listen to server events by extending ShiinaEventListener
:
public class MyEventListener extends ShiinaEventListener {
@Override
public void onRegisterEvent(OnRegisterEvent event) {
// Handle user registration
}
@Override
public void onUserJoinClanEvent(OnUserJoinClanEvent event) {
// Handle clan join
}
}
Register your listener in your plugin:
ShiinaRegistry.registerListener(new MyEventListener());
Create a configuration class:
public class MyConfig {
private String setting1 = "default";
private int setting2 = 42;
// Getters and setters
}
Load configuration in your plugin:
public class MyPlugin extends ShiinaPlugin {
private PluginConfig config;
@Override
protected void onEnable(String pluginName) {
config = new PluginConfig(pluginName, MyConfig.class);
config.loadConfig();
MyConfig myConfig = (MyConfig) config.getConfig();
}
}
Add custom navigation items:
NavbarRegister.register(new NavbarItem(
"My Page", // Name
"custom-page" // URL
));
Create FreeMarker templates in resources/modules/yourplugin/
:
<!-- template.ftl -->
<div class="custom-content">
<h1>${title}</h1>
<p>${content}</p>
</div>
public class ExamplePlugin extends ShiinaPlugin {
private PluginConfig config;
@Override
protected void onEnable(String pluginName) {
// Load configuration
config = new PluginConfig(pluginName, MyConfig.class);
config.loadConfig();
// Register event listener
ShiinaRegistry.registerListener(new MyEventListener());
// Add navbar item
NavbarRegister.register(new NavbarItem(
"Example",
"example",
NavbarRegister.getActNav()
));
log.info("[" + pluginName + "] Plugin enabled successfully!");
}
@Override
protected void onDisable(String pluginName) {
log.info("[" + pluginName + "] Plugin disabled!");
}
}
public class MyEventListener extends ShiinaEventListener {
@Override
public void onRegisterEvent(OnRegisterEvent event) {
// Custom registration logic
System.out.println("New user registered: " + event.getUsername());
}
@Override
public void onUserJoinClanEvent(OnUserJoinClanEvent event) {
// Custom clan join logic
System.out.println("User joined clan: " + event.getClanName());
}
}