sqliter.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. import sqlite3
  2. from utils import User, Ads, ScheduledMessage
  3. # from loader import logger as log
  4. class Database:
  5. def __init__(self, path_to_db="data/main.db"):
  6. self.path_to_db = path_to_db
  7. @property
  8. def connection(self):
  9. return sqlite3.connect(self.path_to_db)
  10. def execute(self, sql: str, parameters: tuple = None, fetchone=False, fetchall=False, commit=False):
  11. if not parameters:
  12. parameters = tuple()
  13. connection = self.connection
  14. connection.set_trace_callback(logger)
  15. cursor = connection.cursor()
  16. data = None
  17. cursor.execute(sql, parameters)
  18. if commit:
  19. connection.commit()
  20. if fetchone:
  21. data = cursor.fetchone()
  22. if fetchall:
  23. data = cursor.fetchall()
  24. connection.close()
  25. return data
  26. def create_table_(self):
  27. sql = ["""CREATE TABLE Users (
  28. id int NOT NULL,
  29. username varchar(255) NULL,
  30. Name varchar(255) NOT NULL,
  31. PRIMARY KEY(id)
  32. ); """,
  33. """CREATE TABLE "Chats" (
  34. "client_id" INTEGER NOT NULL,
  35. "chat_id" INTEGER NOT NULL,
  36. "require_channel_id" INTEGER NOT NULL
  37. )""",
  38. """CREATE TABLE "stop_words" (
  39. "client_id" INTEGER,
  40. "word" TEXT)""",
  41. """CREATE TABLE "ads" (
  42. "id" INTEGER NOT NULL,
  43. "text" TEXT,
  44. "photo" TEXT DEFAULT NULL,
  45. PRIMARY KEY(id)
  46. )""",
  47. """CREATE TABLE "jobs" (
  48. "message_id" INTEGER NOT NULL,
  49. "chat_id" TEXT DEFAULT NULL,
  50. "text" TEXT
  51. );""", ]
  52. for t in sql:
  53. try:
  54. self.execute(t, commit=True)
  55. except:
  56. pass
  57. def add_client(self, client_id: int, fullname: str, username):
  58. sql = "INSERT INTO Users VALUES(?,?,?);"
  59. parameters = (client_id, fullname, username,)
  60. try:
  61. self.execute(sql, parameters, commit=True)
  62. except sqlite3.IntegrityError:
  63. pass
  64. def get_all_clients(self):
  65. """
  66. return a list of all clients with id, chats, stop_words, require_channel_id
  67. """
  68. users = [c_id[0] for c_id in self.execute("SELECT DISTINCT(id) FROM Users", fetchall=True)]
  69. out = []
  70. for user in users:
  71. stop_words = [i[0] for i in
  72. self.execute("SELECT word from stop_words WHERE client_id=?", (user,), fetchall=True)]
  73. chats = self.execute("SELECT chat_id, require_channel_id from Chats WHERE client_id=?", (user,),
  74. fetchall=True)
  75. require_channel_id = {}
  76. for chat in chats:
  77. require_channel_id[chat[0]] = []
  78. for chat in chats:
  79. if chat[1] != 0:
  80. require_channel_id[chat[0]].append(chat[1])
  81. usr = User(client_id=user, chats_id=[c[0] for c in chats], stop_words=stop_words,
  82. require_channel_id=require_channel_id)
  83. out.append(usr)
  84. return out
  85. def add_word(self, client_id: int, word: str):
  86. sql = "INSERT INTO stop_words VALUES(?,?);"
  87. parameters = (client_id, word,)
  88. self.execute(sql, parameters, commit=True)
  89. def select_all_word(self):
  90. clients = self.execute('SELECT DISTINCT(client_id) FROM stop_words', fetchall=True)
  91. words = {}
  92. for client_id in clients:
  93. sql = "SELECT word FROM stop_words where client_id=?"
  94. word = self.execute(sql, (client_id[0],), fetchall=True)
  95. words[client_id[0]] = [w[0] for w in word]
  96. return words
  97. def select_default_word(self):
  98. sql = "SELECT word FROM stop_words WHERE client_id=0"
  99. return [i[0] for i in self.execute(sql, fetchall=True)]
  100. def add_default_words(self, client_id):
  101. words = self.select_default_word()
  102. for word in words:
  103. self.add_word(client_id, word)
  104. def select_all_word_in_client(self, client_id):
  105. sql = "SELECT * FROM stop_words WHERE client_id=?"
  106. parameters = (client_id,)
  107. return self.execute(sql, parameters, fetchall=True)
  108. def delete_word(self, client_id: int, word: str):
  109. sql = 'DELETE FROM stop_words WHERE client_id=? AND word=?'
  110. return self.execute(sql, parameters=(client_id, word,), commit=True)
  111. @staticmethod
  112. def format_args(sql, parameters: dict):
  113. sql += " AND".join([
  114. f" {item} = ? " for item in parameters
  115. ])
  116. return sql, tuple(parameters.values())
  117. # def add_channel(self, user_id: int, chat_id: int, channel_id: int):
  118. def add_channel(self, client_id: int, chat_id: int, channel_id: int):
  119. sql = "INSERT INTO Chats VALUES(?,?,?);"
  120. parameters = (client_id, chat_id, channel_id,)
  121. self.execute(sql, parameters, commit=True)
  122. def delete_channel(self, client_id, chat_id, channel_id):
  123. sql = 'DELETE FROM Chats WHERE client_id=? AND chat_id = ? AND require_channel_id = ?'
  124. # sql, parameters = self.format_args(sql, kwargs)
  125. # return self.execute(sql, parameters, fetchone=True)
  126. params = (client_id, chat_id, channel_id,)
  127. return self.execute(sql, params, commit=True)
  128. def select_channels_by_user(self, client_id):
  129. sql = f'SELECT DISTINCT(chat_id) FROM Chats WHERE client_id=? AND require_channel_id=0;'
  130. params = (client_id,)
  131. return [i[0] for i in self.execute(sql, params, fetchall=True)]
  132. def select_channels_by_chat(self, client_id, chat_id=None, action='list'):
  133. if action == 'add':
  134. # TODO get chats except for those already assigned
  135. sql = f'SELECT DISTINCT(chat_id) FROM Chats WHERE client_id=? AND require_channel_id=0 OR require_channel_id=2;'
  136. params = (client_id,)
  137. elif action == 'delete':
  138. sql = f'SELECT DISTINCT(require_channel_id) FROM Chats WHERE client_id=? AND chat_id=? AND require_channel_id!=0;'
  139. params = (client_id, chat_id)
  140. elif action == 'list':
  141. sql = f'SELECT DISTINCT(require_channel_id) FROM Chats WHERE client_id=? AND chat_id=? ' \
  142. f'AND require_channel_id!=0 AND require_channel_id!=2;'
  143. params = (client_id, chat_id,)
  144. return [i[0] for i in self.execute(sql, params, fetchall=True)]
  145. def select_all_chats(self):
  146. chats = [i[0] for i in self.execute('SELECT DISTINCT chat_id FROM Chats;', fetchall=True)]
  147. out = {}
  148. return chats
  149. def add_chat(self, client_id, chat_id, chat_type):
  150. '''
  151. type: group chat = 0
  152. group chat with req chat: 1
  153. channels: 2
  154. '''
  155. sql = "INSERT INTO Chats VALUES (?, ?, ?)"
  156. return self.execute(sql, parameters=(client_id, chat_id, chat_type), commit=True)
  157. def add_require_channel(self, client_id, chat_id, req_channel_id):
  158. # sql = "UPDATE Chats SET require_channel_id=? WHERE chat_id=?"
  159. sql = "INSERT INTO Chats VALUES (?,?,?)"
  160. return self.execute(sql, parameters=(client_id, chat_id, req_channel_id,), commit=True)
  161. def delete_require_channel(self, client_id, chat_id, req_channel_id):
  162. # sql = "UPDATE Chats SET require_channel_id=? WHERE chat_id=?"
  163. sql = "DELETE FROM Chats WHERE client_id=? AND chat_id=? AND require_channel_id=?"
  164. return self.execute(sql, parameters=(client_id, chat_id, req_channel_id,), commit=True)
  165. def select_all_ads(self):
  166. chats = [Ads(id=i[0], text=i[1], path_photo=i[2]) for i in self.execute('SELECT * FROM ads;', fetchall=True)]
  167. return chats
  168. def add_ads(self, text, photo=None):
  169. sql = "INSERT INTO ads(text, photo) VALUES (?,?)"
  170. return self.execute(sql, parameters=(text, photo), commit=True)
  171. def delete_ads(self, id: int):
  172. sql = "DELETE FROM ads WHERE id=?"
  173. return self.execute(sql, parameters=(id,), commit=True)
  174. def select_channels_for_ads(self):
  175. sql = f'SELECT DISTINCT(chat_id) FROM Chats WHERE require_channel_id!=2'
  176. # sql = f'SELECT DISTINCT(chat_id) FROM Chats WHERE require_channel_id!=0 AND require_channel_id!=2;'
  177. return [i[0] for i in self.execute(sql, fetchall=True)]
  178. def get_ads(self, id: int):
  179. c = self.execute('SELECT * FROM ads WHERE id=?;', (id,), fetchone=True)
  180. chats = Ads(id=c[0], text=c[1], path_photo=c[2])
  181. return chats
  182. def jobs_add(self, message_id, chat_id, text):
  183. sql = "INSERT INTO jobs VALUES (?,?,?)"
  184. return self.execute(sql, parameters=(message_id, chat_id, text), commit=True)
  185. def jobs_delete(self, message_id, chat_id, text):
  186. message_id = 0 if message_id is None else message_id
  187. sql = "DELETE FROM jobs WHERE message_id=? AND chat_id=? AND text=?"
  188. return self.execute(sql, parameters=(message_id, chat_id, text), commit=True)
  189. def get_jobs(self):
  190. jobs = []
  191. offset = 0
  192. while True:
  193. jobs_list = [ScheduledMessage(
  194. message_id=None if int(i[0]) == 0 else i[0],
  195. chat_id=i[1], text=i[2]
  196. ) for i in
  197. self.execute(f'SELECT * FROM jobs LIMIT 5 OFFSET {offset};', fetchall=True)]
  198. jobs.append(jobs_list)
  199. j = len(jobs_list)
  200. if j < 5 or len(jobs) > 10:
  201. break
  202. offset += 5
  203. return jobs[:10]
  204. def logger(statement):
  205. # log.success(statement)
  206. print(f"""{'=' * 40}\nEXECUTING: {statement}\n{'=' * 40}""")