Pular para o conteúdo
Blog

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

7 min de leitura
  • fn_phone
  • Uploads
  • Lua
Nesta página

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:

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

Com 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:

server.cfg
set fivedock_key "fda_live_…"
ensure fivedock

Depois troque o provider em fn_phone/config.lua e deixe token vazio:

config.lua
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:

server.cfg
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:

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"}

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:

SQL
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

  • Fotos da câmera, em WebP por padrão. Config.Media.encoding aceita webp, jpg ou png, e quality define a compressão, 0.85 por padrão. A câmera precisa de screencapture ou screenshot-basic rodando.
  • Vídeos, em WebM com VP9 ou VP8 a 1,6 Mbit/s. A câmera corta o clipe aos 30 segundos, então um clipe fica em torno de 6 MB.
  • Mensagens de voz e da caixa postal, em WebM com áudio Opus, de até 400 KiB cada.
  • Imagens adicionadas em Fotos a partir de um link: PNG, JPEG, WebP ou GIF de até 2,25 MiB. O servidor baixa uma cópia própria e faz o upload, então a foto sobrevive a um link do Discord que expira.

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:

SQL
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

  • As fotos continuam caindo no banco de dados. O fn_phone guarda a foto no banco quando o upload falha, então um token com erro de digitação, um token sem files:write e uma organização cheia parecem iguais no celular. Uma organização acima do limite de armazenamento recusa uploads com 429. Confira o token em Config.Media.token ou fn_bridge:upload_token, e o armazenamento no painel.
  • O agente roda, mas os uploads continuam falhando. O token tem prioridade sobre o agente. Se Config.Media.token ou fn_bridge:upload_token tiver um token antigo, o fn_bridge envia esse. Limpe os dois para enviar pelo agente.
  • O console continua imprimindo [fn_phone] photos are stored in the database (Config.Media.provider = local); use fivedock for a CDN. Um Armazenamento salvo em Admin → Configuração do servidor sobrescreve o config.lua. Mude por lá ou clique em Restaurar ao lado.
  • A câmera não tira fotos. O fn_phone precisa de screencapture ou screenshot-basic para a câmera. Confira se um dos dois está iniciado.

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.

Todos os artigos