diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index 3013ffd7a..f890ae0ed 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -205,11 +205,14 @@ class HandledImplantBoosterList(HandledList): HandledList.append(self, thing) -class HandledSsoCharacterList(HandledList): +class HandledSsoCharacterList(list): def append(self, character): - for x in self: - print(x) - HandledList.append(self, character) + old = next((x for x in self if x.client == character.client), None) + if old is not None: + pyfalog.warning("Removing SSO Character with same hash: {}".format(repr(old))) + list.remove(self, old) + + list.append(self, character) class HandledProjectedModList(HandledList): diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 77551a5ed..05ff456fa 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -163,6 +163,18 @@ class Character(object): def name(self, name): self.savedName = name + def setSsoCharacter(self, character, clientHash): + if character is not None: + self.__ssoCharacters.append(character) + else: + for x in self.__ssoCharacters: + if x.client == clientHash: + self.__ssoCharacters.remove(x) + + + def getSsoCharacter(self, clientHash): + return next((x for x in self.__ssoCharacters if x.client == clientHash), None) + @property def alphaCloneID(self): return self.__alphaCloneID diff --git a/eos/saveddata/ssocharacter.py b/eos/saveddata/ssocharacter.py index db15442d0..9ffed8d46 100644 --- a/eos/saveddata/ssocharacter.py +++ b/eos/saveddata/ssocharacter.py @@ -49,3 +49,9 @@ class SsoCharacter(object): self.accessTokenExpires - datetime.datetime.utcnow() ).total_seconds() } + + + def __repr__(self): + return "SsoCharacter(ID={}, name={}, client={}) at {}".format( + self.ID, self.characterName, self.client, hex(id(self)) + ) diff --git a/gui/characterEditor.py b/gui/characterEditor.py index ae75c11b1..dcb14bfb3 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -33,6 +33,7 @@ from gui.builtinViews.implantEditor import BaseImplantEditorView from gui.builtinViews.entityEditor import EntityEditor, BaseValidator, TextEntryValidatedDialog from service.fit import Fit from service.character import Character +from service.esi import Esi from service.network import AuthenticationError, TimeoutError from service.market import Market from logbook import Logger @@ -174,7 +175,7 @@ class CharacterEditor(wx.Frame): self.viewsNBContainer.AddPage(self.sview, "Skills") self.viewsNBContainer.AddPage(self.iview, "Implants") - self.viewsNBContainer.AddPage(self.aview, "API") + self.viewsNBContainer.AddPage(self.aview, "EVE SSO") mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5) @@ -746,7 +747,6 @@ class APIView(wx.Panel): fgSizerInput.Add(self.m_staticCharText, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 5) self.charChoice = wx.Choice(self, wx.ID_ANY, style=0) - self.charChoice.Append("No Selection", 0) fgSizerInput.Add(self.charChoice, 1, wx.ALL | wx.EXPAND, 5) pmainSizer.Add(fgSizerInput, 0, wx.EXPAND, 5) @@ -759,28 +759,51 @@ class APIView(wx.Panel): self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) + self.charChoice.Bind(wx.EVT_CHOICE, self.ssoCharChanged) + self.SetSizer(pmainSizer) self.Layout() self.charChanged(None) - def charChanged(self, event): + def ssoCharChanged(self, event): sChar = Character.getInstance() activeChar = self.charEditor.entityEditor.getActiveEntity() + sChar.setSsoCharacter(activeChar.ID, self.getActiveCharacter()) + event.Skip() - ID, key, char, chars = sChar.getApiDetails(activeChar.ID) + def getActiveCharacter(self): + selection = self.charChoice.GetCurrentSelection() + return self.charChoice.GetClientData(selection) if selection is not -1 else None + + def charChanged(self, event): + sChar = Character.getInstance() + sEsi = Esi.getInstance() + + activeChar = self.charEditor.entityEditor.getActiveEntity() + sso = sChar.getSsoCharacter(activeChar.ID) + + ssoChars = sEsi.getSsoCharacters() self.charChoice.Clear() - if chars: - for charName in chars: - self.charChoice.Append(charName) - self.charChoice.SetStringSelection(char) - self.charChoice.Enable(True) - else: - self.charChoice.Append("No characters...", 0) - self.charChoice.SetSelection(0) - self.charChoice.Enable(False) + noneID = self.charChoice.Append("None", None) + for char in ssoChars: + currId = self.charChoice.Append(char.characterName, char.ID) + + if sso is not None and char.ID == sso.ID: + self.charChoice.SetSelection(currId) + if sso is None: + self.charChoice.SetSelection(noneID) + # + # if chars: + # for charName in chars: + # self.charChoice.Append(charName) + # self.charChoice.SetStringSelection(char) + # else: + # self.charChoice.Append("No characters...", 0) + # self.charChoice.SetSelection(0) + # if activeChar.name in ("All 0", "All 5"): self.Enable(False) self.stDisabledTip.Show() diff --git a/service/character.py b/service/character.py index ce5246489..6e5b07a0c 100644 --- a/service/character.py +++ b/service/character.py @@ -347,6 +347,22 @@ class Character(object): chars = None return char.apiID or "", char.apiKey or "", char.defaultChar or "", chars or [] + @staticmethod + def getSsoCharacter(charID): + char = eos.db.getCharacter(charID) + sso = char.getSsoCharacter(config.getClientSecret()) + return sso + + @staticmethod + def setSsoCharacter(charID, ssoCharID): + char = eos.db.getCharacter(charID) + if ssoCharID is not None: + sso = eos.db.getSsoCharacter(ssoCharID, config.getClientSecret()) + char.setSsoCharacter(sso, config.getClientSecret()) + else: + char.setSsoCharacter(None, config.getClientSecret()) + eos.db.commit() + def apiFetch(self, charID, callback): thread = UpdateAPIThread(charID, (self.apiFetchCallback, callback)) thread.start()