Core/Calendar: Add some additional validation when creating events

Port From (https://github.com/TrinityCore/TrinityCore/commit/562c567b1e0c878f0632994a79bcfbfd4a962504)
This commit is contained in:
hondacrx
2022-01-04 20:40:30 -05:00
parent 7f053ea099
commit 4b08dc2756
6 changed files with 222 additions and 33 deletions
+13 -3
View File
@@ -142,11 +142,19 @@ namespace Framework.Constants
public const uint VoidStorageMaxWithdraw = 9;
public const byte VoidStorageMaxSlot = 160;
/// <summary>
/// Calendar Const
/// </summary>
public const uint CalendarMaxEvents = 30;
public const uint CalendarMaxGuildEvents = 100;
public const uint CalendarMaxInvites = 100;
public const uint CalendarCreateEventCooldown = 5;
public const uint CalendarOldEventsDeletionTime = 1 * Time.Month;
public const uint CalendarDefaultResponseTime = 946684800; // 01/01/2000 00:00:00
/// <summary>
/// Misc Const
/// </summary>
public const uint CalendarMaxInvites = 100;
public const uint CalendarDefaultResponseTime = 946684800; // 01/01/2000 00:00:00
public const Locale DefaultLocale = Locale.enUS;
public const int MaxAccountTutorialValues = 8;
public const int MinAuctionTime = (12 * Time.Hour);
@@ -892,7 +900,8 @@ namespace Framework.Constants
CleaningFlags = 20004, // Cleaning Flags
GuildDailyResetTime = 20006, // Next guild cap reset time
MonthlyQuestResetTime = 20007, // Next monthly quest reset time
DailyQuestResetTime = 2008, // Next daily quest reset time
DailyQuestResetTime = 20008, // Next daily quest reset time
DailyCalendarDeletionOldEventsTime = 20009, // Next daily calendar deletions of old events time
// Cata specific custom worldstates
GuildWeeklyResetTime = 20050, // Next guild week reset time
}
@@ -1427,6 +1436,7 @@ namespace Framework.Constants
CacheDataQueries,
CalculateCreatureZoneAreaData,
CalculateGameobjectZoneAreaData,
CalendarDeleteOldEventsHour,
CastUnstuck,
CharacterCreatingDisableAlliedRaceAchievementRequirement,
CharacterCreatingDisabled,
+74 -23
View File
@@ -146,13 +146,24 @@ namespace Game
return;
}
RemoveEvent(calendarEvent, remover);
}
void RemoveEvent(CalendarEvent calendarEvent, ObjectGuid remover)
{
if (calendarEvent == null)
{
SendCalendarCommandResult(remover, CalendarError.EventInvalid);
return;
}
SendCalendarEventRemovedAlert(calendarEvent);
SQLTransaction trans = new();
PreparedStatement stmt;
MailDraft mail = new(calendarEvent.BuildCalendarMailSubject(remover), calendarEvent.BuildCalendarMailBody());
var eventInvites = _invites[eventId];
var eventInvites = _invites[calendarEvent.EventId];
for (int i = 0; i < eventInvites.Count; ++i)
{
CalendarInvite invite = eventInvites[i];
@@ -166,10 +177,10 @@ namespace Game
mail.SendMailTo(trans, new MailReceiver(invite.InviteeGuid.GetCounter()), new MailSender(calendarEvent), MailCheckMask.Copied);
}
_invites.Remove(eventId);
_invites.Remove(calendarEvent.EventId);
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CALENDAR_EVENT);
stmt.AddValue(0, eventId);
stmt.AddValue(0, calendarEvent.EventId);
trans.Append(stmt);
DB.Characters.CommitTransaction(trans);
@@ -329,6 +340,42 @@ namespace Game
return inviteId;
}
public void DeleteOldEvents()
{
long oldEventsTime = GameTime.GetGameTime() - SharedConst.CalendarOldEventsDeletionTime;
foreach (var calendarEvent in _events)
{
if (calendarEvent.Date < oldEventsTime)
RemoveEvent(calendarEvent, ObjectGuid.Empty);
}
}
public List<CalendarEvent> GetEventsCreatedBy(ObjectGuid guid, bool includeGuildEvents = false)
{
List<CalendarEvent> result = new();
foreach (var calendarEvent in _events)
if (calendarEvent.OwnerGuid == guid && (includeGuildEvents || (!calendarEvent.IsGuildEvent() && !calendarEvent.IsGuildAnnouncement())))
result.Add(calendarEvent);
return result;
}
public List<CalendarEvent> GetGuildEvents(ulong guildId)
{
List<CalendarEvent> result = new();
if (guildId == 0)
return result;
foreach (var calendarEvent in _events)
if (calendarEvent.IsGuildEvent() || calendarEvent.IsGuildAnnouncement())
if (calendarEvent.GuildId == guildId)
result.Add(calendarEvent);
return result;
}
public List<CalendarEvent> GetPlayerEvents(ObjectGuid guid)
{
List<CalendarEvent> events = new();
@@ -342,8 +389,9 @@ namespace Game
events.Add(Event);
}
}
Player player = Global.ObjAccessor.FindPlayer(guid);
if (player)
if (player?.GetGuildId() != 0)
{
foreach (var calendarEvent in _events)
if (calendarEvent.GuildId == player.GetGuildId())
@@ -643,6 +691,15 @@ namespace Game
public class CalendarInvite
{
public ulong InviteId { get; set; }
public ulong EventId { get; set; }
public ObjectGuid InviteeGuid { get; set; }
public ObjectGuid SenderGuid { get; set; }
public long ResponseTime { get; set; }
public CalendarInviteStatus Status { get; set; }
public CalendarModerationRank Rank { get; set; }
public string Note { get; set; }
public CalendarInvite()
{
InviteId = 1;
@@ -680,19 +737,21 @@ namespace Game
if (InviteId != 0 && EventId != 0)
Global.CalendarMgr.FreeInviteId(InviteId);
}
public ulong InviteId { get; set; }
public ulong EventId { get; set; }
public ObjectGuid InviteeGuid { get; set; }
public ObjectGuid SenderGuid { get; set; }
public long ResponseTime { get; set; }
public CalendarInviteStatus Status { get; set; }
public CalendarModerationRank Rank { get; set; }
public string Note { get; set; }
}
public class CalendarEvent
{
public ulong EventId { get; set; }
public ObjectGuid OwnerGuid { get; set; }
public ulong GuildId { get; set; }
public CalendarEventType EventType { get; set; }
public int TextureId { get; set; }
public long Date { get; set; }
public CalendarFlags Flags { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public long LockDate { get; set; }
public CalendarEvent(CalendarEvent calendarEvent, ulong eventId)
{
EventId = eventId;
@@ -746,15 +805,7 @@ namespace Game
public bool IsGuildAnnouncement() { return Flags.HasAnyFlag(CalendarFlags.WithoutInvites); }
public bool IsLocked() { return Flags.HasAnyFlag(CalendarFlags.InvitesLocked); }
public ulong EventId { get; set; }
public ObjectGuid OwnerGuid { get; set; }
public ulong GuildId { get; set; }
public CalendarEventType EventType { get; set; }
public int TextureId { get; set; }
public long Date { get; set; }
public CalendarFlags Flags { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public long LockDate { get; set; }
public static bool IsGuildEvent(uint flags) { return (flags & (uint)CalendarFlags.GuildEvent) != 0; }
public static bool IsGuildAnnouncement(uint flags) { return (flags & (uint)CalendarFlags.WithoutInvites) != 0; }
}
}
+86 -6
View File
@@ -124,17 +124,51 @@ namespace Game
// prevent events in the past
// To Do: properly handle timezones and remove the "- time_t(86400L)" hack
if (calendarAddEvent.EventInfo.Time < (GameTime.GetGameTime() - 86400L))
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventPassed);
return;
}
// If the event is a guild event, check if the player is in a guild
if (CalendarEvent.IsGuildEvent(calendarAddEvent.EventInfo.Flags) || CalendarEvent.IsGuildAnnouncement(calendarAddEvent.EventInfo.Flags))
{
if (_player.GetGuildId() == 0)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.GuildPlayerNotInGuild);
return;
}
}
// Check if the player reached the max number of events allowed to create
if (CalendarEvent.IsGuildEvent(calendarAddEvent.EventInfo.Flags) || CalendarEvent.IsGuildAnnouncement(calendarAddEvent.EventInfo.Flags))
{
if (Global.CalendarMgr.GetGuildEvents(_player.GetGuildId()).Count >= SharedConst.CalendarMaxGuildEvents)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.GuildEventsExceeded);
return;
}
}
else
{
if (Global.CalendarMgr.GetEventsCreatedBy(guid).Count >= SharedConst.CalendarMaxEvents)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventsExceeded);
return;
}
}
if (GetCalendarEventCreationCooldown() > GameTime.GetGameTime())
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.Internal);
return;
}
SetCalendarEventCreationCooldown(GameTime.GetGameTime() + SharedConst.CalendarCreateEventCooldown);
CalendarEvent calendarEvent = new(Global.CalendarMgr.GetFreeEventId(), guid, 0, (CalendarEventType)calendarAddEvent.EventInfo.EventType, calendarAddEvent.EventInfo.TextureID,
calendarAddEvent.EventInfo.Time, (CalendarFlags)calendarAddEvent.EventInfo.Flags, calendarAddEvent.EventInfo.Title, calendarAddEvent.EventInfo.Description, 0);
if (calendarEvent.IsGuildEvent() || calendarEvent.IsGuildAnnouncement())
{
Player creator = Global.ObjAccessor.FindPlayer(guid);
if (creator)
calendarEvent.GuildId = creator.GetGuildId();
}
calendarEvent.GuildId = _player.GetGuildId();
if (calendarEvent.IsGuildAnnouncement())
{
@@ -209,11 +243,57 @@ namespace Game
// prevent events in the past
// To Do: properly handle timezones and remove the "- time_t(86400L)" hack
if (calendarCopyEvent.Date < (GameTime.GetGameTime() - 86400L))
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventPassed);
return;
}
CalendarEvent oldEvent = Global.CalendarMgr.GetEvent(calendarCopyEvent.EventID);
if (oldEvent != null)
{
// Ensure that the player has access to the event
if (oldEvent.IsGuildEvent() || oldEvent.IsGuildAnnouncement())
{
if (oldEvent.GuildId != _player.GetGuildId())
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid);
return;
}
}
else
{
if (oldEvent.OwnerGuid != guid)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid);
return;
}
}
// Check if the player reached the max number of events allowed to create
if (oldEvent.IsGuildEvent() || oldEvent.IsGuildAnnouncement())
{
if (Global.CalendarMgr.GetGuildEvents(_player.GetGuildId()).Count >= SharedConst.CalendarMaxGuildEvents)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.GuildEventsExceeded);
return;
}
}
else
{
if (Global.CalendarMgr.GetEventsCreatedBy(guid).Count >= SharedConst.CalendarMaxEvents)
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventsExceeded);
return;
}
}
if (GetCalendarEventCreationCooldown() > GameTime.GetGameTime())
{
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.Internal);
return;
}
SetCalendarEventCreationCooldown(GameTime.GetGameTime() + SharedConst.CalendarCreateEventCooldown);
CalendarEvent newEvent = new(oldEvent, Global.CalendarMgr.GetFreeEventId());
newEvent.Date = calendarCopyEvent.Date;
Global.CalendarMgr.AddEvent(newEvent, CalendarSendEventType.Copy);
+34 -1
View File
@@ -1072,9 +1072,12 @@ namespace Game
InitQuestResetTimes();
CheckScheduledResetTimes();
Log.outInfo(LogFilter.ServerLoading, "Calculate random Battlegroundreset time...");
Log.outInfo(LogFilter.ServerLoading, "Calculate random battleground reset time...");
InitRandomBGResetTime();
Log.outInfo(LogFilter.ServerLoading, "Calculate deletion of old calendar events time...");
InitCalendarOldEventsDeletionTime();
Log.outInfo(LogFilter.ServerLoading, "Calculate Guild cap reset time...");
InitGuildResetTime();
@@ -1310,6 +1313,9 @@ namespace Game
if (currentGameTime > m_NextRandomBGReset)
ResetRandomBG();
if (currentGameTime > m_NextCalendarOldEventsDeletionTime)
CalendarDeleteOldEvents();
if (currentGameTime > m_NextGuildReset)
ResetGuildCap();
@@ -2114,6 +2120,23 @@ namespace Game
SetWorldState(WorldStates.BGDailyResetTime, (ulong)m_NextRandomBGReset);
}
void InitCalendarOldEventsDeletionTime()
{
long now = GameTime.GetGameTime();
long nextDeletionTime = Time.GetLocalHourTimestamp(now, WorldConfig.GetUIntValue(WorldCfg.CalendarDeleteOldEventsHour));
long currentDeletionTime = GetWorldState(WorldStates.DailyCalendarDeletionOldEventsTime);
// If the reset time saved in the worldstate is before now it means the server was offline when the reset was supposed to occur.
// In this case we set the reset time in the past and next world update will do the reset and schedule next one in the future.
if (currentDeletionTime < now)
m_NextCalendarOldEventsDeletionTime = nextDeletionTime - Time.Day;
else
m_NextCalendarOldEventsDeletionTime = nextDeletionTime;
if (currentDeletionTime == 0)
SetWorldState(WorldStates.DailyCalendarDeletionOldEventsTime, (ulong)m_NextCalendarOldEventsDeletionTime);
}
void InitGuildResetTime()
{
long gtime = GetWorldState(WorldStates.GuildDailyResetTime);
@@ -2193,6 +2216,15 @@ namespace Game
SetWorldState(WorldStates.BGDailyResetTime, (ulong)m_NextRandomBGReset);
}
void CalendarDeleteOldEvents()
{
Log.outInfo(LogFilter.Misc, "Calendar deletion of old events.");
m_NextCalendarOldEventsDeletionTime = m_NextCalendarOldEventsDeletionTime + Time.Day;
SetWorldState(WorldStates.DailyCalendarDeletionOldEventsTime, (ulong)m_NextCalendarOldEventsDeletionTime);
Global.CalendarMgr.DeleteOldEvents();
}
void ResetGuildCap()
{
m_NextGuildReset += Time.Day;
@@ -2489,6 +2521,7 @@ namespace Game
long m_NextWeeklyQuestReset;
long m_NextMonthlyQuestReset;
long m_NextRandomBGReset;
long m_NextCalendarOldEventsDeletionTime;
long m_NextGuildReset;
long m_NextCurrencyReset;
+7
View File
@@ -890,6 +890,10 @@ namespace Game
public uint GetRecruiterId() { return recruiterId; }
public bool IsARecruiter() { return isRecruiter; }
// Packets cooldown
public long GetCalendarEventCreationCooldown() { return _calendarEventCreationCooldown; }
public void SetCalendarEventCreationCooldown(long cooldown) { _calendarEventCreationCooldown = cooldown; }
// Battle Pets
public BattlePetMgr GetBattlePetMgr() { return _battlePetMgr; }
public CollectionMgr GetCollectionMgr() { return _collectionMgr; }
@@ -967,6 +971,9 @@ namespace Game
ConnectToKey _instanceConnectKey;
// Packets cooldown
long _calendarEventCreationCooldown;
BattlePetMgr _battlePetMgr;
Task<SQLQueryHolder<AccountInfoQueryLoad>> _realmAccountLoginCallback;
+8
View File
@@ -1034,6 +1034,14 @@ Quests.DailyResetTime = 3
Quests.WeeklyResetWDay = 3
#
# Calendar.DeleteOldEventsHour
# Description: Hour of the day when the daily deletion of old calendar events occurs.
# Range: 0-23
# Default: 6 - (06:00 AM)
Calendar.DeleteOldEventsHour = 6
#
# Guild.EventLogRecordsCount
# Description: Number of log entries for guild events that are stored per guild. Old entries