svc_dgmattr.py (14997B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\devtools\script\svc_dgmattr.py 2 import itertools 3 import sys 4 import blue 5 import dogma.data as dogma_data 6 import eve.common.lib.appConst as const 7 import log 8 import re 9 import webbrowser 10 from carbon.common.script.sys.serviceConst import ROLE_GMH, ROLE_PROGRAMMER 11 from carbon.common.script.util.commonutils import StripTags 12 from carbon.common.script.util.htmlwriter import HTMLEncode 13 from carbonui import uiconst 14 from carbonui.control.button import Button 15 from carbonui.control.contextMenu.menuData import MenuData 16 from carbonui.control.contextMenu.menuEntryData import MenuEntryData 17 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText 18 from carbonui.control.window import Window 19 from carbonui.primitives.container import Container 20 from carbonui.primitives.fill import Fill 21 from dogma.dogmaLogging import LogNotice 22 from eve.client.script.environment.godma import GetGodma 23 from eve.client.script.ui.control.entries.generic import Generic 24 from eve.client.script.ui.control.entries.util import GetFromClass 25 from eve.client.script.ui.control.eveEditPlainText import EditPlainText 26 from eve.client.script.ui.control.eveLabel import Label 27 from eve.client.script.ui.control.eveScroll import Scroll 28 from eve.common.script.net import eveMoniker 29 from eve.common.script.net.eveMoniker import GetLocationBindParams 30 from eveservices.menu import StartMenuService 31 GRAPH_TYPE_CLIENT = 0 32 GRAPH_TYPE_SERVER = 1 33 GRAPH_TYPE_FITTING_DOGMA = 2 34 35 class AttributeDetailsWindow(Window): 36 default_caption = 'My Window Caption' 37 default_windowID = 'attributeDetailsWindow' 38 39 def ApplyAttributes(self, attributes): 40 Window.ApplyAttributes(self, attributes) 41 self.default_caption = attributes.Get('caption', self.default_caption) 42 bodyText = attributes.bodyText 43 parent = self.sr.main 44 EditPlainText(name='myTextEdit', parent=parent, align=uiconst.TOALL, setvalue=bodyText) 45 textWidth, textHeight = Label.MeasureTextSize(bodyText) 46 self.width, self.height = textWidth + 20, textHeight + 40 47 48 49 class AttrEntry(Generic): 50 __guid__ = 'listentry.DgmAttrEntry' 51 52 def Startup(self, *args): 53 Generic.Startup(self, *args) 54 self.colorcodedFill = Fill(bgParent=self, color=(0, 0, 0, 0)) 55 56 def Load(self, node): 57 Generic.Load(self, node) 58 self.colorcodedFill.SetRGBA(*node.color) 59 60 def OnDblClick(self, *args): 61 self.ShowAttributeDetailsFromServer() 62 63 def GetMenu(self): 64 n = self.sr.node 65 menu_data = MenuData([MenuEntryData('View Details (+ Server Graph)', self.ShowAttributeDetailsFromServer), MenuEntryData('View Details (+ Client Graph)', self.ShowAttributeDetailsFromClient), MenuEntryData('View Details (+ Fitting DL Graph)', self.ShowAttributeDetailsFromFittingDogmaLocation)]) 66 if session.role & ROLE_PROGRAMMER: 67 if n.attributeName == 'charge': 68 return menu_data 69 value = GetGodma().GetStateManager().GetAttribute(n.itemID, n.attributeName) 70 menu_data.AddEntry('Change Attribute', lambda : StartMenuService().SetDogmaAttribute(n.itemID, n.attributeName, value)) 71 menu_data.AddEntry('Edit in FSD Editor', lambda : webbrowser.open('http://localhost:8000/dogma/attributes/{}/edit'.format(n.attributeID))) 72 menu_data.AddEntry('Copy Data', subMenuData=[MenuEntryData('server value', func=lambda : blue.pyos.SetClipboardData(StripTags(unicode(n.serverValue)))), MenuEntryData('Client value', func=lambda : blue.pyos.SetClipboardData(StripTags(unicode(n.clientValue)))), MenuEntryData('Godma value', func=lambda : blue.pyos.SetClipboardData(StripTags(unicode(n.godmaValue))))]) 73 return menu_data 74 75 def ShowAttributeDetailsFromServer(self): 76 n = self.sr.node 77 n.ShowAttribute(n.attributeID, graphType=GRAPH_TYPE_SERVER) 78 79 def ShowAttributeDetailsFromClient(self): 80 n = self.sr.node 81 n.ShowAttribute(n.attributeID, graphType=GRAPH_TYPE_CLIENT) 82 83 def ShowAttributeDetailsFromFittingDogmaLocation(self): 84 n = self.sr.node 85 n.ShowAttribute(n.attributeID, graphType=GRAPH_TYPE_FITTING_DOGMA) 86 87 88 class AttributeInspector(Window): 89 __guid__ = 'form.AttributeInspector' 90 default_windowID = 'AttributeInspector' 91 92 def __init__(self, **kwargs): 93 super(AttributeInspector, self).__init__(**kwargs) 94 95 def ApplyAttributes(self, attributes): 96 Window.ApplyAttributes(self, attributes) 97 self.itemID = attributes.itemID 98 self.typeID = attributes.typeID 99 self.nameFilter = None 100 self.stateManager = sm.GetService('godma').GetStateManager() 101 self.SetCaption('Attribute Inspector') 102 main = Container(name='main', parent=self.GetChild('main'), pos=(const.defaultPadding, 103 const.defaultPadding, 104 const.defaultPadding, 105 const.defaultPadding)) 106 top = Container(name='top', parent=main, height=20, align=uiconst.TOTOP) 107 Button(parent=top, label='Refresh', align=uiconst.TORIGHT, func=self.Refresh) 108 self.input = SingleLineEditText(name='itemID', parent=top, width=-1, height=-1, align=uiconst.TOALL) 109 self.input.readonly = not session.role & ROLE_GMH 110 self.input.OnReturn = self.Refresh 111 self.input.SetValue(str(self.itemID)) 112 Container(name='div', parent=main, height=5, align=uiconst.TOTOP) 113 self.scroll = Scroll(parent=main) 114 self.Refresh() 115 116 def _GetListEntryForAttr(self, attrID, attrName, clientValsByAttrID, godmaValsByAttrID, serverValsByAttrID, baseValsByAttrID, fittingDogmaValsByAttrID): 117 notApplicable = '<color=green>[n/a]</color>' 118 try: 119 clientValue = clientValsByAttrID[attrID] 120 except KeyError: 121 clientValue = notApplicable 122 123 try: 124 godmaValue = self.stateManager.GetAttribute(self.itemID, attrName) 125 except KeyError: 126 godmaValue = notApplicable 127 128 try: 129 serverValue = serverValsByAttrID[attrID] 130 except KeyError: 131 serverValue = notApplicable 132 133 try: 134 baseValue = baseValsByAttrID[attrID] 135 except KeyError: 136 baseValue = notApplicable 137 138 try: 139 fittingDogmaValue = fittingDogmaValsByAttrID[attrID] 140 except KeyError: 141 fittingDogmaValue = notApplicable 142 143 color = (0, 0, 0, 0) 144 if godmaValue != serverValue: 145 color = (1, 0, 0, 0.25) 146 elif baseValue == notApplicable: 147 color = (1, 1, 0, 0.25) 148 baseColor = serverColor = clientColor = godmaColor = '' 149 if clientValue != godmaValue: 150 if clientValue == serverValue: 151 clientColor = 'yellow' 152 elif clientValue == baseValue: 153 clientColor = 'blue' 154 else: 155 clientColor = 'red' 156 if godmaValue != serverValue: 157 if godmaValue == baseValue: 158 godmaColor = 'blue' 159 else: 160 godmaColor = 'red' 161 if serverValue != baseValue: 162 serverColor = 'yellow' 163 colorize = '<color={}>{}</color>' 164 if clientColor: 165 clientValue = colorize.format(clientColor, clientValue) 166 if godmaColor: 167 godmaValue = colorize.format(godmaColor, godmaValue) 168 if serverColor: 169 serverValue = colorize.format(serverColor, serverValue) 170 entry = GetFromClass(AttrEntry, {'label': u'{attrID}<t>{attrName}<t>{clientValue}<t>{godmaValue}<t>{serverValue}<t>{baseValue}<t>{fittingDogmaValue}'.format(**locals()), 171 'color': color, 172 'attributeID': attrID, 173 'attributeName': attrName, 174 'actualValue': godmaValue, 175 'baseValue': baseValue, 176 'fittingDogmaValue': fittingDogmaValue, 177 'ShowAttribute': self.ShowAttribute, 178 'itemID': self.itemID, 179 'clientValue': clientValue, 180 'godmaValue': godmaValue, 181 'serverValue': serverValue}) 182 return entry 183 184 def AttrID_FromName(self, attrName): 185 attrID = self.stateManager.attributesByName[attrName].attributeID 186 return attrID 187 188 def AttrName_FromID(self, attrID): 189 attrName = dogma_data.get_attribute_name(attrID) 190 return attrName 191 192 def _GetClientValsByAttrID(self): 193 cDLM = sm.GetService('clientDogmaIM').GetDogmaLocation() 194 try: 195 clientDogmaAttribs = cDLM.dogmaItems[self.itemID].attributes 196 clientValsByAttribID = {attrID:clientDogmaAttribs[attrID].GetValue() for attrID in clientDogmaAttribs} 197 except KeyError: 198 clientValsByAttribID = {} 199 200 return clientValsByAttribID 201 202 def _GetFittingDogmaValsByAttrID(self): 203 fDLM = sm.GetService('clientDogmaIM').GetFittingDogmaLocation() 204 dogmaItem = fDLM.SafeGetDogmaItem(self.itemID) 205 if not dogmaItem: 206 return {} 207 fittingDogmaAttribs = dogmaItem.attributes 208 fittingDogmaValsByAttribID = {attrID:fittingDogmaAttribs[attrID].GetValue() for attrID in fittingDogmaAttribs} 209 return fittingDogmaValsByAttribID 210 211 def _GetGodmaValsByAttrID(self): 212 godmaValsByAttributeName = self.stateManager.GetAttributes(self.itemID) 213 godmaValsByAttributeID = {self.AttrID_FromName(name):val for name, val in godmaValsByAttributeName.iteritems()} 214 return godmaValsByAttributeID 215 216 def _GetServerValsByAttrID(self): 217 serverValsByAttribID = self.GetServerDogmaLM().QueryAllAttributesForItem(self.itemID) 218 return serverValsByAttribID 219 220 def _GetBaseValsByAttrID(self): 221 baseValsByAttribID = sm.GetService('info').GetAttributeDictForType(self.typeID) 222 return baseValsByAttribID 223 224 def Refresh(self, *args): 225 inputValue = self.input.GetValue() 226 subLocPattern = '\\(\\d*L?, \\d*, \\d*\\)' 227 subLocPart = re.match(subLocPattern, inputValue) 228 if subLocPart: 229 itemKey = subLocPart.group(0) 230 itemID, flagID, typeID = itemKey.replace('(', '').replace(')', '').split(',') 231 self.itemID = (long(itemID), int(flagID), int(typeID)) 232 self.typeID = int(typeID) 233 elif inputValue.count('_') == 3: 234 self.itemID = inputValue.strip() 235 self.typeID = None 236 fDLM = sm.GetService('clientDogmaIM').GetFittingDogmaLocation() 237 dogmaItem = fDLM.SafeGetDogmaItem(self.itemID) 238 if dogmaItem: 239 self.typeID = dogmaItem.typeID 240 else: 241 itemID = int(filter('0123456789'.__contains__, inputValue)) 242 if itemID != self.itemID or not self.typeID: 243 self.itemID = itemID 244 self.typeID = None 245 m = eveMoniker.Moniker('i2', GetLocationBindParams()) 246 if m.IsPrimed(self.itemID): 247 self.typeID = m.GetItem(self.itemID).typeID 248 nameFilter = inputValue.replace(str(self.itemID), '').lstrip().rstrip() 249 if nameFilter != self.nameFilter and (nameFilter.isalpha() or nameFilter == ''): 250 self.nameFilter = nameFilter 251 log.LogInfo('Refresh: itemID = %s, typeID = %s, nameFilter = %s' % (self.itemID, self.typeID, self.nameFilter or 'None')) 252 contentList = [] 253 if self.typeID: 254 clientValsByAttrID = self._GetClientValsByAttrID() 255 godmaValsByAttrID = self._GetGodmaValsByAttrID() 256 serverValsByAttrID = self._GetServerValsByAttrID() 257 baseValsByAttrID = self._GetBaseValsByAttrID() 258 fittingDogmaValsByAttrID = self._GetFittingDogmaValsByAttrID() 259 allMyAttribIDs = set(itertools.chain(clientValsByAttrID, godmaValsByAttrID, serverValsByAttrID, baseValsByAttrID, fittingDogmaValsByAttrID)) 260 for attrID in allMyAttribIDs: 261 attrName = self.AttrName_FromID(attrID) 262 if not self.nameFilter or self.nameFilter.lower() in attrName.lower(): 263 contentList.append(self._GetListEntryForAttr(attrID, attrName, clientValsByAttrID, godmaValsByAttrID, serverValsByAttrID, baseValsByAttrID, fittingDogmaValsByAttrID)) 264 265 self.scroll.Load(contentList=contentList, headers=['ID', 266 'Name', 267 'ClientVal', 268 'GodmaVal', 269 'ServerVal', 270 'Base', 271 'fittingDogma'], fixedEntryHeight=18) 272 self.scroll.Sort('Name') 273 274 def GetServerDogmaLM(self): 275 return self.stateManager.GetDogmaLM() 276 277 def ShowAttribute(self, attributeID, graphType = True): 278 l = locals 279 attrName = dogma_data.get_attribute_name(attributeID) 280 try: 281 godmaVal = self.stateManager.GetAttribute(self.itemID, attrName) 282 except (KeyError, RuntimeError, ZeroDivisionError): 283 sys.exc_clear() 284 godmaVal = '[None]' 285 286 if graphType == GRAPH_TYPE_FITTING_DOGMA: 287 fittingDogmaLM = sm.GetService('clientDogmaIM').GetFittingDogmaLocation() 288 descr = fittingDogmaLM.FullyDescribeAttribute(self.itemID, attributeID, 'get base value for item') 289 baseValue = descr[3].split(':')[1] 290 x = ['Godma/Server/Base values: {} {} {}'.format('-', '-', baseValue), ''] 291 extraInfo = ['Fitting dogma | client-side Graph:', ''] 292 fittingDogmaLocationGraph = fittingDogmaLM.DescribeModifierGraphForDebugWindow(self.itemID, attributeID).split('\n') 293 extraInfo += fittingDogmaLocationGraph 294 else: 295 serverValue, baseValue, extraInfo = self.GetDetailedServerValues(self.itemID, attributeID, godmaVal) 296 x = ['Godma/Server/Base values: {} {} {}'.format(godmaVal, serverValue, baseValue), ''] 297 if graphType == GRAPH_TYPE_CLIENT: 298 clientDogmaIM = sm.GetService('clientDogmaIM') 299 clientDogmaLM = clientDogmaIM.GetDogmaLocation() 300 extraInfo = ['Client-side Graph:', ''] 301 clientGraph = clientDogmaLM.DescribeModifierGraphForDebugWindow(self.itemID, attributeID).split('\n') 302 extraInfo += clientGraph 303 x += extraInfo 304 x = [ HTMLEncode(s) for s in x ] 305 title = 'Attribute Info: %s' % attrName 306 bodyText = '<br>'.join(x) 307 newWindow = AttributeDetailsWindow(caption=title, bodyText=bodyText) 308 newWindow.SetActive() 309 310 def GetDetailedServerValues(self, itemID, attributeID, godmaVal): 311 l = locals 312 sDLM = self.GetServerDogmaLM() 313 descr = sDLM.FullyDescribeAttribute(itemID, attributeID, 'Just Inspecting -- Godma Value on client was %s.' % godmaVal) 314 serverValue = descr[2].split(':')[1] 315 baseValue = descr[3].split(':')[1] 316 extraInfo = descr[4:] 317 extraInfo[0] = extraInfo[0].replace('Attribute modification graph:', 'Server-side graph:') 318 queriedValue = sDLM.QueryAttributeValue(itemID, attributeID) 319 if str(queriedValue) != serverValue: 320 LogNotice('INCONSISTENT!') 321 return (serverValue, baseValue, extraInfo)