From 60d33887d65e29093a687421d882c58ffc113625 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 22 Apr 2023 18:17:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B8=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/profile.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ bot_modules/start.py | 56 +++++++++++++++++++++++++++++++ bot_modules/user.py | 77 ------------------------------------------ bot_sys/bot_bd.py | 31 ++++++++--------- bot_sys/keyboard.py | 15 +++++++++ bot_sys/user_bd.py | 29 ---------------- main.py | 20 ++++++++--- 7 files changed, 191 insertions(+), 128 deletions(-) create mode 100644 bot_modules/profile.py create mode 100644 bot_modules/start.py delete mode 100644 bot_modules/user.py create mode 100644 bot_sys/keyboard.py delete mode 100644 bot_sys/user_bd.py diff --git a/bot_modules/profile.py b/bot_modules/profile.py new file mode 100644 index 0000000..a8e84fb --- /dev/null +++ b/bot_modules/profile.py @@ -0,0 +1,91 @@ +# -*- coding: utf8 -*- +# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) + +# Профиль пользователя + +from bot_sys import bot_bd, log, config, keyboard +from bot_modules import start +from aiogram import Bot, types + +import sqlite3 + +from aiogram.dispatcher import Dispatcher + +bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode=types.ParseMode.HTML) + +# --------------------------------------------------------- +# БД +init_bd_cmd = """CREATE TABLE IF NOT EXISTS users( + user_id INTEGER, + userName TEXT, + UNIQUE(user_id) +);""" + +# --------------------------------------------------------- +# Сообщения + +profile_message = ''' +Профиль: + +ID: @user_id +Имя: @user_name +''' + +user_profile_button_name = "📰 Профиль" + +# --------------------------------------------------------- +# Работа с кнопками + +def GetProfileKeyboardButtons(a_UserAccess): + start_button_names = start.GetButtonNames(a_UserAccess) + return keyboard.MakeKeyboard([start_button_names]) + +# --------------------------------------------------------- +# Обработка сообщений + +# Отображение профиля пользователя +async def ProfileOpen(a_Message): + user_id = str(a_Message.from_user.id) + user_info = GetUserInfo(user_id) + msg = profile_message + if not user_info is None: + msg = msg.replace('@user_id', str(user_info[0])).replace('@user_name', str(user_info[1])) + await bot.send_message(user_id, msg, reply_markup = GetProfileKeyboardButtons(None)) + +# --------------------------------------------------------- +# Работа с базой данных пользователей + +# Добавление пользователя, если он уже есть, то игнорируем +def AddUser(a_UserID, a_UserName): + db = sqlite3.connect(bot_bd.GetBDFileName()) + cursor = db.cursor() + cursor.execute("INSERT OR IGNORE INTO users (user_id, userName) VALUES (?, ?);", (a_UserID, a_UserName)); + db.commit() + cursor.close() + db.close() + +# Добавление пользователя, если он уже есть, то игнорируем +def GetUserInfo(a_UserID): + db = sqlite3.connect(bot_bd.GetBDFileName()) + cursor = db.cursor() + user_info = cursor.execute('SELECT * FROM users WHERE user_id = ?', ([a_UserID])).fetchall() + cursor.close() + db.close() + if len(user_info) != 0: + return user_info[0] + return None + +# --------------------------------------------------------- +# API + +# Доступные кнопки +def GetInitBDCommands(): + return [init_bd_cmd] + +# Доступные кнопки +def GetButtonNames(a_UserAccess): + return user_profile_button_name + +# Обработка кнопок +def RegisterHandlers(dp : Dispatcher): + dp.register_message_handler(ProfileOpen, text = user_profile_button_name) diff --git a/bot_modules/start.py b/bot_modules/start.py new file mode 100644 index 0000000..4521af0 --- /dev/null +++ b/bot_modules/start.py @@ -0,0 +1,56 @@ +# -*- coding: utf8 -*- +# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) + +# Стартовое меню + +from bot_sys import log, config, keyboard +from bot_modules import profile + +from aiogram.dispatcher import Dispatcher + +# --------------------------------------------------------- +# Сообщения + +start_message = ''' +👋 | Добро пожаловать! + +Приятного пользования! +''' + +start_menu_button_name = "☰ Главное меню" + +# --------------------------------------------------------- +# Работа с кнопками + +def GetStartKeyboardButtons(a_UserAccess): + profile_button_names = profile.GetButtonNames(a_UserAccess) + return keyboard.MakeKeyboard([profile_button_names]) + +# --------------------------------------------------------- +# Обработка сообщений + +# Первичное привестивие +async def StartMenu(a_Message): + user_id = int(a_Message.from_user.id) + user_name = str(a_Message.from_user.username) + profile.AddUser(user_id, user_name) + log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте') + await a_Message.answer(start_message, reply_markup=GetStartKeyboardButtons(None), parse_mode='HTML') + +# --------------------------------------------------------- +# API + +# Доступные кнопки +def GetInitBDCommands(): + return None + +# Имена доступных кнопок +def GetButtonNames(a_UserAccess): + return start_menu_button_name + +# Обработка кнопок +def RegisterHandlers(dp : Dispatcher): + dp.register_message_handler(StartMenu, commands = ['start']) + dp.register_message_handler(StartMenu, text = start_menu_button_name) + + diff --git a/bot_modules/user.py b/bot_modules/user.py deleted file mode 100644 index b574d37..0000000 --- a/bot_modules/user.py +++ /dev/null @@ -1,77 +0,0 @@ -# -*- coding: utf8 -*- -# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) -from bot_sys import user_bd, log, config - -from aiogram import types, Bot, Dispatcher -from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton -from aiogram.dispatcher import Dispatcher -from aiogram.contrib.fsm_storage.memory import MemoryStorage - -storage = MemoryStorage() -bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode=types.ParseMode.HTML) -dp = Dispatcher(bot, storage=storage) - -# --------------------------------------------------------- -# Сообщения - -start_message = ''' -👋 | Добро пожаловать! - -Приятного пользования! -''' - -profile_message = ''' -Профиль: - -ID: @user_id -Имя: @user_name -''' - -user_profile_button_name = "📰 Профиль" -back_to_start_menu_button_name = "◀ Назад" - -# --------------------------------------------------------- -# Работа с кнопками - -def GetStartKeyboardButtons(): - key = types.ReplyKeyboardMarkup(resize_keyboard=True) - prof_button = types.KeyboardButton(user_profile_button_name) - key.add(prof_button) - return key - -def GetProfileKeyboardButtons(): - key = types.ReplyKeyboardMarkup(resize_keyboard=True) - back_to_start_menu = types.KeyboardButton(back_to_start_menu_button_name) - key.add(back_to_start_menu) - return key - -# --------------------------------------------------------- -# - -# Первичное привестивие -async def Welcome(a_Message): - user_id = int(a_Message.from_user.id) - user_name = str(a_Message.from_user.username) - user_bd.AddUser(user_id, user_name) - log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте') - await a_Message.answer(start_message, reply_markup=GetStartKeyboardButtons(), parse_mode='HTML') - -# Отображение профиля пользователя -async def ProfileOpen(a_Message): - user_id = str(a_Message.from_user.id) - user_info = user_bd.GetUserInfo(user_id) - msg = profile_message - if not user_info is None: - msg = msg.replace('@user_id', str(user_info[0])).replace('@user_name', str(user_info[1])) - await bot.send_message(user_id, msg, reply_markup=GetProfileKeyboardButtons()) - -# Возврат в основное меню -async def BackToStartMunu(a_Message : types.Message): - await Welcome(a_Message) - -def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(Welcome, commands=['start']) - dp.register_message_handler(ProfileOpen, text=user_profile_button_name) - dp.register_message_handler(BackToStartMunu, text=back_to_start_menu_button_name) - - diff --git a/bot_sys/bot_bd.py b/bot_sys/bot_bd.py index c0d9b1d..8d1dda2 100644 --- a/bot_sys/bot_bd.py +++ b/bot_sys/bot_bd.py @@ -14,32 +14,29 @@ def GetBDFileName(): # Функции работы с базой # --------------------------------------------------------- -# Первичаня иницилизация базы данных - -# Открываем БД, если её нет, то создаём -db = sqlite3.connect(GetBDFileName()) -cursor = db.cursor() - -# Таблица пользователей -cursor.execute("""CREATE TABLE IF NOT EXISTS users( - user_id INTEGER, - userName TEXT, - UNIQUE(user_id) -);""") +def BDExecute(a_Commands): + db = sqlite3.connect(GetBDFileName()) + cursor = db.cursor() + for cmd in a_Commands: + print(cmd) + cursor.execute(cmd) + db.commit() + cursor.close() + db.close() + +''' # Таблица групп пользователей -cursor.execute("""CREATE TABLE IF NOT EXISTS group1( +cursor.execute("""CREATE TABLE IF NOT EXISTS group( group_id INTEGER, groupName TEXT, UNIQUE(group_id) );""") # Таблица соответствия пользователей и групп пользователей -cursor.execute("""CREATE TABLE IF NOT EXISTS groups_users1( +cursor.execute("""CREATE TABLE IF NOT EXISTS groups_users( user_id INTEGER, group_id INTEGER );""") +''' -db.commit() -cursor.close() -db.close() diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py new file mode 100644 index 0000000..b67396b --- /dev/null +++ b/bot_sys/keyboard.py @@ -0,0 +1,15 @@ +#-*-coding utf-8-*- +# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) + +# Работа с кнопками и клавиатурой + +from aiogram import types, Bot, Dispatcher +from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton + +def MakeKeyboard(a_ButtonList): + key = types.ReplyKeyboardMarkup(resize_keyboard = True) + for b in a_ButtonList: + k = types.KeyboardButton(b) + key.add(k) + + return key diff --git a/bot_sys/user_bd.py b/bot_sys/user_bd.py deleted file mode 100644 index e4e7496..0000000 --- a/bot_sys/user_bd.py +++ /dev/null @@ -1,29 +0,0 @@ -#-*-coding utf-8-*- -# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) - -from bot_sys import bot_bd - -import sqlite3 - -# Работа с базой данных пользователей - -# Добавление пользователя, если он уже есть, то игнорируем -def AddUser(a_UserID, a_UserName): - db = sqlite3.connect(bot_bd.GetBDFileName()) - cursor = db.cursor() - cursor.execute("INSERT OR IGNORE INTO users (user_id, userName) VALUES (?, ?);", (a_UserID, a_UserName)); - db.commit() - cursor.close() - db.close() - -# Добавление пользователя, если он уже есть, то игнорируем -def GetUserInfo(a_UserID): - db = sqlite3.connect(bot_bd.GetBDFileName()) - cursor = db.cursor() - user_info = cursor.execute('SELECT * FROM users WHERE user_id = ?', ([a_UserID])).fetchall() - cursor.close() - db.close() - if len(user_info) != 0: - return user_info[0] - return None - diff --git a/main.py b/main.py index d620625..14c84b9 100644 --- a/main.py +++ b/main.py @@ -9,14 +9,24 @@ from aiogram.utils import executor from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage import sqlite3 -from bot_sys import config, log -from bot_modules import user +from bot_sys import config, log, bot_bd +from bot_modules import profile, start storage = MemoryStorage() -bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode=types.ParseMode.HTML) -dp = Dispatcher(bot, storage=storage) +bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML) +dp = Dispatcher(bot, storage = storage) -user.RegisterHandlers(dp) +mods = [profile, start] + +init_bd_cmd = [] +for m in mods: + m.RegisterHandlers(dp) + c = m.GetInitBDCommands() + if not c is None: + init_bd_cmd += c + +# Первичаня инициализация базы данных +bot_bd.BDExecute(init_bd_cmd) if __name__ == '__main__': os.system('clear')