File che crea json servers con gamedig
Inviato: giovedì 16 ottobre 2025, 9:00
Codice: Seleziona tutto
sudo apt install -y jq lftp npmCodice: Seleziona tutto
sudo npm install -g gamedig@4.0.3Codice: Seleziona tutto
nano /usr/local/bin/query_servers_ftp.shCodice: 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.shCodice: Seleziona tutto
cd /usr/local/bin/
./query_servers_ftp.shCodice: Seleziona tutto
crontab -e