From 7f35c78a654ab0eb4253c5077955cdd021586702 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Mon, 6 Apr 2020 21:01:20 +0300 Subject: [PATCH] Add data about implant sets to eve.db --- db_update.py | 32 ++++++++++++++++++++++++++++++++ eos/db/__init__.py | 2 +- eos/db/gamedata/__init__.py | 2 +- eos/db/gamedata/implantSet.py | 33 +++++++++++++++++++++++++++++++++ eos/db/gamedata/queries.py | 17 ++++++++++++++++- eos/gamedata.py | 10 ++++++++++ 6 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 eos/db/gamedata/implantSet.py diff --git a/db_update.py b/db_update.py index 2d54bd713..0c517324f 100644 --- a/db_update.py +++ b/db_update.py @@ -23,6 +23,7 @@ import functools import itertools import json import os +import re import sqlite3 import sys @@ -458,6 +459,36 @@ def update_db(): if itemReplacements is not None: item.replacements = ','.join('{}'.format(tid) for tid in sorted(itemReplacements)) + def processImplantSets(eveTypesData): + print('composing implant sets') + # Includes only implants which can be considered part of sets, not all implants + implant_groups = (300, 1730) + specials = {'Genolution': ('Genolution Core Augmentation', r'CA-\d+')} + implantSets = {} + for row in eveTypesData: + if not row.get('published'): + continue + if row.get('groupID') not in implant_groups: + continue + typeName = row.get('typeName', '') + # Regular sets matching + m = re.match('(?P(High|Mid|Low)-grade) (?P\w+) (?P(Alpha|Beta|Gamma|Delta|Epsilon|Omega))', typeName) + if m: + implantSets.setdefault((m.group('grade'), m.group('set')), set()).add(row['typeID']) + # Special set matching + for setHandle, (setName, implantPattern) in specials.items(): + pattern = '(?P{}) (?P{})'.format(setName, implantPattern) + m = re.match(pattern, typeName) + if m: + implantSets.setdefault((None, setHandle), set()).add(row['typeID']) + break + data = [] + for (gradeName, setName), implants in implantSets.items(): + implants = ','.join('{}'.format(tid) for tid in sorted(implants)) + row = {'setName': setName, 'gradeName': gradeName, 'implants': implants} + data.append(row) + _addRows(data, eos.gamedata.ImplantSet) + eveTypesData = processEveTypes() eveGroupsData = processEveGroups() processEveCategories() @@ -476,6 +507,7 @@ def update_db(): eos.db.gamedata_session.flush() processReqSkills(eveTypesData) processReplacements(eveTypesData, eveGroupsData, dogmaTypeAttributesData, dogmaTypeEffectsData) + processImplantSets(eveTypesData) # Add schema version to prevent further updates metadata_schema_version = eos.gamedata.MetaData() diff --git a/eos/db/__init__.py b/eos/db/__init__.py index 604e16086..9119ab4aa 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -84,7 +84,7 @@ sd_lock = threading.RLock() pyfalog.debug('Importing gamedata DB scheme') # Import all the definitions for all our database stuff # noinspection PyPep8 -from eos.db.gamedata import alphaClones, attribute, category, effect, group, item, marketGroup, metaData, metaGroup, queries, traits, unit, dynamicAttributes +from eos.db.gamedata import alphaClones, attribute, category, effect, group, item, marketGroup, metaData, metaGroup, queries, traits, unit, dynamicAttributes, implantSet pyfalog.debug('Importing saveddata DB scheme') # noinspection PyPep8 from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, \ diff --git a/eos/db/gamedata/__init__.py b/eos/db/gamedata/__init__.py index 465433a26..24cb3fb6c 100644 --- a/eos/db/gamedata/__init__.py +++ b/eos/db/gamedata/__init__.py @@ -1,2 +1,2 @@ __all__ = ["attribute", "category", "effect", "group", "metaData", "dynamicAttributes", - "item", "marketGroup", "metaGroup", "unit", "alphaClones"] + "item", "marketGroup", "metaGroup", "unit", "alphaClones", "implantSet"] diff --git a/eos/db/gamedata/implantSet.py b/eos/db/gamedata/implantSet.py new file mode 100644 index 000000000..5f2b51996 --- /dev/null +++ b/eos/db/gamedata/implantSet.py @@ -0,0 +1,33 @@ +# =============================================================================== +# Copyright (C) 2010 Diego Duclos +# +# This file is part of eos. +# +# eos is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# eos 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 Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with eos. If not, see . +# =============================================================================== + +from sqlalchemy import Column, String, Integer, Table +from sqlalchemy.orm import mapper, synonym + +from eos.db import gamedata_meta +from eos.gamedata import ImplantSet + +implant_set_table = Table("implantsets", gamedata_meta, + Column("setID", Integer, primary_key=True), + Column("setName", String), + Column("gradeName", String), + Column("implants", String)) + +mapper(ImplantSet, implant_set_table, + properties={"ID": synonym("setID")}) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index 19c5321b4..cfad61d3d 100644 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -26,7 +26,7 @@ from eos.db import gamedata_session from eos.db.gamedata.item import items_table from eos.db.gamedata.group import groups_table from eos.db.util import processEager, processWhere -from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup +from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup, ImplantSet cache = {} configVal = getattr(eos.config, "gamedataCache", None) @@ -424,3 +424,18 @@ def getDynamicItem(itemID, eager=None): except exc.NoResultFound: result = None return result + + +@cachedQuery(1, "lookfor") +def getImplantSet(lookfor): + if isinstance(lookfor, int): + implantSet = gamedata_session.query(ImplantSet).get(lookfor) + else: + raise TypeError("Need integer as argument") + return implantSet + + +@cachedQuery(1, "lookfor") +def getAllImplantSets(): + implantSets = gamedata_session.query(ImplantSet).all() + return implantSets diff --git a/eos/gamedata.py b/eos/gamedata.py index 372aacd76..4af5f9265 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -723,5 +723,15 @@ class Unit(EqBase): return value + class Traits(EqBase): pass + + +class ImplantSet(EqBase): + + @property + def fullName(self): + if not self.gradeName: + return self.setName + return '{} {}'.format(self.gradeName, self.setName)