import json
import time
import analytics
from analytics_enums import RequestField
import constants
import webapp2
class AnalyticsPage(webapp2.RequestHandler):
def _write_response(self, result):
self.response.write(json.dumps({
'result': result
}))
def _time(self):
return time.time()
def post(self):
try:
msg = json.loads(self.request.body)
except ValueError:
return self._write_response(constants.RESPONSE_INVALID_REQUEST)
response = constants.RESPONSE_INVALID_REQUEST
request_type = msg.get(RequestField.TYPE)
request_time_ms = msg.get(RequestField.REQUEST_TIME_MS)
if request_time_ms is None or request_type is None:
self._write_response(constants.RESPONSE_INVALID_REQUEST)
return
if (request_type == RequestField.MessageType.EVENT and
msg.get(RequestField.EVENT) is not None):
response = self._handle_event(msg)
self._write_response(response)
return
def _handle_event(self, msg):
request_time_ms = msg.get(RequestField.REQUEST_TIME_MS)
client_type = msg.get(RequestField.CLIENT_TYPE)
event = msg.get(RequestField.EVENT)
if event is None:
return constants.RESPONSE_INVALID_REQUEST
event_type = event.get(RequestField.EventField.EVENT_TYPE)
if event_type is None:
return constants.RESPONSE_INVALID_REQUEST
room_id = event.get(RequestField.EventField.ROOM_ID)
flow_id = event.get(RequestField.EventField.FLOW_ID)
try:
client_event_time_ms = float(event.get(
RequestField.EventField.EVENT_TIME_MS))
except (TypeError, ValueError):
return constants.RESPONSE_INVALID_REQUEST
try:
request_time_ms = float(request_time_ms)
except (TypeError, ValueError):
return constants.RESPONSE_INVALID_REQUEST
receive_time_ms = self._time() * 1000.
event_time_ms = client_event_time_ms + (receive_time_ms - request_time_ms)
analytics.report_event(event_type=event_type,
room_id=room_id,
time_ms=event_time_ms,
client_time_ms=client_event_time_ms,
host=self.request.host,
flow_id=flow_id, client_type=client_type)
return constants.RESPONSE_SUCCESS