DragonNest/Server/ServerCommon/DNFriend.cpp

376 lines
10 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include "DNFriend.h"
#include "DNUserSendManager.h"
#include "DNWorldUserState.h"
#include "Log.h"
CDNFriend::CDNFriend(CDNUserSendManager * pManager)
{
m_pUserSendManager = pManager;
}
CDNFriend::~CDNFriend()
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
SAFE_DELETE((*ii));
}
bool CDNFriend::AddGroup(UINT nGroupDBID, const WCHAR * pGroupName)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
if ((*ii)->nGroupDBID == nGroupDBID)
return false;
TFriendGroup * pGroup = new TFriendGroup;
pGroup->nGroupDBID = nGroupDBID;
_wcscpy(pGroup->wszGroupName, _countof(pGroup->wszGroupName), pGroupName, (int)wcslen(pGroupName));
m_FriendGroupList.push_back(pGroup);
return true;
}
bool CDNFriend::DelGroup(UINT nGroupDBID)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
{
if ((*ii)->nGroupDBID == nGroupDBID)
{
TFriendGroup * pGroup = (*ii);
m_FriendGroupList.erase(ii);
std::vector <TFriend*>::iterator iter;
for (iter = m_FriendList.begin(); iter != m_FriendList.end(); iter++)
if ((*iter)->nGroupDBID == nGroupDBID)
{
(*iter)->nGroupDBID = 0;
memset((*iter)->wszGroupName, 0, sizeof((*iter)->wszGroupName));
}
SAFE_DELETE(pGroup);
return true;
}
}
return false;
}
bool CDNFriend::AddFriend(UINT nFriendAccountDBID, INT64 biFriendCharacterDBID, const WCHAR * pName, UINT nGroupID, bool bMobileAuthentication)
{
if (HasFriend(biFriendCharacterDBID) == true)
return false; //Already Have
ScopeLock <CSyncLock> lock(m_Sync);
TFriend * pFriend = new TFriend;
memset(pFriend, 0, sizeof(TFriend));
pFriend->nFriendAccountDBID = nFriendAccountDBID;
pFriend->biFriendCharacterDBID = biFriendCharacterDBID;
_wcscpy(pFriend->wszCharacterName, _countof(pFriend->wszCharacterName), pName, (int)wcslen(pName));
#ifdef PRE_ADD_DOORS
pFriend->bMobileAuthentication = bMobileAuthentication;
#endif //#ifdef PRE_ADD_DOORS
if (nGroupID > 0)
{
TFriendGroup * pGroup = GetGroupAsync(nGroupID);
if (pGroup != NULL)
{
_wcscpy(pFriend->wszGroupName, _countof(pFriend->wszGroupName), pGroup->wszGroupName, (int)wcslen( pGroup->wszGroupName));
pFriend->nGroupDBID = pGroup->nGroupDBID;
} else
{
//<2F>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>ϴ¤<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ż<EFBFBD>
SAFE_DELETE(pFriend);
_DANGER_POINT();
return false;
}
}
m_FriendList.push_back(pFriend);
return true;
}
bool CDNFriend::DelFriend(INT64 biFriendCharacterDBID)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
{
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
{
TFriend * pFriend = (*ii);
m_FriendList.erase(ii);
SAFE_DELETE(pFriend);
return true;
}
}
return false;
}
INT64 CDNFriend::DelFriend(const WCHAR * pwszFriendCharacterName)
{
ScopeLock <CSyncLock> lock(m_Sync);
INT64 biCharacterDBID = 0;
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
{
if (!wcscmp((*ii)->wszCharacterName, pwszFriendCharacterName))
{
TFriend * pFriend = (*ii);
m_FriendList.erase(ii);
if (pFriend != NULL)
{
biCharacterDBID = pFriend->biFriendCharacterDBID;
SAFE_DELETE(pFriend);
}
return biCharacterDBID;
}
}
return biCharacterDBID;
}
bool CDNFriend::UpdateFriend(INT64 biFriendCharacterDBID, UINT nGroupDBID, const WCHAR * pMemo)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
{
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
{
TFriendGroup * pGroup = NULL;
if (nGroupDBID > 0)
pGroup = GetGroupAsync(nGroupDBID);
if (pGroup != NULL)
{
_wcscpy((*ii)->wszGroupName, _countof((*ii)->wszGroupName), pGroup->wszGroupName, (int)wcslen(pGroup->wszGroupName));
(*ii)->nGroupDBID = nGroupDBID;
}
else
{
memset((*ii)->wszGroupName, 0, sizeof((*ii)->wszGroupName));
(*ii)->nGroupDBID = 0;
}
if (pMemo != NULL && pMemo[0] != '\0' && pMemo[0] != 0)
_wcscpy((*ii)->wszFriendMemo, _countof((*ii)->wszFriendMemo), pMemo, (int)wcslen(pMemo));
return true;
}
}
return false;
}
bool CDNFriend::UpdateGroup(UINT nGroupDBID, const WCHAR * pGroupName)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
{
if ((*ii)->nGroupDBID == nGroupDBID)
{
_wcscpy((*ii)->wszGroupName, _countof((*ii)->wszGroupName), pGroupName, (int)wcslen(pGroupName));
return true;
}
}
return false;
}
void CDNFriend::SendFriendList()
{
{
SCFriendGroupList packet;
memset(&packet, 0, sizeof(packet));
int nSize = 0;
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
{
packet.nGroupDBID[packet.cGroupCount] = (*ii)->nGroupDBID;
if( (*ii)->wszGroupName[0] > 0 )
{
size_t len = wcslen( (*ii)->wszGroupName );
if( len > FRIEND_GROUP_NAMELENMAX )
{
_DANGER_POINT();
return;
}
packet.cGroupNameLen[packet.cGroupCount] = (BYTE)wcslen((*ii)->wszGroupName);
wmemcpy_s( packet.wszBuf + nSize, _countof(packet.wszBuf)-nSize, (*ii)->wszGroupName, packet.cGroupNameLen[packet.cGroupCount]);
}
else
{
packet.cGroupNameLen[packet.cGroupCount] = 0;
}
nSize += packet.cGroupNameLen[packet.cGroupCount];
packet.cGroupCount++;
if (packet.cGroupCount >= FRIEND_GROUP_MAX)
break;
}
}
m_pUserSendManager->SendFriendGroupList(&packet, nSize);
}
{
SCFriendList packet;
memset(&packet, 0, sizeof(packet));
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD> <20><> <20>ʹ<EFBFBD> <20>̻ڰ<CCBB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20>־
if ((*ii) == NULL) continue;
sWorldUserState State;
if (g_pWorldUserState->GetUserState((*ii)->wszCharacterName, (*ii)->biFriendCharacterDBID, &State))
{
packet.Info[packet.cCount].Location.cServerLocation = State.nLocationState;
packet.Info[packet.cCount].Location.nChannelID = State.nLocationState == _LOCATION_VILLAGE ? State.nChannelID : -1;
packet.Info[packet.cCount].Location.nMapIdx = State.nMapIdx;
}
else
packet.Info[packet.cCount].Location.cServerLocation = _LOCATION_NONE;
packet.Info[packet.cCount].biFriendCharacterDBID = (*ii)->biFriendCharacterDBID;
packet.Info[packet.cCount].nGroupDBID = (*ii)->nGroupDBID;
_wcscpy(packet.Info[packet.cCount].wszFriendName, _countof(packet.Info[packet.cCount].wszFriendName), (*ii)->wszCharacterName, (int)wcslen((*ii)->wszCharacterName));
packet.cCount++;
if (packet.cCount >= FRIEND_MAXCOUNT)
break;
}
}
m_pUserSendManager->SendFriendList(&packet);
}
}
void CDNFriend::SendFriendLocation()
{
ScopeLock <CSyncLock> lock(m_Sync);
SCFriendLocationList packet; //SC_FRIEND / SC_FRIEND_LOCATIONLIST
memset(&packet, 0, sizeof(packet));
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
{
sWorldUserState State;
if (g_pWorldUserState->GetUserState((*ii)->wszCharacterName, (*ii)->biFriendCharacterDBID, &State))
{
packet.FriendLocation[packet.cCount].Location.cServerLocation = State.nLocationState;
packet.FriendLocation[packet.cCount].Location.nChannelID = State.nLocationState == _LOCATION_VILLAGE ? State.nChannelID : -1;
packet.FriendLocation[packet.cCount].Location.nMapIdx = State.nMapIdx;
}
else
packet.FriendLocation[packet.cCount].Location.cServerLocation = _LOCATION_NONE;
packet.FriendLocation[packet.cCount].nGroupDBID = (*ii)->nGroupDBID;
packet.FriendLocation[packet.cCount].biFriendCharacterDBID = (*ii)->biFriendCharacterDBID;
packet.cCount++;
if (packet.cCount >= FRIEND_MAXCOUNT)
{
_DANGER_POINT();
break;
}
}
m_pUserSendManager->SendFriendLocationList(&packet);
}
bool CDNFriend::HasFriend(INT64 biFriendCharacterDBID)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
if ((*ii)->biFriendCharacterDBID == biFriendCharacterDBID)
return true;
return false;
}
bool CDNFriend::HasFriend(const WCHAR * pName)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
if (!__wcsicmp_l((*ii)->wszCharacterName, pName))
return true;
return false;
}
TFriendGroup * CDNFriend::GetGroup(UINT nGroupDBID)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
if ((*ii)->nGroupDBID == nGroupDBID)
return (*ii);
return NULL;
}
TFriendGroup * CDNFriend::GetGroup(const WCHAR * pName)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
if (!_wcsicmp((*ii)->wszGroupName, pName))
return (*ii);
return NULL;
}
TFriend * CDNFriend::GetFriend(INT64 biFriendCharDBID)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
if ((*ii)->biFriendCharacterDBID == biFriendCharDBID)
return (*ii);
return NULL;
}
TFriend * CDNFriend::GetFriend(const WCHAR * pName)
{
ScopeLock <CSyncLock> lock(m_Sync);
std::vector <TFriend*>::iterator ii;
for (ii = m_FriendList.begin(); ii != m_FriendList.end(); ii++)
if (!__wcsicmp_l((*ii)->wszCharacterName, pName))
return (*ii);
return NULL;
}
TFriendGroup * CDNFriend::GetGroupAsync(UINT nGroupDBID)
{
std::vector <TFriendGroup*>::iterator ii;
for (ii = m_FriendGroupList.begin(); ii != m_FriendGroupList.end(); ii++)
if ((*ii)->nGroupDBID == nGroupDBID)
return (*ii);
return NULL;
}