178 lines
		
	
	
		
			No EOL
		
	
	
		
			7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			No EOL
		
	
	
		
			7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
---@class PhoneCall
 | 
						|
---@field Identifier string
 | 
						|
---@field Members PhoneCallMember[]
 | 
						|
PhoneCall = {}
 | 
						|
PhoneCall.__index = PhoneCall
 | 
						|
 | 
						|
---@param identifier string
 | 
						|
---@return PhoneCall
 | 
						|
function PhoneCall.new(identifier)
 | 
						|
  local self = setmetatable({}, PhoneCall)
 | 
						|
  self.Identifier = identifier
 | 
						|
  self.Members = {}
 | 
						|
  return self
 | 
						|
end
 | 
						|
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
function PhoneCall:IsMember(voiceClient)
 | 
						|
  return table.any(self.Members, function (_v)
 | 
						|
    ---@cast _v PhoneCallMember
 | 
						|
    return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName
 | 
						|
  end)
 | 
						|
end
 | 
						|
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
function PhoneCall:AddMember(voiceClient)
 | 
						|
  local callMember = PhoneCallMember.new(self, voiceClient)
 | 
						|
 | 
						|
  if self:IsMember(voiceClient) then return end
 | 
						|
  table.insert(self.Members, callMember)
 | 
						|
 | 
						|
  local handle = voiceClient.Player.Handle
 | 
						|
  local tsName = voiceClient.TeamSpeakName
 | 
						|
  local position = voiceClient.Player.GetPosition()
 | 
						|
  local fRelays = table.filter(self.Members, function(_v) --[[@cast _v PhoneCallMember]] return _v.IsSpeakerEnabled end)
 | 
						|
  local relays = table.map(fRelays, function (_v)--[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName end)
 | 
						|
 | 
						|
  local fMembers = table.filter(self.Members, function (_v)
 | 
						|
    ---@cast _v PhoneCallMember
 | 
						|
    return _v.VoiceClient.TeamSpeakName ~= voiceClient.TeamSpeakName
 | 
						|
  end)
 | 
						|
  for _, member in pairs(fMembers) do
 | 
						|
    ---@cast member PhoneCallMember
 | 
						|
    voiceClient:TriggerEvent(Event.SaltyChat_EstablishCall, member.VoiceClient.Player.Handle, member.VoiceClient.TeamSpeakName, member.VoiceClient.Player.GetPosition())
 | 
						|
 | 
						|
    if table.size(relays) == 0 then
 | 
						|
      member.VoiceClient:TriggerEvent(Event.SaltyChat_EstablishCall, handle, tsName, position)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  if table.size(relays) > 0 then
 | 
						|
    for _, client in pairs(VoiceManager.Instance._voiceClients) do
 | 
						|
      client:TriggerEvent(
 | 
						|
        Event.SaltyChat_EstablishCallRelayed,
 | 
						|
        handle,
 | 
						|
        tsName,
 | 
						|
        position,
 | 
						|
        table.any(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == client.TeamSpeakName end),
 | 
						|
        relays
 | 
						|
      )
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
function PhoneCall:RemoveMember(voiceClient)
 | 
						|
  ---@type PhoneCallMember
 | 
						|
  local callMember = table.find(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end)
 | 
						|
  local callMemberIndex = table.findIndex(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end)
 | 
						|
 | 
						|
  if callMember == nil then
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  table.removeKey(self.Members, callMemberIndex)
 | 
						|
 | 
						|
  local handle = voiceClient.Player.Handle
 | 
						|
  local fRelays = table.filter(self.Members, function(_v) --[[@cast _v PhoneCallMember]] return _v.IsSpeakerEnabled end)
 | 
						|
  local relays = table.map(fRelays, function (_v)--[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName end)
 | 
						|
 | 
						|
  if table.size(relays) == 0 and callMember.IsSpeakerEnabled then
 | 
						|
    for _, client in pairs(VoiceManager.Instance._voiceClients) do
 | 
						|
      if client.TeamSpeakName == voiceClient.TeamSpeakName then
 | 
						|
        for _, member in pairs(self.Members) do
 | 
						|
          voiceClient:TriggerEvent(Event.SaltyChat_EndCall, member.VoiceClient.Player.Handle)
 | 
						|
        end
 | 
						|
      elseif table.any(self.Members, function(_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == client.TeamSpeakName end) then
 | 
						|
        client:TriggerEvent(Event.SaltyChat_EndCall, handle)
 | 
						|
      else
 | 
						|
        for _, member in pairs(self.Members) do
 | 
						|
          client:TriggerEvent(Event.SaltyChat_EndCall, member.VoiceClient.Player.Handle)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  elseif table.size(relays) > 0 then
 | 
						|
    for _, client in pairs(VoiceManager.Instance._voiceClients) do
 | 
						|
      client:TriggerEvent(Event.SaltyChat_EndCall, handle)
 | 
						|
 | 
						|
      if callMember.IsSpeakerEnabled or client.TeamSpeakName == voiceClient.TeamSpeakName then
 | 
						|
        for _, member in pairs(self.Members) do
 | 
						|
          client:TriggerEvent(
 | 
						|
            Event.SaltyChat_EstablishCallRelayed,
 | 
						|
            member.VoiceClient.Player.Handle,
 | 
						|
            member.VoiceClient.TeamSpeakName,
 | 
						|
            member.VoiceClient.Player.GetPosition(),
 | 
						|
            table.any(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == client.TeamSpeakName end),
 | 
						|
            relays
 | 
						|
          )
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  else
 | 
						|
    for _, member in pairs(self.Members) do
 | 
						|
      voiceClient:TriggerEvent(Event.SaltyChat_EndCall, member.VoiceClient.Player.Handle)
 | 
						|
 | 
						|
      member.VoiceClient:TriggerEvent(Event.SaltyChat_EndCall, handle)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
---@param isEnabled boolean
 | 
						|
function PhoneCall:SetSpeaker(voiceClient, isEnabled)
 | 
						|
  ---@type PhoneCallMember
 | 
						|
  local callMember = table.find(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end)
 | 
						|
  if callMember == nil or callMember.IsSpeakerEnabled == isEnabled then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  local fRelays = table.filter(self.Members, function(_v) --[[@cast _v PhoneCallMember]] return _v.IsSpeakerEnabled end)
 | 
						|
  local relays = table.map(fRelays, function (_v)--[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName end)
 | 
						|
 | 
						|
  if table.size(relays) == 0 then
 | 
						|
    for _, client in pairs(VoiceManager.Instance._voiceClients) do
 | 
						|
      if client.TeamSpeakName == voiceClient.TeamSpeakName or table.any(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end) then
 | 
						|
        goto continue
 | 
						|
      else
 | 
						|
        for _, member in pairs(self.Members) do
 | 
						|
          client:TriggerEvent(Event.SaltyChat_EndCall, member.VoiceClient.Player.Handle)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  else
 | 
						|
    for _, client in pairs(VoiceManager.Instance._voiceClients) do
 | 
						|
      if client.TeamSpeakName == voiceClient.TeamSpeakName or table.any(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end) then
 | 
						|
        goto continue
 | 
						|
      else
 | 
						|
        for _, member in pairs(self.Members) do
 | 
						|
          client:TriggerEvent(Event.SaltyChat_EstablishCallRelayed, member.VoiceClient.Player.Handle, member.VoiceClient.TeamSpeakName, member.VoiceClient.Player.GetPosition(), false, relays)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
    ::continue::
 | 
						|
end
 | 
						|
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
function PhoneCall:TryGetMember(voiceClient)
 | 
						|
  local callMember = table.find(self.Members, function (_v) --[[@cast _v PhoneCallMember]] return _v.VoiceClient.TeamSpeakName == voiceClient.TeamSpeakName end)
 | 
						|
 | 
						|
  return callMember
 | 
						|
end
 | 
						|
 | 
						|
---@class PhoneCallMember
 | 
						|
---@field PhoneCall PhoneCall
 | 
						|
---@field VoiceClient VoiceClient
 | 
						|
---@field IsSpeakerEnabled boolean
 | 
						|
PhoneCallMember = {}
 | 
						|
PhoneCallMember.__index = PhoneCallMember
 | 
						|
 | 
						|
---@param phoneCall PhoneCall
 | 
						|
---@param voiceClient VoiceClient
 | 
						|
---@return PhoneCallMember
 | 
						|
function PhoneCallMember.new(phoneCall, voiceClient)
 | 
						|
  local self = setmetatable({}, PhoneCallMember)
 | 
						|
  self.PhoneCall = phoneCall
 | 
						|
  self.VoiceClient = voiceClient
 | 
						|
  self.IsSpeakerEnabled = false
 | 
						|
  return self
 | 
						|
end |