282 lines
No EOL
8.3 KiB
C++
282 lines
No EOL
8.3 KiB
C++
#include "Stdafx.h"
|
|
#include "DNUserSession.h"
|
|
#include "DNMasterConnection.h"
|
|
#include "DNPrivateChatChannel.h"
|
|
#if defined(_VILLAGESERVER)
|
|
#include "DNUserSessionManager.h"
|
|
#endif
|
|
|
|
#if defined( PRE_PRIVATECHAT_CHANNEL )
|
|
|
|
CDNPrivateChaChannel::CDNPrivateChaChannel()
|
|
{
|
|
m_bLoad = false;
|
|
m_ChannelInfo.nPrivateChatChannelID = 0;
|
|
memset(m_ChannelInfo.wszName, 0, sizeof(WCHAR)*PrivateChatChannel::Common::MaxNameLen);
|
|
m_ChannelInfo.biMasterCharacterDBID = 0;
|
|
m_ChannelInfo.nPassWord = 0;
|
|
m_ChannelInfo.nMemberCount = 0;
|
|
|
|
m_mJoinMembers.clear();
|
|
}
|
|
CDNPrivateChaChannel::~CDNPrivateChaChannel()
|
|
{
|
|
};
|
|
|
|
void CDNPrivateChaChannel::SetPrivateChannelInfo( const TPrivateChatChannelInfo &ChannelInfo )
|
|
{
|
|
m_ChannelInfo.nPrivateChatChannelID = ChannelInfo.nPrivateChatChannelID;
|
|
_wcscpy(m_ChannelInfo.wszName, _countof(m_ChannelInfo.wszName), ChannelInfo.wszName, (int)wcslen(ChannelInfo.wszName));
|
|
m_ChannelInfo.biMasterCharacterDBID = ChannelInfo.biMasterCharacterDBID;
|
|
m_ChannelInfo.nPassWord = ChannelInfo.nPassWord;
|
|
}
|
|
|
|
void CDNPrivateChaChannel::AddPrivateChannelMember(const TPrivateChatChannelMember &Member )
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
if(Member.bMaster)
|
|
{
|
|
m_ChannelInfo.biMasterCharacterDBID = Member.biCharacterDBID;
|
|
}
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
CDNUserSession* pSession = NULL;
|
|
for(std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.begin(); itor != m_mJoinMembers.end();itor++)
|
|
{
|
|
pSession = g_pUserSessionManager->FindUserSessionByAccountDBID( itor->second.nAccountDBID );
|
|
if(pSession)
|
|
pSession->SendPrivateChatChannelMemberAdd( ERROR_NONE, Member );
|
|
|
|
}
|
|
#endif
|
|
m_mJoinMembers.insert(std::make_pair(Member.biCharacterDBID, Member));
|
|
}
|
|
|
|
void CDNPrivateChaChannel::DelPrivateChannelMember( PrivateChatChannel::Common::eModType eType, INT64 biCharacterDBID )
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
TPrivateChatChannelMember Member;
|
|
memset(&Member, 0, sizeof(Member));
|
|
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator ii = m_mJoinMembers.find(biCharacterDBID);
|
|
if(ii != m_mJoinMembers.end() )
|
|
{
|
|
Member = ii->second;
|
|
m_mJoinMembers.erase(ii);
|
|
}
|
|
else
|
|
{
|
|
g_Log.Log(LogType::_ERROR, L"DelPrivateChannelMember m_mJoinMembers not Exist Member\r\n");
|
|
return;
|
|
}
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
CDNUserSession* pSession = NULL;
|
|
|
|
int nSubCmd = ePrivateChatChannel::SC_PRIVATECHAT_CHANNEL_DEL;
|
|
|
|
if(eType == PrivateChatChannel::Common::KickMember)
|
|
{
|
|
nSubCmd = ePrivateChatChannel::SC_PRIVATECHAT_CHANNEL_KICK;
|
|
}
|
|
|
|
for(std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.begin(); itor != m_mJoinMembers.end();itor++)
|
|
{
|
|
pSession = g_pUserSessionManager->FindUserSessionByAccountDBID( itor->second.nAccountDBID );
|
|
if(pSession)
|
|
{
|
|
if(eType == PrivateChatChannel::Common::KickMember)
|
|
pSession->SendPrivateChatChannelMemberKick(ERROR_NONE, Member.biCharacterDBID, Member.wszCharacterName);
|
|
else
|
|
pSession->SendPrivateChatChannelMemberDel(ERROR_NONE, Member.biCharacterDBID, Member.wszCharacterName);
|
|
}
|
|
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void CDNPrivateChaChannel::ModPrivateChannelInfo( PrivateChatChannel::Common::eModType eType, int nPassWord, INT64 biMasterCharacterID )
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
WCHAR wszName[NAMELENMAX];
|
|
memset(wszName, 0, sizeof(wszName));
|
|
|
|
if( eType == PrivateChatChannel::Common::ChangeMaster )
|
|
{
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(m_ChannelInfo.biMasterCharacterDBID);
|
|
if( itor != m_mJoinMembers.end() )
|
|
{
|
|
itor->second.bMaster = false;
|
|
}
|
|
if(biMasterCharacterID == 0)
|
|
m_ChannelInfo.biMasterCharacterDBID = biMasterCharacterID;
|
|
else
|
|
{
|
|
itor = m_mJoinMembers.find(biMasterCharacterID);
|
|
if( itor != m_mJoinMembers.end() )
|
|
{
|
|
itor->second.bMaster = true;
|
|
m_ChannelInfo.biMasterCharacterDBID = biMasterCharacterID;
|
|
}
|
|
}
|
|
}
|
|
else if( eType == PrivateChatChannel::Common::ChangePassWord )
|
|
{
|
|
m_ChannelInfo.nPassWord = nPassWord;
|
|
}
|
|
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(biMasterCharacterID);
|
|
if( itor != m_mJoinMembers.end() )
|
|
{
|
|
_wcscpy(wszName, _countof(wszName), itor->second.wszCharacterName, (int)wcslen(itor->second.wszCharacterName));
|
|
}
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
CDNUserSession* pSession = NULL;
|
|
for(std::map<INT64,TPrivateChatChannelMember>::iterator itor1 = m_mJoinMembers.begin(); itor1 != m_mJoinMembers.end();itor1++)
|
|
{
|
|
pSession = g_pUserSessionManager->FindUserSessionByAccountDBID( itor1->second.nAccountDBID );
|
|
if(pSession)
|
|
{
|
|
pSession->SendPrivateChatChannelInfoMod( ERROR_NONE, eType, wszName, biMasterCharacterID );
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void CDNPrivateChaChannel::ModPrivateChannelMemberName( INT64 biCharacterDBID, WCHAR* wszName )
|
|
{
|
|
if(!wszName)
|
|
return;
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(biCharacterDBID);
|
|
if( itor != m_mJoinMembers.end() )
|
|
{
|
|
_wcscpy(itor->second.wszCharacterName, _countof(itor->second.wszCharacterName), wszName, (int)wcslen(wszName));
|
|
}
|
|
else
|
|
return;
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
CDNUserSession* pSession = NULL;
|
|
for(std::map<INT64,TPrivateChatChannelMember>::iterator itor1 = m_mJoinMembers.begin(); itor1 != m_mJoinMembers.end();itor1++)
|
|
{
|
|
pSession = g_pUserSessionManager->FindUserSessionByAccountDBID( itor1->second.nAccountDBID );
|
|
if(pSession)
|
|
pSession->SendPrivateChatChannelMemberAdd( ERROR_NONE, itor->second );
|
|
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void CDNPrivateChaChannel::GetPrivateChannelMember( std::list<TPrivateChatChannelMember> &MemberList )
|
|
{
|
|
if(m_mJoinMembers.empty())
|
|
return;
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
for (std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.begin(); itor != m_mJoinMembers.end(); itor++)
|
|
{
|
|
MemberList.push_back((*itor).second);
|
|
}
|
|
}
|
|
|
|
TPrivateChatChannelMember CDNPrivateChaChannel::GetPrivateChannelMember( INT64 biCharacterDBID )
|
|
{
|
|
TPrivateChatChannelMember Member;
|
|
memset(&Member, 0, sizeof(Member));
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
if(m_mJoinMembers.empty())
|
|
return Member;
|
|
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(biCharacterDBID);
|
|
if(itor != m_mJoinMembers.end())
|
|
{
|
|
Member = itor->second;
|
|
}
|
|
return Member;
|
|
}
|
|
|
|
bool CDNPrivateChaChannel::CheckPrivateChannelMember( INT64 biCharacterDBID )
|
|
{
|
|
if(biCharacterDBID <= 0)
|
|
return false;
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
if(m_mJoinMembers.empty())
|
|
return false;
|
|
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(biCharacterDBID);
|
|
if(itor != m_mJoinMembers.end())
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void CDNPrivateChaChannel::SetPrivateChannelMemberAccountDBID(UINT nAccountDBID, INT64 biCharacterDBID)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
if(m_mJoinMembers.empty())
|
|
return;
|
|
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(biCharacterDBID);
|
|
if(itor != m_mJoinMembers.end())
|
|
{
|
|
(*itor).second.nAccountDBID = nAccountDBID;
|
|
}
|
|
}
|
|
|
|
TPrivateChatChannelMember CDNPrivateChaChannel::GetPrivateChannelMember( WCHAR* wszName )
|
|
{
|
|
TPrivateChatChannelMember Member;
|
|
memset(&Member, 0, sizeof(Member));
|
|
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
if(m_mJoinMembers.empty())
|
|
return Member;
|
|
|
|
for (std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.begin(); itor != m_mJoinMembers.end(); itor++)
|
|
{
|
|
if (wcscmp(itor->second.wszCharacterName, wszName) == 0)
|
|
{
|
|
Member = itor->second;
|
|
break;
|
|
}
|
|
}
|
|
return Member;
|
|
}
|
|
|
|
void CDNPrivateChaChannel::GetMasterCharacterName(WCHAR *MasterName)
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.find(m_ChannelInfo.biMasterCharacterDBID);
|
|
|
|
if( itor != m_mJoinMembers.end() )
|
|
{
|
|
_wcscpy(MasterName, NAMELENMAX, itor->second.wszCharacterName, (int)wcslen(itor->second.wszCharacterName));
|
|
}
|
|
}
|
|
|
|
INT64 CDNPrivateChaChannel::GetNextMasterCharacterDBID()
|
|
{
|
|
ScopeLock <CSyncLock> Lock(m_Sync);
|
|
|
|
if(m_mJoinMembers.empty())
|
|
return 0;
|
|
INT64 biMasterCharacterDBID = 0;
|
|
time_t tJoinDate = 0;
|
|
|
|
for (std::map<INT64,TPrivateChatChannelMember>::iterator itor = m_mJoinMembers.begin(); itor != m_mJoinMembers.end(); itor++)
|
|
{
|
|
if( !itor->second.bMaster && (tJoinDate == 0 || tJoinDate > itor->second.tJoinDate) )
|
|
{
|
|
biMasterCharacterDBID = itor->second.biCharacterDBID;
|
|
tJoinDate = itor->second.tJoinDate;
|
|
}
|
|
}
|
|
return biMasterCharacterDBID;
|
|
}
|
|
#endif |