diff --git a/README.md b/README.md index f1a86da..e6929b8 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ **device uuid 무조건 바꾸시오.** -자바21에 추가된 virtual thread 사용하도록 바꾸는중... - ## Example ![ex](./ex.png) @@ -80,6 +78,8 @@ jar 파일은 build/libs 디렉터리 안에 생성됩니다. ## Usage +자바21 이상 필요합니다. + 첫 로그인시에 기기등록이 필요합니다. 콘솔창에 방법 나오니 따라하세요. 로그인하면 로그인 정보(토큰 등)가 email_deviceName 폴더 안에 저장됩니다. 서버 연결이 안되면 삭제하고 시도하세요. diff --git a/build.gradle b/build.gradle index 3142ddf..2e0430b 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,8 @@ plugins { group = 'com.github.netricecake' version = '1.0-SNAPSHOT' +sourceCompatibility = '21' +targetCompatibility = '21' jar { manifest { diff --git a/src/main/java/com/github/netricecake/kakao/LocoSocketHandlerImpl.java b/src/main/java/com/github/netricecake/kakao/LocoSocketHandlerImpl.java index 3801547..883b51f 100644 --- a/src/main/java/com/github/netricecake/kakao/LocoSocketHandlerImpl.java +++ b/src/main/java/com/github/netricecake/kakao/LocoSocketHandlerImpl.java @@ -16,12 +16,10 @@ import com.github.netricecake.loco.packet.outbound.room.InfoLinkOut; import com.github.netricecake.loco.packet.outbound.message.MessageOut; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import lombok.Getter; public class LocoSocketHandlerImpl extends LocoSocketHandler { - @Getter - private TalkClient client; + private final TalkClient client; public LocoSocketHandlerImpl(TalkClient client) { this.client = client; @@ -41,7 +39,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler { Member member = room.getMembers().get(in.getAuthorId()); Message msg = new Message(in.getLogId(), room, member, in.getType(), in.getMessage(), in.getAttachment()); - client.getTalkHandler().onMessage(msg); + Thread.ofVirtual().start(() -> { + client.getTalkHandler().onMessage(msg); + }); } else if (packet.getMethod().equals("NEWMEM")) { NewMemIn in = new NewMemIn(); in.fromBson(packet.getBody()); @@ -50,7 +50,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler { ChatRoom room = client.getChatRooms().get(in.getChatId()); if (!room.getType().equals("OM")) return; - client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId())); + Thread.ofVirtual().start(() -> { + client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId())); + }); } else if (packet.getMethod().equals("DELMEM")) { DelMemIn in = new DelMemIn(); in.fromBson(packet.getBody()); @@ -58,7 +60,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler { ChatRoom room = client.getChatRooms().get(in.getChatId()); if (!room.getType().equals("OM")) return; - client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2)); + Thread.ofVirtual().start(() -> { + client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2)); + }); room.getMembers().remove(in.getUserId()); } else if (packet.getMethod().equals("SYNCLINKPF")) { SyncLinkPfIn si = new SyncLinkPfIn(); diff --git a/src/main/java/com/github/netricecake/kakao/TalkClient.java b/src/main/java/com/github/netricecake/kakao/TalkClient.java index 0aa8958..02bb28c 100644 --- a/src/main/java/com/github/netricecake/kakao/TalkClient.java +++ b/src/main/java/com/github/netricecake/kakao/TalkClient.java @@ -36,14 +36,14 @@ import java.util.concurrent.Executors; public class TalkClient { - private String email; - private String password; - private String deviceName; - private String deviceUuid; - private String sessionDir; + private final String email; + private final String password; + private final String deviceName; + private final String deviceUuid; + private final String sessionDir; @Getter - private Map chatRooms = new HashMap<>(); + private final Map chatRooms = new HashMap<>(); @Getter protected boolean connected; diff --git a/src/main/java/com/github/netricecake/loco/codec/SecureLayerCodec.java b/src/main/java/com/github/netricecake/loco/codec/SecureLayerCodec.java index 0fab3da..395e418 100644 --- a/src/main/java/com/github/netricecake/loco/codec/SecureLayerCodec.java +++ b/src/main/java/com/github/netricecake/loco/codec/SecureLayerCodec.java @@ -9,7 +9,7 @@ import java.util.List; public class SecureLayerCodec extends MessageToMessageCodec { - private CryptoManager cryptoManager; + private final CryptoManager cryptoManager; private int currentLength = -1; private byte[] buffer = new byte[0]; @@ -20,6 +20,7 @@ public class SecureLayerCodec extends MessageToMessageCodec { @Override protected void encode(ChannelHandlerContext channelHandlerContext, byte[] bytes, List list) throws Exception { + // TODO 길이 길면 짤라서 암호화해서 보내야됨 byte[] encryptedBody = cryptoManager.encryptMessage(bytes); byte[] packet = ByteUtil.concatBytes(ByteUtil.intToByteArrayLE(encryptedBody.length), encryptedBody); list.add(packet); diff --git a/src/main/java/com/github/netricecake/loco/crypto/CryptoManager.java b/src/main/java/com/github/netricecake/loco/crypto/CryptoManager.java index 792e951..ab39de3 100644 --- a/src/main/java/com/github/netricecake/loco/crypto/CryptoManager.java +++ b/src/main/java/com/github/netricecake/loco/crypto/CryptoManager.java @@ -55,10 +55,9 @@ public class CryptoManager { byte[] length = ByteUtil.intToByteArrayLE(HANDSHAKE_BODY_SIZE); return ByteUtil.concatBytes(length, ByteUtil.intToByteArrayLE(RSA_LOCO_HEADER), ByteUtil.intToByteArrayLE(AES_LOCO_HEADER), encryptedKey); } catch (Exception e) {} - return new byte[0]; + return null; } - // 바디 사이즈가 131067가 최대인거 같은데 잘 모르겠음 public byte[] encryptMessage(byte[] message) { try { byte[] nonce = new byte[AES_NONCE_SIZE]; @@ -67,7 +66,7 @@ public class CryptoManager { cipher.init(Cipher.ENCRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce)); return ByteUtil.concatBytes(nonce, cipher.doFinal(message)); } catch (Exception e) {} - return new byte[0]; + return null; } public byte[] decryptMessage(byte[] message) { @@ -77,7 +76,7 @@ public class CryptoManager { cipher.init(Cipher.DECRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce)); return cipher.doFinal(ByteUtil.sliceBytes(message, AES_NONCE_SIZE, message.length - nonce.length)); } catch (Exception e) {} - return new byte[0]; + return null; } }