In questo articolo vediamo come implementare una semplice API di pingback per la toplist di metin2pserver.cc, che permette di premiare i giocatori al voto aggiornando i loro "coins" direttamente dalla toplist. L'esempio riportato utilizza PHP e due database MySQL standard nei serverfiles di Metin2: uno per i giocatori e uno per gli account.
Spiegazione del flusso
Quando la toplist invia il pingback (ad esempio dopo il voto di un player), il sistema:
1. Riceve il parametro ingameName
in GET.
2. Cerca l'account ID associato al nome giocatore.
3. Aggiorna i "coins" dell'account, incrementandoli di 1.
Tutte le operazioni sono protette (input sanitizzato, gestione errori), ma NON viene effettuato alcun controllo specifico sull’IP sorgente per aumentare compatibilità e ridurre la rigidità del sistema. Il controllo del voto ogni 24h viene gestito direttamente da Metin2PServer.cc. Se si vuole implementare un blocco di voti sullo stesso player anche da IP diversi bisogna modificare lo script sotto. Metin2PServer.cc già prevede un blocco VPN e Proxy sul sito.
Esempio di codice PHP
<?php
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
// Ottieni l'account_id associato al nome giocatore
$stmt = $playerDb->prepare("SELECT account_id FROM player WHERE name = :name LIMIT 1");
$stmt->execute(['name' => $ingameName]);
$accountId = $stmt->fetchColumn();
if (!$accountId) {
http_response_code(404);
exit("Error: Player not found.");
}
} catch (PDOException $e) {
// Log dell'errore e messaggio generico al client
error_log("Player DB error: " . $e->getMessage());
http_response_code(500);
exit("Internal Server Error (player DB).");
}
try {
// --- Connessione al database degli account ---
$accountDb = new PDO(
'mysql:host=YOUR_DB_HOST;dbname=account;charset=utf8mb4',
'YOUR_DB_USER',
'YOUR_DB_PASS',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
// Incrementa i coins dell'account corrispondente
$updateStmt = $accountDb->prepare("UPDATE account SET coins = coins + 1 WHERE id = :id");
$updateStmt->execute(['id' => $accountId]);
// Risposta di successo
echo "Pingback processed successfully.";
} catch (PDOException $e) {
error_log("Account DB error: " . $e->getMessage());
http_response_code(500);
exit("Internal Server Error (account DB).");
}
?>
Commenti e adattamenti
- Parametri del DB: Ricordati di sostituire
YOUR_DB_HOST
,YOUR_DB_USER
, eYOUR_DB_PASS
con i valori reali del tuo ambiente. - Sicurezza: Qui la verifica sull'IP è stata rimossa per favorire compatibilità in caso il servizio in alta affidabilità cambi range di IP.
- Debug: In produzione evita di mostrare dettagli di errore all’utente; usa solo messaggi generici e salva i dettagli nei log.
Come viene effettuata la chiamata
Una chiamata viene fatta così:
https://TUOSERVER.IT/pingback.php?ingameName=NOMEGIOCATORE
Sostituisci NOMEGIOCATORE
con il nome effettivo del player.
Questo sistema consente una rapida integrazione tra la toplist metin2pserver.cc e il tuo server. Modifica e amplia lo script in base alle esigenze del tuo progetto!