|
3 | 3 | import com.g00fy2.versioncompare.Version; |
4 | 4 | import com.google.gson.Gson; |
5 | 5 | import com.google.gson.JsonObject; |
| 6 | +import com.sun.org.apache.bcel.internal.generic.GOTO; |
6 | 7 | import net.kunmc.lab.teamkunpluginmanager.TeamKunPluginManager; |
7 | 8 | import net.kunmc.lab.teamkunpluginmanager.utils.HashLib; |
8 | 9 | import net.kunmc.lab.teamkunpluginmanager.utils.Messages; |
|
11 | 12 | import net.kunmc.lab.teamkunpluginmanager.utils.PluginUtil; |
12 | 13 | import net.kunmc.lab.teamkunpluginmanager.utils.Say2Functional; |
13 | 14 | import net.kunmc.lab.teamkunpluginmanager.utils.URLUtils; |
| 15 | +import net.md_5.bungee.api.chat.ClickEvent; |
| 16 | +import net.md_5.bungee.api.chat.ComponentBuilder; |
| 17 | +import net.md_5.bungee.api.chat.HoverEvent; |
14 | 18 | import org.apache.commons.io.FileUtils; |
| 19 | +import org.apache.commons.lang.ArrayUtils; |
15 | 20 | import org.apache.commons.lang.StringUtils; |
16 | 21 | import org.bukkit.Bukkit; |
17 | 22 | import org.bukkit.ChatColor; |
|
27 | 32 | import org.bukkit.plugin.PluginDescriptionFile; |
28 | 33 | import org.bukkit.scheduler.BukkitRunnable; |
29 | 34 |
|
| 35 | +import javax.naming.Name; |
| 36 | +import java.awt.*; |
30 | 37 | import java.io.File; |
31 | 38 | import java.io.FileNotFoundException; |
32 | 39 | import java.io.IOException; |
|
36 | 43 | import java.util.List; |
37 | 44 | import java.util.Objects; |
38 | 45 | import java.util.Set; |
| 46 | +import java.util.UUID; |
39 | 47 | import java.util.concurrent.atomic.AtomicBoolean; |
| 48 | +import java.util.concurrent.atomic.AtomicInteger; |
40 | 49 | import java.util.stream.Collectors; |
| 50 | +import java.util.stream.IntStream; |
41 | 51 |
|
42 | 52 | @SuppressWarnings("unused") |
43 | 53 | public class Installer |
@@ -188,14 +198,28 @@ public static InstallResult install(CommandSender sender, String url, boolean ig |
188 | 198 |
|
189 | 199 | //ダウンロードする場合はURL・クエリを直リンに変換 |
190 | 200 | if (!withoutDownload) |
| 201 | + { |
191 | 202 | jarURL = PluginResolver.asUrl(url); |
192 | 203 |
|
193 | | - //エラーから始まった場合はエラーとして表示し、return |
194 | | - if (!withoutDownload && jarURL.startsWith("ERROR ")) |
195 | | - { |
196 | | - finalSender.sendMessage(ChatColor.RED + "E: " + jarURL.substring(6)); //ERROR <-までをきりだし |
197 | | - finalSender.sendMessage(Messages.getStatusMessage(add, remove, modify)); |
198 | | - return new InstallResult(add, remove, modify, false); |
| 204 | + if (jarURL.startsWith("MULTI")) |
| 205 | + { |
| 206 | + //MULTIリザルトをパース。 |
| 207 | + List<Pair<String, String>> multi = parseMultiResult(jarURL.substring(6)); |
| 208 | + if (sender.getName().equals("DUMMY1145141919810931")) |
| 209 | + jarURL = pickPluginJar(multi); |
| 210 | + else |
| 211 | + { |
| 212 | + depend_askToCommandSender(sender, multi, ignoreInstall, withoutResolveDepends, withoutRemove); |
| 213 | + return new InstallResult(0, 0, 0, true); |
| 214 | + } |
| 215 | + } |
| 216 | + |
| 217 | + if (jarURL.startsWith("ERROR ")) |
| 218 | + { |
| 219 | + finalSender.sendMessage(ChatColor.RED + "E: " + jarURL.substring(6)); //ERROR <-までをきりだし |
| 220 | + finalSender.sendMessage(Messages.getStatusMessage(add, remove, modify)); |
| 221 | + return new InstallResult(add, remove, modify, false); |
| 222 | + } |
199 | 223 | } |
200 | 224 |
|
201 | 225 | Pair<Boolean, String> downloadResult; |
@@ -597,6 +621,123 @@ public static void delete(CommandSender sender, File f) |
597 | 621 |
|
598 | 622 | } |
599 | 623 |
|
| 624 | + private static void depend_askToCommandSender(CommandSender sender, List<Pair<String, String>> jar, boolean ignoreInstall, boolean withoutResolveDepends, boolean withoutRemove) |
| 625 | + { |
| 626 | + UUID uuid = null; |
| 627 | + if (sender instanceof Player) |
| 628 | + uuid = ((Player) sender).getUniqueId(); |
| 629 | + |
| 630 | + sender.sendMessage(ChatColor.YELLOW + "W: リソースが複数見つかりました。インストールするリソースを選択するか、キャンセルを行ってください。"); |
| 631 | + AtomicInteger integer = new AtomicInteger(0); |
| 632 | + jar.forEach(pair -> { |
| 633 | + int index = integer.incrementAndGet(); |
| 634 | + sender.sendMessage(new ComponentBuilder(ChatColor.LIGHT_PURPLE + "- [" + index + "] " + ChatColor.GREEN + pair.getKey()) |
| 635 | + .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/kpm i " + pair.getValue() +"-CF")) |
| 636 | + .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, |
| 637 | + new ComponentBuilder(ChatColor.GREEN + "クリックしてこのリリースをインストール").create())) |
| 638 | + .create() |
| 639 | + ); |
| 640 | + }); |
| 641 | + |
| 642 | + sender.sendMessage(ChatColor.LIGHT_PURPLE + "- [c] " + ChatColor.RED + "キャンセル"); |
| 643 | + |
| 644 | + TeamKunPluginManager.functional.add(uuid, new Say2Functional.FunctionalEntry(StringUtils::equalsIgnoreCase, s -> { |
| 645 | + if (s.equalsIgnoreCase("c")) |
| 646 | + { |
| 647 | + sender.sendMessage(ChatColor.RED + "E: キャンセルされました。"); |
| 648 | + return; |
| 649 | + } |
| 650 | + |
| 651 | + int i = Integer.parseInt(s); |
| 652 | + if (i < 1 || i > jar.size() + 1) |
| 653 | + { |
| 654 | + sender.sendMessage(ChatColor.RED + "リソースは 1 以上、" + (jar.size() + 1) + " 以下である必要があります。"); |
| 655 | + sender.sendMessage(ChatColor.RED + "E: キャンセルされました。"); |
| 656 | + return; |
| 657 | + } |
| 658 | + |
| 659 | + Pair<String, String> resource = jar.get(--i); |
| 660 | + install(sender, resource.getValue(), ignoreInstall, withoutResolveDepends, withoutRemove, false); |
| 661 | + |
| 662 | + }, (String[]) ArrayUtils.add(IntStream.range(1, jar.size() + 1).parallel() |
| 663 | + .mapToObj(String::valueOf) |
| 664 | + .toArray(String[]::new), "c")) |
| 665 | + ); |
| 666 | + } |
| 667 | + |
| 668 | + private static String pickPluginJar(List<Pair<String, String>> jar) |
| 669 | + { |
| 670 | + if (jar.size() == 0) |
| 671 | + return null; |
| 672 | + |
| 673 | + String result = ""; |
| 674 | + String tmp = ""; |
| 675 | + for (Pair<String, String> pair: jar) |
| 676 | + { |
| 677 | + String name = pair.getKey(); |
| 678 | + if (!name.endsWith(".jar") && name.endsWith(".zip")) |
| 679 | + continue; |
| 680 | + |
| 681 | + if (StringUtils.containsIgnoreCase(name, "plugin-") || |
| 682 | + StringUtils.containsIgnoreCase(name, "plugin.")) |
| 683 | + result = pair.getValue(); |
| 684 | + if (StringUtils.containsIgnoreCase(name, "plugin")) |
| 685 | + tmp = pair.getValue(); |
| 686 | + } |
| 687 | + |
| 688 | + if (result.equals("") && !tmp.equals("")) |
| 689 | + result = tmp; |
| 690 | + if (result.equals("")) |
| 691 | + result = jar.get(0).getValue(); |
| 692 | + |
| 693 | + return result; |
| 694 | + } |
| 695 | + |
| 696 | + private static List<Pair<String, String>> parseMultiResult(String mlt) |
| 697 | + { |
| 698 | + List<Pair<String, String>> result = new ArrayList<>(); |
| 699 | + |
| 700 | + StringBuilder name = new StringBuilder(); |
| 701 | + StringBuilder url = new StringBuilder(); |
| 702 | + boolean escape = false; |
| 703 | + boolean flag = true; |
| 704 | + |
| 705 | + for (int i = 0; i < mlt.length(); i++) |
| 706 | + { |
| 707 | + char c = mlt.charAt(i); |
| 708 | + |
| 709 | + |
| 710 | + if (!escape && c == '|') |
| 711 | + { |
| 712 | + if (!name.toString().equals("") && !url.toString().equals("")) |
| 713 | + { |
| 714 | + result.add(new Pair<>(name.toString(), url.toString())); |
| 715 | + name = new StringBuilder(); |
| 716 | + url = new StringBuilder(); |
| 717 | + |
| 718 | + } |
| 719 | + flag = !flag; |
| 720 | + continue; |
| 721 | + } |
| 722 | + |
| 723 | + if (c == '\\') |
| 724 | + { |
| 725 | + escape = true; |
| 726 | + continue; |
| 727 | + } |
| 728 | + else |
| 729 | + escape = false; |
| 730 | + |
| 731 | + if (flag) |
| 732 | + name.append(c); |
| 733 | + else |
| 734 | + url.append(c); |
| 735 | + } |
| 736 | + |
| 737 | + return result; |
| 738 | + } |
| 739 | + |
| 740 | + |
600 | 741 | /** |
601 | 742 | * プラグインデータフォルダを削除 |
602 | 743 | * |
|
0 commit comments