diff --git a/config.py b/config.py index 97456447d..a09bc30c9 100644 --- a/config.py +++ b/config.py @@ -24,8 +24,6 @@ expansionName = "Vanguard" expansionVersion = "1.0" evemonMinVersion = "4081" -clientID = 'af87365240d644f7950af563b8418bad' - pyfaPath = None savePath = None saveDB = None diff --git a/gui/builtinPreferenceViews/pyfaCrestPreferences.py b/gui/builtinPreferenceViews/pyfaCrestPreferences.py index e06e04f7f..1cd5b05ba 100644 --- a/gui/builtinPreferenceViews/pyfaCrestPreferences.py +++ b/gui/builtinPreferenceViews/pyfaCrestPreferences.py @@ -5,6 +5,7 @@ from gui.bitmapLoader import BitmapLoader import gui.mainFrame import service +from service.crest import CrestModes class PFCrestPref ( PreferenceView): title = "CREST" @@ -30,24 +31,28 @@ class PFCrestPref ( PreferenceView): self.stInfo.Wrap(dlgWidth - 50) mainSizer.Add( self.stInfo, 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5 ) - self.grantRadioBtn1 = wx.RadioButton( panel, wx.ID_ANY, u"Implicit Grant", wx.DefaultPosition, wx.DefaultSize, 0 ) - mainSizer.Add( self.grantRadioBtn1, 0, wx.ALL, 5 ) + rbSizer = wx.BoxSizer(wx.HORIZONTAL) + self.rbMode = wx.RadioBox(panel, -1, "Mode", wx.DefaultPosition, wx.DefaultSize, ['Implicit', 'User-supplied details'], 1, wx.RA_SPECIFY_COLS) + self.rbServer = wx.RadioBox(panel, -1, "Server", wx.DefaultPosition, wx.DefaultSize, ['Tranquility', 'Singularity'], 1, wx.RA_SPECIFY_COLS) - self.grantRadioBtn2 = wx.RadioButton( panel, wx.ID_ANY, u"User-supplied details", wx.DefaultPosition, wx.DefaultSize, 0 ) - mainSizer.Add( self.grantRadioBtn2, 0, wx.ALL, 5 ) + self.rbMode.SetSelection(self.settings.get('mode')) + self.rbServer.SetSelection(self.settings.get('server')) - proxyTitle = wx.StaticText( panel, wx.ID_ANY, "CREST client details", wx.DefaultPosition, wx.DefaultSize, 0 ) - proxyTitle.Wrap( -1 ) - proxyTitle.SetFont( wx.Font( 12, 70, 90, 90, False, wx.EmptyString ) ) + rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5 ) + rbSizer.Add(self.rbServer, 1, wx.ALL, 5 ) - mainSizer.Add( proxyTitle, 0, wx.ALL, 5 ) + self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange) + self.rbServer.Bind(wx.EVT_RADIOBOX, self.OnServerChange) + + mainSizer.Add(rbSizer, 1, wx.ALL|wx.EXPAND, 0) + + detailsTitle = wx.StaticText( panel, wx.ID_ANY, "CREST client details", wx.DefaultPosition, wx.DefaultSize, 0 ) + detailsTitle.Wrap( -1 ) + detailsTitle.SetFont( wx.Font( 12, 70, 90, 90, False, wx.EmptyString ) ) + + mainSizer.Add( detailsTitle, 0, wx.ALL, 5 ) mainSizer.Add( wx.StaticLine( panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND, 5 ) - self.grantRadioBtn1.SetValue(self.settings.get('mode') == 0) - self.grantRadioBtn2.SetValue(self.settings.get('mode') == 1) - - self.grantRadioBtn1.Bind(wx.EVT_RADIOBUTTON, self.OnRadioChange) - self.grantRadioBtn2.Bind(wx.EVT_RADIOBUTTON, self.OnRadioChange) fgAddrSizer = wx.FlexGridSizer( 2, 2, 0, 0 ) fgAddrSizer.AddGrowableCol( 1 ) @@ -82,9 +87,14 @@ class PFCrestPref ( PreferenceView): panel.SetSizer( mainSizer ) panel.Layout() - def OnRadioChange(self, event): - self.settings.set('mode', 0 if self.grantRadioBtn1.Value else 1) + def OnModeChange(self, event): + self.settings.set('mode', event.GetInt()) self.ToggleProxySettings(self.settings.get('mode')) + service.Crest.restartService() + + def OnServerChange(self, event): + self.settings.set('server', event.GetInt()) + service.Crest.restartService() def OnBtnApply(self, event): self.settings.set('clientID', self.inputClientID.GetValue()) diff --git a/gui/crestFittings.py b/gui/crestFittings.py index 4ddfe4580..c4a342f62 100644 --- a/gui/crestFittings.py +++ b/gui/crestFittings.py @@ -7,6 +7,7 @@ from wx.lib.pubsub import setupkwargs from wx.lib.pubsub import pub import service +from service.crest import CrestModes import gui.display as d from eos.types import Cargo from eos.db import getItem @@ -24,7 +25,7 @@ class CrestFittings(wx.Frame): characterSelectSizer = wx.BoxSizer( wx.HORIZONTAL ) - if sCrest.settings.get('mode') == 0: + if sCrest.settings.get('mode') == CrestModes.IMPLICIT: self.stLogged = wx.StaticText(self, wx.ID_ANY, "Currently logged in as %s"%sCrest.implicitCharacter.name, wx.DefaultPosition, wx.DefaultSize) self.stLogged.Wrap( -1 ) @@ -107,7 +108,7 @@ class CrestFittings(wx.Frame): def getActiveCharacter(self): sCrest = service.Crest.getInstance() - if sCrest.settings.get('mode') == 0: + if sCrest.settings.get('mode') == CrestModes.IMPLICIT: return sCrest.implicitCharacter.ID selection = self.charChoice.GetCurrentSelection() @@ -159,7 +160,7 @@ class ExportToEve(wx.Frame): mainSizer = wx.BoxSizer(wx.VERTICAL) hSizer = wx.BoxSizer(wx.HORIZONTAL) - if sCrest.settings.get('mode') == 0: + if sCrest.settings.get('mode') == CrestModes.IMPLICIT: self.stLogged = wx.StaticText(self, wx.ID_ANY, "Currently logged in as %s"%sCrest.implicitCharacter.name, wx.DefaultPosition, wx.DefaultSize) self.stLogged.Wrap( -1 ) @@ -207,7 +208,7 @@ class ExportToEve(wx.Frame): def getActiveCharacter(self): sCrest = service.Crest.getInstance() - if sCrest.settings.get('mode') == 0: + if sCrest.settings.get('mode') == CrestModes.IMPLICIT: return sCrest.implicitCharacter.ID selection = self.charChoice.GetCurrentSelection() diff --git a/gui/mainFrame.py b/gui/mainFrame.py index f9e2523a7..6b8a18237 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -58,6 +58,8 @@ from gui.updateDialog import UpdateDialog from gui.builtinViews import * from time import gmtime, strftime +from service.crest import CrestModes + from wx.lib.pubsub import setupkwargs from wx.lib.pubsub import pub @@ -518,7 +520,7 @@ class MainFrame(wx.Frame): def ssoLogin(self, event): sCrest = service.Crest.getInstance() - if sCrest.settings.get('mode') == 0: # Implicit, go directly to login + if sCrest.settings.get('mode') == CrestModes.IMPLICIT: if sCrest.implicitCharacter is not None: sCrest.logout() else: diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py index 0b071d534..7c6bd0396 100644 --- a/gui/mainMenuBar.py +++ b/gui/mainMenuBar.py @@ -24,6 +24,7 @@ import gui.mainFrame import gui.graphFrame import gui.globalEvents as GE import service +from service.crest import CrestModes from wx.lib.pubsub import setupkwargs from wx.lib.pubsub import pub @@ -113,14 +114,14 @@ class MainMenuBar(wx.MenuBar): # CREST Menu crestMenu = wx.Menu() self.Append(crestMenu, "&CREST") - if self.sCrest.settings.get('mode') != 0: + if self.sCrest.settings.get('mode') != CrestModes.IMPLICIT: crestMenu.Append(self.ssoLoginId, "Manage Characters") else: crestMenu.Append(self.ssoLoginId, "Login to EVE") crestMenu.Append(self.eveFittingsId, "Browse EVE Fittings") crestMenu.Append(self.exportToEveId, "Export To EVE") - if self.sCrest.settings.get('mode') == 0 or len(self.sCrest.getCrestCharacters()) == 0: + if self.sCrest.settings.get('mode') == CrestModes.IMPLICIT or len(self.sCrest.getCrestCharacters()) == 0: self.Enable(self.eveFittingsId, False) self.Enable(self.exportToEveId, False) @@ -157,13 +158,13 @@ class MainMenuBar(wx.MenuBar): event.Skip() def ssoLogin(self, type): - if self.sCrest.settings.get('mode') == 0: + if self.sCrest.settings.get('mode') == CrestModes.IMPLICIT: self.SetLabel(self.ssoLoginId, "Logout Character") self.Enable(self.eveFittingsId, True) self.Enable(self.exportToEveId, True) def ssoLogout(self, message): - if self.sCrest.settings.get('mode') == 0: + if self.sCrest.settings.get('mode') == CrestModes.IMPLICIT: self.SetLabel(self.ssoLoginId, "Login to EVE") self.Enable(self.eveFittingsId, False) self.Enable(self.exportToEveId, False) diff --git a/service/crest.py b/service/crest.py index 895ac0c67..01b2aab53 100644 --- a/service/crest.py +++ b/service/crest.py @@ -10,13 +10,27 @@ import time from wx.lib.pubsub import pub import eos.db +from eos.enum import Enum from eos.types import CrestChar import service logger = logging.getLogger(__name__) +class Servers(Enum): + TQ = 0 + SISI = 1 + +class CrestModes(Enum): + IMPLICIT = 0 + USER = 1 + class Crest(): + clientIDs = { + Servers.TQ: 'f9be379951c046339dc13a00e6be7704', + Servers.SISI: 'af87365240d644f7950af563b8418bad' + } + # @todo: move this to settings clientCallback = 'http://localhost:6461' clientTest = True @@ -29,7 +43,17 @@ class Crest(): return cls._instance + @classmethod + def restartService(cls): + # This is hear to reseed pycrest values when changing preferences + # We first stop the server n case one is running, as creating a new + # instance doesn't do this. + cls._instance.stopServer() + cls._instance = Crest() + return cls._instance + def __init__(self): + print "init crest" self.settings = service.settings.CRESTSettings.getInstance() self.scopes = ['characterFittingsRead', 'characterFittingsWrite'] @@ -40,10 +64,11 @@ class Crest(): # Base EVE connection that is copied to all characters self.eve = service.pycrest.EVE( - client_id=self.settings.get('clientID') if self.settings.get('mode') == 1 else config.clientID, - api_key=self.settings.get('clientSecret') if self.settings.get('mode') == 1 else None, - redirect_uri=self.clientCallback, - testing=self.clientTest) + client_id=self.settings.get('clientID') if self.settings.get('mode') == CrestModes.USER else self.clientIDs.get(self.settings.get('server')), + api_key=self.settings.get('clientSecret') if self.settings.get('mode') == CrestModes.USER else None, + redirect_uri=self.clientCallback, + testing=self.isTestServer + ) self.implicitCharacter = None @@ -52,6 +77,10 @@ class Crest(): self.charCache = {} pub.subscribe(self.handleLogin, 'sso_login') + @property + def isTestServer(self): + return self.settings.get('server') == Servers.SISI + def delCrestCharacter(self, charID): char = eos.db.getCrestCharacter(charID) eos.db.remove(char) @@ -72,7 +101,7 @@ class Crest(): ''' Get character, and modify to include the eve connection ''' - if self.settings.get('mode') == 0: + if self.settings.get('mode') == CrestModes.IMPLICIT: if self.implicitCharacter.ID != charID: raise ValueError("CharacterID does not match currently logged in character.") return self.implicitCharacter @@ -148,7 +177,7 @@ class Crest(): self.implicitCharacter.eve = eve #self.implicitCharacter.fetchImage() - wx.CallAfter(pub.sendMessage, 'login_success', type=0) + wx.CallAfter(pub.sendMessage, 'login_success', type=CrestModes.IMPLICIT) elif 'code' in message: eve = copy.deepcopy(self.eve) eve.authorize(message['code'][0]) @@ -167,6 +196,6 @@ class Crest(): self.charCache[int(info['CharacterID'])] = char eos.db.save(char) - wx.CallAfter(pub.sendMessage, 'login_success', type=1) + wx.CallAfter(pub.sendMessage, 'login_success', type=CrestModes.USER) self.stopServer() diff --git a/service/server.py b/service/server.py index 0ee1fb2c2..a4750876f 100644 --- a/service/server.py +++ b/service/server.py @@ -88,7 +88,10 @@ class StoppableHTTPServer(BaseHTTPServer.HTTPServer): def serve(self): while self.run: - self.handle_request() + try: + self.handle_request() + except TypeError: + pass if __name__ == "__main__": httpd = StoppableHTTPServer(('', 6461), AuthHandler) diff --git a/service/settings.py b/service/settings.py index ec86524df..10e7389b5 100644 --- a/service/settings.py +++ b/service/settings.py @@ -278,7 +278,7 @@ class CRESTSettings(): # mode # 0 - Implicit authentication # 1 - User-supplied client details - serviceCRESTDefaultSettings = {"mode": 0, "clientID": "", "clientSecret": ""} + serviceCRESTDefaultSettings = {"mode": 0, "server": 0, "clientID": "", "clientSecret": ""} self.serviceCRESTSettings = SettingsProvider.getInstance().getSettings("pyfaServiceCRESTSettings", serviceCRESTDefaultSettings)