fn_phone: fotos, vídeos e mensagens de voz no FiveDock
Envie fotos, vídeos e mensagens de voz do fn_phone para o FiveDock em vez do banco de dados: uma linha de config, mais o agente fivedock ou um token de API.
Por Termi
- fn_phone
- Uploads
- Lua
Nesta página
- Onde o fn_phone guarda a mídia
- Upload pelo agente fivedock
- Upload com token de API
- Mudar pelo jogo
- Conferir se funciona
- O que o fn_phone envia
- Fotos que ainda estão no Fivemanage
- Se os uploads falharem
- Perguntas frequentes
- O fn_phone funciona com o FiveDock?
- Preciso de um token de API para o fn_phone?
- O fn_phone ainda consegue enviar para o Fivemanage?
- Os jogadores podem usar links do FiveDock como toque?
- Config.Fivedock é a mesma configuração?
O fn_phone é o nosso próprio celular para FiveM. De fábrica, ele guarda toda foto, vídeo e mensagem de voz no seu banco de dados. Uma linha na config manda tudo para o FiveDock, e o banco fica só com o link. O upload roda no servidor, via fn_bridge, então você não edita nenhum arquivo do fn_phone e nenhum token chega a um jogador.
Onde o fn_phone guarda a mídia
Cada arquivo gravado pelo celular é uma linha em fn_phone_media. Com Config.Media.provider = 'local', o padrão, a coluna url guarda o arquivo inteiro como data URI, até 3 MiB por foto e 12 MiB por vídeo. O servidor avisa isso a cada start:
[fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDNCom provider = 'fivedock', o servidor entrega cada arquivo para FN_BRIDGE.MEDIA.Upload no fn_bridge, que faz o upload e devolve o link do CDN. O fn_bridge chega ao FiveDock de duas formas. Com um token definido, ele envia o arquivo para https://api.fivedock.dev/api/v3/file/base64, o mesmo endereço base64 da API v3 do Fivemanage. Sem token e com o resource do agente fivedock iniciado, ele grava o arquivo na pasta cache, passa para exports.fivedock:upload e apaga depois.
Os jogadores nunca recebem um link de upload. Um vídeo gravado no celular vai primeiro para o servidor como latent event, e o servidor faz o upload como se fosse uma foto.
Upload pelo agente fivedock
Se o agente fivedock já roda no seu servidor, você não precisa criar token. O agente entra com a chave fda_live_ do server.cfg, e o fn_bridge manda os uploads por ele sempre que não há token. O agente precisa de duas linhas no server.cfg, como descreve o guia do agente. Coloque-as acima de ensure fn_phone:
set fivedock_key "fda_live_…"
ensure fivedockDepois troque o provider em fn_phone/config.lua e deixe token vazio:
Media = { provider = 'fivedock', token = '', encoding = 'webp', quality = 0.85, limit = 2000 },Reinicie o fn_phone. Os uploads caem na pasta fn_phone da sua organização.
Upload com token de API
Sem o agente, o fn_bridge precisa de um token de API. No painel do FiveDock, abra Tokens, crie um token com o scope files:write e vincule ao seu servidor. Ele começa com fd_live_. Não é a chave de agente fda_live_, que a API de upload não aceita.
O fn_phone lê o token primeiro de Config.Media.token. Se você deixar vazio, o fn_bridge recorre a uma convar no server.cfg, que qualquer script baseado no fn_bridge pode usar:
set fn_bridge:upload_token "fd_live_…"Use set aqui. setr replica a convar para o jogo de cada jogador. O config.lua também é seguro, já que o fn_phone só o carrega como script de servidor. Defina provider = 'fivedock' como na seção do agente. Se token e agente estiverem os dois presentes, o fn_bridge usa o token.
Para cada arquivo, o fn_bridge envia esta requisição:
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"}O nome do arquivo é fn_phone_, a hora do upload em segundos Unix e um número aleatório. O FiveDock responde com o link do CDN em data.url, e é de lá que o fn_bridge o lê.
Mudar pelo jogo
Admin → Configuração do servidor tem as duas opções na etapa Uploads e web: Armazenamento é Media.provider e Token do fivedock é Media.token. O painel nunca mostra um token salvo, só se há um definido. Os valores salvos vão para o armazenamento KVP do servidor e valem por cima do config.lua depois que o fn_phone reinicia, então um Armazenamento salvo no jogo vence o arquivo.
Conferir se funciona
Depois do restart, o console não imprime mais a linha sobre fotos no banco de dados. Tire uma foto com a câmera e abra Arquivos no painel do FiveDock: ela está na pasta fn_phone, com um nome como fn_phone_1792756800_482913.webp. No banco de dados, as linhas mais novas devem ter links do FiveDock:
SELECT id, kind, LEFT(url, 40) AS url
FROM fn_phone_media
ORDER BY id DESC
LIMIT 10;Uma url que começa com https://cdn.fivedock.dev/ está no FiveDock. Uma que começa com data: está no banco: o upload falhou e o fn_phone guardou o arquivo ali. Para ver um erro no celular em vez disso, adicione fallback = false em Config.Media; uma foto ou vídeo cujo upload falha então não é salvo de jeito nenhum. Mensagens de voz sempre voltam para o banco.
O que o fn_phone envia
O FiveDock aceita tudo isso. Do lado do celular, a exceção são as gravações de tela: o fn_phone as guarda no banco, em formato próprio, qualquer que seja o provider.
Mensagens de voz aparecem como vídeo
Mensagens de voz são arquivos WebM, o mesmo contêiner dos vídeos do fn_phone. O FiveDock lê o tipo do arquivo pelos bytes, por isso o painel lista as mensagens de voz como vídeo.
Fotos que ainda estão no Fivemanage
O fn_phone tirou a opção Fivemanage na versão 1.1.11. Se o seu config.lua ainda tem provider = 'fivemanage', troque por 'fivedock' como acima. Fotos tiradas antes da troca mantêm os links do Fivemanage, assim como as que o fn_phone_migrate trouxe do lb-phone ou de outro celular, já que a importação copia cada link como está. Elas carregam enquanto os arquivos continuarem no Fivemanage. Desde a 1.1.11, links de r2.fivemanage.com não funcionam mais como toques personalizados.
Os links ficam na coluna url de fn_phone_media, e Mensagens, anúncios e stories apontam para essas linhas pela chave de 16 caracteres. A migração copia seus arquivos do Fivemanage com uma chave somente leitura e entrega uma lista de link antigo → link novo. Cada linha dessa lista vira um statement:
UPDATE fn_phone_media
SET url = 'https://cdn.fivedock.dev/f/8Kq2nR4t.webp'
WHERE url = 'https://r2.fivemanage.com/…/IMG_0412.webp';Nada no Fivemanage é alterado nem apagado, então você pode rodar os statements quando estiver pronto.
Se os uploads falharem
Perguntas frequentes
O fn_phone funciona com o FiveDock?
Funciona, sem editar os arquivos dele. Defina Config.Media.provider = 'fivedock' e depois rode o agente fivedock ou dê ao fn_phone um token fd_live_ com o scope files:write, em Config.Media.token ou na convar fn_bridge:upload_token. O fn_bridge envia do servidor cada foto, vídeo e mensagem de voz e guarda o link do CDN.
Preciso de um token de API para o fn_phone?
Não, se o agente fivedock roda no servidor. Sem token definido, o fn_bridge passa cada upload ao agente, que entra com a própria chave fda_live_. Você só precisa de um token fd_live_ em um servidor sem agente.
O fn_phone ainda consegue enviar para o Fivemanage?
Não. A versão 1.1.11 removeu a opção Fivemanage, e Config.Media.provider agora aceita local ou fivedock. Links antigos do Fivemanage em fn_phone_media continuam carregando enquanto os arquivos existirem, e a migração do FiveDock copia os arquivos e lista os links novos.
Os jogadores podem usar links do FiveDock como toque?
Podem. fivedock.dev é o primeiro host em Config.Ringtones.hosts, e subdomínios contam, então um link em cdn.fivedock.dev passa. O link precisa terminar em uma extensão de áudio como .mp3 ou .ogg. Envie o arquivo em Arquivos e cole o link no celular, em Ajustes → Sons e Vibração → Toque.
Config.Fivedock é a mesma configuração?
Não. Config.Fivedock envia eventos Black Box, os logs do celular, para o seu painel do FiveDock. Fotos, vídeos e mensagens de voz seguem só Config.Media. Com o agente rodando, os dois funcionam sem token.