bleeter/client/main.lua
Bjoern Flessing 20076b0aee Soziales Netz im Spiel: Feed, Werbung, Markt, Kalender und Gewerbe
Jeder Spieler waehlt sich ein Handle mit @, Unternehmen und Behoerden bekommen
eigene Profile, fuer die sie Mitarbeiter freigeben.

Verwaltet wird ueber dieselbe Anmeldung wie das Webhosting: wer am IC-Computer
als Anbieter angemeldet ist, richtet Unternehmensprofile ein. Damit gibt es
genau eine Stelle, an der Verwaltungsrechte haengen - ein zweites Rechtesystem
daneben waere eine zweite Stelle, an der man jemanden zu entziehen vergisst.

Bewusst getrennt: wer fuer ein Unternehmen schreiben darf, kann sich nicht
selbst zum Verwalter machen.

Behoben gegenueber dem Ausgangsstand:

  - Die Resource startete nicht. Eine harte Abhaengigkeit zeigte auf eine
    Resource, die es nicht gibt - das verhindert den Start vollstaendig.
  - Das Schema war gegenueber dem Code stehengeblieben: eine Tabelle fehlte
    ganz, sechs Spalten fehlten. Jede Registrierung eines Handles scheiterte
    deshalb mit einem SQL-Fehler. Zwei Migrationen ziehen das nach.
  - Die Identitaet kommt jetzt von ESX statt von einem Charaktersystem, das
    hier nicht laeuft. Ohne das findet das Mailsystem die Postfaecher nicht.
  - Das Fenster hatte keinen Schliessknopf, nur ESC. Im Computerfenster ist
    diese Taste aber schon vergeben.
  - Bilder laden mit referrerpolicy="no-referrer": Bilderdienste sperren
    Hotlinks anhand der Herkunft, und die eines NUI kennen sie nicht.
  - Der Schluessel fuer den Bilder-Upload steht nicht mehr im Code, sondern in
    der server.cfg (set bleeter_imgbb_key). Er gehoert nicht in ein oeffentlich
    einsehbares Repository.

Neu: Unternehmensprofile und Mitarbeiterfreigabe, ueber Netzwerkereignisse und
Konsolenbefehle. Dazu eine Oberflaeche im IC-Computer, die dieselbe Gestaltung
benutzt - die Stildatei wird dafuer mechanisch gekapselt, statt sie nachzubauen.

Enthaelt README.md mit Einrichtung, Rechten und den Fallstricken.
2026-08-09 12:29:24 +00:00

193 lines
5.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local isOpen = false
local _openMode = 'phone' -- 'phone' | 'desktop'
local function nui(action, payload)
payload = payload or {}
payload.action = action
SendNUIMessage(payload)
end
local function setOpen(nextOpen, mode)
isOpen = nextOpen == true
if isOpen and mode then _openMode = mode end
SetNuiFocus(isOpen, isOpen)
if isOpen then
nui('open', { mode = _openMode })
TriggerServerEvent('bleeter:server:requestBootstrap')
else
nui('close')
end
end
-- Kein PC-Modus mehr.
--
-- Bleeter im PC lief zunaechst als iframe, dessen Nachrichten hierher und
-- wieder zurueck gereicht wurden. Das ging schief, weil SetNuiFocus global
-- gilt: zwei Resourcen, die den Fokus beanspruchen, sperren die Maus aus.
--
-- pc-live bringt jetzt eine eigene Oberflaeche mit und spricht direkt mit
-- bleeter:server:*. Diese Resource kuemmert sich nur noch um ihr eigenes
-- Fenster so wie jede andere auch.
CreateThread(function()
while true do
if isOpen then
DisableAllControlActions(0)
Wait(0)
else
Wait(250)
end
end
end)
RegisterNetEvent('bleeter:client:open', function(mode)
setOpen(true, mode or 'phone')
end)
RegisterNetEvent('bleeter:client:close', function()
setOpen(false)
end)
RegisterNetEvent('bleeter:client:data', function(payload)
nui('data', payload or {})
end)
RegisterNetEvent('bleeter:client:notify', function(payload)
nui('notify', payload or {})
end)
RegisterNetEvent('bleeter:client:mediaUploaded', function(payload)
nui('mediaUploaded', payload or {})
end)
RegisterNUICallback('close', function(_, cb)
setOpen(false)
cb({ ok = true })
end)
RegisterNUICallback('checkHandle', function(payload, cb)
TriggerServerEvent('bleeter:server:checkHandle', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('registerAccount', function(payload, cb)
TriggerServerEvent('bleeter:server:registerAccount', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('requestBootstrap', function(_, cb)
TriggerServerEvent('bleeter:server:requestBootstrap')
cb({ ok = true })
end)
RegisterNUICallback('setActiveProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:setActiveProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('followProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:followProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('unfollowProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:unfollowProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('blockProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:blockProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('unblockProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:unblockProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('moderateProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:moderateProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('updateProfile', function(payload, cb)
TriggerServerEvent('bleeter:server:updateProfile', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('openMailTo', function(payload, cb)
setOpen(false)
TriggerServerEvent('bleeter:server:openMailTo', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('createPost', function(payload, cb)
TriggerServerEvent('bleeter:server:createPost', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('uploadMedia', function(payload, cb)
TriggerServerEvent('bleeter:server:uploadMedia', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('togglePostLike', function(payload, cb)
TriggerServerEvent('bleeter:server:togglePostLike', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('deleteOwnPost', function(payload, cb)
TriggerServerEvent('bleeter:server:deleteOwnPost', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('createComment', function(payload, cb)
TriggerServerEvent('bleeter:server:createComment', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('toggleCommentLike', function(payload, cb)
TriggerServerEvent('bleeter:server:toggleCommentLike', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('deleteOwnComment', function(payload, cb)
TriggerServerEvent('bleeter:server:deleteOwnComment', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('createMarketplaceEntry', function(payload, cb)
TriggerServerEvent('bleeter:server:createMarketplaceEntry', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('deleteMarketplaceEntry', function(payload, cb)
TriggerServerEvent('bleeter:server:deleteMarketplaceEntry', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('createEvent', function(payload, cb)
TriggerServerEvent('bleeter:server:createEvent', payload or {})
cb({ ok = true })
end)
RegisterNUICallback('deleteEvent', function(payload, cb)
TriggerServerEvent('bleeter:server:deleteEvent', payload or {})
cb({ ok = true })
end)
RegisterCommand(Config.Command, function()
setOpen(true)
end, false)
exports('OpenBleeter', function(mode)
setOpen(true, mode or 'phone')
end)
-- Beim Start sicherstellen dass die NUI geschlossen ist
AddEventHandler('onClientResourceStart', function(name)
if name == GetCurrentResourceName() then
SetNuiFocus(false, false)
nui('close')
end
end)