Skip to content

Commit 230b8a9

Browse files
committed
Add automatic GeoIP file updater. This may or may not work, testing soon
1 parent cb10f09 commit 230b8a9

2 files changed

Lines changed: 46 additions & 5 deletions

File tree

data/GeoLite2-City.mmdb

-31.7 MB
Binary file not shown.

plugins/geoip.py

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,56 @@
11
import socket
2+
import time
3+
import requests
4+
import asyncio
5+
import shutil
6+
import os.path
27
import geoip2.database
38
import geoip2.errors
49

510
from cloudbot import hook
611

12+
DB_URL = "http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz"
13+
PATH = "./data/GeoLite2-City.mmdb"
714

8-
@hook.onload
9-
def load_geoip():
15+
geoip_reader = None
16+
17+
18+
def fetch_db():
19+
r = requests.get(DB_URL, stream=True)
20+
if r.status_code == 200:
21+
with open(PATH, 'wb') as f:
22+
r.raw.decode_content = True
23+
shutil.copyfileobj(r.raw, f)
24+
25+
26+
def update_db():
1027
global geoip_reader
11-
geoip_reader = geoip2.database.Reader('./data/GeoLite2-City.mmdb')
28+
if os.path.isfile(PATH):
29+
# check if file is over 2 weeks old
30+
if time.time() - os.path.getmtime(PATH) > (14 * 24 * 60 * 60):
31+
geoip_reader = None
32+
fetch_db()
33+
geoip_reader = geoip2.database.Reader(PATH)
34+
else:
35+
if not geoip_reader:
36+
geoip_reader = geoip2.database.Reader(PATH)
37+
else:
38+
geoip_reader = None
39+
fetch_db()
40+
geoip_reader = geoip2.database.Reader(PATH)
41+
42+
43+
@asyncio.coroutine
44+
@hook.onload
45+
def load_geoip(loop):
46+
loop.run_in_executor(None, update_db)
1247

1348

1449
@hook.command
15-
def geoip(text):
50+
def geoip(text, reply):
51+
if not geoip_reader:
52+
return "GeoIP database is updating, please wait a minute"
53+
1654
try:
1755
ip = socket.gethostbyname(text)
1856
except socket.gaierror:
@@ -30,4 +68,7 @@ def geoip(text):
3068
"region": ", " + location_data.subdivisions.most_specific.name or ""
3169
}
3270

33-
return "\x02Country:\x02 {country} ({cc}), \x02City:\x02 {city}{region}".format(**data)
71+
reply("\x02Country:\x02 {country} ({cc}), \x02City:\x02 {city}{region}".format(**data))
72+
73+
# check the DB
74+
update_db()

0 commit comments

Comments
 (0)