// Path: src/main/java/me/semx11/autotip/api/reply/impl/KeepAliveReply.java
// public class KeepAliveReply extends Reply {
// 
//     public KeepAliveReply() {
//     }
// 
//     public KeepAliveReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.KEEP_ALIVE;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LocaleReply.java
// public class LocaleReply extends Reply {
// 
//     private Locale lang;
//     private JsonObject locale;
// 
//     public LocaleReply() {
//     }
// 
//     public LocaleReply(boolean success) {
//         super(success);
//     }
// 
//     public LocaleHolder getLocaleHolder() {
//         return new LocaleHolder(lang, locale);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOCALE;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LoginReply.java
// public class LoginReply extends Reply {
// 
//     private SessionKey sessionKey;
//     private long keepAliveRate;
//     private long tipWaveRate;
//     private long tipCycleRate;
// 
//     public LoginReply() {
//     }
// 
//     public LoginReply(boolean success) {
//         super(success);
//     }
// 
//     public SessionKey getSessionKey() {
//         return sessionKey;
//     }
// 
//     public long getKeepAliveRate() {
//         return keepAliveRate;
//     }
// 
//     public long getTipWaveRate() {
//         return tipWaveRate;
//     }
// 
//     public long getTipCycleRate() {
//         return tipCycleRate;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGIN;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LogoutReply.java
// public class LogoutReply extends Reply {
// 
//     public LogoutReply() {
//     }
// 
//     public LogoutReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGOUT;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/SettingsReply.java
// public class SettingsReply extends Reply {
// 
//     private GlobalSettings settings;
// 
//     public SettingsReply() {
//     }
// 
//     public SettingsReply(boolean success) {
//         super(success);
//     }
// 
//     public GlobalSettings getSettings() {
//         return settings;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.SETTINGS;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/TipReply.java
// public class TipReply extends Reply {
// 
//     private List<Tip> tips;
// 
//     public TipReply() {
//     }
// 
//     public TipReply(boolean success) {
//         super(success);
//     }
// 
//     private TipReply(List<Tip> tips) {
//         this.tips = tips;
//     }
// 
//     public static TipReply getDefault() {
//         return new TipReply(Collections.singletonList(new Tip("all", null)));
//     }
// 
//     public List<Tip> getTips() {
//         return tips;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.TIP;
//     }
// 
//     public static class Tip {
// 
//         private String gamemode;
//         private String username;
// 
//         private Tip() {
//         }
// 
//         private Tip(String gamemode, String username) {
//             this.gamemode = gamemode;
//             this.username = username;
//         }
// 
//         public String getGamemode() {
//             return gamemode;
//         }
// 
//         public String getUsername() {
//             return username != null ? username : "";
//         }
// 
//         public String getAsCommand() {
//             return "/tip " + this.toString();
//         }
// 
//         @Override
//         public String toString() {
//             return (username != null && !username.isEmpty() ? username + " " : "") + gamemode;
//         }
// 
//     }
// 
// }


import me.semx11.autotip.api.reply.impl.KeepAliveReply;
import me.semx11.autotip.api.reply.impl.LocaleReply;
import me.semx11.autotip.api.reply.impl.LoginReply;
import me.semx11.autotip.api.reply.impl.LogoutReply;
import me.semx11.autotip.api.reply.impl.SettingsReply;
import me.semx11.autotip.api.reply.impl.TipReply;
package me.semx11.autotip.api;


public enum RequestType {
    SETTINGS("settings", SettingsReply.class),
    LOCALE("locale", LocaleReply.class),
    LOGIN("login", LoginReply.class),
    KEEP_ALIVE("keepalive", KeepAliveReply.class),
    TIP("tip", TipReply.class),
    LOGOUT("logout", LogoutReply.class);

    private final String endpoint;
    private final Class<?> replyClass;

    RequestType(String endpoint, Class<?> replyClass) {
        this.endpoint = endpoint;
// Path: src/main/java/me/semx11/autotip/api/reply/impl/KeepAliveReply.java
// public class KeepAliveReply extends Reply {
// 
//     public KeepAliveReply() {
//     }
// 
//     public KeepAliveReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.KEEP_ALIVE;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LocaleReply.java
// public class LocaleReply extends Reply {
// 
//     private Locale lang;
//     private JsonObject locale;
// 
//     public LocaleReply() {
//     }
// 
//     public LocaleReply(boolean success) {
//         super(success);
//     }
// 
//     public LocaleHolder getLocaleHolder() {
//         return new LocaleHolder(lang, locale);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOCALE;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LoginReply.java
// public class LoginReply extends Reply {
// 
//     private SessionKey sessionKey;
//     private long keepAliveRate;
//     private long tipWaveRate;
//     private long tipCycleRate;
// 
//     public LoginReply() {
//     }
// 
//     public LoginReply(boolean success) {
//         super(success);
//     }
// 
//     public SessionKey getSessionKey() {
//         return sessionKey;
//     }
// 
//     public long getKeepAliveRate() {
//         return keepAliveRate;
//     }
// 
//     public long getTipWaveRate() {
//         return tipWaveRate;
//     }
// 
//     public long getTipCycleRate() {
//         return tipCycleRate;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGIN;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/LogoutReply.java
// public class LogoutReply extends Reply {
// 
//     public LogoutReply() {
//     }
// 
//     public LogoutReply(boolean success) {
//         super(success);
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.LOGOUT;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/SettingsReply.java
// public class SettingsReply extends Reply {
// 
//     private GlobalSettings settings;
// 
//     public SettingsReply() {
//     }
// 
//     public SettingsReply(boolean success) {
//         super(success);
//     }
// 
//     public GlobalSettings getSettings() {
//         return settings;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.SETTINGS;
//     }
// 
// }
// 
// Path: src/main/java/me/semx11/autotip/api/reply/impl/TipReply.java
// public class TipReply extends Reply {
// 
//     private List<Tip> tips;
// 
//     public TipReply() {
//     }
// 
//     public TipReply(boolean success) {
//         super(success);
//     }
// 
//     private TipReply(List<Tip> tips) {
//         this.tips = tips;
//     }
// 
//     public static TipReply getDefault() {
//         return new TipReply(Collections.singletonList(new Tip("all", null)));
//     }
// 
//     public List<Tip> getTips() {
//         return tips;
//     }
// 
//     @Override
//     public RequestType getRequestType() {
//         return RequestType.TIP;
//     }
// 
//     public static class Tip {
// 
//         private String gamemode;
//         private String username;
// 
//         private Tip() {
//         }
// 
//         private Tip(String gamemode, String username) {
//             this.gamemode = gamemode;
//             this.username = username;
//         }
// 
//         public String getGamemode() {
//             return gamemode;
//         }
// 
//         public String getUsername() {
//             return username != null ? username : "";
//         }
// 
//         public String getAsCommand() {
//             return "/tip " + this.toString();
//         }
// 
//         @Override
//         public String toString() {
//             return (username != null && !username.isEmpty() ? username + " " : "") + gamemode;
//         }
// 
//     }
// 
// }


// Path: src/main/java/me/semx11/autotip/api/RequestType.java
import me.semx11.autotip.api.reply.impl.KeepAliveReply;
import me.semx11.autotip.api.reply.impl.LocaleReply;
import me.semx11.autotip.api.reply.impl.LoginReply;
import me.semx11.autotip.api.reply.impl.LogoutReply;
import me.semx11.autotip.api.reply.impl.SettingsReply;
import me.semx11.autotip.api.reply.impl.TipReply;

package me.semx11.autotip.api;


public enum RequestType {
    SETTINGS("settings", SettingsReply.class),
    LOCALE("locale", LocaleReply.class),
    LOGIN("login", LoginReply.class),
    KEEP_ALIVE("keepalive", KeepAliveReply.class),
    TIP("tip", TipReply.class),
    LOGOUT("logout", LogoutReply.class);

    private final String endpoint;
    private final Class<?> replyClass;

    RequestType(String endpoint, Class<?> replyClass) {
        this.endpoint = endpoint;
        this.replyClass = replyClass;