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

redeemsvc.py (8981B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\services\redeemsvc.py
      2 import eveexceptions
      3 import localization
      4 import redeem.client
      5 import uthread
      6 from carbon.common.script.sys.service import Service
      7 from carbonui import uiconst
      8 from crates.crateutil import is_fixed_crate
      9 from eve.client.script.ui.crate.fixedcratewindow import FixedCrateWindow
     10 from eve.client.script.ui.shared.activateMultiTraining import ActivateMultiTraining
     11 from eve.client.script.ui.shared.cloneGrade import cloneStateUtil
     12 from eve.client.script.ui.shared.neocom.neocom.fixedButtonExtension import SeenItemStorage
     13 from eve.client.script.ui.shared.redeem.neocom import UnseenRedeemItemsBtnData, RedeemIconExtension
     14 from eve.client.script.ui.shared.redeem.window import GetRedeemWindow
     15 from inventorycommon import const as invconst
     16 from player_messaging.client.ui_message import prompt_player_fsd_dialog
     17 
     18 class RedeemService(Service):
     19     __guid__ = 'svc.redeem'
     20     __notifyevents__ = ['OnRedeemingQueueUpdated', 'OnSessionReset']
     21 
     22     def Run(self, *args):
     23         super(RedeemService, self).Run(*args)
     24         self.Initialize()
     25 
     26     def Initialize(self):
     27         self.tokens = None
     28         self.redeemData = redeem.get_redeem_data()
     29         self._seenTokenStorage = None
     30         self._neocomRedeemNotificationExtension = None
     31         self._extensionsInitialized = False
     32 
     33     def InitializeNeocomExtension(self):
     34         if self._extensionsInitialized is True:
     35             return
     36         self._extensionsInitialized = True
     37         self._seenTokenStorage = SeenItemStorage(get_items_function=self.GetTokenData, settings_container=settings.user.ui, settings_key='SeenTokenStorage_SeenTokens')
     38         self._neocomRedeemNotificationExtension = RedeemIconExtension(button_data_class=UnseenRedeemItemsBtnData, get_badge_count=lambda : len(self._seenTokenStorage.get_unseen()), get_item_count=self.GetRedeemTokenCount)
     39         self._neocomRedeemNotificationExtension.connect_item_changes(self._seenTokenStorage.on_items_changed)
     40         sm.GetService('neocom').RegisterFixedButtonExtension(self._neocomRedeemNotificationExtension)
     41         self.FetchRedeemTokens()
     42 
     43     def GetTokenData(self):
     44         return set(((token.tokenID, token.massTokenID) for token in self.GetRedeemTokens()))
     45 
     46     def GetRedeemTokens(self, force = False):
     47         if self.tokens is None or force:
     48             self.FetchRedeemTokens()
     49         return self.tokens
     50 
     51     def GetRedeemTokenCount(self):
     52         tokens = self.GetRedeemTokens()
     53         if tokens is None:
     54             return 0
     55         return len(tokens)
     56 
     57     def FetchRedeemTokens(self):
     58         self.tokens = sm.RemoteSvc('userSvc').GetRedeemTokens()
     59 
     60     def ReverseRedeem(self, item):
     61         if prompt_player_fsd_dialog('ConfirmReverseRedeem', {'type': (eveexceptions.UE_TYPEID, item.typeID),
     62          'quantity': item.stacksize}, uiconst.YESNO) != uiconst.ID_YES:
     63             return
     64         try:
     65             sm.RemoteSvc('userSvc').ReverseRedeem(item.itemID)
     66         finally:
     67             self.OnRedeemingQueueUpdated()
     68 
     69     def ToggleRedeemWindow(self):
     70         redeemWindow = GetRedeemWindow()
     71         redeemWindow.ToggleOpenClose(charID=session.charid, stationID=session.stationid or session.structureid, redeemData=self.redeemData)
     72 
     73     def OpenRedeemWindow(self):
     74         redeemWindow = GetRedeemWindow()
     75         wnd = redeemWindow.GetIfOpen()
     76         if wnd is None:
     77             wnd = redeemWindow.Open(charID=session.charid, stationID=session.stationid or session.structureid, useDefaultPos=True, redeemData=self.redeemData)
     78             wnd.left -= 160
     79         if wnd is not None and not wnd.destroyed:
     80             wnd.Maximize()
     81 
     82     def CloseRedeemWindow(self):
     83         redeemWindow = GetRedeemWindow()
     84         redeemWindow.CloseIfOpen()
     85 
     86     def ClaimRedeemTokens(self, tokens, charID, useHomeStation = False):
     87         redeemInfo = None
     88         tokens = self._HandleMctTokens(tokens, charID, useHomeStation=useHomeStation)
     89         try:
     90             redeemInfo = sm.RemoteSvc('userSvc').ClaimRedeemTokens(tokens, charID, useHomeStation=useHomeStation)
     91         except eveexceptions.UserError as e:
     92             prompt_player_fsd_dialog(e.msg, e.dict)
     93         except RuntimeError:
     94             self.OnRedeemingQueueUpdated()
     95             raise
     96         else:
     97             if self._ShouldOfferOpenFixedCrates(redeemInfo):
     98                 self._OfferOpenFixedLootCrates(redeemInfo)
     99             elif not session.charid:
    100                 uthread.new(redeem.client.ShowFulfillmentReport, redeemInfo)
    101 
    102         if redeemInfo['errors']:
    103             displayed = set()
    104             for tokenID, error in redeemInfo['errors']:
    105                 if error.dict:
    106                     typeID = error.dict.get('itemTypeID')
    107                     if (error.msg, typeID) not in displayed:
    108                         displayed.add((error.msg, typeID))
    109                         prompt_player_fsd_dialog(error.msg, error.dict)
    110                 elif error.msg not in displayed:
    111                     displayed.add(error.msg)
    112                     prompt_player_fsd_dialog(error.msg)
    113 
    114         self.OnRedeemingQueueUpdated()
    115         numItemsCreated = len(redeemInfo.get('itemsCreated', [])) if redeemInfo else 0
    116         stationID = redeemInfo.get('stationID', None)
    117         self.NotifyOfTokensRedeemed(charID, stationID, tokens, numItemsCreated)
    118         return redeemInfo
    119 
    120     def NotifyOfTokensRedeemed(self, characterID, stationID, tokens, numItemsCreated):
    121         sm.ScatterEvent('OnTokensRedeemed', characterID, stationID, tokens, numItemsCreated)
    122 
    123     def _ShouldOfferOpenFixedCrates(self, redeemInfo):
    124         if not session.charid:
    125             return False
    126         return redeemInfo['stationID'] in (session.stationid, session.structureid)
    127 
    128     def _OfferOpenFixedLootCrates(self, redeemInfo):
    129         cratesToOpen = []
    130         for itemData in redeemInfo['itemsCreated']:
    131             itemID = itemData['itemID']
    132             typeID = itemData['typeID']
    133             quantity = itemData['quantity']
    134             if is_fixed_crate(typeID):
    135                 cratesToOpen.append((typeID, itemID, quantity))
    136 
    137         if cratesToOpen:
    138             FixedCrateWindow(crate_stack_list=cratesToOpen)
    139 
    140     def TrashRedeemTokens(self, tokens):
    141         sm.RemoteSvc('userSvc').TrashRedeemTokens(tokens)
    142         self.OnRedeemingQueueUpdated()
    143 
    144     def OnRedeemingQueueUpdated(self):
    145         self.FetchRedeemTokens()
    146         if self._seenTokenStorage:
    147             self._seenTokenStorage.update_unseen_count()
    148         if self._neocomRedeemNotificationExtension:
    149             self._neocomRedeemNotificationExtension.on_items_changed()
    150         sm.ScatterEvent('OnRedeemingTokensUpdated')
    151 
    152     def OnSessionReset(self):
    153         if self._neocomRedeemNotificationExtension:
    154             self._neocomRedeemNotificationExtension.disconnect_item_changes(self._seenTokenStorage.on_items_changed)
    155         self.Initialize()
    156 
    157     def GetTokenLabel(self, token):
    158         if token.label:
    159             return self._GetMessageOrLabel(token.label)
    160         return ''
    161 
    162     def GetTokenDescription(self, token):
    163         if token.description:
    164             return self._GetMessageOrLabel(token.description)
    165         return ''
    166 
    167     def _GetMessageOrLabel(self, text):
    168         try:
    169             messageID = int(text)
    170             if localization.IsValidMessageID(messageID):
    171                 return localization.GetByMessageID(messageID)
    172         except ValueError:
    173             if localization.IsValidLabel(text):
    174                 return localization.GetByLabel(text)
    175 
    176         return text
    177 
    178     def _HandleMctTokens(self, tokens, charID, useHomeStation = False):
    179         mctTokens = [ (token['tokenID'], token['massTokenID']) for token in tokens if token['typeID'] == invconst.typeSoulboundMultiTrainingToken ]
    180         tokens = [ (token['tokenID'], token['massTokenID']) for token in tokens if token['typeID'] != invconst.typeSoulboundMultiTrainingToken ]
    181         if mctTokens:
    182             if cloneStateUtil.IsOmega():
    183                 ActivateMultiTraining(tokens=mctTokens, charId=charID, useHomeStation=useHomeStation)
    184             else:
    185                 prompt_player_fsd_dialog('CustomInfo', {'info': localization.GetByLabel('UI/CloneState/RequiresOmegaClone')})
    186         return tokens
    187 
    188     def MarkAllTokensSeen(self):
    189         if self._seenTokenStorage:
    190             self._seenTokenStorage.mark_all_seen()
    191 
    192     def HasUnseenTokens(self):
    193         if self._seenTokenStorage:
    194             return bool(self._seenTokenStorage.unseen_count)
    195         return False
    196 
    197     def GetUnseenTokensCount(self):
    198         if self._seenTokenStorage:
    199             return self._seenTokenStorage.unseen_count or 0
    200         return 0
    201 
    202     def GetTypeIDAndStackSize(self, tokenID, massTokenID):
    203         for token in self.tokens:
    204             if token.tokenID == tokenID or token.massTokenID == massTokenID:
    205                 return (token.typeID, token.quantity)
    206 
    207         return (None, None)
    208 
    209     def ResetCache(self):
    210         self.tokens = None