TeamPanel
GamePanelFiveM

Screenshots hochladen

Screenshots von Spielern mit screenshot-basic serverseitig zu den Medien in TeamPanel hochladen und per License taggen.

Screenshots hochladen (FiveM)

Dein FiveM-Server kann Screenshots von Spielern direkt zu den Medien deines Teams hochladen – z. B. bei Reports, Anti-Cheat-Treffern oder Support-Fällen. Über den Tag license:… findest du später alle Screenshots eines Spielers.

Voraussetzungen

  • screenshot-basic auf dem Server installiert und gestartet
  • Deine Team-ID (Medien → Tab API & Integrationen)
  • Ein API-Schlüssel – am besten ein eigener mit dem Scope media:upload, verknüpft mit einem Mitglied, das Medien hochladen darf

API-Schlüssel in der server.cfg hinterlegen

set teampanel_api_key "TP_dein_schluessel"

Nie setr verwenden

setr repliziert die Variable an alle Clients – jeder Spieler könnte den Schlüssel auslesen. Verwende immer set, damit der Schlüssel auf dem Server bleibt.

Upload-Funktion einbauen (Server-Skript)

Der Server lässt den Client einen Screenshot aufnehmen (requestClientScreenshot) und lädt ihn selbst per JSON-Upload hoch. So gelangt der Schlüssel nie zum Spieler.

-- server.lua
-- server.cfg: set teampanel_api_key "TP_…"
local TEAM_ID = '<teamId>'

local function uploadScreenshot(playerId)
    exports['screenshot-basic']:requestClientScreenshot(playerId, { encoding = 'jpg', quality = 0.85 }, function(err, dataUrl)
        if err then return print('Screenshot failed: ' .. tostring(err)) end

        local tags = { 'type:screenshot' }
        local license = GetPlayerIdentifierByType(playerId, 'license') -- z. B. "license:abc123…"
        if license then table.insert(tags, license) end

        PerformHttpRequest(('https://api.team-panel.com/v1/cdn/media/%s/upload'):format(TEAM_ID), function(status, body)
            if status ~= 201 then return print(('Upload failed (%s): %s'):format(status, body)) end
            print(json.decode(body).publicUrl)
        end, 'POST', json.encode({
            file = dataUrl,
            fileName = ('screenshot-%s-%s.jpg'):format(playerId, os.time()),
            folder = 'screenshots',
            tags = tags,
        }), {
            ['Content-Type'] = 'application/json',
            ['Authorization'] = 'Bearer ' .. GetConvar('teampanel_api_key', ''),
        })
    end)
end

-- Beispiel: /screenshot <playerId> (nur mit ACE-Recht nutzbar)
RegisterCommand('screenshot', function(_, args)
    local target = tonumber(args[1])
    if target and GetPlayerName(target) then uploadScreenshot(target) end
end, true)

Ergebnis prüfen

Nach dem Upload liegt der Screenshot unter Medien im Ordner screenshots (wird beim ersten Upload automatisch angelegt). Filtere nach license:…, um alle Screenshots eines Spielers zu sehen.

Tipps

  • Aufräumen: Setze am Ordner screenshots eine Ordner-Regel, z. B. automatisch nach 30 Tagen löschen – so bleibt dein Speicher im Plan-Limit.
  • Privat speichern: Beweisbilder mit public = false hochladen oder den Ordner auf Standard-Sichtbarkeit privat stellen. Dann gibt es keinen öffentlichen CDN-Link.
  • Weitere Tags: z. B. type:report, discord:<id> oder steam:<hex> – maximal 20 pro Datei, siehe Tags.
  • Benachrichtigen: Mit dem Automatisierungs-Event Medien hochgeladen postest du neue Screenshots z. B. in einen Discord-Kanal.

Kein Client-Upload mit Schlüssel

requestScreenshotUpload ist ein Client-Export: Der Schlüssel würde vom Spiel-Client gesendet und wäre für Spieler sichtbar. Nutze für Uploads mit Team-API-Schlüssel immer den serverseitigen Weg oben.

Handy-Skripte, andere Games & Tools

Die Medien-API funktioniert mit jedem HTTP-Client – z. B. für Kamera-Apps in Handy-Skripten (serverseitig weiterleiten), Minecraft- oder Hytale-Plugins, Discord-Bots oder Launcher. Beispiele mit curl und Node.js sowie alle Parameter findest du unter Medien-API.

Geplant: Uploads mit TeamPanelFX

Coming soon: TeamPanelFX bekommt eingebaute Exports für Uploads – ohne eigenen HTTP-Code. Die Schnittstelle ist noch nicht final und kann sich ändern, z. B.:

exports.teampanelfx:uploadScreenshot(playerId, { folder = 'screenshots', tags = { 'type:report' } })

Auf dieser Seite