Browse Source

Модули пользователя и стартовый

test_bot
Alexei 2 years ago
parent
commit
60d33887d6
  1. 91
      bot_modules/profile.py
  2. 56
      bot_modules/start.py
  3. 77
      bot_modules/user.py
  4. 31
      bot_sys/bot_bd.py
  5. 15
      bot_sys/keyboard.py
  6. 29
      bot_sys/user_bd.py
  7. 20
      main.py

91
bot_modules/profile.py

@ -0,0 +1,91 @@
# -*- coding: utf8 -*-
# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Профиль пользователя
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 = '''
<b>Профиль:</b>
<b>ID:</b> @user_id
<b>Имя:</b> @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)

56
bot_modules/start.py

@ -0,0 +1,56 @@
# -*- coding: utf8 -*-
# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Стартовое меню
from bot_sys import log, config, keyboard
from bot_modules import profile
from aiogram.dispatcher import Dispatcher
# ---------------------------------------------------------
# Сообщения
start_message = '''
<b>👋 | Добро пожаловать!</b>
<b>Приятного пользования!</b>
'''
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)

77
bot_modules/user.py

@ -1,77 +0,0 @@
# -*- coding: utf8 -*-
# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
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 = '''
<b>👋 | Добро пожаловать!</b>
<b>Приятного пользования!</b>
'''
profile_message = '''
<b>Профиль:</b>
<b>ID:</b> @user_id
<b>Имя:</b> @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)

31
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()

15
bot_sys/keyboard.py

@ -0,0 +1,15 @@
#-*-coding utf-8-*-
# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Работа с кнопками и клавиатурой
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

29
bot_sys/user_bd.py

@ -1,29 +0,0 @@
#-*-coding utf-8-*-
# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
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

20
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')

Loading…
Cancel
Save