local MDT = MDT local L = MDT.L local MDTcommsObject = MDTcommsObject local twipe,tinsert = table.wipe,table.insert local timer local requestTimer ---LiveSession_Enable function MDT:LiveSession_Enable() if self.liveSessionActive then return end self.main_frame.LiveSessionButton:SetText(L["*Live*"]) self.main_frame.LiveSessionButton.text:SetTextColor(0,1,0) self.main_frame.LinkToChatButton:SetDisabled(true) self.main_frame.LinkToChatButton.text:SetTextColor(0.5,0.5,0.5) self.main_frame.sidePanelDeleteButton:SetDisabled(true) self.main_frame.sidePanelDeleteButton.text:SetTextColor(0.5,0.5,0.5) self.liveSessionActive = true --check if there is other clients having live mode active self:LiveSession_RequestSession() --set id here incase there is no other sessions self:SetUniqueID(self:GetCurrentPreset()) self.livePresetUID = self:GetCurrentPreset().uid self:UpdatePresetDropdownTextColor() self:SetThrottleValues() timer = C_Timer.NewTimer(2, function() self.liveSessionRequested = false local distribution = self:IsPlayerInGroup() local preset = self:GetCurrentPreset() local prefix = "[MDTLive: " local dungeon = self:GetDungeonName(preset.value.currentDungeonIdx) local presetName = preset.text local name, realm = UnitFullName("player") local fullName = name.."+"..realm SendChatMessage(prefix..fullName.." - "..dungeon..": "..presetName.."]",distribution) end) end ---LiveSession_Disable function MDT:LiveSession_Disable() local widget = MDT.main_frame.LiveSessionButton widget.text:SetTextColor(widget.normalTextColor.r,widget.normalTextColor.g,widget.normalTextColor.b) widget.text:SetText(L["Live"]) MDT.main_frame.LinkToChatButton:SetDisabled(false) self.main_frame.LinkToChatButton.text:SetTextColor(1,0.8196,0) local db = MDT:GetDB() if db.presets[db.currentDungeonIdx][1] == MDT:GetCurrentPreset() then MDT.main_frame.sidePanelDeleteButton:SetDisabled(true) MDT.main_frame.sidePanelDeleteButton.text:SetTextColor(0.5,0.5,0.5) else self.main_frame.sidePanelDeleteButton:SetDisabled(false) self.main_frame.sidePanelDeleteButton.text:SetTextColor(1,0.8196,0) end self.liveSessionActive = false self.liveSessionAcceptingPreset = false self:UpdatePresetDropdownTextColor() self.main_frame.liveReturnButton:Hide() self.main_frame.setLivePresetButton:Hide() if timer then timer:Cancel() end self.liveSessionRequested = false self.main_frame.SendingStatusBar:Hide() self:SetThrottleValues(true) if self.main_frame.LoadingSpinner then self.main_frame.LoadingSpinner:Hide() self.main_frame.LoadingSpinner.Anim:Stop() end end ---Notify specific group member that my live session is active local lastNotify function MDT:LiveSession_NotifyEnabled() local now = GetTime() if not lastNotify or lastNotify < now - 0.2 then lastNotify = now local distribution = self:IsPlayerInGroup() if (not distribution) or (not self.liveSessionActive) then return end local uid = self.livePresetUID MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.enabled, uid, distribution, nil, "ALERT") end --self:SendToGroup(self:IsPlayerInGroup(),true,self:GetCurrentLivePreset()) end ---Send a request to the group to send notify messages for active sessions function MDT:LiveSession_RequestSession() local distribution = self:IsPlayerInGroup() if (not distribution) or (not self.liveSessionActive) then return end self.liveSessionRequested = true self.liveSessionActiveSessions = self.liveSessionActiveSessions or {} twipe(self.liveSessionActiveSessions) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.request, "0", distribution, nil, "ALERT") end function MDT:LiveSession_SessionFound(fullName, uid) local fullNamePlayer,realm = UnitFullName("player") fullNamePlayer = fullNamePlayer.."-"..realm if (not self.liveSessionAcceptingPreset) and fullNamePlayer ~= fullName then if timer then timer:Cancel() end self.liveSessionAcceptingPreset = true --request the preset from one client only after a short delay --we have to delay a bit to catch all active clients requestTimer = C_Timer.NewTimer(0.5, function() if self.liveSessionActiveSessions[1][1] ~= fullNamePlayer then self.main_frame.SendingStatusBar:Show() self.main_frame.SendingStatusBar:SetValue(0/1) self.main_frame.SendingStatusBar.value:SetText(L["Receiving: ..."]) if not self.main_frame.LoadingSpinner then self.main_frame.LoadingSpinner = CreateFrame("Button", "MDTLoadingSpinner", self.main_frame, "LoadingSpinnerTemplate") self.main_frame.LoadingSpinner:SetPoint("CENTER",self.main_frame,"CENTER") self.main_frame.LoadingSpinner:SetSize(60,60) end self.main_frame.LoadingSpinner:Show() self.main_frame.LoadingSpinner.Anim:Play() self:UpdatePresetDropdownTextColor(true) self.liveSessionRequested = false self:LiveSession_RequestPreset(self.liveSessionActiveSessions[1][1]) self.livePresetUID = self.liveSessionActiveSessions[1][2] else self.liveSessionAcceptingPreset = false self.liveSessionRequested = false end end) end --catch clients tinsert(self.liveSessionActiveSessions,{fullName,uid}) end function MDT:LiveSession_RequestPreset(fullName) local distribution = self:IsPlayerInGroup() if (not distribution) or (not self.liveSessionActive) then return end MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.reqPre, fullName, distribution,nil, "ALERT") end ---Sends a map ping function MDT:LiveSession_SendPing(x, y, sublevel) --only send ping if we are in the livesession preset if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then local scale = self:GetScale() MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.ping, x*(1/scale)..":"..y*(1/scale)..":"..sublevel, distribution, nil, "ALERT") end end end ---Sends a preset object function MDT:LiveSession_SendObject(obj) if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then local export = MDT:TableToString(obj,false,5) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.obj, export, distribution, nil, "ALERT") end end end ---Sends updated object offsets (move object) function MDT:LiveSession_SendObjectOffsets(objIdx, x, y) if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.objOff, objIdx..":"..x..":"..y, distribution, nil, "ALERT") end end end ---Sends updated objects - instead of sending an update every time we erase a part of an object we send one message after mouse up function MDT:LiveSession_SendUpdatedObjects(changedObjects) if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then local export = MDT:TableToString(changedObjects,false,5) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.objChg, export, distribution, nil, "ALERT") end end end ---Sends various commands: delete all drawings, clear preset, undo, redo function MDT:LiveSession_SendCommand(cmd) if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.cmd, cmd, distribution, nil, "ALERT") end end end ---Sends a note text update function MDT:LiveSession_SendNoteCommand(cmd, noteIdx, text, y) if self:GetCurrentPreset().uid == self.livePresetUID then local distribution = self:IsPlayerInGroup() if distribution then text = text..":"..(y or "0") MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.note, cmd..":"..noteIdx..":"..text, distribution, nil, "ALERT") end end end ---Sends a new preset to be used as the new live session preset function MDT:LiveSession_SendPreset(preset) local distribution = self:IsPlayerInGroup() if distribution then local db = self:GetDB() preset.mdiEnabled = db.MDI.enabled preset.difficulty = db.currentDifficulty local export = MDT:TableToString(preset,false,5) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.preset, export, distribution, nil, "ALERT") end end ---Sends all pulls function MDT:LiveSession_SendPulls(pulls) local distribution = self:IsPlayerInGroup() if distribution then local msg = MDT:TableToString(pulls,false,5) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.pull, msg, distribution, nil, "ALERT") end end ---Sends Affix Week Change function MDT:LiveSession_SendAffixWeek(week) local distribution = self:IsPlayerInGroup() if distribution then MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.week, week.."", distribution, nil, "ALERT") end end ---Sends freehold selector updates function MDT:LiveSession_SendFreeholdSelector(value, week) local distribution = self:IsPlayerInGroup() if distribution then value = value and "T:" or "F:" local msg = value..week MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.free, msg, distribution, nil, "ALERT") end end ---sends boralus selector updates function MDT:LiveSession_SendBoralusSelector(faction) local distribution = self:IsPlayerInGroup() if distribution then local msg = faction.."" MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.bora, msg, distribution, nil, "ALERT") end end ---Sends MDI selector updates function MDT:LiveSession_SendMDI(action, data) local distribution = self:IsPlayerInGroup() if distribution then local msg = action..":"..data MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.mdi, msg, distribution, nil, "ALERT") end end do local timer ---LiveSession_QueueColorUpdate ---Disgusting workaround for shitty colorpicker ---Only send an update once a color of a pull has not changed for 0.2 seconds function MDT:LiveSession_QueueColorUpdate() if timer then timer:Cancel() end timer = C_Timer.NewTimer(0.2, function() self:LiveSession_SendPulls(self:GetPulls()) end) end end ---Sends Corrupted NPC Offset Positions function MDT:LiveSession_SendCorruptedPositions(offsets) local distribution = self:IsPlayerInGroup() if distribution then local export = MDT:TableToString(offsets,false,5) MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.corrupted, export, distribution, nil, "ALERT") end end ---Sends current difficulty function MDT:LiveSession_SendDifficulty() local distribution = self:IsPlayerInGroup() if distribution then local export = self:GetDB().currentDifficulty MDTcommsObject:SendCommMessage(self.liveSessionPrefixes.difficulty, export.."", distribution, nil, "ALERT") end end