Files
WLUS/DBHandlers.py
2018-05-19 20:18:01 -04:00

514 lines
15 KiB
Python

import sqlite3
from Packet import *
from random import randint
from passlib.hash import sha256_crypt
def DBServerStarup():
conn = sqlite3.connect("server.sqlite")
c = conn.cursor()
c.execute("DELETE FROM CurrentSessions")
c.execute("DELETE FROM World_Objects WHERE LOT = 1")
c.execute("DELETE FROM Worlds")
conn.commit()
conn.close()
print("Reset Sessions Table")
class databaseManager():
def __init__(self):
self.serverConn = sqlite3.connect("server.sqlite", check_same_thread=False)
self.cdConn = sqlite3.connect("cdclient.sqlite", check_same_thread=False)
def getLoginResponse(self, username, password):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Banned, Password FROM Accounts WHERE Username = '"+str(username)+"'")
q = c.fetchone()
if(q != None and q[0] != 1 and sha256_crypt.verify(password, q[1])):
return LegoPackets.LOGIN_SUCCESS
elif(q == None and not sha256_crypt.verify(q[1], password)):
return LegoPackets.LOGIN_WRONG_INFO
else:
return LegoPackets.LOGIN_BANNED
def registerAccount(self, username, password):
crypted_pass = sha256_crypt.encrypt(password)
conn = self.serverConn
c = conn.cursor()
c.execute("INSERT INTO Accounts (Username, Password, Banned, IsAdmin) VALUES ('"+str(username)+"', '"+str(crypted_pass)+"', 0, 0)")
try:
conn.commit()
except:
pass
def getAccountByUsername(self, username):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM Accounts WHERE Username = '"+str(username)+"'")
q = c.fetchone()
return q
def getAccountByAccountID(self, account):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM Accounts WHERE ID = '"+str(account)+"'")
q = c.fetchone()
return q
def serverQuery(self, q):
conn = self.serverConn
c = conn.cursor()
returnVal = c.execute(q)
try:
conn.commit()
except:
pass
return returnVal
#State is either 0 (Still Loading In), 1 (In character selection) or 2 (In game)
def getPlayerNameFromConnection(self, ip, port):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT CharID FROM CurrentSessions WHERE IPAddress = '"+str(ip)+"' AND Port = " + str(port))
id = c.fetchone()
c.execute("SELECT Name FROM Characters WHERE ObjectID = " + str(id[0]))
name = c.fetchone()
return name
def getZoneOfObject(self, objectID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Zone FROM World_Objects WHERE ObjectID = "+str(objectID))
zone = c.fetchone()
return zone
def getObjectIDFromName(self, Name):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT ObjectID FROM Characters WHERE Name = '"+str(Name)+"'")
q = c.fetchone()
return q
def getComponentsForLOT(self, LOT):
conn = self.cdConn
c = conn.cursor()
c.execute("SELECT component_type FROM ComponentsRegistry WHERE id = " + str(LOT))
q = c.fetchall()
return q
def getConnectionsInZone(self, zoneID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT IPAddress, Port FROM CurrentSessions WHERE ZoneID = "+str(zoneID))
connections = c.fetchall()
return connections
def registerSession(self, address, userkey, accountID, state, Port):
conn = self.serverConn
c = conn.cursor()
if(self.getSessionByAccountID(accountID) == None):
c.execute("INSERT INTO CurrentSessions (AccountID, IPAddress, UserKey, charID, zoneID, State, Port) VALUES ("+str(accountID)+", '"+str(address)+"', '"+str(userkey)+"', NULL, NULL, "+str(state)+", "+str(Port)+")")
try:
conn.commit()
except:
pass
print("Registered Session")
def getSessionByUserKey(self, userKey):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM CurrentSessions WHERE UserKey = '"+str(userKey)+"'")
q = c.fetchone()
return q
def getApplicableMission(self, offerer, currentMissions, completedMissions):
conn = self.cdConn
c = conn.cursor()
c.execute("SELECT id FROM Missions WHERE target_objectID = "+str(offerer))
finishMissions = c.fetchall()
for mission in finishMissions:
if(mission[0] in currentMissions):
return int(mission[0])
c.execute("SELECT id, prereqMissionID FROM Missions WHERE offer_objectID = "+str(offerer))
missions = c.fetchall()
for mission in missions:
display = True
required = str(mission[1]).split("|")
try:
for neededMission in required:
if(int(neededMission) not in completedMissions):
display = False
except:
pass
if(display == True):
return int(mission[0])
return None
def destroySessionWithUserKey(self, userKey):
conn = self.serverConn
c = conn.cursor()
c.execute("DELETE FROM CurrentSessions WHERE UserKey = '"+str(userKey)+"'")
try:
conn.commit()
except:
pass
print("Destroyed Session")
def destroySessionWithAddress(self, address):
conn = self.serverConn
c = conn.cursor()
c.execute("DELETE FROM CurrentSessions WHERE IPAddress = '"+str(address)+"'")
try:
conn.commit()
except:
pass
print("Destroyed Session")
def registerOrJoinWorld(self, zoneID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM Worlds WHERE Zone = '" + str(zoneID) + "'")
if(c.fetchone() == None):
c.execute("INSERT INTO Worlds (Zone, OwnerID, Name) VALUES ("+str(zoneID)+", NULL, NULL)")
try:
conn.commit()
except:
pass
def updateCharacterZone(self, zoneID, characterID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT AccountID FROM Characters WHERE ObjectID = " + str(characterID))
accountID = c.fetchone()
c.execute("UPDATE CurrentSessions SET charID = "+str(characterID)+", zoneID = "+str(zoneID)+" WHERE AccountID = " + str(accountID[0]))
c.execute("UPDATE Characters SET LastZone = " + str(zoneID) + " WHERE AccountID = " + str(accountID[0]) + " AND ObjectID = " + str(characterID))
try:
conn.commit()
except:
pass
def setCharacterLoc(self, charID, x, y, z, xR, yR, zR, wR):
conn = self.serverConn
c = conn.cursor()
c.execute("UPDATE Characters SET XPos = "+str(x)+", YPos = "+str(y)+", ZPos = "+str(z)+", XRot = "+str(xR)+", YRot = "+str(yR)+", ZRot = "+str(zR)+", WRot = "+str(wR)+" WHERE ObjectID = "+str(charID))
try:
conn.commit()
except:
pass
def addCurrentMission(self, charID, missionID):
conn = self.serverConn
c = conn.cursor()
c.execute("INSERT INTO CurrentMissions (MissionID, CharacterID, Status) Values ("+str(charID)+", "+str(missionID)+", 0)")
try:
conn.commit()
except:
pass
def getEquippedItems(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Object FROM Inventory WHERE Owner = "+str(charID)+" AND Equipped = 1")
equipped = c.fetchall()
return equipped
def getCharacterItems(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Object FROM Inventory WHERE Owner = "+str(charID))
items = c.fetchall()
return items
def getCompletedMissions(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT MissionID FROM CompletedMissions WHERE CharID = " + str(charID))
missions = c.fetchall()
return missions
def getCurrentMissions(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT MissionID FROM CurrentMissions WHERE CharacterID = " + str(charID))
missions = c.fetchall()
return missions
def getItemInfo(self, objID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Quantity, Slot FROM Inventory WHERE Object = " + str(objID))
info = c.fetchone()
return info
def getInventoryInfo(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Object, Quantity, Slot, Linked, SpawnerID FROM Inventory WHERE Owner = " + str(charID))
items = c.fetchall()
LOT = []
SLOT = []
OBJECT = []
QUANTITY = []
SPAWNERID = []
LINKED = []
for item in items:
c.execute("SELECT LOT FROM Objects WHERE ObjectID = "+str(item[0]))
object = c.fetchone()
LOT.append(object)
OBJECT.append(item[0])
SLOT.append(item[2])
QUANTITY.append(item[1])
SPAWNERID.append(item[4])
LINKED.append(item[3])
return LOT, OBJECT, QUANTITY, LINKED, SPAWNERID, SLOT
def getLOTFromObject(self, objectID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT LOT FROM Objects WHERE ObjectID = "+str(objectID))
item = c.fetchone()
return item
def getSessionByAccountID(self, accountID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM CurrentSessions WHERE AccountID = '"+str(accountID)+"'")
q = c.fetchone()
return q
def deleteCharacter(self, objID):
conn = self.serverConn
c = conn.cursor()
c.execute("DELETE FROM Characters WHERE ObjectID = "+str(objID))
c.execute("DELETE FROM Inventory WHERE Owner = " + str(objID))
try:
conn.commit()
except:
pass
print("Deleted Character")
def getCharacterDataByID(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM Characters WHERE ObjectID = '"+str(charID)+"'")
q = c.fetchone()
return q
def getCharacterData(self, accountID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM Characters WHERE AccountID = '"+str(accountID)+"'")
q = c.fetchall()
return len(q), q
def getMissionTaskType(self, missionID):
conn = self.cdConn
c = conn.cursor()
c.execute("SELECT taskType FROM MissionTasks WHERE id = " + str(missionID))
q = c.fetchall()
return q
def findOpenInventorySlot(self, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT BackpackSpace FROM Characters WHERE ObjectID = "+str(charID))
backpack = c.fetchone()
openSlots = []
for i in range(backpack[0]):
openSlots.append(i)
c.execute("SELECT Slot FROM Inventory WHERE Owner = "+str(charID))
takenSlots = c.fetchall()
for row in takenSlots:
openSlots.remove(row[0])
if(openSlots == []):
return None
return openSlots[0]
def addItemsToInventory(self, charID, LOT, Quantity, slot=None, Linked=0, Equipped=0):
conn = self.serverConn
c = conn.cursor()
itemSlot = 0
if(slot != None):
itemSlot = slot
else:
itemSlot = self.findOpenInventorySlot(charID)
if(itemSlot == None):
return "Inventory Full"
object = self.createObject(LOT)
c.execute("INSERT INTO Inventory (Owner, Object, Quantity, Slot, Linked, Equipped) VALUES ("+str(charID)+", "+str(object)+", "+str(Quantity)+", "+str(itemSlot)+", "+str(Linked)+", "+str(Equipped)+")")
try:
conn.commit()
except:
pass
def createObject(self, LOT):
conn = self.serverConn
objID = str(randint(100000000000000000, 999999999999999999))
c = conn.cursor()
c.execute("INSERT INTO Objects (ObjectID, LOT, SpawnID) VALUES ("+str(objID)+", "+str(LOT)+", NULL)")
try:
conn.commit()
except:
pass
return objID
def createMinifigure(self, AccountID, Name, ShirtColor, ShirtStyle, PantsColor, HairStyle, HairColor, lh, rh, Eyebrows, Eyes, Mouth):
conn = self.serverConn
objID = str(randint(100000000000000000,999999999999999999))
username = Name
if(Name == ""):
username = objID
c = conn.cursor()
c.execute("INSERT INTO Characters (AccountID, Name, ObjectID, ShirtColor, ShirtStyle, PantsColor, HairStyle, HairColor, lh, rh, Eyebrows, Eyes, Mouth, LastZone, MapInstance, MapClone, Level, Currency, isAlive, UScore, BackpackSpace, MaxHealth, Health, MaxArmor, Armor, MaxImagination, Imagination, XRot, YRot, ZRot, WRot) VALUES ("+str(AccountID)+", '"+str(username)+"', "+str(objID)+", "+str(ShirtColor)+", "+str(ShirtStyle)+", "+str(PantsColor)+", "+str(HairStyle)+", "+str(HairColor)+", "+str(lh)+", "+str(rh)+", "+str(Eyebrows)+", "+str(Eyes)+", "+str(Mouth)+", 0, 0, 0, 1, 0, 1, 0, 20, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0 )")
try:
conn.commit()
except:
pass
pantsObj = self.createObject(getPantsID(int(PantsColor)))
shirtObj = self.createObject(getShirtID(int(ShirtColor), int(ShirtStyle)))
self.addItemsToInventory(objID, pantsObj, 1, slot=2, Linked=1, Equipped=1)
self.addItemsToInventory(objID, shirtObj, 1, slot=1, Linked=1, Equipped=1)
print("Created Minifigure " + username)
def getSessionBySessionID(self, sessionID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM CurrentSessions WHERE SessionID = '"+str(sessionID)+"'")
q = c.fetchone()
return q
def getSessionByAddress(self, address):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM CurrentSessions WHERE IPAddress = '"+str(address)+"'")
q = c.fetchone()
return q
def getSessionByCharacter(self, objectID):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM CurrentSessions WHERE CharID = '"+str(objectID)+"'")
q = c.fetchone()
return q
def getSessionByPlayerName(self, name):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT ObjectID FROM Characters WHERE Name = '"+str(name)+"'")
id = c.fetchone()
return self.getSessionByCharacter(id[0])
def updateSessionByUserKey(self, userkey, state, zoneID, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("UPDATE CurrentSessions SET charID = "+str(charID)+", zoneID = "+str(zoneID)+", State = "+str(state)+" WHERE UserKey = '"+str(userkey)+"'")
try:
conn.commit()
except:
pass
def updateSessionByAccountID(self, accountID, state, zoneID, charID):
conn = self.serverConn
c = conn.cursor()
c.execute("UPDATE CurrentSessions SET charID = "+str(charID)+", zoneID = "+str(zoneID)+", State = "+str(state)+" WHERE AccountID = "+str(accountID))
try:
conn.commit()
except:
pass
def registerWorldObject(self, Name, LOT, ObjectID, Zone, posX, posY, posZ, rotX, rotY, rotZ, rotW, networkID):
conn = self.serverConn
c = conn.cursor()
c.execute(
"INSERT INTO World_Objects (Name, LOT, ObjectID, Zone, posX, posY, posZ, rotX, rotY, rotZ, rotw, NetworkID) VALUES ('"+str(Name)+"', "+str(LOT)+", "+str(ObjectID)+", "+str(Zone)+", "+str(posX)+", "+str(posY)+", "+str(posZ)+", "+str(rotX)+", "+str(rotY)+", "+str(rotZ)+", "+str(rotW)+", "+str(networkID)+")")
try:
conn.commit()
except:
pass
def getCharactersInGame(self):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT Name, ObjectID FROM World_Objects WHERE LOT = 1")
players = c.fetchall()
return players
def deleteWorldObject(self, ObjectID):
conn = self.serverConn
c = conn.cursor()
c.execute("DELETE FROM World_Objects WHERE ObjectID = " + str(ObjectID))
try:
conn.commit()
except:
pass
def getObjectsInZone(self, Zone):
conn = self.serverConn
c = conn.cursor()
c.execute("SELECT * FROM World_Objects WHERE Zone = " + str(Zone))
objects = c.fetchall()
return objects
def getObjectType(self, LOT):
conn = self.cdConn
c = conn.cursor()
c.execute("SELECT type FROM Objects WHERE id = " + str(LOT))
q = c.fetchone()
return q
def updateWorldObject(self, ObjectID, posX, posY, posZ, rotX, rotY, rotZ, rotW):
conn = self.serverConn
c = conn.cursor()
c.execute("UPDATE World_Objects SET posX = " + str(posX) + ", posY = " + str(posY) + ", posZ = " + str(posZ) + ", rotX = " + str(rotX) + ", rotY = " + str(rotY) + ", rotZ = " + str(rotZ) + ", rotW = " + str(rotW) + " WHERE ObjectID = " + str(ObjectID))
try:
conn.commit()
except:
pass