main
L_DelOff 2024-10-26 13:53:53 +03:00
parent 6d73157bb5
commit 3a9ee2c593
7 changed files with 78 additions and 36 deletions

File diff suppressed because one or more lines are too long

View File

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

View File

@ -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:

View File

@ -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 ""

View File

@ -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 + '<p>' + self.bot_data.config.config['Command admin'][x] + '</p>'
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 = '<p>Список пользователей:</p>'
users = self.bot_data.get_userlist()
for user in users:
message = message + '<p>' + user['name'] + '</p>'
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()

View File

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

1
welcome.csv Normal file

File diff suppressed because one or more lines are too long