Der Callback openBleeter oeffnete Bleeters eigenes Fenster ueber dem PC. Das nahm dem PC den Fokus - SetNuiFocus gilt global fuer den Client, zwei Resources sperren sich dabei gegenseitig die Maus aus. Seit Bleeter als eigene App im PC laeuft (client/bleeter.lua), rief ihn niemand mehr auf.
306 lines
9.8 KiB
Lua
306 lines
9.8 KiB
Lua
-- ─────────────────────────────────────────────────────────────────────────────
|
||
-- NUI bridge – all SendNUIMessage / RegisterNUICallback calls
|
||
-- ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
NUIBridge = {}
|
||
|
||
local pcOpen = false -- ist der PC gerade offen? (für Interaktionsmodus-Taste)
|
||
|
||
local function Send(action, data)
|
||
SendNUIMessage({ action = action, data = data or {} })
|
||
end
|
||
|
||
-- ── Outbound (Lua -> NUI) ───────────────────────────────────────────────────
|
||
|
||
function NUIBridge.Boot(sessionData)
|
||
SetNuiFocus(true, true)
|
||
pcOpen = true
|
||
Send("boot", sessionData)
|
||
end
|
||
|
||
function NUIBridge.SetInstalledApps(apps)
|
||
Send("setInstalledApps", apps)
|
||
end
|
||
|
||
function NUIBridge.SetInbox(mails, folders)
|
||
Send("setInbox", { mails = mails, folders = folders or {} })
|
||
end
|
||
|
||
function NUIBridge.MailAddressStatus(hasAddress, address, realms)
|
||
Send("mailAddressStatus", { hasAddress = hasAddress, address = address, realms = realms or {} })
|
||
end
|
||
|
||
function NUIBridge.MailCreateResult(success, err, address)
|
||
Send("mailCreateResult", { success = success, error = err, address = address })
|
||
end
|
||
|
||
function NUIBridge.SetMailContent(mail)
|
||
Send("setMailContent", mail)
|
||
end
|
||
|
||
function NUIBridge.MailSent()
|
||
Send("mailSent")
|
||
end
|
||
|
||
function NUIBridge.MailDeleted(id)
|
||
Send("mailDeleted", { id = id })
|
||
end
|
||
|
||
function NUIBridge.SetStoreList(apps)
|
||
Send("setStoreList", apps)
|
||
end
|
||
|
||
function NUIBridge.NewMailNotify()
|
||
Send("newMailNotify")
|
||
end
|
||
|
||
function NUIBridge.Close()
|
||
SetNuiFocus(false, false)
|
||
pcOpen = false
|
||
Send("close")
|
||
end
|
||
|
||
-- Interaktionsmodus: NUI-Fokus vom PC lösen (Spiel-Interaktion) bzw. zurückholen.
|
||
RegisterNUICallback('setFocus', function(data, cb)
|
||
local focus = data and data.focus and true or false
|
||
SetNuiFocus(focus, focus)
|
||
if focus then
|
||
if Interaction and Interaction.ExitInteract then Interaction.ExitInteract() end
|
||
else
|
||
if Interaction and Interaction.EnterInteract then Interaction.EnterInteract() end
|
||
end
|
||
cb({})
|
||
end)
|
||
|
||
-- Taste (Standard: END, in den FiveM-Einstellungen umbelegbar), um aus dem
|
||
-- Interaktionsmodus wieder zum PC (Fokus) zurückzukehren.
|
||
RegisterCommand('pclive_refocus', function()
|
||
if pcOpen then
|
||
SetNuiFocus(true, true)
|
||
if Interaction and Interaction.ExitInteract then Interaction.ExitInteract() end
|
||
Send('exitInteract')
|
||
end
|
||
end, false)
|
||
RegisterKeyMapping('pclive_refocus', 'PC-Live: Zurück zum PC (Fokus)', 'keyboard', 'END')
|
||
|
||
function NUIBridge.SetAccentColor(color)
|
||
Send("setAccentColor", { color = color })
|
||
end
|
||
|
||
-- ── Inbound (NUI -> Lua) ────────────────────────────────────────────────────
|
||
|
||
RegisterNUICallback('closePC', function(data, cb)
|
||
NUIBridge.Close()
|
||
Interaction.OnSessionClose()
|
||
cb({})
|
||
end)
|
||
|
||
-- Mail
|
||
RegisterNUICallback('checkMailAddress', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:checkMailAddress')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('createMailAddress', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:createMailAddress', data.username)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('getInbox', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getInbox')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('readMail', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:readMail', tonumber(data.id))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('sendMail', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:sendMail', {
|
||
to = tostring(data.to or ""),
|
||
subject = tostring(data.subject or ""),
|
||
body = tostring(data.body or ""),
|
||
fromMailbox = tostring(data.fromMailbox or ""),
|
||
})
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('setSignature', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:setSignature',
|
||
tostring(data.address or ""), tostring(data.signature or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('getSharedMailboxes', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getSharedMailboxes')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('deleteMail', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:deleteMail', tonumber(data.id))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('getSent', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getSent')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('getFolders', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getFolders', tostring(data.address or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('getFolderMails', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getFolderMails', tonumber(data.folderId),
|
||
tostring(data.address or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('createFolder', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:createFolder', tostring(data.name or ""),
|
||
tostring(data.address or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('deleteFolder', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:deleteFolder', tonumber(data.id),
|
||
tostring(data.address or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('moveMail', function(data, cb)
|
||
local folderId = data.folderId ~= nil and tonumber(data.folderId) or nil
|
||
TriggerServerEvent('pc-live:server:moveMail', tonumber(data.id), folderId,
|
||
tostring(data.address or ""))
|
||
cb({})
|
||
end)
|
||
|
||
-- Calendar
|
||
RegisterNUICallback('getCalendar', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getCalendar')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('addCalendarEvent', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:addCalendarEvent', data)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('updateCalendarEvent', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:updateCalendarEvent', tonumber(data.id), data)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('deleteCalendarEvent', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:deleteCalendarEvent', tonumber(data.id))
|
||
cb({})
|
||
end)
|
||
|
||
-- Contacts
|
||
RegisterNUICallback('getContacts', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getContacts')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('addContact', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:addContact', data)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('updateContact', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:updateContact', tonumber(data.id), data)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('deleteContact', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:deleteContact', tonumber(data.id))
|
||
cb({})
|
||
end)
|
||
|
||
-- Store
|
||
RegisterNUICallback('getStore', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:getStore')
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('installApp', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:installApp', tostring(data.appId or ""))
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('uninstallApp', function(data, cb)
|
||
TriggerServerEvent('pc-live:server:uninstallApp', tostring(data.appId or ""))
|
||
cb({})
|
||
end)
|
||
|
||
-- Browser – IC pages fetched locally from config
|
||
RegisterNUICallback('getBrowserPage', function(data, cb)
|
||
local slug = tostring(data.slug or "home")
|
||
local page = Config.ICPages[slug]
|
||
cb({ found = page ~= nil, page = page, slug = slug })
|
||
end)
|
||
|
||
-- ── IC-Verwaltung ────────────────────────────────────────────────────────────
|
||
|
||
-- Relay messages from ic-verwaltung to pc-live NUI (→ iframe postMessage)
|
||
AddEventHandler('ic-verwaltung:relayToPC', function(msg)
|
||
SendNUIMessage({ action = 'ic_verwaltung_relay', data = msg })
|
||
end)
|
||
|
||
RegisterNUICallback('openIcVerwaltung', function(data, cb)
|
||
cb({})
|
||
-- Open ic-verwaltung in pcMode: no focus changes, UI relayed via postMessage
|
||
TriggerEvent('ic-verwaltung:openForPC')
|
||
end)
|
||
|
||
RegisterNUICallback('closeIcVerwaltung', function(data, cb)
|
||
cb({})
|
||
-- Forward close action into ic-verwaltung (user closed the PC window)
|
||
TriggerEvent('ic-verwaltung:closeFromPC')
|
||
end)
|
||
|
||
-- ── Parkuhr Integration ──────────────────────────────────────────────────────
|
||
|
||
local _pendingParkuhrCb = nil
|
||
|
||
-- Antwort vom Parkuhr-Server empfangen und an NUI weiterleiten
|
||
RegisterNetEvent('parkuhr:panelData', function(payload)
|
||
if _pendingParkuhrCb then
|
||
_pendingParkuhrCb(payload or { devices = {}, typeTariffs = {}, currency = "$" })
|
||
_pendingParkuhrCb = nil
|
||
end
|
||
end)
|
||
|
||
RegisterNUICallback('getParkuhrPanel', function(data, cb)
|
||
_pendingParkuhrCb = cb
|
||
TriggerServerEvent('parkuhr:requestPanelData')
|
||
end)
|
||
|
||
RegisterNUICallback('saveParkuhrTariff', function(data, cb)
|
||
TriggerServerEvent('parkuhr:saveTariff',
|
||
tonumber(data.deviceId),
|
||
tonumber(data.duration),
|
||
tonumber(data.price)
|
||
)
|
||
cb({})
|
||
end)
|
||
|
||
RegisterNUICallback('deleteParkuhrTariff', function(data, cb)
|
||
TriggerServerEvent('parkuhr:deleteTariff',
|
||
tonumber(data.deviceId),
|
||
tonumber(data.duration)
|
||
)
|
||
cb({})
|
||
end)
|
||
|
||
-- ── PBS Dashboard ────────────────────────────────────────────────────────────
|
||
|
||
RegisterNUICallback('getPbsUrl', function(data, cb)
|
||
cb({ url = GetConvar('pbs_web_url', 'http://localhost:4088') })
|
||
end)
|
||
|
||
-- Bleeter laeuft als eigene App im PC (client/bleeter.lua). Der frueher hier
|
||
-- stehende Callback oeffnete stattdessen Bleeters eigenes Fenster ueber dem PC
|
||
-- - das nahm dem PC den Fokus und war seit dem Umbau ohne Aufrufer.
|