Skip to content

Commit 45beb51

Browse files
authored
Merge branch 'main' into feat-more-tests
2 parents 2b65d2a + 6dcb5bc commit 45beb51

34 files changed

+711
-163
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ There's 3 different ways you can search for new plugins:
9494
You can execute these commands in any environment using the `search` subcommand:
9595
```shell
9696
mcpm search JedCore # Search for a plugin with the name "JedCore"
97-
mcpm search --by-keyword "protect land" # Search for a plugin that has protect in its description.
98-
mcpm search --by-command claim # Search for a plugin that provides a /claim command.
97+
mcpm search --keyword "protect land" # Search for a plugin that has protect in its description.
98+
mcpm search --command claim # Search for a plugin that provides a /claim command.
9999
```
100100

101101
# Install Plugins
@@ -112,8 +112,6 @@ For example, you can install a plugin that provides a `claim` command using the
112112

113113
```shell
114114
mcpm install JedCore # Installs the latest version of the JedCore plugin.
115-
mcpm install --by-keyword "protect land" # This is also provided for consistency with search.
116-
mcpm install --by-command claim # This will install the latest version of a command that provides claim!
117115
```
118116

119117
We recommend you use the search command before installing anything,

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ dependencies {
8787
// https://mvnrepository.com/artifact/com.github.luben/zstd-jni
8888
implementation 'com.github.luben:zstd-jni:1.5.2-5'
8989

90+
// ZSTD but pure java for platforms that doesn't support native
91+
// https://mvnrepository.com/artifact/io.airlift/aircompressor
92+
implementation 'io.airlift:aircompressor:0.21'
93+
9094
// Unit tests
9195
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
9296
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'

crawl.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/env bash
2+
set -e
3+
4+
# Get script dir
5+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
6+
pushd "$SCRIPT_DIR"
7+
8+
PY="/home/azalea/.conda/envs/310/bin/python3"
9+
10+
# Crawl packages
11+
$PY -m tools.run org.hydev.mcpm.server.crawlers.SpigetCrawler
12+
13+
# Create database
14+
$PY -m tools.run org.hydev.mcpm.server.crawlers.spiget.CreateDatabase
15+
16+
# Zstd compression
17+
rm -rf .mcpm/db.zst
18+
zstd -f -19 -T36 .mcpm/db
19+
20+
popd

src/main/java/org/hydev/mcpm/Constants.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
*/
1717
public class Constants
1818
{
19+
// This is technically not a constant, but it should only be changed by SpigotEntry to true.
20+
// It cannot be put inside SpigotEntry because accessing SpigotEntry would try to initialize the class, then it
21+
// will try to import Spigot packages which doesn't exist outside of Spigot.
22+
public static boolean IS_MINECRAFT = false;
23+
1924
public static final ObjectMapper JACKSON = new ObjectMapper()
2025
.disable(FAIL_ON_UNKNOWN_PROPERTIES).enable(INDENT_OUTPUT);
2126

src/main/java/org/hydev/mcpm/SpigotEntry.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44
import org.bukkit.command.Command;
55
import org.bukkit.command.CommandExecutor;
66
import org.bukkit.command.CommandSender;
7-
import org.bukkit.command.TabCompleter;
87
import org.bukkit.plugin.java.JavaPlugin;
98
import org.hydev.mcpm.client.arguments.ArgsParser;
109
import org.hydev.mcpm.client.arguments.CommandsFactory;
1110
import org.hydev.mcpm.client.arguments.parsers.CommandParser;
1211
import org.hydev.mcpm.utils.ColorLogger;
1312
import org.jetbrains.annotations.NotNull;
14-
import org.jetbrains.annotations.Nullable;
1513

1614
import java.util.ArrayList;
17-
import java.util.Arrays;
1815
import java.util.List;
1916
import java.util.logging.Logger;
2017

@@ -25,6 +22,12 @@
2522
*/
2623
public class SpigotEntry extends JavaPlugin implements CommandExecutor
2724
{
25+
public SpigotEntry()
26+
{
27+
// Let the other parts of our program know that we're in minecraft
28+
Constants.IS_MINECRAFT = true;
29+
}
30+
2831
private Logger log;
2932

3033
private ArgsParser parser;
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.hydev.mcpm.client;
2+
3+
import org.hydev.mcpm.client.database.LocalPluginTracker;
4+
import org.hydev.mcpm.client.database.PluginTracker;
5+
import org.hydev.mcpm.client.database.boundary.SearchPackagesBoundary;
6+
import org.hydev.mcpm.client.database.fetcher.LocalDatabaseFetcher;
7+
import org.hydev.mcpm.client.database.inputs.SearchPackagesInput;
8+
import org.hydev.mcpm.client.database.results.SearchPackagesResult;
9+
import org.hydev.mcpm.client.database.searchusecase.SearchInteractor;
10+
import org.hydev.mcpm.client.installer.InstallResult;
11+
import org.hydev.mcpm.client.installer.input.InstallInput;
12+
import org.hydev.mcpm.client.models.PluginVersion;
13+
import org.hydev.mcpm.client.models.PluginYml;
14+
15+
import java.net.URI;
16+
import java.util.List;
17+
18+
/**
19+
* Database API
20+
*/
21+
public class DatabaseManager {
22+
private final PluginTracker localPluginTracker;
23+
private final SearchPackagesBoundary searchInteractor;
24+
25+
public DatabaseManager(PluginTracker tracker, SearchPackagesBoundary searcher) {
26+
this.localPluginTracker = tracker;
27+
this.searchInteractor = searcher;
28+
}
29+
30+
/**
31+
*
32+
* Search if the plugin exists, return the Search Results
33+
*
34+
* @param input the input pending for installation
35+
*/
36+
public SearchPackagesResult getSearchResult(InstallInput input) {
37+
SearchPackagesInput searchPackagesInput = new SearchPackagesInput(input.type(), input.name(), false);
38+
SearchPackagesResult searchPackageResult = searchInteractor.search(searchPackagesInput);
39+
40+
return searchPackageResult;
41+
}
42+
43+
/**
44+
* check if plugin with given version already installed locally
45+
*
46+
* @param pluginName The version of the installed plugin
47+
* */
48+
public boolean checkPluginInstalledByName(String pluginName) {
49+
var name = pluginName;
50+
51+
List<PluginYml> pluginInstalled = localPluginTracker.listInstalled();
52+
for (PluginYml pluginYml : pluginInstalled) {
53+
if (pluginYml != null && pluginYml.name() != null && pluginYml.name().equals(name)) {
54+
return true;
55+
}
56+
}
57+
return false;
58+
}
59+
60+
61+
/**
62+
* check if plugin with given name already installed locally
63+
*
64+
* @param pluginVersion The version of the installed plugin
65+
* */
66+
public boolean checkPluginInstalledByVersion(PluginVersion pluginVersion) {
67+
var name = pluginVersion.meta().name();
68+
69+
List<PluginYml> pluginInstalled = localPluginTracker.listInstalled();
70+
for (PluginYml pluginYml : pluginInstalled) {
71+
if (pluginYml != null && pluginYml.version() != null &&
72+
pluginYml.version().equals(pluginVersion.meta().version())) {
73+
return true;
74+
}
75+
}
76+
return false;
77+
}
78+
79+
/**
80+
* Add the installed plugin to the csv file
81+
*
82+
* @param pluginVersion The version of the installed plugin
83+
* */
84+
public void addManualInstalled(PluginVersion pluginVersion, boolean isManuallyInstalled) {
85+
String pluginName = pluginVersion.meta().name();
86+
localPluginTracker.addEntry(pluginName, isManuallyInstalled || localPluginTracker.listManuallyInstalled()
87+
.contains(pluginName));
88+
89+
}
90+
}

src/main/java/org/hydev/mcpm/client/Downloader.java

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package org.hydev.mcpm.client;
22

3+
import org.apache.hc.client5.http.classic.methods.HttpGet;
4+
import org.apache.hc.client5.http.impl.classic.HttpClients;
5+
import org.apache.hc.core5.http.HttpEntity;
36
import org.hydev.mcpm.client.interaction.ProgressBar;
47
import org.hydev.mcpm.client.interaction.ProgressBarTheme;
58
import org.hydev.mcpm.client.interaction.ProgressRow;
69

710
import java.io.*;
811
import java.net.HttpURLConnection;
912
import java.net.URL;
13+
import java.nio.file.Files;
1014
import java.util.ArrayList;
1115
import java.util.HashMap;
1216
import java.util.Map;
@@ -29,9 +33,7 @@ public class Downloader
2933
/** Number of simultaneous downloads */
3034
private int threads = 5;
3135

32-
private ProgressBar bar = new ProgressBar(ProgressBarTheme.ASCII_THEME);
33-
34-
private ArrayList<ProgressRow> allRows = new ArrayList<>();
36+
private final ProgressBar bar = new ProgressBar(ProgressBarTheme.ASCII_THEME);
3537

3638
/**
3739
* Download one file from the internet to local storage through HTTP request
@@ -41,31 +43,40 @@ public class Downloader
4143
*/
4244
public void downloadFile(String url, File to)
4345
{
44-
try (FileOutputStream fileos = new FileOutputStream(to)) {
45-
URL link = new URL(url);
46-
HttpURLConnection http = (HttpURLConnection) link.openConnection();
47-
long fileSize = (long) http.getContentLengthLong();
48-
49-
50-
BufferedInputStream in = new BufferedInputStream(http.getInputStream());
51-
BufferedOutputStream bout = new BufferedOutputStream(fileos, 1024);
52-
byte[] buffer = new byte[1024];
53-
int read;
54-
55-
var row = new ProgressRow(fileSize)
56-
.desc(format("Download %s", allRows.size()))
57-
.descLen(30);
58-
bar.appendBar(row);
59-
allRows.add(row);
60-
while ((read = in.read(buffer, 0, 1024)) >= 0) {
61-
bout.write(buffer, 0, read);
62-
allRows.forEach(a -> a.increase(1024));
63-
}
64-
bout.close();
65-
in.close();
46+
try (var client = HttpClients.createDefault())
47+
{
48+
var get = new HttpGet(url);
49+
var bytes = client.execute(get, (req) ->
50+
{
51+
HttpEntity entity = req.getEntity();
52+
var total = entity.getContentLength();
53+
var builder = new ByteArrayOutputStream((int) total);
54+
55+
// Create progress row
56+
var row = new ProgressRow(total).desc(to.getName()).descLen(30);
57+
bar.appendBar(row);
58+
59+
try (var stream = entity.getContent())
60+
{
61+
var buffer = new byte[8096];
62+
63+
var count = stream.read(buffer);
64+
while (count > 0)
65+
{
66+
builder.write(buffer, 0, count);
67+
row.increase(count);
68+
count = stream.read(buffer);
69+
}
70+
}
71+
72+
return builder.toByteArray();
73+
});
74+
75+
Files.write(to.toPath(), bytes);
6676
}
67-
catch (IOException ex) {
68-
ex.printStackTrace();
77+
catch (IOException e)
78+
{
79+
throw new RuntimeException(e);
6980
}
7081
}
7182

@@ -125,7 +136,7 @@ public Downloader threads(int threads)
125136
}
126137

127138
/**
128-
* Tests for the downloader
139+
* Displays a demo for downloader.
129140
*
130141
* @param args Not used
131142
*/

src/main/java/org/hydev/mcpm/client/arguments/CommandsFactory.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.hydev.mcpm.client.arguments;
22

3+
import org.hydev.mcpm.Constants;
4+
import org.hydev.mcpm.client.DatabaseManager;
5+
import org.hydev.mcpm.client.Downloader;
36
import org.hydev.mcpm.client.arguments.parsers.*;
47
import org.hydev.mcpm.client.commands.entries.*;
58
import org.hydev.mcpm.client.database.ListAllInteractor;
@@ -9,6 +12,8 @@
912
import org.hydev.mcpm.client.database.fetcher.LocalDatabaseFetcher;
1013
import org.hydev.mcpm.client.database.searchusecase.SearchInteractor;
1114
import org.hydev.mcpm.client.injector.PluginLoader;
15+
import org.hydev.mcpm.client.installer.InstallInteractor;
16+
import org.hydev.mcpm.client.installer.SpigotPluginDownloader;
1217
import org.hydev.mcpm.utils.ColorLogger;
1318

1419
import java.net.URI;
@@ -28,16 +33,29 @@ private CommandsFactory() { }
2833
/**
2934
* Creates a list of general parsers for the ArgsParser class.
3035
*
36+
* @param isMinecraft If we're in the minecraft env
3137
* @return Returns a list of argument parsers that work in any environment (Server & CLI).
3238
*/
33-
public static List<CommandParser> baseParsers() {
34-
var host = URI.create("http://mcpm.hydev.org");
39+
public static List<CommandParser> baseParsers(boolean isMinecraft) {
40+
var host = URI.create("https://mcpm.hydev.org");
3541
var fetcher = new LocalDatabaseFetcher(host);
36-
var exportPluginsController = new ExportPluginsController(new ExportInteractor(new LocalPluginTracker()));
37-
var listController = new ListController(new ListAllInteractor());
38-
var searchController = new SearchPackagesController(new SearchInteractor(fetcher));
42+
var tracker = new LocalPluginTracker();
43+
var searcher = new SearchInteractor(fetcher);
44+
var exportPluginsController = new ExportPluginsController(new ExportInteractor(tracker));
45+
var listController = new ListController(new ListAllInteractor(tracker));
46+
var searchController = new SearchPackagesController(searcher);
3947
var mirrorController = new MirrorController(new MirrorSelector());
40-
var infoController = new InfoController(new LocalPluginTracker());
48+
var infoController = new InfoController(tracker);
49+
PluginLoader pluginLoader = null;
50+
if (isMinecraft) {
51+
pluginLoader = new PluginLoader();
52+
}
53+
DatabaseManager databaseManager = new DatabaseManager(tracker, searcher);
54+
System.out.println(isMinecraft);
55+
var installController = new InstallController(new InstallInteractor(
56+
new SpigotPluginDownloader(new Downloader(), host.toString()),
57+
databaseManager, pluginLoader));
58+
4159

4260
/*
4361
* Add general parsers to this list!
@@ -49,7 +67,8 @@ public static List<CommandParser> baseParsers() {
4967
new ListParser(listController),
5068
new SearchParser(searchController),
5169
new MirrorParser(mirrorController),
52-
new InfoParser(infoController)
70+
new InfoParser(infoController),
71+
new InstallParser(installController)
5372
);
5473
}
5574

@@ -76,7 +95,7 @@ public static List<CommandParser> serverParsers() {
7695
new UnloadParser(unloadController)
7796
);
7897

79-
return Stream.concat(baseParsers().stream(), serverOnly.stream()).toList();
98+
return Stream.concat(baseParsers(true).stream(), serverOnly.stream()).toList();
8099
}
81100

82101
/**
@@ -85,7 +104,7 @@ public static List<CommandParser> serverParsers() {
85104
* @return An ArgsParser object. Invoke ArgsParser#parse to see more.
86105
*/
87106
public static ArgsParser baseArgsParser() {
88-
return new ArgsParser(baseParsers(), ColorLogger.toStdOut());
107+
return new ArgsParser(baseParsers(false), ColorLogger.toStdOut());
89108
}
90109

91110
/**

src/main/java/org/hydev/mcpm/client/arguments/parsers/CommandHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.hydev.mcpm.client.arguments.parsers;
22

33
import net.sourceforge.argparse4j.inf.Namespace;
4+
import org.hydev.mcpm.client.installer.InstallResult;
45

56
import java.util.function.Consumer;
67

0 commit comments

Comments
 (0)