asdf
This commit is contained in:
BIN
ex.png
BIN
ex.png
Binary file not shown.
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 79 KiB |
File diff suppressed because one or more lines are too long
@@ -4,9 +4,9 @@ import com.github.netricecake.kakao.exception.BadCredentialsException;
|
||||
import com.github.netricecake.kakao.exception.InvalidDeviceNameException;
|
||||
import com.github.netricecake.kakao.exception.InvalidDeviceUUIDException;
|
||||
import com.github.netricecake.kakao.exception.UnregisteredDeviceException;
|
||||
import com.github.netricecake.loco.packet.inbound.login.GetConfIn;
|
||||
import com.github.netricecake.loco.packet.outbound.login.GetConfOut;
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.packet.inbound.login.GetConfIn;
|
||||
import com.github.netricecake.kakao.packet.outbound.login.GetConfOut;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
package com.github.netricecake.kakao;
|
||||
|
||||
import com.github.netricecake.kakao.packet.inbound.member.*;
|
||||
import com.github.netricecake.kakao.structs.ChatRoom;
|
||||
import com.github.netricecake.kakao.structs.Member;
|
||||
import com.github.netricecake.kakao.structs.MemberType;
|
||||
import com.github.netricecake.kakao.structs.Message;
|
||||
import com.github.netricecake.loco.LocoPacket;
|
||||
import com.github.netricecake.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.loco.packet.inbound.member.*;
|
||||
import com.github.netricecake.loco.packet.inbound.message.MessageIn;
|
||||
import com.github.netricecake.loco.packet.inbound.room.ChatInfoIn;
|
||||
import com.github.netricecake.loco.packet.inbound.room.InfoLinkIn;
|
||||
import com.github.netricecake.loco.packet.outbound.member.MemberOut;
|
||||
import com.github.netricecake.loco.packet.outbound.room.ChatInfoOut;
|
||||
import com.github.netricecake.loco.packet.outbound.member.GetMemberOut;
|
||||
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 com.github.netricecake.kakao.loco.LocoPacket;
|
||||
import com.github.netricecake.kakao.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.kakao.packet.inbound.message.MessageIn;
|
||||
import com.github.netricecake.kakao.packet.outbound.member.MemberOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.message.MessageOut;
|
||||
|
||||
public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
||||
|
||||
@@ -30,100 +24,42 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
|
||||
if (packet.getMethod().equals("MSG")) {
|
||||
client.getSocket().write(new LocoPacket(packet.getPacketId(), "MSG", new MessageOut().toBson()));
|
||||
|
||||
MessageIn in = new MessageIn();
|
||||
in.fromBson(packet.getBody());
|
||||
checkRoom(in.getChatId());
|
||||
checkMember(in.getChatId(), in.getAuthorId());
|
||||
MessageIn in = new MessageIn(packet.getBody());
|
||||
ChatRoom chatRoom = client.getChatRoom(in.getChatId());
|
||||
if (chatRoom == null) return;
|
||||
Member member = chatRoom.getMembers().get(in.getAuthorId());
|
||||
|
||||
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
||||
Member member = room.getMembers().get(in.getAuthorId());
|
||||
|
||||
Message msg = new Message(in.getLogId(), room, member, in.getType(), in.getMessage(), in.getAttachment());
|
||||
Message msg = new Message(client, chatRoom, in.getLogId(), member, in.getType(), in.getSendAt(), in.getMessage(), in.getAttachment());
|
||||
Thread.ofVirtual().start(() -> {
|
||||
client.getTalkHandler().onMessage(msg);
|
||||
});
|
||||
} else if (packet.getMethod().equals("NEWMEM")) {
|
||||
NewMemIn in = new NewMemIn();
|
||||
in.fromBson(packet.getBody());
|
||||
checkRoom(in.getChatId());
|
||||
checkMember(in.getChatId(), in.getUserId());
|
||||
NewMemIn res = new NewMemIn(packet.getBody());
|
||||
ChatRoom chatRoom = client.getChatRoom(res.getChatId());
|
||||
if (chatRoom == null) return;
|
||||
MemberOut mo = new MemberOut(res.getChatId(), res.getUserId());
|
||||
MemberIn mi = new MemberIn(client.getSocket().writeAndRead(new LocoPacket("MEMBER", mo.toBson())).getBody());
|
||||
chatRoom.getMembers().put(res.getUserId(), new Member(client, chatRoom, res.getUserId(), mi.getType(), mi.getNickName(), mi.getProfileImageUrl(), mi.getFullProfileImageUrl(), mi.getOriginalProfileImageUrl(), mi.getProfileLinkId(), mi.getMemberType(), mi.getProfileType()));
|
||||
|
||||
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
||||
if (!room.getType().equals("OM")) return;
|
||||
Thread.ofVirtual().start(() -> {
|
||||
client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId()));
|
||||
client.getTalkHandler().onNewMember(chatRoom, chatRoom.getMembers().get(res.getUserId()));
|
||||
});
|
||||
} else if (packet.getMethod().equals("DELMEM")) {
|
||||
DelMemIn in = new DelMemIn();
|
||||
in.fromBson(packet.getBody());
|
||||
checkRoom(in.getChatId());
|
||||
DelMemIn in = new DelMemIn(packet.getBody());
|
||||
ChatRoom chatRoom = client.getChatRoom(in.getChatId());
|
||||
if (chatRoom == null) return;
|
||||
chatRoom.getMembers().remove(in.getUserId());
|
||||
|
||||
ChatRoom room = client.getChatRooms().get(in.getChatId());
|
||||
if (!room.getType().equals("OM")) return;
|
||||
Thread.ofVirtual().start(() -> {
|
||||
client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2));
|
||||
client.getTalkHandler().onDelMember(chatRoom, in.getUserId(), in.getNickname());
|
||||
});
|
||||
room.getMembers().remove(in.getUserId());
|
||||
} else if (packet.getMethod().equals("SYNCLINKPF")) {
|
||||
SyncLinkPfIn si = new SyncLinkPfIn();
|
||||
si.fromBson(packet.getBody());
|
||||
ChatRoom room = client.getChatRooms().get(si.getChatId());
|
||||
room.getMembers().remove(si.getUserId());
|
||||
Member member = new Member(si.getUserId(), si.getNickName(), 2);
|
||||
room.getMembers().put(si.getUserId(), member);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkRoom(long chatId) {
|
||||
if (!client.getChatRooms().containsKey(chatId)) {
|
||||
ChatInfoOut co = new ChatInfoOut(chatId);
|
||||
ChatInfoIn ci = new ChatInfoIn();
|
||||
ci.fromBson(client.getSocket().writeAndRead(new LocoPacket("CHATINFO", co.toBson())).getBody());
|
||||
ChatRoom room = new ChatRoom();
|
||||
room.setChatId(chatId);
|
||||
room.setType(ci.getType());
|
||||
room.setLinkId(ci.getLinkId());
|
||||
GetMemberOut gmo = new GetMemberOut(chatId);
|
||||
GetMemberIn gmi = new GetMemberIn();
|
||||
gmi.fromBson(client.getSocket().writeAndRead(new LocoPacket("GETMEM", gmo.toBson())).getBody());
|
||||
for (int i = 0; i < gmi.getMembers().size(); i++) {
|
||||
JsonObject json = gmi.getMembers().get(i).getAsJsonObject();
|
||||
int type = json.get("mt") != null ? json.get("mt").getAsInt() : 2;
|
||||
Member member = new Member(json.get("userId").getAsLong(), json.get("nickName").getAsString(), type);
|
||||
room.getMembers().put(member.getId(), member);
|
||||
}
|
||||
|
||||
if (ci.getType().equals("OM")) {
|
||||
InfoLinkOut lo = new InfoLinkOut(ci.getLinkId());
|
||||
InfoLinkIn li = new InfoLinkIn();
|
||||
li.fromBson(client.getSocket().writeAndRead(new LocoPacket("INFOLINK", lo.toBson())).getBody());
|
||||
room.setName(li.getName());
|
||||
} else if (ci.getType().equals("MultiChat")) {
|
||||
if (!ci.getChatMetas().isEmpty()) {
|
||||
JsonArray chatMetas = ci.getChatMetas();
|
||||
room.setName(chatMetas.get(0).getAsJsonObject().get("content").getAsString());
|
||||
} else {
|
||||
JsonArray displayMembers = ci.getDisplayMembers();
|
||||
String name = "";
|
||||
for (int i = 0; i < displayMembers.size(); i++) {
|
||||
name += displayMembers.get(i).getAsJsonObject().get("nickName").getAsString() + ", ";
|
||||
}
|
||||
room.setName(name);
|
||||
}
|
||||
} else if (ci.getType().equals("DirectChat")) {
|
||||
room.setName(ci.getDisplayMembers().get(0).getAsJsonObject().get("nickName").getAsString());
|
||||
}
|
||||
client.getChatRooms().put(chatId, room);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkMember(long chatId, long memberId) {
|
||||
ChatRoom room = client.getChatRooms().get(chatId);
|
||||
if (!room.getMembers().containsKey(memberId)) {
|
||||
MemberOut mo = new MemberOut(chatId, memberId);
|
||||
MemberIn mi = new MemberIn();
|
||||
mi.fromBson(client.getSocket().writeAndRead(new LocoPacket("MEMBER", mo.toBson())).getBody());
|
||||
room.getMembers().put(memberId, new Member(memberId, mi.getNickName(), mi.getMemberType()));
|
||||
SyncLinkPfIn res = new SyncLinkPfIn(packet.getBody());
|
||||
ChatRoom chatRoom = client.getChatRoom(res.getChatId());
|
||||
if (chatRoom == null) return;
|
||||
chatRoom.getMembers().remove(res.getUserId());
|
||||
Member member = new Member(client, chatRoom, res.getUserId(), 1000, res.getNickName(), res.getProfileImageUrl(), res.getFullProfileImageUrl(), res.getOriginalProfileImageUrl(), res.getProfileLinkId(), MemberType.MEMBER, res.getProfileType());
|
||||
chatRoom.getMembers().put(res.getUserId(), member);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,25 +1,34 @@
|
||||
package com.github.netricecake.kakao;
|
||||
|
||||
import com.github.netricecake.kakao.exception.*;
|
||||
import com.github.netricecake.kakao.structs.ChatRoom;
|
||||
import com.github.netricecake.loco.LocoPacket;
|
||||
import com.github.netricecake.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.loco.LocoSocket;
|
||||
import com.github.netricecake.loco.packet.inbound.login.CheckInIn;
|
||||
import com.github.netricecake.loco.packet.inbound.login.GetConfIn;
|
||||
import com.github.netricecake.loco.packet.inbound.login.LoginListIn;
|
||||
import com.github.netricecake.loco.packet.inbound.message.PostIn;
|
||||
import com.github.netricecake.loco.packet.inbound.message.ShipIn;
|
||||
import com.github.netricecake.loco.packet.inbound.message.WriteIn;
|
||||
import com.github.netricecake.loco.packet.outbound.login.CheckInOut;
|
||||
import com.github.netricecake.loco.packet.outbound.login.LoginListOut;
|
||||
import com.github.netricecake.loco.packet.outbound.etc.PingOut;
|
||||
import com.github.netricecake.loco.packet.outbound.message.PostOut;
|
||||
import com.github.netricecake.loco.packet.outbound.message.ShipOut;
|
||||
import com.github.netricecake.loco.packet.outbound.message.WriteOut;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.packet.inbound.member.GetMemberIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.message.PostIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.message.ShipIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.room.ChatInfoIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.room.InfoLinkIn;
|
||||
import com.github.netricecake.kakao.packet.outbound.member.GetMemberOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.message.PostOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.message.ShipOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.room.ChatInfoOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.room.InfoLinkOut;
|
||||
import com.github.netricecake.kakao.structs.*;
|
||||
import com.github.netricecake.kakao.loco.LocoPacket;
|
||||
import com.github.netricecake.kakao.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.kakao.loco.LocoSocket;
|
||||
import com.github.netricecake.kakao.packet.inbound.login.CheckInIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.login.GetConfIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.login.LoginListIn;
|
||||
import com.github.netricecake.kakao.packet.inbound.message.WriteIn;
|
||||
import com.github.netricecake.kakao.packet.outbound.login.CheckInOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.login.LoginListOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.etc.PingOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.member.KickMemberOut;
|
||||
import com.github.netricecake.kakao.packet.outbound.message.WriteOut;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.util.ImageUtil;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import lombok.Getter;
|
||||
@@ -42,7 +51,6 @@ public class TalkClient {
|
||||
private final String deviceUuid;
|
||||
private final String sessionDir;
|
||||
|
||||
@Getter
|
||||
private final Map<Long, ChatRoom> chatRooms = new HashMap<>();
|
||||
|
||||
@Getter
|
||||
@@ -148,22 +156,75 @@ public class TalkClient {
|
||||
});
|
||||
}
|
||||
|
||||
public boolean sendMessage(long chatId, int type, String message, String extra) {
|
||||
WriteOut wo = new WriteOut();
|
||||
wo.setChatId(chatId);
|
||||
wo.setType(type);
|
||||
wo.setMessage(message);
|
||||
wo.setExtra(extra);
|
||||
WriteIn wi = new WriteIn();
|
||||
wi.fromBson(socket.writeAndRead(new LocoPacket("WRITE", wo.toBson())).getBody());
|
||||
return wi.getStatus() == 0;
|
||||
public ChatRoom getChatRoom(long chatId) {
|
||||
if (chatRooms.containsKey(chatId)) return chatRooms.get(chatId);
|
||||
ChatInfoOut req = new ChatInfoOut(chatId);
|
||||
|
||||
ChatInfoIn res = new ChatInfoIn(socket.writeAndRead(new LocoPacket("CHATINFO", req.toBson())).getBody());
|
||||
if (res.getStatus() != 0) return null;
|
||||
|
||||
GetMemberOut memberReq = new GetMemberOut(chatId);
|
||||
GetMemberIn memberRes = new GetMemberIn(socket.writeAndRead(new LocoPacket("GETMEM", memberReq.toBson())).getBody());
|
||||
|
||||
ChatRoom chatRoom = null;
|
||||
if (res.getType().equals(ChatRoomType.OPEN_CHAT) || res.getType().equals(ChatRoomType.OPEN_DIRECT)) {
|
||||
InfoLinkOut linkReq = new InfoLinkOut(res.getLinkId());
|
||||
InfoLinkIn linkRes = new InfoLinkIn(socket.writeAndRead(new LocoPacket("INFOLINK", linkReq.toBson())).getBody());
|
||||
|
||||
chatRoom = new ChatRoom(this, chatId, res.getType(), linkRes.getName(), res.getLinkId());
|
||||
for (int i = 0; i < memberRes.getMembers().size(); i++) {
|
||||
JsonObject json = memberRes.getMembers().get(i).getAsJsonObject();
|
||||
Member member = new Member(this, chatRoom, json.get("userId").getAsLong(), json.get("type").getAsInt(), json.get("nickName").getAsString(), json.get("pi").getAsString(), json.get("fpi").getAsString(), json.get("opi").getAsString(), json.get("ptp").getAsInt() == 16 ? json.get("pli").getAsLong() : 0, json.get("mt").getAsInt(), json.get("ptp").getAsInt());
|
||||
chatRoom.getMembers().put(member.getUserId(), member);
|
||||
}
|
||||
} else if (res.getType().equals(ChatRoomType.DIRECT_CHAT)) {
|
||||
chatRoom = new ChatRoom(this, chatId, res.getType(), res.getDisplayMembers().get(0).getAsJsonObject().get("nickName").getAsString(), 0);
|
||||
for (int i = 0; i < memberRes.getMembers().size(); i++) {
|
||||
JsonObject json = memberRes.getMembers().get(i).getAsJsonObject();
|
||||
Member member = new Member(this, chatRoom, json.get("userId").getAsLong(), json.get("type").getAsInt(), json.get("nickName").getAsString(), json.get("profileImageUrl").getAsString(), json.get("fullProfileImageUrl").getAsString(), json.get("originalProfileImageUrl").getAsString(), 0, MemberType.MEMBER, 0);
|
||||
chatRoom.getMembers().put(member.getUserId(), member);
|
||||
}
|
||||
} else if (res.getType().equals(ChatRoomType.GROUP_CHAT)) {
|
||||
if (!res.getChatMetas().isEmpty()) {
|
||||
JsonArray chatMetas = res.getChatMetas();
|
||||
chatRoom = new ChatRoom(this, chatId, res.getType(), chatMetas.get(0).getAsJsonObject().get("content").getAsString(), 0);
|
||||
} else {
|
||||
JsonArray displayMembers = res.getDisplayMembers();
|
||||
String name = "";
|
||||
for (int i = 0; i < displayMembers.size(); i++) {
|
||||
name += displayMembers.get(i).getAsJsonObject().get("nickName").getAsString() + ", ";
|
||||
}
|
||||
chatRoom = new ChatRoom(this, chatId, res.getType(), name, 0);
|
||||
}
|
||||
|
||||
for (int i = 0; i < memberRes.getMembers().size(); i++) {
|
||||
JsonObject json = memberRes.getMembers().get(i).getAsJsonObject();
|
||||
Member member = new Member(this, chatRoom, json.get("userId").getAsLong(), json.get("type").getAsInt(), json.get("nickName").getAsString(), json.get("profileImageUrl").getAsString(), json.get("fullProfileImageUrl").getAsString(), json.get("originalProfileImageUrl").getAsString(), 0, MemberType.MEMBER, 0);
|
||||
chatRoom.getMembers().put(member.getUserId(), member);
|
||||
}
|
||||
}
|
||||
|
||||
return chatRoom;
|
||||
}
|
||||
|
||||
public boolean sendMessage(long chatId, String message, String extra) {
|
||||
WriteOut req = new WriteOut();
|
||||
req.setChatId(chatId);
|
||||
req.setType(MessageType.TEXT);
|
||||
req.setMessage(message);
|
||||
req.setExtra(extra);
|
||||
|
||||
WriteIn res = new WriteIn(socket.writeAndRead(new LocoPacket("WRITE", req.toBson())).getBody());
|
||||
return res.getStatus() == 0;
|
||||
}
|
||||
|
||||
public boolean sendMessage(long chatId, String message) {
|
||||
return sendMessage(chatId, 1, message, "{}");
|
||||
return sendMessage(chatId, message, "{}");
|
||||
}
|
||||
|
||||
public boolean sendJpg(long chatId, byte[] image, String format, int width, int height) {
|
||||
public boolean sendJpg(long chatId, byte[] image) {
|
||||
ImageUtil.ImageMeta meta = ImageUtil.getImageMeta(image);
|
||||
if (!meta.isValidJpeg()) return false;
|
||||
LocoSocket postSocket = null;
|
||||
try {
|
||||
MessageDigest md = MessageDigest.getInstance("SHA-1");
|
||||
@@ -171,8 +232,7 @@ public class TalkClient {
|
||||
so.setChatId(chatId);
|
||||
so.setSize(image.length);
|
||||
so.setCheckSum(ByteUtil.byteArrayToHexString(md.digest(image)));
|
||||
ShipIn si = new ShipIn();
|
||||
si.fromBson(socket.writeAndRead(new LocoPacket("SHIP", so.toBson())).getBody());
|
||||
ShipIn si = new ShipIn(socket.writeAndRead(new LocoPacket("SHIP", so.toBson())).getBody());
|
||||
if (si.getStatus() != 0) return false;
|
||||
|
||||
final CompletableFuture<Integer> future = new CompletableFuture<>();
|
||||
@@ -191,11 +251,10 @@ public class TalkClient {
|
||||
po.setKey(si.getKey());
|
||||
po.setSize(image.length);
|
||||
po.setChatId(chatId);
|
||||
po.setWidth(width);
|
||||
po.setHeight(height);
|
||||
po.setWidth(meta.getWidth());
|
||||
po.setHeight(meta.getHeight());
|
||||
|
||||
PostIn pi = new PostIn();
|
||||
pi.fromBson(postSocket.writeAndRead(new LocoPacket("POST", po.toBson())).getBody());
|
||||
PostIn pi = new PostIn(postSocket.writeAndRead(new LocoPacket("POST", po.toBson())).getBody());
|
||||
if (pi.getStatus() != 0) {
|
||||
postSocket.close();
|
||||
return false;
|
||||
@@ -214,7 +273,33 @@ public class TalkClient {
|
||||
return false;
|
||||
}
|
||||
|
||||
public long getUserId() {
|
||||
public boolean reply(Message target, String message) {
|
||||
JsonObject extraObject = new JsonObject();
|
||||
extraObject.addProperty("src_logId", target.getLogId());
|
||||
extraObject.addProperty("src_userId", target.getAuthor().getUserId());
|
||||
extraObject.addProperty("src_message", target.getMessage());
|
||||
extraObject.addProperty("src_type", target.getType());
|
||||
extraObject.addProperty("src_linkId", target.getChatRoom().getLinkId());
|
||||
|
||||
WriteOut req = new WriteOut();
|
||||
req.setChatId(target.getChatRoom().getChatId());
|
||||
req.setMessage(message);
|
||||
req.setType(MessageType.REPLY);
|
||||
req.setExtra(extraObject.toString());
|
||||
|
||||
JsonObject res = socket.writeAndRead(new LocoPacket("WRITE", req.toBson())).getBodyJson();
|
||||
return res.get("status").getAsInt() == 0;
|
||||
}
|
||||
|
||||
public boolean kickMember(long chatId, long linkId, long memberId) {
|
||||
KickMemberOut req = new KickMemberOut(chatId, linkId, memberId);
|
||||
|
||||
JsonObject res = socket.writeAndRead(new LocoPacket("KICKMEM", req.toBson())).getBodyJson();
|
||||
// 채팅 로그 저장할거면 이거도 처리
|
||||
return res.get("status").getAsInt() == 0;
|
||||
}
|
||||
|
||||
public long getMyUserId() {
|
||||
return loginData.userId;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,14 @@ public class TalkHandler {
|
||||
@Setter
|
||||
private TalkClient talkClient;
|
||||
|
||||
public void onConnect() {
|
||||
|
||||
}
|
||||
|
||||
public void onDisconnect() {
|
||||
|
||||
}
|
||||
|
||||
public void onMessage(Message message) {
|
||||
|
||||
}
|
||||
@@ -20,7 +28,7 @@ public class TalkHandler {
|
||||
|
||||
}
|
||||
|
||||
public void onDelMember(ChatRoom chatRoom, Member member) {
|
||||
public void onDelMember(ChatRoom chatRoom, long userId, String nickName) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.github.netricecake.loco;
|
||||
package com.github.netricecake.kakao.loco;
|
||||
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@@ -38,4 +40,16 @@ public class LocoPacket {
|
||||
this(-1, method, body);
|
||||
}
|
||||
|
||||
public LocoPacket(int packetId, String method, JsonObject body) {
|
||||
this(packetId, method, BsonUtil.jsonObjectToBson(body));
|
||||
}
|
||||
|
||||
public LocoPacket(String method, JsonObject body) {
|
||||
this(-1, method, BsonUtil.jsonObjectToBson(body));
|
||||
}
|
||||
|
||||
public JsonObject getBodyJson() {
|
||||
return BsonUtil.bsonToJsonObject(body);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.github.netricecake.loco;
|
||||
package com.github.netricecake.kakao.loco;
|
||||
|
||||
import com.github.netricecake.loco.crypto.CryptoManager;
|
||||
import com.github.netricecake.loco.codec.LocoCodec;
|
||||
import com.github.netricecake.loco.codec.SecureLayerCodec;
|
||||
import com.github.netricecake.kakao.loco.crypto.CryptoManager;
|
||||
import com.github.netricecake.kakao.loco.codec.LocoCodec;
|
||||
import com.github.netricecake.kakao.loco.codec.SecureLayerCodec;
|
||||
import io.netty.bootstrap.Bootstrap;
|
||||
import io.netty.channel.*;
|
||||
import io.netty.channel.nio.NioIoHandler;
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.netricecake.loco;
|
||||
package com.github.netricecake.kakao.loco;
|
||||
|
||||
public class LocoSocketHandler {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.github.netricecake.loco.codec;
|
||||
package com.github.netricecake.kakao.loco.codec;
|
||||
|
||||
import com.github.netricecake.loco.LocoPacket;
|
||||
import com.github.netricecake.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.loco.LocoPacket;
|
||||
import com.github.netricecake.kakao.loco.LocoSocketHandler;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToMessageCodec;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.codec;
|
||||
package com.github.netricecake.kakao.loco.codec;
|
||||
|
||||
import com.github.netricecake.loco.crypto.CryptoManager;
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.loco.crypto.CryptoManager;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToMessageCodec;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.crypto;
|
||||
package com.github.netricecake.kakao.loco.crypto;
|
||||
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import lombok.Getter;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.netricecake.loco.packet;
|
||||
package com.github.netricecake.kakao.packet;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.github.netricecake.kakao.packet.inbound.etc;
|
||||
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
|
||||
public class PingIn extends InboundPacket {
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.login;
|
||||
package com.github.netricecake.kakao.packet.inbound.login;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.login;
|
||||
package com.github.netricecake.kakao.packet.inbound.login;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.login;
|
||||
package com.github.netricecake.kakao.packet.inbound.login;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.member;
|
||||
package com.github.netricecake.kakao.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import lombok.Getter;
|
||||
@@ -15,7 +15,7 @@ public class DelMemIn extends InboundPacket {
|
||||
|
||||
private String nickname;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public DelMemIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson).get("chatLog").getAsJsonObject();
|
||||
chatId = jsonObject.get("chatId").getAsLong();
|
||||
userId = jsonObject.get("authorId").getAsLong();
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.member;
|
||||
package com.github.netricecake.kakao.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
@@ -13,7 +13,7 @@ public class GetMemberIn extends InboundPacket {
|
||||
|
||||
private JsonArray members;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public GetMemberIn(byte[] bson) {
|
||||
JsonObject json = BsonUtil.bsonToJsonObject(bson);
|
||||
status = json.get("status").getAsInt();
|
||||
if (status == 0) members = json.get("members").getAsJsonArray();
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.github.netricecake.kakao.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.structs.MemberType;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class MemberIn extends InboundPacket {
|
||||
|
||||
private long userId;
|
||||
|
||||
private int type;
|
||||
|
||||
private String nickName;
|
||||
|
||||
private String profileImageUrl;
|
||||
|
||||
private String fullProfileImageUrl;
|
||||
|
||||
private String originalProfileImageUrl;
|
||||
|
||||
private long profileLinkId;
|
||||
|
||||
private int memberType = MemberType.MEMBER;
|
||||
|
||||
private int profileType;
|
||||
|
||||
public MemberIn(byte[] bson) {
|
||||
JsonObject json = BsonUtil.bsonToJsonObject(bson).get("members").getAsJsonArray().get(0).getAsJsonObject();
|
||||
userId = json.get("userId").getAsLong();
|
||||
type = json.get("type").getAsInt();
|
||||
nickName = json.get("nickName").getAsString();
|
||||
profileImageUrl = json.get("pi").getAsString();
|
||||
fullProfileImageUrl = json.get("fpi").getAsString();
|
||||
originalProfileImageUrl = json.get("opi").getAsString();
|
||||
if (type == 1000) {
|
||||
memberType = json.get("mt").getAsInt();
|
||||
profileType = json.get("ptp").getAsInt();
|
||||
profileLinkId = profileType == 16 ? json.get("pli").getAsLong() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.member;
|
||||
package com.github.netricecake.kakao.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import lombok.Getter;
|
||||
@@ -15,7 +15,7 @@ public class NewMemIn extends InboundPacket {
|
||||
|
||||
private String nickname;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public NewMemIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson).get("chatLog").getAsJsonObject();
|
||||
chatId = jsonObject.get("chatId").getAsLong();
|
||||
userId = jsonObject.get("authorId").getAsLong();
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.github.netricecake.kakao.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class SyncLinkPfIn extends InboundPacket {
|
||||
|
||||
private long chatId;
|
||||
|
||||
private long linkId;
|
||||
|
||||
private long userId;
|
||||
|
||||
private int profileType;
|
||||
|
||||
private String nickName;
|
||||
|
||||
private String profileImageUrl;
|
||||
|
||||
private String fullProfileImageUrl;
|
||||
|
||||
private String originalProfileImageUrl;
|
||||
|
||||
private long profileLinkId;
|
||||
|
||||
public SyncLinkPfIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
chatId = jsonObject.get("c").getAsLong();
|
||||
linkId = jsonObject.get("li").getAsLong();
|
||||
JsonObject olu = jsonObject.get("olu").getAsJsonObject();
|
||||
userId = olu.get("userId").getAsLong();
|
||||
profileType = olu.get("ptp").getAsInt();
|
||||
nickName = olu.get("nn").getAsString();
|
||||
profileImageUrl = olu.get("pi").getAsString();
|
||||
fullProfileImageUrl = olu.get("fpi").getAsString();
|
||||
originalProfileImageUrl = olu.get("opi").getAsString();
|
||||
profileLinkId = profileType == 16 ? olu.get("pli").getAsLong() : 0;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.message;
|
||||
package com.github.netricecake.kakao.packet.inbound.message;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -18,11 +18,13 @@ public class MessageIn extends InboundPacket {
|
||||
|
||||
private int type;
|
||||
|
||||
private long sendAt;
|
||||
|
||||
private String message;
|
||||
|
||||
private String attachment;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public MessageIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
chatId = jsonObject.get("chatId").getAsLong();
|
||||
logId = jsonObject.get("logId").getAsLong();
|
||||
@@ -31,6 +33,7 @@ public class MessageIn extends InboundPacket {
|
||||
authorNickname = jsonObject.get("authorNickname").getAsString(); // 옵챗 아니면 이필드가 없음;;
|
||||
} catch (Exception e) {}
|
||||
type = jsonObject.get("chatLog").getAsJsonObject().get("type").getAsInt();
|
||||
sendAt = jsonObject.get("chatLog").getAsJsonObject().get("sendAt").getAsLong();
|
||||
message = jsonObject.get("chatLog").getAsJsonObject().get("message").getAsString();
|
||||
try {
|
||||
attachment = jsonObject.get("chatLog").getAsJsonObject().get("attachment").getAsString();
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.inbound.message;
|
||||
package com.github.netricecake.kakao.packet.inbound.message;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -11,7 +11,7 @@ public class PostIn {
|
||||
|
||||
private long o;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public PostIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
this.status = jsonObject.get("status").getAsInt();
|
||||
this.o = jsonObject.get("o").getAsLong();
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.message;
|
||||
package com.github.netricecake.kakao.packet.inbound.message;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -18,7 +18,7 @@ public class ShipIn extends InboundPacket {
|
||||
|
||||
private int port;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public ShipIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
status = jsonObject.get("status").getAsInt();
|
||||
if (status != 0) return;
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.message;
|
||||
package com.github.netricecake.kakao.packet.inbound.message;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -10,7 +10,7 @@ public class WriteIn extends InboundPacket {
|
||||
|
||||
private int status;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public WriteIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
status = jsonObject.get("status").getAsInt();
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.github.netricecake.kakao.packet.inbound.room;
|
||||
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.structs.ChatRoomType;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class ChatInfoIn extends InboundPacket {
|
||||
|
||||
private int status;
|
||||
|
||||
private String type;
|
||||
|
||||
private JsonArray chatMetas;
|
||||
|
||||
private JsonArray displayMembers;
|
||||
|
||||
private long linkId = 0;
|
||||
|
||||
public ChatInfoIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
status = jsonObject.get("status").getAsInt();
|
||||
if (status == 0) {
|
||||
type = jsonObject.get("chatInfo").getAsJsonObject().get("type").getAsString();
|
||||
chatMetas = jsonObject.get("chatInfo").getAsJsonObject().get("chatMetas").getAsJsonArray();
|
||||
displayMembers = jsonObject.get("chatInfo").getAsJsonObject().get("displayMembers").getAsJsonArray();
|
||||
if (type.equals(ChatRoomType.OPEN_CHAT) || type.equals(ChatRoomType.OPEN_DIRECT)) {
|
||||
linkId = jsonObject.get("chatInfo").getAsJsonObject().get("li").getAsLong();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.inbound.room;
|
||||
package com.github.netricecake.kakao.packet.inbound.room;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.packet.InboundPacket;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -10,7 +10,7 @@ public class InfoLinkIn extends InboundPacket {
|
||||
|
||||
private String name;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
public InfoLinkIn(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
name = jsonObject.get("ols").getAsJsonArray().get(0).getAsJsonObject().get("ln").getAsString();
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.github.netricecake.kakao.packet.outbound.etc;
|
||||
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
|
||||
public class PingOut {
|
||||
|
||||
public byte[] toBson() {
|
||||
return BsonUtil.jsonToBson("{}");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.outbound.login;
|
||||
package com.github.netricecake.kakao.packet.outbound.login;
|
||||
|
||||
import com.github.netricecake.kakao.KakaoApi;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.login;
|
||||
package com.github.netricecake.kakao.packet.outbound.login;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
public class GetConfOut {
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.github.netricecake.loco.packet.outbound.login;
|
||||
package com.github.netricecake.kakao.packet.outbound.login;
|
||||
|
||||
import com.github.netricecake.kakao.KakaoApi;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.loco.util.ByteUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.ByteUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
@@ -38,16 +38,12 @@ public class LoginListOut {
|
||||
|
||||
private long lbk = 0;
|
||||
|
||||
private byte[] rp; // 이거 뭐임
|
||||
private byte[] rp = ByteUtil.hexStringToByteArray("0000ffff0000");; // 이거 뭐임
|
||||
|
||||
private boolean bg = true;
|
||||
|
||||
private String oauthToken;
|
||||
|
||||
public LoginListOut() {
|
||||
rp = ByteUtil.hexStringToByteArray("0000ffff0000");
|
||||
}
|
||||
|
||||
public byte[] toBson() {
|
||||
JsonObject rpObject = new JsonObject();
|
||||
JsonObject binary = new JsonObject();
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.member;
|
||||
package com.github.netricecake.kakao.packet.outbound.member;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
public class GetMemberOut {
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.github.netricecake.kakao.packet.outbound.member;
|
||||
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class KickMemberOut {
|
||||
|
||||
private long chatId;
|
||||
|
||||
private long linkId;
|
||||
|
||||
private long memberId;
|
||||
|
||||
public KickMemberOut(long chatId, long linkId, long memberId) {
|
||||
this.chatId = chatId;
|
||||
this.linkId = linkId;
|
||||
this.memberId = memberId;
|
||||
}
|
||||
|
||||
public byte[] toBson() {
|
||||
JsonObject json = new JsonObject();
|
||||
json.addProperty("li", linkId);
|
||||
json.addProperty("c", chatId);
|
||||
json.addProperty("mid", memberId);
|
||||
json.addProperty("r", false);
|
||||
return BsonUtil.jsonObjectToBson(json);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.member;
|
||||
package com.github.netricecake.kakao.packet.outbound.member;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.github.netricecake.kakao.packet.outbound.member;
|
||||
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class PardonMemberOut {
|
||||
|
||||
private long chatId;
|
||||
|
||||
private long linkId;
|
||||
|
||||
private long memberId;
|
||||
|
||||
public byte[] toBson() {
|
||||
JsonObject json = new JsonObject();
|
||||
json.addProperty("li", linkId);
|
||||
json.addProperty("c", chatId);
|
||||
json.addProperty("mid", memberId);
|
||||
return BsonUtil.jsonObjectToBson(json);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.message;
|
||||
package com.github.netricecake.kakao.packet.outbound.message;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
|
||||
public class MessageOut {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.outbound.message;
|
||||
package com.github.netricecake.kakao.packet.outbound.message;
|
||||
|
||||
import com.github.netricecake.kakao.KakaoApi;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.message;
|
||||
package com.github.netricecake.kakao.packet.outbound.message;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.github.netricecake.loco.packet.outbound.message;
|
||||
package com.github.netricecake.kakao.packet.outbound.message;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.structs.MessageType;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -12,11 +13,17 @@ import java.security.SecureRandom;
|
||||
public class WriteOut {
|
||||
|
||||
private long chatId;
|
||||
|
||||
private long msgId = new SecureRandom().nextLong();
|
||||
|
||||
private String message;
|
||||
private int type = 1;
|
||||
|
||||
private int type = MessageType.TEXT;
|
||||
|
||||
private boolean noSeen = false;
|
||||
|
||||
private String extra = "{}";
|
||||
|
||||
private int scope = 1;
|
||||
|
||||
public byte[] toBson() {
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.room;
|
||||
package com.github.netricecake.kakao.packet.outbound.room;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
public class ChatInfoOut {
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.github.netricecake.loco.packet.outbound.room;
|
||||
package com.github.netricecake.kakao.packet.outbound.room;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.github.netricecake.kakao.util.BsonUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
@@ -1,24 +1,39 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
import com.github.netricecake.kakao.TalkClient;
|
||||
import com.github.netricecake.kakao.util.ImageUtil;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class ChatRoom {
|
||||
|
||||
private long chatId;
|
||||
@Getter
|
||||
private final TalkClient client;
|
||||
|
||||
private String type;
|
||||
@Getter
|
||||
private final long chatId;
|
||||
|
||||
private String name;
|
||||
@Getter
|
||||
private final String type;
|
||||
|
||||
private long linkId;
|
||||
@Getter
|
||||
private final String name;
|
||||
|
||||
private Map<Long, Member> members = new HashMap<>();
|
||||
@Getter
|
||||
private final long linkId;
|
||||
|
||||
@Getter
|
||||
private final Map<Long, Member> members = new HashMap<>();
|
||||
|
||||
public ChatRoom(TalkClient client, long chatId, String type, String name, long linkId) {
|
||||
this.client = client;
|
||||
this.chatId = chatId;
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.linkId = linkId;
|
||||
}
|
||||
|
||||
public int getMemberCount() {
|
||||
return members.size();
|
||||
@@ -28,4 +43,34 @@ public class ChatRoom {
|
||||
return members.get(id);
|
||||
}
|
||||
|
||||
public boolean kickMember(long userId) {
|
||||
if (!(type.equals(ChatRoomType.OPEN_CHAT) || type.equals(ChatRoomType.OPEN_DIRECT))) return false;
|
||||
if (!(getMember(client.getMyUserId()).getMemberType() == MemberType.OWNER || getMember(client.getMyUserId()).getMemberType() == MemberType.ADMIN)) return false;
|
||||
return client.kickMember(chatId, linkId, userId);
|
||||
}
|
||||
|
||||
public boolean kickMember(Member member) {
|
||||
return kickMember(member.getUserId());
|
||||
}
|
||||
|
||||
public boolean sendMessage(String message) {
|
||||
return client.sendMessage(chatId, message);
|
||||
}
|
||||
|
||||
public boolean sendMessage(String message, String extra) {
|
||||
return client.sendMessage(chatId, message, extra);
|
||||
}
|
||||
|
||||
public boolean sendJpg(byte[] image) {
|
||||
return client.sendJpg(chatId, image); //client.sendImage(chatId, image, extension);
|
||||
}
|
||||
|
||||
public boolean sendVideo(String extension, byte[] video) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean sendFile(String extension, byte[] file) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
public class ChatRoomType {
|
||||
|
||||
public final static String DIRECT_CHAT = "DirectChat";
|
||||
public final static String GROUP_CHAT = "MultiChat";
|
||||
|
||||
public final static String OPEN_CHAT = "OM";
|
||||
public final static String OPEN_DIRECT = "OD";
|
||||
|
||||
}
|
||||
@@ -1,20 +1,48 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
import com.github.netricecake.kakao.TalkClient;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class Member {
|
||||
|
||||
private long id;
|
||||
private final TalkClient client;
|
||||
|
||||
private String name;
|
||||
private final ChatRoom chatRoom;
|
||||
|
||||
private int memberType;
|
||||
private final long userId;
|
||||
|
||||
public Member(long id, String name, int memberType) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
private final int type;
|
||||
|
||||
private final String nickName;
|
||||
|
||||
private final String profileImageUrl;
|
||||
|
||||
private final String fullProfileImageUrl;
|
||||
|
||||
private final String originalProfileImageUrl;
|
||||
|
||||
private final long profileLinkId;
|
||||
|
||||
private final int memberType;
|
||||
|
||||
private final int profileType; // 1 실제 프로필, 2 카카오 프로필, 16 오픈 프로필
|
||||
|
||||
public Member(TalkClient client, ChatRoom chatRoom, long userId, int type, String nickName, String profileImageUrl, String fullProfileImageUrl, String originalProfileImageUrl, long profileLinkId, int memberType, int profileType) {
|
||||
this.client = client;
|
||||
this.chatRoom = chatRoom;
|
||||
this.userId = userId;
|
||||
this.type = type;
|
||||
this.nickName = nickName;
|
||||
this.profileImageUrl = profileImageUrl;
|
||||
this.fullProfileImageUrl = fullProfileImageUrl;
|
||||
this.originalProfileImageUrl = originalProfileImageUrl;
|
||||
this.profileLinkId = profileLinkId;
|
||||
this.memberType = memberType;
|
||||
this.profileType = profileType;
|
||||
}
|
||||
|
||||
public boolean kick() {
|
||||
return chatRoom.kickMember(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
public class MemberType {
|
||||
|
||||
public final static int OWNER = 1;
|
||||
public final static int MEMBER = 2;
|
||||
public final static int ADMIN = 4;
|
||||
public final static int BOT = 8;
|
||||
|
||||
}
|
||||
@@ -1,29 +1,48 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
import com.github.netricecake.kakao.TalkClient;
|
||||
import com.github.netricecake.kakao.loco.LocoPacket;
|
||||
import com.github.netricecake.kakao.packet.inbound.message.WriteIn;
|
||||
import com.github.netricecake.kakao.packet.outbound.message.WriteOut;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class Message {
|
||||
|
||||
private long logId;
|
||||
private final TalkClient client;
|
||||
|
||||
private ChatRoom chatRoom;
|
||||
private final ChatRoom chatRoom;
|
||||
|
||||
private Member author;
|
||||
private final long logId;
|
||||
|
||||
private int type;
|
||||
private final Member author;
|
||||
|
||||
private String message;
|
||||
private final int type;
|
||||
|
||||
private String attachment;
|
||||
private final long sendTime;
|
||||
|
||||
public Message(long logId, ChatRoom chatRoom, Member author, int type, String message, String attachment) {
|
||||
private final String message;
|
||||
|
||||
private final String attachment;
|
||||
|
||||
public Message(TalkClient client, ChatRoom chatRoom, long logId, Member author, int type, long sendTime, String message, String attachment) {
|
||||
this.client = client;
|
||||
this.logId = logId;
|
||||
this.chatRoom = chatRoom;
|
||||
this.author = author;
|
||||
this.type = type;
|
||||
this.sendTime = sendTime;
|
||||
this.message = message;
|
||||
this.attachment = attachment;
|
||||
}
|
||||
|
||||
public boolean reply(String message) {
|
||||
return client.reply(this, message);
|
||||
}
|
||||
|
||||
public boolean blind() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.github.netricecake.kakao.structs;
|
||||
|
||||
public class MessageType {
|
||||
|
||||
private MessageType() {};
|
||||
|
||||
public final static int TEXT = 1;
|
||||
public final static int IMAGE = 2;
|
||||
public final static int VIDEO = 3;
|
||||
public final static int FILE = 4;
|
||||
|
||||
public final static int REPLY = 26;
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.netricecake.loco.util;
|
||||
package com.github.netricecake.kakao.util;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonObject;
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.github.netricecake.loco.util;
|
||||
package com.github.netricecake.kakao.util;
|
||||
|
||||
public class ByteUtil {
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.github.netricecake.kakao.util;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public class ImageUtil {
|
||||
|
||||
@Getter
|
||||
public static class ImageMeta {
|
||||
private boolean isValidJpeg;
|
||||
private int width;
|
||||
private int height;
|
||||
|
||||
public ImageMeta(boolean isValidJpeg, int width, int height) {
|
||||
this.isValidJpeg = isValidJpeg;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
}
|
||||
|
||||
public static ImageMeta getImageMeta(byte[] data) {
|
||||
if (data == null || data.length < 4) {
|
||||
return new ImageMeta(false, 0, 0);
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
|
||||
if ((data[i] & 0xFF) != 0xFF || (data[i + 1] & 0xFF) != 0xD8) {
|
||||
return new ImageMeta(false, 0, 0);
|
||||
}
|
||||
i += 2;
|
||||
|
||||
while (i < data.length) {
|
||||
int marker;
|
||||
while ((marker = (data[i] & 0xFF)) != 0xFF) {
|
||||
i++;
|
||||
if (i >= data.length) return new ImageMeta(false, 0, 0);
|
||||
}
|
||||
|
||||
do {
|
||||
marker = data[++i] & 0xFF;
|
||||
} while (marker == 0xFF);
|
||||
i++;
|
||||
if (isSOFMarker(marker)) {
|
||||
|
||||
int height = ((data[i + 3] & 0xFF) << 8) | (data[i + 4] & 0xFF);
|
||||
int width = ((data[i + 5] & 0xFF) << 8) | (data[i + 6] & 0xFF);
|
||||
|
||||
return new ImageMeta(true, width, height);
|
||||
}
|
||||
|
||||
int length = ((data[i] & 0xFF) << 8) | (data[i + 1] & 0xFF);
|
||||
i += length;
|
||||
}
|
||||
|
||||
return new ImageMeta(false, 0, 0);
|
||||
}
|
||||
|
||||
private static boolean isSOFMarker(int marker) {
|
||||
return marker >= 0xC0 && marker <= 0xCF
|
||||
&& marker != 0xC4 && marker != 0xC8 && marker != 0xCC;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package com.github.netricecake.loco.packet.inbound.etc;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
|
||||
public class PingIn extends InboundPacket {
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
package com.github.netricecake.loco.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class MemberIn extends InboundPacket {
|
||||
|
||||
private long userId;
|
||||
|
||||
private String nickName;
|
||||
|
||||
private int memberType = 2;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
userId = jsonObject.get("members").getAsJsonArray().get(0).getAsJsonObject().get("userId").getAsLong();
|
||||
this.nickName = jsonObject.get("members").getAsJsonArray().get(0).getAsJsonObject().get("nickName").getAsString();
|
||||
try {
|
||||
memberType = jsonObject.get("members").getAsJsonArray().get(0).getAsJsonObject().get("mt").getAsInt();
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package com.github.netricecake.loco.packet.inbound.member;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class SyncLinkPfIn extends InboundPacket {
|
||||
|
||||
private long chatId;
|
||||
|
||||
private long linkId;
|
||||
|
||||
private long userId;
|
||||
|
||||
private String nickName;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
chatId = jsonObject.get("c").getAsLong();
|
||||
linkId = jsonObject.get("li").getAsLong();
|
||||
JsonObject olu = jsonObject.get("olu").getAsJsonObject();
|
||||
userId = olu.get("userId").getAsLong();
|
||||
nickName = olu.get("nn").getAsString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package com.github.netricecake.loco.packet.inbound.room;
|
||||
|
||||
import com.github.netricecake.loco.packet.InboundPacket;
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class ChatInfoIn extends InboundPacket {
|
||||
|
||||
private String type;
|
||||
|
||||
private JsonArray chatMetas;
|
||||
|
||||
private JsonArray displayMembers;
|
||||
|
||||
private long linkId = 0;
|
||||
|
||||
public void fromBson(byte[] bson) {
|
||||
JsonObject jsonObject = BsonUtil.bsonToJsonObject(bson);
|
||||
type = jsonObject.get("chatInfo").getAsJsonObject().get("type").getAsString();
|
||||
try {
|
||||
linkId = jsonObject.get("chatInfo").getAsJsonObject().get("li").getAsLong();
|
||||
} catch (Exception e) {}
|
||||
try {
|
||||
chatMetas = jsonObject.get("chatInfo").getAsJsonObject().get("chatMetas").getAsJsonArray();
|
||||
displayMembers = jsonObject.get("chatInfo").getAsJsonObject().get("displayMembers").getAsJsonArray();
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.github.netricecake.loco.packet.outbound.etc;
|
||||
|
||||
import com.github.netricecake.loco.util.BsonUtil;
|
||||
|
||||
public class PingOut {
|
||||
|
||||
public byte[] toBson() {
|
||||
return BsonUtil.jsonToBson("{}");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user