[ANY] Чистка кода

This commit is contained in:
xDark 2019-08-13 21:02:33 +03:00
parent 6a590eb922
commit 7d279da5af
27 changed files with 162 additions and 94 deletions

View file

@ -33,6 +33,7 @@
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import io.netty.channel.epoll.Epoll;
import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.OperatorCreationException;
@ -359,7 +360,7 @@ public static void main(String... args) throws Throwable {
LogHelper.printLicense("LaunchServer"); LogHelper.printLicense("LaunchServer");
if (!StarterAgent.isAgentStarted()) { if (!StarterAgent.isAgentStarted()) {
LogHelper.error("StarterAgent is not started!"); LogHelper.error("StarterAgent is not started!");
LogHelper.error("Your should add to JVM options this option: `-javaagent:LaunchServer.jar`"); LogHelper.error("You should add to JVM options this option: `-javaagent:LaunchServer.jar`");
} }
// Start LaunchServer // Start LaunchServer
@ -810,7 +811,7 @@ private void generateConfigIfNotExists(boolean testEnv) throws IOException {
newConfig.netty.fileServerEnabled = true; newConfig.netty.fileServerEnabled = true;
newConfig.netty.binds = new NettyBindAddress[]{new NettyBindAddress("0.0.0.0", 9274)}; newConfig.netty.binds = new NettyBindAddress[]{new NettyBindAddress("0.0.0.0", 9274)};
newConfig.netty.performance = new NettyPerformanceConfig(); newConfig.netty.performance = new NettyPerformanceConfig();
newConfig.netty.performance.usingEpoll = JVMHelper.OS_TYPE == JVMHelper.OS.LINUX; //Only linux newConfig.netty.performance.usingEpoll = Epoll.isAvailable();
newConfig.netty.performance.bossThread = 2; newConfig.netty.performance.bossThread = 2;
newConfig.netty.performance.workerThread = 8; newConfig.netty.performance.workerThread = 8;

View file

@ -153,11 +153,15 @@ public void onCheckInfo(OshiHWID hwid, String username, Connection c) throws HWI
db_hwid.HWDiskSerial = set.getString(hwidFieldHWDiskSerial); db_hwid.HWDiskSerial = set.getString(hwidFieldHWDiskSerial);
db_hwid.totalMemory = Long.valueOf(set.getString(hwidFieldTotalMemory)); db_hwid.totalMemory = Long.valueOf(set.getString(hwidFieldTotalMemory));
db_hwid.macAddr = set.getString(hwidFieldMAC); db_hwid.macAddr = set.getString(hwidFieldMAC);
LogHelper.dev("Compare HWID: %s vs %s", hwid.getSerializeString(), db_hwid.getSerializeString()); if (LogHelper.isDevEnabled()) {
LogHelper.dev("Compare HWID: %s vs %s", hwid.getSerializeString(), db_hwid.getSerializeString());
}
int compare_point = hwid.compare(db_hwid); int compare_point = hwid.compare(db_hwid);
if (compare_point < compare) continue; if (compare_point < compare) continue;
else { else {
LogHelper.debug("User %s hwid check: found compare %d in %d", username, compare_point, set.getInt("id")); if (LogHelper.isDevEnabled()) {
LogHelper.debug("User %s hwid check: found compare %d in %d", username, compare_point, set.getInt("id"));
}
} }
} }
if (oneCompareMode) isOne = true; if (oneCompareMode) isOne = true;
@ -175,7 +179,9 @@ public void onCheckInfo(OshiHWID hwid, String username, Connection c) throws HWI
} }
public void setIsBanned(HWID hwid, boolean isBanned) { public void setIsBanned(HWID hwid, boolean isBanned) {
LogHelper.debug("%s Request HWID: %s", isBanned ? "Ban" : "UnBan", hwid.toString()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("%s Request HWID: %s", isBanned ? "Ban" : "UnBan", hwid.toString());
}
if (hwid instanceof OshiHWID) { if (hwid instanceof OshiHWID) {
OshiHWID oshiHWID = (OshiHWID) hwid; OshiHWID oshiHWID = (OshiHWID) hwid;
try (Connection c = mySQLHolder.getConnection()) { try (Connection c = mySQLHolder.getConnection()) {
@ -214,7 +220,9 @@ public void unban(List<HWID> list) {
public List<HWID> getHwid(String username) { public List<HWID> getHwid(String username) {
ArrayList<HWID> list = new ArrayList<>(); ArrayList<HWID> list = new ArrayList<>();
try (Connection c = mySQLHolder.getConnection()) { try (Connection c = mySQLHolder.getConnection()) {
LogHelper.debug("Try find HWID from username %s", username); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Try find HWID from username %s", username);
}
PreparedStatement s = c.prepareStatement(String.format("SELECT %s, %s FROM `%s` WHERE `%s` = ? LIMIT 1", userFieldHwid, userFieldLogin, tableUsers, userFieldLogin)); PreparedStatement s = c.prepareStatement(String.format("SELECT %s, %s FROM `%s` WHERE `%s` = ? LIMIT 1", userFieldHwid, userFieldLogin, tableUsers, userFieldLogin));
s.setString(1, username); s.setString(1, username);

View file

@ -20,11 +20,15 @@ public RequestTextureProvider(String skinURL, String cloakURL) {
} }
private static Texture getTexture(String url, boolean cloak) throws IOException { private static Texture getTexture(String url, boolean cloak) throws IOException {
LogHelper.debug("Getting texture: '%s'", url); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Getting texture: '%s'", url);
}
try { try {
return new Texture(url, cloak); return new Texture(url, cloak);
} catch (FileNotFoundException ignored) { } catch (FileNotFoundException ignored) {
LogHelper.subDebug("Texture not found :("); if (LogHelper.isDebugEnabled()) {
LogHelper.subDebug("Texture not found :(");
}
return null; // Simply not found return null; // Simply not found
} }
} }

View file

@ -4,6 +4,7 @@
import java.io.Writer; import java.io.Writer;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -41,7 +42,7 @@ public void invoke(String... args) throws Exception {
public void invoke(String... args) throws Exception { public void invoke(String... args) throws Exception {
verifyArgs(args, 1); verifyArgs(args, 1);
LogHelper.info("Sessions write to %s", args[0]); LogHelper.info("Sessions write to %s", args[0]);
Set<Client> clientSet = server.sessionManager.getSessions(); Collection<Client> clientSet = server.sessionManager.getSessions();
try (Writer writer = IOHelper.newWriter(Paths.get(args[0]))) { try (Writer writer = IOHelper.newWriter(Paths.get(args[0]))) {
Launcher.gsonManager.configGson.toJson(clientSet, writer); Launcher.gsonManager.configGson.toJson(clientSet, writer);
} }

View file

@ -1,7 +1,11 @@
package pro.gravit.launchserver.manangers; package pro.gravit.launchserver.manangers;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import pro.gravit.launcher.NeedGarbageCollection; import pro.gravit.launcher.NeedGarbageCollection;
import pro.gravit.launchserver.socket.Client; import pro.gravit.launchserver.socket.Client;
@ -10,53 +14,50 @@ public class SessionManager implements NeedGarbageCollection {
public static final long SESSION_TIMEOUT = 3 * 60 * 60 * 1000; // 3 часа public static final long SESSION_TIMEOUT = 3 * 60 * 60 * 1000; // 3 часа
public static final boolean GARBAGE_SERVER = Boolean.parseBoolean(System.getProperty("launcher.garbageSessionsServer", "false")); public static final boolean GARBAGE_SERVER = Boolean.parseBoolean(System.getProperty("launcher.garbageSessionsServer", "false"));
private HashSet<Client> clientSet = new HashSet<>(128); private Map<Long, Client> clientSet = new HashMap<>(128);
public boolean addClient(Client client) { public boolean addClient(Client client) {
clientSet.add(client); clientSet.put(client.session, client);
return true; return true;
} }
@Override @Override
public void garbageCollection() { public void garbageCollection() {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
clientSet.removeIf(c -> (c.timestamp + SESSION_TIMEOUT < time) && ((c.type == Client.Type.USER) || ((c.type == Client.Type.SERVER) && GARBAGE_SERVER))); clientSet.entrySet().removeIf(entry -> {
Client c = entry.getValue();
return (c.timestamp + SESSION_TIMEOUT < time) && ((c.type == Client.Type.USER) || ((c.type == Client.Type.SERVER) && GARBAGE_SERVER));
});
} }
public Client getClient(long session) { public Client getClient(long session) {
for (Client c : clientSet) return clientSet.get(session);
if (c.session == session) return c;
return null;
} }
public Client getOrNewClient(long session) { public Client getOrNewClient(long session) {
for (Client c : clientSet) return clientSet.computeIfAbsent(session, Client::new);
if (c.session == session) return c;
Client newClient = new Client(session);
clientSet.add(newClient);
return newClient;
} }
public void updateClient(long session) { public void updateClient(long session) {
for (Client c : clientSet) { Client c = clientSet.get(session);
if (c.session == session) { if (c != null) {
c.up(); c.up();
return; return;
}
} }
Client newClient = new Client(session); Client newClient = new Client(session);
clientSet.add(newClient); clientSet.put(session, newClient);
} }
public Set<Client> getSessions() { public Set<Client> getSessions() {
return clientSet; // TODO: removeme
return new HashSet<>(clientSet.values());
} }
public void loadSessions(Set<Client> set) { public void loadSessions(Set<Client> set) {
clientSet.addAll(set); clientSet.putAll(set.stream().collect(Collectors.toMap(c -> c.session, Function.identity())));
} }
} }

View file

@ -7,6 +7,7 @@
import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup; import io.netty.channel.EventLoopGroup;
import io.netty.channel.epoll.Epoll;
import io.netty.channel.group.DefaultChannelGroup; import io.netty.channel.group.DefaultChannelGroup;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpObjectAggregator;
@ -20,7 +21,6 @@
import pro.gravit.launchserver.socket.handlers.WebSocketFrameHandler; import pro.gravit.launchserver.socket.handlers.WebSocketFrameHandler;
import pro.gravit.launchserver.socket.handlers.fileserver.FileServerHandler; import pro.gravit.launchserver.socket.handlers.fileserver.FileServerHandler;
import pro.gravit.utils.BiHookSet; import pro.gravit.utils.BiHookSet;
import pro.gravit.utils.helper.JVMHelper;
import pro.gravit.utils.helper.LogHelper; import pro.gravit.utils.helper.LogHelper;
public class LauncherNettyServer implements AutoCloseable { public class LauncherNettyServer implements AutoCloseable {
@ -38,16 +38,16 @@ public LauncherNettyServer(LaunchServer server) {
{ {
LogHelper.debug("Netty: Epoll enabled"); LogHelper.debug("Netty: Epoll enabled");
} }
if(config.performance.usingEpoll && JVMHelper.OS_TYPE != JVMHelper.OS.LINUX) if(config.performance.usingEpoll && !Epoll.isAvailable())
{ {
LogHelper.error("netty,perfomance.usingEpoll work only Linux systems"); LogHelper.error("netty,perfomance.usingEpoll is not available: ", Epoll.unavailabilityCause());
} }
bossGroup = NettyObjectFactory.newEventLoopGroup(config.performance.bossThread); bossGroup = NettyObjectFactory.newEventLoopGroup(config.performance.bossThread);
workerGroup = NettyObjectFactory.newEventLoopGroup(config.performance.workerThread); workerGroup = NettyObjectFactory.newEventLoopGroup(config.performance.workerThread);
serverBootstrap = new ServerBootstrap(); serverBootstrap = new ServerBootstrap();
service = new WebSocketService(new DefaultChannelGroup(GlobalEventExecutor.INSTANCE), server); service = new WebSocketService(new DefaultChannelGroup(GlobalEventExecutor.INSTANCE), server);
serverBootstrap.group(bossGroup, workerGroup) serverBootstrap.group(bossGroup, workerGroup)
.channel(NettyObjectFactory.getServerSocketChannelClass()) .channelFactory(NettyObjectFactory.getServerSocketChannelFactory())
.handler(new LoggingHandler(config.logLevel)) .handler(new LoggingHandler(config.logLevel))
.childHandler(new ChannelInitializer<SocketChannel>() { .childHandler(new ChannelInitializer<SocketChannel>() {
@Override @Override

View file

@ -1,5 +1,6 @@
package pro.gravit.launchserver.socket; package pro.gravit.launchserver.socket;
import io.netty.channel.ChannelFactory;
import io.netty.channel.EventLoopGroup; import io.netty.channel.EventLoopGroup;
import io.netty.channel.ServerChannel; import io.netty.channel.ServerChannel;
import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.epoll.EpollEventLoopGroup;
@ -20,12 +21,12 @@ public static EventLoopGroup newEventLoopGroup(int threads)
else else
return new NioEventLoopGroup(threads); return new NioEventLoopGroup(threads);
} }
public static Class<? extends ServerChannel> getServerSocketChannelClass() public static ChannelFactory<? extends ServerChannel> getServerSocketChannelFactory()
{ {
if(epoll) if(epoll)
return EpollServerSocketChannel.class; return EpollServerSocketChannel::new;
else else
return NioServerSocketChannel.class; return NioServerSocketChannel::new;
} }
} }

View file

@ -9,6 +9,7 @@
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.ChannelMatchers;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import pro.gravit.launcher.Launcher; import pro.gravit.launcher.Launcher;
import pro.gravit.launcher.events.ExceptionEvent; import pro.gravit.launcher.events.ExceptionEvent;
@ -120,22 +121,22 @@ public static void registerResponses() {
} }
public void sendObject(ChannelHandlerContext ctx, Object obj) { public void sendObject(ChannelHandlerContext ctx, Object obj) {
ctx.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, WebSocketEvent.class))); ctx.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, WebSocketEvent.class)), ctx.voidPromise());
} }
public void sendObject(ChannelHandlerContext ctx, Object obj, Type type) { public void sendObject(ChannelHandlerContext ctx, Object obj, Type type) {
ctx.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type))); ctx.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type)), ctx.voidPromise());
} }
public void sendObjectAll(Object obj) { public void sendObjectAll(Object obj) {
for (Channel ch : channels) { for (Channel ch : channels) {
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, WebSocketEvent.class))); ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, WebSocketEvent.class)), ch.voidPromise());
} }
} }
public void sendObjectAll(Object obj, Type type) { public void sendObjectAll(Object obj, Type type) {
for (Channel ch : channels) { for (Channel ch : channels) {
ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type))); ch.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj, type)), ch.voidPromise());
} }
} }
@ -148,7 +149,7 @@ public void sendObjectAndClose(ChannelHandlerContext ctx, Object obj, Type type)
} }
public void sendEvent(EventResult obj) { public void sendEvent(EventResult obj) {
channels.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj))); channels.writeAndFlush(new TextWebSocketFrame(gson.toJson(obj)), ChannelMatchers.all(), true);
} }
public static class EventResult implements WebSocketEvent { public static class EventResult implements WebSocketEvent {

View file

@ -36,7 +36,9 @@ protected void decode(ChannelHandlerContext ctx, HttpRequest msg, List<Object> o
realIP = headers.get("X-Real-IP"); realIP = headers.get("X-Real-IP");
} }
if (realIP != null) { if (realIP != null) {
LogHelper.dev("Real IP address %s", realIP); if (LogHelper.isDevEnabled()) {
LogHelper.dev("Real IP address %s", realIP);
}
context.ip = realIP; context.ip = realIP;
} else LogHelper.error("IpForwarding error. Headers not found"); } else LogHelper.error("IpForwarding error. Headers not found");
out.add(msg); out.add(msg);

View file

@ -2,6 +2,7 @@
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame; import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
@ -40,11 +41,14 @@ public void setClient(Client client) {
@Override @Override
public void channelActive(ChannelHandlerContext ctx) { public void channelActive(ChannelHandlerContext ctx) {
LogHelper.dev("New client %s", IOHelper.getIP(ctx.channel().remoteAddress())); if (LogHelper.isDevEnabled()) {
LogHelper.dev("New client %s", IOHelper.getIP(ctx.channel().remoteAddress()));
}
client = new Client(0); client = new Client(0);
service.registerClient(ctx.channel()); Channel ch = ctx.channel();
service.registerClient(ch);
ctx.executor().schedule(() -> { ctx.executor().schedule(() -> {
ctx.channel().writeAndFlush(new PingWebSocketFrame()); ch.writeAndFlush(new PingWebSocketFrame(), ch.voidPromise());
}, 30L, TimeUnit.SECONDS); }, 30L, TimeUnit.SECONDS);
} }
@ -58,7 +62,9 @@ protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) {
ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content())); ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content()));
//return; //return;
} else if ((frame instanceof PongWebSocketFrame)) { } else if ((frame instanceof PongWebSocketFrame)) {
LogHelper.dev("WebSocket Client received pong"); if (LogHelper.isDevEnabled()) {
LogHelper.dev("WebSocket Client received pong");
}
} else if ((frame instanceof CloseWebSocketFrame)) { } else if ((frame instanceof CloseWebSocketFrame)) {
ctx.channel().close(); ctx.channel().close();
} else { } else {

View file

@ -112,6 +112,7 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
result.permissions = clientData.permissions; result.permissions = clientData.permissions;
if (authType == ConnectTypes.SERVER && !clientData.permissions.canServer) { if (authType == ConnectTypes.SERVER && !clientData.permissions.canServer) {
AuthProvider.authError("authType: SERVER not allowed for this account"); AuthProvider.authError("authType: SERVER not allowed for this account");
return;
} }
if (getSession) { if (getSession) {
if (clientData.session == 0) { if (clientData.session == 0) {
@ -123,7 +124,9 @@ public void execute(ChannelHandlerContext ctx, Client clientData) throws Excepti
if (authType != ConnectTypes.API && server.config.protectHandler.allowGetAccessToken(context)) { if (authType != ConnectTypes.API && server.config.protectHandler.allowGetAccessToken(context)) {
UUID uuid = pair.handler.auth(aresult); UUID uuid = pair.handler.auth(aresult);
result.playerProfile = ProfileByUUIDResponse.getProfile(uuid, aresult.username, client, clientData.auth.textureProvider); result.playerProfile = ProfileByUUIDResponse.getProfile(uuid, aresult.username, client, clientData.auth.textureProvider);
LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Auth: %s accessToken %s uuid: %s", login, result.accessToken, uuid.toString());
}
} }
sendResult(result); sendResult(result);
} catch (AuthException | HWIDException | HookException e) { } catch (AuthException | HWIDException | HookException e) {

View file

@ -27,7 +27,9 @@ public void execute(ChannelHandlerContext ctx, Client pClient) {
result.uuid = pClient.auth.handler.checkServer(username, serverID); result.uuid = pClient.auth.handler.checkServer(username, serverID);
if (result.uuid != null) if (result.uuid != null)
result.playerProfile = ProfileByUUIDResponse.getProfile(result.uuid, username, client, pClient.auth.textureProvider); result.playerProfile = ProfileByUUIDResponse.getProfile(result.uuid, username, client, pClient.auth.textureProvider);
LogHelper.debug("checkServer: %s uuid: %s serverID: %s", result.playerProfile.username, result.uuid.toString(), serverID); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("checkServer: %s uuid: %s serverID: %s", result.playerProfile.username, result.uuid.toString(), serverID);
}
} catch (AuthException | HookException e) { } catch (AuthException | HookException e) {
sendError(e.getMessage()); sendError(e.getMessage());
return; return;

View file

@ -27,7 +27,9 @@ public void execute(ChannelHandlerContext ctx, Client client) {
LogHelper.warning("Client auth is null. Using default."); LogHelper.warning("Client auth is null. Using default.");
success = server.config.getAuthProviderPair().handler.joinServer(username, accessToken, serverID); success = server.config.getAuthProviderPair().handler.joinServer(username, accessToken, serverID);
} else success = client.auth.handler.joinServer(username, accessToken, serverID); } else success = client.auth.handler.joinServer(username, accessToken, serverID);
LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("joinServer: %s accessToken: %s serverID: %s", username, accessToken, serverID);
}
} catch (AuthException | HookException e) { } catch (AuthException | HookException e) {
sendError(e.getMessage()); sendError(e.getMessage());
return; return;

View file

@ -540,7 +540,7 @@ private static LinkedList<Path> resolveClassPathList(Path clientDir, String... c
return result; return result;
} }
public static void initGson() { private static void initGson() {
Launcher.gsonManager = new ClientGsonManager(); Launcher.gsonManager = new ClientGsonManager();
Launcher.gsonManager.initGson(); Launcher.gsonManager.initGson();
} }
@ -552,8 +552,8 @@ public static void setProfile(ClientProfile profile) {
} }
public static void verifyHDir(Path dir, HashedDir hdir, FileNameMatcher matcher, boolean digest) throws IOException { public static void verifyHDir(Path dir, HashedDir hdir, FileNameMatcher matcher, boolean digest) throws IOException {
if (matcher != null) //if (matcher != null)
matcher = matcher.verifyOnly(); // matcher = matcher.verifyOnly();
// Hash directory and compare (ignore update-only matcher entries, it will break offline-mode) // Hash directory and compare (ignore update-only matcher entries, it will break offline-mode)
HashedDir currentHDir = new HashedDir(dir, matcher, true, digest); HashedDir currentHDir = new HashedDir(dir, matcher, true, digest);

View file

@ -72,7 +72,9 @@ public void postDiff(UpdateRequest request, UpdateRequestEvent e, HashedDir.Diff
//if(file.isSame(ret, true)) //if(file.isSame(ret, true))
{ {
Path source = request.getDir().resolve(path); Path source = request.getDir().resolve(path);
LogHelper.debug("Copy file %s to %s", ret.toAbsolutePath().toString(), source.toAbsolutePath().toString()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Copy file %s to %s", ret.toAbsolutePath().toString(), source.toAbsolutePath().toString());
}
//Let's go! //Let's go!
Files.copy(ret, source); Files.copy(ret, source);
try (InputStream input = IOHelper.newInput(ret)) { try (InputStream input = IOHelper.newInput(ret)) {
@ -93,11 +95,15 @@ public Path tryFind(NewLauncherSettings.HashedStoreEntry en, HashedFile file) th
if (entry.getType() == HashedEntry.Type.DIR) return HashedDir.WalkAction.CONTINUE; if (entry.getType() == HashedEntry.Type.DIR) return HashedDir.WalkAction.CONTINUE;
HashedFile tfile = (HashedFile) entry; HashedFile tfile = (HashedFile) entry;
if (tfile.isSame(file)) { if (tfile.isSame(file)) {
LogHelper.dev("[DIR:%s] Found file %s in %s", en.name, name, path); if (LogHelper.isDevEnabled()) {
LogHelper.dev("[DIR:%s] Found file %s in %s", en.name, name, path);
}
Path tdir = Paths.get(en.fullPath).resolve(path); Path tdir = Paths.get(en.fullPath).resolve(path);
try { try {
if (tfile.isSame(tdir, true)) { if (tfile.isSame(tdir, true)) {
LogHelper.dev("[DIR:%s] Confirmed file %s in %s", en.name, name, path); if (LogHelper.isDevEnabled()) {
LogHelper.dev("[DIR:%s] Confirmed file %s in %s", en.name, name, path);
}
ret.set(tdir); ret.set(tdir);
return HashedDir.WalkAction.STOP; return HashedDir.WalkAction.STOP;
} }

View file

@ -168,7 +168,9 @@ public Path handleResponse(HttpResponse response) throws IOException {
if (callback != null) { if (callback != null) {
callback.stateChanged(entry.getName(), 0, entry.getSize()); callback.stateChanged(entry.getName(), 0, entry.getSize());
} }
LogHelper.dev("Resolved filename %s to %s", filename, target.toAbsolutePath().toString()); if (LogHelper.isDevEnabled()) {
LogHelper.dev("Resolved filename %s to %s", filename, target.toAbsolutePath().toString());
}
transfer(source, target, filename, size, callback, totalCallback); transfer(source, target, filename, size, callback, totalCallback);
entry = input.getNextEntry(); entry = input.getNextEntry();
} }

View file

@ -50,7 +50,9 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
public void autoload(Path dir) throws IOException { public void autoload(Path dir) throws IOException {
LogHelper.info("Load modules"); LogHelper.info("Load modules");
if (Files.notExists(dir)) Files.createDirectory(dir); if (Files.notExists(dir)) Files.createDirectory(dir);
IOHelper.walk(dir, new ModulesVisitor(), true); else {
IOHelper.walk(dir, new ModulesVisitor(), true);
}
sort(); sort();
LogHelper.info("Loaded %d modules", modules.size()); LogHelper.info("Loaded %d modules", modules.size());
} }

View file

@ -85,7 +85,7 @@ public void open() throws Exception {
public ChannelFuture send(String text) { public ChannelFuture send(String text) {
LogHelper.dev("Send: %s", text); LogHelper.dev("Send: %s", text);
return ch.writeAndFlush(new TextWebSocketFrame(text)); return ch.writeAndFlush(new TextWebSocketFrame(text), ch.voidPromise());
} }
abstract void onMessage(String message) throws Exception; abstract void onMessage(String message) throws Exception;
@ -98,7 +98,7 @@ public void close() throws InterruptedException {
//System.out.println("WebSocket Client sending close"); //System.out.println("WebSocket Client sending close");
isClosed = true; isClosed = true;
if (ch != null && ch.isActive()) { if (ch != null && ch.isActive()) {
ch.writeAndFlush(new CloseWebSocketFrame()); ch.writeAndFlush(new CloseWebSocketFrame(), ch.voidPromise());
ch.closeFuture().sync(); ch.closeFuture().sync();
} }
@ -106,7 +106,7 @@ public void close() throws InterruptedException {
} }
public void eval(final String text) throws IOException { public void eval(final String text) throws IOException {
ch.writeAndFlush(new TextWebSocketFrame(text)); ch.writeAndFlush(new TextWebSocketFrame(text), ch.voidPromise());
} }
} }

View file

@ -56,8 +56,8 @@ public boolean isDone() {
@Override @Override
public WebSocketEvent get() throws InterruptedException, ExecutionException { public WebSocketEvent get() throws InterruptedException, ExecutionException {
if (isCanceled) return null; if (isCanceled) return null;
while (!event.ready) { synchronized (event) {
synchronized (event) { while (!event.ready) {
event.wait(); event.wait();
} }
} }
@ -73,8 +73,8 @@ public WebSocketEvent get() throws InterruptedException, ExecutionException {
@Override @Override
public WebSocketEvent get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException { public WebSocketEvent get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException {
if (isCanceled) return null; if (isCanceled) return null;
while (!event.ready) { synchronized (event) {
synchronized (event) { while (!event.ready) {
event.wait(timeout); event.wait(timeout);
} }
} }

View file

@ -73,12 +73,14 @@ protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Except
if (frame instanceof TextWebSocketFrame) { if (frame instanceof TextWebSocketFrame) {
final TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; final TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
clientJSONPoint.onMessage(textFrame.text()); clientJSONPoint.onMessage(textFrame.text());
LogHelper.dev("Message: %s", textFrame.text()); if (LogHelper.isDevEnabled()) {
LogHelper.dev("Message: %s", textFrame.text());
}
// uncomment to print request // uncomment to print request
// logger.info(textFrame.text()); // logger.info(textFrame.text());
} else if ((frame instanceof PingWebSocketFrame)) { } else if ((frame instanceof PingWebSocketFrame)) {
frame.content().retain(); frame.content().retain();
ctx.channel().writeAndFlush(new PongWebSocketFrame(frame.content())); ch.writeAndFlush(new PongWebSocketFrame(frame.content()), ch.voidPromise());
//return; //return;
} else if (frame instanceof PongWebSocketFrame) { } else if (frame instanceof PongWebSocketFrame) {
} else if (frame instanceof CloseWebSocketFrame) } else if (frame instanceof CloseWebSocketFrame)

View file

@ -47,7 +47,9 @@ public void findProfilesByNames(String[] usernames, Agent agent, ProfileLookupCa
sliceProfiles = new BatchProfileByUsernameRequest(sliceUsernames).request().playerProfiles; sliceProfiles = new BatchProfileByUsernameRequest(sliceUsernames).request().playerProfiles;
} catch (Exception e) { } catch (Exception e) {
for (String username : sliceUsernames) { for (String username : sliceUsernames) {
LogHelper.debug("Couldn't find profile '%s': %s", username, e); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Couldn't find profile '%s': %s", username, e);
}
callback.onProfileLookupFailed(new GameProfile((UUID) null, username), e); callback.onProfileLookupFailed(new GameProfile((UUID) null, username), e);
} }
@ -61,13 +63,17 @@ public void findProfilesByNames(String[] usernames, Agent agent, ProfileLookupCa
PlayerProfile pp = sliceProfiles[i]; PlayerProfile pp = sliceProfiles[i];
if (pp == null) { if (pp == null) {
String username = sliceUsernames[i]; String username = sliceUsernames[i];
LogHelper.debug("Couldn't find profile '%s'", username); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Couldn't find profile '%s'", username);
}
callback.onProfileLookupFailed(new GameProfile((UUID) null, username), new ProfileNotFoundException("Server did not find the requested profile")); callback.onProfileLookupFailed(new GameProfile((UUID) null, username), new ProfileNotFoundException("Server did not find the requested profile"));
continue; continue;
} }
// Report as looked up // Report as looked up
LogHelper.debug("Successfully looked up profile '%s'", pp.username); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Successfully looked up profile '%s'", pp.username);
}
callback.onProfileLookupSucceeded(YggdrasilMinecraftSessionService.toGameProfile(pp)); callback.onProfileLookupSucceeded(YggdrasilMinecraftSessionService.toGameProfile(pp));
} }

View file

@ -33,7 +33,9 @@ public final class YggdrasilMinecraftSessionService extends BaseMinecraftSession
public static final boolean NO_TEXTURES = Boolean.parseBoolean("launcher.com.mojang.authlib.noTextures"); public static final boolean NO_TEXTURES = Boolean.parseBoolean("launcher.com.mojang.authlib.noTextures");
public static void fillTextureProperties(GameProfile profile, PlayerProfile pp) { public static void fillTextureProperties(GameProfile profile, PlayerProfile pp) {
LogHelper.debug("fillTextureProperties, Username: '%s'", profile.getName()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("fillTextureProperties, Username: '%s'", profile.getName());
}
if (NO_TEXTURES) if (NO_TEXTURES)
return; return;
@ -42,12 +44,16 @@ public static void fillTextureProperties(GameProfile profile, PlayerProfile pp)
if (pp.skin != null) { if (pp.skin != null) {
properties.put(Launcher.SKIN_URL_PROPERTY, new Property(Launcher.SKIN_URL_PROPERTY, pp.skin.url, "")); properties.put(Launcher.SKIN_URL_PROPERTY, new Property(Launcher.SKIN_URL_PROPERTY, pp.skin.url, ""));
properties.put(Launcher.SKIN_DIGEST_PROPERTY, new Property(Launcher.SKIN_DIGEST_PROPERTY, SecurityHelper.toHex(pp.skin.digest), "")); properties.put(Launcher.SKIN_DIGEST_PROPERTY, new Property(Launcher.SKIN_DIGEST_PROPERTY, SecurityHelper.toHex(pp.skin.digest), ""));
LogHelper.debug("fillTextureProperties, Has skin texture for username '%s'", profile.getName()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("fillTextureProperties, Has skin texture for username '%s'", profile.getName());
}
} }
if (pp.cloak != null) { if (pp.cloak != null) {
properties.put(Launcher.CLOAK_URL_PROPERTY, new Property(Launcher.CLOAK_URL_PROPERTY, pp.cloak.url, "")); properties.put(Launcher.CLOAK_URL_PROPERTY, new Property(Launcher.CLOAK_URL_PROPERTY, pp.cloak.url, ""));
properties.put(Launcher.CLOAK_DIGEST_PROPERTY, new Property(Launcher.CLOAK_DIGEST_PROPERTY, SecurityHelper.toHex(pp.cloak.digest), "")); properties.put(Launcher.CLOAK_DIGEST_PROPERTY, new Property(Launcher.CLOAK_DIGEST_PROPERTY, SecurityHelper.toHex(pp.cloak.digest), ""));
LogHelper.debug("fillTextureProperties, Has cloak texture for username '%s'", profile.getName()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("fillTextureProperties, Has cloak texture for username '%s'", profile.getName());
}
} }
} }
@ -92,7 +98,9 @@ public YggdrasilMinecraftSessionService(AuthenticationService service) {
public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) { public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) {
// Verify has UUID // Verify has UUID
UUID uuid = profile.getUUID(); UUID uuid = profile.getUUID();
LogHelper.debug("fillProfileProperties, UUID: %s", uuid); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("fillProfileProperties, UUID: %s", uuid);
}
if (uuid == null) if (uuid == null)
return profile; return profile;
@ -101,7 +109,9 @@ public GameProfile fillProfileProperties(GameProfile profile, boolean requireSec
try { try {
pp = new ProfileByUUIDRequest(uuid).request().playerProfile; pp = new ProfileByUUIDRequest(uuid).request().playerProfile;
} catch (Exception e) { } catch (Exception e) {
LogHelper.debug("Couldn't fetch profile properties for '%s': %s", profile, e); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Couldn't fetch profile properties for '%s': %s", profile, e);
}
return profile; return profile;
} }
@ -112,14 +122,18 @@ public GameProfile fillProfileProperties(GameProfile profile, boolean requireSec
} }
// Create new game profile from player profile // Create new game profile from player profile
LogHelper.debug("Successfully fetched profile properties for '%s'", profile); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Successfully fetched profile properties for '%s'", profile);
}
fillTextureProperties(profile, pp); fillTextureProperties(profile, pp);
return toGameProfile(pp); return toGameProfile(pp);
} }
@Override @Override
public Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> getTextures(GameProfile profile, boolean requireSecure) { public Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> getTextures(GameProfile profile, boolean requireSecure) {
LogHelper.debug("getTextures, Username: '%s', UUID: '%s'", profile.getName(), profile.getUUID()); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("getTextures, Username: '%s', UUID: '%s'", profile.getName(), profile.getUUID());
}
Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> textures = new EnumMap<>(MinecraftProfileTexture.Type.class); Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> textures = new EnumMap<>(MinecraftProfileTexture.Type.class);
// Add textures // Add textures
@ -151,7 +165,9 @@ public Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> getTextures(Ga
@Override @Override
public GameProfile hasJoinedServer(GameProfile profile, String serverID) throws AuthenticationUnavailableException { public GameProfile hasJoinedServer(GameProfile profile, String serverID) throws AuthenticationUnavailableException {
String username = profile.getName(); String username = profile.getName();
LogHelper.debug("checkServer, Username: '%s', Server ID: %s", username, serverID); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("checkServer, Username: '%s', Server ID: %s", username, serverID);
}
// Make checkServer request // Make checkServer request
PlayerProfile pp; PlayerProfile pp;
@ -180,7 +196,9 @@ public void joinServer(GameProfile profile, String accessToken, String serverID)
// Join server // Join server
String username = profile.getName(); String username = profile.getName();
LogHelper.debug("joinServer, Username: '%s', Access token: %s, Server ID: %s", username, accessToken, serverID); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("joinServer, Username: '%s', Access token: %s, Server ID: %s", username, accessToken, serverID);
}
// Make joinServer request // Make joinServer request
boolean success; boolean success;

View file

@ -6,10 +6,6 @@
// Не входящих в пакеты самого Forge // Не входящих в пакеты самого Forge
public class SafeExitJVMLegacy { public class SafeExitJVMLegacy {
public static void exit(int code) { public static void exit(int code) {
try { JVMHelper.RUNTIME.halt(code);
JVMHelper.RUNTIME.halt(code);
} catch (Throwable e) {
System.exit(code);
}
} }
} }

View file

@ -6,10 +6,6 @@
// Не входящих в пакеты самого Forge // Не входящих в пакеты самого Forge
public class SafeExitJVM { public class SafeExitJVM {
public static void exit(int code) { public static void exit(int code) {
try { JVMHelper.RUNTIME.halt(code);
JVMHelper.RUNTIME.halt(code);
} catch (Throwable e) {
System.exit(code);
}
} }
} }

View file

@ -173,16 +173,24 @@ public void removeR(String name) {
for (String s : dirs) { for (String s : dirs) {
HashedEntry e = current.get(s); HashedEntry e = current.get(s);
if (e == null) { if (e == null) {
LogHelper.debug("Null %s", s); if (LogHelper.isDebugEnabled()) {
for (String x : current.keySet()) LogHelper.debug("Contains %s", x); LogHelper.debug("Null %s", s);
}
if (LogHelper.isDebugEnabled()) {
for (String x : current.keySet()) LogHelper.debug("Contains %s", x);
}
break; break;
} }
if (e.getType() == Type.DIR) { if (e.getType() == Type.DIR) {
current = ((HashedDir) e).map; current = ((HashedDir) e).map;
LogHelper.debug("Found dir %s", s); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Found dir %s", s);
}
} else { } else {
current.remove(s); current.remove(s);
LogHelper.debug("Found filename %s", s); if (LogHelper.isDebugEnabled()) {
LogHelper.debug("Found filename %s", s);
}
break; break;
} }
} }

View file

@ -26,7 +26,6 @@ public HashedEntry deserialize(JsonElement json, Type typeOfT, JsonDeserializati
if (typename.equals("dir")) cls = HashedDir.class; if (typename.equals("dir")) cls = HashedDir.class;
if (typename.equals("file")) cls = HashedFile.class; if (typename.equals("file")) cls = HashedFile.class;
return (HashedEntry) context.deserialize(json, cls); return (HashedEntry) context.deserialize(json, cls);
} }

View file

@ -1,6 +1,7 @@
package pro.gravit.launcher.managers; package pro.gravit.launcher.managers;
import java.util.ArrayList; import java.util.HashSet;
import java.util.Set;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -19,7 +20,7 @@ public Entry(NeedGarbageCollection invoke, long timer) {
private static final Timer timer = new Timer("GarbageTimer"); private static final Timer timer = new Timer("GarbageTimer");
private static final ArrayList<Entry> NEED_GARBARE_COLLECTION = new ArrayList<>(); private static final Set<Entry> NEED_GARBARE_COLLECTION = new HashSet<>();
public static void gc() { public static void gc() {
for (Entry gc : NEED_GARBARE_COLLECTION) for (Entry gc : NEED_GARBARE_COLLECTION)