Property definitions

popcorn $ PopTrackerBrowsers :: defaultinit
# 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