Pagina 1 di 1

File che crea json servers con gamedig

Inviato: giovedì 16 ottobre 2025, 9:00
da Matteo

Codice: Seleziona tutto

sudo apt install -y jq lftp npm

Codice: Seleziona tutto

sudo npm install -g gamedig@4.0.3

Codice: Seleziona tutto

nano /usr/local/bin/query_servers_ftp.sh
copia questo:

Codice: Seleziona tutto

#!/bin/bash
# query_servers_ftp.sh - compatibile jq <1.6 (fix per "null" e campi mancanti)

FTP_HOST="ftp.yourdomain.xxx"
FTP_USER="username"
FTP_PASS="password"
FTP_PATH="/wp-content/plugins/.............../servers.json"

TMP=$(mktemp)
LOCAL_JSON="/tmp/servers.json"

SERVERS=(
  "game|IP|PORT"
 ...
 ...
 ...
)

for cmd in gamedig jq lftp; do
  command -v "$cmd" >/dev/null 2>&1 || { echo "Errore: manca $cmd"; exit 1; }
done

echo "[" > "$TMP"

for ENTRY in "${SERVERS[@]}"; do
  IFS='|' read -r GAME IP PORT <<< "$ENTRY"
  DATA=$(gamedig --type "$GAME" --host "$IP" --port "$PORT" 2>/dev/null)

  if [ $? -eq 0 ] && [ -n "$DATA" ] && ! echo "$DATA" | jq -e '.error' >/dev/null 2>&1; then
    STATUS="online"

    # NAME, MAP, MAXPLAYERS, PING - gestiamo "null" prodotto da jq -r
    NAME=$(echo "$DATA" | jq -r '.name' | grep -m1 -v '^null$' || true)
    [ -z "$NAME" ] && NAME="Unknown"

    MAP=$(echo "$DATA" | jq -r '.map, .raw.mapname' | grep -m1 -v '^null$' || true)
    [ -z "$MAP" ] && MAP="Unknown"

    MAXPLAYERS=$(echo "$DATA" | jq -r '.maxplayers, .raw.sv_maxclients' | grep -m1 -v '^null$' || true)
    [ -z "$MAXPLAYERS" ] && MAXPLAYERS=0

    PING=$(echo "$DATA" | jq -r '.ping' | grep -m1 -v '^null$' || true)
    [ -z "$PING" ] && PING=0

    # SCORELIMIT, TIMELIMIT, GAME_VERSION, VERSION
    SCORELIMIT=$(echo "$DATA" | jq -r '.raw.scorelimit, .raw.fraglimit' | grep -m1 -v '^null$' || true)
    [ -z "$SCORELIMIT" ] && SCORELIMIT=0

    TIMELIMIT=$(echo "$DATA" | jq -r '.raw.timelimit' | grep -m1 -v '^null$' || true)
    [ -z "$TIMELIMIT" ] && TIMELIMIT=0

# GAME_VERSION: primo fallback tra game_version, version, _ModVer, shortversion, branch
GAME_VERSION=$(echo "$DATA" | jq -r '
  .raw.game_version,
  .raw.version,
  .raw._ModVer,
  .raw.shortversion,
  .raw.branch' | grep -v null | head -n1)
[ -z "$GAME_VERSION" ] && GAME_VERSION="Unknown"

# VERSION: primo fallback tra version, _ModVer, shortversion, branch
VERSION=$(echo "$DATA" | jq -r '
  .raw.version,
  .raw._ModVer,
  .raw.shortversion,
  .raw.branch' | grep -v null | head -n1)
[ -z "$VERSION" ] && VERSION="Unknown"

    # FS_GAME con fallback su gamename o appId, e gestione "null"
if [ "$GAME" = "sof2" ]; then
    FS_GAME=$(echo "$DATA" | jq -r '.raw.modname // "PRO 4.00c"')
else
    FS_GAME=$(echo "$DATA" | jq -r '.raw.fs_game' | grep -v '^null$' | head -n1)
    [ -z "$FS_GAME" ] && FS_GAME="Hardcore"
fi



# GAMETYPE: provo tutte le chiavi possibili, prendo la prima non-null
GAMETYPE=$(echo "$DATA" | jq -r '.raw.g_gametype_string, .raw.g_gametype, .raw.gametype_name, .raw.gametype, .raw.mode, .raw.game' | grep -m1 -v '^null$' || true)
[ -z "$GAMETYPE" ] && GAMETYPE="Unknown"
GAMETYPE=$(echo "$GAMETYPE" | tr '[:upper:]' '[:lower:]')

case "$GAMETYPE" in
  koth|king*hill*) GAMETYPE_HUMAN="King of the Hill" ;;
  tdm|war|team*death*) GAMETYPE_HUMAN="Team Deathmatch" ;;
  4|ctf|capture*flag*) GAMETYPE_HUMAN="Capture the Flag" ;;
  inf|infiltration) GAMETYPE_HUMAN="Infiltration" ;;
  elim|elimination) GAMETYPE_HUMAN="Elimination" ;;
  "h&s"*) GAMETYPE_HUMAN="Hide & Seek" ;;
  ffa|dm|free*for*all*) GAMETYPE_HUMAN="Deathmatch" ;;
  dom|domination) GAMETYPE_HUMAN="Domination" ;;
  sd|search*destroy*) GAMETYPE_HUMAN="Search & Destroy" ;;
  gr|gungame) GAMETYPE_HUMAN="Gun Game" ;;
  duel|tourney|tournament) GAMETYPE_HUMAN="Tournament" ;;
  8) GAMETYPE_HUMAN="Freeze Tag" ;;
  9) GAMETYPE_HUMAN="Protect the Leader" ;;
  6) GAMETYPE_HUMAN="One Flag CTF" ;;
  5) GAMETYPE_HUMAN="Return the Flag" ;;
  unknown|"") GAMETYPE_HUMAN="Unknown" ;;
  *) GAMETYPE_HUMAN=$(echo "$GAMETYPE" | sed 's/.*/\u&/') ;;
esac


    # Players & bots: compatibile jq <1.6 usando if ... then ... end per fallback
    PLAYERS=$(echo "$DATA" | jq -c '[.players[]? | {name: .name, frags: (if (.raw.frags == null) then 0 else .raw.frags end), ping: (if (.raw.ping == null) then 0 else .raw.ping end)}]' 2>/dev/null)
    if [ -z "$PLAYERS" ] || [[ "$PLAYERS" == "null" ]]; then PLAYERS="[]"; fi

    BOTS=$(echo "$DATA" | jq -c '[.bots[]? | {name: .name, frags: (if (.raw.frags == null) then 0 else .raw.frags end), ping: (if (.raw.ping == null) then 0 else .raw.ping end)}]' 2>/dev/null)
    if [ -z "$BOTS" ] || [[ "$BOTS" == "null" ]]; then BOTS="[]"; fi

    cat <<EOF >> "$TMP"
  {
    "game": "$GAME",
    "ip": "$IP",
    "port": "$PORT",
    "status": "$STATUS",
    "name": "$NAME",
    "map": "$MAP",
    "players": $PLAYERS,
    "bots": $BOTS,
    "maxplayers": $MAXPLAYERS,
    "ping": $PING,
    "scorelimit": "$SCORELIMIT",
    "timelimit": "$TIMELIMIT",
    "game_version": "$GAME_VERSION",
    "version": "$VERSION",
    "fs_game": "$FS_GAME",
    "gametype": "$GAMETYPE_HUMAN"
  },
EOF

  else
    cat <<EOF >> "$TMP"
  {
    "game": "$GAME",
    "ip": "$IP",
    "port": "$PORT",
    "status": "offline"
  },
EOF
  fi
done

sed -i '${s/},$/}/}' "$TMP"


echo "]" >> "$TMP"

mv "$TMP" "$LOCAL_JSON"
chmod 644 "$LOCAL_JSON"

lftp -u "$FTP_USER","$FTP_PASS" "$FTP_HOST" <<EOF
set ftp:ssl-allow no
put -O $(dirname "$FTP_PATH") "$LOCAL_JSON"
bye
EOF

echo "JSON generato e caricato su FTP: $FTP_HOST:$FTP_PATH"

Codice: Seleziona tutto

sudo chmod +x /usr/local/bin/query_servers_ftp.sh

Codice: Seleziona tutto

cd /usr/local/bin/
./query_servers_ftp.sh

Codice: Seleziona tutto

crontab -e
ogni 2 o 5 minuti