Skip to content

Developer API

github-actions[bot] edited this page Aug 29, 2026 · 3 revisions

RedstoneReboot Developer API

RedstoneReboot Logo

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:

softdepend: [RedstoneReboot]

Fetch the plugin instance at runtime:

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

import dev.demonz.redstonereboot.common.manager.RestartReason;

RedstoneRebootPlugin reboot = getRebootPlugin();

boolean scheduled = reboot.getRestartManager().scheduleRestart(
    300,
    RestartReason.API,
    "MyPlugin"
);

Cancel a Restart

boolean cancelled = reboot.getRestartManager().cancelRestart();

Read Restart Status

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.

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.

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.

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.

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):

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

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

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

Clone this wiki locally