BukkitScheduler.java

package it.fulminazzo.yagl.scheduler;

import it.fulminazzo.fulmicollection.objects.Refl;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;

/**
 * An implementation of {@link Scheduler} for Bukkit.
 */
final class BukkitScheduler implements Scheduler {
    private final @NotNull org.bukkit.scheduler.BukkitScheduler internal;

    BukkitScheduler() {
        this.internal = Bukkit.getServer().getScheduler();
    }

    @Override
    public @NotNull Task run(@NotNull Plugin owningPlugin, @NotNull Runnable task) {
        return new BukkitSchedulerTask(
                this.internal.runTask(owningPlugin, task)
        );
    }

    @Override
    public @NotNull Task runAsync(@NotNull Plugin owningPlugin, @NotNull Runnable task) {
        return new BukkitSchedulerTask(
                this.internal.runTaskAsynchronously(owningPlugin, task)
        );
    }

    @Override
    public @NotNull Task runLater(@NotNull Plugin owningPlugin, @NotNull Runnable task,
                                  long delayInTicks) {
        return new BukkitSchedulerTask(
                this.internal.runTaskLater(owningPlugin, task, delayInTicks)
        );
    }

    @Override
    public @NotNull Task runLaterAsync(@NotNull Plugin owningPlugin, @NotNull Runnable task,
                                       long delayInTicks) {
        return new BukkitSchedulerTask(
                this.internal.runTaskLaterAsynchronously(owningPlugin, task, delayInTicks)
        );
    }

    @Override
    public @NotNull Task runRepeated(@NotNull Plugin owningPlugin, @NotNull Runnable task,
                                     long delayInTicks, long repeatDelayInTicks) {
        return new BukkitSchedulerTask(
                this.internal.runTaskTimer(owningPlugin, task, repeatDelayInTicks, delayInTicks)
        );
    }

    @Override
    public @NotNull Task runRepeatedAsync(@NotNull Plugin owningPlugin, @NotNull Runnable task,
                                          long delayInTicks, long repeatDelayInTicks) {
        return new BukkitSchedulerTask(
                this.internal.runTaskTimerAsynchronously(owningPlugin, task, repeatDelayInTicks, delayInTicks)
        );
    }

    /**
     * An implementation of {@link Task} for Bukkit.
     */
    static class BukkitSchedulerTask implements Task {
        private final @NotNull BukkitTask internal;

        /**
         * Instantiates a new Bukkit scheduler task.
         *
         * @param internal the internal bukkit task
         */
        public BukkitSchedulerTask(final @NotNull BukkitTask internal) {
            this.internal = internal;
        }

        @Override
        public void cancel() {
            this.internal.cancel();
        }

        @Override
        public boolean isCancelled() {
            try {
                return this.internal.isCancelled();
            } catch (NoSuchMethodError e) {
                // Older versions did not have isCancelled method
                long period = new Refl<>(this.internal).getFieldObject("period");
                return period == -2;
            }
        }

        @Override
        public @NotNull Plugin getOwningPlugin() {
            return this.internal.getOwner();
        }
    }


}