diff --git a/gui/characterEditor.py b/gui/characterEditor.py index 8006fa56a..00963f6c9 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -657,14 +657,19 @@ class APIView(wx.Panel): def fetchSkills(self, event): charName = self.charChoice.GetString(self.charChoice.GetSelection()) if charName: - try: - sChar = Character.getInstance() - activeChar = self.charEditor.entityEditor.getActiveEntity() - sChar.apiFetch(activeChar.ID, charName) - self.stStatus.SetLabel("Successfully fetched %s\'s skills from EVE API." % charName) - except Exception, e: - pyfalog.error("Unable to retrieve {0}\'s skills. Error message:\n{1}", charName, e) - self.stStatus.SetLabel("Unable to retrieve %s\'s skills. Error message:\n%s" % (charName, e)) + sChar = Character.getInstance() + activeChar = self.charEditor.entityEditor.getActiveEntity() + sChar.apiFetch(activeChar.ID, charName, self.__fetchCallback) + self.stStatus.SetLabel("Getting skills for {}".format(charName)) + + def __fetchCallback(self, e=None): + charName = self.charChoice.GetString(self.charChoice.GetSelection()) + if e is None: + self.stStatus.SetLabel("Successfully fetched {}\'s skills from EVE API.".format(charName)) + else: + exc_type, exc_obj, exc_trace = e + pyfalog.error("Unable to retrieve {0}\'s skills. Error message:\n{1}".format(charName, exc_obj)) + self.stStatus.SetLabel("Unable to retrieve {}\'s skills. Error message:\n{}".format(charName, exc_obj)) class SaveCharacterAs(wx.Dialog): diff --git a/gui/characterSelection.py b/gui/characterSelection.py index 4b6fddc73..6faead513 100644 --- a/gui/characterSelection.py +++ b/gui/characterSelection.py @@ -25,6 +25,7 @@ import gui.mainFrame from service.character import Character from service.fit import Fit from logbook import Logger + pyfalog = Logger(__name__) @@ -109,16 +110,24 @@ class CharacterSelection(wx.Panel): event.Skip() def refreshApi(self, event): + self.btnRefresh.Enable(False) sChar = Character.getInstance() ID, key, charName, chars = sChar.getApiDetails(self.getActiveCharacter()) if charName: - try: - sChar.apiFetch(self.getActiveCharacter(), charName) - except Exception as e: - # can we do a popup, notifying user of API error? - pyfalog.error("API fetch error") - pyfalog.error(e) - self.refreshCharacterList() + sChar.apiFetch(self.getActiveCharacter(), charName, self.refreshAPICallback) + + def refreshAPICallback(self, e=None): + self.btnRefresh.Enable(True) + if e is None: + self.refreshCharacterList() + else: + exc_type, exc_obj, exc_trace = e + pyfalog.warn("Error fetching API information for character") + pyfalog.warn(exc_obj) + + wx.MessageBox( + "Error fetching API information, please check your API details in the character editor and try again later", + "Error", wx.ICON_ERROR | wx.STAY_ON_TOP) def charChanged(self, event): fitID = self.mainFrame.getActiveFit() diff --git a/service/character.py b/service/character.py index 1e5185b69..717a33dc2 100644 --- a/service/character.py +++ b/service/character.py @@ -17,9 +17,11 @@ # along with pyfa. If not, see . # ============================================================================= +import sys import copy import itertools import json + from logbook import Logger import threading from codecs import open @@ -350,26 +352,13 @@ class Character(object): char.chars = json.dumps(charList) return charList - @staticmethod - def apiFetch(charID, charName): - dbChar = eos.db.getCharacter(charID) - dbChar.defaultChar = charName + def apiFetch(self, charID, charName, callback): + thread = UpdateAPIThread(charID, charName, (self.apiFetchCallback, callback)) + thread.start() - api = EVEAPIConnection() - auth = api.auth(keyID=dbChar.apiID, vCode=dbChar.apiKey) - apiResult = auth.account.Characters() - charID = None - for char in apiResult.characters: - if char.name == charName: - charID = char.characterID - - if charID is None: - return - - sheet = auth.character(charID).CharacterSheet() - - dbChar.apiUpdateCharSheet(sheet.skills) + def apiFetchCallback(self, guiCallback, e=None): eos.db.commit() + wx.CallAfter(guiCallback, e) @staticmethod def apiUpdateCharSheet(charID, skills): @@ -458,3 +447,37 @@ class Character(object): self._checkRequirements(fit, char, req, subs) return reqs + + +class UpdateAPIThread(threading.Thread): + def __init__(self, charID, charName, callback): + threading.Thread.__init__(self) + + self.name = "CheckUpdate" + self.callback = callback + self.charID = charID + self.charName = charName + + def run(self): + print "in thread" + try: + dbChar = eos.db.getCharacter(self.charID) + dbChar.defaultChar = self.charName + + api = EVEAPIConnection() + auth = api.auth(keyID=dbChar.apiID, vCode=dbChar.apiKey) + apiResult = auth.account.Characters() + charID = None + for char in apiResult.characters: + if char.name == self.charName: + charID = char.characterID + + if charID is None: + return + + sheet = auth.character(charID).CharacterSheet() + + dbChar.apiUpdateCharSheet(sheet.skills) + self.callback[0](self.callback[1]) + except Exception: + self.callback[0](self.callback[1], sys.exc_info())