Files
Leviathan/Server/GameServer/Game/Db/DB_Friends.cpp
T
2026-06-01 12:46:52 +02:00

297 lines
8.7 KiB
C++

#include <oledberr.h>
#include <oledb.h>
#include <icrsint.h>
#include <toolkit/XConsole.h>
#include "ErrorCode/ErrorCode.h"
#include "DB_Commands.h"
#include "GameMessage.h"
#include "SendMessage.h"
#include "StructPlayer.h"
DB_InsertFriend::DB_InsertFriend( const char *szFriendID, bool bIsDenial, struct StructPlayer * pPlayer )
: DBProc( "DB_InsertFriend", true ),
m_strOwnerID( pPlayer->GetName() ),
m_strFriendID( szFriendID ),
m_bIsDenial( bIsDenial ),
m_pPlayer( pPlayer )
{
}
bool DB_InsertFriend::onProcess( DBConnection & db )
{
try
{
char pszResult[64] = "";
do
{
// 대상이 유효한 캐릭터 이름인지 검사해야 함
{
_CommandPtr cmd;
if( db.CreateCommand( cmd ) == false ) throw XException( "DB_InsertFriend : CreateInstance(command) error" );
cmd->CommandType = adCmdStoredProc;
cmd->CommandText = _bstr_t( "dbo.smp_read_guild_party_id" );
// Store the name of current stored-procedure for debugging
szStoredProcedureName = "dbo.smp_read_guild_party_id";
cmd->Parameters->Append( cmd->CreateParameter( "IN_NAME", adBSTR, adParamInput, m_strFriendID.length(), m_strFriendID ) );
cmd->Parameters->Append( cmd->CreateParameter( "OUT_SID", adInteger, adParamOutput, 4, 0 ) );
cmd->Parameters->Append( cmd->CreateParameter( "OUT_GUILDID", adInteger, adParamOutput, 4, 0 ) );
cmd->Parameters->Append( cmd->CreateParameter( "OUT_PARTYID", adInteger, adParamOutput, 4, 0 ) );
cmd->Execute( NULL, NULL, adCmdStoredProc );
int nSID = cmd->Parameters->Item[ "OUT_SID" ]->Value.intVal;
// 대상 캐릭터가 존재하지 않을 때
if( !nSID )
{
s_sprintf( pszResult, _countof( pszResult ), "@481" ); // 존재하지 않는 캐릭터입니다.
break;
}
}
{
_CommandPtr cmd;
if( db.CreateCommand( cmd ) == false ) throw XException( "DB_InsertFriend : CreateInstance(command) error" );
cmd->CommandType = adCmdStoredProc;
const char * pszParamName = NULL;
if( m_bIsDenial )
{
if( !m_pPlayer->addDenial( m_strFriendID ) )
{
s_sprintf( pszResult, _countof( pszResult ), "@473\v#@denial_name@#\v%s", (const char *) m_strFriendID ); // XXXX 님은 이미 차단되어 있습니다.
break;
}
SendDenialsList( m_pPlayer );
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
(*itTarget)->AddDenialOf( m_pPlayer->GetName() );
if( m_pPlayer->IsFriendOf( m_strFriendID ) )
{
SendStatusMessageToFriendOfPlayer( m_pPlayer, (*itTarget), false );
}
}
cmd->CommandText = _bstr_t( "dbo.smp_insert_denial" );
// Store the name of current stored-procedure for debugging
szStoredProcedureName = "dbo.smp_insert_denial";
pszParamName = "IN_DENIAL_ID";
s_sprintf( pszResult, _countof( pszResult ), "@472\v#@denial_name@#\v%s", (const char *) m_strFriendID ); // XXXX 님이 차단되었습니다.
}
else
{
if( !m_pPlayer->addFriend( m_strFriendID ) )
{
s_sprintf( pszResult, _countof( pszResult ), "@469\v#@friend_name@#\v%s", (const char *) m_strFriendID ); // XXXX 님은 이미 친구로 등록되어 있습니다.
break;
}
cmd->CommandText = _bstr_t( "dbo.smp_insert_friend" );
// Store the name of current stored-procedure for debugging
szStoredProcedureName = "dbo.smp_insert_friend";
pszParamName = "IN_FRIEND_ID";
SendFriendsList( m_pPlayer );
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
(*itTarget)->AddFriendOf( m_pPlayer->GetName() );
}
s_sprintf( pszResult, _countof( pszResult ), "@467\v#@friend_name@#\v%s", (const char *) m_strFriendID ); // XXXX 님이 친구로 추가되었습니다.
}
cmd->Parameters->Append( cmd->CreateParameter( "IN_OWNER_ID", adBSTR, adParamInput, m_strOwnerID.length(), m_strOwnerID ) );
cmd->Parameters->Append( cmd->CreateParameter( pszParamName, adBSTR, adParamInput, m_strFriendID.length(), m_strFriendID ) );
cmd->Execute(NULL, NULL,adCmdStoredProc);
}
} while( false );
if( pszResult[0] )
SendChatMessage( false, CHAT_FRIEND, "@FRIEND", m_pPlayer, pszResult );
m_pPlayer->onEndQuery();
}
catch( ... )
{
throw;
}
return true;
}
void DB_InsertFriend::onFail( const _com_error & exception )
{
std::string strMessage( GameContent::GetString( 103 ) );
strMessage += "(4)";
SendChatMessage( false, CHAT_FRIEND, "@FRIEND", m_pPlayer, strMessage.c_str() );
// 메모리에 친구/차단 등록은 완료되고 DB 처리 실패했을 경우를 대비해서 메모리상의 친구/차단 목록에서 제거
// DelDenial / DelFriend 함수에서 이미 삭제된 사람이면 처리 안 함
if( m_bIsDenial )
{
m_pPlayer->DelDenial( m_strFriendID );
}
else
{
m_pPlayer->DelFriend( m_strFriendID );
}
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
// DelDenialOf / DelFriendOf 함수에서 이미 삭제된 사람이면 처리 안 함
if( m_bIsDenial )
{
(*itTarget)->DelDenialOf( m_pPlayer->GetName() );
}
else
{
(*itTarget)->DelFriendOf( m_pPlayer->GetName() );
}
}
m_pPlayer->onEndQuery();
}
DB_DeleteFriend::DB_DeleteFriend( const char * szOwnerID, const char *szFriendID, bool bIsDenial, struct StructPlayer * pPlayer )
: DBProc( "DB_DeleteFriend", true ),
m_strOwnerID( szOwnerID ),
m_strFriendID( szFriendID ),
m_bIsDenial( bIsDenial ),
m_pPlayer( pPlayer )
{
}
bool DB_DeleteFriend::onProcess( DBConnection & db )
{
try
{
_CommandPtr cmd;
if( db.CreateCommand( cmd ) == false ) throw XException( "DB_InsertFriend : CreateInstance(command) error" );
cmd->CommandType = adCmdStoredProc;
if( m_bIsDenial )
{
cmd->CommandText = _bstr_t( "dbo.smp_delete_denial" );
// Store the name of current stored-procedure for debugging
szStoredProcedureName = "dbo.smp_delete_denial";
}
else
{
cmd->CommandText = _bstr_t( "dbo.smp_delete_friend" );
// Store the name of current stored-procedure for debugging
szStoredProcedureName = "dbo.smp_delete_friend";
}
cmd->Parameters->Append( cmd->CreateParameter( "IN_OWNER_ID", adBSTR, adParamInput, m_strOwnerID.length(), m_strOwnerID ) );
cmd->Parameters->Append( cmd->CreateParameter( "IN_FRIEND_ID", adBSTR, adParamInput, m_strFriendID.length(), m_strFriendID ) );
cmd->Execute(NULL, NULL,adCmdStoredProc);
m_pPlayer->onEndQuery();
}
catch( ... )
{
throw;
}
const char * pszResult = NULL;
if( m_bIsDenial )
{
m_pPlayer->delDenial( m_strFriendID );
SendDenialsList( m_pPlayer );
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
(*itTarget)->DelDenialOf( m_pPlayer->GetName() );
if( m_pPlayer->IsFriendOf( m_strFriendID ) )
{
SendStatusMessageToFriendOfPlayer( m_pPlayer, (*itTarget), true );
}
}
pszResult = "@474\v#@denial_name@#\v%s"; // XXXX 님이 차단 목록에서 삭제되었습니다.
}
else
{
m_pPlayer->delFriend( m_strFriendID );
SendFriendsList( m_pPlayer );
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
(*itTarget)->DelFriendOf( m_pPlayer->GetName() );
}
pszResult = "@470\v#@friend_name@#\v%s"; // XXXX 님이 친구 목록에서 삭제되었습니다.
}
PrintfChatMessage( false, CHAT_FRIEND, "@FRIEND", m_pPlayer, pszResult, static_cast< const char * >( m_strFriendID ) );
return true;
}
void DB_DeleteFriend::onFail( const _com_error & exception )
{
std::string strMessage( GameContent::GetString( 103 ) );
strMessage += "(5)";
SendChatMessage( false, CHAT_FRIEND, "@FRIEND", m_pPlayer, strMessage.c_str() );
// 메모리에 친구/차단 삭제는 완료되고 DB 처리 실패했을 경우를 대비해서 메모리상의 친구/차단 목록에 다시 추가
// addDenial / addFriend 함수에서 이미 등록된 사람이면 처리 안 함
if( m_bIsDenial )
{
m_pPlayer->addDenial( m_strFriendID );
}
else
{
m_pPlayer->addFriend( m_strFriendID );
}
AR_HANDLE hTarget = StructPlayer::FindPlayer( m_strFriendID );
StructPlayer::iterator itTarget = StructPlayer::get( hTarget );
if( *itTarget )
{
// AddDenialOf / AddFriendOf 함수에서 이미 등록된 사람이면 처리 안 함
if( m_bIsDenial )
{
(*itTarget)->AddDenialOf( m_pPlayer->GetName() );
}
else
{
(*itTarget)->AddFriendOf( m_pPlayer->GetName() );
}
}
m_pPlayer->onEndQuery();
}