Search in sources :

Example 1 with CommandPermission

use of net.kodehawa.mantarobot.modules.commands.CommandPermission in project MantaroBot by Mantaro.

the class OwnerCmd method owner.

@Command
public static void owner(CommandRegistry cr) {
    Map<String, Evaluator> evals = new HashMap<>();
    evals.put("js", (event, code) -> {
        ScriptEngine script = new ScriptEngineManager().getEngineByName("nashorn");
        script.put("mantaro", MantaroBot.getInstance());
        script.put("db", MantaroData.db());
        script.put("jda", event.getJDA());
        script.put("event", event);
        script.put("guild", event.getGuild());
        script.put("channel", event.getChannel());
        try {
            return script.eval(String.join("\n", "load(\"nashorn:mozilla_compat.js\");", "imports = new JavaImporter(java.util, java.io, java.net);", "(function() {", "with(imports) {", code, "}", "})()"));
        } catch (Exception e) {
            return e;
        }
    });
    evals.put("bsh", (event, code) -> {
        Interpreter interpreter = new Interpreter();
        try {
            interpreter.set("mantaro", MantaroBot.getInstance());
            interpreter.set("db", MantaroData.db());
            interpreter.set("jda", event.getJDA());
            interpreter.set("event", event);
            interpreter.set("guild", event.getGuild());
            interpreter.set("channel", event.getChannel());
            return interpreter.eval(String.join("\n", "import *;", code));
        } catch (Exception e) {
            return e;
        }
    });
    evals.put("cw", (event, code) -> {
        Object[] returns;
        boolean errored = false;
        try {
            returns = MantaroData.connectionWatcher().eval(code);
        } catch (RuntimeException e) {
            errored = true;
            returns = new Object[] { e.getMessage() };
        }
        String result = returns.length == 1 ? returns[0] == null ? null : String.valueOf(returns[0]) : Arrays.asList(returns).toString();
        if (errored)
            return new Error(result == null ? "Internal error" : result) {

                @Override
                public String toString() {
                    return getMessage();
                }
            };
        return result;
    });
    cr.register("owner", new SimpleCommand(Category.OWNER) {

        @Override
        public CommandPermission permission() {
            return CommandPermission.OWNER;
        }

        @Override
        public MessageEmbed help(GuildMessageReceivedEvent event) {
            return helpEmbed(event, "Owner command").setDescription("`~>owner shutdown/forceshutdown`: Shutdowns the bot\n" + "`~>owner restart/forcerestart`: Restarts the bot.\n" + "`~>owner scheduleshutdown time <time>` - Schedules a fixed amount of seconds the bot will wait to be shutted down.\n" + "`~>owner varadd <pat/hug/greeting/splash>` - Adds a link or phrase to the specified list.\n" + "`~>owner eval <bsh/js/cw> <line of code>` - Evals a specified code snippet.\n" + "`~>owner cw <info/eval>` - Shows info or evals specified code in the Connection Watcher.\n" + "`~>owner premium add <id> <days>` - Adds premium to the specified user for x days.").addField("Shush.", "If you aren't Adrian or Kode you shouldn't be looking at this, huh 👀" + EmoteReference.EYES, false).build();
        }

        @Override
        public void call(GuildMessageReceivedEvent event, String content, String[] args) {
            if (args.length < 1) {
                onHelp(event);
                return;
            }
            String option = args[0];
            if (option.equals("cw")) {
                if (args.length < 2) {
                    onHelp(event);
                    return;
                }
                String sub = args[1].split("\\s+")[0];
                if (sub.equals("info")) {
                    event.getChannel().sendMessage(new EmbedBuilder().setAuthor("Connection Watcher info", null, null).setDescription(MantaroData.connectionWatcher().get().toString()).setColor(event.getGuild().getSelfMember().getColor()).setFooter("Asked by: " + event.getAuthor().getName(), null).build()).queue();
                } else if (sub.equals("eval")) {
                    String[] parts = event.getMessage().getRawContent().split(" ");
                    if (parts.length < 4) {
                        onHelp(event);
                        return;
                    }
                    Object[] returns;
                    boolean errored = false;
                    try {
                        returns = MantaroData.connectionWatcher().eval(String.join(" ", Arrays.copyOfRange(parts, 3, parts.length)));
                    } catch (RuntimeException e) {
                        errored = true;
                        returns = new Object[] { e.getMessage() };
                    }
                    String result = returns.length == 1 ? returns[0] == null ? null : String.valueOf(returns[0]) : Arrays.asList(returns).toString();
                    event.getChannel().sendMessage(new EmbedBuilder().setAuthor("Evaluated " + (errored ? "and errored" : "with success"), null, event.getAuthor().getAvatarUrl()).setColor(errored ? Color.RED : Color.GREEN).setDescription(result == null ? "Executed successfully with no objects returned" : ("Executed " + (errored ? "and errored: " : "successfully and returned: ") + result)).setFooter("Asked by: " + event.getAuthor().getName(), null).build()).queue();
                } else {
                    onHelp(event);
                }
                return;
            }
            if (option.equals("premium")) {
                String sub = args[1].substring(0, args[1].indexOf(' '));
                if (sub.equals("add")) {
                    try {
                        String[] values = SPLIT_PATTERN.split(args[1], 3);
                        try {
                            Long.parseLong(values[1]);
                        } catch (Exception e) {
                            event.getChannel().sendMessage(EmoteReference.ERROR + "Not a valid user id").queue();
                            return;
                        }
                        DBUser db = MantaroData.db().getUser(values[1]);
                        db.incrementPremium(TimeUnit.DAYS.toMillis(Long.parseLong(values[2])));
                        db.saveAsync();
                        event.getChannel().sendMessage(EmoteReference.CORRECT + "The premium feature for user " + db.getId() + " now is until " + new Date(db.getPremiumUntil())).queue();
                        return;
                    } catch (IndexOutOfBoundsException e) {
                        event.getChannel().sendMessage(EmoteReference.ERROR + "You need to specify id and number of days").queue();
                        e.printStackTrace();
                        return;
                    }
                }
                if (sub.equals("guild")) {
                    try {
                        String[] values = SPLIT_PATTERN.split(args[1], 3);
                        DBGuild db = MantaroData.db().getGuild(values[1]);
                        db.incrementPremium(TimeUnit.DAYS.toMillis(Long.parseLong(values[2])));
                        db.saveAsync();
                        event.getChannel().sendMessage(EmoteReference.CORRECT + "The premium feature for guild " + db.getId() + " now is until " + new Date(db.getPremiumUntil())).queue();
                        return;
                    } catch (IndexOutOfBoundsException e) {
                        event.getChannel().sendMessage(EmoteReference.ERROR + "You need to specify id and number of days").queue();
                        e.printStackTrace();
                        return;
                    }
                }
            }
            if (option.equals("shutdown") || option.equals("restart")) {
                if (args.length == 2) {
                    try {
                        notifyMusic(args[1]).get();
                    } catch (InterruptedException | ExecutionException ignored) {
                    }
                }
                try {
                    prepareShutdown(event);
                } catch (Exception e) {
                    log.warn(EmoteReference.ERROR + "Couldn't prepare shutdown." + e.toString(), e);
                    return;
                }
                if (option.equals("restart")) {
                    try {
                        MantaroData.connectionWatcher().reboot(false);
                    } catch (Exception e) {
                        log.error("Error restarting via manager, manual reboot required", e);
                        System.exit(-1);
                    }
                } else {
                    System.exit(0);
                }
                return;
            }
            if (option.equals("forceshutdown") || option.equals("forcerestart")) {
                if (args.length == 2) {
                    try {
                        notifyMusic(args[1]).get();
                    } catch (InterruptedException | ExecutionException ignored) {
                    }
                }
                try {
                    prepareShutdown(event);
                } catch (Exception e) {
                    log.warn(EmoteReference.ERROR + "Couldn't prepare shutdown. I don't care, I'm gonna restart anyway." + e.toString(), e);
                }
                if (option.equals("forcerestart")) {
                    try {
                        MantaroData.connectionWatcher().reboot(false);
                    } catch (Exception e) {
                        log.error("Error restarting via manager, manual reboot required", e);
                        System.exit(-1);
                    }
                } else {
                    System.exit(0);
                }
                return;
            }
            if (args.length < 2) {
                onHelp(event);
                return;
            }
            String value = args[1];
            if (option.equals("notifymusic")) {
                notifyMusic(value);
                event.getChannel().sendMessage(EmoteReference.MEGA + "Guilds playing music were notified!").queue();
                return;
            }
            String[] values = SPLIT_PATTERN.split(value, 2);
            if (values.length < 2) {
                onHelp(event);
                return;
            }
            String k = values[0], v = values[1];
            if (option.equals("scheduleshutdown") || option.equals("schedulerestart")) {
                boolean restart = option.equals("schedulerestart");
                if (k.equals("time")) {
                    double s = Double.parseDouble(v);
                    int millis = (int) (s * 1000);
                    Async.thread(millis, TimeUnit.MILLISECONDS, () -> {
                        try {
                            prepareShutdown(event);
                        } catch (Exception e) {
                            log.warn(EmoteReference.ERROR + "Couldn't prepare shutdown. I don't care, I'm gonna restart anyway." + e.toString(), e);
                        }
                        if (restart) {
                            try {
                                MantaroData.connectionWatcher().reboot(false);
                            } catch (Exception e) {
                                log.error("Error restarting via manager, manual reboot required", e);
                                System.exit(-1);
                            }
                        } else {
                            System.exit(0);
                        }
                    });
                    event.getChannel().sendMessage(EmoteReference.STOPWATCH + " Sleeping in " + s + " seconds...").queue();
                    return;
                }
                if (k.equals("connections")) {
                    int connections = Integer.parseInt(v);
                    IntSupplier currentConnections = () -> (int) event.getJDA().getVoiceChannels().stream().filter(voiceChannel -> voiceChannel.getMembers().contains(voiceChannel.getGuild().getSelfMember())).count();
                    Async.task("Watching Thread.", s -> {
                        if (currentConnections.getAsInt() > connections)
                            return;
                        try {
                            prepareShutdown(event);
                        } catch (Exception e) {
                            log.warn("Couldn't prepare shutdown. I don't care, I'm gonna do it anyway." + e.toString(), e);
                        }
                        if (restart) {
                            try {
                                MantaroData.connectionWatcher().reboot(false);
                            } catch (Exception e) {
                                log.error("Error restarting via manager, manual reboot required", e);
                                System.exit(-1);
                            }
                        } else {
                            System.exit(0);
                        }
                        s.shutdown();
                    }, 2, TimeUnit.SECONDS);
                    return;
                }
                onHelp(event);
                return;
            }
            if (option.equals("varadd")) {
                try {
                    String v1 = values[1];
                    switch(values[0]) {
                        case "pat":
                            ActionCmds.PATS.get().add(v1);
                            ActionCmds.PATS.save();
                            event.getChannel().sendMessage(EmoteReference.CORRECT + "Added to pat list: " + v).queue();
                            break;
                        case "hug":
                            ActionCmds.HUGS.get().add(v1);
                            ActionCmds.HUGS.save();
                            event.getChannel().sendMessage(EmoteReference.CORRECT + "Added to hug list: " + v).queue();
                            break;
                        case "greeting":
                            ActionCmds.GREETINGS.get().add(content.replace("varadd greeting ", ""));
                            ActionCmds.GREETINGS.save();
                            event.getChannel().sendMessage(EmoteReference.CORRECT + "Added to greet list: " + content.replace("greeting ", "")).queue();
                            break;
                        case "splash":
                            MantaroShard.SPLASHES.get().add(content.replace("varadd splash ", ""));
                            MantaroShard.SPLASHES.save();
                            event.getChannel().sendMessage(EmoteReference.CORRECT + "Added to splash list: " + content.replace("splash ", "")).queue();
                            break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return;
            }
            if (option.equals("eval")) {
                Evaluator evaluator = evals.get(k);
                if (evaluator == null) {
                    onHelp(event);
                    return;
                }
                Object result = evaluator.eval(event, v);
                boolean errored = result instanceof Throwable;
                event.getChannel().sendMessage(new EmbedBuilder().setAuthor("Evaluated " + (errored ? "and errored" : "with success"), null, event.getAuthor().getAvatarUrl()).setColor(errored ? Color.RED : Color.GREEN).setDescription(result == null ? "Executed successfully with no objects returned" : ("Executed " + (errored ? "and errored: " : "successfully and returned: ") + result.toString())).setFooter("Asked by: " + event.getAuthor().getName(), null).build()).queue();
                return;
            }
            if (option.equals("query")) {
                try {
                    String[] values1 = SPLIT_PATTERN.split(content);
                    String expression = content.replace(values1[0] + " ", "");
                    SQLDatabase.getInstance().run((conn) -> {
                        try {
                            ResultSet set;
                            try {
                                set = conn.prepareStatement(expression).executeQuery();
                            } catch (SQLException e) {
                                try {
                                    conn.prepareStatement(expression).execute();
                                    event.getChannel().sendMessage(" Query was successfully executed!").queue();
                                } catch (SQLException e1) {
                                    event.getChannel().sendMessage("Failed to execute query! " + Utils.paste(getStackTrace(e1))).queue();
                                }
                                return;
                            }
                            List<String> header = new ArrayList<>();
                            List<List<String>> table = new ArrayList<>();
                            ResultSetMetaData metaData = set.getMetaData();
                            int columnsCount = metaData.getColumnCount();
                            for (int i = 0; i < columnsCount; i++) {
                                header.add(metaData.getColumnName(i + 1));
                            }
                            while (set.next()) {
                                List<String> row = new ArrayList<>();
                                for (int i = 0; i < columnsCount; i++) {
                                    String s = String.valueOf(set.getString(i + 1)).trim();
                                    row.add(s.substring(0, Math.min(30, s.length())));
                                }
                                table.add(row);
                            }
                            String output = makeAsciiTable(header, table, null);
                            event.getChannel().sendMessage(Utils.paste(output)).queue();
                        } catch (SQLException e) {
                            event.getChannel().sendMessage(" Failed to build ascii table! " + Utils.paste(getStackTrace(e))).queue();
                        }
                    }).queue();
                } catch (SQLException e) {
                    event.getChannel().sendMessage(" Failed to run query! " + Utils.paste(getStackTrace(e))).queue();
                }
                return;
            }
            onHelp(event);
        }

        @Override
        public String[] splitArgs(String content) {
            return SPLIT_PATTERN.split(content, 2);
        }
    });
}
Also used : SimpleCommand(net.kodehawa.mantarobot.modules.commands.SimpleCommand) Color(java.awt.Color) java.util(java.util) Async(br.com.brjdevs.java.utils.async.Async) Utils(net.kodehawa.mantarobot.utils.Utils) Module(net.kodehawa.mantarobot.modules.Module) CompletableFuture(java.util.concurrent.CompletableFuture) MantaroShard(net.kodehawa.mantarobot.MantaroShard) Message(net.dv8tion.jda.core.entities.Message) MantaroBot(net.kodehawa.mantarobot.MantaroBot) GuildMessageReceivedEvent(net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent) SQLException(java.sql.SQLException) DBGuild(net.kodehawa.mantarobot.data.entities.DBGuild) ResultSet(java.sql.ResultSet) CommandRegistry(net.kodehawa.mantarobot.modules.CommandRegistry) SQLDatabase(net.kodehawa.mantarobot.utils.sql.SQLDatabase) Command(net.kodehawa.mantarobot.modules.Command) MessageEmbed(net.dv8tion.jda.core.entities.MessageEmbed) IntSupplier(java.util.function.IntSupplier) PrintWriter(java.io.PrintWriter) Interpreter(bsh.Interpreter) DBUser(net.kodehawa.mantarobot.data.entities.DBUser) StringWriter(java.io.StringWriter) SPLIT_PATTERN(net.kodehawa.mantarobot.utils.StringUtils.SPLIT_PATTERN) ScriptEngineManager(javax.script.ScriptEngineManager) Category(net.kodehawa.mantarobot.modules.commands.base.Category) MantaroObj(net.kodehawa.mantarobot.data.entities.MantaroObj) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) Slf4j(lombok.extern.slf4j.Slf4j) CollectionUtils.random(br.com.brjdevs.java.utils.collections.CollectionUtils.random) EmoteReference(net.kodehawa.mantarobot.utils.commands.EmoteReference) CommandPermission(net.kodehawa.mantarobot.modules.commands.CommandPermission) ScriptEngine(javax.script.ScriptEngine) MantaroData(net.kodehawa.mantarobot.data.MantaroData) ResultSetMetaData(java.sql.ResultSetMetaData) MessageEmbed(net.dv8tion.jda.core.entities.MessageEmbed) IntSupplier(java.util.function.IntSupplier) SQLException(java.sql.SQLException) ScriptEngineManager(javax.script.ScriptEngineManager) CommandPermission(net.kodehawa.mantarobot.modules.commands.CommandPermission) ResultSetMetaData(java.sql.ResultSetMetaData) ResultSet(java.sql.ResultSet) GuildMessageReceivedEvent(net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent) Interpreter(bsh.Interpreter) ScriptEngine(javax.script.ScriptEngine) SQLException(java.sql.SQLException) ExecutionException(java.util.concurrent.ExecutionException) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) DBGuild(net.kodehawa.mantarobot.data.entities.DBGuild) SimpleCommand(net.kodehawa.mantarobot.modules.commands.SimpleCommand) DBUser(net.kodehawa.mantarobot.data.entities.DBUser) SimpleCommand(net.kodehawa.mantarobot.modules.commands.SimpleCommand) Command(net.kodehawa.mantarobot.modules.Command)

Aggregations

Async (br.com.brjdevs.java.utils.async.Async)1 CollectionUtils.random (br.com.brjdevs.java.utils.collections.CollectionUtils.random)1 Interpreter (bsh.Interpreter)1 Color (java.awt.Color)1 PrintWriter (java.io.PrintWriter)1 StringWriter (java.io.StringWriter)1 ResultSet (java.sql.ResultSet)1 ResultSetMetaData (java.sql.ResultSetMetaData)1 SQLException (java.sql.SQLException)1 java.util (java.util)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 ExecutionException (java.util.concurrent.ExecutionException)1 TimeUnit (java.util.concurrent.TimeUnit)1 IntSupplier (java.util.function.IntSupplier)1 ScriptEngine (javax.script.ScriptEngine)1 ScriptEngineManager (javax.script.ScriptEngineManager)1 Slf4j (lombok.extern.slf4j.Slf4j)1 EmbedBuilder (net.dv8tion.jda.core.EmbedBuilder)1 Message (net.dv8tion.jda.core.entities.Message)1 MessageEmbed (net.dv8tion.jda.core.entities.MessageEmbed)1