You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.9 KiB
211 lines
5.9 KiB
"""
|
|
Module for accessing the sqlite monster hunter db from
|
|
"""
|
|
|
|
import string
|
|
|
|
import sqlite3
|
|
|
|
class Quest(object):
|
|
def __init__(self, quest_row, quest_rewards=None):
|
|
self._row = quest_row
|
|
self.rewards = quest_rewards
|
|
|
|
self._full_template = string.Template(
|
|
"$name ($hub $stars* $rank)"
|
|
"\n Goal: $goal"
|
|
"\n Sub : $sub_goal"
|
|
)
|
|
|
|
self._one_line_template = string.Template(
|
|
"$name ($hub $stars* $rank)"
|
|
)
|
|
|
|
self.id = quest_row["_id"]
|
|
self.name = quest_row["name"]
|
|
self.stars = quest_row["stars"]
|
|
self.hub = quest_row["hub"]
|
|
self.goal = quest_row["goal"]
|
|
self.sub_goal = quest_row["sub_goal"]
|
|
self.rank = quest_row["rank"]
|
|
|
|
def is_multi_monster(self):
|
|
return (" and " in self.goal
|
|
or "," in self.goal
|
|
or " all " in self.goal)
|
|
|
|
def one_line_u(self):
|
|
return self._one_line_template.substitute(self.__dict__)
|
|
|
|
def full_u(self):
|
|
return self._full_template.substitute(self.__dict__)
|
|
|
|
def __unicode__(self):
|
|
return self.full_u()
|
|
|
|
|
|
class MHDB(object):
|
|
def __init__(self, path, use_cache=True):
|
|
self.conn = sqlite3.connect(path)
|
|
self.conn.row_factory = sqlite3.Row
|
|
self.use_cache = use_cache
|
|
self.cache = {}
|
|
|
|
def _get_memoized(self, key, query, *args):
|
|
if self.use_cache:
|
|
if key in self.cache:
|
|
v = self.cache[key].get(args)
|
|
if v is not None:
|
|
return v
|
|
else:
|
|
self.cache[key] = {}
|
|
cursor = self.conn.execute(query, args)
|
|
v = cursor.fetchall()
|
|
if self.use_cache:
|
|
self.cache[key][args] = v
|
|
return v
|
|
|
|
def cursor(self):
|
|
return self.conn.cursor()
|
|
|
|
def commit(self):
|
|
return self.conn.commit()
|
|
|
|
def close(self):
|
|
return self.conn.close()
|
|
|
|
def get_item_names(self, item_types):
|
|
item_types.sort()
|
|
placeholders = ", ".join(["?"] * len(item_types))
|
|
v = self._get_memoized("item_names", """
|
|
SELECT _id, name FROM items
|
|
WHERE type IN (%s)
|
|
""" % placeholders, *item_types)
|
|
return v
|
|
|
|
def get_item(self, item_id):
|
|
v = self._get_memoized("item", """
|
|
SELECT * FROM items
|
|
WHERE _id=?
|
|
""", item_id)
|
|
return v[0] if v else None
|
|
|
|
def get_item_by_name(self, name):
|
|
v = self._get_memoized("item", """
|
|
SELECT * FROM items
|
|
WHERE name=?
|
|
""", name)
|
|
return v[0] if v else None
|
|
|
|
def get_wyporium_trade(self, item_id):
|
|
v = self._get_memoized("wyporium", """
|
|
SELECT * FROM wyporium
|
|
WHERE item_in_id=?
|
|
""", item_id)
|
|
return v[0] if v else None
|
|
|
|
def search_item_name(self, term, item_type=None):
|
|
"""
|
|
Search for items containing @term somewhere in the name. Returns
|
|
list of matching items.
|
|
|
|
Not memoized.
|
|
"""
|
|
query = """
|
|
SELECT * FROM items
|
|
WHERE name LIKE ?
|
|
"""
|
|
args = ["%%%s%%" % term]
|
|
if item_type is not None:
|
|
if isinstance(item_type, (list, tuple)):
|
|
query += "AND type IN (%s)" % (",".join(["?"] * len(item_type)))
|
|
args += item_type
|
|
else:
|
|
query += "AND type = ?"
|
|
args += [item_type]
|
|
|
|
cursor = self.conn.execute(query, args)
|
|
return cursor.fetchall()
|
|
|
|
def get_monster_by_name(self, name):
|
|
v = self._get_memoized("monster", """
|
|
SELECT * FROM monsters
|
|
WHERE name=?
|
|
""", name)
|
|
return v[0] if v else None
|
|
|
|
def get_monster(self, monster_id):
|
|
v = self._get_memoized("monster", """
|
|
SELECT * FROM monsters
|
|
WHERE _id=?
|
|
""", monster_id)
|
|
return v[0] if v else None
|
|
|
|
def get_quest(self, quest_id):
|
|
v = self._get_memoized("quest", """
|
|
SELECT * FROM quests
|
|
WHERE _id=?
|
|
""", quest_id)
|
|
return v[0] if v else None
|
|
|
|
def get_quests(self):
|
|
v = self._get_memoized("quests", """
|
|
SELECT * FROM quests
|
|
""")
|
|
return v
|
|
|
|
def get_quest_rewards(self, quest_id):
|
|
v = self._get_memoized("quest_rewards", """
|
|
SELECT * FROM quest_rewards
|
|
WHERE quest_id=?
|
|
""", quest_id)
|
|
return v
|
|
|
|
def get_monster_rewards(self, monster_id, rank=None):
|
|
q = """
|
|
SELECT * FROM hunting_rewards
|
|
WHERE monster_id=?
|
|
"""
|
|
if rank is not None:
|
|
q += "AND rank=?"
|
|
v = self._get_memoized("monster_rewards", q, monster_id, rank)
|
|
else:
|
|
v = self._get_memoized("monster_rewards", q, monster_id)
|
|
return v
|
|
|
|
def get_quest_monsters(self, quest_id):
|
|
v = self._get_memoized("quest_monsters", """
|
|
SELECT monster_id, unstable FROM monster_to_quest
|
|
WHERE quest_id=?
|
|
""", quest_id)
|
|
return v
|
|
|
|
def get_item_quest_objects(self, item_id):
|
|
"""
|
|
Get a list of quests that provide the specified item in quest
|
|
reqards. Returns a list of quest objects, which encapsulate the
|
|
quest details and the list of rewards.
|
|
"""
|
|
cursor = self.conn.execute("""
|
|
SELECT DISTINCT quest_id FROM quest_rewards
|
|
WHERE item_id=?
|
|
""", (item_id,))
|
|
|
|
rows = cursor.fetchall()
|
|
|
|
quests = []
|
|
for r in rows:
|
|
quest_row = self.get_quest(r["quest_id"])
|
|
rewards_rows = self.get_quest_rewards(r["quest_id"])
|
|
quests.append(Quest(quest_row, rewards_rows))
|
|
|
|
return quests
|
|
|
|
def get_item_monsters(self, item_id):
|
|
v = self._get_memoized("item_monsters", """
|
|
SELECT DISTINCT monster_id, rank FROM hunting_rewards
|
|
WHERE item_id=?
|
|
""", item_id)
|
|
|
|
return v
|