GroupCalendar_cTitle = string.format(GroupCalendar_cTitle, gGroupCalendar_VersionString); gGroupCalendar_Settings = { Debug = false, ShowEventsInLocalTime = false, }; gGroupCalendar_PlayerSettings = nil; gGroupCalendar_RealmSettings = nil; gGroupCalendar_PlayerName = nil; gGroupCalendar_PlayerGuild = nil; gGroupCalendar_PlayerLevel = nil; gGroupCalendar_PlayerFactionGroup = nil; gGroupCalendar_PlayerGuildRank = nil; gGroupCalendar_RealmName = GetRealmName(); gGroupCalendar_Initialized = false; gGroupCalendar_ServerTimeZoneOffset = 0; -- Offset that, when added to the server time yields the local time gGroupCalendar_ActiveDialog = nil; gGroupCalendar_CurrentPanel = 1; gGroupCalendar_PanelFrames = { "GroupCalendarCalendarFrame", "GroupCalendarChannelFrame", "GroupCalendarTrustFrame", "GroupCalendarAboutFrame", }; function GroupCalendar_OnLoad() SlashCmdList["CALENDAR"] = GroupCalendar_ExecuteCommand; SLASH_CALENDAR1 = "/calendar"; tinsert(UISpecialFrames, "GroupCalendarFrame"); UIPanelWindows["GroupCalendarFrame"] = {area = "left", pushable = 5, whileDead = 1}; gGroupCalendar_PlayerName = UnitName("player"); gGroupCalendar_PlayerLevel = UnitLevel("player"); -- Register events GroupCalendar_RegisterEvent(this, "VARIABLES_LOADED", GroupCalendar_VariablesLoaded); GroupCalendar_RegisterEvent(this, "PLAYER_ENTERING_WORLD", GroupCalendar_PlayerEnteringWorld); -- For updating auto-config settings and guild trust -- values GroupCalendar_RegisterEvent(this, "GUILD_ROSTER_UPDATE", GroupCalendar_GuildRosterUpdate); GroupCalendar_RegisterEvent(this, "PLAYER_GUILD_UPDATE", GroupCalendar_PlayerGuildUpdate); -- For updating the enabled events when the players -- level changes GroupCalendar_RegisterEvent(this, "PLAYER_LEVEL_UP", GroupCalendar_PlayerLevelUp); -- For monitoring the status of the chat channel GroupCalendar_RegisterEvent(this, "CHAT_MSG_SYSTEM", GroupCalendar_ChatMsgSystem); GroupCalendar_RegisterEvent(this, "CHAT_MSG_CHANNEL_NOTICE", GroupCalendar_ChatMsgChannelNotice); GroupCalendar_RegisterEvent(this, "CHAT_MSG_WHISPER", GroupCalendar_ChatMsgWhisper); -- For suspending/resuming the chat channel during logout GroupCalendar_RegisterEvent(this, "PLAYER_CAMPING", CalendarNetwork_SuspendChannel); GroupCalendar_RegisterEvent(this, "PLAYER_QUITING", CalendarNetwork_SuspendChannel); GroupCalendar_RegisterEvent(this, "LOGOUT_CANCEL", CalendarNetwork_ResumeChannel); -- For monitoring tradeskill cooldowns GroupCalendar_RegisterEvent(this, "TRADE_SKILL_UPDATE", EventDatabase_UpdateCurrentTradeskillCooldown); GroupCalendar_RegisterEvent(this, "TRADE_SKILL_SHOW", EventDatabase_UpdateCurrentTradeskillCooldown); GroupCalendar_RegisterEvent(this, "BAG_UPDATE_COOLDOWN", GroupCalendar_CheckItemCooldowns); GroupCalendar_RegisterEvent(this, "BAG_UPDATE", GroupCalendar_CheckItemCooldowns); -- For managing group invites GroupCalendar_RegisterEvent(this, "PARTY_MEMBERS_CHANGED", CalendarGroupInvites_PartyMembersChanged); GroupCalendar_RegisterEvent(this, "RAID_ROSTER_UPDATE", CalendarGroupInvites_PartyMembersChanged); GroupCalendar_RegisterEvent(this, "PARTY_LOOT_METHOD_CHANGED", CalendarGroupInvites_PartyLootMethodChanged); -- For dragging the window this:RegisterForDrag("LeftButton"); -- Tabs PanelTemplates_SetNumTabs(this, table.getn(gGroupCalendar_PanelFrames)); GroupCalendarFrame.selectedTab = gGroupCalendar_CurrentPanel; PanelTemplates_UpdateTabs(this); -- Done initializing if DEFAULT_CHAT_FRAME then DEFAULT_CHAT_FRAME:AddMessage(GroupCalendar_cLoadMessage, 0.8, 0.8, 0.2); end end function GroupCalendar_RegisterEvent(pFrame, pEvent, pHandler) if not pHandler then Calendar_ErrorMessage("GroupCalendar: Attemping to install a nil handler for event "..pEvent); return; end if not pFrame.EventHandlers then pFrame.EventHandlers = {}; end pFrame.EventHandlers[pEvent] = pHandler; pFrame:RegisterEvent(pEvent); end function GroupCalendar_UnregisterEvent(pFrame, pEvent) if pFrame.EventHandlers then pFrame.EventHandlers[pEvent] = nil; end pFrame:UnregisterEvent(pEvent); end function GroupCalendar_DispatchEvent(pFrame, pEvent) if not pFrame.EventHandlers then return false; end local vEventHandler = pFrame.EventHandlers[pEvent]; if not vEventHandler then Calendar_ErrorMessage("GroupCalendar: No event handler for "..pEvent); return false; end vEventHandler(pEvent); return true; end function GroupCalendar_VariablesLoaded() gGroupCalendar_MinimumEventDate = Calendar_GetCurrentLocalDate() - gGroupCalendar_MaximumEventAge; EventDatabase_SetUserName(gGroupCalendar_PlayerName); EventDatabase_PlayerLevelChanged(gGroupCalendar_PlayerLevel); CalendarNetwork_CheckPlayerGuild(); EventDatabase_Initialize(); CalendarNetwork_CalendarLoaded(); end function GroupCalendar_OnShow() PlaySound("igCharacterInfoOpen"); local vYear, vMonth, vDay, vHour, vMinute = Calendar_GetCurrentYearMonthDayHourMinute(); local vMonthStartDate = Calendar_ConvertMDYToDate(vMonth, 1, vYear); -- Update the guild roster if IsInGuild() and GetNumGuildMembers() == 0 then GuildRoster(); end Calendar_SetDisplayDate(vMonthStartDate); Calendar_SetActualDate(vMonthStartDate + vDay - 1); GroupCalendar_ShowPanel(1); -- Always switch back to the Calendar view when showing the window GroupCalendarUseServerTime:SetChecked(not gGroupCalendar_Settings.ShowEventsInLocalTime); end function GroupCalendar_OnHide() PlaySound("igCharacterInfoClose"); CalendarEventEditor_DoneEditing(); CalendarEventViewer_DoneViewing(); CalendarEditor_Close(); end function GroupCalendar_OnEvent(pEvent) local vLatencyStartTime; if gGroupCalendar_Settings.DebugLatency then vLatencyStartTime = GetTime(); end if GroupCalendar_DispatchEvent(this, pEvent) then -- Handled elseif pEvent == "CHAT_MSG_SYSTEM" then CalendarNetwork_SystemMessage(arg1); CalendarGroupInvites_SystemMessage(arg1); elseif pEvent == "GUILD_ROSTER_UPDATE" then -- Ignore the update if we're not initialized yet if not gGroupCalendar_Initialized then return; end CalendarNetwork_GuildRosterChanged(); CalendarGroupInvites_GuildRosterChanged(); elseif pEvent == "PLAYER_GUILD_UPDATE" then CalendarNetwork_CheckPlayerGuild(); -- Ignore the update if we're not initialized yet if not gGroupCalendar_Initialized then return; end GroupCalendar_UpdateEnabledControls(); elseif pEvent == "PLAYER_LEVEL_UP" then gGroupCalendar_PlayerLevel = tonumber(arg1); EventDatabase_PlayerLevelChanged(gGroupCalendar_PlayerLevel); GroupCalendar_MajorDatabaseChange(nil); end -- if gGroupCalendar_Settings.DebugLatency then local vElapsed = GetTime() - vLatencyStartTime; if vElapsed > 0.1 then Calendar_DebugMessage("Event "..pEvent.." took "..vElapsed.."s to execute"); end end end function GroupCalendar_PlayerEnteringWorld(pEvent) Calendar_InitDebugging(); gGroupCalendar_PlayerSettings = GroupCalendar_GetPlayerSettings(gGroupCalendar_PlayerName, GetRealmName()); gGroupCalendar_RealmSettings = GroupCalendar_GetRealmSettings(GetRealmName()); gGroupCalendar_PlayerLevel = UnitLevel("player"); gGroupCalendar_PlayerFactionGroup = UnitFactionGroup("player"); gGroupCalendar_PlayerSettings = GroupCalendar_GetPlayerSettings(gGroupCalendar_PlayerName, GetRealmName()); gGroupCalendar_RealmSettings = GroupCalendar_GetRealmSettings(GetRealmName()); EventDatabase_PlayerLevelChanged(gGroupCalendar_PlayerLevel); GroupCalendar_CalculateTimeZoneOffset(); GroupCalendar_MajorDatabaseChange(nil); end function GroupCalendar_ChatMsgChannel(pEvent) if arg9 and strlower(arg9) == gGroupCalendar_Channel.NameLower and arg1 and type(arg1) == "string" then if arg2 == gGroupCalendar_PlayerName then -- Ignore messages from ourselves if not gGroupCalendar_Settings.Debug then return; end -- Special debugging case: allow self-send of messages starting with '!' if strsub(arg1, 1, 1) ~= "!" then return; end arg1 = strsub(arg1, 2); end -- Clean up drunkeness if strsub(arg1, -8) == " ...hic!" then arg1 = strsub(arg1, 1, -9); end arg1 = Calendar_UnescapeChatString(arg1); -- CalendarNetwork_ChannelMessageReceived(arg2, arg1); end end function GroupCalendar_ChatMsgChannelNotice(pEvent) local vChannelMessage = arg1; local vChannelName = arg4; local vChannelID = arg8; local vActualChannelName = arg9; CalendarNetwork_ChannelNotice(vChannelMessage, vChannelName, vChannelID, vActualChannelName); end function GroupCalendar_ChatMsgWhisper(pEvent) CalendarWhisperLog_AddWhisper(arg2, arg1); end function GroupCalendar_ChatMsgSystem(pEvent) CalendarNetwork_SystemMessage(arg1); CalendarGroupInvites_SystemMessage(arg1); end function GroupCalendar_GuildRosterUpdate(pEvent) -- Ignore the update if we're not initialized yet if not gGroupCalendar_Initialized then return; end CalendarNetwork_GuildRosterChanged(); CalendarGroupInvites_GuildRosterChanged(); end function GroupCalendar_PlayerGuildUpdate(pEvent) CalendarNetwork_CheckPlayerGuild(); -- Ignore the update if we're not initialized yet if not gGroupCalendar_Initialized then return; end GroupCalendar_UpdateEnabledControls(); end function GroupCalendar_PlayerLevelUp(pEvent) gGroupCalendar_PlayerLevel = tonumber(arg1); EventDatabase_PlayerLevelChanged(gGroupCalendar_PlayerLevel); GroupCalendar_MajorDatabaseChange(nil); end GroupCalendar_cCooldownItemInfo = { [15846] = {EventID = "Leatherworking"}, -- Salt Shaker [17716] = {EventID = "Snowmaster"}, -- Snowmaster 9000 }; function GroupCalendar_CheckItemCooldowns() for vBagIndex = 0, NUM_BAG_SLOTS do local vNumBagSlots = GetContainerNumSlots(vBagIndex); for vBagSlotIndex = 1, vNumBagSlots do local vItemLink = GetContainerItemLink(vBagIndex, vBagSlotIndex); if vItemLink then local vStartIndex, vEndIndex, vLinkColor, vItemCode, vItemEnchantCode, vItemSubCode, vUnknownCode, vItemName = strfind(vItemLink, "|(%x+)|Hitem:(%d+):(%d+):(%d+):(%d+)|h%[([^%]]+)%]|h|r"); if vStartIndex then vItemCode = tonumber(vItemCode); local vCooldownItemInfo = GroupCalendar_cCooldownItemInfo[vItemCode]; if vCooldownItemInfo then local vStart, vDuration, vEnable = GetContainerItemCooldown(vBagIndex, vBagSlotIndex); -- local texture, itemCount, locked, quality, readable = GetContainerItemInfo(vBagIndex, vBagSlotIndex); -- Calendar_TestMessage(vItemName..": "..texture); if vEnable > 0 then vRemainingTime = vDuration - (GetTime() - vStart); if vRemainingTime > 0 then EventDatabase_ScheduleTradeskillCooldownEvent(gGroupCalendar_UserDatabase, vCooldownItemInfo.EventID, vRemainingTime); end end end end end end end end function GroupCalendar_UpdateEnabledControls() if GroupCalendarFrame.selectedTab == 1 then -- Update the calendar display elseif GroupCalendarFrame.selectedTab == 2 then -- Update the channel frame Calendar_SetCheckButtonEnable(GroupCalendarAutoChannelConfig, IsInGuild()); Calendar_SetEditBoxEnable(GroupCalendarChannelName, GroupCalendarManualChannelConfig:GetChecked()); Calendar_SetEditBoxEnable(GroupCalendarChannelPassword, GroupCalendarManualChannelConfig:GetChecked()); if IsInGuild() and CanEditPublicNote() and GroupCalendarManualChannelConfig:GetChecked() then Calendar_SetCheckButtonEnable(GroupCalendarStoreAutoConfig, true); if GroupCalendarStoreAutoConfig:GetChecked() then Calendar_SetEditBoxEnable(GroupCalendarAutoConfigPlayer, true); else Calendar_SetEditBoxEnable(GroupCalendarAutoConfigPlayer, false); end else Calendar_SetCheckButtonEnable(GroupCalendarStoreAutoConfig, false); Calendar_SetEditBoxEnable(GroupCalendarAutoConfigPlayer, false); end Calendar_SetButtonEnable(GroupCalendarApplyChannelButton, GroupCalendar_ChannelPanelHasChanges()); elseif GroupCalendarFrame.selectedTab == 3 then -- Update the trust frame if gGroupCalendar_PlayerSettings.Channel.AutoConfig then Calendar_SetDropDownEnable(GroupCalendarTrustGroup, false); Calendar_SetDropDownEnable(GroupCalendarTrustMinRank, false); else GroupCalendar_SaveTrustGroup(); Calendar_SetDropDownEnable(GroupCalendarTrustGroup, true); Calendar_SetDropDownEnable(GroupCalendarTrustMinRank, UIDropDownMenu_GetSelectedValue(GroupCalendarTrustGroup) == 2); end if UIDropDownMenu_GetSelectedValue(GroupCalendarTrustGroup) == 2 then GroupCalendarTrustMinRank:Show(); else GroupCalendarTrustMinRank:Hide(); end elseif GroupCalendarFrame.selectedTab == 4 then -- Update the ignore frame end end function GroupCalendar_SetAutoChannelConfig(pEnableAutoConfig) GroupCalendarAutoChannelConfig:SetChecked(pEnableAutoConfig); GroupCalendarManualChannelConfig:SetChecked(not pEnableAutoConfig); GroupCalendar_UpdateEnabledControls(); end function GroupCalendar_EnableAutoConfigPlayer(pEnableStoreAutoConfig) GroupCalendarStoreAutoConfig:SetChecked(pEnableStoreAutoConfig); GroupCalendar_UpdateEnabledControls(); end function GroupCalendar_SavePanel(pIndex) if pIndex == 2 then -- Channel panel gGroupCalendar_PlayerSettings.Channel.AutoConfig = GroupCalendarAutoChannelConfig:GetChecked() == 1; if gGroupCalendar_PlayerSettings.Channel.AutoConfig then gGroupCalendar_PlayerSettings.Channel.Name = nil; gGroupCalendar_PlayerSettings.Channel.Password = nil; gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer = nil; CalendarNetwork_ScheduleAutoConfig(0.5); GroupCalendar_ShowPanel(pIndex); -- Refresh the controls else gGroupCalendar_PlayerSettings.Channel.Name = GroupCalendarChannelName:GetText(); if gGroupCalendar_PlayerSettings.Channel.Name == "" then gGroupCalendar_PlayerSettings.Channel.Name = nil; end gGroupCalendar_PlayerSettings.Channel.Password = GroupCalendarChannelPassword:GetText(); if gGroupCalendar_PlayerSettings.Channel.Password == "" then gGroupCalendar_PlayerSettings.Channel.Password = nil; end CalendarNetwork_SetChannel(gGroupCalendar_PlayerSettings.Channel.Name, gGroupCalendar_PlayerSettings.Channel.Password); if GroupCalendarStoreAutoConfig:GetChecked() then gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer = GroupCalendarAutoConfigPlayer:GetText(); CalendarNetwork_SetAutoConfigData(gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer); elseif gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer then gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer = nil; if CanEditPublicNote() then CalendarNetwork_RemoveAllAutoConfigData(); end end end elseif pIndex == 3 then -- Trust panel if not gGroupCalendar_PlayerSettings.Channel.AutoConfig then GroupCalendar_SaveTrustGroup(); end end GroupCalendar_UpdateEnabledControls(); end function GroupCalendar_ChannelPanelHasChanges() if (GroupCalendarAutoChannelConfig:GetChecked() == 1) ~= gGroupCalendar_PlayerSettings.Channel.AutoConfig then return true; end if GroupCalendarManualChannelConfig:GetChecked() then local vChannelName = gGroupCalendar_PlayerSettings.Channel.Name; if not vChannelName then vChannelName = ""; end local vChannelPassword = gGroupCalendar_PlayerSettings.Channel.Password; if not vChannelPassword then vChannelPassword = ""; end if GroupCalendarChannelName:GetText() ~= vChannelName or GroupCalendarChannelPassword:GetText() ~= vChannelPassword then return true; end end local vStoreAutoConfigIsEnabled = (not gGroupCalendar_PlayerSettings.Channel.AutoConfig) and (gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer ~= nil); if (GroupCalendarStoreAutoConfig:GetChecked() == 1) ~= vStoreAutoConfigIsEnabled then return true; end if GroupCalendarStoreAutoConfig:GetChecked() and GroupCalendarAutoConfigPlayer:GetText() ~= gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer then return true; end return false; end function GroupCalendar_SaveTrustGroup() local vTrustGroup = UIDropDownMenu_GetSelectedValue(GroupCalendarTrustGroup); local vChanged = false; if vTrustGroup == 1 and not gGroupCalendar_PlayerSettings.Security.TrustAnyone then gGroupCalendar_PlayerSettings.Security.TrustAnyone = true; gGroupCalendar_PlayerSettings.Security.TrustGuildies = false; vChanged = true; elseif vTrustGroup == 2 then if not gGroupCalendar_PlayerSettings.Security.TrustGuildies then gGroupCalendar_PlayerSettings.Security.TrustAnyone = false; gGroupCalendar_PlayerSettings.Security.TrustGuildies = true; vChanged = true; end local vMinTrustedRank = UIDropDownMenu_GetSelectedValue(GroupCalendarTrustMinRank); if not vMinTrustedRank then vMinTrustedRank = 1; CalendarDropDown_SetSelectedValue(GroupCalendarTrustMinRank, vMinTrustedRank); end if vMinTrustedRank ~= gGroupCalendar_PlayerSettings.Security.MinTrustedRank then gGroupCalendar_PlayerSettings.Security.MinTrustedRank = vMinTrustedRank; vChanged = true; end elseif vTrustGroup == 3 and (gGroupCalendar_PlayerSettings.Security.TrustAnyone or gGroupCalendar_PlayerSettings.Security.TrustGuildies) then gGroupCalendar_PlayerSettings.Security.TrustAnyone = false; gGroupCalendar_PlayerSettings.Security.TrustGuildies = false; vChanged = true; end if vChanged then -- Update auto-config string with the trust config if CanEditPublicNote() and gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer then CalendarNetwork_SetAutoConfigData(gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer); end CalendarTrust_TrustSettingsChanged(); end end function GroupCalendar_ShowPanel(pPanelIndex) if gGroupCalendar_CurrentPanel > 0 and gGroupCalendar_CurrentPanel ~= pPanelIndex then GroupCalendar_HidePanel(gGroupCalendar_CurrentPanel); end -- NOTE: Don't check for redundant calls since this function -- will be called to reset the field values as well as to -- actuall show the panel when it's hidden gGroupCalendar_CurrentPanel = pPanelIndex; -- Hide the event editor/viewer if the calendar panel is being hidden if pPanelIndex ~= 1 then CalendarEventEditor_DoneEditing(); CalendarEventViewer_DoneViewing(); CalendarEditor_Close(); end -- Update the control values if pPanelIndex == 1 then elseif pPanelIndex == 2 then -- Channel panel if gGroupCalendar_PlayerSettings.Channel.AutoConfig and not IsInGuild() then gGroupCalendar_PlayerSettings.Channel.AutoConfig = false; end GroupCalendarAutoChannelConfig:SetChecked(gGroupCalendar_PlayerSettings.Channel.AutoConfig); GroupCalendarManualChannelConfig:SetChecked(not gGroupCalendar_PlayerSettings.Channel.AutoConfig); local vChannelName; local vAutoConfigPlayer; if gGroupCalendar_PlayerSettings.Channel.AutoConfig then vChannelName = gGroupCalendar_Channel.Name; if gGroupCalendar_Channel.Password then GroupCalendarChannelPassword:SetText("******"); else GroupCalendarChannelPassword:SetText(""); end vAutoConfigPlayer = gGroupCalendar_Channel.AutoPlayer; else vChannelName = gGroupCalendar_PlayerSettings.Channel.Name; vAutoConfigPlayer = gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer; if gGroupCalendar_PlayerSettings.Channel.Password then GroupCalendarChannelPassword:SetText(gGroupCalendar_PlayerSettings.Channel.Password); else GroupCalendarChannelPassword:SetText(""); end end if vChannelName ~= nil then GroupCalendarChannelName:SetText(vChannelName); else GroupCalendarChannelName:SetText(""); end if vAutoConfigPlayer then GroupCalendarAutoConfigPlayer:SetText(vAutoConfigPlayer); else GroupCalendarAutoConfigPlayer:SetText(""); end if not gGroupCalendar_PlayerSettings.Channel.AutoConfig and gGroupCalendar_PlayerSettings.Channel.AutoConfigPlayer then GroupCalendarStoreAutoConfig:SetChecked(true); else GroupCalendarStoreAutoConfig:SetChecked(false); end GroupCalendar_UpdateChannelStatus(); elseif pPanelIndex == 3 then -- Trust panel GroupCalendarTrustGroup.ChangedValueFunc = GroupCalendar_UpdateEnabledControls; if gGroupCalendar_PlayerSettings.Security.TrustGuildies and not IsInGuild() then gGroupCalendar_PlayerSettings.Security.TrustGuildies = false; end if gGroupCalendar_PlayerSettings.Security.TrustAnyone then CalendarDropDown_SetSelectedValue(GroupCalendarTrustGroup, 1); elseif gGroupCalendar_PlayerSettings.Security.TrustGuildies then CalendarDropDown_SetSelectedValue(GroupCalendarTrustGroup, 2); else CalendarDropDown_SetSelectedValue(GroupCalendarTrustGroup, 3); end if gGroupCalendar_PlayerSettings.Security.TrustGuildies then GroupCalendarTrustMinRank:Show(); if gGroupCalendar_PlayerSettings.Security.MinTrustedRank ~= nil then CalendarDropDown_SetSelectedValue(GroupCalendarTrustMinRank, gGroupCalendar_PlayerSettings.Security.MinTrustedRank); else UIDropDownMenu_SetText("", GroupCalendarTrustMinRank); -- In case the value doesn't exist end else GroupCalendarTrustMinRank:Hide(); end CalendarPlayerList_SetItemFunction(CalendarTrustedPlayersList, GroupCalendar_GetIndexedTrustedPlayer); CalendarPlayerList_SetSelectionChangedFunction(CalendarTrustedPlayersList, GroupCalendar_TrustedPlayerSelected); CalendarPlayerList_SetItemFunction(CalendarExcludedPlayersList, GroupCalendar_GetIndexedExcludedPlayer); CalendarPlayerList_SetSelectionChangedFunction(CalendarExcludedPlayersList, GroupCalendar_ExcludedPlayerSelected); end GroupCalendar_UpdateEnabledControls(); getglobal(gGroupCalendar_PanelFrames[pPanelIndex]):Show(); PanelTemplates_SetTab(GroupCalendarFrame, pPanelIndex); end function GroupCalendar_HidePanel(pFrameIndex) if gGroupCalendar_CurrentPanel ~= pFrameIndex then return; end GroupCalendar_SavePanel(pFrameIndex); getglobal(gGroupCalendar_PanelFrames[pFrameIndex]):Hide(); gGroupCalendar_CurrentPanel = 0; end function GroupCalendar_UpdateChannelStatus() local vChannelStatus = CalendarNetwork_GetChannelStatus(); local vStatusText = GroupCalendar_cChannelStatus[vChannelStatus]; GroupCalendarChannelStatus:SetText(string.format(vStatusText.mText, gGroupCalendar_Channel.StatusMessage)); GroupCalendarChannelStatus:SetTextColor(vStatusText.mColor.r, vStatusText.mColor.g, vStatusText.mColor.b); if vChannelStatus == "Connected" then Calendar_SetButtonEnable(GroupCalendarConnectChannelButton, true); GroupCalendarConnectChannelButton:SetText(GroupCalendar_cDisconnectChannel); elseif vChannelStatus == "Disconnected" or vChannelStatus == "Error" then Calendar_SetButtonEnable(GroupCalendarConnectChannelButton, true); GroupCalendarConnectChannelButton:SetText(GroupCalendar_cConnectChannel); else Calendar_SetButtonEnable(GroupCalendarConnectChannelButton, false); end end function GroupCalendar_FixPlayerName(pName) if pName == nil or pName == "" then return nil; end local vFirstChar = string.sub(pName, 1, 1); if (vFirstChar >= "a" and vFirstChar <= "z") or (vFirstChar >= "A" and vFirstChar <= "Z") then return string.upper(vFirstChar)..string.lower(string.sub(pName, 2)); else return pName; end end function GroupCalendar_AddTrustedPlayer(pPlayerName) local vPlayerName = GroupCalendar_FixPlayerName(pPlayerName); if vPlayerName == nil then return; end gGroupCalendar_PlayerSettings.Security.Player[vPlayerName] = 1; GroupCalendar_UpdateTrustedPlayerList(); CalendarTrust_TrustSettingsChanged(); end function GroupCalendar_AddExcludedPlayer(pPlayerName) local vPlayerName = GroupCalendar_FixPlayerName(pPlayerName); if vPlayerName == nil then return; end gGroupCalendar_PlayerSettings.Security.Player[vPlayerName] = 2; GroupCalendar_UpdateTrustedPlayerList(); CalendarTrust_TrustSettingsChanged(); end function GroupCalendar_RemoveTrustedPlayer(pPlayerName) local vPlayerName = GroupCalendar_FixPlayerName(pPlayerName); if vPlayerName == nil then return; end gGroupCalendar_PlayerSettings.Security.Player[vPlayerName] = nil; GroupCalendar_UpdateTrustedPlayerList(); CalendarPlayerList_SelectIndexedPlayer(CalendarTrustedPlayersList, 0); CalendarPlayerList_SelectIndexedPlayer(CalendarExcludedPlayersList, 0); CalendarTrust_TrustSettingsChanged(); end function GroupCalendar_UpdateTrustedPlayerList() CalendarPlayerList_Update(CalendarTrustedPlayersList); CalendarPlayerList_Update(CalendarExcludedPlayersList); end function GroupCalendar_GetIndexedTrustedPlayer(pIndex) if pIndex == 0 then return CalendarTrust_GetNumTrustedPlayers(1); end return { Text = CalendarTrust_GetIndexedTrustedPlayers(1, pIndex); }; end function GroupCalendar_GetIndexedExcludedPlayer(pIndex) if pIndex == 0 then return CalendarTrust_GetNumTrustedPlayers(2); end return { Text = CalendarTrust_GetIndexedTrustedPlayers(2, pIndex); }; end function GroupCalendar_TrustedPlayerSelected(pIndex) if pIndex == 0 then return; end CalendarPlayerList_SelectIndexedPlayer(CalendarExcludedPlayersList, 0); local vName = CalendarTrust_GetIndexedTrustedPlayers(1, pIndex); if vName then CalendarTrustedPlayerName:SetText(vName); CalendarTrustedPlayerName:HighlightText(); CalendarTrustedPlayerName:SetFocus(); end end function GroupCalendar_ExcludedPlayerSelected(pIndex) if pIndex == 0 then return; end CalendarPlayerList_SelectIndexedPlayer(CalendarTrustedPlayersList, 0); local vName = CalendarTrust_GetIndexedTrustedPlayers(2, pIndex); if vName then CalendarTrustedPlayerName:SetText(vName); CalendarTrustedPlayerName:HighlightText(); CalendarTrustedPlayerName:SetFocus(); end end function GroupCalendar_SelectDateWithToggle(pDate) if CalendarEditor_IsOpen() and gCalendarEditor_SelectedDate == pDate then CalendarEditor_Close(); else GroupCalendar_SelectDate(pDate); end end function GroupCalendar_SelectDate(pDate) Calendar_SetSelectedDate(pDate); local vCompiledSchedule = EventDatabase_GetCompiledSchedule(pDate); CalendarEditor_ShowCompiledSchedule(pDate, vCompiledSchedule); end function GroupCalendar_EditorClosed() Calendar_ClearSelectedDate(); end function GroupCalendar_EventChanged(pDatabase, pEvent, pChangedFields) GroupCalendar_ScheduleChanged(pDatabase, pEvent.mDate); CalendarEventEditor_EventChanged(pEvent); end function GroupCalendar_ScheduleChanged(pDatabase, pDate) GroupCalendar_ScheduleChanged2(pDatabase, pDate); if gGroupCalendar_Settings.ShowEventsInLocalTime then if gGroupCalendar_ServerTimeZoneOffset < 0 then GroupCalendar_ScheduleChanged2(pDatabase, pDate - 1); elseif gGroupCalendar_ServerTimeZoneOffset > 0 then GroupCalendar_ScheduleChanged2(pDatabase, pDate + 1); end end end function GroupCalendar_ScheduleChanged2(pDatabase, pDate) local vSchedule = pDatabase.Events[pDate]; CalendarEditor_ScheduleChanged(pDate, pSchedule); Calendar_ScheduleChanged(pDate, pSchedule); CalendarEventViewer_ScheduleChanged(pDate); end function GroupCalendar_MajorDatabaseChange(pDatabase) CalendarEditor_MajorDatabaseChange(); CalendarEventViewer_MajorDatabaseChange(); CalendarEventEditor_MajorDatabaseChange(); Calendar_MajorDatabaseChange(); end gGroupCalendar_QueueElapsedTime = 0; function GroupCalendar_Update(pElapsed) local vLatencyStartTime; -- Process invites if gGroupCalendar_Settings.DebugLatency then vLatencyStartTime = GetTime(); end CalendarGroupInvites_Update(pElapsed); if gGroupCalendar_Settings.DebugLatency then local vElapsed = GetTime() - vLatencyStartTime; if vElapsed > 0.1 then Calendar_DebugMessage("CalendarGroupInvites_Update took "..vElapsed.."s to execute"); end vLatencyStartTime = GetTime(); end -- Process the event queues if it's time gGroupCalendar_QueueElapsedTime = gGroupCalendar_QueueElapsedTime + pElapsed; if gGroupCalendar_QueueElapsedTime > 0.1 then CalendarNetwork_ProcessQueues(gGroupCalendar_QueueElapsedTime); gGroupCalendar_QueueElapsedTime = 0; end if gGroupCalendar_Settings.DebugLatency then local vElapsed = GetTime() - vLatencyStartTime; if vElapsed > 0.1 then Calendar_DebugMessage("CalendarNetwork_ProcessQueues took "..vElapsed.."s to execute"); end vLatencyStartTime = GetTime(); end -- Stop the timer if it isn't needed if not CalendarNetwork_NeedsUpdateTimer() and not CalendarGroupInvites_NeedsUpdateTimer() then if gGroupCalendar_Settings.DebugTimer then Calendar_DebugMessage("GroupCalendar_Update: Stopping timer"); end GroupCalendarUpdateFrame:Hide(); end if gGroupCalendar_Settings.DebugLatency then local vElapsed = GetTime() - vLatencyStartTime; if vElapsed > 0.1 then Calendar_DebugMessage("NeedsUpdateTimer took "..vElapsed.."s to execute"); end end end function GroupCalendar_StartUpdateTimer() if GroupCalendarUpdateFrame:IsVisible() then return; end if gGroupCalendar_Settings.DebugTimer then Calendar_DebugMessage("GroupCalendar_StartUpdateTimer()"); end GroupCalendarUpdateFrame:Show(); end function GroupCalendar_StartMoving() if not gGroupCalendar_PlayerSettings.UI.LockWindow then GroupCalendarFrame:StartMoving(); end end function GroupCalendar_GetPlayerSettings(pPlayerName, pRealmName) -- Wipe the settings if they're the alpha version if not gGroupCalendar_Settings.Format then gGroupCalendar_Settings = { Debug = false, Format = 1, }; end local vSettings = gGroupCalendar_Settings[pRealmName.."_"..pPlayerName]; if vSettings == nil then vSettings = { Security = { TrustAnyone = false, TrustGuildies = IsInGuild(), MinTrustedRank = 1, Player = {}, }, Channel = { AutoConfig = IsInGuild(), AutoConfigPlayer = nil, Name = nil, Password = nil, }, UI = { LockWindow = false, }, }; gGroupCalendar_Settings[pRealmName.."_"..pPlayerName] = vSettings; end return vSettings; end function GroupCalendar_GetRealmSettings(pRealmName) local vSettings = gGroupCalendar_Settings[pRealmName]; if vSettings == nil then vSettings = {}; gGroupCalendar_Settings[pRealmName] = vSettings; end return vSettings; end function GroupCalendar_RoundTimeOffsetToNearest30(pOffset) local vNegativeOffset; local vOffset; if pOffset < 0 then vNegativeOffset = true; vOffset = -pOffset; else vNegativeOffset = false; vOffset = pOffset; end vOffset = vOffset - (math.mod(vOffset + 15, 30) - 15); if vNegativeOffset then return -vOffset; else return vOffset; end end function GroupCalendar_CalculateTimeZoneOffset() local vServerTime = Calendar_ConvertHMToTime(GetGameTime()); local vLocalDate, vLocalTime = Calendar_GetCurrentLocalDateTime(); local vUTCDate, vUTCTime = Calendar_GetCurrentUTCDateTime(); local vLocalDateTime = vLocalDate * 1440 + vLocalTime; local vUTCDateTime = vUTCDate * 1440 + vUTCTime; local vLocalUTCDelta = GroupCalendar_RoundTimeOffsetToNearest30(vLocalDateTime - vUTCDateTime); local vLocalServerDelta = GroupCalendar_RoundTimeOffsetToNearest30(vLocalTime - vServerTime); local vServerUTCDelta = vLocalUTCDelta - vLocalServerDelta; if vServerUTCDelta < (-12 * 60) then vServerUTCDelta = vServerUTCDelta + (24 * 60); elseif vServerUTCDelta > (12 * 60) then vServerUTCDelta = vServerUTCDelta - (24 * 60); end vLocalServerDelta = vLocalUTCDelta - vServerUTCDelta; if vLocalServerDelta ~= gGroupCalendar_ServerTimeZoneOffset then gGroupCalendar_ServerTimeZoneOffset = vLocalServerDelta; -- Time zone changed if gGroupCalendar_ServerTimeZoneOffset == 0 then GroupCalendarUseServerTime:Hide(); else GroupCalendarUseServerTime:Show(); end end end function GroupCalendar_UpdateTimeTooltip() local vServerTime = Calendar_ConvertHMToTime(GetGameTime()); local vLocalDate = Calendar_GetCurrentLocalDate(); local vServerTimeString = Calendar_GetShortTimeString(vServerTime); local vLocalDateString = Calendar_GetLongDateString(vLocalDate, true); GameTooltip:AddLine(vLocalDateString); GameTooltip:AddLine(vServerTimeString); if gGroupCalendar_ServerTimeZoneOffset ~= 0 then local vLocalTime = Calendar_GetLocalTimeFromServerTime(vServerTime); local vLocalTimeString = Calendar_GetShortTimeString(vLocalTime); GameTooltip:AddLine(string.format(GroupCalendar_cLocalTimeNote, vLocalTimeString)); end GameTooltip:Show(); end function GroupCalendar_ChannelChanged() if CalendarNetwork_GetChannelStatus() == "Connected" then GroupCalendar_RegisterEvent(GroupCalendarFrame, "CHAT_MSG_CHANNEL", GroupCalendar_ChatMsgChannel); else GroupCalendar_UnregisterEvent(GroupCalendarFrame, "CHAT_MSG_CHANNEL"); end if GroupCalendarFrame:IsVisible() and (gGroupCalendar_CurrentPanel == 2 or gGroupCalendar_CurrentPanel == 3) then if GroupCalendarAutoChannelConfig:GetChecked() then GroupCalendar_ShowPanel(gGroupCalendar_CurrentPanel); -- Refresh the channel and auto-player names end if gGroupCalendar_CurrentPanel == 2 then GroupCalendar_UpdateChannelStatus(); end end end function GroupCalendar_GetLocalizedStrings(pLocale) local vStrings = {}; -- Initialize the strings with copies form the enUS set for vIndex, vString in gCalendarLocalizedStrings.enUS do vStrings[vIndex] = vString; end -- Select a set to use for overwriting local vLocalizedStrings = gCalendarLocalizedStrings[pLocale]; if not vLocalizedStrings then -- There's not a fit for the exact language/country specified, so just match the language local vLanguageCode = string.sub(pLocale, 1, 2); vLocalizedStrings = GroupCalendar_SelectLanguage(vLanguageCode); if not vLocalizedStrings then return vStrings; end end -- Overwrise the english strings with translated strings for vIndex, vString in vLocalizedStrings do vStrings[vIndex] = vString; end return vStrings; end function GroupCalendar_SelectLanguage(pLanguageCode) -- There's not a fit for the exact language/country specified, so just match the language local vLanguageCode = string.sub(pLocale, 1, 2); for vLocale, vLocalizedStrings in gCalendarLocalizedStrings do if pLanguageCode == string.sub(vLocale, 1, 2) then return vLocalizedStrings; end end -- No luck, hope they know english! return nil; end function GroupCalendar_ToggleChannelConnection() local vChannelStatus = CalendarNetwork_GetChannelStatus(); if vChannelStatus == "Initializing" then return; end if vChannelStatus == "Connected" then gGroupCalendar_Channel.Disconnected = true; CalendarNetwork_LeaveChannel(); else gGroupCalendar_Channel.Disconnected = false; CalendarNetwork_SetChannelStatus("Initializing"); if gGroupCalendar_PlayerSettings.Channel.AutoConfig then CalendarNetwork_ScheduleAutoConfig(0.5); elseif gGroupCalendar_PlayerSettings.Channel.Name then CalendarNetwork_SetChannel( gGroupCalendar_PlayerSettings.Channel.Name, gGroupCalendar_PlayerSettings.Channel.Password); else CalendarNetwork_SetChannelStatus("Disconnected"); end end end function GroupCalendar_ToggleCalendarDisplay() if GroupCalendarFrame:IsVisible() then HideUIPanel(GroupCalendarFrame); else ShowUIPanel(GroupCalendarFrame); end end function GroupCalendar_SetUseServerDateTime(pUseServerDateTime) gGroupCalendar_Settings.ShowEventsInLocalTime = not pUseServerDateTime; GroupCalendarUseServerTime:SetChecked(pUseServerDateTime); GroupCalendar_MajorDatabaseChange(nil); -- Force the display to update end function GroupCalendar_BeginModalDialog(pDialogFrame) if gGroupCalendar_ActiveDialog then GroupCalendar_EndModalDialog(gGroupCalendar_ActiveDialog); end gGroupCalendar_ActiveDialog = pDialogFrame; end function GroupCalendar_EndModalDialog(pDialogFrame) if pDialogFrame ~= gGroupCalendar_ActiveDialog then return; end gGroupCalendar_ActiveDialog = nil; pDialogFrame:Hide(); end function GroupCalendar_ExecuteCommand(pCommandString) local vStartIndex, vEndIndex, vCommand, vParameter = string.find(pCommandString, "(%w+) ?(.*)"); if not vCommand then ShowUIPanel(GroupCalendarFrame); return; end local vCommandTable = { ["help"] = {func = GroupCalendar_ShowCommandHelp}, ["versions"] = {func = GroupCalendar_DumpUserVersions}, }; local vCommandInfo = vCommandTable[strlower(vCommand)]; if not vCommandInfo then GroupCalendar_ShowCommandHelp(); return; end vCommandInfo.func(vParameter); end function GroupCalendar_ShowCommandHelp() Calendar_NoteMessage("GroupCalendar commands:"); Calendar_NoteMessage(HIGHLIGHT_FONT_COLOR_CODE.."/calendar help"..NORMAL_FONT_COLOR_CODE..": Shows this list of commands"); Calendar_NoteMessage(HIGHLIGHT_FONT_COLOR_CODE.."/calendar versions"..NORMAL_FONT_COLOR_CODE..": Displays the last known versions of GroupCalendar each user was running"); end function GroupCalendar_DumpUserVersions() for vRealmUser, vDatabase in gGroupCalendar_Database.Databases do if EventDatabase_DatabaseIsVisible(vDatabase) then if vDatabase.IsPlayerOwned then Calendar_NoteMessage(HIGHLIGHT_FONT_COLOR_CODE..vDatabase.UserName..NORMAL_FONT_COLOR_CODE..": "..gGroupCalendar_VersionString); elseif vDatabase.AddonVersion then Calendar_NoteMessage(HIGHLIGHT_FONT_COLOR_CODE..vDatabase.UserName..NORMAL_FONT_COLOR_CODE..": "..vDatabase.AddonVersion); else Calendar_NoteMessage(HIGHLIGHT_FONT_COLOR_CODE..vDatabase.UserName..NORMAL_FONT_COLOR_CODE..": Unknown version"); end end end end