Browse Source

Сообщения и языки. Доработка. Пока не работают.

test_bot
Alexei 2 years ago
parent
commit
283c074cbb
  1. 31
      bot_modules/languages.py
  2. 32
      bot_modules/messages.py
  3. 10
      bot_modules/start.py
  4. 42
      bot_sys/user_messages.py
  5. 15
      main.py

31
bot_modules/languages.py

@ -3,7 +3,7 @@
# Языки # Языки
from bot_sys import bot_bd, log, keyboard, user_access from bot_sys import bot_bd, log, keyboard, user_access, user_messages
from bot_modules import start, access, groups, messages from bot_modules import start, access, groups, messages
from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add
@ -48,7 +48,9 @@ init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}(
{desc_field} TEXT, {desc_field} TEXT,
{photo_field} TEXT, {photo_field} TEXT,
{access_field} TEXT, {access_field} TEXT,
{create_datetime_field} TEXT {create_datetime_field} TEXT,
UNIQUE({key_name}),
UNIQUE({name_field})
)''', )''',
f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');"
] ]
@ -230,6 +232,7 @@ async def LanguagePreDelete(a_CallbackQuery : types.CallbackQuery, a_Item):
async def LanguagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): async def LanguagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID):
log.Success(f'Язык №{a_ItemID} был удалён пользователем {a_CallbackQuery.from_user.id}.') log.Success(f'Язык №{a_ItemID} был удалён пользователем {a_CallbackQuery.from_user.id}.')
#TODO: удалить вложенные #TODO: удалить вложенные
FlushLanguages()
return simple_message.WorkFuncResult(language_success_delete_message) return simple_message.WorkFuncResult(language_success_delete_message)
# --------------------------------------------------------- # ---------------------------------------------------------
@ -244,11 +247,35 @@ def AddBDItemFunc(a_ItemData, a_UserID):
else: else:
log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).')
FlushLanguages()
return res, error return res, error
# --------------------------------------------------------- # ---------------------------------------------------------
# API # API
def AddOrIgnoreLang(a_Lang : str):
res, error = bot_bd.SQLRequestToBD(f'INSERT OR IGNORE INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})',
commit = True, return_error = True, param = (0, a_Lang, '', access.GetItemDefaultAccessForModule(module_name)))
g_languages = {}
def GetLangID(a_Lang):
return g_languages.get(a_Lang, None)
def GetLangName(a_LangID):
for lang_name, lang_id in g_languages:
if a_LangID == lang_id:
return lang_name
return None
def FlushLanguages():
msg = user_messages.GetMessages()
for lang, msg_dict in msg.items():
AddOrIgnoreLang(lang)
langs = bd_item.GetAllItemsTemplate(table_name)()
if langs:
for l in langs:
g_languages[l[1]] = str(l[0])
# Инициализация БД # Инициализация БД
def GetInitBDCommands(): def GetInitBDCommands():
return init_bd_cmds return init_bd_cmds

32
bot_modules/messages.py

@ -3,7 +3,7 @@
# Сообщения # Сообщения
from bot_sys import bot_bd, log, keyboard, user_access from bot_sys import bot_bd, log, keyboard, user_access, user_messages
from bot_modules import start, access, groups, languages from bot_modules import start, access, groups, languages
from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select
@ -54,7 +54,9 @@ init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}(
{photo_field} TEXT, {photo_field} TEXT,
{access_field} TEXT, {access_field} TEXT,
{create_datetime_field} TEXT, {create_datetime_field} TEXT,
{parent_id_field} INTEGER {parent_id_field} INTEGER,
UNIQUE({key_name}),
UNIQUE({name_field}, {parent_id_field})
)''', )''',
f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');"
] ]
@ -212,6 +214,8 @@ def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None):
if (len(a_Item) < 6): if (len(a_Item) < 6):
return simple_message.WorkFuncResult(error_find_proj_message) return simple_message.WorkFuncResult(error_find_proj_message)
if message_success_edit_message == a_StringMessage:
FlushMessages()
msg = a_StringMessage.\ msg = a_StringMessage.\
replace(f'#{name_field}', a_Item[1]).\ replace(f'#{name_field}', a_Item[1]).\
replace(f'#{desc_field}', a_Item[2]).\ replace(f'#{desc_field}', a_Item[2]).\
@ -239,6 +243,7 @@ async def MessagePreDelete(a_CallbackQuery : types.CallbackQuery, a_Item):
async def MessagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): async def MessagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID):
log.Success(f'Сообщение №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') log.Success(f'Сообщение №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.')
#TODO: удалить вложенные #TODO: удалить вложенные
FlushMessages()
return simple_message.WorkFuncResult(message_success_delete_message) return simple_message.WorkFuncResult(message_success_delete_message)
# --------------------------------------------------------- # ---------------------------------------------------------
@ -253,11 +258,34 @@ def AddBDItemFunc(a_ItemData, a_UserID):
else: else:
log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).')
FlushMessages()
return res, error return res, error
# --------------------------------------------------------- # ---------------------------------------------------------
# API # API
def AddOrIgnoreMessage(a_Message : user_messages.Message):
return bot_bd.SQLRequestToBD(f'INSERT OR IGNORE INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})',
commit = True, return_error = True, param = (a_Message.m_PhotoID, a_Message.m_MessageName, a_Message.m_MessageDesc, access.GetItemDefaultAccessForModule(module_name), languages.GetLangID(a_Message.m_Language)))
def FlushMessages():
msg = user_messages.GetMessages()
for lang, msg_dict in msg.items():
for msg_name, message in msg_dict.items():
AddOrIgnoreMessage(message)
msgs_bd = bd_item.GetAllItemsTemplate(table_name)()
if msgs_bd:
for m in msgs_bd:
name = m[1]
lang_id = m[5]
lang_name = languages.GetLangName(lang_id)
new_msg = user_messages.Message(name, m[2], lang_name, m[3])
if not msg.get(lang_name, None):
msg[lang_name] = {}
msg[lang_name][name] = new_msg
user_messages.UpdateMSG(new_msg)
# Инициализация БД # Инициализация БД
def GetInitBDCommands(): def GetInitBDCommands():
return init_bd_cmds return init_bd_cmds

10
bot_modules/start.py

@ -3,12 +3,17 @@
# Стартовое меню # Стартовое меню
from bot_sys import log, config, keyboard, user_access from bot_sys import log, config, keyboard, user_access, user_messages
from bot_modules import profile, projects, groups, access, backup, languages from bot_modules import profile, projects, groups, access, backup, languages
from template import simple_message from template import simple_message
from aiogram.dispatcher import Dispatcher from aiogram.dispatcher import Dispatcher
MSG = user_messages.MSG
def UpdateMSG(a_Message : user_messages.Message):
print(a_Message.m_MessageName, a_Message.m_MessageDesc)
globals()[a_Message.m_MessageName] = a_Message
# --------------------------------------------------------- # ---------------------------------------------------------
# БД # БД
module_name = 'start' module_name = 'start'
@ -20,10 +25,11 @@ f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VA
# --------------------------------------------------------- # ---------------------------------------------------------
# Сообщения # Сообщения
start_message = ''' MSG('start_message', '''
<b>Добро пожаловать!</b> <b>Добро пожаловать!</b>
Выберите возможные действия на кнопках ниже ''' Выберите возможные действия на кнопках ниже '''
, UpdateMSG)
start_menu_button_name = "☰ Главное меню" start_menu_button_name = "☰ Главное меню"

42
bot_sys/user_messages.py

@ -0,0 +1,42 @@
#-*-coding utf-8-*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
import sqlite3
from bot_sys import log
# Работа ссообщениями
default_language = 'ru'
g_messages = None
def GetMessages():
global g_messages
if not g_messages:
g_messages = {}
return g_messages
# ---------------------------------------------------------
# Функции работы с собщениями
# ---------------------------------------------------------
class Message:
def __init__(self, a_MessageName : str, a_MessageDesc : str, a_Language : str, a_PhotoID : str):
self.m_MessageName = a_MessageName
self.m_MessageDesc = a_MessageDesc
self.m_Language = a_Language
self.m_PhotoID = a_PhotoID
def __str__(self):
return f'{self.m_MessageDesc}'
def MSG(a_MessageName, a_MessageDesc, a_UpdateMSG):
cur_msg = Message(a_MessageName, a_MessageDesc, default_language, 0)
msg = GetMessages()
if not msg.get(default_language, None):
msg[default_language] = {}
if not msg[default_language].get(a_MessageName, None):
msg[default_language][a_MessageName] = cur_msg
a_UpdateMSG(cur_msg)
def UpdateMSG(a_Message : Message):
print(a_Message.m_MessageName, a_Message.m_MessageDesc)
globals()[a_Message.m_MessageName] = a_Message

15
main.py

@ -13,7 +13,7 @@ from bot_sys import config, log, bot_bd, user_access
from bot_modules import profile, start, projects, groups, access, backup, tasks, needs, comments, messages, languages from bot_modules import profile, start, projects, groups, access, backup, tasks, needs, comments, messages, languages
storage = MemoryStorage() storage = MemoryStorage()
bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML) bot = Bot(token = config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML)
dp = Dispatcher(bot, storage = storage) dp = Dispatcher(bot, storage = storage)
# Первичная инициализация модулей. Все модули должны быть прописаны в списке modules # Первичная инициализация модулей. Все модули должны быть прописаны в списке modules
@ -21,21 +21,26 @@ modules = [tasks, access, profile, start, projects, groups, backup, needs, comme
init_bd_cmd = [] init_bd_cmd = []
for m in modules: for m in modules:
m.RegisterHandlers(dp)
c = m.GetInitBDCommands() c = m.GetInitBDCommands()
if not c is None: if not c is None:
init_bd_cmd += c init_bd_cmd += c
# Первичаня инициализация базы данных # Первичная инициализация базы данных
bot_bd.BDExecute(init_bd_cmd) bot_bd.BDExecute(init_bd_cmd)
languages.FlushLanguages()
messages.FlushMessages()
for m in modules:
m.RegisterHandlers(dp)
# Юнит тесты модулей и файлов # Юнит тесты модулей и файлов
test_mods = [user_access] test_mods = [user_access]
for m in test_mods: for m in test_mods:
m.Test() m.Test()
if __name__ == '__main__': if __name__ == '__main__':
os.system('clear') # os.system('clear')
os.system('cls') # os.system('cls')
log.Success(log_start_message) log.Success(log_start_message)
executor.start_polling(dp) executor.start_polling(dp)

Loading…
Cancel
Save