Files
conf_bot/database.py

230 lines
7.1 KiB
Python
Raw Permalink Normal View History

2018-02-04 07:13:09 +03:00
import datetime as dt
2018-08-03 15:15:35 +03:00
2018-02-04 07:13:09 +03:00
class DataBase:
def __init__(self, basefile, scheme):
import sqlite3
2018-02-26 19:13:04 +01:00
self.scheme = ''
2018-02-04 07:13:09 +03:00
try:
self.conn = sqlite3.connect(basefile, check_same_thread=False)
except:
print('Could not connect to DataBase.')
return None
with open(scheme, 'r') as scheme_sql:
sql = scheme_sql.read()
2018-02-26 19:13:04 +01:00
self.scheme = sql
2018-02-04 07:13:09 +03:00
if self.conn is not None:
try:
cursor = self.conn.cursor()
cursor.executescript(sql)
except:
print('Could not create scheme.')
else:
print("Error! cannot create the database connection.")
print('DB created.')
def execute(self, sql):
cursor = self.conn.cursor()
cursor.execute(sql)
self.conn.commit()
return cursor.fetchall()
def save_word(self, word):
sql = "INSERT OR IGNORE INTO word('word') VALUES ('%s')" % word
self.execute(sql)
sql = "SELECT id FROM word WHERE word = '%s'" % word
return(self.execute(sql)[0][0])
2018-11-30 17:04:25 +03:00
def get_alert(self):
now = dt.datetime.now().strftime("%H%M")
sql = "SELECT * FROM alert WHERE time = '%s'" % now
alerts = self.execute(sql)
sql = "DELETE FROM alert WHERE time = '%s'" % now
self.execute(sql)
return alerts
2018-02-04 07:13:09 +03:00
def add_user(self,
2018-08-03 15:15:35 +03:00
username,
user_id,
first_name,
last_name):
2018-02-04 07:13:09 +03:00
date = int(dt.datetime.now().strftime("%s"))
try:
sql = """
UPDATE user
SET
username = '%s',
first_name = '%s',
last_name = '%s'
WHERE
id = '%s'
""" % (
username,
first_name,
last_name,
user_id
)
self.execute(sql)
except:
pass
2018-02-04 07:13:09 +03:00
sql = """INSERT OR IGNORE INTO
user('id', 'username', 'first_name', 'last_name', 'date')
VALUES ('%s','%s','%s','%s','%s')""" % (
user_id,
username,
first_name,
last_name,
date
)
self.execute(sql)
def add_conf(self, id, title):
date = int(dt.datetime.now().strftime("%s"))
sql = """INSERT OR IGNORE INTO
conf('id', 'title', 'date')
VALUES ('%s','%s','%s')""" % (
id,
title,
date
)
self.execute(sql)
2019-01-09 23:18:19 +03:00
def add_relation(self, word, user_id, conf_id, text):
2018-02-04 07:13:09 +03:00
word_id = self.save_word(word)
date = int(dt.datetime.now().strftime("%s"))
2019-01-09 23:18:19 +03:00
sql2 = "INSERT OR IGNORE INTO xxx_message('text') VALUES ('%s')" % text
self.execute(sql2)
sql3 = "SELECT id FROM `xxx_message` WHERE text = '%s'" % text
msg_id = self.execute(sql3)[0][0]
2018-02-04 07:13:09 +03:00
sql = """INSERT OR IGNORE INTO
2019-01-09 23:18:19 +03:00
relations('word_id', 'user_id', 'conf_id', 'msg_id', 'date')
VALUES ('%s','%s','%s','%s', '%s')""" % (
2018-02-04 07:13:09 +03:00
word_id,
user_id,
conf_id,
2019-01-09 23:18:19 +03:00
msg_id,
2018-02-04 07:13:09 +03:00
date
)
self.execute(sql)
2018-08-03 15:15:35 +03:00
2018-11-30 17:04:25 +03:00
def add_alert(self, user_id, conf_id, alert_time, message):
date = int(dt.datetime.now().strftime("%s"))
2019-05-17 14:21:38 +03:00
print(alert_time)
if alert_time[0] == '+':
2019-01-26 14:31:01 +03:00
alert_time = (dt.datetime.now() + dt.timedelta(minutes=int(alert_time[1:]))).strftime("%H%M")
2018-11-30 17:04:25 +03:00
sql = """INSERT OR IGNORE INTO
alert('conf_id', 'user_id', 'created', 'time', 'message')
VALUES ('%s','%s','%s','%s','%s')""" % (
conf_id,
user_id,
date,
alert_time,
message
)
self.execute(sql)
2018-02-04 07:13:09 +03:00
def get_top(self, user_id, conf_id, limit=10):
2018-08-03 15:15:35 +03:00
sql = """
2018-02-04 07:13:09 +03:00
SELECT w.word, COUNT(*) as count FROM relations r
LEFT JOIN word w ON w.id = r.word_id
LEFT JOIN `user` u ON u.id = r.user_id
WHERE u.id = '%s' AND
2018-02-19 18:24:38 +03:00
r.conf_id = '%s' AND
2018-02-20 18:05:49 +03:00
r.id > (
SELECT IFNULL(MAX(relation_id), 0) FROM reset WHERE user_id = '%s' AND conf_id = '%s'
)
2018-02-04 07:13:09 +03:00
GROUP BY w.word
ORDER BY count DESC
LIMIT %s
""" % (
user_id,
conf_id,
2018-02-19 18:24:38 +03:00
user_id,
2018-02-20 16:17:00 +01:00
conf_id,
2018-02-04 07:13:09 +03:00
limit
)
result = self.execute(sql)
return(result)
2018-11-30 17:04:25 +03:00
def all_conf_users(self, conf_id):
sql = """
2019-01-10 23:05:54 +03:00
SELECT DISTINCT(u.username), u.first_name, u.id FROM relations r
2018-11-30 17:04:25 +03:00
LEFT JOIN user u
ON u.id = r.user_id
LEFT JOIN conf c
ON r.conf_id = c.id
WHERE c.id = '%s'
""" % (
conf_id
)
result = self.execute(sql)
return(result)
2018-12-28 18:52:37 +03:00
def get_random_word(self, count=1, like="%"):
sql = "SELECT word FROM word WHERE word LIKE '%s' ORDER BY random() LIMIT %s" % (like, count)
2020-02-07 17:24:10 +03:00
result = self.execute(sql)
return(result)
2020-02-28 09:53:00 +00:00
def get_random_message(self, conf_id=None, count=1):
if not conf_id:
2020-02-28 10:00:56 +00:00
print('get random message from all DB, count %s' % count)
2020-02-28 09:53:00 +00:00
sql = "SELECT text FROM xxx_message ORDER BY RANDOM() LIMIT %s" % count
else:
2020-02-28 10:00:56 +00:00
print('get random message from %s, count: %s' % (conf_id, count))
2020-02-28 09:53:00 +00:00
sql = """SELECT x.text FROM xxx_message x LEFT JOIN relations r ON r.msg_id == x.id
2020-02-28 10:00:56 +00:00
WHERE r.conf_id = '%s' ORDER BY RANDOM() DESC LIMIT %s""" % (conf_id, count)
2018-12-26 16:59:07 +03:00
result = self.execute(sql)
2020-02-28 10:00:56 +00:00
messages = list()
for msg in result:
messages.append(msg[0])
return(messages)
2018-12-26 16:59:07 +03:00
2018-02-19 17:22:55 +03:00
def here(self, user_id, conf_id):
2018-08-03 15:15:35 +03:00
sql = """
SELECT DISTINCT(u.username), u.id, u.first_name FROM relations r
2018-02-19 18:24:38 +03:00
LEFT JOIN user u
ON u.id = r.user_id
LEFT JOIN conf c
ON r.conf_id = c.id
WHERE c.id = '%s' and
2018-02-19 17:22:55 +03:00
u.id != '%s'
""" % (
conf_id,
user_id
)
result = self.execute(sql)
return(result)
2018-02-20 18:05:49 +03:00
def reset(self, user_id, conf_id):
date = int(dt.datetime.now().strftime("%s"))
sql = """
INSERT OR IGNORE INTO reset (user_id, conf_id, date, relation_id)
VALUES ('%s', '%s', '%s', (SELECT MAX(rowid) FROM relations));
""" % (
user_id,
conf_id,
date
)
result = self.execute(sql)
return(result)
2018-02-19 18:24:38 +03:00
2018-02-26 15:50:32 +01:00
def command(self, sql):
if 'DELETE' in sql.upper() \
2018-08-03 15:15:35 +03:00
or 'INSERT' in sql.upper() \
or 'UPDATE' in sql.upper() \
or 'DROP' in sql.upper() \
or 'CREATE' in sql.upper() \
or 'ALTER' in sql.upper():
2018-02-26 15:50:32 +01:00
return('gtfo')
try:
if 'LIMIT' in sql.upper()[-9:]:
2018-08-03 15:15:35 +03:00
result = self.execute(sql)
2018-02-26 15:50:32 +01:00
else:
2018-08-03 15:15:35 +03:00
result = self.execute(sql + ' limit 20')
2018-02-26 15:50:32 +01:00
except Exception as err:
result = err
return(result)
2018-08-03 15:15:35 +03:00
2018-02-04 07:13:09 +03:00
def close(self):
2018-02-20 16:17:00 +01:00
self.conn.close()