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