certificateSvc.py (7980B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\certificateSvc.py 2 from collections import defaultdict 3 import localization 4 import log 5 from carbon.common.script.sys.service import Service 6 from skills.certificates.certificateConst import CERTIFICATE_GRADES_LABELS 7 8 class Certificate(object): 9 10 def __init__(self, certificateID, groupID, nameID, descriptionID, skillTypes, recommendedFor): 11 self.skillSvc = sm.GetService('skills') 12 self.certificateID = certificateID 13 self.groupID = groupID 14 self.nameID = nameID 15 self.descriptionID = descriptionID 16 self._SetupSkills(skillTypes) 17 self.recommendedFor = recommendedFor 18 self.currentLevel = None 19 20 def __str__(self): 21 return 'Certificate: %s (%d)' % (self.GetName(), self.certificateID) 22 23 def _SetupSkills(self, skillTypes): 24 skills = {} 25 for skillTypeID, level in skillTypes.iteritems(): 26 skills[skillTypeID] = {} 27 skills[skillTypeID][1] = level.basic 28 skills[skillTypeID][2] = level.standard 29 skills[skillTypeID][3] = level.improved 30 skills[skillTypeID][4] = level.advanced 31 skills[skillTypeID][5] = level.elite 32 33 self.skills = skills 34 35 def GetName(self): 36 return localization.GetByMessageID(self.nameID) 37 38 def GetDescription(self): 39 return localization.GetByMessageID(self.descriptionID) 40 41 def GetLabel(self, level): 42 return localization.GetByLabel('UI/InfoWindow/CertificateNameWithProgress', certificateName=self.GetName(), skillsTrained=self.CountCompletedSkills(level), skillsTotal=self.CountSkills(level)) 43 44 def GetSkills(self): 45 return self.skills 46 47 def SkillsByTypeAndLevel(self, level): 48 return [ (typeID, levelData[level]) for typeID, levelData in self.skills.iteritems() if levelData[level] > 0 ] 49 50 def GetLevel(self): 51 if self.currentLevel is None: 52 self.currentLevel = 0 53 for i in xrange(5, 0, -1): 54 for typeID in self.skills.iterkeys(): 55 charLevel = self.skillSvc.MySkillLevel(typeID) 56 reqLevel = self.skills[typeID][i] 57 if reqLevel > 0 and charLevel < reqLevel: 58 break 59 else: 60 self.currentLevel = i 61 break 62 63 return self.currentLevel 64 65 def HasAllSkills(self, level): 66 for typeID, levels in self.skills.iteritems(): 67 if levels[level] > 0 and not self.skillSvc.HasSkill(typeID): 68 return False 69 70 return True 71 72 def CountCompletedSkills(self, level): 73 count = 0 74 for typeID, levels in self.skills.iteritems(): 75 if levels[level] > 0 and self.skillSvc.MySkillLevel(typeID) >= levels[level]: 76 count += 1 77 78 return count 79 80 def CountSkills(self, level): 81 count = 0 82 for typeID, levels in self.skills.iteritems(): 83 if levels[level] > 0: 84 count += 1 85 86 return count 87 88 def ClearCache(self): 89 self.currentLevel = None 90 91 92 class Certificates(Service): 93 __notifyevents__ = ['OnSkillsChanged', 'OnSessionReset'] 94 __guid__ = 'svc.certificates' 95 __servicename__ = 'certificates' 96 __displayname__ = 'Certificate Service' 97 __startupdependencies__ = ['settings', 'godma'] 98 99 def __init__(self): 100 super(Certificates, self).__init__() 101 self.certificates = {} 102 try: 103 for key, value in cfg.certificates['certificates'].iteritems(): 104 if hasattr(value, 'recommendedFor'): 105 recommendedFor = value.recommendedFor 106 else: 107 recommendedFor = [] 108 self.certificates[key] = Certificate(key, value.groupID, value.nameID, value.descriptionID, value.skillTypes, recommendedFor) 109 110 except KeyError: 111 log.LogException() 112 113 def OnSessionReset(self): 114 self.OnSkillsChanged() 115 116 def OnSkillsChanged(self, *args): 117 for certificate in self.certificates.itervalues(): 118 certificate.ClearCache() 119 120 def GetCertificate(self, certificateID): 121 return self.certificates[certificateID] 122 123 def GetAllCertificatesByCategoryID(self): 124 return self._GroupByCategoryID(self.certificates.values()) 125 126 def GetMyCertificates(self): 127 myCertificates = {} 128 for certificateID, certificate in self.certificates.iteritems(): 129 if certificate.GetLevel() > 0: 130 myCertificates[certificateID] = certificate 131 132 return myCertificates 133 134 def GetMyCertificatesByCategoryID(self): 135 certs = self.GetMyCertificates().values() 136 return self._GroupByCategoryID(certs) 137 138 def _GroupByCategoryID(self, certificates): 139 ret = defaultdict(list) 140 for cert in certificates: 141 ret[cert.groupID].append(cert) 142 143 return ret 144 145 def GetCertificatesByGroupID(self, groupID): 146 return [ cert for cert in self.certificates.values() if cert.groupID == groupID ] 147 148 def GetCurrCharMasteryLevel(self, shipTypeID): 149 for i in xrange(5, 0, -1): 150 certificates = self.GetCertificatesForShipByMasteryLevel(shipTypeID, i) 151 levels = set() 152 for certificate in certificates: 153 levels.add(certificate.GetLevel()) 154 155 for level in levels: 156 if level < i: 157 break 158 else: 159 return i 160 161 return 0 162 163 def GetMasteryIconForLevel(self, masteryLevel): 164 if masteryLevel == 0: 165 return 'res:/UI/Texture/Classes/Mastery/masterySmall0.png' 166 if masteryLevel == 1: 167 return 'res:/UI/Texture/Classes/Mastery/masterySmall1.png' 168 if masteryLevel == 2: 169 return 'res:/UI/Texture/Classes/Mastery/masterySmall2.png' 170 if masteryLevel == 3: 171 return 'res:/UI/Texture/Classes/Mastery/masterySmall3.png' 172 if masteryLevel == 4: 173 return 'res:/UI/Texture/Classes/Mastery/masterySmall4.png' 174 if masteryLevel == 5: 175 return 'res:/UI/Texture/Classes/Mastery/masterySmall5.png' 176 177 def GetCertificatesForShipByMasteryLevel(self, typeID, masteryLevel): 178 if typeID in cfg.certificates['masteries'] and masteryLevel > 0: 179 certificates = cfg.certificates['masteries'][typeID][masteryLevel - 1] 180 return [ self.certificates[certificateID] for certificateID in certificates ] 181 return [] 182 183 def GetSkillsRequiredForMasteryLevel(self, typeID, masteryLevel): 184 skills = {} 185 for certificate in self.GetCertificatesForShipByMasteryLevel(typeID, masteryLevel): 186 for skillID, level in certificate.SkillsByTypeAndLevel(masteryLevel): 187 skills[skillID] = max(skills.get(skillID, 0), level) 188 189 return skills 190 191 def GetShipTrainingTimeForMasteryLevel(self, typeID, masteryLevel): 192 skills = self.GetSkillsRequiredForMasteryLevel(typeID, masteryLevel) 193 return sm.GetService('skills').GetTrainingTimeForSkills(skills) 194 195 def GetCertificateTrainingTimeForMasteryLevel(self, certificateID, masteryLevel): 196 certificate = self.certificates[certificateID] 197 skills = {} 198 for skillID, level in certificate.SkillsByTypeAndLevel(masteryLevel): 199 skills[skillID] = max(skills.get(skillID, 0), level) 200 201 return sm.GetService('skills').GetTrainingTimeForSkills(skills) 202 203 def GetCertificateRecommendationsFromCertificateID(self, certificateID): 204 return self.certificates[certificateID].recommendedFor 205 206 def GetCertificateLabel(self, certificateID): 207 certificate = self.certificates[certificateID] 208 levelPath = CERTIFICATE_GRADES_LABELS.get(certificate.GetLevel()) 209 level = localization.GetByLabel(levelPath) 210 return (certificate.GetName(), level, certificate.GetDescription())