watbot/osrc/watbot_db.py

144 lines
5.6 KiB
Python

#!/usr/bin/python
import sqlite3
import time
class WatbotDB:
"""watbot database abstraction"""
def __init__(self, config):
self.config = config
self.currency = config["currency"]
self.conn = sqlite3.connect(self.currency + ".db")
self.c = self.conn.cursor()
self.c.execute("create table if not exists players ("
" nickname varchar(256),"
" watting integer,"
" anarchy integer, "
" trickery integer, "
" coins integer, "
" health integer, "
" last_mine integer, "
" last_rest integer, "
" primary key(nickname)"
")"
)
self.c.execute("create table if not exists ledger ("
" nickname varchar(256),"
" timestamp integer,"
" balance integer,"
" log text,"
" foreign key(nickname) references players(nickname)"
")"
)
self.c.execute("create table if not exists items ("
" itemname varchar(256),"
" nickname varchar(256),"
" price integer,"
" primary key(itemname),"
" foreign key(nickname) references players(nickname)"
")"
)
self.c.execute("create table if not exists inventory ("
" nickname varchar(256),"
" itemname varchar(256),"
" count integer,"
" foreign key(nickname) references players(nickname),"
" foreign key(itemname) references items(itemname)"
")"
)
self.conn.commit()
def get_account(self,nick):
self.c.execute("select watting, anarchy, trickery, coins, last_mine, health, last_rest from players where nickname=?", (nick.lower(),))
data = self.c.fetchone()
if data is None:
earlier = time.time() - ( 24 * 3600 + 1)
self.c.execute("insert into players(nickname, watting, anarchy, trickery, coins, last_mine, health, last_rest) values(?, 0, 0, 0, 0, ?, 100, ?)", (nick.lower(), earlier, earlier))
self.c.execute("insert into ledger(nickname, timestamp, balance, log) values(?, ?, ?, ?)", (nick.lower(), earlier, 0, "created"))
self.conn.commit()
data = (0, 0, 0, 0, earlier, 100, earlier)
return data
def update_account(self, nick, watting, anarchy, trickery, coins, last_mine, health, last_rest, log):
now = time.time()
self.c.execute("update players set watting=?, anarchy=?, trickery=?, coins=?, last_mine=?, health=?, last_rest=? where nickname=?", (watting, anarchy, trickery, coins, last_mine, health, last_rest, nick.lower()))
self.c.execute("insert into ledger(nickname, timestamp, balance, log) values(?, ?, ?, ?)", (nick.lower(), now, coins, log))
if not log is None:
print "log: " + log
self.conn.commit()
def close(self):
self.conn.close()
def topten(self):
out = ""
self.c.execute("select nickname, coins from players order by coins desc limit 10")
while True:
d = self.c.fetchone()
if d == None:
break
out += d[0] + "(" + str(d[1]) + ") "
return out
def items(self):
out = ""
self.c.execute("select itemname, nickname, price from items order by itemname")
while True:
d = self.c.fetchone()
if d == None:
break
out += d[0] + "(" + d[1] + ", " + str(d[2]) + ") "
return out
def invent_item(self, itemname, nickname, price):
try:
self.c.execute("insert into items(itemname, nickname, price) values(?, ?, ?)", (itemname.lower(), nickname.lower(), price))
self.conn.commit()
return True
except:
return False
def inventory(self, nickname):
out = ""
self.c.execute("select itemname, count from inventory where nickname = ? order by itemname", (nickname.lower(),))
while True:
d = self.c.fetchone()
if d == None:
break
out += d[0] + "(" + str(d[1]) + ") "
return out
def get_item(self, itemname):
self.c.execute("select itemname, nickname, price from items where itemname = ?", (itemname.lower(),))
return self.c.fetchone()
def get_item_count(self, nickname, itemname):
self.c.execute("select count from inventory where nickname = ? and itemname = ?", (nickname.lower(), itemname.lower()))
d = self.c.fetchone()
if d == None:
return 0
else:
return d[0]
def set_item_count(self, nickname, itemname, count):
if count == 0:
self.c.execute("delete from inventory where nickname = ? and itemname = ?", (nickname.lower(), itemname.lower()))
else:
if self.get_item_count(nickname, itemname) != 0:
self.c.execute("update inventory set count=? where nickname = ? and itemname = ?", (count, nickname.lower(), itemname.lower()))
else:
self.c.execute("insert into inventory(nickname, itemname, count) values(?, ?, ?)", (nickname.lower(), itemname.lower(), count))
self.conn.commit()