FTA?=Ka!n|Spu*Y?+CZBflnYG~Ng`|G(
z=G4`BLTIZJs6=kpR~x&2&imc^%T3y}=T~$lgT(w9eRZ)l__W&u%nIDP2wPRS%OPld
zpU6G4r@b$ui;4Mw@o|GR!%1;MYG)FbB7Rb7SX8p%Qk^W9MBnZ9Yu5Q}GW=Rud7~$W
z7D3$9oAUkbH+8+FKPqoKewhj)E+Rg-R|w@ya8i5}8tAvVUb6$GoNft>#UZ)g6yC`f
z78af*-5ySDfk^y_9-qUyw}}qPY!&>4FhxTBGvngNTyF1D?KFtbYY*MjYRe{rug1Qa0;+aOGwA)X
zgonvyF&baBI!lpg)Y2Kjg*-g3_dXi91OW8@$OiPZaBzWup8?9R3BpBy@>l#dPPyQc
z0RA~+_{nAZkw^TIIQ%o^B6IkO>wi-IOd$T5c#%Q;gw5ZG|1XjFdEpC1{Be8Y{I0;i_PsdtuV3&(#p7{9pV2
X6m>l
diff --git a/src/main/java/tech/nully/PluginInstaller/InstallCommand.java b/src/main/java/tech/nully/PluginInstaller/InstallCommand.java
index 809dc09..c82521f 100644
--- a/src/main/java/tech/nully/PluginInstaller/InstallCommand.java
+++ b/src/main/java/tech/nully/PluginInstaller/InstallCommand.java
@@ -9,6 +9,7 @@ import org.bukkit.command.ConsoleCommandSender;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
+import java.net.URL;
import java.util.Locale;
public class InstallCommand implements CommandExecutor {
@@ -16,42 +17,38 @@ public class InstallCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender snder, Command cmd, String label, String[] args) {
// Name checker
- if (cmd.getName().equalsIgnoreCase("installpl")) {
- snder.sendMessage("Check 1 passed");
+ if (cmd.getName().equalsIgnoreCase("install")) {
if (snder.isOp() || snder instanceof ConsoleCommandSender) {
- snder.sendMessage("Check 2 passed");
Installer ins = new Installer();
// handler for install argument
if (args.length == 1) {
- snder.sendMessage("Check 3 passed");
String Install_Jar = args[0].toLowerCase();
- // Checks if the list of plugin links contains what the user wants to install
- if (ins.IsValidLink("https://github.com/darverdevs/PluginInstallerRepo/raw/main/" + Install_Jar + ".jar")) {
- snder.sendMessage("Check 4 passed");
- // Creates an input stream based on the corresponding URL from the players first argument
- try (InputStream in = URI.create(Main.getJavaURLs().get(Install_Jar)).toURL().openStream()) {
- snder.sendMessage("Check 5 passed");
- // Installs the plugin
- ins.InstallPlugin(in, Install_Jar.toLowerCase(), snder);
- snder.sendMessage("You have successfully installed the " + ChatColor.GREEN + Install_Jar.toUpperCase() + ChatColor.WHITE + " plugin!");
- return true;
- } catch (IOException e) {}
+ // Checks if the created URL is a valid one
+ try {
+ if (ins.IsValidLink("https://github.com/darverdevs/PluginInstallerRepo/raw/main/" + Install_Jar + ".jar")) {
+ //plugin URL
+ URL plugin = URI.create("https://github.com/darverdevs/PluginInstallerRepo/raw/main/" + Install_Jar + ".jar")
+ .toURL();
+
+ // Creates the InputStream
+ try (InputStream in = plugin.openStream()) {
+
+ // Installs the plugin
+ ins.InstallPlugin(in, Install_Jar.toLowerCase(), snder);
+ snder.sendMessage("You have successfully installed the " + ChatColor.GREEN + Install_Jar.toUpperCase() + ChatColor.WHITE + " plugin!");
+ return true;
+ } catch (IOException e) {}
+ } else if (Install_Jar.equalsIgnoreCase("recommended")) {
+ InputStream reco1 = URI.create("https://github.com/darverdevs/PluginInstallerRepo/raw/main/dupepatch.jar")
+ .toURL().openStream();
+ ins.InstallPlugin(reco1, "DupePatch", snder);
+ }
+ } catch (IOException e) {
+ snder.sendMessage("\"" + Install_Jar + "\"" + "is not a valid plugin from the database");
}
}
-
-
- if (args[0].equalsIgnoreCase("list")) {
- snder.sendMessage(ChatColor.GREEN + "Here is a list of available plugins in the database:");
- snder.sendMessage("1. Factions 8. ");
- snder.sendMessage("2. ProtocolLib 9. ");
- snder.sendMessage("3. PermissionSex 10. ");
- snder.sendMessage("4. Vault 11. ");
- snder.sendMessage("5. BitchFilter 12. ");
- snder.sendMessage("6. BitchFilter 13. ");
- snder.sendMessage("7. BitchFilter 14. ");
- }
}
}
return false;
diff --git a/src/main/java/tech/nully/PluginInstaller/Installer.java b/src/main/java/tech/nully/PluginInstaller/Installer.java
index 933c9d5..2105308 100644
--- a/src/main/java/tech/nully/PluginInstaller/Installer.java
+++ b/src/main/java/tech/nully/PluginInstaller/Installer.java
@@ -8,38 +8,31 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
public class Installer {
- private HashMap JARURLs = new HashMap<>();
-
- public static HashMap SetupInstaller() {
- Installer ins = new Installer();
- ins.JARURLs.put("dynmap", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/dynmap-1.9.1.jar");;
- ins.JARURLs.put("factions", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/Factions.jar");
- ins.JARURLs.put("permissionsex", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/PermissionSex.jar");
- ins.JARURLs.put("protocollib", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/ProtocolLib.jar");
- ins.JARURLs.put("vault", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/Vault.jar");
- ins.JARURLs.put("mcore", "https://github.com/darverdevs/PluginInstallerRepo/raw/main/mcore.jar");
- return ins.JARURLs;
- }
public void InstallPlugin(InputStream in, String pluginName, CommandSender s) throws IOException {
File f = new File(Main.getInstance().getDataFolder().getParent() + "/" + pluginName + ".jar");
- s.sendMessage("Check 1x passed");
Files.copy(in, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
- System.out.println(f.toPath().toString());
- s.sendMessage("Check 2x passed");
}
- public boolean IsValidLink(String url) throws MalformedURLException, IOException{
+ public boolean IsValidLink(String url) throws IOException{
URL u = new URL(url);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.setRequestMethod("GET");
huc.connect();
return huc.getResponseCode() == 200;
}
+
+ public static void UpdatePlugin() throws IOException {
+ InputStream in = URI.create("https://github.com/darverdevs/PluginInstaller/raw/main/out/artifacts/PluginInstaller_jar/PluginInstaller.jar")
+ .toURL().openStream();
+ File f = new File(Main.getInstance().getDataFolder().getParent() + "/" + "PluginInstaller" + ".jar");
+ Files.copy(in, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ }
}
diff --git a/src/main/java/tech/nully/PluginInstaller/Main.java b/src/main/java/tech/nully/PluginInstaller/Main.java
index 35f0a57..4ea2ee7 100644
--- a/src/main/java/tech/nully/PluginInstaller/Main.java
+++ b/src/main/java/tech/nully/PluginInstaller/Main.java
@@ -4,6 +4,7 @@ import org.bukkit.ChatColor;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
+import java.io.IOException;
import java.util.HashMap;
public class Main extends JavaPlugin {
@@ -11,19 +12,22 @@ public class Main extends JavaPlugin {
public static Plugin getInstance() {
return instance;
}
- private static HashMap javaURLs = null;
- public static HashMap getJavaURLs() {
- return javaURLs;
- }
@Override
public void onEnable() {
instance = this;
- getCommand("installpl").setExecutor(new InstallCommand());
- javaURLs = Installer.SetupInstaller();
+ try {
+ Installer.UpdatePlugin();
+ } catch (IOException e) {}
+ getCommand("install").setExecutor(new InstallCommand());
+ getCommand("plist").setExecutor(new plistCommand());
getServer().getConsoleSender().sendMessage("--------------------------------------------");
getServer().getConsoleSender().sendMessage("--------------------------------------------");
getServer().getConsoleSender().sendMessage(
ChatColor.GREEN + "[PluginInstaller]" + ChatColor.AQUA + " PluginInstaller V1.0.0 is now Enabled! :D");
+ getServer().getConsoleSender().sendMessage("To use PluginInstaller, run the command \"/install \" (\"install \" in console) to install a plugin");
+ getServer().getConsoleSender().sendMessage("To get a list of installable plugins, use the command \"/plist\" or \"plist\" in console");
+ getServer().getConsoleSender().sendMessage("You can request to add a new plugin to the database by going to https://github.com/darverdevs/PluginInstallerRepo/tree/main");
+ getServer().getConsoleSender().sendMessage("and creating an issue or pull request of the plugin you want to add");
getServer().getConsoleSender().sendMessage("--------------------------------------------");
getServer().getConsoleSender().sendMessage("--------------------------------------------");
}
diff --git a/src/main/java/tech/nully/PluginInstaller/plistCommand.java b/src/main/java/tech/nully/PluginInstaller/plistCommand.java
new file mode 100644
index 0000000..2499090
--- /dev/null
+++ b/src/main/java/tech/nully/PluginInstaller/plistCommand.java
@@ -0,0 +1,24 @@
+package tech.nully.PluginInstaller;
+
+import org.bukkit.ChatColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+
+public class plistCommand implements CommandExecutor {
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+ if (cmd.getName().equalsIgnoreCase("plist")) {
+ sender.sendMessage(ChatColor.GREEN + "Here is a list of available plugins in the database:");
+ // TODO: Finish this list
+ sender.sendMessage("1. Factions 8. AntiSwear");
+ sender.sendMessage("2. ProtocolLib 9. ");
+ sender.sendMessage("3. PermissionSex 10. ");
+ sender.sendMessage("4. Vault 11. ");
+ sender.sendMessage("5. CoreProtect 12. ");
+ sender.sendMessage("6. DupePatch 13. ");
+ sender.sendMessage("7. BitchFilter 14. ");
+ }
+ return false;
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index eee3df5..11c946a 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -6,6 +6,9 @@ authors: [BongoCat]
description: A plugin that is capable of installing the latest compatible version of plugins with eaglercraft
website: nully.tech
commands:
- installpl:
+ install:
usage: /
description: Installs the latest compatible version of the requested plugin
+ plist:
+ usage: /
+ description: Gives you a list of available plugins with PluginInstaller
diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml
index eee3df5..11c946a 100644
--- a/target/classes/plugin.yml
+++ b/target/classes/plugin.yml
@@ -6,6 +6,9 @@ authors: [BongoCat]
description: A plugin that is capable of installing the latest compatible version of plugins with eaglercraft
website: nully.tech
commands:
- installpl:
+ install:
usage: /
description: Installs the latest compatible version of the requested plugin
+ plist:
+ usage: /
+ description: Gives you a list of available plugins with PluginInstaller
diff --git a/target/classes/tech/nully/PluginInstaller/InstallCommand.class b/target/classes/tech/nully/PluginInstaller/InstallCommand.class
index feac3a0e275871e9d1c441b9da0db6e9e4fc5d24..235c0dde26bd5e6966a986b5103a86160a00cd4a 100644
GIT binary patch
literal 3106
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
W_7bCfMyvpI+@x3-I?3NM?D!Au-u!_8
diff --git a/target/classes/tech/nully/PluginInstaller/Installer.class b/target/classes/tech/nully/PluginInstaller/Installer.class
index 41aec8c3011f734129be0f53ae3c60ae35570223..3315ba855ad29f39483043d96f1b1dae2e80ac4f 100644
GIT binary patch
literal 2420
zcma)8TUQfT6#fngOo-zJMDT)D5G@yRY-?{~Eea8%;ZlNBw5=T`Lo$-g#K{@d-fu7c
z1AXl3TVMLpJ_K7=yZYGG|J1I2XC^lhw5*jgGyCkb_qV@&IsE?&Sk#bBqD$>`VM)V{
z1eTNN!Mkd?sg{)lZY6OW@2TZ|rS?GrcQkyc!4&AY;JA*wC=eSSSr&*-c{y8PZ^m)$
zxuCRa`%C6(k&^C=XPL!i(|6Q&O&FI2ry_7FBW0b*LZ=mJewx6>%Do>TDZ{9abrsEo3APv)(&YEe-r_}B+w5>-~xEemy
z@fkkX@ddur@fE%n=-EzDVCet!iNL-l`}3=JnQMXlp-A<~e51|;jy=QPECXT{=4}}!
z+_jkd{^60<`i?rH29?Ehu%*kM*khg1&a^4bE1oI?LZqcSq*?=XQf0yPZI^I+>f5dL
z&S7Jg%WPMH@$K3nGT3sWR&+#`kX|$icIYHFe~0uIOj!`yFtya-@2S_$=k#N=tvp6-
zWfSp7X#W)*0##^LB)U7foK`PME>-N>gnm9gb|_xO?)dN6vl9CSd$W(Q?`G5Y9^T2|
z^=jY%@9o|Y!@0;$4Ff%51fwCYX^i1C@hI6i&hV@{XW%RYeTh;P?#ukW!hZ}R)ZbAj
z&YiKx=vo=uME5KK?*9`#bK~6ys^}fBqL06WUHIzktahUi0
z5%i&->(LP8Xk@klatyB$nxO6=Uc>8j-^EjJ;7!^(Pm8g9
zLi;T_R?(%p4?V)+Dvngqe|=}Zk2Yw|jE+5nLu)vm8l-kzLX2WhIo1{q=q4(PR
z{r0hcqV;J}%hUbNFe+gzOaCJ>#%1J$enQ5ij42s;8L!BgmQj##S;iF^GcvA9xF%sXi(MGW;#FL4
z!E1Oui=B8w=x)e(QwA4eQ7Cm8r4|^N6O*!pN(LrwW-$*dgDUJ6IKt4yTQWQeK7%xN
zVfxB+j-HRtHun&F-)=CLvzR7{HSSS~R1
zie}d=Ye~ynwX$iC+J3+-%kZ>BB4=9*Mo@DT4a2U^uJy5#VUuYSZvRGKAA4u5v7aa)
zhFoXl%5*3uw-!)Z3|`$JEjh<4YsK39ycuY^Q>}8lqzy#>1;Z{GUcbmx%Csr|4Ivq_
zZkUBhUJX+h7O=4v42<@7H8u{
z#v;{!6Ug}ls$eWe@GY+A1di@lmRV#N+YERNlrxJF^p*u)v#6?rn*f~=5HVa;cLYsr
z1}=n%;FPeD=oCfWw&&sIzF0FYIwTTqDOkjkgtryEgLf6YhxZkHfDfsssUOn~Oj78zl)JEBFMr6?}@%7}`TWHu;^SE~f+OE=`3eK*Hw=zQC6f
zzEbctzLD^)g75IXgdZgQsNkmt@RN0LhV83yPZe((I_0~qzO&J(WDQln>89S9QvOFHbJL?p`~mD;i0v4s?&a=y#@-3s3bmDboSf->l?K^;SBPC
z4?Cg)w8uJu#?_+L88XRp-AvJL{j0p2j`Lw@Bj-BUM~)!j=OkQVC*@
zD60`!ux3X?@EdX~CBrA@6Nc~eG9{xqaPmB;Fzl`eo3wz?lh=;5jZp}Quen!RZ4k=C
z^iV!`VPNRS(6!OR<OEqr|GQ6;HDQp~A9A)DTYuNs
znpP|<`GHZTrgKEotzIvAy29%>7G1_`V~-M)bZ>(#y(3()(z0=wo;O|e{Gppm@IL*Y
zpjiq%Xd;=e2pXRu&G~Q+Z127c*1dw%>|Hedf%I>obsvr5bp*5`jjcFIl0qxV9?#O#
z3drC&JWmz^>z5eo$_lm+O!Ij6??|hXDla2*HI%bzOCl?3Ya(w|w2(^rF^E0Lqdf^!#sppn1C6$Snu0%rvvI%=&`fCp
zN-NkoyMkR5^zM7ub06&t%hNqa%gmd(+D}oc;?(
zW}EKd$-+Gxy>gqJDZ8m0dNE>dv@NSh|BLHZ4moWk(GL(31G
diff --git a/target/classes/tech/nully/PluginInstaller/Main.class b/target/classes/tech/nully/PluginInstaller/Main.class
index 3b617c3a4d2240ce74e957641d38744fb15e5925..6b1c8548c39913f2c23ead013414d2ade29a5d85 100644
GIT binary patch
literal 2602
zcmb7G>v9xD6#hE5nM?*DfpCX35hV#B1A?eYj6xC+*n~?$6cMy{w%Hvr=~?GONcjXl
zf=^)i!zzhYL8Qw6`UdhamZxWClg*fHmHT71&*^jh&SmDWe}4Z1z$L6$;JDb00bH{1
zJ}w*hz{H0Z(H|KYw_xC+g$YcW_}IXdg&s{0;FBJFiYq3r_Fx(_24*evYBSexU7tQP
zaYO)SO!;N}8B6F>m6wi906lnz(0R!N4Me>8U6d%9RX9OF>w5%E|Jw7dv%7sd~z}
zlm1OGbWM87i>DachlZCJI;MjPsq8IzO3o)MWf?AtvQM18Qs4@INraxJb7n_e^CE^*
zrC7Q(MurE(u76
z?m*3WQFd)kx_+L3wGbqsE3bJv+-~i5?5TJrY`l%rHcnyCz8S;ZT~6FI3f8h(k|RuO^;fk)eT#4T&c97^e|P_HsfQzvmZlp@yFC<-r%
z5~*XY(_n4JM9FIZ85DetB3>1$5h}ykVmS(B%qNHHI5W;L(4tTE1kr5&cXy=Sc9SM3
zYZ!*pEv#%d8-snnPN>O-mPHlJ$AIDTP^s9&6Wdlq-b*=%xgPBm!e?{0?I=U5CzA2(
zbLl2=5YlK4HE*7VN^Y?jw=b-WP40V}+&5(RrHQ5eyC4$Nmi*=$LX(E@#}Kp!vA
zCkph=(Y&C1JLogTqGx-G!xZ*X#=S)EC;kEYWa-B-93=D((U;6&+`&1WSjee!A*-{qU?Hgy&67!Y6p7L3F|i3??pqAa8Hb9#@1%pXEu}+NHpkY&nQ{})i8#)gi=ZA#C9YND^
zEKgrIY)yNZJG2$m)Nz`Qigj!-%yf|>5oX2R-8Fbk!d(^j
za9_fviV6xU9$-ttwu&$D6~pB#|KTIyp^C5Zh+#ZZD^>d&q3zTxPr^4U9%DzvxA=}>
z=uzBm?OHt+8^o`Q9fpE-WLMjspPieX(`;Yk?)O?OUTsQSSXE)7#&GE$JQ9t`Wp#n!
zTo;jq*3?#==OZGvMn#BoV^FA55-l07Pe3#e$<>=>P^RDsDFJcC_T5#
zFmOGF>3q6<_g#{J`>>)oQ0KeQYzxmYP_crrnKI;vSjF<5S@bq>08$yoW=eag!^kig
z3BrBXu__j)qElTCyB}m5p^~IyFa@1X1?>inB;mDn%lC~s9gxxE#3unpQt?(A235-u
z3ijUGES2c2jHQ{i_bHD)quC?^3|G>D?^d5!W>8Engw7Tx$3yt!?(2rnF5ll;rW-eK
zV=$$>f3c+E7coWG|5^IU=z$^*Kg|?z{=x8WWIac}7Su|FV|b4&I*p9R-oh)eUn0o+
z^b{ZTZ&{jM;YT7m~W?7}bWp
Y8KF&Fe1!@wdM-5h
z#?@mYs`Y2$JK+T)?05|wtFTl3`k-s+D-xLu!5A(a1D7SFO8C7t!`Wj(Nk={qEg6`)
z93Vke6mf^@vTz6;h7%1f{QYgw&x%-RL}~2H4Q0waKVB}^Ksz{%w=Fz$u#OGNI}EU}
z>EIEz7*4;Lel1l270$w^4n9NO!8UdnDvx9=xk|X;<~(@xloPfh5rO3W;gKa=gI5Un9Sadn!q2Z$m!k8Cm(
z#b=HVVz4?=?}#29?P6)^uwEI4i8`$6M7wDQO@viao~U_TFkpP_MT=(O=J&7DyI
z&f+~r;0%swX6Nt9@w2m6a)=&h#31eX5>9cG;L
literal 0
HcmV?d00001