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

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)