rpgbot/db.py

138 lines
5.4 KiB
Python

import sqlite3
db_name = 'games.db'
db_version = 1
ROLE_PLAYER = 10
ROLE_MASTER = 20
def open_connection():
return sqlite3.connect(db_name)
def close_connection(db):
db.close()
def table_exists(db, table):
c = db.cursor()
query = c.execute('''SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?''', (table,))
result = query.fetchone()
if result[0] == 0:
return False
else:
return True
def init():
db = open_connection()
try:
print('Initializing database...')
c = db.cursor()
if not table_exists(db, 'Games'):
c.execute('''CREATE TABLE IF NOT EXISTS Games (gameid integer primary key autoincrement, version int, lastactivity datetime, gamename text)''')
if not table_exists(db, 'Groups'):
c.execute('''CREATE TABLE IF NOT EXISTS Groups (gameid integer, groupid integer primary key, groupname text)''')
if not table_exists(db, 'Players'):
c.execute('''CREATE TABLE IF NOT EXISTS Players (gameid integer, playerid integer, role integer, playername text, PRIMARY KEY(gameid, playerid))''')
if not table_exists(db, 'Contents'):
c.execute('''CREATE TABLE IF NOT EXISTS Contents (gameid integer, playerid integer, container text, key text, value text, PRIMARY KEY(gameid, playerid, container, key))''')
except:
print('failed to initialize database')
raise
db.commit()
close_connection(db)
def new_game(db, admin, playername, gamename, groupid, groupname):
c = db.cursor()
query = c.execute('''INSERT INTO Games(version, lastactivity, gamename) VALUES (?, datetime('now'), ?)''', (db_version, gamename,))
gameid = c.lastrowid
query = c.execute('''INSERT INTO Groups(gameid, groupid, groupname) VALUES (?, ?, ?)''', (gameid, groupid, groupname,))
add_player(db, admin, playername, gameid, ROLE_MASTER)
db.commit()
def del_game(db, gameid):
c = db.cursor()
query = c.execute('''DELETE FROM Games WHERE gameid=?''', (gameid,))
query = c.execute('''DELETE FROM Groups WHERE gameid=?''', (gameid,))
query = c.execute('''DELETE FROM Players WHERE gameid=?''', (gameid,))
query = c.execute('''DELETE FROM Contents WHERE gameid=?''', (gameid,))
db.commit()
def add_player(db, userid, username, gameid, role):
c = db.cursor()
query = c.execute('''SELECT role FROM Players WHERE playerid=? AND gameid=?''', (userid, gameid,))
result = query.fetchone()
if result is not None and result[0] >= role:
role = result[0]
query = c.execute('''INSERT OR REPLACE INTO Players(gameid, playerid, role, playername) VALUES (?, ?, ?, ?)''', (gameid, userid, role, username,))
db.commit()
def number_of_games(db, user):
c = db.cursor()
query = c.execute('''SELECT count(*) FROM Players WHERE playerid=?''', (user,))
result = query.fetchone()
return result[0]
def get_game_from_group(db, groupid):
c = db.cursor()
query = c.execute('''SELECT gameid FROM Groups WHERE groupid=?''', (groupid,))
result = query.fetchone()
return result[0]
def get_game_info(db, gameid):
c = db.cursor()
query = c.execute('''SELECT gamename FROM Games WHERE gameid=?''', (gameid,))
result = query.fetchone()
gamename = result[0]
query = c.execute('''SELECT groupname FROM Groups WHERE gameid=?''', (gameid,))
groups = []
for group in query:
groups.append(group[0])
query = c.execute('''SELECT playername FROM Players WHERE gameid=?''', (gameid,))
players = []
for player in query:
players.append(player[0])
return gamename, groups, players
def number_of_items(db, gameid, playerid):
c = db.cursor()
query = c.execute('''SELECT count(*) FROM Contents WHERE gameid=? AND playerid=?''', (gameid, playerid,))
result = query.fetchone()
return result[0]
def update_item(db, gameid, playerid, container, key, change, relative):
c = db.cursor()
query = c.execute('''SELECT value FROM Contents WHERE gameid=? AND playerid=? AND container=? AND key=?''', (gameid, playerid, container, key,))
result = query.fetchone()
if result is None:
oldvalue = 0
else:
oldvalue = int(result[0])
if relative:
newvalue = oldvalue + change
else:
newvalue = change
query = c.execute('''INSERT OR REPLACE INTO Contents(gameid, playerid, container, key, value) VALUES (?, ?, ?, ?, ?)''', (gameid, playerid, container, key, newvalue,))
db.commit()
return oldvalue, newvalue
def delete_item(db, gameid, playerid, container, key):
c = db.cursor()
query = c.execute('''SELECT value FROM Contents WHERE gameid=? AND playerid=? AND container=? AND key=?''', (gameid, playerid, container, key,))
result = query.fetchone()
if result == None:
return None
oldvalue = result[0]
query = c.execute('''DELETE FROM Contents WHERE gameid=? AND playerid=? AND container=? AND key=?''', (gameid, playerid, container, key,))
db.commit()
return oldvalue
def get_items(db, gameid, playerid):
ret = {}
c = db.cursor()
query = c.execute('''SELECT DISTINCT container FROM Contents WHERE gameid=? AND playerid=?''', (gameid, playerid,))
for container in query:
inner = c.execute('''SELECT key, value FROM Contents WHERE gameid=? AND playerid=? AND container=?''', (gameid, playerid, container[0]))
my_list = {}
for item in inner:
my_list[item[0]] = item[1]
ret[container[0]] = my_list
return ret