mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-27 14:57:44 +00:00
transfer result handling to blmgr; more error checking; const correct;
This commit is contained in:
parent
7edc1ea486
commit
4a46e87641
5 changed files with 98 additions and 67 deletions
|
@ -18,19 +18,33 @@ using namespace Sapphire::Common;
|
||||||
using namespace Sapphire::Network::Packets;
|
using namespace Sapphire::Network::Packets;
|
||||||
using namespace Sapphire::Network::Packets::WorldPackets;
|
using namespace Sapphire::Network::Packets::WorldPackets;
|
||||||
|
|
||||||
bool Sapphire::World::Manager::BlacklistMgr::onAddCharacter( Entity::Player& source, Entity::Player& target )
|
bool Sapphire::World::Manager::BlacklistMgr::onAddCharacter( Entity::Player& source, const std::string& targetName )
|
||||||
{
|
{
|
||||||
// add target to blacklist
|
// add target to blacklist
|
||||||
|
|
||||||
|
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
||||||
|
|
||||||
|
auto pTarget = server.getPlayer( targetName );
|
||||||
|
if( !pTarget )
|
||||||
|
{
|
||||||
|
// target doesn't exist in server player table
|
||||||
|
sendAddResultPacket( source, pTarget, 0x7 );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& target = *pTarget;
|
||||||
|
|
||||||
if( source.getCharacterId() == target.getCharacterId() )
|
if( source.getCharacterId() == target.getCharacterId() )
|
||||||
{
|
{
|
||||||
// can't add self to blacklist
|
// can't add self to blacklist
|
||||||
|
sendAddResultPacket( source, pTarget, 0x7 );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isBlacklisted( source, target ) )
|
if( isBlacklisted( source, target ) )
|
||||||
{
|
{
|
||||||
// target already added to blacklist
|
// target already added to blacklist
|
||||||
|
sendAddResultPacket( source, pTarget, 0x7 );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +63,8 @@ bool Sapphire::World::Manager::BlacklistMgr::onAddCharacter( Entity::Player& sou
|
||||||
|
|
||||||
source.updateDbBlacklist();
|
source.updateDbBlacklist();
|
||||||
|
|
||||||
|
sendAddResultPacket( source, pTarget, 0 );
|
||||||
|
|
||||||
// check if player is friends with target
|
// check if player is friends with target
|
||||||
auto& flMgr = Common::Service< Sapphire::World::Manager::FriendListMgr >::ref();
|
auto& flMgr = Common::Service< Sapphire::World::Manager::FriendListMgr >::ref();
|
||||||
if( flMgr.isFriend( source, target ) )
|
if( flMgr.isFriend( source, target ) )
|
||||||
|
@ -57,15 +73,30 @@ bool Sapphire::World::Manager::BlacklistMgr::onAddCharacter( Entity::Player& sou
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sapphire::World::Manager::BlacklistMgr::onRemoveCharacter( Entity::Player& source, Entity::Player& target )
|
bool Sapphire::World::Manager::BlacklistMgr::onRemoveCharacter( Entity::Player& source, const std::string& targetName )
|
||||||
{
|
{
|
||||||
// remove target from blacklist
|
// remove target from blacklist
|
||||||
|
|
||||||
|
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
||||||
|
|
||||||
|
uint32_t result = 0;
|
||||||
|
|
||||||
|
auto pTarget = server.getPlayer( targetName );
|
||||||
|
if( !pTarget )
|
||||||
|
{
|
||||||
|
// target doesn't exist in server player table
|
||||||
|
sendRemoveResultPacket( source, pTarget, 0x7 );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& target = *pTarget;
|
||||||
|
|
||||||
auto sourceIdx = getEntryIndex( source, target.getCharacterId() );
|
auto sourceIdx = getEntryIndex( source, target.getCharacterId() );
|
||||||
|
|
||||||
if( !isBlacklisted( source, target ) )
|
if( !isBlacklisted( source, target ) )
|
||||||
{
|
{
|
||||||
// target not in blacklist
|
// target not in blacklist
|
||||||
|
sendRemoveResultPacket( source, pTarget, 0x7 );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,13 +105,15 @@ bool Sapphire::World::Manager::BlacklistMgr::onRemoveCharacter( Entity::Player&
|
||||||
sourceBL[sourceIdx] = 0;
|
sourceBL[sourceIdx] = 0;
|
||||||
source.updateDbBlacklist();
|
source.updateDbBlacklist();
|
||||||
|
|
||||||
|
sendRemoveResultPacket( source, pTarget, 0 );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sapphire::World::Manager::BlacklistMgr::onGetBlacklistPage( Entity::Player& source, uint8_t key, uint8_t nextIdx )
|
bool Sapphire::World::Manager::BlacklistMgr::onGetBlacklistPage( Entity::Player& source, uint8_t key, uint8_t nextIdx )
|
||||||
{
|
{
|
||||||
// this function will handle client side indexing and paginate blacklist entries
|
// this function will handle client side indexing and paginate blacklist entries
|
||||||
// it'll also be called multiple times sequentially until there are no more valid entries left
|
// it'll also be called multiple times sequentially until there are no more entries left (id == 0)
|
||||||
|
|
||||||
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
||||||
|
|
||||||
|
@ -133,12 +166,12 @@ bool Sapphire::World::Manager::BlacklistMgr::onGetBlacklistPage( Entity::Player&
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sapphire::World::Manager::BlacklistMgr::isBlacklisted( Entity::Player& source, Entity::Player& target )
|
bool Sapphire::World::Manager::BlacklistMgr::isBlacklisted( Entity::Player& source, Entity::Player& target ) const
|
||||||
{
|
{
|
||||||
return getEntryIndex( source, target.getCharacterId() ) != -1;
|
return getEntryIndex( source, target.getCharacterId() ) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptrdiff_t Sapphire::World::Manager::BlacklistMgr::getEntryIndex( Entity::Player& source, uint64_t characterId )
|
ptrdiff_t Sapphire::World::Manager::BlacklistMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const
|
||||||
{
|
{
|
||||||
auto& sourceBL = source.getBlacklistID();
|
auto& sourceBL = source.getBlacklistID();
|
||||||
auto sourceBlIt = std::find( std::begin( sourceBL ), std::end( sourceBL ), characterId );
|
auto sourceBlIt = std::find( std::begin( sourceBL ), std::end( sourceBL ), characterId );
|
||||||
|
@ -148,4 +181,46 @@ ptrdiff_t Sapphire::World::Manager::BlacklistMgr::getEntryIndex( Entity::Player&
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return sourceBlIt - std::begin( sourceBL );
|
return sourceBlIt - std::begin( sourceBL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Sapphire::World::Manager::BlacklistMgr::sendAddResultPacket( Entity::Player& source, Entity::PlayerPtr pTarget, uint32_t result )
|
||||||
|
{
|
||||||
|
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
||||||
|
|
||||||
|
auto resultPacket = makeZonePacket< Server::FFXIVIpcBlacklistAddResult >( source.getId() );
|
||||||
|
|
||||||
|
if( pTarget )
|
||||||
|
{
|
||||||
|
Server::BlacklistCharacter blChar;
|
||||||
|
blChar.CharacterID = pTarget->getCharacterId();
|
||||||
|
strcpy( blChar.CharacterName, pTarget->getName().c_str() );
|
||||||
|
|
||||||
|
resultPacket->data().AddedCharacter = blChar;
|
||||||
|
resultPacket->data().Identity = pTarget->getGender();
|
||||||
|
}
|
||||||
|
|
||||||
|
resultPacket->data().Result = result;
|
||||||
|
|
||||||
|
server.queueForPlayer( source.getCharacterId(), resultPacket );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Sapphire::World::Manager::BlacklistMgr::sendRemoveResultPacket( Entity::Player& source, Entity::PlayerPtr pTarget, uint32_t result )
|
||||||
|
{
|
||||||
|
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
||||||
|
|
||||||
|
auto resultPacket = makeZonePacket< Server::FFXIVIpcBlacklistRemoveResult >( source.getId() );
|
||||||
|
|
||||||
|
if( pTarget )
|
||||||
|
{
|
||||||
|
Server::BlacklistCharacter blChar;
|
||||||
|
blChar.CharacterID = pTarget->getCharacterId();
|
||||||
|
strcpy( blChar.CharacterName, pTarget->getName().c_str() );
|
||||||
|
|
||||||
|
resultPacket->data().RemovedCharacter = blChar;
|
||||||
|
resultPacket->data().Identity = pTarget->getGender();
|
||||||
|
}
|
||||||
|
|
||||||
|
resultPacket->data().Result = result;
|
||||||
|
|
||||||
|
server.queueForPlayer( source.getCharacterId(), resultPacket );
|
||||||
|
}
|
||||||
|
|
|
@ -11,14 +11,17 @@ namespace Sapphire::World::Manager
|
||||||
public:
|
public:
|
||||||
BlacklistMgr() = default;
|
BlacklistMgr() = default;
|
||||||
|
|
||||||
bool onAddCharacter( Entity::Player& source, Entity::Player& target );
|
bool onAddCharacter( Entity::Player& source, const std::string& targetName );
|
||||||
bool onRemoveCharacter( Entity::Player& source, Entity::Player& target );
|
bool onRemoveCharacter( Entity::Player& source, const std::string& targetName );
|
||||||
|
|
||||||
bool onGetBlacklistPage( Entity::Player& source, uint8_t key, uint8_t nextIdx );
|
bool onGetBlacklistPage( Entity::Player& source, uint8_t key, uint8_t nextIdx );
|
||||||
|
|
||||||
bool isBlacklisted( Entity::Player& source, Entity::Player& target );
|
bool isBlacklisted( Entity::Player& source, Entity::Player& target ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ptrdiff_t getEntryIndex( Entity::Player& source, uint64_t characterId );
|
ptrdiff_t getEntryIndex( Entity::Player& source, uint64_t characterId ) const;
|
||||||
|
|
||||||
|
void sendAddResultPacket( Entity::Player& source, Entity::PlayerPtr pTarget, uint32_t result );
|
||||||
|
void sendRemoveResultPacket( Entity::Player& source, Entity::PlayerPtr pTarget, uint32_t result );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,12 +41,13 @@ bool Sapphire::World::Manager::FriendListMgr::onInviteCreate( Entity::Player& so
|
||||||
Common::HierarchyData hierarchy;
|
Common::HierarchyData hierarchy;
|
||||||
hierarchy.data.dateAdded = Common::Util::getTimeSeconds();
|
hierarchy.data.dateAdded = Common::Util::getTimeSeconds();
|
||||||
hierarchy.data.group = 0;
|
hierarchy.data.group = 0;
|
||||||
hierarchy.data.status = Common::HierarchyStatus::SentRequest; // set type for invite sender
|
|
||||||
hierarchy.data.type = Common::HierarchyType::FRIENDLIST;
|
hierarchy.data.type = Common::HierarchyType::FRIENDLIST;
|
||||||
|
|
||||||
|
// set hierarchy status for invite sender
|
||||||
|
hierarchy.data.status = Common::HierarchyStatus::SentRequest;
|
||||||
sourceFLData[ sourceIdx ] = hierarchy;
|
sourceFLData[ sourceIdx ] = hierarchy;
|
||||||
|
|
||||||
// set type for invite receiver
|
// set hierarchy status for invite receiver
|
||||||
hierarchy.data.status = Common::HierarchyStatus::ReceivedRequest;
|
hierarchy.data.status = Common::HierarchyStatus::ReceivedRequest;
|
||||||
targetFLData[ targetIdx ] = hierarchy;
|
targetFLData[ targetIdx ] = hierarchy;
|
||||||
|
|
||||||
|
@ -72,6 +73,7 @@ bool Sapphire::World::Manager::FriendListMgr::onInviteAccept( Entity::Player& so
|
||||||
auto& sourceFLData = source.getFriendListData();
|
auto& sourceFLData = source.getFriendListData();
|
||||||
auto& targetFLData = target.getFriendListData();
|
auto& targetFLData = target.getFriendListData();
|
||||||
|
|
||||||
|
// currently, type on hierarchy indicates invite type - since it is no longer an invite, set type to NONE
|
||||||
sourceFLData[ sourceIdx ].data.status = Common::HierarchyStatus::Added;
|
sourceFLData[ sourceIdx ].data.status = Common::HierarchyStatus::Added;
|
||||||
sourceFLData[ sourceIdx ].data.type = Common::HierarchyType::NONE_2;
|
sourceFLData[ sourceIdx ].data.type = Common::HierarchyType::NONE_2;
|
||||||
targetFLData[ targetIdx ].data.status = Common::HierarchyStatus::Added;
|
targetFLData[ targetIdx ].data.status = Common::HierarchyStatus::Added;
|
||||||
|
@ -140,12 +142,12 @@ bool Sapphire::World::Manager::FriendListMgr::onAssignGroup( Entity::Player& sou
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Sapphire::World::Manager::FriendListMgr::isFriend( Entity::Player& source, Entity::Player& target )
|
bool Sapphire::World::Manager::FriendListMgr::isFriend( Entity::Player& source, Entity::Player& target ) const
|
||||||
{
|
{
|
||||||
return getEntryIndex( source, target.getCharacterId() ) != -1;
|
return getEntryIndex( source, target.getCharacterId() ) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptrdiff_t Sapphire::World::Manager::FriendListMgr::getEntryIndex( Entity::Player& source, uint64_t characterId )
|
ptrdiff_t Sapphire::World::Manager::FriendListMgr::getEntryIndex( Entity::Player& source, uint64_t characterId ) const
|
||||||
{
|
{
|
||||||
auto& sourceFL = source.getFriendListID();
|
auto& sourceFL = source.getFriendListID();
|
||||||
auto sourceInvIt = std::find( std::begin( sourceFL ), std::end( sourceFL ), characterId );
|
auto sourceInvIt = std::find( std::begin( sourceFL ), std::end( sourceFL ), characterId );
|
||||||
|
|
|
@ -19,9 +19,9 @@ namespace Sapphire::World::Manager
|
||||||
bool onRemoveFriend( Entity::Player& source, Entity::Player& target );
|
bool onRemoveFriend( Entity::Player& source, Entity::Player& target );
|
||||||
bool onAssignGroup( Entity::Player& source, Entity::Player& target, uint8_t group );
|
bool onAssignGroup( Entity::Player& source, Entity::Player& target, uint8_t group );
|
||||||
|
|
||||||
bool isFriend( Entity::Player& source, Entity::Player& target );
|
bool isFriend( Entity::Player& source, Entity::Player& target ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ptrdiff_t getEntryIndex( Entity::Player& source, uint64_t characterId );
|
ptrdiff_t getEntryIndex( Entity::Player& source, uint64_t characterId ) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,83 +22,34 @@ using namespace Sapphire::World::Manager;
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::getBlacklistHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
void Sapphire::Network::GameConnection::getBlacklistHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
|
||||||
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
||||||
|
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGetBlacklist >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcGetBlacklist >( inPacket );
|
||||||
auto& data = packet.data();
|
auto& data = packet.data();
|
||||||
|
|
||||||
// TODO: remove this paging test!!
|
|
||||||
/*
|
|
||||||
for( size_t i = 0; i < 200; ++i )
|
|
||||||
{
|
|
||||||
player.getBlacklistID()[i] = player.getCharacterId();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
blMgr.onGetBlacklistPage( player, data.RequestKey, data.NextIndex );
|
blMgr.onGetBlacklistPage( player, data.RequestKey, data.NextIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::blacklistAddHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
void Sapphire::Network::GameConnection::blacklistAddHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
|
||||||
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
||||||
|
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcBlacklistAdd >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcBlacklistAdd >( inPacket );
|
||||||
auto& data = packet.data();
|
auto& data = packet.data();
|
||||||
|
|
||||||
auto resultPacket = makeZonePacket< Server::FFXIVIpcBlacklistAddResult >( player.getId() );
|
|
||||||
|
|
||||||
std::string targetName( data.TargetCharacterName );
|
std::string targetName( data.TargetCharacterName );
|
||||||
|
|
||||||
auto target = server.getPlayer( targetName );
|
blMgr.onAddCharacter( player, targetName );
|
||||||
|
|
||||||
if( !target || !blMgr.onAddCharacter( player, *target ) )
|
|
||||||
{
|
|
||||||
resultPacket->data().Result = 0x7; // TODO: find the correct value for each invalid arg
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Server::BlacklistCharacter blChar;
|
|
||||||
blChar.CharacterID = target->getCharacterId();
|
|
||||||
strcpy( blChar.CharacterName, target->getName().c_str() );
|
|
||||||
|
|
||||||
resultPacket->data().AddedCharacter = blChar;
|
|
||||||
resultPacket->data().Identity = target->getGender();
|
|
||||||
resultPacket->data().Result = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
queueOutPacket( resultPacket );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sapphire::Network::GameConnection::blacklistRemoveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
void Sapphire::Network::GameConnection::blacklistRemoveHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )
|
||||||
{
|
{
|
||||||
auto& server = Common::Service< Sapphire::World::WorldServer >::ref();
|
|
||||||
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
auto& blMgr = Common::Service< Sapphire::World::Manager::BlacklistMgr >::ref();
|
||||||
|
|
||||||
const auto packet = ZoneChannelPacket< Client::FFXIVIpcBlacklistRemove >( inPacket );
|
const auto packet = ZoneChannelPacket< Client::FFXIVIpcBlacklistRemove >( inPacket );
|
||||||
auto& data = packet.data();
|
auto& data = packet.data();
|
||||||
|
|
||||||
auto resultPacket = makeZonePacket< Server::FFXIVIpcBlacklistRemoveResult >( player.getId() );
|
|
||||||
|
|
||||||
std::string targetName( data.TargetCharacterName );
|
std::string targetName( data.TargetCharacterName );
|
||||||
|
|
||||||
auto target = server.getPlayer( targetName );
|
blMgr.onRemoveCharacter( player, targetName );
|
||||||
|
|
||||||
if( !target || !blMgr.onRemoveCharacter( player, *target ) )
|
|
||||||
{
|
|
||||||
resultPacket->data().Result = 0x7; // TODO: find the correct value for each invalid arg
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Server::BlacklistCharacter blChar;
|
|
||||||
blChar.CharacterID = target->getCharacterId();
|
|
||||||
strcpy( blChar.CharacterName, target->getName().c_str() );
|
|
||||||
|
|
||||||
resultPacket->data().RemovedCharacter = blChar;
|
|
||||||
resultPacket->data().Identity = target->getGender();
|
|
||||||
resultPacket->data().Result = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
queueOutPacket( resultPacket );
|
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue