forked from 0x2620/pandora
143 lines
5.1 KiB
Python
143 lines
5.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import ox.geo
|
|
|
|
import logging
|
|
logger = logging.getLogger('pandora.statistics')
|
|
|
|
colors = {
|
|
'system': {
|
|
'Android': [0, 255, 0],
|
|
'BlackBerry': [64, 64, 64],
|
|
'BSD': [255, 0, 0],
|
|
'iOS': [0, 128, 255],
|
|
'Java': [128, 128, 128],
|
|
'Linux': [255, 128, 0],
|
|
'Mac OS X': [0, 255, 255],
|
|
'Nokia': [255, 0, 255],
|
|
'PlayStation': [192, 192, 192],
|
|
'RIM Tablet OS': [64, 64, 64],
|
|
'Unix': [255, 255, 0],
|
|
'Wii': [192, 192, 192],
|
|
'Windows Phone': [0, 0, 128], #has to be before 'Windows'
|
|
'Windows': [0, 0, 255]
|
|
},
|
|
'browser': {
|
|
'Camino': [192, 192, 192],
|
|
'Chrome Frame': [255, 255, 0], #has to be before 'Chrome'
|
|
'Chrome': [0, 255, 0],
|
|
'Chromium': [128, 255, 0],
|
|
'Epiphany': [128, 128, 128],
|
|
'Firefox': [255, 128, 0],
|
|
'Internet Explorer': [0, 0, 255],
|
|
'Konqueror': [64, 64, 64],
|
|
'Nokia Browser': [255, 0, 255],
|
|
'Opera': [255, 0, 0],
|
|
'Safari': [0, 255, 255],
|
|
'WebKit': [0, 255, 128]
|
|
}
|
|
}
|
|
|
|
def get_name(key, version):
|
|
for name in colors[key]:
|
|
if version.startswith(name):
|
|
return name
|
|
return ''
|
|
|
|
class Statistics(dict):
|
|
|
|
def __init__(self):
|
|
|
|
for mode in ['all', 'registered']:
|
|
self[mode] = {
|
|
"year": {},
|
|
"month": {},
|
|
"day": {},
|
|
"weekday": {},
|
|
"hour": {},
|
|
"continent": {},
|
|
"region": {},
|
|
"country": {},
|
|
"city": {},
|
|
"system": {},
|
|
"browser": {},
|
|
"systemandbrowser": {},
|
|
"systemversion": {},
|
|
"browserversion": {},
|
|
"systemandbrowserversion": {}
|
|
}
|
|
|
|
def _increment(self, d, key, add=1, base=0):
|
|
if not key in d:
|
|
d[key] = base
|
|
d[key] += add
|
|
|
|
def add(self, item):
|
|
for mode in ['all', 'registered']:
|
|
if mode == 'all' or item['level'] != 'guest':
|
|
for key in ['firstseen', 'lastseen']:
|
|
year = '%s-%s' % (item[key].strftime('%Y'), key)
|
|
month = '%s-%s' % (item[key].strftime('%Y-%m'), key)
|
|
day = item[key].strftime('%Y-%m-%d')
|
|
weekday = item[key].strftime('%u')
|
|
hour = item[key].strftime('%H')
|
|
|
|
if not year in self[mode]['year']:
|
|
self[mode]['year'][year] = {}
|
|
self._increment(self[mode]['year'][year], month)
|
|
|
|
self._increment(self[mode]['month'], month)
|
|
|
|
if key == 'firstseen':
|
|
if not day in self[mode]['day']:
|
|
self[mode]['day'][day] = {}
|
|
self._increment(self[mode]['day'][day], hour)
|
|
|
|
if not weekday in self[mode]['weekday']:
|
|
self[mode]['weekday'][weekday] = {}
|
|
self._increment(self[mode]['weekday'][weekday], hour)
|
|
|
|
self._increment(self[mode]['hour'], hour)
|
|
|
|
if item['location']:
|
|
split = ox.geo.split_geoname(item['location'])
|
|
if len(split) == 1:
|
|
country = split[0]
|
|
city = None
|
|
elif len(split) >= 2:
|
|
city = ', '.join(split[:-1])
|
|
country = split[-1]
|
|
else:
|
|
logger.error('unknown geo value: %s', item['location'])
|
|
country = city = None
|
|
|
|
if country:
|
|
country_data = ox.geo.get_country(country)
|
|
continent = country_data.get('continent', '')
|
|
region = ', '.join([continent, country_data.get('region', '')])
|
|
country = ', '.join([region, country])
|
|
city = ', '.join([country, city]) if city else ''
|
|
|
|
self._increment(self[mode]['continent'], continent)
|
|
self._increment(self[mode]['region'], region)
|
|
self._increment(self[mode]['country'], country)
|
|
if city:
|
|
self._increment(self[mode]['city'], city)
|
|
|
|
name = {}
|
|
for key in ['system', 'browser']:
|
|
version = item[key]
|
|
if version:
|
|
name[key] = get_name(key, version)
|
|
if name[key]:
|
|
self._increment(self[mode][key], name[key])
|
|
|
|
key = key + 'version'
|
|
self._increment(self[mode][key], version)
|
|
|
|
if name.get('system') and name.get('browser'):
|
|
name = name['system'] + ' / ' + name['browser']
|
|
self._increment(self[mode]['systemandbrowser'], name)
|
|
|
|
name = item['system'] + ' / ' + item['browser']
|
|
self._increment(self[mode]['systemandbrowserversion'], name)
|
|
|