public void AddEvent(CalendarEvent calendarEvent, CalendarSendEventType sendType) { _events.Add(calendarEvent); UpdateEvent(calendarEvent); SendCalendarEvent(calendarEvent.OwnerGuid, calendarEvent, sendType); }
public void LoadFromDB() { uint oldMSTime = Time.GetMSTime(); uint count = 0; _maxEventId = 0; _maxInviteId = 0; // 0 1 2 3 4 5 6 7 8 SQLResult result = DB.Characters.Query("SELECT EventID, Owner, Title, Description, EventType, TextureID, Date, Flags, LockDate FROM calendar_events"); if (!result.IsEmpty()) { do { ulong eventID = result.Read <ulong>(0); ObjectGuid ownerGUID = ObjectGuid.Create(HighGuid.Player, result.Read <ulong>(1)); string title = result.Read <string>(2); string description = result.Read <string>(3); CalendarEventType type = (CalendarEventType)result.Read <byte>(4); int textureID = result.Read <int>(5); uint date = result.Read <uint>(6); CalendarFlags flags = (CalendarFlags)result.Read <uint>(7); uint lockDate = result.Read <uint>(8); ulong guildID = 0; if (flags.HasAnyFlag(CalendarFlags.GuildEvent) || flags.HasAnyFlag(CalendarFlags.WithoutInvites)) { guildID = Global.CharacterCacheStorage.GetCharacterGuildIdByGuid(ownerGUID); } CalendarEvent calendarEvent = new CalendarEvent(eventID, ownerGUID, guildID, type, textureID, date, flags, title, description, lockDate); _events.Add(calendarEvent); _maxEventId = Math.Max(_maxEventId, eventID); ++count; }while (result.NextRow()); } Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} calendar events in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); count = 0; oldMSTime = Time.GetMSTime(); // 0 1 2 3 4 5 6 7 result = DB.Characters.Query("SELECT InviteID, EventID, Invitee, Sender, Status, ResponseTime, ModerationRank, Note FROM calendar_invites"); if (!result.IsEmpty()) { do { ulong inviteId = result.Read <ulong>(0); ulong eventId = result.Read <ulong>(1); ObjectGuid invitee = ObjectGuid.Create(HighGuid.Player, result.Read <ulong>(2)); ObjectGuid senderGUID = ObjectGuid.Create(HighGuid.Player, result.Read <ulong>(3)); CalendarInviteStatus status = (CalendarInviteStatus)result.Read <byte>(4); uint responseTime = result.Read <uint>(5); CalendarModerationRank rank = (CalendarModerationRank)result.Read <byte>(6); string note = result.Read <string>(7); CalendarInvite invite = new CalendarInvite(inviteId, eventId, invitee, senderGUID, responseTime, status, rank, note); _invites.Add(eventId, invite); _maxInviteId = Math.Max(_maxInviteId, inviteId); ++count; }while (result.NextRow()); } Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} calendar invites in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); for (ulong i = 1; i < _maxEventId; ++i) { if (GetEvent(i) == null) { _freeEventIds.Add(i); } } for (ulong i = 1; i < _maxInviteId; ++i) { if (GetInvite(i) == null) { _freeInviteIds.Add(i); } } }
void HandleCalendarInvite(CalendarInvitePkt calendarInvite) { ObjectGuid playerGuid = GetPlayer().GetGUID(); ObjectGuid inviteeGuid = ObjectGuid.Empty; Team inviteeTeam = 0; ulong inviteeGuildId = 0; if (!ObjectManager.NormalizePlayerName(ref calendarInvite.Name)) { return; } Player player = Global.ObjAccessor.FindPlayerByName(calendarInvite.Name); if (player) { // Invitee is online inviteeGuid = player.GetGUID(); inviteeTeam = player.GetTeam(); inviteeGuildId = player.GetGuildId(); } else { // Invitee offline, get data from database ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(calendarInvite.Name); if (!guid.IsEmpty()) { CharacterCacheEntry characterInfo = Global.CharacterCacheStorage.GetCharacterCacheByGuid(guid); if (characterInfo != null) { inviteeGuid = guid; inviteeTeam = Player.TeamForRace(characterInfo.RaceId); inviteeGuildId = characterInfo.GuildId; } } } if (inviteeGuid.IsEmpty()) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.PlayerNotFound); return; } if (GetPlayer().GetTeam() != inviteeTeam && !WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionCalendar)) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NotAllied); return; } SQLResult result1 = DB.Characters.Query("SELECT flags FROM character_social WHERE guid = {0} AND friend = {1}", inviteeGuid, playerGuid); if (!result1.IsEmpty()) { if (Convert.ToBoolean(result1.Read <byte>(0) & (byte)SocialFlag.Ignored)) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarInvite.Name); return; } } if (!calendarInvite.Creating) { CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarInvite.EventID); if (calendarEvent != null) { if (calendarEvent.IsGuildEvent() && calendarEvent.GuildId == inviteeGuildId) { // we can't invite guild members to guild events Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); return; } CalendarInvite invite = new(Global.CalendarMgr.GetFreeInviteId(), calendarInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.AddInvite(calendarEvent, invite); } else { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.EventInvalid); } } else { if (calendarInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId()) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); return; } CalendarInvite invite = new(calendarInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.SendCalendarEventInvite(invite); } }
void HandleCalendarGetCalendar(CalendarGetCalendar calendarGetCalendar) { ObjectGuid guid = GetPlayer().GetGUID(); long currTime = GameTime.GetGameTime(); CalendarSendCalendar packet = new(); packet.ServerTime = currTime; var invites = Global.CalendarMgr.GetPlayerInvites(guid); foreach (var invite in invites) { CalendarSendCalendarInviteInfo inviteInfo = new(); inviteInfo.EventID = invite.EventId; inviteInfo.InviteID = invite.InviteId; inviteInfo.InviterGuid = invite.SenderGuid; inviteInfo.Status = invite.Status; inviteInfo.Moderator = invite.Rank; CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(invite.EventId); if (calendarEvent != null) { inviteInfo.InviteType = (byte)(calendarEvent.IsGuildEvent() && calendarEvent.GuildId == _player.GetGuildId() ? 1 : 0); } packet.Invites.Add(inviteInfo); } var playerEvents = Global.CalendarMgr.GetPlayerEvents(guid); foreach (var calendarEvent in playerEvents) { CalendarSendCalendarEventInfo eventInfo; eventInfo.EventID = calendarEvent.EventId; eventInfo.Date = calendarEvent.Date; eventInfo.EventClubID = calendarEvent.GuildId; eventInfo.EventName = calendarEvent.Title; eventInfo.EventType = calendarEvent.EventType; eventInfo.Flags = calendarEvent.Flags; eventInfo.OwnerGuid = calendarEvent.OwnerGuid; eventInfo.TextureID = calendarEvent.TextureId; packet.Events.Add(eventInfo); } foreach (var difficulty in CliDB.DifficultyStorage.Values) { var boundInstances = _player.GetBoundInstances((Difficulty)difficulty.Id); if (boundInstances != null) { foreach (var boundInstance in boundInstances.Values) { if (boundInstance.perm) { CalendarSendCalendarRaidLockoutInfo lockoutInfo; InstanceSave save = boundInstance.save; lockoutInfo.MapID = (int)save.GetMapId(); lockoutInfo.DifficultyID = (uint)save.GetDifficultyID(); lockoutInfo.ExpireTime = save.GetResetTime() - currTime; lockoutInfo.InstanceID = save.GetInstanceId(); // instance save id as unique instance copy id packet.RaidLockouts.Add(lockoutInfo); } } } } SendPacket(packet); }
void HandleCalendarCopyEvent(CalendarCopyEvent calendarCopyEvent) { ObjectGuid guid = GetPlayer().GetGUID(); // 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); var invites = Global.CalendarMgr.GetEventInvites(calendarCopyEvent.EventID); SQLTransaction trans = null; if (invites.Count > 1) { trans = new SQLTransaction(); } foreach (var invite in invites) { Global.CalendarMgr.AddInvite(newEvent, new CalendarInvite(invite, Global.CalendarMgr.GetFreeInviteId(), newEvent.EventId), trans); } if (invites.Count > 1) { DB.Characters.CommitTransaction(trans); } // should we change owner when somebody makes a copy of event owned by another person? } else { Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid); } }
void HandleCalendarAddEvent(CalendarAddEvent calendarAddEvent) { ObjectGuid guid = GetPlayer().GetGUID(); // 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()) { calendarEvent.GuildId = _player.GetGuildId(); } if (calendarEvent.IsGuildAnnouncement()) { CalendarInvite invite = new(0, calendarEvent.EventId, ObjectGuid.Empty, guid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.NotSignedUp, CalendarModerationRank.Player, ""); // WARNING: By passing pointer to a local variable, the underlying method(s) must NOT perform any kind // of storage of the pointer as it will lead to memory corruption Global.CalendarMgr.AddInvite(calendarEvent, invite); } else { SQLTransaction trans = null; if (calendarAddEvent.EventInfo.Invites.Length > 1) { trans = new SQLTransaction(); } for (int i = 0; i < calendarAddEvent.EventInfo.Invites.Length; ++i) { CalendarInvite invite = new(Global.CalendarMgr.GetFreeInviteId(), calendarEvent.EventId, calendarAddEvent.EventInfo.Invites[i].Guid, guid, SharedConst.CalendarDefaultResponseTime, (CalendarInviteStatus)calendarAddEvent.EventInfo.Invites[i].Status, (CalendarModerationRank)calendarAddEvent.EventInfo.Invites[i].Moderator, ""); Global.CalendarMgr.AddInvite(calendarEvent, invite, trans); } if (calendarAddEvent.EventInfo.Invites.Length > 1) { DB.Characters.CommitTransaction(trans); } } Global.CalendarMgr.AddEvent(calendarEvent, CalendarSendEventType.Add); }
void HandleCalendarEventInvite(CalendarEventInvite calendarEventInvite) { ObjectGuid playerGuid = GetPlayer().GetGUID(); ObjectGuid inviteeGuid = ObjectGuid.Empty; Team inviteeTeam = 0; ulong inviteeGuildId = 0; Player player = Global.ObjAccessor.FindPlayerByName(calendarEventInvite.Name); if (player) { // Invitee is online inviteeGuid = player.GetGUID(); inviteeTeam = player.GetTeam(); inviteeGuildId = player.GetGuildId(); } else { // Invitee offline, get data from database PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_GUID_RACE_ACC_BY_NAME); stmt.AddValue(0, calendarEventInvite.Name); SQLResult result = DB.Characters.Query(stmt); if (!result.IsEmpty()) { inviteeGuid = ObjectGuid.Create(HighGuid.Player, result.Read <ulong>(0)); inviteeTeam = Player.TeamForRace((Race)result.Read <byte>(1)); inviteeGuildId = Player.GetGuildIdFromDB(inviteeGuid); } } if (inviteeGuid.IsEmpty()) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.PlayerNotFound); return; } if (GetPlayer().GetTeam() != inviteeTeam && !WorldConfig.GetBoolValue(WorldCfg.AllowTwoSideInteractionCalendar)) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NotAllied); return; } SQLResult result1 = DB.Characters.Query("SELECT flags FROM character_social WHERE guid = {0} AND friend = {1}", inviteeGuid, playerGuid); if (!result1.IsEmpty()) { if (Convert.ToBoolean(result1.Read <byte>(0) & (byte)SocialFlag.Ignored)) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarEventInvite.Name); return; } } if (!calendarEventInvite.Creating) { CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventInvite.EventID); if (calendarEvent != null) { if (calendarEvent.IsGuildEvent() && calendarEvent.GuildId == inviteeGuildId) { // we can't invite guild members to guild events Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); return; } CalendarInvite invite = new CalendarInvite(Global.CalendarMgr.GetFreeInviteId(), calendarEventInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.AddInvite(calendarEvent, invite); } else { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.EventInvalid); } } else { if (calendarEventInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId()) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); return; } CalendarInvite invite = new CalendarInvite(calendarEventInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.SendCalendarEventInvite(invite); } }