From 3a9ee2c59379045ca961bae74163ad82cd2f874d Mon Sep 17 00:00:00 2001 From: L_DelOff Date: Sat, 26 Oct 2024 13:53:53 +0300 Subject: [PATCH] fix bugs --- channels.csv | 2 +- src/config/BotConfig.py | 8 +++- src/model/MumbleBot.py | 13 ++++-- src/service/ChannelService.py | 6 +++ src/service/MumbleBotService.py | 74 ++++++++++++++++++++++----------- src/start.py | 10 ++--- welcome.csv | 1 + 7 files changed, 78 insertions(+), 36 deletions(-) create mode 100644 welcome.csv diff --git a/channels.csv b/channels.csv index 0856cbf..fd90fa2 100644 --- a/channels.csv +++ b/channels.csv @@ -36,4 +36,4 @@ path;message -

" \ No newline at end of file +

" diff --git a/src/config/BotConfig.py b/src/config/BotConfig.py index be22a19..982727d 100644 --- a/src/config/BotConfig.py +++ b/src/config/BotConfig.py @@ -41,8 +41,12 @@ class BotConfig: self.channelList.append(MumbleChannel(row['path'], row['message'])) _logger.info("Файл с настройками каналов загружен") - - + def load_welcome_message(self) -> str: + _logger.info("Загрузка файла с приветствием ...") + f = open('welcome.csv', 'r', encoding='utf-8') + message = f.read() + f.close() + return message # bot = BotConfig() diff --git a/src/model/MumbleBot.py b/src/model/MumbleBot.py index f90da99..02d78cd 100644 --- a/src/model/MumbleBot.py +++ b/src/model/MumbleBot.py @@ -7,6 +7,7 @@ from pymumble_py3 import Mumble from src.config.BotConfig import BotConfig from pymumble_py3.callbacks import PYMUMBLE_CLBK_TEXTMESSAGERECEIVED as PCTMR from pymumble_py3.callbacks import PYMUMBLE_CLBK_USERUPDATED as PCUU +from pymumble_py3.callbacks import PYMUMBLE_CLBK_USERCREATED as PCUC from src.service.ChannelService import ChannelService from src.service.MumbleBotService import MumbleBotService @@ -32,16 +33,17 @@ class MumbleBot: port=int(config['Server']['port']), password=config['Server']['password'], certfile=config['Bot']['certfile'], reconnect=True, tokens=config['Server']['tokens']) - self.bot.callbacks.set_callback(PCTMR, self.message_received) - self.bot.callbacks.set_callback(PCUU, self.user_change_channel) - # self.bot.callbacks.set_callback(PCUC, self.user_connect_server) - self.mumbleBotService = MumbleBotService(self) self.channelService = ChannelService(self) self.bot.start() # start the mumble thread self.bot.is_ready() # wait for the connection self.channelService.init_channels() + + self.bot.callbacks.set_callback(PCTMR, self.message_received) + self.bot.callbacks.set_callback(PCUU, self.user_change_channel) + self.bot.callbacks.set_callback(PCUC, self.user_connect_server) + if self.bot.connected >= pymumble_py3.constants.PYMUMBLE_CONN_STATE_FAILED: exit() @@ -51,6 +53,9 @@ class MumbleBot: def user_change_channel(self, user, action): self.mumbleBotService.user_change_channel(user, action) + def user_connect_server(self, action): + self.mumbleBotService.user_connect_server(action) + def loop(self): while not self.exit and self.bot.is_alive(): while self.thread and self.bot.sound_output.get_buffer_size() > 0.5 and not self.exit: diff --git a/src/service/ChannelService.py b/src/service/ChannelService.py index 48bec61..0f87415 100644 --- a/src/service/ChannelService.py +++ b/src/service/ChannelService.py @@ -48,3 +48,9 @@ class ChannelService: if channel.name == name: return channel.message return '' + + def get_welcome_message(self) -> str: + try: + return self.bot_data.config.load_welcome_message() + except IndexError: + return "" diff --git a/src/service/MumbleBotService.py b/src/service/MumbleBotService.py index c3bc31f..f204567 100644 --- a/src/service/MumbleBotService.py +++ b/src/service/MumbleBotService.py @@ -1,4 +1,6 @@ import logging +from concurrent.futures import ThreadPoolExecutor, TimeoutError as FutureTimeoutError +from concurrent.futures import ThreadPoolExecutor from typing import Optional from pymumble_py3.users import User, Users @@ -21,8 +23,8 @@ class MumbleBotService: actor_id = message_info.actor if actor_id == 0: return - user_id = self.get_user_id_by_actor_id(actor_id) - username = self.get_username_by_id(user_id) + session = self.get_session_by_actor_id(actor_id) + username = self.get_username_by_session(session) is_admin = self.is_admin(username) message = message_info.message.strip() @@ -36,35 +38,48 @@ class MumbleBotService: if is_admin: for x in self.bot_data.config.config['Command admin']: message = message + '

' + self.bot_data.config.config['Command admin'][x] + '

' - self.get_user_by_id(user_id).send_text_message(message) + self.get_user_by_session(session).send_text_message(message) case '!users': if is_admin: message = '

Список пользователей:

' users = self.bot_data.get_userlist() for user in users: message = message + '

' + user['name'] + '

' - self.get_user_by_id(user_id).send_text_message(message) + self.get_user_by_session(session).send_text_message(message) case '!initchannels': - self.channel_service.init_channels() - message = 'Каналы обновлены' - self.get_user_by_id(user_id).send_text_message(message) + if is_admin: + self.channel_service.init_channels() + message = 'Каналы обновлены' + self.get_user_by_session(session).send_text_message(message) case 'test': - self.test(self.bot_data.bot, message_info) + self.test() case _: - self.get_user_by_id(user_id).send_text_message(message) + self.get_user_by_session(session).send_text_message(message) # TODO: одинаковые каналы (коллизия сообщений) def user_change_channel(self, user: User, action): _logger.info(f"{user['name']} перешёл в канал: {self.bot_data.bot.channels[action['channel_id']]['name']}") - message = self.channel_service.get_message_by_channel_id(action['channel_id']) if len(message) > 0: - self.get_user_by_id(user['user_id']).send_text_message(message) + self.get_user_by_session(user['session']).send_text_message(message) - def get_user_id_by_actor_id(self, actor_id: int) -> Optional[int]: + def user_connect_server(self, action): + user = self.get_user_by_session(action['session']) + + if user['name'] == self.bot_data.bot.user: + return + + _logger.info(f"{user['name']} зашёл на сервер") + + message = self.channel_service.get_welcome_message() + if len(message) > 0: + self.get_user_by_session(action['session']).send_text_message(message) + _logger.debug(f"{user['name']} ") + + def get_session_by_actor_id(self, actor_id: int) -> Optional[int]: user = self.get_user_by_actor_id(actor_id) if user is not None: - return user['user_id'] + return user['session'] else: return None @@ -78,24 +93,34 @@ class MumbleBotService: _logger.warning(f"Не удалось найти пользователя с actorId: {actor_id}") return None - def get_username_by_id(self, user_id: int) -> Optional[str]: + def get_username_by_session(self, session: int) -> Optional[str]: try: - return self.get_user_by_id(user_id)['name'] + return self.get_user_by_session(session)['name'] except KeyError: - _logger.warning(f"Не удалось найти пользователя с id: {user_id}") + _logger.warning(f"Не удалось найти пользователя с session: {session}") return None def get_user_by_id(self, user_id: int) -> Optional[User]: - try: - users = self.bot_data.bot.users - for user in users.values(): + users = self.bot_data.bot.users + for user in users.values(): + try: if user['user_id'] == user_id: return user - _logger.warning(f"Не удалось найти пользователя с id: {user_id}") - return None - except KeyError: - _logger.warning(f"Не удалось найти пользователя с id: {user_id}") - return None + except KeyError: + continue + _logger.warning(f"Не удалось найти пользователя с id: {user_id}") + return None + + def get_user_by_session(self, session: int) -> Optional[User]: + users = self.bot_data.bot.users + for user in users.values(): + try: + if user['session'] == session: + return user + except KeyError: + continue + _logger.warning(f"Не удалось найти пользователя с session: {session}") + return None def get_user_by_name(self, user_name: str) -> Optional[User]: users = self.bot_data.bot.users @@ -133,3 +158,4 @@ class MumbleBotService: def test(self): self.channel_service.get_tree() + diff --git a/src/start.py b/src/start.py index 0216d3a..031856e 100644 --- a/src/start.py +++ b/src/start.py @@ -23,11 +23,11 @@ coloredlogs.install(level='DEBUG', level_styles=level_styles, field_styles=field _logger = logging.getLogger(__name__) -_logger.debug("Это сообщение DEBUG уровня") -_logger.info("Это сообщение INFO уровня") -_logger.warning("Это сообщение WARNING уровня") -_logger.error("Это сообщение ERROR уровня") -_logger.critical("Это сообщение CRITICAL уровня") +# _logger.debug("Это сообщение DEBUG уровня") +# _logger.info("Это сообщение INFO уровня") +# _logger.warning("Это сообщение WARNING уровня") +# _logger.error("Это сообщение ERROR уровня") +# _logger.critical("Это сообщение CRITICAL уровня") bot = MumbleBot() bot.loop() diff --git a/welcome.csv b/welcome.csv new file mode 100644 index 0000000..cc3d127 --- /dev/null +++ b/welcome.csv @@ -0,0 +1 @@ +

Добро пожаловать в отель!

\ No newline at end of file