From 772fc29cb89ccd0052a64a8a9caf7cb4e8f481e9 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 2 Mar 2019 12:56:21 -0800 Subject: [PATCH] Detect geo of server. Using geolite2, we attempt to detect the continent of the server and store the 'continent code' in the serverlist. This is reasonably broad enough to help players in the client find truly "nearby" server. The client will have to be changed to select a continent to change ordering or filtering. --- requirements.txt | 2 +- server.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index fe14968..79f17b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ Flask>=0.10 - +maxminddb-geolite2>=2018.703 diff --git a/server.py b/server.py index 82802db..873a4ca 100755 --- a/server.py +++ b/server.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import os, re, sys, json, time, socket from threading import Thread, RLock +from geolite2 import geolite2 from flask import Flask, request, send_from_directory @@ -277,6 +278,18 @@ def asyncFinishThread(server): % (server["ip"], server["address"], addresses)) return + reader = geolite2.reader() + try: + geo = reader.get(server["ip"]) + except geoip2.errors.GeoIP2Error: + app.logger.warning("GeoIP lookup failure for %s." % (server["address"],)) + + if "continent" in geo and "code" in geo["continent"]: + server["geo_continent"] = geo["continent"]["code"] + else: + app.logger.warning("Unable to get GeoIP Continent data for %s." + % (server["address"],)) + server["ping"] = serverUp(info[0]) if not server["ping"]: app.logger.warning("Server %s:%d has no ping."