Przejdź do treści
Blog

Uploady w fn_phone: zdjęcia, filmy i notatki głosowe na FiveDock

Wysyłaj zdjęcia, filmy i notatki głosowe z fn_phone do FiveDock zamiast do bazy danych. Wystarczy linijka w configu i agent fivedock albo token API.

Autor: Termi

6 min czytania
  • fn_phone
  • Uploads
  • Lua
Na tej stronie

fn_phone to nasz własny telefon do FiveM. Domyślnie trzyma każde zdjęcie, film i notatkę głosową w twojej bazie danych. Jedna linijka w configu wysyła je do FiveDock, a w bazie zostaje sam link. Upload odbywa się na serwerze przez fn_bridge, więc nie zmieniasz żadnych plików fn_phone, a token nigdy nie trafia do gracza.

Gdzie fn_phone trzyma media

Każdy plik nagrany telefonem to wiersz w fn_phone_media. Przy Config.Media.provider = 'local', czyli domyślnie, kolumna url trzyma cały plik jako data URI, do 3 MiB na zdjęcie i 12 MiB na film. Serwer przypomina o tym przy każdym starcie:

server console
[fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN

Przy provider = 'fivedock' serwer przekazuje każdy plik do FN_BRIDGE.MEDIA.Upload w fn_bridge, a ten wgrywa go i zwraca link z CDN. fn_bridge łączy się z FiveDock na jeden z dwóch sposobów. Gdy jest token, wysyła plik na https://api.fivedock.dev/api/v3/file/base64, ten sam adres base64, który ma API v3 Fivemanage. Gdy tokenu nie ma, a zasób agenta fivedock działa, zapisuje plik w swoim folderze cache, przekazuje go do exports.fivedock:upload, a potem go usuwa.

Gracze nigdy nie dostają linku do uploadu. Film nagrany telefonem najpierw idzie na serwer jako latent event, a serwer wgrywa go tak samo jak zdjęcie.

Upload przez agenta fivedock

Jeśli na serwerze działa już agent fivedock, nie musisz tworzyć żadnego tokenu. Agent loguje się kluczem fda_live_ z server.cfg, a fn_bridge wysyła przez niego uploady zawsze, gdy token nie jest ustawiony. Agent potrzebuje dwóch linijek w server.cfg, opisanych w poradniku agenta. Wpisz je nad ensure fn_phone:

server.cfg
set fivedock_key "fda_live_…"
ensure fivedock

Potem zmień providera w fn_phone/config.lua, a token zostaw pusty:

config.lua
Media = { provider = 'fivedock', token = '', encoding = 'webp', quality = 0.85, limit = 2000 },

Zrestartuj fn_phone. Uploady trafiają do folderu fn_phone w twoim środowisku.

Upload z tokenem API

Bez agenta fn_bridge potrzebuje tokenu API. W panelu FiveDock otwórz Tokeny, utwórz token ze scope’em files:write i przypisz go do swojego serwera. Zaczyna się od fd_live_. To nie jest klucz agenta fda_live_, którego API do wgrywania nie przyjmuje.

fn_phone najpierw czyta token z Config.Media.token. Jeśli to pole zostawisz puste, fn_bridge sięga po convar z server.cfg, z którego może korzystać każdy skrypt na fn_bridge:

server.cfg
set fn_bridge:upload_token "fd_live_…"

Użyj tu set. setr wysyła convar do gry każdego gracza. config.lua też jest bezpiecznym miejscem, bo fn_phone ładuje go tylko jako skrypt serwerowy. Ustaw provider = 'fivedock' tak jak w sekcji o agencie. Jeśli jest i token, i agent, fn_bridge używa tokenu.

Dla każdego pliku fn_bridge wysyła takie zapytanie:

request
POST https://api.fivedock.dev/api/v3/file/base64
Authorization: fd_live_…
Content-Type: application/json

{"base64":"UklGR…","filename":"fn_phone_1792756800_482913.webp","path":"fn_phone"}

Nazwa pliku to fn_phone_, czas uploadu w sekundach Unix i losowa liczba. FiveDock odpowiada linkiem z CDN w data.url i stamtąd fn_bridge go odczytuje.

Zmiana z poziomu gry

Admin → Konfiguracja serwera ma oba ustawienia w kroku Uploady i sieć: Magazyn to Media.provider, a Token fivedock to Media.token. Panel nigdy nie pokazuje zapisanego tokenu, tylko to, czy jest ustawiony. Zapisane wartości trafiają do pamięci KVP serwera i po restarcie fn_phone nakładają się na config.lua, więc Magazyn zapisany w grze wygrywa z plikiem.

Sprawdź, czy działa

Po restarcie konsola nie wypisuje już linijki o zdjęciach w bazie. Zrób zdjęcie aparatem i otwórz Pliki w panelu FiveDock: zdjęcie jest w folderze fn_phone, pod nazwą w rodzaju fn_phone_1792756800_482913.webp. W bazie najnowsze wiersze powinny mieć linki do FiveDock:

SQL
SELECT id, kind, LEFT(url, 40) AS url
FROM fn_phone_media
ORDER BY id DESC
LIMIT 10;

url zaczynający się od https://cdn.fivedock.dev/ jest na FiveDock. Ten, który zaczyna się od data:, jest w bazie: upload się nie udał i fn_phone zapisał plik tam. Jeśli wolisz wtedy błąd na telefonie, dopisz fallback = false do Config.Media. Zdjęcie albo film, którego nie udało się wgrać, nie zostanie wtedy w ogóle zapisany. Notatki głosowe w takiej sytuacji zawsze trafiają do bazy.

Co wgrywa fn_phone

  • Zdjęcia z aparatu, domyślnie w WebP. Config.Media.encoding przyjmuje webp, jpg albo png, a quality ustawia kompresję, domyślnie 0.85. Aparat potrzebuje działającego screencapture albo screenshot-basic.
  • Filmy w WebM z VP9 albo VP8, z bitrate 1,6 Mbit/s. Aparat kończy klip po 30 sekundach, więc klip ma około 6 MB.
  • Notatki głosowe i poczta głosowa w WebM z dźwiękiem Opus, do 400 KiB każda.
  • Obrazy dodane do Zdjęć z linku: PNG, JPEG, WebP albo GIF do 2,25 MiB. Serwer pobiera własną kopię i ją wgrywa, więc zdjęcie przetrwa wygaśnięcie linku z Discorda.

FiveDock przyjmuje wszystkie te pliki. Wyjątkiem po stronie telefonu są nagrania ekranu: fn_phone trzyma je w bazie we własnym formacie, niezależnie od providera.

Notatki głosowe widać jako wideo

Notatki głosowe to pliki WebM, czyli ten sam kontener, w którym fn_phone zapisuje filmy. FiveDock rozpoznaje typ pliku po bajtach, więc w panelu notatki głosowe trafiają do wideo.

Zdjęcia, które są jeszcze na Fivemanage

fn_phone usunął opcję Fivemanage w wersji 1.1.11. Jeśli w twoim config.lua dalej jest provider = 'fivemanage', zmień to na 'fivedock' jak wyżej. Zdjęcia sprzed zmiany mają linki do Fivemanage. Tak samo zdjęcia, które fn_phone_migrate przeniósł z lb-phone albo innego telefonu, bo import kopiuje każdy link bez zmian. Ładują się tak długo, jak pliki leżą na Fivemanage. Od 1.1.11 linki z r2.fivemanage.com nie działają już jako własne dzwonki.

Linki siedzą w kolumnie url tabeli fn_phone_media, a Wiadomości, ogłoszenia i relacje wskazują te wiersze 16-znakowym kluczem. Migracja kopiuje pliki z Fivemanage na klucz tylko do odczytu i daje listę stary link → nowy link. Z każdego wiersza tej listy robisz jedno zapytanie:

SQL
UPDATE fn_phone_media
SET url = 'https://cdn.fivedock.dev/f/8Kq2nR4t.webp'
WHERE url = 'https://r2.fivemanage.com/…/IMG_0412.webp';

Na Fivemanage nic nie jest zmieniane ani usuwane, więc zapytania możesz puścić, kiedy będziesz gotowy.

Gdy upload nie działa

  • Zdjęcia dalej lądują w bazie. fn_phone zapisuje zdjęcie w bazie, gdy upload się nie uda, więc literówka w tokenie, token bez files:write i pełne środowisko wyglądają na telefonie tak samo. Środowisko ponad limitem miejsca odrzuca uploady z 429. Sprawdź token w Config.Media.token albo fn_bridge:upload_token i miejsce w panelu.
  • Agent działa, a uploady dalej nie przechodzą. Token ma pierwszeństwo przed agentem. Jeśli w Config.Media.token albo fn_bridge:upload_token jest stary token, fn_bridge wysyła właśnie jego. Wyczyść oba, żeby wgrywać przez agenta.
  • Konsola dalej wypisuje [fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN. Magazyn zapisany w Admin → Konfiguracja serwera nadpisuje config.lua. Zmień go tam albo kliknij obok Przywróć.
  • Aparat nie robi zdjęć. fn_phone potrzebuje do aparatu screencapture albo screenshot-basic. Sprawdź, czy jeden z nich działa.

Częste pytania

Czy fn_phone działa z FiveDock?

Tak, bez zmian w jego plikach. Ustaw Config.Media.provider = 'fivedock', a potem uruchom agenta fivedock albo daj fn_phone token fd_live_ ze scope’em files:write, w Config.Media.token albo w convarze fn_bridge:upload_token. fn_bridge wgrywa z serwera każde zdjęcie, film i notatkę głosową i zapisuje link z CDN.

Czy fn_phone potrzebuje tokenu API?

Nie, jeśli na serwerze działa agent fivedock. Bez ustawionego tokenu fn_bridge przekazuje każdy upload agentowi, który loguje się własnym kluczem fda_live_. Token fd_live_ jest potrzebny tylko na serwerze bez agenta.

Czy fn_phone może dalej wgrywać na Fivemanage?

Nie. Wersja 1.1.11 usunęła opcję Fivemanage i Config.Media.provider przyjmuje teraz local albo fivedock. Stare linki do Fivemanage w fn_phone_media ładują się, dopóki pliki istnieją, a migracja FiveDock kopiuje pliki i wypisuje nowe linki.

Czy gracze mogą ustawić link z FiveDock jako dzwonek?

Tak. fivedock.dev jest pierwszym hostem w Config.Ringtones.hosts, a subdomeny też się liczą, więc link z cdn.fivedock.dev przechodzi. Link musi kończyć się rozszerzeniem pliku dźwiękowego, na przykład .mp3 albo .ogg. Wgraj plik w Pliki, a potem wklej jego link w telefonie w Ustawienia → Dźwięki → Dzwonek.

Czy Config.Fivedock to to samo ustawienie?

Nie. Config.Fivedock wysyła zdarzenia Black Box, czyli logi telefonu, do twojego panelu FiveDock. Zdjęcia, filmy i notatki głosowe słuchają tylko Config.Media. Gdy działa agent, oba działają bez tokenu.

Wszystkie artykuły