NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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