Implement friends list

This commit is contained in:
Melledy
2025-11-14 04:39:48 -08:00
parent 1c52ec011f
commit ecc2ef2315
15 changed files with 666 additions and 10 deletions

View File

@@ -0,0 +1,33 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendAddAgree.FriendAddAgreeReq;
import emu.nebula.proto.FriendAddAgree.FriendAddAgreeResp;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_add_agree_req)
public class HandlerFriendAddAgreeReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = FriendAddAgreeReq.parseFrom(message);
// Handle friend request
var target = session.getPlayer().getFriendList().handleFriendRequest((int) req.getUId(), true);
if (target == null) {
return session.encodeMsg(NetMsgId.friend_add_agree_failed_ack);
}
// Build response
var rsp = FriendAddAgreeResp.newInstance()
.setFriend(target.getFriendProto());
// Encode and send
return session.encodeMsg(NetMsgId.friend_add_agree_succeed_ack, rsp);
}
}

View File

@@ -0,0 +1,25 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendAdd.FriendAddReq;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_add_req)
public class HandlerFriendAddReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = FriendAddReq.parseFrom(message);
int uid = (int) req.getUId();
// Send friend request
boolean success = session.getPlayer().getFriendList().sendFriendRequest(uid);
// Encode and send
return session.encodeMsg(success ? NetMsgId.friend_add_succeed_ack : NetMsgId.friend_add_failed_ack);
}
}

View File

@@ -0,0 +1,35 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendAllAgree.FriendAllAgreeResp;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_all_agree_req)
public class HandlerFriendAllAgreeReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Agree to all friend requests
var results = session.getPlayer().getFriendList().acceptAll();
// Scuffed way of getting friend data
var proto = session.getPlayer().getFriendList().getCachedProto();
// Build response
var rsp = FriendAllAgreeResp.newInstance();
for (var f : results) {
rsp.addFriends(f.getFriendProto());
}
for (var i : proto.getInvites()) {
rsp.addInvites(i);
}
// Encode and send
return session.encodeMsg(NetMsgId.friend_all_agree_succeed_ack, rsp);
}
}

View File

@@ -0,0 +1,24 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendDelete.FriendDeleteReq;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_delete_req)
public class HandlerFriendDeleteReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = FriendDeleteReq.parseFrom(message);
// Delete friend
boolean success = session.getPlayer().getFriendList().deleteFriend((int) req.getUId());
// Encode and send
return session.encodeMsg(success ? NetMsgId.friend_delete_succeed_ack : NetMsgId.friend_delete_failed_ack);
}
}

View File

@@ -0,0 +1,26 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendInvitesDelete.FriendInvitesDeleteReq;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_invites_delete_req)
public class HandlerFriendInvitesDeleteReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = FriendInvitesDeleteReq.parseFrom(message);
// Delete all invites
for (long uid : req.getMutableUIds()) {
session.getPlayer().getFriendList().handleFriendRequest((int) uid, false);
}
// Encode and send
return session.encodeMsg(NetMsgId.friend_invites_delete_succeed_ack);
}
}

View File

@@ -2,7 +2,6 @@ package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendListGet.FriendListGetResp;
import emu.nebula.net.HandlerId;
import emu.nebula.net.GameSession;
@@ -11,8 +10,10 @@ public class HandlerFriendListGetReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
var rsp = FriendListGetResp.newInstance();
// Build response
var rsp = session.getPlayer().getFriendList().toProto();
// Encode and send
return session.encodeMsg(NetMsgId.friend_list_get_succeed_ack, rsp);
}

View File

@@ -0,0 +1,29 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendRecommendationGet.FriendRecommendationGetResp;
import emu.nebula.net.HandlerId;
import emu.nebula.Nebula;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_recommendation_get_req)
public class HandlerFriendRecommendationGetReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Build response
var rsp = FriendRecommendationGetResp.newInstance();
// Get players
var players = Nebula.getGameContext().getPlayerModule().getRandomPlayerList(session.getPlayer());
for (var player : players) {
rsp.addFriends(player.getFriendProto());
}
// Encode and send
return session.encodeMsg(NetMsgId.friend_recommendation_get_succeed_ack, rsp);
}
}

View File

@@ -0,0 +1,35 @@
package emu.nebula.server.handlers;
import emu.nebula.net.NetHandler;
import emu.nebula.net.NetMsgId;
import emu.nebula.proto.FriendUidSearch.FriendUIdSearchReq;
import emu.nebula.proto.FriendUidSearch.FriendUIdSearchResp;
import emu.nebula.net.HandlerId;
import emu.nebula.Nebula;
import emu.nebula.net.GameSession;
@HandlerId(NetMsgId.friend_uid_search_req)
public class HandlerFriendUidSearchReq extends NetHandler {
@Override
public byte[] handle(GameSession session, byte[] message) throws Exception {
// Parse request
var req = FriendUIdSearchReq.parseFrom(message);
int uid = (int) req.getId();
// Get target player
var target = Nebula.getGameContext().getPlayerModule().getPlayer(uid);
if (target == null) {
return session.encodeMsg(NetMsgId.friend_uid_search_failed_ack);
}
// Build response
var rsp = FriendUIdSearchResp.newInstance()
.setFriend(target.getFriendProto());
// Encode and send
return session.encodeMsg(NetMsgId.friend_uid_search_succeed_ack, rsp);
}
}