Files
WorldCraft_Discord_Bot/data/DatabaseConnection.py

158 lines
5.7 KiB
Python
Executable File

import mysql.connector
class WrongMinecraftName(Exception):
pass
class SQLInsertError(Exception):
pass
class UnLinkError(Exception):
pass
class PlayerNotLinked(Exception):
pass
class QuestionNotFound(Exception):
pass
class DatabaseConnection:
# databases -> worldcraft and worldcraft_discord
def __init__(self, database="worldcraft_discord"):
if database == "worldcraft_discord":
self.mydb = mysql.connector.connect(
host="192.168.1.251",
user="worldcraft_discord",
password="aquev5vcwhLwTdRt",
database=database
)
elif database == "s13_worldcraft":
self.mydb = mysql.connector.connect(
host="192.168.1.251",
user="u13_f2zpWZpIKY",
password="@fZQ6Uu3+U^WH1i2JNemgTC7",
database=database
)
self.cursor = self.mydb.cursor()
def get_db(self):
return self.mydb
def get_cursor(self):
return self.cursor
def close(self):
self.mydb.close()
class QuizDB:
def __init__(self):
self.tablename = "questions"
self.discorddbconn = DatabaseConnection(database="worldcraft_discord")
cursor = self.discorddbconn.get_cursor()
cursor.execute("create table IF NOT EXISTS {} (id int NOT NULL PRIMARY KEY AUTO_INCREMENT, question text NOT NULL, answer text NOT NULL, asked int DEFAULT 0)".format(self.tablename))
def add_question(self, question, answer):
cursor = self.discorddbconn.get_cursor()
sql = "insert into {} (question, answer) VALUES (%s, %s)".format(self.tablename)
val = (question, answer)
try:
cursor.execute(sql, val)
self.discorddbconn.get_db().commit()
return cursor.lastrowid
except:
raise SQLInsertError()
def rm_question(self, id):
cursor = self.discorddbconn.get_cursor()
cursor.execute("select count(*) from {} where id='{}'".format(self.tablename, str(id)))
res = cursor.fetchone()
if count_questions == 1:
sql = f"DELETE FROM {self.tablename} WHERE id = '{str(id)}'"
cursor.execute(sql)
res = self.discorddbconn.get_db().commit()
else:
raise QuestionNotFound()
def get_questions(self):
cursor = self.discorddbconn.get_cursor()
sql = f"SELECT * FROM {self.tablename}"
cursor.execute(sql)
return list(cursor.fetchall())
def count_questions(self):
cursor = self.discorddbconn.get_cursor()
cursor.execute("select count(*) from {}".format(self.tablename))
res = cursor.fetchone()
return res[0]
def get_random_question(self):
if self.count_questions != 0:
cursor = self.discorddbconn.get_cursor()
sql = f"SELECT * FROM {self.tablename} ORDER BY RAND() LIMIT 1"
cursor.execute(sql)
return list(cursor.fetchone())
else:
raise QuestionNotFound()
def close(self):
self.discorddbconn.close()
# this will save the uuid of the player and discord id
class PlayerDBLinker:
def __init__(self):
self.tablename = "playerlinks"
self.discorddbconn = DatabaseConnection(database="worldcraft_discord")
self.serverdbconn = DatabaseConnection(database="s13_worldcraft")
# check if table exists
cursor = self.discorddbconn.get_cursor()
cursor.execute("create table IF NOT EXISTS {} (id int NOT NULL PRIMARY KEY AUTO_INCREMENT, minecraftUUID varchar(36) NOT NULL, discordid TINYTEXT NOT NULL)".format(self.tablename))
def checkPlayerLink(self, minecraftUUID, discordid):
cursor = self.discorddbconn.get_cursor()
cursor.execute("select count(*) from {} where minecraftUUID='{}' AND discordid='{}'".format(self.tablename, minecraftUUID, discordid))
res = cursor.fetchone()
return res[0] == 1
def minecraftUUIDused(self, minecraftUUID):
cursor = self.discorddbconn.get_cursor()
cursor.execute("select count(*) from {} where minecraftUUID='{}'".format(self.tablename, minecraftUUID))
res = cursor.fetchone()
return res[0] >= 1
def discordidused(self, discordid):
cursor = self.discorddbconn.get_cursor()
cursor.execute("select count(*) from {} where discordid='{}'".format(self.tablename, discordid))
res = cursor.fetchone()
return res[0] >= 1
def linkPlayer(self, minecraftUUID, discordid):
cursor = self.discorddbconn.get_cursor()
sql = "insert into {} (minecraftUUID, discordid) VALUES (%s, %s)".format(self.tablename)
val = (minecraftUUID, discordid)
try:
cursor.execute(sql, val)
self.discorddbconn.get_db().commit()
except:
raise SQLInsertError()
def unlinkPlayer(self, minecraftname, discordid):
# get uuid from server database -> check if in linkerdatabase
serverdb_cursor = self.serverdbconn.get_cursor()
discorddb_cursor = self.discorddbconn.get_cursor()
sql = "SELECT playerUUID FROM playerprofiles WHERE playerName = '{}' LIMIT 1".format(minecraftname)
serverdb_cursor.execute(sql)
res = serverdb_cursor.fetchone()
if res == None:
raise WrongMinecraftName()
playeruuid = res[0]
if self.checkPlayerLink(playeruuid, discordid):
sql2 = f"DELETE FROM {self.tablename} WHERE minecraftUUID = '{playeruuid}' AND discordid = '{discordid}'"
discorddb_cursor.execute(sql2)
res2 = self.discorddbconn.get_db().commit()
else:
raise PlayerNotLinked()
def closeconnections(self):
self.discorddbconn.close()
self.serverdbconn.close()