diff --git a/src/Sephrasto/Charakter.py b/src/Sephrasto/Charakter.py index 62f63be..42000f9 100644 --- a/src/Sephrasto/Charakter.py +++ b/src/Sephrasto/Charakter.py @@ -332,7 +332,7 @@ def heimat(self, heimat): self.charakterScriptAPI["heimatAlt"] = self._heimat self._heimat = heimat - exec( Wolke.DB.einstellungen["Heimaten: Heimat geändert Script"].wert, self.charakterScriptAPI) + Wolke.DB.einstellungen["Heimaten: Heimat geändert Script"].executeScript(self.charakterScriptAPI) del self.charakterScriptAPI["heimatAlt"] def API_getWaffeValue(self, index, attrib): @@ -615,7 +615,7 @@ def aktualisieren(self): ab.aktualisierenFinal() #WS*, GS*, DH*, SchiP* # Execute global script. It is responsible for calculating the final weapon stats. - exec(Wolke.DB.einstellungen["Charakter aktualisieren Script"].wert, self.charakterScriptAPI) + Wolke.DB.einstellungen["Charakter aktualisieren Script"].executeScript(self.charakterScriptAPI) EventBus.doAction("post_charakter_aktualisieren", { "charakter" : self }) self.epZaehlen() diff --git a/src/Sephrasto/CharakterBeschreibungWrapper.py b/src/Sephrasto/CharakterBeschreibungWrapper.py index 06caae2..22c34bb 100644 --- a/src/Sephrasto/CharakterBeschreibungWrapper.py +++ b/src/Sephrasto/CharakterBeschreibungWrapper.py @@ -86,8 +86,8 @@ def update(self): eigenheitenNeu = [] for i in range(8): - text = eval("self.ui.editEig" + str(i+1) + ".text()") - eigenheitenNeu.append(text) + lineEdit = getattr(self.ui, "editEig" + str(i+1)) + eigenheitenNeu.append(lineEdit.text()) #Preserve the position of actual elements but remove any trailing empty elements #This is needed for ArrayEqual later to work as intended diff --git a/src/Sephrasto/CharakterPrintUtility.py b/src/Sephrasto/CharakterPrintUtility.py index 6c910fe..be3a66a 100644 --- a/src/Sephrasto/CharakterPrintUtility.py +++ b/src/Sephrasto/CharakterPrintUtility.py @@ -31,7 +31,7 @@ def groupVorteile(char, vorteile, link = True): name = vorteil.anzeigenameExt scriptAPI.update({ "name" : vorteil.name, "kategorie" : vorteil.kategorie, "mergeTo" : 0 }) - exec(Wolke.DB.einstellungen["Charsheet: Vorteile Mergescript"].wert, scriptAPI) + Wolke.DB.einstellungen["Charsheet: Vorteile Mergescript"].executeScript(scriptAPI) if scriptAPI["mergeTo"] == 0: vorteileAllgemein.append(name) elif scriptAPI["mergeTo"] == 1: diff --git a/src/Sephrasto/CheatsheetGenerator.py b/src/Sephrasto/CheatsheetGenerator.py index 1daee67..3e176b6 100644 --- a/src/Sephrasto/CheatsheetGenerator.py +++ b/src/Sephrasto/CheatsheetGenerator.py @@ -215,7 +215,7 @@ def generateRules(self): scriptAPI["hasVorteil"] = lambda name: name in Wolke.Char.vorteile for i in range(numRegelKategorien): scriptAPI.update({ "kategorie" : i, "mergeTo" : i }) - exec(Wolke.DB.einstellungen["Regelanhang: Regel Mergescript"].wert, scriptAPI) + Wolke.DB.einstellungen["Regelanhang: Regel Mergescript"].executeScript(scriptAPI) mergeTo = scriptAPI["mergeTo"] if mergeTo >= numRegelKategorien: mergeTo = i diff --git a/src/Sephrasto/Core/AbgeleiteterWert.py b/src/Sephrasto/Core/AbgeleiteterWert.py index 12d0b9e..80025f2 100644 --- a/src/Sephrasto/Core/AbgeleiteterWert.py +++ b/src/Sephrasto/Core/AbgeleiteterWert.py @@ -125,13 +125,22 @@ def sortorder(self): def aktualisieren(self): self.mod = 0 self.finalwert = 0 - self.basiswert = eval(self.definition.scriptCompiled, self.charakter.charakterScriptAPI) + try: + self.basiswert = eval(self.definition.scriptCompiled, self.charakter.charakterScriptAPI) + except Exception as e: + raise type(e)(f"\nScriptfehler in Abgeleiteter Wert \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") - def diffBasiswert(self, attribute): - return eval(self.definition.scriptCompiled, self.charakter.charakterScriptAPI) - self.basiswert + def diffBasiswert(self, attribute): + try: + return eval(self.definition.scriptCompiled, self.charakter.charakterScriptAPI) - self.basiswert + except Exception as e: + raise type(e)(f"\nScriptfehler in Abgeleiteter Wert \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") def aktualisierenFinal(self): if not self.finalscript: self.finalwert = self.wert - return - self.finalwert = eval(self.definition.finalscriptCompiled, self.charakter.charakterScriptAPI) \ No newline at end of file + return + try: + self.finalwert = eval(self.definition.finalscriptCompiled, self.charakter.charakterScriptAPI) + except Exception as e: + raise type(e)(f"\nScriptfehler in Abgeleiteter Wert \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") \ No newline at end of file diff --git a/src/Sephrasto/Core/Attribut.py b/src/Sephrasto/Core/Attribut.py index d1f7e60..fdbaf5e 100644 --- a/src/Sephrasto/Core/Attribut.py +++ b/src/Sephrasto/Core/Attribut.py @@ -86,7 +86,7 @@ def sortorder(self): def aktualisieren(self): scriptAPI = Hilfsmethoden.createScriptAPI() scriptAPI['getWert'] = lambda: self.wert - self.probenwert = eval(Wolke.DB.einstellungen["Attribute: PW Script"].wert, scriptAPI) + self.probenwert = Wolke.DB.einstellungen["Attribute: PW Script"].evaluateScript(scriptAPI) def steigerungskosten(self, numSteigerungen = 1): if numSteigerungen == 0: diff --git a/src/Sephrasto/Core/DatenbankEinstellung.py b/src/Sephrasto/Core/DatenbankEinstellung.py index 1a085c5..b7de98c 100644 --- a/src/Sephrasto/Core/DatenbankEinstellung.py +++ b/src/Sephrasto/Core/DatenbankEinstellung.py @@ -74,6 +74,18 @@ def finalize(self, db): def details(self, db): return f"{self.text}\n{self.beschreibung}" + def executeScript(self, api): + try: + exec(self.wert, api) + except Exception as e: + raise type(e)(f"\nScriptfehler in Einstellung \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") + + def evaluateScript(self, api): + try: + return eval(self.wert, api) + except Exception as e: + raise type(e)(f"\nScriptfehler in Einstellung \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") + def serialize(self, ser): ser.set('name', self.name) ser.set('text', self.text) diff --git a/src/Sephrasto/Core/Fertigkeit.py b/src/Sephrasto/Core/Fertigkeit.py index b9e8fa0..ea9770e 100644 --- a/src/Sephrasto/Core/Fertigkeit.py +++ b/src/Sephrasto/Core/Fertigkeit.py @@ -161,7 +161,7 @@ def diffBasiswert(self, attribute): attributswerte.append(attribute[attribut].wert) scriptAPI = Hilfsmethoden.createScriptAPI() scriptAPI['getAttribute'] = lambda: attributswerte - basiswert = eval(Wolke.DB.einstellungen["Fertigkeiten: BW Script"].wert, scriptAPI) + basiswert = Wolke.DB.einstellungen["Fertigkeiten: BW Script"].evaluateScript(scriptAPI) return basiswert - self.basiswert def aktualisieren(self): @@ -172,13 +172,13 @@ def aktualisieren(self): scriptAPI = Hilfsmethoden.createScriptAPI() scriptAPI['getAttribute'] = lambda: self.attributswerte - self.maxWert = eval(Wolke.DB.einstellungen["Fertigkeiten: Maximalwert Script"].wert, scriptAPI) - self.basiswert = eval(Wolke.DB.einstellungen["Fertigkeiten: BW Script"].wert, scriptAPI) + self.maxWert = Wolke.DB.einstellungen["Fertigkeiten: Maximalwert Script"].evaluateScript(scriptAPI) + self.basiswert = Wolke.DB.einstellungen["Fertigkeiten: BW Script"].evaluateScript(scriptAPI) self.wert = min(self.wert, self.maxWert) scriptAPI['getWert'] = lambda: self.wert scriptAPI['getBasiswert'] = lambda: self.basiswert - self.probenwert = eval(Wolke.DB.einstellungen["Fertigkeiten: PW Script"].wert, scriptAPI) - self.probenwertTalent = eval(Wolke.DB.einstellungen["Fertigkeiten: PWT Script"].wert, scriptAPI) + self.probenwert = Wolke.DB.einstellungen["Fertigkeiten: PW Script"].evaluateScript(scriptAPI) + self.probenwertTalent = Wolke.DB.einstellungen["Fertigkeiten: PWT Script"].evaluateScript(scriptAPI) @staticmethod def getHöchsteKampffertigkeit(fertigkeiten): diff --git a/src/Sephrasto/Core/Ruestung.py b/src/Sephrasto/Core/Ruestung.py index a599ffd..9e8598d 100644 --- a/src/Sephrasto/Core/Ruestung.py +++ b/src/Sephrasto/Core/Ruestung.py @@ -164,13 +164,13 @@ def __getScriptAPI(self, abgeleiteteWerte, zone = -1): return scriptAPI def getRSFinal(self, abgeleiteteWerte, zone = -1): - return eval(Wolke.DB.einstellungen["Rüstungen: RS Script"].wert, self.__getScriptAPI(abgeleiteteWerte, zone)) + return Wolke.DB.einstellungen["Rüstungen: RS Script"].evaluateScript(self.__getScriptAPI(abgeleiteteWerte, zone)) def getBEFinal(self, abgeleiteteWerte): - return eval(Wolke.DB.einstellungen["Rüstungen: BE Script"].wert, self.__getScriptAPI(abgeleiteteWerte)) + return Wolke.DB.einstellungen["Rüstungen: BE Script"].evaluateScript(self.__getScriptAPI(abgeleiteteWerte)) def getWSFinal(self, abgeleiteteWerte): - return eval(Wolke.DB.einstellungen["Rüstungen: WSStern Script"].wert, self.__getScriptAPI(abgeleiteteWerte)) + return Wolke.DB.einstellungen["Rüstungen: WSStern Script"].evaluateScript(self.__getScriptAPI(abgeleiteteWerte)) def serialize(self, ser): ser.set('name', self.name) diff --git a/src/Sephrasto/Core/Vorteil.py b/src/Sephrasto/Core/Vorteil.py index f1a06ae..0bb3eaa 100644 --- a/src/Sephrasto/Core/Vorteil.py +++ b/src/Sephrasto/Core/Vorteil.py @@ -92,7 +92,10 @@ def finalize(self, db): self.querverweiseResolved["Statusse"] = db.einstellungen["Statusse: Beschreibung"].wert def executeScript(self, api): - exec(self.scriptCompiled, api) + try: + exec(self.scriptCompiled, api) + except Exception as e: + raise type(e)(f"\nScriptfehler in Vorteil \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") def kategorieName(self, db): kategorie = min(self.kategorie, len(db.einstellungen['Vorteile: Kategorien'].wert) - 1) diff --git a/src/Sephrasto/Core/Waffeneigenschaft.py b/src/Sephrasto/Core/Waffeneigenschaft.py index a81f064..e742ea6 100644 --- a/src/Sephrasto/Core/Waffeneigenschaft.py +++ b/src/Sephrasto/Core/Waffeneigenschaft.py @@ -23,7 +23,10 @@ def finalize(self, db): self.scriptCompiled = compile_restricted(self.script or "", self.name + " Script", "exec") def executeScript(self, api): - exec(self.scriptCompiled, api) + try: + exec(self.scriptCompiled, api) + except Exception as e: + raise type(e)(f"\nScriptfehler in Waffeneigenschaft \"{self.name}\". Vermutlich hast du hier Änderungen in den Hausregeln vorgenommen, die das Problem verursachen.\n\nFehler: {str(e)}") def details(self, db): if self.script: diff --git a/src/Sephrasto/Sephrasto.py b/src/Sephrasto/Sephrasto.py index 290aab3..21991eb 100644 --- a/src/Sephrasto/Sephrasto.py +++ b/src/Sephrasto/Sephrasto.py @@ -61,7 +61,7 @@ def sephrasto_excepthook(exc_type, exc_value, tb): logging.critical(exception + "\n".join(traceback)) #Try to show message box, hopefully its not a crash in Qt - text = exception + "\nBei Fragen zum diesem Fehler bitte sephrasto.log aus dem Installationsordner mitsenden." + text = exception + "\n\nBei Fragen zum diesem Fehler bitte sephrasto.log aus dem Installationsordner mitsenden." if Wolke.Settings['Pfad-Plugins'] in filename: splitPath = os.path.split(os.path.relpath(filename, Wolke.Settings['Pfad-Plugins'])) if len(splitPath) > 0: