Browse Source

Модуль профайл работает

pull/2/head
Alexei 2 years ago
parent
commit
1e016c297d
  1. 4
      bot_modules/mod_simple_message.py
  2. 120
      bot_modules/profile.py
  3. 9
      bot_modules/start.py
  4. 7
      bot_sys/aiogram_bot.py
  5. 7
      bot_sys/bot_messages.py
  6. 4
      bot_sys/keyboard.py
  7. 11
      main.py
  8. 2
      template/bd_item.py
  9. 8
      template/simple_message.py

4
bot_modules/mod_simple_message.py

@ -35,8 +35,8 @@ class SimpleMessageModule(mod_interface.IModule):
self.m_StartMessageHandler = simple_message.SimpleMessageTemplate(
self.m_Bot,
self.m_StartMessageHandlerFunc,
None,
self.m_GetStartKeyboardButtonsFunc,
None,
self.m_GetAccessFunc
)
@ -75,7 +75,7 @@ class SimpleMessageModule(mod_interface.IModule):
def GetModuleButtons(self):
return [
keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, GetAccess()),
keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, self.GetAccess()),
]
def RegisterHandlers(self):

120
bot_modules/profile.py

@ -3,12 +3,9 @@
# Профиль пользователя
from bot_sys import bot_bd, log, config, keyboard, user_access, user_messages
from bot_modules import start, access, groups
from template import simple_message
from aiogram import types
from aiogram.dispatcher import Dispatcher
from bot_sys import user_access, bot_bd
from bot_modules import mod_simple_message, groups, access_utils
from template import bd_item, simple_message
# ---------------------------------------------------------
# БД
@ -24,30 +21,7 @@ language_code_field = 'userLanguageCode'
access_field = 'userAccess'
create_datetime_field = 'createDateTime'
init_bd_cmds = [f"""CREATE TABLE IF NOT EXISTS {table_name}(
{key_name} INTEGER,
{name_field} TEXT,
{name1_field} TEXT,
{name2_field} TEXT,
{is_bot_field} TEXT,
{language_code_field} TEXT,
{access_field} TEXT,
{create_datetime_field} TEXT,
UNIQUE({key_name})
);""",
f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=+', '{user_access.user_access_group_new}=+');"
]
def MSG(a_MessageName, a_MessageDesc):
def UpdateMSG(a_Message : user_messages.Message):
print(a_Message.m_MessageName, a_Message.m_MessageDesc)
globals()[a_Message.m_MessageName] = a_Message
user_messages.MSG(a_MessageName, a_MessageDesc, UpdateMSG, log.GetTimeNow())
# ---------------------------------------------------------
# Сообщения
MSG('profile_message', f'''
start_message = f'''
<b>📰 Профиль:</b>
<b>ID:</b> #{key_name}
@ -56,25 +30,41 @@ MSG('profile_message', f'''
<b>Имя2:</b> #{name2_field}
<b>Код языка:</b> #{language_code_field}
<b>Дата добавления:</b> #{create_datetime_field}
''')
'''
user_profile_button_name = "📰 Профиль"
start_menu_button_name = "📰 Профиль"
# ---------------------------------------------------------
# Работа с кнопками
class ModuleProfile(mod_simple_message.SimpleMessageModule):
def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log):
a_InitAccess = f'{user_access.user_access_group_new}=+'
super().__init__(start_message, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log)
def GetStartKeyboardButtons(a_Message, a_UserGroups):
mods = [start]
return keyboard.MakeKeyboardForMods(mods, a_UserGroups)
def GetInitBDCommands(self):
return super(). GetInitBDCommands() + [
f"""CREATE TABLE IF NOT EXISTS {table_name}(
{key_name} INTEGER,
{name_field} TEXT,
{name1_field} TEXT,
{name2_field} TEXT,
{is_bot_field} TEXT,
{language_code_field} TEXT,
{access_field} TEXT,
{create_datetime_field} TEXT,
UNIQUE({key_name})
);""",
]
# ---------------------------------------------------------
# Обработка сообщений
def GetName(self):
return module_name
async def ProfileOpen(a_Message, state = None):
user_info = GetUserInfo(a_Message.from_user.id)
msg = profile_message
# Основной обработчик главного сообщения
async def StartMessageHandler(self, a_Message, state = None):
user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id)
lang = str(a_Message.from_user.language_code)
msg = self.m_StartMessage
msg = msg.GetMessageForLang(lang).StaticCopy()
if not user_info is None:
msg = str(msg).\
msg.m_MessageDesc = msg.GetDesc().\
replace(f'#{key_name}', str(user_info[0])).\
replace(f'#{name_field}', str(user_info[1])).\
replace(f'#{name1_field}', str(user_info[2])).\
@ -84,45 +74,27 @@ async def ProfileOpen(a_Message, state = None):
replace(f'#{access_field}', str(user_info[6])).\
replace(f'#{create_datetime_field}', str(user_info[7]))
return simple_message.WorkFuncResult(msg, item_access = str(user_info[6]))
return simple_message.WorkFuncResult(msg)
return await super().StartMessageHandler(a_Message, state)
# ---------------------------------------------------------
# Работа с базой данных пользователей
# Добавление пользователя, если он уже есть, то игнорируем
def AddUser(a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode):
bot_bd.SQLRequestToBD(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access.GetItemDefaultAccessForModule(module_name)))
user_groups = groups.GetUserGroupData(a_UserID)
def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode):
a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name)))
'''
user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID)
# Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new
if len(user_groups.group_names_list) == 0:
new_group_id = bot_bd.SQLRequestToBD(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?',
new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?',
param = [user_access.user_access_group_new])
if new_group_id and new_group_id[0]:
bot_bd.SQLRequestToBD(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, new_group_id[0][0], access.GetItemDefaultAccessForModule(module_name)))
def GetUserInfo(a_UserID):
user_info = bot_bd.SQLRequestToBD('SELECT * FROM users WHERE user_id = ?', param = [a_UserID])
a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name)))
'''
def GetUserInfo(a_Bot, a_UserID):
user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID])
if len(user_info) != 0:
return user_info[0]
return None
# ---------------------------------------------------------
# API
# Инициализация БД
def GetInitBDCommands():
return init_bd_cmds
def GetAccess():
return access.GetAccessForModule(module_name)
# Доступные кнопки
def GetModuleButtons():
return [keyboard.ButtonWithAccess(user_profile_button_name, user_access.AccessMode.VIEW, GetAccess())]
# Обработка кнопок
def RegisterHandlers(dp : Dispatcher):
dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(ProfileOpen, GetStartKeyboardButtons, GetAccess), text = user_profile_button_name)

9
bot_modules/start.py

@ -4,7 +4,7 @@
# Стартовое меню
from bot_sys import user_access
from bot_modules import mod_simple_message
from bot_modules import mod_simple_message, profile
from template import bd_item
start_message = '''
@ -29,7 +29,7 @@ class ModuleStart(mod_simple_message.SimpleMessageModule):
last_name = str(a_Message.from_user.last_name)
is_bot = str(a_Message.from_user.is_bot)
language_code = str(a_Message.from_user.language_code)
#profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code)
profile.AddUser(self.m_Bot, user_id, user_name, first_name, last_name, is_bot, language_code)
self.m_Log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте. Полные данные {a_Message.from_user}.')
return await super().StartMessageHandler(a_Message, state)
@ -42,8 +42,3 @@ class ModuleStart(mod_simple_message.SimpleMessageModule):
)
#def GetStartKeyboardButtons(a_Message, a_UserGroups):
# mods = [profile, projects, groups, access, backup, languages]
# return keyboard.MakeKeyboardForMods(mods, a_UserGroups)

7
bot_sys/aiogram_bot.py

@ -29,9 +29,13 @@ class AiogramBot(interfaces.IBot):
return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param)
async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons):
inline_keyboard = None
if a_InlineKeyboardButtons:
inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons)
base_keyboard = None
if a_KeyboardButtons:
base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons)
if a_InlineKeyboardButtons:
if inline_keyboard:
base_keyboard = inline_keyboard
if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0':
await self.m_TBot.send_photo(
@ -41,6 +45,7 @@ class AiogramBot(interfaces.IBot):
reply_markup = base_keyboard
)
else:
#print('SendMessage', a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons, base_keyboard)
await self.m_TBot.send_message(
a_UserID,
a_Message,

7
bot_sys/bot_messages.py

@ -12,6 +12,9 @@ class BotMessage:
self.m_PhotoID = a_PhotoID
self.m_DateTime = a_DateTime
def StaticCopy(self):
return BotMessage(None, self.m_MessageName, self.m_MessageDesc, self.m_Language, self.m_PhotoID, self.m_DateTime)
def GetName(self):
return self.m_MessageName
@ -25,10 +28,12 @@ class BotMessage:
return self.m_PhotoID
def __str__(self):
msg = GetMessageForLang(self.m_Language)
msg = self.GetMessageForLang(self.m_Language)
return msg.GetDesc()
def GetMessageForLang(self, a_Language):
if not self.m_BotMessages:
return self
last_update = self.m_BotMessages.m_LastUpdate
new_msg = self
if self.m_DateTime < last_update:

4
bot_sys/keyboard.py

@ -37,7 +37,7 @@ def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups):
buttons = []
for b in a_ButtonList:
if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode):
buttons += [types.KeyboardButton(b.label)]
buttons += [types.KeyboardButton(str(b.label))]
step = GetButtonInRowCount(len(buttons))
return Chunks(buttons, step)
@ -69,7 +69,7 @@ def MakeAiogramInlineKeyboard(a_ButtonList : [InlineButton]):
for row in a_ButtonList:
r = []
for b in row:
r += [types.InlineKeyboardButton(text = b.label, callback_data = b.callback_data)]
r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)]
buttons += r
inline_keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
return inline_keyboard

11
main.py

@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!'
import os
from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages
from bot_modules import mod_agregator, start #, projects, groups, access, backup, tasks, needs, comments, messages, profile, languages
from bot_modules import mod_agregator, start, profile #, projects, groups, access, backup, tasks, needs, comments, messages, , languages
g_Log = log
g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log)
@ -18,7 +18,13 @@ g_BotButtons = bot_messages.BotMessages(default_language)
g_ModuleAgregator = mod_agregator.ModuleAgregator()
mod_start = start.ModuleStart([], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
mod_start_name = 'start'
mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_profile)
start_mod_name_list = [mod_profile.GetName()]#, 'projects', 'groups', 'access', 'backup', 'languages']
mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_start)
# Первичная инициализация модулей. Все модули должны быть прописаны в списке modules
@ -40,6 +46,7 @@ g_BotButtons.UpdateSignal(g_Log.GetTimeNow())
#messages.FlushMessages()
for m in modules:
print(m)
m.RegisterHandlers()
# Юнит тесты модулей и файлов

2
template/bd_item.py

@ -31,7 +31,7 @@ def GetCheckForPrefixFunc(a_Prefix):
return lambda x: x.data.startswith(a_Prefix)
def GetCheckForTextFunc(a_Text):
return lambda x: x.text == a_Text
return lambda x: x.text == str(a_Text)
def GetCheckForCommandsFunc(a_Commands):
return lambda x: x.commands == a_Commands

8
template/simple_message.py

@ -19,11 +19,11 @@ def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButto
return SimpleMessageTemplate(a_Bot, GetMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = access_mode)
def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW):
def ProxyGetButtonsTemplate(a_GetButtonsFunc):
def ProxyGetButtonsTemplate(a_GetButtonsFunc1):
def ReturnNone(a_Message, user_groups):
return None
if a_GetButtonsFunc:
return a_GetButtonsFunc
if a_GetButtonsFunc1:
return a_GetButtonsFunc1
else:
return ReturnNone
@ -54,7 +54,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton
if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode):
return await AccessDeniedMessage(user_id, a_Message, user_groups)
msg = msg.GetMessageForLang(lang)
msg = msg.GetMessageForLang(lang).StaticCopy()
await a_Bot.SendMessage(
user_id,

Loading…
Cancel
Save