enlistCont.py (14021B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\factionalWarfare\enlistmentFlow\enlistCont.py 2 import uthread2 3 from carbonui import TextAlign 4 from carbonui.text.styles import TextBody 5 from carbonui.button.group import ButtonGroup, ButtonSizeMode 6 from carbonui.control.button import Button 7 from carbonui.primitives.containerAutoSize import ContainerAutoSize 8 import carbonui.const as uiconst 9 from carbonui.primitives.sprite import Sprite 10 import eve.client.script.ui.shared.factionalWarfare.enlistmentFlow.enlistmentUtil as enlistmentUtil 11 from eve.client.script.ui import eveColor 12 from eve.client.script.ui.control.infoIcon import MoreInfoIconBeta 13 from eve.client.script.ui.shared.theatersOfWar.util import open_fw_window 14 from eve.common.script.sys import idCheckers 15 from eve.common.script.sys.idCheckers import IsPlayerCorporation 16 from eve.common.script.util.facwarCommon import IsPirateFWFaction 17 from factionwarfare.client.enlistmentChecks import EnlistmentChecksObject 18 from jobboard.client import get_fw_enlistment_job, job_board_signals 19 from localization import GetByLabel 20 import eve.common.lib.appConst as appConst 21 import factionwarfare.client.enrollmentConst as enrollmentConst 22 23 class EnlistCont(ContainerAutoSize): 24 default_name = 'enlistCont' 25 default_align = uiconst.TOBOTTOM 26 default_alignMode = uiconst.TOTOP 27 default_minHeight = 130 28 __notifyevents__ = ['OnSessionChanged', 'OnEnlistmentStateUpdated_Local'] 29 30 def ApplyAttributes(self, attributes): 31 super(EnlistCont, self).ApplyAttributes(attributes) 32 self.factionID = None 33 self.currentLoadingID = 0 34 self.warningChecks = EnlistmentChecksObject() 35 self.facWarSvc = sm.GetService('facwar') 36 self.warningsCont = ContainerAutoSize(name='warningsCont', parent=self, align=uiconst.TOTOP, padBottom=10) 37 self.btnCont = ContainerAutoSize(name='btnCont', parent=self, align=uiconst.TOTOP) 38 self.enlistBtns = ButtonGroup(parent=self.btnCont, align=uiconst.CENTERTOP, orientation=uiconst.Axis.VERTICAL, button_size_mode=ButtonSizeMode.EQUAL, padLeft=20, padRight=20) 39 sm.RegisterNotify(self) 40 job_board_signals.on_tracked_jobs_changed.connect(self.OnTrackedJobsChanged) 41 42 def Close(self): 43 job_board_signals.on_tracked_jobs_changed.disconnect(self.OnTrackedJobsChanged) 44 super(EnlistCont, self).Close() 45 46 def LoadEnlist(self, factionID): 47 loadingID = self.currentLoadingID + 1 48 self.currentLoadingID = loadingID 49 self.warningsCont.Flush() 50 self.enlistBtns.Flush() 51 self.factionID = factionID 52 warningsToAdd = [] 53 btnsToAdd = [] 54 if session.warfactionid: 55 if session.warfactionid != self.factionID: 56 warningsToAdd = self._GetWarningsToLoad() 57 btnsToAdd += self._GetAlreadyListedBtns() 58 else: 59 warningsToAdd = self._GetWarningsToLoad() 60 btnsToAdd += self._GetNotEnlistedBtns() 61 if self.currentLoadingID != loadingID: 62 return 63 for warningID in warningsToAdd: 64 self._AddWarning(warningID) 65 66 for btnData in btnsToAdd: 67 self._AddButton(btnData) 68 69 def _GetAlreadyListedBtns(self): 70 btnsToAdd = [] 71 inThisFaction = session.warfactionid and session.warfactionid == self.factionID 72 if inThisFaction: 73 btnsToAdd += self._GetRetireBtns() 74 elif self.factionID in self.facWarSvc.GetCurrentStationFactionIDs(): 75 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Enlistment/JoinNow', None, True)) 76 else: 77 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Enlistment/InitiateEnlistment', self.InitiateEnlistment, True)) 78 return btnsToAdd 79 80 def _GetRetireBtns(self): 81 btnsToAdd = [] 82 if idCheckers.IsNPC(session.corpid) and session.warfactionid: 83 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Retire', enlistmentUtil.Retire)) 84 elif sm.GetService('fwEnlistmentSvc').IsEnlistedDirectly(): 85 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/Retire', enlistmentUtil.RemoveDirectEnlistment)) 86 else: 87 hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector 88 if hasReqCorporationRole: 89 factionalWarStatus = self.facWarSvc.GetCorpFactionalWarStatus() 90 fwStatus = factionalWarStatus.status 91 if fwStatus == appConst.facwarCorporationActive: 92 if session.allianceid: 93 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/RetireAlliance', enlistmentUtil.RetireAlliance)) 94 else: 95 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/RetireCorporation', enlistmentUtil.RetireCorp)) 96 elif fwStatus == appConst.facwarCorporationLeaving: 97 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/CancelRetirement', enlistmentUtil.CancelRetirement)) 98 return btnsToAdd 99 100 def _AddButton(self, btnData): 101 102 def CallFuncAndReload(*args): 103 btnData.func() 104 self.LoadEnlist(self.factionID) 105 106 b = Button(parent=self.enlistBtns, align=uiconst.TOTOP, label=GetByLabel(btnData.labelPath), func=CallFuncAndReload, hint=btnData.hint) 107 if btnData.isDisabled: 108 b.Disable() 109 return b 110 111 def _GetNotEnlistedBtns(self): 112 btnsToAdd = [] 113 if self.warningChecks.HasCorpApplicationPendingWithFactionWarning(self.factionID): 114 hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector 115 if hasReqCorporationRole: 116 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/WithdrawApplication', self.CancelApplication)) 117 elif self.warningChecks.HasCorpApplicationPendingWithDifferentFactionWarning(self.factionID): 118 pass 119 elif not self.warningChecks.HasWrongLocationWarning(self.factionID): 120 btnsToAdd += self._AddEnlistButtons() 121 else: 122 btnsToAdd += self._AddInitiateEnlistmentBtn() 123 return btnsToAdd 124 125 def JoinMilitia(self, *args): 126 uthread2.StartTasklet(self.JoinMilitia_thread) 127 128 def JoinMilitia_thread(self, *args): 129 warFactionnIdBefore = session.warfactionid 130 self.facWarSvc.JoinFactionAsCharacter(self.factionID, session.warfactionid) 131 if not warFactionnIdBefore: 132 for x in xrange(3): 133 if session.warfactionid: 134 if IsPirateFWFaction(session.warfactionid): 135 sm.GetService('cmd').OpenInsurgencyDashboard() 136 else: 137 open_fw_window(faction_id=session.warfactionid) 138 break 139 uthread2.sleep(1) 140 141 def EnlistDirectly(self, *args): 142 warFactionIdBefore = session.warfactionid 143 sm.GetService('fwEnlistmentSvc').OnEnlistMeDirectly(self.factionID) 144 if not warFactionIdBefore and session.warfactionid: 145 if IsPirateFWFaction(session.warfactionid): 146 sm.GetService('cmd').OpenInsurgencyDashboard() 147 else: 148 open_fw_window(faction_id=session.warfactionid) 149 150 def _AddEnlistButtons(self): 151 hasReqCorporationRole = session.corprole & appConst.corpRoleDirector == appConst.corpRoleDirector 152 hasReqAllianceRole = hasReqCorporationRole and session.allianceid and sm.GetService('alliance').GetAlliance().executorCorpID == session.corpid 153 characterBtnDisabled = self.IsButtonDisabled() 154 charEnlistmentFunc = self.JoinMilitia 155 if IsPlayerCorporation(session.corpid): 156 charEnlistmentFunc = self.EnlistDirectly 157 characterBtnDisabled = characterBtnDisabled or bool(self.warningChecks.HasDisallowedByCorpWarning(self.factionID)) 158 btnsToAdd = [] 159 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistMe', charEnlistmentFunc, characterBtnDisabled)) 160 if hasReqCorporationRole: 161 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistCorporation', lambda *args: self.facWarSvc.JoinFactionAsCorporation(self.factionID, session.warfactionid), not hasReqCorporationRole)) 162 if hasReqAllianceRole: 163 btnsToAdd.append(BtnToAddData('UI/FactionWarfare/EnlistAlliance', lambda *args: self.facWarSvc.JoinFactionAsAlliance(self.factionID, session.warfactionid), not hasReqAllianceRole)) 164 return btnsToAdd 165 166 def _AddInitiateEnlistmentBtn(self): 167 job = get_fw_enlistment_job(self.factionID) 168 if job and job.is_tracked: 169 buttonDisabled = True 170 else: 171 buttonDisabled = self.IsButtonDisabled() 172 btnData = BtnToAddData('UI/FactionWarfare/Enlistment/InitiateEnlistment', self.InitiateEnlistment, buttonDisabled) 173 jumpsToNearestStation, nearestStationID = self.facWarSvc.GetNearestFactionWarfareStationData(preferredFaction=self.factionID) 174 if nearestStationID and session.stationid != nearestStationID: 175 stationAndJumps = GetByLabel('UI/Corporations/CorpUIHome/StationAndJumps', station=nearestStationID, jumpCount=jumpsToNearestStation, jumps=jumpsToNearestStation) 176 hint = '%s<br>%s' % (GetByLabel('UI/Agency/FactionWarfare/nearestMilitiaOffice'), stationAndJumps) 177 btnData.hint = hint 178 return [btnData] 179 180 def IsButtonDisabled(self): 181 buttonDisabled = self.warningChecks.HasAlreadyInFwWarning(self.factionID) or self.warningChecks.HasDisallowedByCorpWarning(self.factionID) or self.warningChecks.HasStandingWarning(self.factionID) or self.warningChecks.HasCooldownWarning(self.factionID) 182 return buttonDisabled 183 184 def LoadCharBtnTooltip(self, tooltipPanel, factionID, *args): 185 tooltipPanel.state = uiconst.UI_NORMAL 186 factionName = cfg.eveowners.Get(factionID).name 187 linkUrl = '<a href=localsvc:method=ShowCorpDetails>' 188 characterHint = GetByLabel('UI/FactionWarfare/CorpRestrictionsPreventDirectEnrollment', factionName=factionName, urlStart=linkUrl, urlEnd='</a>') 189 tooltipPanel.LoadGeneric1ColumnTemplate() 190 tooltipPanel.AddLabelMedium(text=characterHint, wrapWidth=200, state=uiconst.UI_NORMAL) 191 192 def CancelApplication(self, *args): 193 enlistmentUtil.CancelApplication() 194 195 def InitiateEnlistment(self, *args): 196 job = get_fw_enlistment_job(self.factionID) 197 if job is None: 198 raise UserError('CustomNotify', {'notify': "Couldn't find the job to start"}) 199 if not job.is_tracked: 200 job.toggle_tracked_by_player() 201 else: 202 job.add_tracked() 203 204 def _GetWarningsToLoad(self): 205 warningsToAdd = [] 206 warningChecks = self.warningChecks 207 if warningChecks.HasCorpApplicationPendingWithFactionWarning(self.factionID): 208 warningsToAdd.append(enrollmentConst.WARNING_PENDING_SAME_FACTION) 209 elif warningChecks.HasCorpApplicationPendingWithDifferentFactionWarning(self.factionID): 210 warningsToAdd.append(enrollmentConst.WARNING_PENDING_ANOTHER_FACTION) 211 else: 212 if warningChecks.HasAlreadyInFwWarning(self.factionID): 213 warningsToAdd.append(enrollmentConst.WARNING_ALREADY_IN_FW) 214 if warningChecks.HasDisallowedByCorpWarning(self.factionID): 215 warningsToAdd.append(enrollmentConst.WARNING_DISALLOWED_BY_CORP) 216 if warningChecks.HasStandingWarning(self.factionID): 217 warningsToAdd.append(enrollmentConst.WARNING_PENDING_STANDING) 218 if warningChecks.HasTrackingThisFactionWarning(self.factionID) and warningChecks.HasWrongLocationWarning(self.factionID): 219 warningsToAdd.append(enrollmentConst.WARNING_TRACKING_SAME_FACTION) 220 if warningChecks.HasTrackingAnotherFactionWarning(self.factionID): 221 warningsToAdd.append(enrollmentConst.WARNING_TRACKING_ANOTHER_FACTION) 222 if warningChecks.HasWrongLocationWarning(self.factionID): 223 warningsToAdd.append(enrollmentConst.WARNING_PENDING_WRONG_LOCATION) 224 if warningChecks.HasCooldownWarning(self.factionID): 225 warningsToAdd.append(enrollmentConst.WARNING_DIRECT_ENLISTMENT_COOLDOWN) 226 return warningsToAdd 227 228 def _AddWarning(self, warningValue): 229 warningCont = ContainerAutoSize(parent=self.warningsCont, align=uiconst.TOTOP, alignMode=uiconst.CENTERTOP, minHeight=16, state=uiconst.UI_NORMAL, padTop=6) 230 innerWarningCont = ContainerAutoSize(parent=warningCont, align=uiconst.CENTERTOP, alignMode=uiconst.TOPLEFT, state=uiconst.UI_NORMAL) 231 icon = MoreInfoIconBeta(parent=innerWarningCont, align=uiconst.CENTERLEFT, circleColor=eveColor.WARNING_ORANGE, questionMarkTexturePath='res:/UI/Texture/Classes/Enlistment/attention.png', state=uiconst.UI_DISABLED) 232 text = enlistmentUtil.GetTextForWarning(warningValue) 233 TextBody(text=text, parent=innerWarningCont, align=uiconst.TOPLEFT, left=20, color=eveColor.WARNING_ORANGE, maxWidth=200) 234 innerWarningCont.GetHint = lambda *args: self.GetWarningHint(warningValue) 235 236 def GetWarningHint(self, warningValue): 237 if warningValue == enrollmentConst.WARNING_PENDING_STANDING: 238 if IsPirateFWFaction(self.factionID): 239 return GetByLabel('UI/FactionWarfare/Enlistment/WarningStandingPiratesLong') 240 return enlistmentUtil.GetHintForWarning(warningValue) 241 242 def OnSessionChanged(self, _isremote, _session, change): 243 if 'stationid' in change: 244 self.LoadEnlist(self.factionID) 245 246 def OnTrackedJobsChanged(self, *args): 247 self.LoadEnlist(self.factionID) 248 249 def OnEnlistmentStateUpdated_Local(self, *args): 250 self.LoadEnlist(self.factionID) 251 252 253 class BtnToAddData(object): 254 255 def __init__(self, labelPath, func, isDisabled = False, hint = ''): 256 self.labelPath = labelPath 257 self.func = func 258 self.isDisabled = isDisabled 259 self.hint = hint