# Group and count entries by browser
class PopTrackerBrowsers
super TrackerHandler
# MongoMatch query used for each browser key
#
# Because parsing user agent string is a pain in the nit, we go lazy on this
# one. We associate each broswer key like `Chromium` to the query that allows
# us to count the number of visits.
var browser_queries: HashMap[String, MongoMatch] do
var map = new HashMap[String, MongoMatch]
map["Chromium"] = (new MongoMatch).regex("user_agent", "Chromium")
map["Edge"] = (new MongoMatch).regex("user_agent", "Edge")
map["Firefox"] = (new MongoMatch).regex("user_agent", "Firefox")
map["IE"] = (new MongoMatch).regex("user_agent", "(MSIE)|(Trident)")
map["Netscape"] = (new MongoMatch).regex("user_agent", "Netscape")
map["Opera"] = (new MongoMatch).regex("user_agent", "Opera")
map["Safari"] = (new MongoMatch).land(null, [
(new MongoMatch).regex("user_agent", "Safari"),
(new MongoMatch).regex("user_agent", "^((?!Chrome).)*$")])
map["Chrome"] = (new MongoMatch).land(null, [
(new MongoMatch).regex("user_agent", "Chrome"),
(new MongoMatch).regex("user_agent", "^((?!Edge).)*$")])
return map
end
# Apply the `query` on `TrackerRepo::count`
fun browser_count(query: MongoMatch): Int do return config.tracker_logs.count(query)
redef fun get(req, res) do
var browsers = new Array[BrowserCount]
for browser, query in self.browser_queries do
var count = new BrowserCount(browser, browser_count(query))
if count.count > 0 then browsers.add count
end
var sum = 0
for browser in browsers do sum += browser.count
var other = config.tracker_logs.count - sum
if other > 0 then browsers.add new BrowserCount("Other", other)
default_comparator.sort(browsers)
res.json new JsonArray.from(browsers)
end
end
lib/popcorn/pop_tracker.nit:125,1--168,3