diff options
Diffstat (limited to 'banapedia/Ban.py')
-rw-r--r-- | banapedia/Ban.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/banapedia/Ban.py b/banapedia/Ban.py new file mode 100644 index 0000000..d8666b4 --- /dev/null +++ b/banapedia/Ban.py | |||
@@ -0,0 +1,76 @@ | |||
1 | from banapedia.wapi.WikipediaQuery import BlockQuery | ||
2 | from datetime import datetime | ||
3 | import pygeoip | ||
4 | |||
5 | __author__ = 'pacien' | ||
6 | |||
7 | |||
8 | GEOIP_FILE = "/usr/share/GeoIP/GeoIP.dat" | ||
9 | geoip = pygeoip.GeoIP(GEOIP_FILE) | ||
10 | |||
11 | ISO_TIMESTAMP = "%Y-%m-%dT%H:%M:%SZ" | ||
12 | |||
13 | |||
14 | class Ban: | ||
15 | def __init__(self, ip, start, end): | ||
16 | self.ip = ip | ||
17 | self.start = start | ||
18 | self.end = end | ||
19 | self.country_code = None | ||
20 | |||
21 | def get_duration(self): | ||
22 | return (self.end - self.start).days | ||
23 | |||
24 | def get_country_code(self): | ||
25 | if self.country_code is not None: | ||
26 | return self.country_code | ||
27 | |||
28 | country_code = "" | ||
29 | |||
30 | try: | ||
31 | country_code = geoip.country_code_by_addr(self.ip).lower() | ||
32 | except pygeoip.GeoIPError: | ||
33 | print("[ERROR]", "Could not determine country for ip", self.ip) | ||
34 | |||
35 | self.country_code = country_code | ||
36 | return country_code | ||
37 | |||
38 | |||
39 | def map_ban(ban_dict): | ||
40 | return Ban( | ||
41 | ban_dict["user"], | ||
42 | datetime.strptime(ban_dict["timestamp"], ISO_TIMESTAMP), | ||
43 | datetime.strptime(ban_dict["expiry"], ISO_TIMESTAMP), | ||
44 | ) | ||
45 | |||
46 | |||
47 | def map_bans(ban_dict_list): | ||
48 | ban_list = [] | ||
49 | for ban_dict in ban_dict_list: | ||
50 | ban_list.append(map_ban(ban_dict)) | ||
51 | |||
52 | return ban_list | ||
53 | |||
54 | |||
55 | def fetch_multipart_ban_dict(n, query_limit): | ||
56 | ban_dict_list = [] | ||
57 | n_fetched = 0 | ||
58 | continue_token = None | ||
59 | |||
60 | print("[INFO]", "Fetching %d bans" % n) | ||
61 | while n_fetched < n: | ||
62 | to_fetch = min(query_limit, n - n_fetched) | ||
63 | query = BlockQuery( | ||
64 | bkprop=["user", "timestamp", "expiry"], | ||
65 | bkshow=["temp", "ip"], | ||
66 | limit=to_fetch, | ||
67 | continue_token=continue_token, | ||
68 | ) | ||
69 | results = query.fetch_result() | ||
70 | ban_dict_list.extend(results["query"]["blocks"]) | ||
71 | continue_token = results["query-continue"]["blocks"]["bkcontinue"] | ||
72 | n_fetched += to_fetch | ||
73 | print("[INFO]", "Fetched %d over %d bans" % (n_fetched, n)) | ||
74 | |||
75 | print("[INFO]", "Bans fetching complete") | ||
76 | return ban_dict_list | ||