213 lines
6.7 KiB
Python
213 lines
6.7 KiB
Python
import uuid
|
|
|
|
|
|
class base_quest():
|
|
TABLE = None
|
|
|
|
def __init__(self, db, chat_id, qid, name=None, imp=None, diff=None,
|
|
state=None):
|
|
self.DB = db
|
|
self.CHAT_ID = chat_id
|
|
self.name = name
|
|
self.QID = int(qid)
|
|
self.imp = imp
|
|
self.diff = diff
|
|
self.state = state
|
|
|
|
def add_to_db(self):
|
|
cursor = self.DB.cursor()
|
|
query = (f'INSERT INTO {self.TABLE}(chat_id, qid, name, importance'
|
|
', difficulty, state) values(?, ?, ?, ?, ?, ?)')
|
|
cursor.execute(query, (self.CHAT_ID, self.QID, self.name, self.imp,
|
|
self.diff, self.state))
|
|
self.DB.commit()
|
|
|
|
def update_db(self):
|
|
cursor = self.DB.cursor()
|
|
query = (f'UPDATE {self.TABLE} SET name=?, importance=?, difficulty=?,'
|
|
' state=? WHERE chat_id=? AND qid=?')
|
|
cursor.execute(query, (self.name, self.imp, self.diff,
|
|
self.state, self.CHAT_ID, self.QID))
|
|
self.DB.commit()
|
|
|
|
def get_from_db(self):
|
|
cursor = self.DB.cursor()
|
|
query = (f'SELECT name, importance, difficulty, state FROM '
|
|
f'{self.TABLE} where chat_id=? AND qid=?')
|
|
cursor.execute(query, (self.CHAT_ID, self.QID))
|
|
output = cursor.fetchone()
|
|
self.name, self.imp, self.diff, self.state = output
|
|
|
|
def delete_from_db(self):
|
|
cursor = self.DB.cursor()
|
|
query = (f'DELETE FROM {self.TABLE} WHERE chat_id=? AND qid=?')
|
|
cursor.execute(query, (self.CHAT_ID, self.QID))
|
|
self.DB.commit()
|
|
|
|
def __str__(self):
|
|
return f"{self.QID}: {self.name}"
|
|
|
|
|
|
class quest(base_quest):
|
|
TABLE = "quests"
|
|
|
|
|
|
class side_quest(base_quest):
|
|
TABLE = "side_quests"
|
|
|
|
|
|
def get_quest(db, chat_id, qid):
|
|
q = quest(db, chat_id, qid)
|
|
q.get_from_db()
|
|
return q
|
|
|
|
|
|
def add_quest(db, chat_id, qid, name=None, imp=None, diff=None,
|
|
state=None):
|
|
q = quest(db, chat_id, qid, name, imp, diff, state)
|
|
q.add_to_db()
|
|
return q
|
|
|
|
|
|
def get_side_quest(db, chat_id, qid):
|
|
q = side_quest(db, chat_id, qid)
|
|
q.get_from_db()
|
|
return q
|
|
|
|
|
|
def add_side_quest(db, chat_id, qid, name=None, imp=None, diff=None,
|
|
state=None):
|
|
q = side_quest(db, chat_id, qid, name, imp, diff, state)
|
|
q.add_to_db()
|
|
return q
|
|
|
|
|
|
class player():
|
|
def __init__(self, db, chat_id):
|
|
self.DB = db
|
|
self.CHAT_ID = chat_id
|
|
cursor = self.DB.cursor()
|
|
cursor.execute('SELECT * FROM state WHERE chat_id = ?', (chat_id,))
|
|
row = cursor.fetchone()
|
|
if not row:
|
|
cursor.execute('INSERT INTO state(chat_id, state, extra) '
|
|
'VALUES(?,?,?)', (chat_id, 'none', 0))
|
|
db.commit()
|
|
cursor.execute('SELECT * FROM points WHERE chat_id = ?', (chat_id,))
|
|
row = cursor.fetchone()
|
|
if not row:
|
|
cursor.execute('INSERT INTO points(chat_id, points) VALUES(?,?)',
|
|
(chat_id, 0))
|
|
db.commit()
|
|
|
|
def get_state(self):
|
|
cursor = self.DB.cursor()
|
|
query = 'SELECT state, extra FROM state WHERE chat_id=?'
|
|
cursor.execute(query, (self.CHAT_ID,))
|
|
output = cursor.fetchone()
|
|
return {"state": output[0], "extra": output[1]}
|
|
|
|
def set_state(self, state, extra=0):
|
|
cursor = self.DB.cursor()
|
|
query = 'UPDATE state SET state=?, extra=? WHERE chat_id=?'
|
|
cursor.execute(query, (state, extra, self.CHAT_ID))
|
|
self.DB.commit()
|
|
|
|
def get_points(self):
|
|
cursor = self.DB.cursor()
|
|
query = 'SELECT points FROM points WHERE chat_id=?'
|
|
cursor.execute(query, (self.CHAT_ID,))
|
|
output = cursor.fetchone()
|
|
return int(output[0])
|
|
|
|
def add_points(self, points):
|
|
new_points = self.get_points() + points
|
|
cursor = self.DB.cursor()
|
|
query = 'UPDATE points SET points=? WHERE chat_id=?'
|
|
cursor.execute(query, (new_points, self.CHAT_ID))
|
|
self.DB.commit()
|
|
|
|
def get_quests(self, state=0):
|
|
cursor = self.DB.cursor()
|
|
query = ('SELECT chat_id, qid, name, importance, difficulty, '
|
|
'state FROM quests WHERE chat_id = ?')
|
|
if state is not None:
|
|
query += ' AND state = ?'
|
|
cursor.execute(query, (self.CHAT_ID, state))
|
|
else:
|
|
cursor.execute(query, (self.CHAT_ID,))
|
|
quests = []
|
|
for row in cursor:
|
|
q = quest(self.DB, *row)
|
|
quests.append(q)
|
|
return quests
|
|
|
|
def get_side_quests(self, state=0):
|
|
cursor = self.DB.cursor()
|
|
query = ('SELECT chat_id, qid, name, importance, difficulty, '
|
|
'state FROM side_quests WHERE chat_id = ?')
|
|
if state is not None:
|
|
query += ' AND state = ?'
|
|
cursor.execute(query, (self.CHAT_ID, state))
|
|
else:
|
|
cursor.execute(query, (self.CHAT_ID,))
|
|
quests = []
|
|
for row in cursor:
|
|
q = side_quest(self.DB, *row)
|
|
quests.append(q)
|
|
return quests
|
|
|
|
def get_quest(self, qid):
|
|
cursor = self.DB.cursor()
|
|
query = ('SELECT chat_id, qid, name, importance, difficulty, '
|
|
'state FROM quests WHERE chat_id = ? AND qid = ?')
|
|
cursor.execute(query, (self.CHAT_ID, qid))
|
|
row = cursor.fetchone()
|
|
if row is None:
|
|
return False
|
|
else:
|
|
return quest(self.DB, *row)
|
|
|
|
def get_side_quest(self, qid):
|
|
cursor = self.DB.cursor()
|
|
query = ('SELECT chat_id, qid, name, importance, difficulty, '
|
|
'state FROM side_quests WHERE chat_id = ? AND qid = ?')
|
|
cursor.execute(query, (self.CHAT_ID, qid))
|
|
row = cursor.fetchone()
|
|
if row is None:
|
|
return False
|
|
else:
|
|
return side_quest(self.DB, *row)
|
|
|
|
def get_tokens(self):
|
|
cursor = self.DB.cursor()
|
|
query = ('SELECT token FROM tokens WHERE chat_id=?')
|
|
cursor.execute(query, (self.CHAT_ID,))
|
|
tokens = list(map(lambda x: x[0], cursor))
|
|
return tokens
|
|
|
|
def add_token(self):
|
|
cursor = self.DB.cursor()
|
|
token = str(uuid.uuid4())
|
|
query = ('INSERT INTO tokens(chat_id, token) values(?, ?)')
|
|
cursor.execute(query, (self.CHAT_ID, token))
|
|
self.DB.commit()
|
|
return token
|
|
|
|
def delete_token(self, token):
|
|
cursor = self.DB.cursor()
|
|
query = ('DELETE FROM tokens WHERE chat_id = ? AND token = ?')
|
|
cursor.execute(query, (self.CHAT_ID, token))
|
|
self.DB.commit()
|
|
|
|
|
|
def get_player_from_token(db, token):
|
|
cursor = db.cursor()
|
|
query = "SELECT chat_id FROM tokens WHERE token=?"
|
|
cursor.execute(query, (token,))
|
|
chat_id = cursor.fetchone()
|
|
if chat_id is None:
|
|
return False
|
|
else:
|
|
return player(db, chat_id[0])
|