Clear stale pending expedition lockouts

Delete pending lockouts of members on expedition creation

Delete pending lockouts when all members removed from expedition

This fixes an edge case where members could incorrectly be assigned
pending lockouts that were never cleared from the database (from a
server crash or other situation) after entering another dz.
This commit is contained in:
hg 2020-06-13 21:28:21 -04:00
parent 6165550133
commit 17be2bf2f7
5 changed files with 32 additions and 2 deletions

View File

@ -427,7 +427,7 @@ void DynamicZone::RemoveAllCharacters(bool enable_removal_timers)
database.RemoveClientsFromInstance(GetInstanceID());
}
void DynamicZone::SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t> character_ids)
void DynamicZone::SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t>& character_ids)
{
std::string insert_values;
for (const auto& character_id : character_ids)

View File

@ -75,7 +75,7 @@ public:
uint32_t CreateInstance();
void AddCharacter(uint32_t character_id);
void SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t> character_ids);
void SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t>& character_ids);
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
uint16_t GetInstanceID() const { return static_cast<uint16_t>(m_instance_id); };

View File

@ -310,7 +310,9 @@ void Expedition::SaveMembers(ExpeditionRequest& request)
{
m_member_id_history.emplace(member.char_id);
}
ExpeditionDatabase::InsertMembers(m_id, m_members);
ExpeditionDatabase::DeleteAllMembersPendingLockouts(m_members);
m_dynamiczone.SaveInstanceMembersToDatabase(m_member_id_history); // all are current members here
}
@ -504,10 +506,13 @@ void Expedition::RemoveAllMembers(bool enable_removal_timers)
{
m_dynamiczone.RemoveAllCharacters(enable_removal_timers);
ExpeditionDatabase::DeleteAllMembersPendingLockouts(m_members);
ExpeditionDatabase::UpdateAllMembersRemoved(m_id);
SendUpdatesToZoneMembers(true);
SendWorldExpeditionUpdate(ServerOP_ExpeditionMembersRemoved);
m_members.clear();
}
bool Expedition::RemoveMember(const std::string& remove_char_name)
@ -1626,6 +1631,7 @@ void Expedition::HandleWorldMessage(ServerPacket* pack)
if (expedition)
{
expedition->SendUpdatesToZoneMembers(true);
expedition->m_members.clear();
}
}
break;

View File

@ -379,6 +379,29 @@ void ExpeditionDatabase::DeletePendingLockouts(uint32_t character_id)
database.QueryDatabase(query);
}
void ExpeditionDatabase::DeleteAllMembersPendingLockouts(const std::vector<ExpeditionMember>& members)
{
LogExpeditionsDetail("Deleting pending lockouts for [{}] characters", members.size());
std::string query_character_ids;
for (const auto& member : members)
{
fmt::format_to(std::back_inserter(query_character_ids), "{},", member.char_id);
}
if (!query_character_ids.empty())
{
query_character_ids.pop_back(); // trailing comma
auto query = fmt::format(SQL(
DELETE FROM expedition_character_lockouts
WHERE character_id IN ({}) AND is_pending = TRUE;
), query_character_ids);
database.QueryDatabase(query);
}
}
void ExpeditionDatabase::DeleteLockout(uint32_t expedition_id, const std::string& event_name)
{
LogExpeditionsDetail("Deleting expedition [{}] lockout event [{}]", expedition_id, event_name);

View File

@ -55,6 +55,7 @@ namespace ExpeditionDatabase
const std::vector<ExpeditionMember>& members, const std::string& expedition_name, const std::string& event_name);
void AssignPendingLockouts(uint32_t character_id, const std::string& expedition_name);
void DeletePendingLockouts(uint32_t character_id);
void DeleteAllMembersPendingLockouts(const std::vector<ExpeditionMember>& members);
uint32_t GetExpeditionIDFromCharacterID(uint32_t character_id);
uint32_t GetExpeditionIDFromInstanceID(uint32_t instance_id);
ExpeditionMember GetExpeditionLeader(uint32_t expedition_id);