Опциональные моды

This commit is contained in:
Gravit 2018-09-24 23:34:06 +07:00
parent 6df0863f1e
commit 77978b0f74
5 changed files with 69 additions and 19 deletions

View file

@ -31,6 +31,7 @@
import ru.gravit.launcher.Launcher; import ru.gravit.launcher.Launcher;
import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.LauncherAPI;
import ru.gravit.launcher.hasher.FileNameMatcher;
import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.hasher.HashedDir;
import ru.gravit.utils.helper.CommonHelper; import ru.gravit.utils.helper.CommonHelper;
import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.IOHelper;

View file

@ -1,11 +1,13 @@
package ru.gravit.launchserver.response.update; package ru.gravit.launchserver.response.update;
import java.util.ArrayList;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.hasher.HashedDir;
import ru.gravit.launcher.serialize.HInput; import ru.gravit.launcher.serialize.HInput;
import ru.gravit.launcher.serialize.HOutput; import ru.gravit.launcher.serialize.HOutput;
import ru.gravit.launcher.serialize.config.entry.ListConfigEntry;
import ru.gravit.launcher.serialize.signed.SignedObjectHolder; import ru.gravit.launcher.serialize.signed.SignedObjectHolder;
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
import ru.gravit.launchserver.response.Response; import ru.gravit.launchserver.response.Response;
@ -19,10 +21,9 @@ public UpdateListResponse(LaunchServer server, long session, HInput input, HOutp
@Override @Override
public void reply() throws Exception { public void reply() throws Exception {
Set<Entry<String, SignedObjectHolder<HashedDir>>> updateDirs = server.getUpdateDirs(); Set<Entry<String, SignedObjectHolder<HashedDir>>> updateDirs = server.getUpdateDirs();
// Write all update dirs names // Write all update dirs names
output.writeLength(updateDirs.size(), 0); output.writeLength(updateDirs.size(), 0);
for (Entry<String, SignedObjectHolder<HashedDir>> entry : updateDirs) for (Entry<String, SignedObjectHolder<HashedDir>> entry : updateDirs)
output.writeString(entry.getKey(), 255); output.writeString(entry.getKey(), 255);
} }
} }

View file

@ -18,6 +18,7 @@
import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.LauncherAPI;
import ru.gravit.launcher.LauncherConfig; import ru.gravit.launcher.LauncherConfig;
import ru.gravit.launcher.client.ClientLauncher;
import ru.gravit.launcher.hasher.FileNameMatcher; import ru.gravit.launcher.hasher.FileNameMatcher;
import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.hasher.HashedDir;
import ru.gravit.launcher.hasher.HashedEntry; import ru.gravit.launcher.hasher.HashedEntry;
@ -305,7 +306,9 @@ protected SignedObjectHolder<HashedDir> requestDo(HInput input, HOutput output)
// Get diff between local and remote dir // Get diff between local and remote dir
SignedObjectHolder<HashedDir> remoteHDirHolder = new SignedObjectHolder<>(input, config.publicKey, HashedDir::new); SignedObjectHolder<HashedDir> remoteHDirHolder = new SignedObjectHolder<>(input, config.publicKey, HashedDir::new);
HashedDir.Diff diff = remoteHDirHolder.object.diff(localDir, matcher); HashedDir hackHackedDir = remoteHDirHolder.object;
ClientLauncher.profile.pushOptional(hackHackedDir,!ClientLauncher.profile.isUpdateFastCheck());
HashedDir.Diff diff = hackHackedDir.diff(localDir, matcher);
totalSize = diff.mismatch.size(); totalSize = diff.mismatch.size();
boolean compress = input.readBoolean(); boolean compress = input.readBoolean();

View file

@ -147,7 +147,14 @@ public Diff diff(HashedDir other, FileNameMatcher matcher) {
HashedDir extra = other.sideDiff(this, matcher, new LinkedList<>(), false); HashedDir extra = other.sideDiff(this, matcher, new LinkedList<>(), false);
return new Diff(mismatch, extra); return new Diff(mismatch, extra);
} }
public void pushHashedFile(String name, HashedFile file)
{
map.put(name,file);
}
public void remove(String name)
{
map.remove(name);
}
@LauncherAPI @LauncherAPI
public HashedEntry getEntry(String name) { public HashedEntry getEntry(String name) {
return map.get(name); return map.get(name);

View file

@ -1,12 +1,19 @@
package ru.gravit.launcher.profiles; package ru.gravit.launcher.profiles;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import ru.gravit.launcher.LauncherAPI; import ru.gravit.launcher.LauncherAPI;
import ru.gravit.launcher.hasher.FileNameMatcher; import ru.gravit.launcher.hasher.FileNameMatcher;
import ru.gravit.launcher.hasher.HashedDir;
import ru.gravit.launcher.hasher.HashedFile;
import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.VerifyHelper; import ru.gravit.utils.helper.VerifyHelper;
import ru.gravit.launcher.serialize.HInput; import ru.gravit.launcher.serialize.HInput;
@ -75,9 +82,11 @@ public String toString() {
private final IntegerConfigEntry serverPort; private final IntegerConfigEntry serverPort;
// Updater and client watch service // Updater and client watch service
private final ListConfigEntry update; private final List<String> update = new ArrayList<>();
private final ListConfigEntry updateExclusions; private final List<String> updateExclusions = new ArrayList<>();
private final ListConfigEntry updateVerify; private final List<String> updateVerify = new ArrayList<>();
private final List<String> updateOptional = new ArrayList<>();
private final List<String> markUpdateOptional = new ArrayList<>();
private final BooleanConfigEntry updateFastCheck; private final BooleanConfigEntry updateFastCheck;
private final BooleanConfigEntry useWhitelist; private final BooleanConfigEntry useWhitelist;
@ -104,9 +113,10 @@ public ClientProfile(BlockConfigEntry block) {
serverPort = block.getEntry("serverPort", IntegerConfigEntry.class); serverPort = block.getEntry("serverPort", IntegerConfigEntry.class);
// Updater and client watch service // Updater and client watch service
update = block.getEntry("update", ListConfigEntry.class); block.getEntry("update", ListConfigEntry.class).stream(StringConfigEntry.class).forEach(update::add);
updateVerify = block.getEntry("updateVerify", ListConfigEntry.class); block.getEntry("updateVerify", ListConfigEntry.class).stream(StringConfigEntry.class).forEach(updateVerify::add);
updateExclusions = block.getEntry("updateExclusions", ListConfigEntry.class); block.getEntry("updateOptional", ListConfigEntry.class).stream(StringConfigEntry.class).forEach(updateOptional::add);
block.getEntry("updateExclusions", ListConfigEntry.class).stream(StringConfigEntry.class).forEach(updateExclusions::add);
updateFastCheck = block.getEntry("updateFastCheck", BooleanConfigEntry.class); updateFastCheck = block.getEntry("updateFastCheck", BooleanConfigEntry.class);
useWhitelist = block.getEntry("useWhitelist", BooleanConfigEntry.class); useWhitelist = block.getEntry("useWhitelist", BooleanConfigEntry.class);
@ -149,10 +159,19 @@ public String[] getClientArgs() {
} }
@LauncherAPI @LauncherAPI
public FileNameMatcher getClientUpdateMatcher() { public FileNameMatcher getClientUpdateMatcher(/*boolean excludeOptional*/) {
String[] updateArray = update.stream(StringConfigEntry.class).toArray(String[]::new); String[] updateArray = update.toArray(new String[0]);
String[] verifyArray = updateVerify.stream(StringConfigEntry.class).toArray(String[]::new); String[] verifyArray = updateVerify.toArray(new String[0]);
String[] exclusionsArray = updateExclusions.stream(StringConfigEntry.class).toArray(String[]::new); List<String> excludeList;
//if(excludeOptional)
//{
// excludeList = new ArrayList<>();
// excludeList.addAll(updateExclusions);
// excludeList.addAll(updateOptional);
//}
//else
excludeList = updateExclusions;
String[] exclusionsArray = excludeList.toArray(new String[0]);
return new FileNameMatcher(updateArray, verifyArray, exclusionsArray); return new FileNameMatcher(updateArray, verifyArray, exclusionsArray);
} }
@ -171,6 +190,30 @@ public String getServerAddress() {
return serverAddress.getValue(); return serverAddress.getValue();
} }
@LauncherAPI
public void markOptional(String opt)
{
if(!updateOptional.contains(opt)) throw new SecurityException(String.format("Optional mod %s not found in optionalList",opt));
markUpdateOptional.add(opt);
}
@LauncherAPI
public void unmarkOptional(String opt)
{
if(!updateOptional.contains(opt)) throw new SecurityException(String.format("Optional mod %s not found in optionalList",opt));
markUpdateOptional.remove(opt);
}
public void pushOptional(HashedDir dir,boolean digest) throws IOException {
for(String opt : updateOptional)
{
dir.remove(opt);
}
for(String opt : markUpdateOptional)
{
Path path = Paths.get(opt);
File file = new File(path.toAbsolutePath().toString());
dir.pushHashedFile(opt, new HashedFile(path,file.getUsableSpace(),digest));
}
}
@LauncherAPI @LauncherAPI
public int getServerPort() { public int getServerPort() {
return serverPort.getValue(); return serverPort.getValue();
@ -233,11 +276,6 @@ public void verify() {
VerifyHelper.verify(getServerAddress(), VerifyHelper.NOT_EMPTY, "Server address can't be empty"); VerifyHelper.verify(getServerAddress(), VerifyHelper.NOT_EMPTY, "Server address can't be empty");
VerifyHelper.verifyInt(getServerPort(), VerifyHelper.range(0, 65535), "Illegal server port: " + getServerPort()); VerifyHelper.verifyInt(getServerPort(), VerifyHelper.range(0, 65535), "Illegal server port: " + getServerPort());
// Updater and client watch service
update.verifyOfType(ConfigEntry.Type.STRING);
updateVerify.verifyOfType(ConfigEntry.Type.STRING);
updateExclusions.verifyOfType(ConfigEntry.Type.STRING);
// Client launcher // Client launcher
jvmArgs.verifyOfType(ConfigEntry.Type.STRING); jvmArgs.verifyOfType(ConfigEntry.Type.STRING);
classPath.verifyOfType(ConfigEntry.Type.STRING); classPath.verifyOfType(ConfigEntry.Type.STRING);