TrinityCore
CalendarHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/*
19----- Opcodes Not Used yet -----
20
21SMSG_CALENDAR_EVENT_INVITE_NOTES [ ObjectGuid(InviteGuid), bool(ClearPending), std::string(Notes), uint64(EventID) ]
22?CMSG_CALENDAR_EVENT_INVITE_NOTES [ ObjectGuid(Guid), uint64(EventID), uint64(InviteID), uint64(ModeratorID), std::string(Notes) ]
23SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT [ uint64(EventID), std::string(Notes) ]
24SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT [ uint64(EventID), uint32(Date), uint32(Flags), uint8(Status) ]
25SMSG_CALENDAR_RAID_LOCKOUT_UPDATED SendCalendarRaidLockoutUpdated(InstanceLock const* save)
26
27@todo
28
29Finish complains' handling - what to do with received complains and how to respond?
30Find out what to do with all "not used yet" opcodes
31Correct errors sending (event/invite not found, invites exceeded, event already passed, permissions etc.)
32Fix locked events to be displayed properly and response time shouldn't be shown for people that haven't respond yet
33Copied events should probably have a new owner
34
35*/
36
37#include "WorldSession.h"
38#include "CalendarMgr.h"
39#include "CalendarPackets.h"
40#include "CharacterCache.h"
41#include "DatabaseEnv.h"
42#include "GameTime.h"
43#include "Guild.h"
44#include "GuildMgr.h"
45#include "InstanceLockMgr.h"
46#include "Log.h"
47#include "ObjectAccessor.h"
48#include "ObjectMgr.h"
49#include "Player.h"
50#include "SocialMgr.h"
51#include "World.h"
52
54{
55 ObjectGuid guid = _player->GetGUID();
56
59
60 CalendarInviteStore playerInvites = sCalendarMgr->GetPlayerInvites(guid);
61 for (CalendarInvite const* invite : playerInvites)
62 {
63 WorldPackets::Calendar::CalendarSendCalendarInviteInfo& inviteInfo = packet.Invites.emplace_back();
64 inviteInfo.EventID = invite->GetEventId();
65 inviteInfo.InviteID = invite->GetInviteId();
66 inviteInfo.InviterGuid = invite->GetSenderGUID();
67 inviteInfo.Status = invite->GetStatus();
68 inviteInfo.Moderator = invite->GetRank();
69 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(invite->GetEventId()))
70 inviteInfo.InviteType = calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() == _player->GetGuildId();
71 }
72
73 CalendarEventStore playerEvents = sCalendarMgr->GetPlayerEvents(guid);
74 for (CalendarEvent const* event : playerEvents)
75 {
76 WorldPackets::Calendar::CalendarSendCalendarEventInfo& eventInfo = packet.Events.emplace_back();
77 eventInfo.EventID = event->GetEventId();
78 eventInfo.Date.SetUtcTimeFromUnixTime(event->GetDate());
79 eventInfo.Date += GetTimezoneOffset();
80 eventInfo.EventClubID = event->GetGuildId();
81 eventInfo.EventName = event->GetTitle();
82 eventInfo.EventType = event->GetType();
83 eventInfo.Flags = event->GetFlags();
84 eventInfo.OwnerGuid = event->GetOwnerGUID();
85 eventInfo.TextureID = event->GetTextureId();
86 }
87
88 for (InstanceLock const* lock : sInstanceLockMgr.GetInstanceLocksForPlayer(_player->GetGUID()))
89 {
91 lockoutInfo.MapID = lock->GetMapId();
92 lockoutInfo.DifficultyID = lock->GetDifficultyId();
93 lockoutInfo.ExpireTime = int32(std::max(std::chrono::duration_cast<Seconds>(lock->GetEffectiveExpiryTime() - GameTime::GetSystemTime()).count(), SI64LIT(0)));
94 lockoutInfo.InstanceID = lock->GetInstanceId();
95 }
96
97 SendPacket(packet.Write());
98}
99
101{
102 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarGetEvent.EventID))
103 sCalendarMgr->SendCalendarEvent(_player->GetGUID(), *calendarEvent, CALENDAR_SENDTYPE_GET);
104 else
105 sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID);
106}
107
109{
110 if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId()))
111 guild->MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, GuildRankOrder(calendarCommunityInvite.MaxRankOrder));
112}
113
115{
116 ObjectGuid guid = _player->GetGUID();
117
118 calendarAddEvent.EventInfo.Time -= GetTimezoneOffset();
119
120 // prevent events in the past
121 if (calendarAddEvent.EventInfo.Time < *GameTime::GetUtcWowTime())
122 {
123 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_PASSED);
124 return;
125 }
126
127 // If the event is a guild event, check if the player is in a guild
129 {
130 if (!_player->GetGuildId())
131 {
132 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_PLAYER_NOT_IN_GUILD);
133 return;
134 }
135 }
136
137 // Check if the player reached the max number of events allowed to create
139 {
140 if (sCalendarMgr->GetGuildEvents(_player->GetGuildId()).size() >= CALENDAR_MAX_GUILD_EVENTS)
141 {
142 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED);
143 return;
144 }
145 }
146 else
147 {
148 if (sCalendarMgr->GetEventsCreatedBy(guid).size() >= CALENDAR_MAX_EVENTS)
149 {
150 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENTS_EXCEEDED);
151 return;
152 }
153 }
154
156 {
157 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_INTERNAL);
158 return;
159 }
161
162 CalendarEvent* calendarEvent = new CalendarEvent(sCalendarMgr->GetFreeEventId(), guid, UI64LIT(0), CalendarEventType(calendarAddEvent.EventInfo.EventType), calendarAddEvent.EventInfo.TextureID,
163 calendarAddEvent.EventInfo.Time.GetUnixTimeFromUtcTime(), calendarAddEvent.EventInfo.Flags, calendarAddEvent.EventInfo.Title, calendarAddEvent.EventInfo.Description, time_t(0));
164
165 if (calendarEvent->IsGuildEvent() || calendarEvent->IsGuildAnnouncement())
166 calendarEvent->SetGuildId(_player->GetGuildId());
167
168 if (calendarEvent->IsGuildAnnouncement())
169 {
171 // WARNING: By passing pointer to a local variable, the underlying method(s) must NOT perform any kind
172 // of storage of the pointer as it will lead to memory corruption
173 sCalendarMgr->AddInvite(calendarEvent, &invite);
174 }
175 else
176 {
178 if (calendarAddEvent.EventInfo.Invites.size() > 1)
179 trans = CharacterDatabase.BeginTransaction();
180
181 for (uint32 i = 0; i < calendarAddEvent.EventInfo.Invites.size(); ++i)
182 {
183 CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent->GetEventId(), calendarAddEvent.EventInfo.Invites[i].Guid,
184 guid, CALENDAR_DEFAULT_RESPONSE_TIME, CalendarInviteStatus(calendarAddEvent.EventInfo.Invites[i].Status),
185 CalendarModerationRank(calendarAddEvent.EventInfo.Invites[i].Moderator), "");
186 sCalendarMgr->AddInvite(calendarEvent, invite, trans);
187 }
188
189 if (calendarAddEvent.EventInfo.Invites.size() > 1)
190 CharacterDatabase.CommitTransaction(trans);
191 }
192
193 sCalendarMgr->AddEvent(calendarEvent, CALENDAR_SENDTYPE_ADD);
194}
195
197{
198 calendarUpdateEvent.EventInfo.Time -= GetTimezoneOffset();
199
200 // prevent events in the past
201 if (calendarUpdateEvent.EventInfo.Time < *GameTime::GetUtcWowTime())
202 return;
203
204 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarUpdateEvent.EventInfo.EventID))
205 {
206 time_t oldEventTime = calendarEvent->GetDate();
207
208 calendarEvent->SetType(CalendarEventType(calendarUpdateEvent.EventInfo.EventType));
209 calendarEvent->SetFlags(calendarUpdateEvent.EventInfo.Flags);
210 calendarEvent->SetDate(calendarUpdateEvent.EventInfo.Time.GetUnixTimeFromUtcTime());
211 calendarEvent->SetTextureId(calendarUpdateEvent.EventInfo.TextureID);
212 calendarEvent->SetTitle(calendarUpdateEvent.EventInfo.Title);
213 calendarEvent->SetDescription(calendarUpdateEvent.EventInfo.Description);
214
215 sCalendarMgr->UpdateEvent(calendarEvent);
216 sCalendarMgr->SendCalendarEventUpdateAlert(*calendarEvent, oldEventTime);
217 }
218 else
219 sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID);
220}
221
223{
224 ObjectGuid guid = _player->GetGUID();
225 sCalendarMgr->RemoveEvent(calendarRemoveEvent.EventID, guid);
226}
227
229{
230 ObjectGuid guid = _player->GetGUID();
231
232 calendarCopyEvent.Date -= GetTimezoneOffset();
233
234 // prevent events in the past
235 if (calendarCopyEvent.Date < *GameTime::GetUtcWowTime())
236 {
237 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_PASSED);
238 return;
239 }
240
241 if (CalendarEvent* oldEvent = sCalendarMgr->GetEvent(calendarCopyEvent.EventID))
242 {
243 // Ensure that the player has access to the event
244 if (oldEvent->IsGuildEvent() || oldEvent->IsGuildAnnouncement())
245 {
246 if (oldEvent->GetGuildId() != _player->GetGuildId())
247 {
248 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
249 return;
250 }
251 }
252 else
253 {
254 if (oldEvent->GetOwnerGUID() != guid)
255 {
256 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
257 return;
258 }
259 }
260
261 // Check if the player reached the max number of events allowed to create
262 if (oldEvent->IsGuildEvent() || oldEvent->IsGuildAnnouncement())
263 {
264 if (sCalendarMgr->GetGuildEvents(_player->GetGuildId()).size() >= CALENDAR_MAX_GUILD_EVENTS)
265 {
266 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED);
267 return;
268 }
269 }
270 else
271 {
272 if (sCalendarMgr->GetEventsCreatedBy(guid).size() >= CALENDAR_MAX_EVENTS)
273 {
274 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENTS_EXCEEDED);
275 return;
276 }
277 }
278
280 {
281 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_INTERNAL);
282 return;
283 }
285
286 CalendarEvent* newEvent = new CalendarEvent(*oldEvent, sCalendarMgr->GetFreeEventId());
287 newEvent->SetDate(calendarCopyEvent.Date.GetUnixTimeFromUtcTime());
288 sCalendarMgr->AddEvent(newEvent, CALENDAR_SENDTYPE_COPY);
289
290 CalendarInviteStore invites = sCalendarMgr->GetEventInvites(calendarCopyEvent.EventID);
292 if (invites.size() > 1)
293 trans = CharacterDatabase.BeginTransaction();
294
295 for (CalendarInviteStore::const_iterator itr = invites.begin(); itr != invites.end(); ++itr)
296 sCalendarMgr->AddInvite(newEvent, new CalendarInvite(**itr, sCalendarMgr->GetFreeInviteId(), newEvent->GetEventId()), trans);
297
298 if (invites.size() > 1)
299 CharacterDatabase.CommitTransaction(trans);
300 // Should we change owner when somebody makes a copy of event owned by another person?
301 }
302 else
303 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
304}
305
307{
308 ObjectGuid playerGuid = _player->GetGUID();
309
310 Optional<uint64> eventId;
311 if (!calendarEventInvite.Creating)
312 eventId = calendarEventInvite.EventID;
313
314 bool isSignUp = calendarEventInvite.IsSignUp;
315
316 std::string inviteeName = calendarEventInvite.Name;
317
318 if (!normalizePlayerName(calendarEventInvite.Name))
319 return;
320
321 auto createInvite = [this, playerGuid, inviteeName, eventId, isSignUp](ObjectGuid const& inviteeGuid, Team inviteeTeam, ObjectGuid::LowType inviteeGuildId, bool inviteeIsIngoring)
322 {
323 if (!_player || _player->GetGUID() != playerGuid)
324 return;
325
326 if (_player->GetTeam() != inviteeTeam && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR))
327 {
328 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_NOT_ALLIED);
329 return;
330 }
331
332 if (inviteeIsIngoring)
333 {
334 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_IGNORING_YOU_S, inviteeName.c_str());
335 return;
336 }
337
338 if (eventId)
339 {
340 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(*eventId))
341 {
342 if (calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() == inviteeGuildId)
343 {
344 // we can't invite guild members to guild events
345 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_NO_GUILD_INVITES);
346 return;
347 }
348
349 CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), *eventId, inviteeGuid, playerGuid, CALENDAR_DEFAULT_RESPONSE_TIME, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, "");
350 sCalendarMgr->AddInvite(calendarEvent, invite);
351 }
352 else
353 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_EVENT_INVALID);
354 }
355 else
356 {
357 if (isSignUp && inviteeGuildId == _player->GetGuildId())
358 {
359 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_NO_GUILD_INVITES);
360 return;
361 }
362
363 CalendarInvite invite(sCalendarMgr->GetFreeInviteId(), 0L, inviteeGuid, playerGuid, CALENDAR_DEFAULT_RESPONSE_TIME, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, "");
364 sCalendarMgr->SendCalendarEventInvite(invite);
365 }
366 };
367
368 if (Player* player = ObjectAccessor::FindConnectedPlayerByName(calendarEventInvite.Name))
369 {
370 // Invitee is online
371 createInvite(player->GetGUID(), player->GetTeam(), player->GetGuildId(), player->GetSocial()->HasIgnore(playerGuid, GetAccountGUID()));
372 }
373 else
374 {
375 // Invitee offline, get data from storage
376 CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByName(inviteeName);
377 if (!characterInfo)
378 {
379 sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_PLAYER_NOT_FOUND);
380 return;
381 }
382
383 GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(Trinity::StringFormat("SELECT 1 FROM character_social cs INNER JOIN characters friend_character ON cs.friend = friend_character.guid WHERE cs.guid = {} AND friend_character.account = {} AND (cs.flags & {}) <> 0",
384 characterInfo->Guid.GetCounter(), characterInfo->AccountId, SOCIAL_FLAG_IGNORED).c_str()))
385 .WithCallback([inviteeGuid = characterInfo->Guid, inviteeTeam = Player::TeamForRace(characterInfo->Race), inviteeGuildId = characterInfo->GuildId, continuation = std::move(createInvite)](QueryResult result)
386 {
387 bool isIgnoring = result != nullptr;
388 continuation(inviteeGuid, inviteeTeam, inviteeGuildId, isIgnoring);
389 });
390 }
391}
392
394{
395 ObjectGuid guid = _player->GetGUID();
396
397 TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_SIGNUP [{}] EventId [{}] Tentative {}", guid.ToString(), calendarEventSignUp.EventID, calendarEventSignUp.Tentative);
398
399 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventSignUp.EventID))
400 {
401 if (calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() != _player->GetGuildId())
402 {
403 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_PLAYER_NOT_IN_GUILD);
404 return;
405 }
406
408 CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEventSignUp.EventID, guid, guid, GameTime::GetGameTime(), status, CALENDAR_RANK_PLAYER, "");
409 sCalendarMgr->AddInvite(calendarEvent, invite);
410 sCalendarMgr->SendCalendarClearPendingAction(guid);
411 }
412 else
413 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
414}
415
417{
418 ObjectGuid guid = _player->GetGUID();
419
420 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarRSVP.EventID))
421 {
422 // I think we still should be able to remove self from locked events
423 if (calendarRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked())
424 {
425 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_LOCKED);
426 return;
427 }
428
429 if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarRSVP.InviteID))
430 {
431 invite->SetStatus(CalendarInviteStatus(calendarRSVP.Status));
432 invite->SetResponseTime(GameTime::GetGameTime());
433
434 sCalendarMgr->UpdateInvite(invite);
435 sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite);
436 sCalendarMgr->SendCalendarClearPendingAction(guid);
437 }
438 else
439 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct?
440 }
441 else
442 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
443}
444
446{
447 ObjectGuid guid = _player->GetGUID();
448
449 TC_LOG_DEBUG("network", "CMSG_CALENDAR_REMOVE_INVITE [{}] EventId [{}], ownerInviteId [{}], Invitee ([{}] id: [{}])",
450 guid.ToString(), calendarRemoveInvite.EventID, calendarRemoveInvite.ModeratorID, calendarRemoveInvite.Guid.ToString(), calendarRemoveInvite.InviteID);
451
452 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarRemoveInvite.EventID))
453 {
454 if (calendarEvent->GetOwnerGUID() == calendarRemoveInvite.Guid)
455 {
456 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_DELETE_CREATOR_FAILED);
457 return;
458 }
459
460 sCalendarMgr->RemoveInvite(calendarRemoveInvite.InviteID, calendarRemoveInvite.EventID, guid);
461 }
462 else
463 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE);
464}
465
467{
468 ObjectGuid guid = _player->GetGUID();
469
470 TC_LOG_DEBUG("network", "CMSG_CALENDAR_STATUS [{}] EventId [{}] ownerInviteId [{}], Invitee ([{}] id: [{}], status {}",
471 guid.ToString(), calendarStatus.EventID, calendarStatus.ModeratorID, calendarStatus.Guid.ToString(), calendarStatus.InviteID, calendarStatus.Status);
472
473 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarStatus.EventID))
474 {
475 if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarStatus.InviteID))
476 {
477 invite->SetStatus((CalendarInviteStatus)calendarStatus.Status);
478
479 sCalendarMgr->UpdateInvite(invite);
480 sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite);
481 sCalendarMgr->SendCalendarClearPendingAction(calendarStatus.Guid);
482 }
483 else
484 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct?
485 }
486 else
487 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
488}
489
491{
492 ObjectGuid guid = _player->GetGUID();
493
494 TC_LOG_DEBUG("network", "CMSG_CALENDAR_MODERATOR_STATUS [{}] EventID [{}] ModeratorID [{}], Invitee ([{}] InviteID: [{}], Status {}",
495 guid.ToString(), calendarModeratorStatus.EventID, calendarModeratorStatus.ModeratorID, calendarModeratorStatus.Guid.ToString(), calendarModeratorStatus.InviteID,
496 calendarModeratorStatus.Status);
497
498 if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarModeratorStatus.EventID))
499 {
500 if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarModeratorStatus.InviteID))
501 {
502 invite->SetRank(CalendarModerationRank(calendarModeratorStatus.Status));
503 sCalendarMgr->UpdateInvite(invite);
504 sCalendarMgr->SendCalendarEventModeratorStatusAlert(*calendarEvent, *invite);
505 }
506 else
507 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct?
508 }
509 else
510 sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
511}
512
514{
515 ObjectGuid guid = _player->GetGUID();
516 TC_LOG_DEBUG("network", "CMSG_CALENDAR_COMPLAIN [{}] EventId [{}] guid [{}] InviteId [{}]", guid.ToString(), calendarComplain.EventID,
517 calendarComplain.InvitedByGUID.ToString(), calendarComplain.InviteID);
518
519 // what to do with complains?
520}
521
523{
524 ObjectGuid guid = _player->GetGUID();
525 uint32 pending = sCalendarMgr->GetPlayerNumPending(guid);
526
527 TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET_NUM_PENDING: [{}] Pending: {}", guid.ToString(), pending);
528
530}
531
533{
534 TC_LOG_DEBUG("network", "CMSG_SET_SAVED_INSTANCE_EXTEND - MapId: {}, Difficulty: {}, ToggleExtend: {}", setSavedInstanceExtend.MapID, setSavedInstanceExtend.DifficultyID, setSavedInstanceExtend.Extend ? "On" : "Off");
535
536 // cannot modify locks currently in use
537 if (_player->GetMapId() == uint32(setSavedInstanceExtend.MapID))
538 return;
539
540 std::pair<InstanceResetTimePoint, InstanceResetTimePoint> expiryTimes = sInstanceLockMgr.UpdateInstanceLockExtensionForPlayer(_player->GetGUID(),
541 { uint32(setSavedInstanceExtend.MapID), Difficulty(setSavedInstanceExtend.DifficultyID) }, setSavedInstanceExtend.Extend);
542
543 if (expiryTimes.first == InstanceResetTimePoint::min())
544 return;
545
547 calendarRaidLockoutUpdated.ServerTime = *GameTime::GetWowTime();
548 calendarRaidLockoutUpdated.MapID = setSavedInstanceExtend.MapID;
549 calendarRaidLockoutUpdated.DifficultyID = setSavedInstanceExtend.DifficultyID;
550 calendarRaidLockoutUpdated.OldTimeRemaining = std::max(std::chrono::duration_cast<Seconds>(expiryTimes.first - GameTime::GetSystemTime()).count(), SI64LIT(0));
551 calendarRaidLockoutUpdated.NewTimeRemaining = std::max(std::chrono::duration_cast<Seconds>(expiryTimes.second - GameTime::GetSystemTime()).count(), SI64LIT(0));
552 SendPacket(calendarRaidLockoutUpdated.Write());
553}
554
555// ----------------------------------- SEND ------------------------------------
556
558{
560 calendarRaidLockoutAdded.InstanceID = lock->GetInstanceId();
561 calendarRaidLockoutAdded.ServerTime = *GameTime::GetWowTime();
562 calendarRaidLockoutAdded.MapID = int32(lock->GetMapId());
563 calendarRaidLockoutAdded.DifficultyID = lock->GetDifficultyId();
564 calendarRaidLockoutAdded.TimeRemaining = int32(std::chrono::duration_cast<Seconds>(lock->GetEffectiveExpiryTime() - GameTime::GetSystemTime()).count());
565 SendPacket(calendarRaidLockoutAdded.Write());
566}
567
569{
571 calendarRaidLockoutRemoved.InstanceID = lock->GetInstanceId();
572 calendarRaidLockoutRemoved.MapID = int32(lock->GetMapId());
573 calendarRaidLockoutRemoved.DifficultyID = lock->GetDifficultyId();
574 SendPacket(calendarRaidLockoutRemoved.Write());
575}
std::set< CalendarEvent * > CalendarEventStore
Definition: CalendarMgr.h:294
#define sCalendarMgr
Definition: CalendarMgr.h:370
@ CALENDAR_ERROR_INTERNAL
Definition: CalendarMgr.h:104
@ CALENDAR_ERROR_NO_INVITE
Definition: CalendarMgr.h:123
@ CALENDAR_ERROR_EVENT_PASSED
Definition: CalendarMgr.h:115
@ CALENDAR_ERROR_EVENT_LOCKED
Definition: CalendarMgr.h:116
@ CALENDAR_ERROR_NOT_ALLIED
Definition: CalendarMgr.h:108
@ CALENDAR_ERROR_EVENTS_EXCEEDED
Definition: CalendarMgr.h:98
@ CALENDAR_ERROR_NO_GUILD_INVITES
Definition: CalendarMgr.h:127
@ CALENDAR_ERROR_DELETE_CREATOR_FAILED
Definition: CalendarMgr.h:117
@ CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED
Definition: CalendarMgr.h:97
@ CALENDAR_ERROR_IGNORING_YOU_S
Definition: CalendarMgr.h:109
@ CALENDAR_ERROR_PLAYER_NOT_FOUND
Definition: CalendarMgr.h:107
@ CALENDAR_ERROR_EVENT_INVALID
Definition: CalendarMgr.h:102
@ CALENDAR_ERROR_GUILD_PLAYER_NOT_IN_GUILD
Definition: CalendarMgr.h:105
#define CALENDAR_DEFAULT_RESPONSE_TIME
Definition: CalendarMgr.h:141
CalendarModerationRank
Definition: CalendarMgr.h:49
@ CALENDAR_RANK_PLAYER
Definition: CalendarMgr.h:50
std::vector< CalendarInvite * > CalendarInviteStore
Definition: CalendarMgr.h:293
@ CALENDAR_SENDTYPE_GET
Definition: CalendarMgr.h:57
@ CALENDAR_SENDTYPE_COPY
Definition: CalendarMgr.h:59
@ CALENDAR_SENDTYPE_ADD
Definition: CalendarMgr.h:58
CalendarEventType
Definition: CalendarMgr.h:63
CalendarInviteStatus
Definition: CalendarMgr.h:81
@ CALENDAR_STATUS_TENTATIVE
Definition: CalendarMgr.h:90
@ CALENDAR_STATUS_NOT_SIGNED_UP
Definition: CalendarMgr.h:89
@ CALENDAR_STATUS_INVITED
Definition: CalendarMgr.h:82
@ CALENDAR_STATUS_SIGNED_UP
Definition: CalendarMgr.h:88
@ CALENDAR_STATUS_REMOVED
Definition: CalendarMgr.h:91
@ CALENDAR_MAX_EVENTS
Definition: CalendarMgr.h:134
@ CALENDAR_MAX_GUILD_EVENTS
Definition: CalendarMgr.h:135
@ CALENDAR_CREATE_EVENT_COOLDOWN
Definition: CalendarMgr.h:137
#define sCharacterCache
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
#define SI64LIT(N)
Definition: Define.h:130
int32_t int32
Definition: Define.h:138
#define UI64LIT(N)
Definition: Define.h:127
uint32_t uint32
Definition: Define.h:142
#define sGuildMgr
Definition: GuildMgr.h:70
GuildRankOrder
Definition: Guild.h:100
#define sInstanceLockMgr
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
bool normalizePlayerName(std::string &name)
Definition: ObjectMgr.cpp:154
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
Team
@ SOCIAL_FLAG_IGNORED
Definition: SocialMgr.h:41
Definition: Guild.h:329
Difficulty GetDifficultyId() const
uint32 GetMapId() const
InstanceResetTimePoint GetEffectiveExpiryTime() const
uint32 GetInstanceId() const
LowType GetCounter() const
Definition: ObjectGuid.h:293
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
std::string ToString() const
Definition: ObjectGuid.cpp:554
uint64 LowType
Definition: ObjectGuid.h:278
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Team TeamForRace(uint8 race)
Definition: Player.cpp:6454
ObjectGuid::LowType GetGuildId() const
Definition: Player.h:1993
Team GetTeam() const
Definition: Player.h:2235
QueryCallback && WithCallback(std::function< void(QueryResult)> &&callback)
constexpr uint32 GetMapId() const
Definition: Position.h:201
std::vector< CalendarSendCalendarInviteInfo > Invites
std::vector< CalendarSendCalendarRaidLockoutInfo > RaidLockouts
std::vector< CalendarSendCalendarEventInfo > Events
void HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyEvent &calendarCopyEvent)
time_t GetCalendarEventCreationCooldown() const
void HandleCalendarCommunityInvite(WorldPackets::Calendar::CalendarCommunityInviteRequest &calendarCommunityInvite)
void HandleCalendarRsvp(WorldPackets::Calendar::CalendarRSVP &calendarRSVP)
void HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEvent &calendarGetEvent)
void HandleCalendarEventRemoveInvite(WorldPackets::Calendar::CalendarRemoveInvite &calendarRemoveInvite)
void HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGetCalendar &calendarGetCalendar)
void HandleCalendarComplain(WorldPackets::Calendar::CalendarComplain &calendarComplain)
ObjectGuid GetAccountGUID() const
void HandleSetSavedInstanceExtend(WorldPackets::Calendar::SetSavedInstanceExtend &setSavedInstanceExtend)
Minutes GetTimezoneOffset() const
void SendCalendarRaidLockoutAdded(InstanceLock const *lock)
QueryCallbackProcessor & GetQueryProcessor()
void HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEventSignUp &calendarEventSignUp)
void HandleCalendarUpdateEvent(WorldPackets::Calendar::CalendarUpdateEvent &calendarUpdateEvent)
void SetCalendarEventCreationCooldown(time_t cooldown)
void HandleCalendarStatus(WorldPackets::Calendar::CalendarStatus &calendarStatus)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
Player * _player
void HandleCalendarInvite(WorldPackets::Calendar::CalendarInvite &calendarEventInvite)
void HandleCalendarModeratorStatus(WorldPackets::Calendar::CalendarModeratorStatusQuery &calendarModeratorStatus)
void HandleCalendarRemoveEvent(WorldPackets::Calendar::CalendarRemoveEvent &calendarRemoveEvent)
void HandleCalendarGetNumPending(WorldPackets::Calendar::CalendarGetNumPending &calendarGetNumPending)
void HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent &calendarAddEvent)
void SendCalendarRaidLockoutRemoved(InstanceLock const *lock)
std::time_t GetUnixTimeFromUtcTime() const
Definition: WowTime.cpp:65
void SetUtcTimeFromUnixTime(std::time_t unixTime)
Definition: WowTime.cpp:86
#define sWorld
Definition: World.h:931
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_CALENDAR
Definition: World.h:109
WowTime const * GetWowTime()
Definition: GameTime.cpp:97
WowTime const * GetUtcWowTime()
Definition: GameTime.cpp:92
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
Definition: GameTime.cpp:54
time_t GetGameTime()
Definition: GameTime.cpp:44
TC_GAME_API Player * FindConnectedPlayerByName(std::string_view name)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
Definition: StringFormat.h:38
bool IsGuildAnnouncement() const
Definition: CalendarMgr.h:269
bool IsGuildEvent() const
Definition: CalendarMgr.h:268
uint64 GetEventId() const
Definition: CalendarMgr.h:242
void SetGuildId(ObjectGuid::LowType guildId)
Definition: CalendarMgr.h:247
void SetDate(time_t date)
Definition: CalendarMgr.h:262
ObjectGuid::LowType GuildId
Array< CalendarAddEventInviteInfo, CALENDAR_MAX_INVITES > Invites