Fix
This commit is contained in:
		@@ -5,8 +5,8 @@ import io.izzel.taboolib.module.locale.TLocale;
 | 
				
			|||||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandArgument;
 | 
					import io.izzel.taboolib.module.command.base.Argument;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandRegister;
 | 
					import io.izzel.taboolib.module.command.base.SubCommand;
 | 
				
			||||||
import io.izzel.taboolib.util.ArrayUtil;
 | 
					import io.izzel.taboolib.util.ArrayUtil;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.command.Command;
 | 
					import org.bukkit.command.Command;
 | 
				
			||||||
@@ -18,8 +18,7 @@ import org.bukkit.entity.Player;
 | 
				
			|||||||
 * @Since 2018-07-04 21:32
 | 
					 * @Since 2018-07-04 21:32
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@BaseCommand(
 | 
					@BaseCommand(
 | 
				
			||||||
        name = "taboolibexecute",
 | 
					        name = "tExecute",
 | 
				
			||||||
        aliases = {"texecute"},
 | 
					 | 
				
			||||||
        permission = "taboolib.admin"
 | 
					        permission = "taboolib.admin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
					public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			||||||
@@ -29,7 +28,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        return TLocale.asString("COMMANDS.TEXECUTE.COMMAND-TITLE");
 | 
					        return TLocale.asString("COMMANDS.TEXECUTE.COMMAND-TITLE");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 1)
 | 
					    @SubCommand(priority = 1)
 | 
				
			||||||
    BaseSubCommand chat = new BaseSubCommand() {
 | 
					    BaseSubCommand chat = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -43,10 +42,10 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.CHAT.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.CHAT.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.CHAT.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.CHAT.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,7 +60,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 1)
 | 
					    @SubCommand(priority = 1)
 | 
				
			||||||
    BaseSubCommand command = new BaseSubCommand() {
 | 
					    BaseSubCommand command = new BaseSubCommand() {
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public String getLabel() {
 | 
					        public String getLabel() {
 | 
				
			||||||
@@ -79,10 +78,10 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -101,7 +100,7 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 2)
 | 
					    @SubCommand(priority = 2)
 | 
				
			||||||
    BaseSubCommand commandAsOp = new BaseSubCommand() {
 | 
					    BaseSubCommand commandAsOp = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -120,10 +119,10 @@ public class TabooLibExecuteCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND-AS-OP.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND-AS-OP.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND-AS-OP.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TEXECUTE.COMMAND-AS-OP.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,8 +5,8 @@ import io.izzel.taboolib.module.locale.TLocaleLoader;
 | 
				
			|||||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandArgument;
 | 
					import io.izzel.taboolib.module.command.base.Argument;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandRegister;
 | 
					import io.izzel.taboolib.module.command.base.SubCommand;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.command.Command;
 | 
					import org.bukkit.command.Command;
 | 
				
			||||||
import org.bukkit.command.CommandSender;
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
@@ -22,8 +22,7 @@ import java.util.stream.IntStream;
 | 
				
			|||||||
 * @since 2018-04-22 14:36:28
 | 
					 * @since 2018-04-22 14:36:28
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@BaseCommand(
 | 
					@BaseCommand(
 | 
				
			||||||
        name = "tabooliblocale",
 | 
					        name = "tLocale",
 | 
				
			||||||
        aliases = {"taboolocale", "tlocale"},
 | 
					 | 
				
			||||||
        permission = "taboolib.admin"
 | 
					        permission = "taboolib.admin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
public class TabooLibLocaleCommand extends BaseMainCommand {
 | 
					public class TabooLibLocaleCommand extends BaseMainCommand {
 | 
				
			||||||
@@ -33,7 +32,7 @@ public class TabooLibLocaleCommand extends BaseMainCommand {
 | 
				
			|||||||
        return TLocale.asString("COMMANDS.TLOCALE.COMMAND-TITLE");
 | 
					        return TLocale.asString("COMMANDS.TLOCALE.COMMAND-TITLE");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister
 | 
					    @SubCommand
 | 
				
			||||||
    BaseSubCommand send = new BaseSubCommand() {
 | 
					    BaseSubCommand send = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -47,11 +46,11 @@ public class TabooLibLocaleCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.1")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.1")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.2"), false)
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOCALE.SEND.ARGUMENTS.2"), false)
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,8 @@ import io.izzel.taboolib.module.locale.TLocale;
 | 
				
			|||||||
import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandArgument;
 | 
					import io.izzel.taboolib.module.command.base.Argument;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandRegister;
 | 
					import io.izzel.taboolib.module.command.base.SubCommand;
 | 
				
			||||||
import io.izzel.taboolib.util.plugin.PluginLoadState;
 | 
					import io.izzel.taboolib.util.plugin.PluginLoadState;
 | 
				
			||||||
import io.izzel.taboolib.util.plugin.PluginLoadStateType;
 | 
					import io.izzel.taboolib.util.plugin.PluginLoadStateType;
 | 
				
			||||||
import io.izzel.taboolib.util.plugin.PluginUnloadState;
 | 
					import io.izzel.taboolib.util.plugin.PluginUnloadState;
 | 
				
			||||||
@@ -27,8 +27,7 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
 * @Since 2018-05-07 20:14
 | 
					 * @Since 2018-05-07 20:14
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@BaseCommand(
 | 
					@BaseCommand(
 | 
				
			||||||
        name = "taboolibplugin",
 | 
					        name = "tPlugin",
 | 
				
			||||||
        aliases = {"tabooplugin", "tplugin"},
 | 
					 | 
				
			||||||
        permission = "taboolib.admin"
 | 
					        permission = "taboolib.admin"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
public class TabooLibPluginCommand extends BaseMainCommand {
 | 
					public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			||||||
@@ -38,7 +37,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        return TLocale.asString("COMMANDS.TPLUGIN.COMMAND-TITLE");
 | 
					        return TLocale.asString("COMMANDS.TPLUGIN.COMMAND-TITLE");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 1)
 | 
					    @SubCommand(priority = 1)
 | 
				
			||||||
    BaseSubCommand load = new BaseSubCommand() {
 | 
					    BaseSubCommand load = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -52,8 +51,8 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.LOAD.ARGUMENTS.0"), true)};
 | 
					            return new Argument[] {new Argument(TLocale.asString("COMMANDS.TPLUGIN.LOAD.ARGUMENTS.0"), true)};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -88,7 +87,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 2)
 | 
					    @SubCommand(priority = 2)
 | 
				
			||||||
    BaseSubCommand unload = new BaseSubCommand() {
 | 
					    BaseSubCommand unload = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -102,8 +101,8 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.UNLOAD.ARGUMENTS.0"), true, () -> {
 | 
					            return new Argument[] {new Argument(TLocale.asString("COMMANDS.TPLUGIN.UNLOAD.ARGUMENTS.0"), true, () -> {
 | 
				
			||||||
                return java.util.Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
					                return java.util.Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
				
			||||||
            })};
 | 
					            })};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -132,7 +131,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 3)
 | 
					    @SubCommand(priority = 3)
 | 
				
			||||||
    BaseSubCommand reload = new BaseSubCommand() {
 | 
					    BaseSubCommand reload = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -146,8 +145,8 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.RELOAD.ARGUMENTS.0"), true, () -> {
 | 
					            return new Argument[] {new Argument(TLocale.asString("COMMANDS.TPLUGIN.RELOAD.ARGUMENTS.0"), true, () -> {
 | 
				
			||||||
                return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
					                return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
				
			||||||
            })};
 | 
					            })};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -167,7 +166,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 4)
 | 
					    @SubCommand(priority = 4)
 | 
				
			||||||
    BaseSubCommand info = new BaseSubCommand() {
 | 
					    BaseSubCommand info = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -181,8 +180,8 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {new CommandArgument(TLocale.asString("COMMANDS.TPLUGIN.INFO.ARGUMENTS.0"), true, () -> {
 | 
					            return new Argument[] {new Argument(TLocale.asString("COMMANDS.TPLUGIN.INFO.ARGUMENTS.0"), true, () -> {
 | 
				
			||||||
                return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
					                return Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toList());
 | 
				
			||||||
            })};
 | 
					            })};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -212,7 +211,7 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 5)
 | 
					    @SubCommand(priority = 5)
 | 
				
			||||||
    BaseSubCommand list = new BaseSubCommand() {
 | 
					    BaseSubCommand list = new BaseSubCommand() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
@@ -226,8 +225,8 @@ public class TabooLibPluginCommand extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[0];
 | 
					            return new Argument[0];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,10 +8,13 @@ import java.util.Objects;
 | 
				
			|||||||
 * @author Bkm016
 | 
					 * @author Bkm016
 | 
				
			||||||
 * @since 2018-04-17
 | 
					 * @since 2018-04-17
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class CommandArgument {
 | 
					public class Argument {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 参数名称
 | 
				
			||||||
    private String name;
 | 
					    private String name;
 | 
				
			||||||
 | 
					    // 是否必须
 | 
				
			||||||
    private boolean required;
 | 
					    private boolean required;
 | 
				
			||||||
 | 
					    // 参数补全
 | 
				
			||||||
    private CommandTab tab;
 | 
					    private CommandTab tab;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public String getName() {
 | 
					    public String getName() {
 | 
				
			||||||
@@ -26,19 +29,19 @@ public class CommandArgument {
 | 
				
			|||||||
        return tab;
 | 
					        return tab;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandArgument(String name) {
 | 
					    public Argument(String name) {
 | 
				
			||||||
        this(name, true);
 | 
					        this(name, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandArgument(String name, CommandTab tab) {
 | 
					    public Argument(String name, CommandTab tab) {
 | 
				
			||||||
        this(name, true, tab);
 | 
					        this(name, true, tab);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandArgument(String name, boolean required) {
 | 
					    public Argument(String name, boolean required) {
 | 
				
			||||||
        this(name, required, null);
 | 
					        this(name, required, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandArgument(String name, boolean required, CommandTab tab) {
 | 
					    public Argument(String name, boolean required, CommandTab tab) {
 | 
				
			||||||
        this.name = name;
 | 
					        this.name = name;
 | 
				
			||||||
        this.required = required;
 | 
					        this.required = required;
 | 
				
			||||||
        this.tab = tab;
 | 
					        this.tab = tab;
 | 
				
			||||||
@@ -54,10 +57,10 @@ public class CommandArgument {
 | 
				
			|||||||
        if (this == o) {
 | 
					        if (this == o) {
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (!(o instanceof CommandArgument)) {
 | 
					        if (!(o instanceof Argument)) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        CommandArgument that = (CommandArgument) o;
 | 
					        Argument that = (Argument) o;
 | 
				
			||||||
        return isRequired() == that.isRequired() &&
 | 
					        return isRequired() == that.isRequired() &&
 | 
				
			||||||
                Objects.equals(getName(), that.getName()) &&
 | 
					                Objects.equals(getName(), that.getName()) &&
 | 
				
			||||||
                Objects.equals(tab, that.tab);
 | 
					                Objects.equals(tab, that.tab);
 | 
				
			||||||
@@ -23,5 +23,5 @@ public @interface BaseCommand {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    String usage() default "";
 | 
					    String usage() default "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    String[] aliases() default "";
 | 
					    String[] aliases() default {};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -49,9 +49,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
				
			|||||||
    public static void loadCommandRegister(BaseMainCommand baseMainCommand) {
 | 
					    public static void loadCommandRegister(BaseMainCommand baseMainCommand) {
 | 
				
			||||||
        List<Method> methods = new ArrayList<>();
 | 
					        List<Method> methods = new ArrayList<>();
 | 
				
			||||||
        List<CommandField> fields = new ArrayList<>();
 | 
					        List<CommandField> fields = new ArrayList<>();
 | 
				
			||||||
        baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(CommandRegister.class) != null).forEach(methods::add));
 | 
					        baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredMethods()).filter(method -> method.getAnnotation(SubCommand.class) != null).forEach(methods::add));
 | 
				
			||||||
        if (methods.size() > 0) {
 | 
					        if (methods.size() > 0) {
 | 
				
			||||||
            methods.sort(Comparator.comparingDouble(a -> a.getAnnotation(CommandRegister.class).priority()));
 | 
					            methods.sort(Comparator.comparingDouble(a -> a.getAnnotation(SubCommand.class).priority()));
 | 
				
			||||||
            methods.forEach(x -> {
 | 
					            methods.forEach(x -> {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    x.setAccessible(true);
 | 
					                    x.setAccessible(true);
 | 
				
			||||||
@@ -60,9 +60,9 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(CommandRegister.class) != null && field.getType().equals(io.izzel.taboolib.module.command.base.BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz))));
 | 
					        baseMainCommand.getLinkClasses().forEach(clazz -> java.util.Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getAnnotation(SubCommand.class) != null && field.getType().equals(io.izzel.taboolib.module.command.base.BaseSubCommand.class)).forEach(field -> fields.add(new CommandField(field, clazz))));
 | 
				
			||||||
        if (fields.size() > 0) {
 | 
					        if (fields.size() > 0) {
 | 
				
			||||||
            fields.sort(Comparator.comparingDouble(commandField -> commandField.getField().getAnnotation(CommandRegister.class).priority()));
 | 
					            fields.sort(Comparator.comparingDouble(commandField -> commandField.getField().getAnnotation(SubCommand.class).priority()));
 | 
				
			||||||
            fields.forEach(commandField -> {
 | 
					            fields.forEach(commandField -> {
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    commandField.getField().setAccessible(true);
 | 
					                    commandField.getField().setAccessible(true);
 | 
				
			||||||
@@ -123,7 +123,7 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
				
			|||||||
            return label.stream().filter(l -> args[0].isEmpty() || l.toLowerCase().startsWith(args[0].toLowerCase())).collect(Collectors.toList());
 | 
					            return label.stream().filter(l -> args[0].isEmpty() || l.toLowerCase().startsWith(args[0].toLowerCase())).collect(Collectors.toList());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) {
 | 
					        for (io.izzel.taboolib.module.command.base.BaseSubCommand subCommand : subCommands) {
 | 
				
			||||||
            CommandArgument[] arguments = subCommand.getArguments();
 | 
					            Argument[] arguments = subCommand.getArguments();
 | 
				
			||||||
            if (args[0].equalsIgnoreCase(subCommand.getLabel()) && args.length - 1 <= arguments.length) {
 | 
					            if (args[0].equalsIgnoreCase(subCommand.getLabel()) && args.length - 1 <= arguments.length) {
 | 
				
			||||||
                CommandTab commandTab = arguments[args.length - 2].getTab();
 | 
					                CommandTab commandTab = arguments[args.length - 2].getTab();
 | 
				
			||||||
                if (commandTab != null) {
 | 
					                if (commandTab != null) {
 | 
				
			||||||
@@ -208,7 +208,10 @@ public abstract class BaseMainCommand implements CommandExecutor, TabExecutor {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void disguisedPlugin() {
 | 
					    private void disguisedPlugin() {
 | 
				
			||||||
        linkClasses.forEach(clazz -> disguisedPlugin(clazz, registerCommand.getPlugin()));
 | 
					        try {
 | 
				
			||||||
 | 
					            linkClasses.forEach(clazz -> disguisedPlugin(clazz, registerCommand.getPlugin()));
 | 
				
			||||||
 | 
					        } catch (Throwable ignored) {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void disguisedPlugin(Class<?> targetClass, Plugin plugin) {
 | 
					    private void disguisedPlugin(Class<?> targetClass, Plugin plugin) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,8 +32,8 @@ public abstract class BaseSubCommand {
 | 
				
			|||||||
        return new String[0];
 | 
					        return new String[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandArgument[] getArguments() {
 | 
					    public Argument[] getArguments() {
 | 
				
			||||||
        return new CommandArgument[0];
 | 
					        return new Argument[0];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public CommandType getType() {
 | 
					    public CommandType getType() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@ import java.lang.annotation.Target;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Target({ElementType.METHOD, ElementType.FIELD})
 | 
					@Target({ElementType.METHOD, ElementType.FIELD})
 | 
				
			||||||
@Retention(RetentionPolicy.RUNTIME)
 | 
					@Retention(RetentionPolicy.RUNTIME)
 | 
				
			||||||
public @interface CommandRegister {
 | 
					public @interface SubCommand {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    double priority() default 0;
 | 
					    double priority() default 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class AlreadyStartException extends RuntimeException {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,19 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class CompleteEvent {
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
    private boolean success;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CompleteEvent(EagletTask task, boolean success) {
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
        this.success = success;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public boolean isSuccess() {
 | 
					 | 
				
			||||||
        return success;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,27 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ConnectedEvent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private long contentLength;
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ConnectedEvent(long length, EagletTask task) {
 | 
					 | 
				
			||||||
        this.contentLength = length;
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get the length of the download task.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * If the length is -1, this task cannot be downloaded in multiple threads.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return length
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public long getContentLength() {
 | 
					 | 
				
			||||||
        return contentLength;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class DoNotSupportMultipleThreadException extends RuntimeException {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@FunctionalInterface
 | 
					 | 
				
			||||||
public interface EagletHandler<T> {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void handle(T event) ;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,477 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import io.izzel.taboolib.util.Files;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.net.HttpURLConnection;
 | 
					 | 
				
			||||||
import java.net.MalformedURLException;
 | 
					 | 
				
			||||||
import java.net.Proxy;
 | 
					 | 
				
			||||||
import java.net.URL;
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.concurrent.ConcurrentHashMap;
 | 
					 | 
				
			||||||
import java.util.concurrent.ExecutorService;
 | 
					 | 
				
			||||||
import java.util.concurrent.Executors;
 | 
					 | 
				
			||||||
import java.util.concurrent.TimeUnit;
 | 
					 | 
				
			||||||
import java.util.concurrent.locks.ReentrantLock;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class EagletTask {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private ReentrantLock lock = new ReentrantLock();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Map<String, String> httpHeader = new ConcurrentHashMap<>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private URL url;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EagletHandler<ErrorEvent> onError = event -> event.getException().printStackTrace();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletHandler<StartEvent> onStart;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletHandler<CompleteEvent> onComplete;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletHandler<ConnectedEvent> onConnected;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletHandler<ProgressEvent> onProgress;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private Proxy proxy;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private String md5, sha1, sha256;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    String requestMethod = "GET";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private int threadAmount = 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int connectionTimeout = 7000;
 | 
					 | 
				
			||||||
    int readTimeout = 7000;
 | 
					 | 
				
			||||||
    int maxRetry = 5;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private File dest;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private transient boolean running = false;
 | 
					 | 
				
			||||||
    private transient long contentLength, maxBlockingTime = 7000;
 | 
					 | 
				
			||||||
    private transient ExecutorService executorService;
 | 
					 | 
				
			||||||
    private transient Thread monitor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask() {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Stop this task forcefully, and the target file will not be removed.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public void stop() {
 | 
					 | 
				
			||||||
        executorService.shutdownNow();
 | 
					 | 
				
			||||||
        monitor.interrupt();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Start the download file
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * 开始下载文件
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask start() {
 | 
					 | 
				
			||||||
        // create thread pool for download
 | 
					 | 
				
			||||||
        executorService = Executors.newFixedThreadPool(threadAmount);
 | 
					 | 
				
			||||||
        // check if is already running
 | 
					 | 
				
			||||||
        if (running) {
 | 
					 | 
				
			||||||
            throw new AlreadyStartException();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // start the monitor thread
 | 
					 | 
				
			||||||
        monitor = new Thread(() -> {
 | 
					 | 
				
			||||||
            lock.lock();
 | 
					 | 
				
			||||||
            // fire a new start event
 | 
					 | 
				
			||||||
            if (onStart != null) {
 | 
					 | 
				
			||||||
                onStart.handle(new StartEvent(this));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                // create the target file
 | 
					 | 
				
			||||||
                Files.file(dest);
 | 
					 | 
				
			||||||
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 | 
					 | 
				
			||||||
                // set the connection properties
 | 
					 | 
				
			||||||
                httpHeader.forEach(connection::addRequestProperty);
 | 
					 | 
				
			||||||
                connection.setRequestMethod(requestMethod);
 | 
					 | 
				
			||||||
                connection.setConnectTimeout(30000);
 | 
					 | 
				
			||||||
                connection.setReadTimeout(30000);
 | 
					 | 
				
			||||||
                connection.connect();
 | 
					 | 
				
			||||||
                contentLength = connection.getContentLengthLong();
 | 
					 | 
				
			||||||
                // fire a new connected event
 | 
					 | 
				
			||||||
                // contains connection properties
 | 
					 | 
				
			||||||
                if (onConnected != null) {
 | 
					 | 
				
			||||||
                    onConnected.handle(new ConnectedEvent(contentLength, this));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                // if this is an unknown length task
 | 
					 | 
				
			||||||
                if (contentLength == -1 || threadAmount == 1) {
 | 
					 | 
				
			||||||
                    // pass the connection instance to this new thread
 | 
					 | 
				
			||||||
                    SingleThreadDownload download = new SingleThreadDownload(connection, dest, this);
 | 
					 | 
				
			||||||
                    executorService.execute(download);
 | 
					 | 
				
			||||||
                    long last = 0;
 | 
					 | 
				
			||||||
                    do {
 | 
					 | 
				
			||||||
                        Thread.sleep(500);
 | 
					 | 
				
			||||||
                        // check the progress
 | 
					 | 
				
			||||||
                        long progress = download.getCurrentProgress();
 | 
					 | 
				
			||||||
                        // fire a new progress event
 | 
					 | 
				
			||||||
                        if (onProgress != null) {
 | 
					 | 
				
			||||||
                            onProgress.handle(new ProgressEvent(progress - last < 0 ? 0 : progress - last, this, ((double) progress) / Math.max((double) contentLength, 0D)));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        last = progress;
 | 
					 | 
				
			||||||
                        // check complete
 | 
					 | 
				
			||||||
                    } while (last != contentLength && !download.isComplete());
 | 
					 | 
				
			||||||
                    // close the thread pool, DoNotSupportMultipleThreadExceptionrelease resources
 | 
					 | 
				
			||||||
                    executorService.shutdown();
 | 
					 | 
				
			||||||
                    // change the running flag to false
 | 
					 | 
				
			||||||
                    running = false;
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    List<SplitDownload> splitDownloads = new ArrayList<>();
 | 
					 | 
				
			||||||
                    // Assign download task length
 | 
					 | 
				
			||||||
                    long blockSize = contentLength / threadAmount;
 | 
					 | 
				
			||||||
                    for (int threadId = 0; threadId < threadAmount; threadId++) {
 | 
					 | 
				
			||||||
                        long startIndex = threadId * blockSize;
 | 
					 | 
				
			||||||
                        long endIndex = (threadId + 1) * blockSize - 1;
 | 
					 | 
				
			||||||
                        if (threadId == (threadAmount - 1)) {
 | 
					 | 
				
			||||||
                            endIndex = contentLength - 1;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        SplitDownload download = new SplitDownload(url, startIndex, endIndex, dest, this);
 | 
					 | 
				
			||||||
                        // Start downloading
 | 
					 | 
				
			||||||
                        executorService.execute(download);
 | 
					 | 
				
			||||||
                        splitDownloads.add(download);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    long last = 0;
 | 
					 | 
				
			||||||
                    do {
 | 
					 | 
				
			||||||
                        Thread.sleep(500);
 | 
					 | 
				
			||||||
                        long progress = 0;
 | 
					 | 
				
			||||||
                        // Collect download progress
 | 
					 | 
				
			||||||
                        for (SplitDownload splitDownload : splitDownloads) {
 | 
					 | 
				
			||||||
                            progress += splitDownload.getCurrentIndex() - splitDownload.startIndex;
 | 
					 | 
				
			||||||
                            // blocked then restart from current index
 | 
					 | 
				
			||||||
                            if (!splitDownload.isComplete() && System.currentTimeMillis() - splitDownload.getLastUpdateTime() > maxBlockingTime) {
 | 
					 | 
				
			||||||
                                splitDownload.setStartIndex(splitDownload.getCurrentIndex());
 | 
					 | 
				
			||||||
                                if (splitDownload.getRetry() <= maxRetry) {
 | 
					 | 
				
			||||||
                                    executorService.execute(splitDownload);
 | 
					 | 
				
			||||||
                                } else {
 | 
					 | 
				
			||||||
                                    throw new RetryFailedException(this);
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        // Fire a progress event
 | 
					 | 
				
			||||||
                        if (onProgress != null) {
 | 
					 | 
				
			||||||
                            onProgress.handle(new ProgressEvent(progress - last, this,
 | 
					 | 
				
			||||||
                                    ((double) progress) / ((double) contentLength)));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        last = progress;
 | 
					 | 
				
			||||||
                        // check complete
 | 
					 | 
				
			||||||
                    } while (last < contentLength);
 | 
					 | 
				
			||||||
                    // close the thread pool, release resources
 | 
					 | 
				
			||||||
                    executorService.shutdown();
 | 
					 | 
				
			||||||
                    // change the running flag to false
 | 
					 | 
				
			||||||
                    running = false;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                // check hash
 | 
					 | 
				
			||||||
                if (md5 != null && !md5.equalsIgnoreCase(HashUtil.md5(dest))) {
 | 
					 | 
				
			||||||
                    throw new HashNotMatchException();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                if (sha1 != null && !sha1.equalsIgnoreCase(HashUtil.sha1(dest))) {
 | 
					 | 
				
			||||||
                    throw new HashNotMatchException();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                if (sha256 != null && !sha256.equalsIgnoreCase(HashUtil.sha256(dest))) {
 | 
					 | 
				
			||||||
                    throw new HashNotMatchException();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                if (onComplete != null) {
 | 
					 | 
				
			||||||
                    onComplete.handle(new CompleteEvent(this, true));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } catch (Exception e) {
 | 
					 | 
				
			||||||
                onError.handle(new ErrorEvent(e, this));
 | 
					 | 
				
			||||||
                executorService.shutdown();
 | 
					 | 
				
			||||||
                if (onComplete != null) {
 | 
					 | 
				
			||||||
                    onComplete.handle(new CompleteEvent(this, false));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } finally {
 | 
					 | 
				
			||||||
                lock.unlock();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }, "EagletTaskMonitor");
 | 
					 | 
				
			||||||
        monitor.start();
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask waitUntil() {
 | 
					 | 
				
			||||||
        while (lock.tryLock()) {
 | 
					 | 
				
			||||||
            lock.unlock();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        lock.lock();
 | 
					 | 
				
			||||||
        lock.unlock();
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask waitFor(long timeout, TimeUnit unit) {
 | 
					 | 
				
			||||||
        while (lock.tryLock()) {
 | 
					 | 
				
			||||||
            lock.unlock();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            lock.tryLock(timeout, unit);
 | 
					 | 
				
			||||||
        } catch (InterruptedException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask maxRetry(int maxRetry) {
 | 
					 | 
				
			||||||
        this.maxRetry = maxRetry;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the sha256 hash of the download file. Case is not sensitive.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * If the hash check failed, an error event will be fired.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param sha256 file sha1
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask sha256(String sha256) {
 | 
					 | 
				
			||||||
        this.sha256 = sha256;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the sha1 hash of the download file. Case is not sensitive.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * If the hash check failed, an error event will be fired.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param sha1 file sha1
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask sha1(String sha1) {
 | 
					 | 
				
			||||||
        this.sha1 = sha1;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the md5 hash of the download file. Case is not sensitive.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * If the hash check failed, an error event will be fired.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param md5 file md5
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask md5(String md5) {
 | 
					 | 
				
			||||||
        this.md5 = md5;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the max blocked time per download thread.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * If the thread blocks exceeded the provided time, this thread will re-start the task.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param maxBlockingTime time
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private EagletTask maxBlocking(long maxBlockingTime) {
 | 
					 | 
				
			||||||
        this.maxBlockingTime = maxBlockingTime;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the progress handler
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * This handler will be called every 1000 milli seconds.
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * 设置处理进度的时间监听器。该监听器的 handle 方法每秒调用一次。
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param onProgress handler
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setOnProgress(EagletHandler<ProgressEvent> onProgress) {
 | 
					 | 
				
			||||||
        this.onProgress = onProgress;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the download file
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param file the file's absolute path
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask file(String file) {
 | 
					 | 
				
			||||||
        this.dest = new File(file);
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the download file
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param file the file
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask file(File file) {
 | 
					 | 
				
			||||||
        this.dest = file;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the connected handler
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * This will be called when the connection is established
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * Async call
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param onConnected onConnected event handler
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setOnConnected(EagletHandler<ConnectedEvent> onConnected) {
 | 
					 | 
				
			||||||
        this.onConnected = onConnected;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the read timeout, default is 7000
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param timeout timeout
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask readTimeout(int timeout) {
 | 
					 | 
				
			||||||
        this.readTimeout = timeout;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the connection timeout, default is 7000
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param timeout timeout
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask connectionTimeout(int timeout) {
 | 
					 | 
				
			||||||
        this.connectionTimeout = timeout;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the request method, default is <code>GET</code>
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param requestMethod the request method
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask requestMethod(String requestMethod) {
 | 
					 | 
				
			||||||
        this.requestMethod = requestMethod;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the complete event handler
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * This handler will be called when everything is complete, and the downloaded file is available
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * Async call
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param onComplete the handler
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setOnComplete(EagletHandler<CompleteEvent> onComplete) {
 | 
					 | 
				
			||||||
        this.onComplete = onComplete;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the start handler
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * This handler will be called when the <code>start</code> method is called
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * Async call
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param onStart the handler
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setOnStart(EagletHandler<StartEvent> onStart) {
 | 
					 | 
				
			||||||
        this.onStart = onStart;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the network proxy
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param proxy the proxy
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask proxy(Proxy proxy) {
 | 
					 | 
				
			||||||
        this.proxy = proxy;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the error handler, default is to print the stack trace
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * This handler will be called when an exception is thrown
 | 
					 | 
				
			||||||
     * <p>
 | 
					 | 
				
			||||||
     * Async call
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param onError the handler
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setOnError(EagletHandler<ErrorEvent> onError) {
 | 
					 | 
				
			||||||
        this.onError = onError;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set how much thread should be used to download, default is 1
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param i thread amount
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask setThreads(int i) {
 | 
					 | 
				
			||||||
        if (i < 1) {
 | 
					 | 
				
			||||||
            throw new RuntimeException("Thread amount cannot be zero or negative!");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        threadAmount = i;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the download source
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param url the url
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask url(URL url) {
 | 
					 | 
				
			||||||
        this.url = url;
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the download source
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param url the url
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask url(String url) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            this.url = new URL(url);
 | 
					 | 
				
			||||||
        } catch (MalformedURLException e) {
 | 
					 | 
				
			||||||
            onError.handle(new ErrorEvent(e, this));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Clear the http header field
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return task instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask clearHeaders() {
 | 
					 | 
				
			||||||
        httpHeader.clear();
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Set the header field of the http request
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param key   header key
 | 
					 | 
				
			||||||
     * @param value header value
 | 
					 | 
				
			||||||
     * @return builder instance
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public EagletTask header(String key, String value) {
 | 
					 | 
				
			||||||
        httpHeader.put(key, value);
 | 
					 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,20 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ErrorEvent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private Throwable e;
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ErrorEvent(Throwable e, EagletTask task) {
 | 
					 | 
				
			||||||
        this.e = e;
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Throwable getException() {
 | 
					 | 
				
			||||||
        return e;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class HashNotMatchException extends RuntimeException {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,63 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.FileInputStream;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.math.BigInteger;
 | 
					 | 
				
			||||||
import java.security.MessageDigest;
 | 
					 | 
				
			||||||
import java.security.NoSuchAlgorithmException;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class HashUtil {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String sha256(File file) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            FileInputStream fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
            MessageDigest md = MessageDigest.getInstance("SHA256");
 | 
					 | 
				
			||||||
            byte[] buffer = new byte[1024];
 | 
					 | 
				
			||||||
            int length = -1;
 | 
					 | 
				
			||||||
            while ((length = fis.read(buffer, 0, 1024)) != -1) {
 | 
					 | 
				
			||||||
                md.update(buffer, 0, length);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            BigInteger bigInt = new BigInteger(1, md.digest());
 | 
					 | 
				
			||||||
            return bigInt.toString(16);
 | 
					 | 
				
			||||||
        } catch (NoSuchAlgorithmException | IOException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String sha1(File file) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            FileInputStream fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
            MessageDigest md = MessageDigest.getInstance("SHA1");
 | 
					 | 
				
			||||||
            byte[] buffer = new byte[1024];
 | 
					 | 
				
			||||||
            int length = -1;
 | 
					 | 
				
			||||||
            while ((length = fis.read(buffer, 0, 1024)) != -1) {
 | 
					 | 
				
			||||||
                md.update(buffer, 0, length);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            BigInteger bigInt = new BigInteger(1, md.digest());
 | 
					 | 
				
			||||||
            return bigInt.toString(16);
 | 
					 | 
				
			||||||
        } catch (NoSuchAlgorithmException | IOException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String md5(File file) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            FileInputStream fis = new FileInputStream(file);
 | 
					 | 
				
			||||||
            MessageDigest md = MessageDigest.getInstance("MD5");
 | 
					 | 
				
			||||||
            byte[] buffer = new byte[1024];
 | 
					 | 
				
			||||||
            int length = -1;
 | 
					 | 
				
			||||||
            while ((length = fis.read(buffer, 0, 1024)) != -1) {
 | 
					 | 
				
			||||||
                md.update(buffer, 0, length);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            BigInteger bigInt = new BigInteger(1, md.digest());
 | 
					 | 
				
			||||||
            return bigInt.toString(16);
 | 
					 | 
				
			||||||
        } catch (NoSuchAlgorithmException | IOException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,53 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.text.DecimalFormat;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class ProgressEvent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private long speed;
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
    private double percentage;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    ProgressEvent(long speed, EagletTask task, double percentage) {
 | 
					 | 
				
			||||||
        this.speed = speed;
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
        this.percentage = percentage;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public long getSpeed() {
 | 
					 | 
				
			||||||
        return speed;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public double getPercentage() {
 | 
					 | 
				
			||||||
        return percentage;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getPercentageFormatted() {
 | 
					 | 
				
			||||||
        return formatDouble(percentage * 100D) + " %";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get the speed with format like <code>X.00 MiB</code>, <code>Y.50 GiB</code>, etc.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return formatted speed string
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public String getSpeedFormatted() {
 | 
					 | 
				
			||||||
        return format(getSpeed());
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private static String formatDouble(double d) {
 | 
					 | 
				
			||||||
        return new DecimalFormat("0.00").format(d);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static String format(long l) {
 | 
					 | 
				
			||||||
        if (l < 1024) return l + " B";
 | 
					 | 
				
			||||||
        if (l < 1024 * 1024) return formatDouble((double) l / 1024D) + " KiB";
 | 
					 | 
				
			||||||
        if (l < 1024 * 1024 * 1024) return formatDouble((double) l / (1024D * 1024D)) + " MiB";
 | 
					 | 
				
			||||||
        if (l < 1024 * 1024 * 1024 * 1024L) return formatDouble((double) l / (1024D * 1024D * 1024)) + " GiB";
 | 
					 | 
				
			||||||
        return "";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class RetryFailedException extends RuntimeException {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    RetryFailedException(EagletTask task) {
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,49 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.*;
 | 
					 | 
				
			||||||
import java.net.HttpURLConnection;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SingleThreadDownload implements Runnable {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private HttpURLConnection connection;
 | 
					 | 
				
			||||||
    private File target;
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private transient long currentProgress = 0, lastUpdateTime = System.currentTimeMillis();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private transient boolean complete = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SingleThreadDownload(HttpURLConnection connection, File target, EagletTask task) {
 | 
					 | 
				
			||||||
        this.connection = connection;
 | 
					 | 
				
			||||||
        this.target = target;
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    long getLastUpdateTime() {
 | 
					 | 
				
			||||||
        return lastUpdateTime;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    long getCurrentProgress() {
 | 
					 | 
				
			||||||
        return currentProgress;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public boolean isComplete() {
 | 
					 | 
				
			||||||
        return complete;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void run() {
 | 
					 | 
				
			||||||
        byte[] buf = new byte[1024];
 | 
					 | 
				
			||||||
        int len = 0;
 | 
					 | 
				
			||||||
        try (BufferedInputStream stream = new BufferedInputStream(connection.getInputStream()); BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(target))) {
 | 
					 | 
				
			||||||
            while ((len = stream.read(buf)) > 0) {
 | 
					 | 
				
			||||||
                outputStream.write(buf, 0, len);
 | 
					 | 
				
			||||||
                currentProgress += len;
 | 
					 | 
				
			||||||
                lastUpdateTime = System.currentTimeMillis();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } catch (IOException e) {
 | 
					 | 
				
			||||||
            task.onError.handle(new ErrorEvent(e, task));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        complete = true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,92 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.io.BufferedInputStream;
 | 
					 | 
				
			||||||
import java.io.File;
 | 
					 | 
				
			||||||
import java.io.RandomAccessFile;
 | 
					 | 
				
			||||||
import java.net.HttpURLConnection;
 | 
					 | 
				
			||||||
import java.net.URL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class SplitDownload implements Runnable {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private URL url;
 | 
					 | 
				
			||||||
    long startIndex, endIndex;
 | 
					 | 
				
			||||||
    private File target;
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private transient long currentIndex, lastUpdateTime = System.currentTimeMillis(), tmpStart;
 | 
					 | 
				
			||||||
    private transient int retry = 0;
 | 
					 | 
				
			||||||
    private transient boolean complete;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SplitDownload(URL url, long startIndex, long endIndex, File dest, EagletTask task) {
 | 
					 | 
				
			||||||
        this.url = url;
 | 
					 | 
				
			||||||
        tmpStart = this.startIndex = this.currentIndex = startIndex;
 | 
					 | 
				
			||||||
        this.endIndex = endIndex;
 | 
					 | 
				
			||||||
        target = dest;
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void setStartIndex(long index) {
 | 
					 | 
				
			||||||
        this.tmpStart = index;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    long getLastUpdateTime() {
 | 
					 | 
				
			||||||
        return lastUpdateTime;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    long getCurrentIndex() {
 | 
					 | 
				
			||||||
        return currentIndex;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int getRetry() {
 | 
					 | 
				
			||||||
        return retry;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    boolean isComplete() {
 | 
					 | 
				
			||||||
        return complete || currentIndex == endIndex + 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void run() {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            complete = false;
 | 
					 | 
				
			||||||
            currentIndex = tmpStart;
 | 
					 | 
				
			||||||
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 | 
					 | 
				
			||||||
            // set the connection properties
 | 
					 | 
				
			||||||
            task.httpHeader.forEach(connection::addRequestProperty);
 | 
					 | 
				
			||||||
            connection.setRequestMethod(task.requestMethod);
 | 
					 | 
				
			||||||
            connection.setConnectTimeout(task.connectionTimeout);
 | 
					 | 
				
			||||||
            connection.setReadTimeout(task.readTimeout);
 | 
					 | 
				
			||||||
            // set the download range
 | 
					 | 
				
			||||||
            connection.setRequestProperty("Range", "bytes=" + tmpStart + "-" + endIndex);
 | 
					 | 
				
			||||||
            connection.connect();
 | 
					 | 
				
			||||||
            // if response code not equals 206, it means that the server do not support multi thread downloading
 | 
					 | 
				
			||||||
            if (connection.getResponseCode() == 206) {
 | 
					 | 
				
			||||||
                RandomAccessFile file = new RandomAccessFile(target, "rwd");
 | 
					 | 
				
			||||||
                file.seek(tmpStart);
 | 
					 | 
				
			||||||
                byte[] buf = new byte[1024];
 | 
					 | 
				
			||||||
                int len;
 | 
					 | 
				
			||||||
                try (BufferedInputStream stream = new BufferedInputStream(connection.getInputStream())) {
 | 
					 | 
				
			||||||
                    while ((len = stream.read(buf)) > 0) {
 | 
					 | 
				
			||||||
                        file.write(buf, 0, len);
 | 
					 | 
				
			||||||
                        lastUpdateTime = System.currentTimeMillis();
 | 
					 | 
				
			||||||
                        currentIndex += len;
 | 
					 | 
				
			||||||
                        // some mysterious error occurred while downloading
 | 
					 | 
				
			||||||
                        if (currentIndex >= endIndex + 2) {
 | 
					 | 
				
			||||||
                            currentIndex = tmpStart;
 | 
					 | 
				
			||||||
                            lastUpdateTime = 0;
 | 
					 | 
				
			||||||
                            retry++;
 | 
					 | 
				
			||||||
                            return;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    complete = true;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                file.close();
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                throw new DoNotSupportMultipleThreadException();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            task.onError.handle(new ErrorEvent(e, task));
 | 
					 | 
				
			||||||
            retry++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
package io.izzel.taboolib.util.eagletdl;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class StartEvent {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private EagletTask task;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    StartEvent(EagletTask task) {
 | 
					 | 
				
			||||||
        this.task = task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public EagletTask getTask() {
 | 
					 | 
				
			||||||
        return task;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -5,8 +5,8 @@ import io.izzel.taboolib.module.locale.TLocale;
 | 
				
			|||||||
import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseMainCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
					import io.izzel.taboolib.module.command.base.BaseSubCommand;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandArgument;
 | 
					import io.izzel.taboolib.module.command.base.Argument;
 | 
				
			||||||
import io.izzel.taboolib.module.command.base.CommandRegister;
 | 
					import io.izzel.taboolib.module.command.base.SubCommand;
 | 
				
			||||||
import io.izzel.taboolib.util.Files;
 | 
					import io.izzel.taboolib.util.Files;
 | 
				
			||||||
import io.izzel.taboolib.util.Strings;
 | 
					import io.izzel.taboolib.util.Strings;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
@@ -35,7 +35,7 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        return TLocale.asString("COMMANDS.TLOGS.COMMAND-TITLE");
 | 
					        return TLocale.asString("COMMANDS.TLOGS.COMMAND-TITLE");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 0)
 | 
					    @SubCommand(priority = 0)
 | 
				
			||||||
    BaseSubCommand info = new BaseSubCommand() {
 | 
					    BaseSubCommand info = new BaseSubCommand() {
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public String getLabel() {
 | 
					        public String getLabel() {
 | 
				
			||||||
@@ -48,10 +48,10 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.INFO.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.INFO.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.INFO.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.INFO.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -64,7 +64,7 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 1)
 | 
					    @SubCommand(priority = 1)
 | 
				
			||||||
    BaseSubCommand error = new BaseSubCommand() {
 | 
					    BaseSubCommand error = new BaseSubCommand() {
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public String getLabel() {
 | 
					        public String getLabel() {
 | 
				
			||||||
@@ -77,10 +77,10 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.ERROR.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.ERROR.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.ERROR.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.ERROR.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,7 +93,7 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @CommandRegister(priority = 2)
 | 
					    @SubCommand(priority = 2)
 | 
				
			||||||
    BaseSubCommand warning = new BaseSubCommand() {
 | 
					    BaseSubCommand warning = new BaseSubCommand() {
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public String getLabel() {
 | 
					        public String getLabel() {
 | 
				
			||||||
@@ -106,10 +106,10 @@ public class Logs extends BaseMainCommand {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        public CommandArgument[] getArguments() {
 | 
					        public Argument[] getArguments() {
 | 
				
			||||||
            return new CommandArgument[] {
 | 
					            return new Argument[] {
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.WARNING.ARGUMENTS.0")),
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.WARNING.ARGUMENTS.0")),
 | 
				
			||||||
                    new CommandArgument(TLocale.asString("COMMANDS.TLOGS.WARNING.ARGUMENTS.1"))
 | 
					                    new Argument(TLocale.asString("COMMANDS.TLOGS.WARNING.ARGUMENTS.1"))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,6 @@ public class TSerializer {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static String write(TSerializable serializable) {
 | 
					    public static String write(TSerializable serializable) {
 | 
				
			||||||
        SimpleReflection.checkAndSave(serializable.getClass());
 | 
					 | 
				
			||||||
        JsonObject jsonObject = new JsonObject();
 | 
					        JsonObject jsonObject = new JsonObject();
 | 
				
			||||||
        JsonObject serializeObject = new JsonObject();
 | 
					        JsonObject serializeObject = new JsonObject();
 | 
				
			||||||
        for (Field declaredField : serializable.getClass().getDeclaredFields()) {
 | 
					        for (Field declaredField : serializable.getClass().getDeclaredFields()) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user