# RedstoneReboot Developer API
Integration guide for Bukkit-side plugins that need to interact with RedstoneReboot state or trigger restart actions.
---
## Scope
The documented integration path accesses the `RedstoneRebootPlugin` instance exposed at runtime on Bukkit, Paper, and Folia servers.
---
## Basic Hook
Add RedstoneReboot as a soft dependency in your `plugin.yml`:
```yaml
softdepend: [RedstoneReboot]
```
Fetch the plugin instance at runtime:
```java
import dev.demonz.redstonereboot.bukkit.RedstoneRebootPlugin;
import org.bukkit.plugin.java.JavaPlugin;
public final class MyPlugin extends JavaPlugin {
@Override
public void onEnable() {
if (!getServer().getPluginManager().isPluginEnabled("RedstoneReboot")) {
return;
}
RedstoneRebootPlugin reboot = (RedstoneRebootPlugin) getServer()
.getPluginManager()
.getPlugin("RedstoneReboot");
if (reboot != null) {
getLogger().info("Hooked into RedstoneReboot " + reboot.getDescription().getVersion());
}
}
}
```
---
## Restart Manager
`RedstoneRebootPlugin#getRestartManager()` provides access to the shared restart controller.
### Schedule a Restart
```java
import dev.demonz.redstonereboot.common.manager.RestartReason;
RedstoneRebootPlugin reboot = getRebootPlugin();
boolean scheduled = reboot.getRestartManager().scheduleRestart(
300,
RestartReason.API,
"MyPlugin"
);
```
### Cancel a Restart
```java
boolean cancelled = reboot.getRestartManager().cancelRestart();
```
### Read Restart Status
```java
boolean inProgress = reboot.getRestartManager().isRestartInProgress();
int secondsLeft = reboot.getRestartManager().getSecondsUntilRestart();
var nextRestart = reboot.getRestartManager().getNextScheduledRestart();
var info = reboot.getRestartManager().getRestartInfo();
```
### Restart Reasons
Available reasons include:
- `SCHEDULED`
- `SCHEDULED_API`
- `MANUAL`
- `EMERGENCY_TPS`
- `EMERGENCY_MEMORY`
- `API`
- `UNKNOWN`
---
## Server Health Monitor
`RedstoneRebootPlugin#getServerLoadMonitor()` exposes the health monitor when monitoring is enabled.
```java
var monitor = reboot.getServerLoadMonitor();
if (monitor != null) {
double tps = monitor.getLastTPS();
double memory = monitor.getLastMemoryUsage();
boolean healthy = monitor.isHealthy();
}
```
---
## Alert Manager
`RedstoneRebootPlugin#getAlertManager()` can be used to send player-facing notifications.
```java
import dev.demonz.redstonereboot.common.manager.RestartReason;
var alerts = reboot.getAlertManager();
alerts.sendRestartAlert(60, RestartReason.API);
alerts.sendFinalRestartAlert(RestartReason.API);
alerts.sendRestartCancelledAlert();
alerts.sendEmergencyAlert("Custom emergency condition");
alerts.sendAlert(
"§cCustom warning message",
"§cRestart Alert",
"§eCustom subtitle"
);
```
---
## Permission Manager
`RedstoneRebootPlugin#getPermissionManager()` exposes permission check helpers.
```java
var permissions = reboot.getPermissionManager();
boolean canRestartNow = permissions.canRestartNow(player);
boolean canSchedule = permissions.canScheduleRestart(player);
boolean canCancel = permissions.canCancelRestart(player);
boolean canReload = permissions.canReloadConfig(player);
boolean canViewStatus = permissions.canViewStatus(player);
boolean isAdmin = permissions.hasAdminPermission(player);
boolean receivesNotifications = permissions.shouldReceiveNotifications(player);
boolean hasLuckPerms = permissions.isLuckPermsAvailable();
```
---
## Config Access
`RedstoneRebootPlugin#getConfigManager()` exposes the plugin configuration wrapper.
```java
var config = reboot.getConfigManager();
String timezone = config.getTimezone();
boolean monitoringEnabled = config.isMonitoringEnabled();
boolean emergencyEnabled = config.isEmergencyRestartEnabled();
int warningTime = config.getScheduledWarningTime();
```
---
## New in 1.6.0 — Unified Dev API + Discord Message Pipeline
All platforms now expose `RedstoneRebootAPI` (no Bukkit cast needed):
```java
import dev.demonz.redstonereboot.common.api.RedstoneRebootAPI;
import dev.demonz.redstonereboot.common.api.RestartListener;
import dev.demonz.redstonereboot.common.api.MessageContext;
import dev.demonz.redstonereboot.common.manager.RestartReason;
if (!RedstoneRebootAPI.isAvailable()) return;
RedstoneRebootAPI api = RedstoneRebootAPI.getInstance();
// listen to lifecycle
api.registerListener(new RestartListener() {
@Override public void onRestartScheduled(int seconds, RestartReason reason, String initiator) {
getLogger().info("restart in " + seconds + "s via " + initiator);
}
@Override public void onRestartCancelled(String prevReason, String prevInitiator) {
getLogger().info("restart cancelled");
}
});
// fire restarts without touching RestartManager directly
api.scheduleRestart(120, RestartReason.API, "MyPlugin");
api.cancelRestart();
api.getSecondsUntilRestart();
```
### Message API — forward alerts anywhere
```java
import dev.demonz.redstonereboot.common.api.MessageAdapter;
import dev.demonz.redstonereboot.common.api.MessageContext;
import dev.demonz.redstonereboot.common.api.DiscordWebhookAdapter;
// 1) lambda adapter (e.g. your JDA/Dis4J bot)
api.registerMessageAdapter(context -> {
String plain = context.toPlainText(); // legacy codes stripped
String platform = context.getPlatformName();
// yourBot.sendEmbed(platform, plain, context.getReason());
myDiscordChannel.sendMessage("[" + platform + "] " + plain).queue();
});
// 2) built-in webhook — no bot needed, add to config.yml instead:
// integrations:
// discord:
// enabled: true
// webhook-url: "https://discord.com/api/webhooks/123/abc"
// username: "RedstoneReboot"
// Or register programmatically:
api.registerDiscordWebhook("https://discord.com/api/webhooks/...", "MyBot");
api.registerMessageAdapter(new DiscordWebhookAdapter(logger, webhookUrl));
// 3) filter if needed
api.registerMessageAdapter(new MessageAdapter() {
public void onMessage(MessageContext ctx) {
if (ctx.getType() == MessageContext.Type.FINAL_ALERT) {
// only final
}
}
});
```
`MessageContext.getType()` values: `SCHEDULED_ALERT`, `FINAL_ALERT`, `CANCELLED`, `EMERGENCY`, `POSTPONED`, `GENERIC_CHAT`. Use `LegacyTextUtil.stripLegacyFormatting()` or `ctx.toPlainText()` for Discord-safe text.
### Diagnostic Dump — `DumpGenerator`
```java
import dev.demonz.redstonereboot.common.api.DumpGenerator;
var core = RedstoneRebootAPI.getInstance().getCore();
Path dump = DumpGenerator.generate(core, core.getDataFolder());
// dump-20260829-140533.txt contains sanitized config, backend, env, history, adapters
```
Or in-game: `/reboot dump` (perm `redstonereboot.dump`) creates `plugins/RedstoneReboot/dump-*.txt` and mirrors a preview to Discord adapters if registered. Tokens are masked (`p***ab`, `${env.*}` left intact).
---
## Implementation Notes
- The API is available on **all** platforms (Bukkit/Paper/Folia/Fabric/Forge/NeoForge) via `RedstoneRebootAPI.getInstance()` after `onEnable`.
- Bukkit `RedstoneRebootPlugin#getCore()` / `#getRestartManager()` etc. remain but prefer `RedstoneRebootAPI`.
- Fabric, Forge, NeoForge: obtain `api.getCore().getPlatform()` for platform-agnostic checks.
- Always null-check `RedstoneRebootAPI.isAvailable()` if RedstoneReboot is an optional soft dependency.
---
**RedstoneReboot** · Multi-Platform Minecraft Server Restart Engine
*Maintained by [DemonZ Development](https://demonzdevelopment.online)*