diff options
| author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-09-17 09:11:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-17 09:11:56 +0200 |
| commit | fb059722fdb18a94d47b3f44a5b2d7f183bf5a29 (patch) | |
| tree | bd492eb60a771dd7fd3f712b1e0a63d4110df45b /src/server/game/Calendar/CalendarMgr.cpp | |
| parent | 6fc7ab3448850199835f9ee9dca6991b511eba09 (diff) | |
Core/Calendar: Add some additional validation when creating events (#23797)
* Core/Calendar: Add some additional validation when creating events
Allow only 30 player events and 100 guild events to be created.
Don't allow to create guild events if player is not in guild.
Send some more error messages to the client (not blizzlike errors but better than nothing).
* Core/Calendar: Add some additional validation/checks
Add guild id check in GetPlayerEvents().
Change error message in HandleCalendarCopyEvent() to be the same as in HandleCalendarAddEvent() when creating an event in the past.
* Core/Calendar: Add some additional validation/checks
Reduce the number of CMSG_CALENDAR_ADD_EVENT packets a seconds allowed from 10 to 3.
* Core/Calendar: Add some additional validation/checks
Implement 5 seconds cooldown between the creation of calendar events
* Core/Calendar: Add some additional validation/checks
Don't allow to copy events of a different player/guild
* Core/Calendar: Implement automatic deletion of old events
Implement automatic deletion of events older than 1 month (30 days).
Fix debug assertion triggered when deleting a character with calendar events.
Avoid double std::set lookup when deleting events when deleting a character.
NB: The whole CalendarMgr/CalendarHandler code should be checked line by line for bugs/crashes/exploits.
Diffstat (limited to 'src/server/game/Calendar/CalendarMgr.cpp')
| -rw-r--r-- | src/server/game/Calendar/CalendarMgr.cpp | 72 |
1 files changed, 63 insertions, 9 deletions
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index b16579f0a71..fda4a5f984b 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -175,13 +175,24 @@ void CalendarMgr::RemoveEvent(uint64 eventId, ObjectGuid remover) return; } + RemoveEvent(calendarEvent, remover); +} + +void CalendarMgr::RemoveEvent(CalendarEvent* calendarEvent, ObjectGuid remover) +{ + if (!calendarEvent) + { + SendCalendarCommandResult(remover, CALENDAR_ERROR_EVENT_INVALID); + return; + } + SendCalendarEventRemovedAlert(*calendarEvent); SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt; MailDraft mail(calendarEvent->BuildCalendarMailSubject(remover), calendarEvent->BuildCalendarMailBody()); - CalendarInviteStore& eventInvites = _invites[eventId]; + CalendarInviteStore& eventInvites = _invites[calendarEvent->GetEventId()]; for (size_t i = 0; i < eventInvites.size(); ++i) { CalendarInvite* invite = eventInvites[i]; @@ -197,10 +208,10 @@ void CalendarMgr::RemoveEvent(uint64 eventId, ObjectGuid remover) delete invite; } - _invites.erase(eventId); + _invites.erase(calendarEvent->GetEventId()); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CALENDAR_EVENT); - stmt->setUInt64(0, eventId); + stmt->setUInt64(0, calendarEvent->GetEventId()); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); @@ -280,9 +291,13 @@ void CalendarMgr::UpdateInvite(CalendarInvite* invite, SQLTransaction& trans) void CalendarMgr::RemoveAllPlayerEventsAndInvites(ObjectGuid guid) { - for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetCreatorGUID() == guid) - RemoveEvent((*itr)->GetEventId(), ObjectGuid::Empty); // don't send mail if removing a character + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end();) + { + CalendarEvent* event = *itr; + ++itr; + if (event->GetCreatorGUID() == guid) + RemoveEvent(event, ObjectGuid::Empty); // don't send mail if removing a character + } CalendarInviteStore playerInvites = GetPlayerInvites(guid); for (CalendarInviteStore::const_iterator itr = playerInvites.begin(); itr != playerInvites.end(); ++itr) @@ -359,6 +374,44 @@ uint64 CalendarMgr::GetFreeInviteId() return inviteId; } +void CalendarMgr::DeleteOldEvents() +{ + time_t oldEventsTime = GameTime::GetGameTime() - CALENDAR_OLD_EVENTS_DELETION_TIME; + + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end();) + { + CalendarEvent* event = *itr; + ++itr; + if (event->GetEventTime() < oldEventsTime) + RemoveEvent(event, ObjectGuid::Empty); + } +} + +CalendarEventStore CalendarMgr::GetEventsCreatedBy(ObjectGuid guid, bool includeGuildEvents) +{ + CalendarEventStore result; + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->GetCreatorGUID() == guid && (includeGuildEvents || (!(*itr)->IsGuildEvent() && !(*itr)->IsGuildAnnouncement()))) + result.insert(*itr); + + return result; +} + +CalendarEventStore CalendarMgr::GetGuildEvents(ObjectGuid::LowType guildId) +{ + CalendarEventStore result; + + if (!guildId) + return result; + + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->IsGuildEvent() || (*itr)->IsGuildAnnouncement()) + if ((*itr)->GetGuildId() == guildId) + result.insert(*itr); + + return result; +} + CalendarEventStore CalendarMgr::GetPlayerEvents(ObjectGuid guid) { CalendarEventStore events; @@ -370,9 +423,10 @@ CalendarEventStore CalendarMgr::GetPlayerEvents(ObjectGuid guid) events.insert(event); if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetGuildId() == player->GetGuildId()) - events.insert(*itr); + if (player->GetGuildId()) + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->GetGuildId() == player->GetGuildId()) + events.insert(*itr); return events; } |
