From d53ff0f502679d71a0de195801a1f7f4d27267b2 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 21 Sep 2017 00:10:33 -0400 Subject: [PATCH 1/7] Add preliminary support for eve market data --- service/price.py | 156 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 50 deletions(-) diff --git a/service/price.py b/service/price.py index 9c6da235a..c6e089f79 100644 --- a/service/price.py +++ b/service/price.py @@ -39,6 +39,7 @@ REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours TIMEOUT = 15 * 60 # Network timeout delay for connection issues, 15 minutes + class Price(object): instance = None @@ -92,58 +93,10 @@ class Price(object): if len(toRequest) == 0: return - # This will store POST data for eve-central - data = [] - sFit = Fit.getInstance() - # Base request URL - baseurl = "https://eve-central.com/api/marketstat" - data.append(("usesystem", cls.systemsList[sFit.serviceFittingOptions["priceSystem"]])) # Use Jita for market - for typeID in toRequest: # Add all typeID arguments - data.append(("typeid", typeID)) - - # Attempt to send request and process it - try: - network = Network.getInstance() - data = network.request(baseurl, network.PRICES, data) - xml = minidom.parse(data) - types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type") - # Cycle through all types we've got from request - for type_ in types: - # Get data out of each typeID details tree - typeID = int(type_.getAttribute("id")) - sell = type_.getElementsByTagName("sell").item(0) - # If price data wasn't there, set price to zero - try: - percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data) - except (TypeError, ValueError): - pyfalog.warning("Failed to get price for: {0}", type_) - percprice = 0 - - # Fill price data - priceobj = priceMap[typeID] - priceobj.price = percprice - priceobj.time = time.time() + VALIDITY - priceobj.failed = None - - # delete price from working dict - del priceMap[typeID] - - # If getting or processing data returned any errors - except TimeoutError: - # Timeout error deserves special treatment - pyfalog.warning("Price fetch timout") - for typeID in priceMap.keys(): - priceobj = priceMap[typeID] - priceobj.time = time.time() + TIMEOUT - priceobj.failed = True - - del priceMap[typeID] - except: - # all other errors will pass and continue onward to the REREQUEST delay - pyfalog.warning("Caught exception in fetchPrices") - pass + func = cls.evemarketdata + func(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap) # if we get to this point, then we've got an error. Set to REREQUEST delay for typeID in priceMap.keys(): @@ -210,6 +163,109 @@ class Price(object): pyfalog.debug("Clearing Prices") db.clearPrices() + # todo: create classes for these, inherit a base class that allows a simple api of setPrice() and stuff? + @classmethod + def evecentral(self, types, system, priceMap): + data = [] + baseurl = "https://eve-central.com/api/marketstat" + data.append(("usesystem", system)) # Use Jita for market + + for typeID in types: # Add all typeID arguments + data.append(("typeid", typeID)) + + # Attempt to send request and process it + try: + network = Network.getInstance() + data = network.request(baseurl, network.PRICES, data) + xml = minidom.parse(data) + types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type") + # Cycle through all types we've got from request + for type_ in types: + # Get data out of each typeID details tree + typeID = int(type_.getAttribute("id")) + sell = type_.getElementsByTagName("sell").item(0) + # If price data wasn't there, set price to zero + try: + percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data) + except (TypeError, ValueError): + pyfalog.warning("Failed to get price for: {0}", type_) + percprice = 0 + + # Fill price data + priceobj = priceMap[typeID] + priceobj.price = percprice + priceobj.time = time.time() + VALIDITY + priceobj.failed = None + + # delete price from working dict + del priceMap[typeID] + + # If getting or processing data returned any errors + except TimeoutError: + # Timeout error deserves special treatment + pyfalog.warning("Price fetch timout") + for typeID in priceMap.keys(): + priceobj = priceMap[typeID] + priceobj.time = time.time() + TIMEOUT + priceobj.failed = True + + del priceMap[typeID] + except: + # all other errors will pass and continue onward to the REREQUEST delay + pyfalog.warning("Caught exception in fetchPrices") + pass + pass + + @classmethod + def evemarketdata(self, types, system, priceMap): + data = [] + baseurl = "https://eve-marketdata.com/api/item_prices.xml" + data.append(("system_id", system)) # Use Jita for market + data.append(("type_ids", ','.join(str(x) for x in types))) + + # Attempt to send request and process it + try: + network = Network.getInstance() + data = network.request(baseurl, network.PRICES, data) + xml = minidom.parse(data) + print (xml.getElementsByTagName("eve").item(0)) + types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price") + # Cycle through all types we've got from request + for type_ in types: + # Get data out of each typeID details tree + typeID = int(type_.getAttribute("id")) + price = 0 + + try: + price = float(type_.firstChild.data) + except (TypeError, ValueError): + pyfalog.warning("Failed to get price for: {0}", type_) + + # Fill price data + priceobj = priceMap[typeID] + priceobj.price = price + priceobj.time = time.time() + VALIDITY + priceobj.failed = None + + # delete price from working dict + del priceMap[typeID] + + # If getting or processing data returned any errors + except TimeoutError: + # Timeout error deserves special treatment + pyfalog.warning("Price fetch timout") + for typeID in priceMap.keys(): + priceobj = priceMap[typeID] + priceobj.time = time.time() + TIMEOUT + priceobj.failed = True + + del priceMap[typeID] + except: + # all other errors will pass and continue onward to the REREQUEST delay + pyfalog.warning("Caught exception in fetchPrices") + pass + pass + class PriceWorkerThread(threading.Thread): def __init__(self): From 7d41260863ae489cd20e5150be1bbcae7622962d Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 21 Sep 2017 20:50:37 -0400 Subject: [PATCH 2/7] Break out market sources into their own classes and register them onto the price service. Create preference option to select which source user wants. Default to eve central --- .../pyfaGeneralPreferences.py | 8 ++ service/fit.py | 1 + service/marketSources/__init__.py | 1 + service/marketSources/evecentral.py | 87 +++++++++++++ service/marketSources/evemarketdata.py | 85 ++++++++++++ service/price.py | 121 +++--------------- 6 files changed, 197 insertions(+), 106 deletions(-) create mode 100644 service/marketSources/__init__.py create mode 100644 service/marketSources/evecentral.py create mode 100644 service/marketSources/evemarketdata.py diff --git a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py index acdfb398b..6cb611797 100644 --- a/gui/builtinPreferenceViews/pyfaGeneralPreferences.py +++ b/gui/builtinPreferenceViews/pyfaGeneralPreferences.py @@ -90,7 +90,9 @@ class PFGeneralPref(PreferenceView): self.stDefaultSystem.Wrap(-1) priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) + self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys())) self.chPriceSystem = wx.Choice(panel, choices=Price.systemsList.keys()) + priceSizer.Add(self.chPriceSource, 1, wx.ALL | wx.EXPAND, 5) priceSizer.Add(self.chPriceSystem, 1, wx.ALL | wx.EXPAND, 5) mainSizer.Add(priceSizer, 0, wx.ALL | wx.EXPAND, 0) @@ -124,6 +126,7 @@ class PFGeneralPref(PreferenceView): self.cbGaugeAnimation.SetValue(self.sFit.serviceFittingOptions["enableGaugeAnimation"]) self.cbExportCharges.SetValue(self.sFit.serviceFittingOptions["exportCharges"]) self.cbOpenFitInNew.SetValue(self.sFit.serviceFittingOptions["openFitInNew"]) + self.chPriceSource.SetStringSelection(self.sFit.serviceFittingOptions["priceSource"]) self.chPriceSystem.SetStringSelection(self.sFit.serviceFittingOptions["priceSystem"]) self.cbShowShipBrowserTooltip.SetValue(self.sFit.serviceFittingOptions["showShipBrowserTooltip"]) self.intDelay.SetValue(self.sFit.serviceFittingOptions["marketSearchDelay"]) @@ -140,6 +143,7 @@ class PFGeneralPref(PreferenceView): self.cbGaugeAnimation.Bind(wx.EVT_CHECKBOX, self.onCBGaugeAnimation) self.cbExportCharges.Bind(wx.EVT_CHECKBOX, self.onCBExportCharges) self.cbOpenFitInNew.Bind(wx.EVT_CHECKBOX, self.onCBOpenFitInNew) + self.chPriceSource.Bind(wx.EVT_CHOICE, self.onPricesSourceSelection) self.chPriceSystem.Bind(wx.EVT_CHOICE, self.onPriceSelection) self.cbShowShipBrowserTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowShipBrowserTooltip) self.intDelay.Bind(wx.lib.intctrl.EVT_INT, self.onMarketDelayChange) @@ -224,5 +228,9 @@ class PFGeneralPref(PreferenceView): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) event.Skip() + def onPricesSourceSelection(self, event): + source = self.chPriceSource.GetString(self.chPriceSource.GetSelection()) + self.sFit.serviceFittingOptions["priceSource"] = source + PFGeneralPref.register() diff --git a/service/fit.py b/service/fit.py index 94cb67d0a..85c6ccffd 100644 --- a/service/fit.py +++ b/service/fit.py @@ -74,6 +74,7 @@ class Fit(object): "exportCharges": True, "openFitInNew": False, "priceSystem": "Jita", + "priceSource": "eve-central.com", "showShipBrowserTooltip": True, "marketSearchDelay": 250 } diff --git a/service/marketSources/__init__.py b/service/marketSources/__init__.py new file mode 100644 index 000000000..b093a0010 --- /dev/null +++ b/service/marketSources/__init__.py @@ -0,0 +1 @@ +__all__ = ['evecentral', 'evemarketdata'] \ No newline at end of file diff --git a/service/marketSources/evecentral.py b/service/marketSources/evecentral.py new file mode 100644 index 000000000..3a17ac957 --- /dev/null +++ b/service/marketSources/evecentral.py @@ -0,0 +1,87 @@ +# ============================================================================= +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + +import time +from logbook import Logger +from xml.dom import minidom + +from service.network import Network +from service.price import Price, VALIDITY, TIMEOUT, TimeoutError + + +pyfalog = Logger(__name__) + + +class EveCentral(object): + + name = "eve-central.com" + + def __init__(self, types, system, priceMap): + data = [] + baseurl = "https://eve-central.com/api/marketstat" + data.append(("usesystem", system)) # Use Jita for market + + for typeID in types: # Add all typeID arguments + data.append(("typeid", typeID)) + + # Attempt to send request and process it + try: + network = Network.getInstance() + data = network.request(baseurl, network.PRICES, data) + xml = minidom.parse(data) + types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type") + # Cycle through all types we've got from request + for type_ in types: + # Get data out of each typeID details tree + typeID = int(type_.getAttribute("id")) + sell = type_.getElementsByTagName("sell").item(0) + # If price data wasn't there, set price to zero + try: + percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data) + except (TypeError, ValueError): + pyfalog.warning("Failed to get price for: {0}", type_) + percprice = 0 + + # Fill price data + priceobj = priceMap[typeID] + priceobj.price = percprice + priceobj.time = time.time() + VALIDITY + priceobj.failed = None + + # delete price from working dict + del priceMap[typeID] + + # If getting or processing data returned any errors + except TimeoutError: + # Timeout error deserves special treatment + pyfalog.warning("Price fetch timout") + for typeID in priceMap.keys(): + priceobj = priceMap[typeID] + priceobj.time = time.time() + TIMEOUT + priceobj.failed = True + + del priceMap[typeID] + except: + # all other errors will pass and continue onward to the REREQUEST delay + pyfalog.warning("Caught exception in fetchPrices") + pass + pass + + +Price.register(EveCentral) diff --git a/service/marketSources/evemarketdata.py b/service/marketSources/evemarketdata.py new file mode 100644 index 000000000..4ca7a3633 --- /dev/null +++ b/service/marketSources/evemarketdata.py @@ -0,0 +1,85 @@ +# ============================================================================= +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + +import time +from logbook import Logger +from xml.dom import minidom + +from service.network import Network +from service.price import Price, VALIDITY, TIMEOUT, TimeoutError + + +pyfalog = Logger(__name__) + + +class EveMarketData(object): + + name = "eve-marketdata.com" + + def __init__(self, types, system, priceMap): + data = [] + baseurl = "https://eve-marketdata.com/api/item_prices.xml" + data.append(("system_id", system)) # Use Jita for market + data.append(("type_ids", ','.join(str(x) for x in types))) + + # Attempt to send request and process it + try: + network = Network.getInstance() + data = network.request(baseurl, network.PRICES, data) + xml = minidom.parse(data) + print (xml.getElementsByTagName("eve").item(0)) + types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price") + # Cycle through all types we've got from request + for type_ in types: + # Get data out of each typeID details tree + typeID = int(type_.getAttribute("id")) + price = 0 + + try: + price = float(type_.firstChild.data) + except (TypeError, ValueError): + pyfalog.warning("Failed to get price for: {0}", type_) + + # Fill price data + priceobj = priceMap[typeID] + priceobj.price = price + priceobj.time = time.time() + VALIDITY + priceobj.failed = None + + # delete price from working dict + del priceMap[typeID] + + # If getting or processing data returned any errors + except TimeoutError: + # Timeout error deserves special treatment + pyfalog.warning("Price fetch timout") + for typeID in priceMap.keys(): + priceobj = priceMap[typeID] + priceobj.time = time.time() + TIMEOUT + priceobj.failed = True + + del priceMap[typeID] + except: + # all other errors will pass and continue onward to the REREQUEST delay + pyfalog.warning("Caught exception in fetchPrices") + pass + pass + + +Price.register(EveMarketData) \ No newline at end of file diff --git a/service/price.py b/service/price.py index c6e089f79..b37d6a0d4 100644 --- a/service/price.py +++ b/service/price.py @@ -39,7 +39,6 @@ REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours TIMEOUT = 15 * 60 # Network timeout delay for connection issues, 15 minutes - class Price(object): instance = None @@ -51,12 +50,18 @@ class Price(object): "Hek": 30002053 } + sources = {} + def __init__(self): # Start price fetcher self.priceWorkerThread = PriceWorkerThread() self.priceWorkerThread.daemon = True self.priceWorkerThread.start() + @classmethod + def register(cls, source): + cls.sources[source.name] = source + @classmethod def getInstance(cls): if cls.instance is None: @@ -95,8 +100,13 @@ class Price(object): sFit = Fit.getInstance() - func = cls.evemarketdata - func(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap) + if len(cls.sources.keys()) == 0: + pyfalog.warn('No price source can be found') + return + + # attempt to find user's selected price source, otherwise get first one + sourceCls = cls.sources.get(sFit.serviceFittingOptions["priceSource"], cls.sources[cls.sources.keys()[0]]) + sourceCls(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap) # if we get to this point, then we've got an error. Set to REREQUEST delay for typeID in priceMap.keys(): @@ -163,109 +173,6 @@ class Price(object): pyfalog.debug("Clearing Prices") db.clearPrices() - # todo: create classes for these, inherit a base class that allows a simple api of setPrice() and stuff? - @classmethod - def evecentral(self, types, system, priceMap): - data = [] - baseurl = "https://eve-central.com/api/marketstat" - data.append(("usesystem", system)) # Use Jita for market - - for typeID in types: # Add all typeID arguments - data.append(("typeid", typeID)) - - # Attempt to send request and process it - try: - network = Network.getInstance() - data = network.request(baseurl, network.PRICES, data) - xml = minidom.parse(data) - types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type") - # Cycle through all types we've got from request - for type_ in types: - # Get data out of each typeID details tree - typeID = int(type_.getAttribute("id")) - sell = type_.getElementsByTagName("sell").item(0) - # If price data wasn't there, set price to zero - try: - percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data) - except (TypeError, ValueError): - pyfalog.warning("Failed to get price for: {0}", type_) - percprice = 0 - - # Fill price data - priceobj = priceMap[typeID] - priceobj.price = percprice - priceobj.time = time.time() + VALIDITY - priceobj.failed = None - - # delete price from working dict - del priceMap[typeID] - - # If getting or processing data returned any errors - except TimeoutError: - # Timeout error deserves special treatment - pyfalog.warning("Price fetch timout") - for typeID in priceMap.keys(): - priceobj = priceMap[typeID] - priceobj.time = time.time() + TIMEOUT - priceobj.failed = True - - del priceMap[typeID] - except: - # all other errors will pass and continue onward to the REREQUEST delay - pyfalog.warning("Caught exception in fetchPrices") - pass - pass - - @classmethod - def evemarketdata(self, types, system, priceMap): - data = [] - baseurl = "https://eve-marketdata.com/api/item_prices.xml" - data.append(("system_id", system)) # Use Jita for market - data.append(("type_ids", ','.join(str(x) for x in types))) - - # Attempt to send request and process it - try: - network = Network.getInstance() - data = network.request(baseurl, network.PRICES, data) - xml = minidom.parse(data) - print (xml.getElementsByTagName("eve").item(0)) - types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price") - # Cycle through all types we've got from request - for type_ in types: - # Get data out of each typeID details tree - typeID = int(type_.getAttribute("id")) - price = 0 - - try: - price = float(type_.firstChild.data) - except (TypeError, ValueError): - pyfalog.warning("Failed to get price for: {0}", type_) - - # Fill price data - priceobj = priceMap[typeID] - priceobj.price = price - priceobj.time = time.time() + VALIDITY - priceobj.failed = None - - # delete price from working dict - del priceMap[typeID] - - # If getting or processing data returned any errors - except TimeoutError: - # Timeout error deserves special treatment - pyfalog.warning("Price fetch timout") - for typeID in priceMap.keys(): - priceobj = priceMap[typeID] - priceobj.time = time.time() + TIMEOUT - priceobj.failed = True - - del priceMap[typeID] - except: - # all other errors will pass and continue onward to the REREQUEST delay - pyfalog.warning("Caught exception in fetchPrices") - pass - pass - class PriceWorkerThread(threading.Thread): def __init__(self): @@ -302,3 +209,5 @@ class PriceWorkerThread(threading.Thread): if itemID not in self.wait: self.wait[itemID] = [] self.wait[itemID].append(callback) + +from service.marketSources import * # noqa: E402,F401 From c30c07b91c7a5493d170f24c5fb41655b0b87e2f Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 21 Sep 2017 21:21:14 -0400 Subject: [PATCH 3/7] fix tox stuff --- service/marketSources/evemarketdata.py | 2 +- service/price.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/service/marketSources/evemarketdata.py b/service/marketSources/evemarketdata.py index 4ca7a3633..0b3c63dac 100644 --- a/service/marketSources/evemarketdata.py +++ b/service/marketSources/evemarketdata.py @@ -82,4 +82,4 @@ class EveMarketData(object): pass -Price.register(EveMarketData) \ No newline at end of file +Price.register(EveMarketData) diff --git a/service/price.py b/service/price.py index b37d6a0d4..4df9aaa31 100644 --- a/service/price.py +++ b/service/price.py @@ -210,4 +210,5 @@ class PriceWorkerThread(threading.Thread): self.wait[itemID] = [] self.wait[itemID].append(callback) -from service.marketSources import * # noqa: E402,F401 + +from service.marketSources import evecentral, evemarketdata # noqa: E402 From ccd8cdd09951bbabb2c89c93981f4d5a5d9a17bc Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 24 Sep 2017 17:54:19 -0400 Subject: [PATCH 4/7] Update forum references --- README.md | 2 +- gui/errorDialog.py | 2 +- gui/mainFrame.py | 9 ++++----- scripts/pyfa-setup.iss | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5700287f8..fd87aed48 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ pyfa is licensed under the GNU GPL v3.0, see LICENSE ## Resources * Development repository: [https://github.com/pyfa-org/Pyfa](https://github.com/pyfa-org/Pyfa) -* [EVE forum thread](https://forums.eveonline.com/default.aspx?g=posts&t=466425) +* [EVE forum thread](https://forums.eveonline.com/t/27156) * [EVE University guide using pyfa](http://wiki.eveuniversity.org/Guide_to_using_PYFA) * [EVE Online website](http://www.eveonline.com/) diff --git a/gui/errorDialog.py b/gui/errorDialog.py index f0a8c3bce..378ddddd2 100644 --- a/gui/errorDialog.py +++ b/gui/errorDialog.py @@ -78,7 +78,7 @@ class ErrorFrame(wx.Frame): wx.DefaultPosition, wx.DefaultSize, wx.HL_DEFAULT_STYLE) box.Add(github, 0, wx.ALL, 5) - eveForums = wx.HyperlinkCtrl(self, wx.ID_ANY, "EVE Forums", "https://forums.eveonline.com/default.aspx?g=posts&t=466425", + eveForums = wx.HyperlinkCtrl(self, wx.ID_ANY, "EVE Forums", "https://forums.eveonline.com/t/27156", wx.DefaultPosition, wx.DefaultSize, wx.HL_DEFAULT_STYLE) box.Add(eveForums, 0, wx.ALL, 5) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index b5d859149..269df37e8 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -380,10 +380,9 @@ class MainFrame(wx.Frame, IPortUser): "\nSQLAlchemy: \t" + sqlalchemy.__version__ + "\nmatplotlib: \t {}".format(matplotlib_version if matplotlib_version else "Not Installed"), 500, wx.ClientDC(self)) - if "__WXGTK__" in wx.PlatformInfo: - forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425" - else: - forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425" + + forumUrl = "https://forums.eveonline.com/t/27156" + info.WebSite = (forumUrl, "pyfa thread at EVE Online forum") wx.AboutBox(info) @@ -453,7 +452,7 @@ class MainFrame(wx.Frame, IPortUser): @staticmethod def goForums(event): - webbrowser.open('https://forums.eveonline.com/default.aspx?g=posts&t=466425') + webbrowser.open('https://forums.eveonline.com/t/27156') @staticmethod def loadDatabaseDefaults(event): diff --git a/scripts/pyfa-setup.iss b/scripts/pyfa-setup.iss index 4980c6b65..9c25f11f2 100644 --- a/scripts/pyfa-setup.iss +++ b/scripts/pyfa-setup.iss @@ -15,7 +15,7 @@ #define MyAppName "pyfa" #define MyAppPublisher "pyfa" -#define MyAppURL "https://forums.eveonline.com/default.aspx?g=posts&t=466425&p=1" +#define MyAppURL "https://forums.eveonline.com/t/27156" #define MyAppExeName "pyfa.exe" ; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup From 782df1850111888eadfbc8f051e1c2988d3ad954 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 24 Sep 2017 18:22:53 -0400 Subject: [PATCH 5/7] Bump dev version --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index c5fbace37..c20c0b31b 100644 --- a/config.py +++ b/config.py @@ -19,8 +19,8 @@ debug = False saveInRoot = False # Version data -version = "1.32.0" -tag = "Stable " +version = "1.33.0" +tag = "git" expansionName = "YC119.9" expansionVersion = "1.3" evemonMinVersion = "4081" From 06e82a04b40bd7223cdcdfc89d4a4247f7058c98 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 25 Sep 2017 01:15:14 -0400 Subject: [PATCH 6/7] fix issue in itemDiff --- scripts/itemDiff.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/itemDiff.py b/scripts/itemDiff.py index 2778c9849..a6287b97a 100755 --- a/scripts/itemDiff.py +++ b/scripts/itemDiff.py @@ -89,8 +89,8 @@ def main(old, new, groups=True, effects=True, attributes=True, renames=True): dictionary[id] = name for id in set(old_namedata.keys()).intersection(new_namedata.keys()): - oldname = old_namedata[id] - newname = new_namedata[id] + oldname = old_namedata[id] if old_namedata[id] is not None else 'None' + newname = new_namedata[id] if new_namedata[id] is not None else 'None' if oldname != newname: ren_dict[id] = (oldname, newname) return From ca27cd3250c4eb098990e62f8d7eab365a72a12a Mon Sep 17 00:00:00 2001 From: Ryan Holmes Date: Sun, 29 Oct 2017 18:54:46 -0400 Subject: [PATCH 7/7] bump stable release (#1329) --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index 93ca58d52..b15c30a3d 100644 --- a/config.py +++ b/config.py @@ -19,8 +19,8 @@ debug = False saveInRoot = False # Version data -version = "1.34.0" -tag = "git" +version = "1.33.1" +tag = "Stable" expansionName = "Lifeblood" expansionVersion = "1.0" evemonMinVersion = "4081"