删除好友,查找好友

back_recharge
gaojie 2019-06-11 14:21:31 +08:00
parent 8c3b106e06
commit bb80506568
10 changed files with 364 additions and 44 deletions

View File

@ -48,5 +48,7 @@ public interface BIReason {
int RECHARGE_REWARD = 31;
int FRIEND_GIVE = 32; //好友赠送
}

View File

@ -22,4 +22,7 @@ public interface GlobalItemType {
int NO_USE = 0 ; //不使用
int RANDOM_USE = 1; // 随机使用
//道具id
int STAMINA = 2; // 精力
}

View File

@ -0,0 +1,27 @@
package com.ljsd.jieling.handler.friend;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.friend.FriendLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DelFriendHandler extends BaseHandler {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.DEL_FRIEND_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
PlayerInfoProto.DelFriendRequest delFriendRequest = PlayerInfoProto.DelFriendRequest.parseFrom(netData.parseClientProtoNetData());
int friendId = delFriendRequest.getFriendId();
FriendLogic.getInstance().delFriend(iSession,friendId);
}
}

View File

@ -0,0 +1,28 @@
package com.ljsd.jieling.handler.friend;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.friend.FriendLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class FriendGivePresentRequestHandler extends BaseHandler {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.FRIEND_GIVE_PRESENT_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
PlayerInfoProto.FriendGivePresentRequest friendGivePresentRequest = PlayerInfoProto.FriendGivePresentRequest.parseFrom(netData.parseClientProtoNetData());
int friendId = friendGivePresentRequest.getFriendId();
int type = friendGivePresentRequest.getType();
FriendLogic.getInstance().givePresent(iSession,friendId,type);
}
}

View File

@ -0,0 +1,27 @@
package com.ljsd.jieling.handler.friend;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.friend.FriendLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class FriendSearchRequestHandler extends BaseHandler {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.FRIEND_INVITE_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
PlayerInfoProto.FriendSearchRequest friendSearchRequest = PlayerInfoProto.FriendSearchRequest.parseFrom(netData.parseClientProtoNetData());
String name = friendSearchRequest.getName();
FriendLogic.getInstance().getOneFriend(iSession,name);
}
}

View File

@ -0,0 +1,26 @@
package com.ljsd.jieling.handler.friend;
import com.ljsd.jieling.handler.BaseHandler;
import com.ljsd.jieling.logic.friend.FriendLogic;
import com.ljsd.jieling.netty.cocdex.PacketNetData;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import org.springframework.stereotype.Component;
@Component
public class FriendTakeHeartRequestHandler extends BaseHandler {
@Override
public MessageTypeProto.MessageType getMessageCode() {
return MessageTypeProto.MessageType.FRIEND_TAKE_HEART_REQUEST;
}
@Override
public void process(ISession iSession, PacketNetData netData) throws Exception {
PlayerInfoProto.FriendTakeHeartRequest friendTakeHeartRequest = PlayerInfoProto.FriendTakeHeartRequest.parseFrom(netData.parseClientProtoNetData());
int friendId = friendTakeHeartRequest.getFriendId();
int type = friendTakeHeartRequest.getType();
FriendLogic.getInstance().takeHeart(iSession,friendId,type);
}
}

View File

@ -4,7 +4,8 @@ import com.google.common.collect.Sets;
import com.ljsd.common.mogodb.MongoBase;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
public class FriendManager extends MongoBase {
@ -12,7 +13,16 @@ public class FriendManager extends MongoBase {
private List<Integer> friends = new CopyOnWriteArrayList<>();
private List<Integer> applyFriends = new CopyOnWriteArrayList<>();; // 申请列表信息
private List<Integer> applyFriends = new CopyOnWriteArrayList<>(); // 申请列表信息
//key: friendId value 状态 0:未赠送 1赠送过
private Map<Integer,Integer> giveMap = new ConcurrentHashMap<>();
//key: friendId value 状态 0: 不可领取 1:可以领取 2: 已领取
private Map<Integer,Integer> haveRewardMap = new ConcurrentHashMap<>();
public void delFriends(int friendId) {
this.friends.remove(friendId);
setFriends(this.friends);
}
public int getUid() {
return uid;
@ -39,4 +49,22 @@ public class FriendManager extends MongoBase {
public List<Integer> getApplyFriends() {
return applyFriends;
}
public Map<Integer, Integer> getGiveMap() {
return giveMap;
}
public void setGiveMap(Map<Integer, Integer> giveMap) {
updateString("giveMap", giveMap);
this.giveMap = giveMap;
}
public Map<Integer, Integer> getHaveRewardMap() {
return haveRewardMap;
}
public void setHaveRewardMap(Map<Integer, Integer> haveRewardMap) {
updateString("haveRewardMap", haveRewardMap);
this.haveRewardMap = haveRewardMap;
}
}

View File

@ -1,8 +0,0 @@
package com.ljsd.jieling.logic.dao;
public class RecommendFriend {
public int id; // 好友的id
public String name; // 名字
public int lv; // 等级
public int onLineTime;
}

View File

@ -1,18 +1,20 @@
package com.ljsd.jieling.logic.friend;
import com.google.common.collect.Sets;
import com.ljsd.jieling.db.mongo.MongoUtil;
import com.ljsd.jieling.db.redis.RedisKey;
import com.ljsd.jieling.db.redis.RedisUtil;
import com.ljsd.jieling.globals.BIReason;
import com.ljsd.jieling.globals.GlobalItemType;
import com.ljsd.jieling.logic.OnlineUserManager;
import com.ljsd.jieling.logic.dao.FriendManager;
import com.ljsd.jieling.logic.dao.PlayerManager;
import com.ljsd.jieling.logic.dao.RecommendFriend;
import com.ljsd.jieling.logic.dao.UserManager;
import com.ljsd.jieling.logic.dao.root.User;
import com.ljsd.jieling.network.session.ISession;
import com.ljsd.jieling.protocols.CommonProto;
import com.ljsd.jieling.protocols.MessageTypeProto;
import com.ljsd.jieling.protocols.PlayerInfoProto;
import com.ljsd.jieling.util.CBean2Proto;
import com.ljsd.jieling.util.MessageUtil;
import com.ljsd.jieling.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -64,40 +66,28 @@ public class FriendLogic {
FriendManager friendManager = user.getFriendManager();
int selectSize = 10;
Set<Integer> recommondIds = new HashSet<>();
List<RecommendFriend> friends = new CopyOnWriteArrayList<>();
long now = System.currentTimeMillis();
List<User> cUsers = MongoUtil.getInstence().getRandomUsers(selectSize, uid, playerInfoManager.getLevel());
if (cUsers != null){
for (User cUser1 : cUsers) {
int recommandId = Integer.parseInt(cUser1.getId());
PlayerManager playerInfoManager1 = cUser1.getPlayerInfoManager();
if (!checkIsAllowRecommandFriend(friendManager,playerInfoManager1, recommandId,recommondIds)){
continue;
}
int beforLoginTime = (int) ((now - playerInfoManager1.getOffLineTime()) / 1000);
if (!addRecommondFriend(friends, cUser1, Math.abs(beforLoginTime))) {
if (!checkIsAllowRecommandFriend(friendManager, recommandId,recommondIds)){
continue;
}
recommondIds.add(recommandId);
}
}
}
private boolean addRecommondFriend(List<RecommendFriend> friends, User cUser, int onLineTime) {
PlayerManager playerInfoManager = cUser.getPlayerInfoManager();
if (playerInfoManager == null){
return false;
List<CommonProto.Friend> friendList = new CopyOnWriteArrayList<>();
for (Integer commondUid : recommondIds){
CommonProto.Friend friend = CBean2Proto.getFriendInfo(commondUid);
friendList.add(friend);
}
RecommendFriend friend = new RecommendFriend();
friend.id = Integer.parseInt(cUser.getId());
friend.lv =playerInfoManager.getLevel();
friend.name= playerInfoManager.getNickName();
friend.onLineTime = onLineTime;
friends.add(friend);
return true;
PlayerInfoProto.GetFriendInfoResponse getFriendInfoResponse = PlayerInfoProto.GetFriendInfoResponse
.newBuilder().addAllFriends(friendList)
.build();
MessageUtil.sendMessage(iSession, 1, MessageTypeProto.MessageType.GET_FRIEND_INFO_REPONSE_VALUE, getFriendInfoResponse, true);
}
private boolean checkIsAllowRecommandFriend(FriendManager friendManager, PlayerManager playerInfoManager1,int commandUserId,Set<Integer> recommondIds ) {
private boolean checkIsAllowRecommandFriend(FriendManager friendManager,int commandUserId,Set<Integer> recommondIds ) {
List<Integer> friends = friendManager.getFriends();
if (friends.contains(commandUserId)){
return false;
@ -144,6 +134,7 @@ public class FriendLogic {
int uid = iSession.getUid();
if (inviteUidsList.size() ==0){
MessageUtil.sendErrorResponse(iSession,0,msgId,"没有申请的好友");
return;
}
User user = UserManager.getUser(uid);
List<Integer> friends = user.getFriendManager().getFriends();
@ -151,6 +142,7 @@ public class FriendLogic {
int maxApplyFriends = 10;
if (friends.size() >= maxFriends){
MessageUtil.sendErrorResponse(iSession,0,msgId,"好友已达上限");
return;
}
for (Integer inviteUid : inviteUidsList){
if (inviteUid == uid){
@ -175,11 +167,27 @@ public class FriendLogic {
if (applyFriends.size()>= maxApplyFriends){
applyFriends.remove(0);
}
sendFriendInfoIndication(inviteUid);
applyFriends.add(uid);
}
MessageUtil.sendMessage(iSession, 1, msgId, null, true);
}
/**
* 线
* @param inviteUid
*/
private void sendFriendInfoIndication(int inviteUid) throws Exception {
boolean isOnline = OnlineUserManager.checkUidOnline(inviteUid);
if (isOnline){
ISession session = OnlineUserManager.getSessionByUid(inviteUid);
PlayerInfoProto.sendFriendInfoIndication sendFriendInfoIndication = PlayerInfoProto.sendFriendInfoIndication.newBuilder()
.setFriends(CBean2Proto.getFriendInfo(inviteUid))
.build();
MessageUtil.sendMessage(session, 1, MessageTypeProto.MessageType.SEND_FRIEND_INFO_INDICATION_VALUE, sendFriendInfoIndication, true);
}
}
/**
*
* @param iSession
@ -200,17 +208,21 @@ public class FriendLogic {
case 1://同意
if (friends.size() >= maxFriends){
MessageUtil.sendErrorResponse(iSession,0,msgId,"好友已达上限");
return;
}
if (applyFriends.contains(friendId)){
applyFriends.remove(friendId);
}
friendUser = UserManager.getUser(friendId);
FriendManager friendfriendManager = friendUser.getFriendManager();
friendFriendList = friendUser.getFriendManager().getFriends();
if (friendFriendList.size() >=maxFriends){
MessageUtil.sendErrorResponse(iSession,0,msgId,"对方好友已达上限");
return;
}
friendFriendList.add(uid);
friends.add(friendId);
initFriendGriveAndRreward(friendId, uid, friendManager, friendfriendManager);
break;
case 2://拒绝
applyFriends = friendManager.getApplyFriends();
@ -219,7 +231,7 @@ public class FriendLogic {
}
break;
case 3://全部同意
allApplyFriend(friendId, uid, friends, applyFriends, maxFriends);
allApplyFriend(friendId, uid, friendManager, friends, applyFriends, maxFriends);
break;
case 4://全部拒绝
friendManager.setApplyFriends(new CopyOnWriteArrayList<>());
@ -228,20 +240,193 @@ public class FriendLogic {
MessageUtil.sendMessage(iSession, 1, msgId, null, true);
}
private void allApplyFriend(int friendId, int uid, List<Integer> friends, List<Integer> applyFriends, int maxFriends) throws Exception {
private void allApplyFriend(int friendId, int uid, FriendManager friendManager, List<Integer> friends, List<Integer> applyFriends, int maxFriends) throws Exception {
User friendUser;
FriendManager friendfriendManager;
List<Integer> friendFriendList;
for (Integer applyfriendId :applyFriends){
friendUser = UserManager.getUser(applyfriendId);
friendFriendList = friendUser.getFriendManager().getFriends();
friendfriendManager = friendUser.getFriendManager();
friendFriendList = friendfriendManager.getFriends();
if (friends.size() >= maxFriends){
continue;
continue;
}
if (friendFriendList.size() >= maxFriends){
continue;
}
friendFriendList.add(uid);
friends.add(friendId);
initFriendGriveAndRreward(friendId, uid, friendManager, friendfriendManager);
}
}
private void initFriendGriveAndRreward(int friendId, int uid, FriendManager friendManager, FriendManager friendfriendManager) {
friendfriendManager.getGiveMap().put(uid, 0);
friendfriendManager.getHaveRewardMap().put(uid, 0);
friendManager.getGiveMap().put(friendId, 0);
friendManager.getHaveRewardMap().put(friendId, 0);
}
/**
*
* @param iSession
* @param friendId
*/
public void delFriend(ISession iSession, int friendId) throws Exception {
int msgId = MessageTypeProto.MessageType.DEL_FRIEND_RESPONSE_VALUE;
int uid = iSession.getUid();
User user = UserManager.getUser(uid);
FriendManager friendManager = user.getFriendManager();
List<Integer> friends = friendManager.getFriends();
if (!friends.contains(friendId)){
MessageUtil.sendErrorResponse(iSession, 0, msgId, "你没有该好友");
return;
}
User friendUser = UserManager.getUser(friendId);
FriendManager friendManager1 = friendUser.getFriendManager();
friendManager1.delFriends(uid);
friendManager.delFriends(friendId);
sendFriendInfoIndication(friendId);
MessageUtil.sendMessage(iSession, 1, msgId, null, true);
}
/**
*
* @param iSession
* @param friendId
* @param type
*/
public void givePresent(ISession iSession, int friendId, int type) throws Exception {
int msgId = MessageTypeProto.MessageType.FRIEND_GIVE_PRESENT_RESPONSE_VALUE;
int uid = iSession.getUid();
User user = UserManager.getUser(uid);
FriendManager friendManager = user.getFriendManager();
List<Integer> friends = friendManager.getFriends();
Map<Integer, Integer> giveMap = friendManager.getGiveMap();
if (type == 1) {//赠送一个人
if (!friends.contains(friendId)) {
MessageUtil.sendErrorResponse(iSession, 0, msgId, "没有该好友");
return;
}
if (giveMap.get(friendId) == 1) {
MessageUtil.sendErrorResponse(iSession, 0, msgId, "已经赠送过");
return;
}
User friendUser = UserManager.getUser(friendId);
FriendManager friendManager1 = friendUser.getFriendManager();
Map<Integer, Integer> haveRewardMap = friendUser.getFriendManager().getHaveRewardMap();
if (haveRewardMap.get(friendId) != 0) {
MessageUtil.sendErrorResponse(iSession, 0, msgId, "已经赠送过");
return;
}
giveMap.put(friendId,1);
friendManager.setGiveMap(giveMap);
haveRewardMap.put(friendId,1);
friendManager1.setHaveRewardMap(haveRewardMap);
}else{ //赠送全部好友
for (Integer friendIds : friends) {
if (giveMap.get(friendId) == 1) {
continue;
}
User friendUser = UserManager.getUser(friendIds);
FriendManager friendManager1 = friendUser.getFriendManager();
Map<Integer, Integer> haveRewardMap = friendManager1.getHaveRewardMap();
if (haveRewardMap.get(friendId) != 0) {
continue;
}
giveMap.put(friendId,1);
friendManager.setGiveMap(giveMap);
haveRewardMap.put(friendId,1);
friendManager1.setHaveRewardMap(haveRewardMap);
}
}
MessageUtil.sendMessage(iSession, 1, msgId, null, true);
}
/**
*
* @param iSession
* @param friendId
* @param type
*/
public void takeHeart(ISession iSession, int friendId, int type) throws Exception {
int msgId = MessageTypeProto.MessageType.FRIEND_GIVE_PRESENT_RESPONSE_VALUE;
int uid = iSession.getUid();
User user = UserManager.getUser(uid);
FriendManager friendManager = user.getFriendManager();
List<Integer> friends = friendManager.getFriends();
Map<Integer, Integer> haveRewardMap = friendManager.getHaveRewardMap();
int itemNum = 0;
if (type ==1){ //领取一个人
if (!friends.contains(friendId)) {
MessageUtil.sendErrorResponse(iSession, 0, msgId, "没有该好友");
return;
}
if (haveRewardMap.get(friendId) !=1){
MessageUtil.sendErrorResponse(iSession, 0, msgId, "已领取赠礼");
return;
}
itemNum= 10;
haveRewardMap.put(friendId,2);
}else{
for (Integer friendIds : friends) {
if (haveRewardMap.get(friendId) != 1) {
continue;
}
User friendUser = UserManager.getUser(friendIds);
FriendManager friendManager1 = friendUser.getFriendManager();
haveRewardMap.put(friendId,2);
friendManager1.setHaveRewardMap(haveRewardMap);
itemNum += 10;
}
}
String reward = GlobalItemType.STAMINA +"#"+itemNum;
CommonProto.Drop.Builder drop = ItemUtil.drop(user, StringUtil.parseFiledInt2(reward), BIReason.FRIEND_GIVE);
PlayerInfoProto.FriendTakeHeartResponse friendTakeHeartResponse = PlayerInfoProto.FriendTakeHeartResponse
.newBuilder().setDrop(drop)
.build();
MessageUtil.sendMessage(iSession, 1, msgId, friendTakeHeartResponse, true);
}
/**
*
* @param iSession
* @param name
*/
public void getOneFriend(ISession iSession, String name) throws Exception {
int msgId = MessageTypeProto.MessageType.FRIEND_SEARCH_RESPONSE_VALUE;
int uid = iSession.getUid();
User user = UserManager.getUser(uid);
PlayerManager playerInfoManager = user.getPlayerInfoManager();
FriendManager friendManager = user.getFriendManager();
List<Integer> friends = friendManager.getFriends();
List<Integer> applyFriends = friendManager.getApplyFriends();
boolean result = ShieldedWordUtils.checkName( name);
if (!result) {
MessageUtil.sendErrorResponse(iSession, 0, msgId, "");
return;
}
if (playerInfoManager.getNickName().equals(name)){
MessageUtil.sendErrorResponse(iSession, 0, msgId, "不可以查找自己");
return;
}
String key = RedisKey.getKey(RedisKey.C_User_Name_Key, name, false);
Object friendId = RedisUtil.getInstence().get(key);
if (friendId == null){
MessageUtil.sendErrorResponse(iSession, 0, msgId, "该玩家不存在");
return;
}
int type = 1;
if (friends.contains(Integer.parseInt(friendId.toString()))){
type = 2;
}else if (applyFriends.contains(Integer.parseInt(friendId.toString()))){
type = 3;
}
PlayerInfoProto.FriendSearchResponse friendSearchResponse = PlayerInfoProto.FriendSearchResponse
.newBuilder()
.setType(type)
.setFriends(CBean2Proto.getFriendInfo((Integer) friendId))
.build();
MessageUtil.sendMessage(iSession, 1, msgId, friendSearchResponse, true);
}
}

View File

@ -249,16 +249,18 @@ public class CBean2Proto {
public static CommonProto.Friend getFriendInfo(int friendId) throws Exception {
User user = UserManager.getUser(friendId);
PlayerManager playerInfoManager = user.getPlayerInfoManager();
Map<Integer, Integer> giveMap = user.getFriendManager().getGiveMap();
Map<Integer, Integer> haveRewardMap = user.getFriendManager().getHaveRewardMap();
CommonProto.Friend.Builder friend = CommonProto.Friend.newBuilder();
friend.setId(Integer.parseInt(user.getId()));
friend.setName(playerInfoManager.getNickName());
friend.setLv(playerInfoManager.getLevel());
friend.setOffLineTime(playerInfoManager.getOffLineTime());
friend.setHaveReward(0);
friend.setHaveFriendPoint(1);
friend.setHaveReward(giveMap.get(friendId));
friend.setIsGive(haveRewardMap.get(friendId) ==2?0:haveRewardMap.get(friendId));
friend.setHead(playerInfoManager.getHead());
friend.setFrame(playerInfoManager.getFamilyId());
friend.setSoulVal(1000);
friend.setSoulVal(playerInfoManager.getMaxForce());
return friend.build();
}
}