Рефакторинг

This commit is contained in:
Евгений Александрович 2025-03-28 20:30:15 +03:00
parent 1ef959b606
commit 752710a167
4 changed files with 6 additions and 24 deletions

View File

@ -12,7 +12,6 @@ import locale
class ChatClient: class ChatClient:
def __init__(self, host='127.0.0.1', port=5555): def __init__(self, host='127.0.0.1', port=5555):
# Настройка локализации
locale.setlocale(locale.LC_ALL, '') locale.setlocale(locale.LC_ALL, '')
os.environ['LANG'] = 'ru_RU.UTF-8' os.environ['LANG'] = 'ru_RU.UTF-8'
@ -28,9 +27,8 @@ class ChatClient:
self.input_history = [] self.input_history = []
self.history_index = -1 self.history_index = -1
self.last_update = time.time() self.last_update = time.time()
self.update_interval = 5 # Интервал обновления в секундах self.update_interval = 5
# Цветовая схема
self.palette = [ self.palette = [
('header', 'white', 'dark blue'), ('header', 'white', 'dark blue'),
('chat', 'light gray', 'black'), ('chat', 'light gray', 'black'),
@ -64,12 +62,10 @@ class ChatClient:
self.chat_content = urwid.SimpleListWalker([]) self.chat_content = urwid.SimpleListWalker([])
self.chat_list = urwid.ListBox(self.chat_content) self.chat_list = urwid.ListBox(self.chat_content)
# Исправленная строка - правильно закрываем скобки Frame
chat_frame = urwid.Frame( chat_frame = urwid.Frame(
urwid.AttrMap(self.chat_list, 'chat'), urwid.AttrMap(self.chat_list, 'chat'),
header=urwid.AttrMap(urwid.Text(" ЧАТ "), 'header')) header=urwid.AttrMap(urwid.Text(" ЧАТ "), 'header'))
# Поле ввода
self.input_edit = urwid.Edit(caption="Сообщение: ") self.input_edit = urwid.Edit(caption="Сообщение: ")
input_pile = urwid.Pile([ input_pile = urwid.Pile([
urwid.AttrMap(self.input_edit, 'input'), urwid.AttrMap(self.input_edit, 'input'),
@ -126,7 +122,6 @@ class ChatClient:
if not msg.strip(): if not msg.strip():
return return
# Добавляем в историю
self.input_history.append(msg) self.input_history.append(msg)
if len(self.input_history) > 100: if len(self.input_history) > 100:
self.input_history.pop(0) self.input_history.pop(0)
@ -151,10 +146,8 @@ class ChatClient:
elif msg.startswith('/file'): elif msg.startswith('/file'):
self.send_file(msg) self.send_file(msg)
else: else:
# Отображаем свое сообщение
self.add_message(f"{self.nickname}: {msg}", 'own') self.add_message(f"{self.nickname}: {msg}", 'own')
# Отправляем на сервер
try: try:
encrypted_msg = rsa.encrypt(msg.encode('utf-8'), self.server_public_key) encrypted_msg = rsa.encrypt(msg.encode('utf-8'), self.server_public_key)
self.client.send(encrypted_msg) self.client.send(encrypted_msg)
@ -201,18 +194,14 @@ class ChatClient:
def receive(self): def receive(self):
try: try:
# Получаем публичный ключ сервера
self.server_public_key = rsa.PublicKey.load_pkcs1(self.client.recv(2048)) self.server_public_key = rsa.PublicKey.load_pkcs1(self.client.recv(2048))
# Отправляем свой публичный ключ
self.client.send(self.client_public_key.save_pkcs1()) self.client.send(self.client_public_key.save_pkcs1())
# Получаем никнейм
self.set_status("Введите ваш никнейм и нажмите Enter") self.set_status("Введите ваш никнейм и нажмите Enter")
while not self.nickname: while not self.nickname:
time.sleep(0.1) time.sleep(0.1)
# Отправляем никнейм на сервер
encrypted_nickname = rsa.encrypt(self.nickname.encode('utf-8'), self.server_public_key) encrypted_nickname = rsa.encrypt(self.nickname.encode('utf-8'), self.server_public_key)
self.client.send(encrypted_nickname) self.client.send(encrypted_nickname)
self.set_status(f"Подключено как {self.nickname}") self.set_status(f"Подключено как {self.nickname}")
@ -223,7 +212,6 @@ class ChatClient:
if not encrypted_msg: if not encrypted_msg:
break break
# Расшифровываем сообщение
msg = rsa.decrypt(encrypted_msg, self.client_private_key).decode('utf-8') msg = rsa.decrypt(encrypted_msg, self.client_private_key).decode('utf-8')
if msg.startswith('/file_notification'): if msg.startswith('/file_notification'):
@ -287,7 +275,6 @@ class ChatClient:
else: else:
self.chat_content.append(urwid.Text(text)) self.chat_content.append(urwid.Text(text))
# Автопрокрутка вниз
if len(self.chat_content) > 0: if len(self.chat_content) > 0:
self.chat_list.set_focus(len(self.chat_content) - 1) self.chat_list.set_focus(len(self.chat_content) - 1)
@ -297,15 +284,11 @@ class ChatClient:
threading.Timer(timeout, lambda: self.set_status("")).start() threading.Timer(timeout, lambda: self.set_status("")).start()
def update_ui(self, loop=None, user_data=None): def update_ui(self, loop=None, user_data=None):
"""Функция для обновления интерфейса"""
current_time = time.time() current_time = time.time()
if current_time - self.last_update >= self.update_interval: if current_time - self.last_update >= self.update_interval:
self.last_update = current_time self.last_update = current_time
# Здесь можно добавить любые обновления интерфейса
# Например, обновление времени в статус баре
self.loop.draw_screen() self.loop.draw_screen()
# Планируем следующее обновление
self.loop.set_alarm_in(self.update_interval, self.update_ui) self.loop.set_alarm_in(self.update_interval, self.update_ui)
def show_help(self): def show_help(self):
@ -351,8 +334,7 @@ class ChatClient:
self.loop.unhandled_input = exit_help self.loop.unhandled_input = exit_help
def run(self): def run(self):
# Получаем никнейм self.set_status("Введите Ваш никнейм и нажмите Enter")
self.set_status("Введите ваш никнейм и нажмите Enter")
def set_nickname(edit, new_edit_text): def set_nickname(edit, new_edit_text):
if new_edit_text.strip(): if new_edit_text.strip():
@ -361,7 +343,6 @@ class ChatClient:
self.loop.unhandled_input = self.handle_input self.loop.unhandled_input = self.handle_input
self.set_status(f"Подключено как {self.nickname}") self.set_status(f"Подключено как {self.nickname}")
self.input_edit.set_caption("Сообщение: ") self.input_edit.set_caption("Сообщение: ")
# Запускаем периодическое обновление интерфейса
self.loop.set_alarm_in(self.update_interval, self.update_ui) self.loop.set_alarm_in(self.update_interval, self.update_ui)
self.input_edit.set_caption("Никнейм: ") self.input_edit.set_caption("Никнейм: ")
@ -369,11 +350,9 @@ class ChatClient:
key == 'enter' and set_nickname(None, self.input_edit.get_edit_text()) key == 'enter' and set_nickname(None, self.input_edit.get_edit_text())
) )
# Запускаем поток для получения сообщений
receive_thread = threading.Thread(target=self.receive, daemon=True) receive_thread = threading.Thread(target=self.receive, daemon=True)
receive_thread.start() receive_thread.start()
# Запускаем главный цикл
self.loop.run() self.loop.run()

0
CLIENT/config_с.csrsa Normal file
View File

View File

@ -1,3 +1,5 @@
#!/usr/bin/env python
import socket import socket
import threading import threading
import rsa import rsa
@ -136,8 +138,9 @@ class Server:
print("\nСервер останавливается...") print("\nСервер останавливается...")
finally: finally:
self.server.close() self.server.close()
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Сервер остановлен.")
if __name__ == "__main__": if __name__ == "__main__":
server = Server() server = Server()
server.run() server.run()

0
SERVER/config_s.csrsa Normal file
View File