Модули

Этот раздел посвящен разработке модулей на Java

Загрузка модулей происходит из папки modules. Менеджер модулей открывает по очереди все jar и смотрит на параметр Main-Class в манифесте JAR файла.

Main-Class - точка входа в модуль. Он обязан расширять интерфейс Module. Требуется, что бы методы getVersion/getName возвращали корректные значения. null не допускается

preInit - вызывается максимально рано, когда конфигурация еще не инициализирована

init - вызывается после основного этапа инициализации, но до старта прослушки сокета

postInit - вызывается после старта прослушки сокета

ModuleContext

Во все методы инициализации передается контекст модуля. ModuleContext - это интерфейс всех возможных контекстов модуля. Можно создавать свои контексты модуля и свои загрузчики модулей

Существует ServerModuleContext, LaunchServerModuleContext и ClientModuleContext. Во всех контекстах содержатся самые необходимые объекты для работы модуля.

Пример модуля

В качестве примера возьмем модуль AutoSaveSessions. Этот модуль сохраняет сессии в файл при остановке лаунчсервера и загружает их обратно при старте

package pro.gravit.launchermodules.autosavesessions;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.Set;

import com.google.gson.reflect.TypeToken;

import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.modules.Module;
import pro.gravit.launcher.modules.ModuleContext;
import pro.gravit.launchserver.LaunchServer;
import pro.gravit.launchserver.modules.LaunchServerModuleContext;
import pro.gravit.launchserver.socket.Client;
import pro.gravit.utils.Version;
import pro.gravit.utils.helper.IOHelper;
import pro.gravit.utils.helper.LogHelper;

public class AutoSaveSessionsModule implements Module {
    public static Version version = new Version(1, 0, 0);
    public static String FILENAME = "sessions.json";
    public static boolean isClearSessionsBeforeSave = true;
    public Path file;
	private LaunchServer srv;

    @Override
    public String getName() {
        return "AutoSaveSessions"; //Имя модуля, будет отображаться в списках и сообщении о загрузке
    }

    @Override
    public Version getVersion() {
        return version; //Версия модуля
    }

    @Override
    public int getPriority() {
        return 0; //Не используется
    }

    @Override
    public void init(ModuleContext context) {

    }

    @Override
    public void postInit(ModuleContext context1) {
        LaunchServerModuleContext context = (LaunchServerModuleContext) context1;   //Получаем контекст
        Path configDir = context.modulesConfigManager.getModuleConfigDir(getName());    //Получаем папку с конфигурацией нашего модуля. По умолчанию config/modulename
        if (!IOHelper.isDir(configDir)) {
            try {
                Files.createDirectories(configDir);
            } catch (IOException e) {
                LogHelper.error(e);
            }
        }
        srv = context.launchServer;
        file = configDir.resolve(FILENAME);
        if (IOHelper.exists(file)) {
            LogHelper.info("Load sessions from %s", FILENAME);	//Загрузка сессий
            Type setType = new TypeToken>() {
            }.getType();
            try (Reader reader = IOHelper.newReader(file)) {
                Set clientSet = Launcher.gsonManager.configGson.fromJson(reader, setType);
                for (Client client : clientSet) {
                    if (client.isAuth) client.updateAuth(srv);
                }
                context.launchServer.sessionManager.loadSessions(clientSet);	//Обращаемся к sessionsManager для загрузки сессий
                LogHelper.info("Loaded %d sessions", clientSet.size());
            } catch (IOException e) {
                LogHelper.error(e);
            }
        }
    }

    @Override
    public void preInit(ModuleContext context) {

    }

    @Override
    public void close() {
        if (isClearSessionsBeforeSave) {
        	srv.sessionManager.garbageCollection();
        }
        Set clientSet = srv.sessionManager.getSessions();   //Обращаемся к sessionsManager для получения сессий
        try (Writer writer = IOHelper.newWriter(file)) {
            LogHelper.info("Write sessions to %s", FILENAME);
            Launcher.gsonManager.configGson.toJson(clientSet, writer);
            LogHelper.info("%d sessions writed", clientSet.size());
        } catch (IOException e) {
            LogHelper.error(e);
        }
    }
}

Что бы узнать полный список API используйте подсказки IDEA и исходный код на GitHub

Прочие примеры модулей можно найти тут