Files
Sun1602/Server/WorldServer/FriendInvitation/WFriendInvitationController.cpp
T
2022-10-26 12:25:11 +08:00

232 lines
8.5 KiB
C++

#include "StdAfx.h"
#include ".\wfriendinvitationcontroller.h"
#include "ServerSession.h"
#include "ServerSessionManager.h"
#include "UserManager.h"
#include "PacketStruct_DW.h"
#include "PacketStruct_AW.h"
#include "Handler_DW.h"
#include "Handler_CW.h"
WFriendInvitationController::WFriendInvitationController(void)
{
}
WFriendInvitationController::~WFriendInvitationController(void)
{
}
VOID WFriendInvitationController::OnAddInvitatedFriendCMD(LPVOID pServerSession, MSG_BASE * pMsg,
WORD wSize)
{
MSG_AW_FRIEND_INVITATIONR_INSERT_CMD* msg = (MSG_AW_FRIEND_INVITATIONR_INSERT_CMD*)pMsg;
SUNLOG(eDEV_LOG, "******************************************");
SUNLOG(eDEV_LOG, "OnFriendInvitationInsert Recv (%u)", msg->InvitateInfo.dwGuid);
SUNLOG(eDEV_LOG, "******************************************");
User* pUser = UserManager::Instance()->FindUserByCharGuid( msg->InvitateInfo.dwGuid );
if( pUser )// 내가 온라인 상태라면
{
//나에게 친구가 추가됐다고 알려준다.
MSG_DW_FRIEND_ADD_ACK MsgAdd;
MsgAdd.m_CharGuidFrom = msg->InvitateInfo.dwGuid;
MsgAdd.m_ToFriendInfo.dwFriendGuid = msg->InvitateInfo.dwFriendGuid;
MsgAdd.m_ToFriendInfo.sPacketInfo.bOnline = FALSE;
MsgAdd.m_ToFriendInfo.sPacketInfo.byChannel = 0;
MsgAdd.m_ToFriendInfo.sPacketInfo.byClass = msg->InvitateInfo.byClass;
MsgAdd.m_ToFriendInfo.sPacketInfo.Level = 1;
ZeroMemory(MsgAdd.m_ToFriendInfo.sPacketInfo.ptszFriendName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH);
memcpy( MsgAdd.m_ToFriendInfo.sPacketInfo.ptszFriendName, msg->InvitateInfo.ptszFriendName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH );
ServerSession *pGameDBProxy = ServerSessionManager::Instance()->GetGameDBProxy();
Handler_DW::OnDW_FRIEND_ADD_ACK( (GameDBProxySession*)pGameDBProxy, (MSG_BASE*)&MsgAdd, sizeof(MsgAdd));
pUser->GetFriendMap(User::FRIEND_INVIATE)->AddFriendInfo(&MsgAdd.m_ToFriendInfo);
//친구 추가 상태인지 알려준다.
INVITATEFRIENDLIST_INFO InvitateFriendList;
ListProc.GetInvitateFriendList(User::FRIEND_INVIATE, pUser, InvitateFriendList, msg->InvitateInfo.dwFriendGuid);
ListProc.SendInvitateFriendList(pUser, InvitateFriendList, INVITATEFRIENDLIST_INFO::FRIENDLIST_ADD, SEND_BOTH);
//쪽지가왔다고 알려준다. (다시 요청한다.)
MSG_CW_MEMO_LIST_REQ msgMemo;
Handler_CW::OnCW_MEMO_LIST_REQ(pUser, (MSG_BASE*)&msgMemo, sizeof(msgMemo));
}
}
VOID WFriendInvitationController::OnCharacterLevelUp(LPVOID pServerSession, MSG_BASE * pMsg,
WORD wSize)
{
if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent())
{
//SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!");
return;
}
MSG_AW_USER_LEVELUP_CMD* pRecvMsg = (MSG_AW_USER_LEVELUP_CMD*)pMsg;
User *pUser = UserManager::Instance()->FindUserByCharGuid( pRecvMsg->m_CharGuid );
if( !pUser )
{
SUNLOG( eCRITICAL_LOG, "CMD_AW_USER_LEVELUP_CMD Error - No Levelup User[CharGuid:%u]", pRecvMsg->m_CharGuid );
return;
}
switch(pRecvMsg->m_Level) //레벨 20, 40, 60, 80 달성시 선물 증정
{
case eINVITATION_REWARDSECTION_1:
case eINVITATION_REWARDSECTION_2:
case eINVITATION_REWARDSECTION_3:
case eINVITATION_REWARDSECTION_4:
LevelChangedProc.ChangedEventLevel(pUser, pRecvMsg->m_Level);
break;
}
}
VOID WFriendInvitationController::OnFriendRemove(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize)
{
if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent())
{
SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!");
return;
}
MSG_DW_FRIEND_DEL_ACK* pRecvMsg = (MSG_DW_FRIEND_DEL_ACK*)pMsg;
InviateFriendRemove(pRecvMsg->m_CharGuidFrom, pRecvMsg->m_CharGuidTo);
/*
User* pUser = UserManager::Instance()->FindUserByCharGuid( pRecvMsg->m_CharGuidFrom );
if( !pUser )
{
SUNLOG( eFULL_LOG, "[CharGuid:%u] FRIEND_DEL_ACK - Already Logout", pRecvMsg->m_CharGuidFrom );
return;
}
STRUCT_FRIEND_INFO* pFriendInfo = pUser->GetFriendMap()->FindFriend( pRecvMsg->m_CharGuidTo );
if( !pFriendInfo )
{
SUNLOG( eCRITICAL_LOG, "[%s/%u] FRIEND_DEL Error - Friend Already Deleted", pUser->GetCharName().c_str(), pRecvMsg->m_CharGuidTo );
return;
}
ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pUser, pFriendInfo->dwFriendGuid);
ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pUser, pFriendInfo->dwFriendGuid);
User *pFriendUser = UserManager::Instance()->FindUserByCharGuid( pFriendInfo->dwFriendGuid );
if( pFriendUser )
{
ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pFriendUser, pUser->GetCharGuid());
ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pFriendUser, pUser->GetCharGuid());
}
*/
}
VOID WFriendInvitationController::OnFriendBlock(LPVOID pServerSession, MSG_BASE * pMsg, WORD wSize)
{
if(!WFriendInvitationController::Instance()->CheckFriendInvitationEvent())
{
SUNLOG( eCRITICAL_LOG, "Friend Invitated Event Ended !!!");
return;
}
MSG_DW_FRIEND_BLOCK_ACK* pRecvMsg = (MSG_DW_FRIEND_BLOCK_ACK*)pMsg;
InviateFriendRemove(pRecvMsg->m_CharGuidFrom, pRecvMsg->m_BlockInfo.dwBlockGuid);
}
VOID WFriendInvitationController::InviateFriendRemove(CHARGUID CharacterGUIDFrom, CHARGUID CharacterGUIDTo)
{
User* pUser = UserManager::Instance()->FindUserByCharGuid( CharacterGUIDFrom );
if( !pUser )
{
SUNLOG( eFULL_LOG, "[CharGuid:%u] InviateFriendRemove - Already Logout", CharacterGUIDFrom );
return;
}
STRUCT_FRIEND_INFO* pFriendInfo = pUser->GetFriendMap()->FindFriend( CharacterGUIDTo );
if( !pFriendInfo )
{
SUNLOG( eCRITICAL_LOG, "[%s/%u] InviateFriendRemove Error - Friend Already Deleted", pUser->GetCharName().c_str(), CharacterGUIDTo );
return;
}
ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pUser, pFriendInfo->dwFriendGuid);
ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pUser, pFriendInfo->dwFriendGuid);
User *pFriendUser = UserManager::Instance()->FindUserByCharGuid( pFriendInfo->dwFriendGuid );
if( pFriendUser )
{
ListProc.RemoveInvitateFriend(User::FRIEND_INVIATE, pFriendUser, pUser->GetCharGuid());
ListProc.RemoveInvitateFriend(User::FRIEND_BEINVIATED, pFriendUser, pUser->GetCharGuid());
}
}
//디비에서 친구 목록 받기 성공
void WFriendInvitationController::OnAddFriend(STRUCT_FRIEND_INFO& sFriendInfo, STRUCT_FRIEND_DB_INFO& sFriendDBInfo, User* pUser)
{
CHECK_FRIENDINVITATION_EVENT_RETRUN;
if(sFriendDBInfo.Sts == STRUCT_FRIEND_DB_INFO::INFO_INVIAT)
{
//내가 추천한 친구가 이벤트 종료 레벨 이상이었는데도 일반 친구가 아니면 디비 정보가 잘못된거야
if(sFriendDBInfo.Level >= GetEventMaxLevel())
{
SUNLOG( eFULL_LOG,
"DW_FRIEND_GETLIST_ACK Error - Friend Invitation Reletion Code fail[InviatCharGuid:%u, BeInviatedCharGuid:%u]",
pUser->GetCharGuid(), sFriendDBInfo.dwFriendGuid);
}
else
{
pUser->GetFriendMap(User::FRIEND_INVIATE)->AddFriendInfo(&sFriendInfo);
}
}
else if(sFriendDBInfo.Sts == STRUCT_FRIEND_DB_INFO::INFO_BEINVIATED)
{
//내가 친구 추천을 받았는데 내가 이벤트 종료 레벨 이상이었는데도 일반 친구가 아니면 디비 정보가 잘못된거야
if(pUser->GetCharLevel() >= GetEventMaxLevel())
{
SUNLOG( eFULL_LOG,
"DW_FRIEND_GETLIST_ACK Error - Friend Invitation Reletion Code fail[InviatCharGuid:%u, BeInviatedCharGuid:%u]",
sFriendDBInfo.dwFriendGuid, pUser->GetCharGuid());
}
else
{
pUser->GetFriendMap(User::FRIEND_BEINVIATED)->AddFriendInfo(&sFriendInfo);
}
}
}
BYTE WFriendInvitationController::GetFriendSts(User* pUser, DWORD FriendGUID)
{
if(NULL != pUser->GetFriendMap(User::FRIEND_INVIATE)->FindFriend(FriendGUID)) return STRUCT_FRIEND_DB_INFO::INFO_INVIAT;
else if(NULL != pUser->GetFriendMap(User::FRIEND_BEINVIATED)->FindFriend(FriendGUID)) return STRUCT_FRIEND_DB_INFO::INFO_BEINVIATED;
return STRUCT_FRIEND_DB_INFO::INFO_FRIEND;
}
void WFriendInvitationController::SendInvitateFriendList(User* pUser, DWORD ServerType)
{
CHECK_FRIENDINVITATION_EVENT_RETRUN;
ListProc.SendInvitateFriendList(User::FRIEND_INVIATE, pUser, INVITATEFRIENDLIST_INFO::FRIENDLIST_INIT, ServerType);
ListProc.SendInvitateFriendList(User::FRIEND_BEINVIATED, pUser, INVITATEFRIENDLIST_INFO::FRIENDLIST_INIT, ServerType);
}