11import socket
2+ import time
3+ import requests
4+ import asyncio
5+ import shutil
6+ import os .path
27import geoip2 .database
38import geoip2 .errors
49
510from 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 "\x02 Country:\x02 {country} ({cc}), \x02 City:\x02 {city}{region}" .format (** data )
71+ reply ("\x02 Country:\x02 {country} ({cc}), \x02 City:\x02 {city}{region}" .format (** data ))
72+
73+ # check the DB
74+ update_db ()
0 commit comments