characterCreationMetrics.py (6607B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\charactercreator\client\characterCreationMetrics.py 2 import requests 3 import hashlib 4 import log 5 import uthread 6 from eveprefs import boot 7 from carbonui.uicore import uicore 8 import charactercreator.const as ccConst 9 import utillib 10 STEP_NAMES = {ccConst.LOGIN: 'LOGIN', 11 ccConst.HANGAR: 'HANGAR', 12 ccConst.CANCEL: 'CANCEL', 13 ccConst.COMPLETE: 'COMPLETE', 14 ccConst.EMPIRESTEP: 'EMPIRE', 15 ccConst.TECHNOLOGYSTEP: 'TECH', 16 ccConst.BLOODLINESTEP: 'BLOODLINE', 17 ccConst.CUSTOMIZATIONSTEP: 'CUSTOMIZATION', 18 ccConst.PORTRAITSTEP: 'PORTRAIT', 19 ccConst.NAMINGSTEP: 'NAMING', 20 ccConst.DOLLSTEP: 'DOLL'} 21 MODE_NAMES = {ccConst.MODE_FULLINITIAL_CUSTOMIZATION: 'FULLINITIAL_CUSTOMIZATION', 22 ccConst.MODE_LIMITED_RECUSTOMIZATION: 'LIMITED_RECUSTOMIZATION', 23 ccConst.MODE_FULL_RECUSTOMIZATION: 'FULL_RECUSTOMIZATION', 24 ccConst.MODE_FULL_BLOODLINECHANGE: 'FULL_BLOODLINECHANGE'} 25 PAGE_VIEW_TARGETS = [ccConst.EMPIRESTEP, 26 ccConst.TECHNOLOGYSTEP, 27 ccConst.BLOODLINESTEP, 28 ccConst.CUSTOMIZATIONSTEP, 29 ccConst.PORTRAITSTEP, 30 ccConst.NAMINGSTEP] 31 32 def check_for_character_creation_exit(): 33 if hasattr(uicore, 'layer'): 34 if hasattr(uicore.layer, 'charactercreation'): 35 if getattr(uicore.layer.charactercreation, 'isopen', 0) and hasattr(uicore.layer.charactercreation.controller, 'metrics') and uicore.layer.charactercreation.controller.metrics is not None: 36 uicore.layer.charactercreation.controller.metrics.exit_cc() 37 38 39 class CharacterCreationMetrics(object): 40 41 def get_page_name(self, page): 42 return 'characterCreation_%s' % STEP_NAMES[page] 43 44 def __init__(self, mode, start_page): 45 self.chars = None 46 self.page = start_page 47 self.mode = MODE_NAMES.get(mode) 48 self.start_cc(start_page) 49 50 @staticmethod 51 def hash_uid(uid): 52 uid_str = str(uid) + 'S3lmfi20jklnsfkl395jfmksl' 53 return hashlib.sha1(uid_str).hexdigest() 54 55 def new_page(self, to_page): 56 page_name = self.get_page_name(to_page) 57 req_params = self.get_req_params(self.page, {'t': 'pageview', 58 'dh': 'eveonline', 59 'dp': page_name, 60 'dt': page_name}) 61 self.record_metric(req_params) 62 self.page = to_page 63 64 def cancel_cc(self): 65 req_params = self.get_req_params(self.page, {'t': 'event', 66 'ea': 'character_creation', 67 'el': 'cancel', 68 'ec': 'interaction', 69 'sc': 'end'}) 70 self.record_metric(req_params) 71 self.page = ccConst.CANCEL 72 73 def exit_cc(self): 74 req_params = self.get_req_params(self.page, {'t': 'event', 75 'ea': 'exit_game', 76 'el': 'logout', 77 'ec': 'interaction', 78 'sc': 'end'}) 79 self.record_metric(req_params, async=False) 80 self.page = ccConst.CANCEL 81 82 def complete_cc(self, charid): 83 req_params = self.get_req_params(self.page, {'t': 'event', 84 'ea': 'character_creation', 85 'el': 'complete', 86 'ec': 'milestone', 87 'sc': 'end'}) 88 req_params['cd6'] = charid 89 self.chars = sm.GetService('cc').GetCharacterSelectionData().GetChars() 90 req_params['cd7'] = len(self.chars) 91 self.record_metric(req_params) 92 self.page = ccConst.CANCEL 93 94 def start_cc(self, start_page): 95 req_params = self.get_req_params(start_page, {'t': 'event', 96 'ea': 'character_creation', 97 'el': 'started', 98 'ec': 'milestone'}) 99 self.record_metric(req_params, async=False) 100 self.page = start_page 101 102 def name_available_checked(self, name_available): 103 if name_available == 1: 104 label = 'name checked available' 105 else: 106 label = 'name checked unavailable' 107 req_params = self.get_req_params(self.page, {'t': 'event', 108 'ea': 'character_creation', 109 'el': label, 110 'ec': 'choose name'}) 111 self.record_metric(req_params) 112 113 def first_name_focused(self): 114 req_params = self.get_req_params(self.page, {'t': 'event', 115 'ea': 'character_creation', 116 'el': 'first name focused', 117 'ec': 'choose name'}) 118 self.record_metric(req_params) 119 120 def last_name_focused(self): 121 req_params = self.get_req_params(self.page, {'t': 'event', 122 'ea': 'character_creation', 123 'el': 'last name focused', 124 'ec': 'choose name'}) 125 self.record_metric(req_params) 126 127 def last_name_randomized(self): 128 req_params = self.get_req_params(self.page, {'t': 'event', 129 'ea': 'character_creation', 130 'el': 'last name randomized', 131 'ec': 'choose name'}) 132 self.record_metric(req_params) 133 134 def pick_school(self, schoolID): 135 req_params = self.get_req_params(self.page, {'t': 'event', 136 'ea': 'character_creation', 137 'el': 'pick school %d' % schoolID, 138 'ec': 'choose name'}) 139 self.record_metric(req_params) 140 141 def get_req_params(self, page, extra_keys_dict): 142 cluster_name = utillib.GetServerName() 143 hashed_uid = self.hash_uid(session.userid) 144 charid = session.charid 145 if charid is None: 146 charid = 0 147 if self.chars is None: 148 self.chars = sm.GetService('cc').GetCharacterSelectionData().GetChars() 149 req_params = {'v': 1, 150 'tid': 'UA-45583206-12', 151 'cid': hashed_uid, 152 'cd1': hashed_uid, 153 'cd2': self.mode, 154 'cd3': cluster_name, 155 'cd4': session.sid, 156 'cd5': self.get_page_name(page), 157 'cd6': charid, 158 'cd7': len(self.chars)} 159 req_params.update(extra_keys_dict) 160 return req_params 161 162 def record_metric(self, req_params, async = True): 163 if boot.region != 'optic': 164 if async: 165 uthread.new(self.record_metric_t, req_params) 166 else: 167 self.record_metric_t(req_params, timeout=2.0) 168 169 @staticmethod 170 def record_metric_t(req_params, timeout = 30.0): 171 try: 172 r = requests.post('https://www.google-analytics.com/collect', data=req_params, timeout=timeout) 173 log.LogInfo('characterCreationMetrics: Sending POST %s' % req_params) 174 r.raise_for_status() 175 except requests.ConnectTimeout: 176 log.LogWarn('characterCreationMetrics: TIMED OUT') 177 except requests.HTTPError as e: 178 log.LogWarn('characterCreationMetrics: HTTP Error %s' % e) 179 except requests.ConnectionError as e: 180 log.LogWarn('characterCreationMetrics: Connection Error %s' % e) 181 except: 182 pass