Рейтинг здоровья открытых репозиториев
Оценка от 0 до 100 по данным SourceCraft.Оценка от 0 до 100 по данным SourceCraft: насколько проект жив, документирован и отзывчив к пользователям.
4 категории из 6, пересчёт раз в сутки. Как считается
Оценка по открытым данным: 4 категории из 6, пересчёт раз в сутки, лайки на место не влияют. Как считается
| Сравнить | Место | Репозиторий | Оценка | 90 дней | Категории | Последний коммит | Лайки | Язык |
|---|---|---|---|---|---|---|---|---|
| 12973–13470 | Шаблон хакатона ИИ ЧЕМП для кейса «Пользовательский ИИ-навык» от SourceCraft (Яндекс) | 26 | 245 дней назад | 0 | ||||
| 12973–13470 | 26 | 24 дня назад | 0 | |||||
| 12973–134703477Опустился на 3477 мест за 30 дней | 26 | 416 дней назад | 0 | HTML | ||||
| 12973–134702756Опустился на 2756 мест за 30 дней | srtj | 26 | 473 дня назад | 0 | Python | |||
| 12973–13470 | 26 | 248 дней назад | 0 | |||||
| 12973–13470 | 26 | 24 дня назад | 0 | |||||
| 12973–13470 | 26 | мало данных | 24 дня назад | 0 | HTML | |||
| 12973–134709457Опустился на 9457 мест за 30 дней | Веб-приложение для отказа от курения с системой физической ответственности: за каждую сигарету пользователь выполняет отжимания, количество которых растет каждую неделю. Включает личный кабинет, статистику, настройки и подписку. | 26 | 63 дня назад | 0 | TypeScript | |||
| 12973–134703477Опустился на 3477 мест за 30 дней | 26 | 416 дней назад | 0 | HTML | ||||
| 12973–134704748Опустился на 4748 мест за 30 дней | 26 | 585 дней назад | 0 | JavaScript | ||||
| 12973–134703477Опустился на 3477 мест за 30 дней | import asyncio from datetime import datetime, date from aiogram import Bot, Dispatcher, F from aiogram.types import ( Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton ) # ================== НАСТРОЙКИ ================== BOT_TOKEN = "PASTE_YOUR_BOT_TOKEN" WORK_CHAT_ID = -1001111111111 # рабочий чат SUPERVISOR_ID = 222222222 # супервайзер CONTROL_TIMES = { "morning": "09:00", "day": "12:30", "evening": "17:00" } TERRITORIES = [ "Дмитров", "Долгопрудный", "Зеленоград", "Клин", "Митино", "Солнечногорск" ] # ================== ХРАНИЛИЩЕ (IN-MEMORY) ================== users = {} # user_id: {fio, territory} reports = {} # user_id: {date: {morning, day, evening}} discipline = {} # user_id: {late, missed} def today(): return date.today().isoformat() # ================== КНОПКИ ================== def territory_kb(): return InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text=t, callback_data=f"territory:{t}")] for t in TERRITORIES ] ) def report_kb(): return InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="🌅 Утро", callback_data="report:morning")], [InlineKeyboardButton(text="🕧 День", callback_data="report:day")], [InlineKeyboardButton(text="🌙 Вечер", callback_data="report:evening")] ] ) # ================== BOT ================== bot = Bot(token=BOT_TOKEN) dp = Dispatcher() # ================== HANDLERS ================== @dp.message(F.text == "/start") async def start(msg: Message): await msg.answer( "👋 Добро пожаловать!\nВыберите территорию:", reply_markup=territory_kb() ) @dp.callback_query(F.data.startswith("territory:")) async def set_territory(cb: CallbackQuery): territory = cb.data.split(":")[1] users[cb.from_user.id] = { "fio": cb.from_user.full_name, "territory": territory } await cb.message.answer( f"📍 Территория закреплена: {territory}\n\n" f"Выберите тип отчета:", reply_markup=report_kb() ) await cb.answer() @dp.callback_query(F.data.startswith("report:")) async def submit_report(cb: CallbackQuery): report_type = cb.data.split(":")[1] uid = cb.from_user.id reports.setdefault(uid, {}).setdefault(today(), {}) reports[uid][today()][report_type] = True await cb.message.answer( f"✅ Отчет «{report_type.upper()}» принят" ) await bot.send_message( WORK_CHAT_ID, f"📊 Отчет сдан\n" f"👤 {users[uid]['fio']}\n" f"📍 {users[uid]['territory']}\n" f"🕘 Тип: {report_type}" ) await cb.answer() # ================== SCHEDULER ================== async def check_reports(): now = datetime.now().strftime("%H:%M") for report_type, control_time in CONTROL_TIMES.items(): if now == control_time: for uid, user in users.items(): user_reports = reports.get(uid, {}).get(today(), {}) if not user_reports.get(report_type): # личка ТП await bot.send_message( uid, f"❗ ВНИМАНИЕ\n\n" f"{user['fio']}, отчет НЕ СДАН\n" f"Тип: {report_type.upper()}\n" f"📍 Территория: {user['territory']}" ) # рабочий чат await bot.send_message( WORK_CHAT_ID, f"⏰ Контроль отчетов\n" f"❌ {user['fio']} — {user['territory']}\n" f"Отчет: {report_type.upper()}" ) # дисциплина discipline.setdefault(uid, {"late": 0, "missed": 0}) discipline[uid]["missed"] += 1 # эскалация await bot.send_message( SUPERVISOR_ID, f"🚨 ЭСКАЛАЦИЯ\n\n" f"ТП не сдал отчет:\n" f"{user['fio']} — {user['territory']}\n" f"Тип: {report_type.upper()}" ) async def scheduler(): while True: await check_reports() await asyncio.sleep(60) # ================== START ================== async def main(): asyncio.create_task(scheduler()) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) | 26 | 310 дней назад | 0 | Python | |||
| 12973–13470 | 26 | мало данных | 24 дня назад | 0 | HTML | |||
| 12973–13470 | Создание лендинга с использованием современных технологий искусственного интеллекта | 26 | 40 дней назад | 0 | HTML | |||
| 12973–134703478Опустился на 3478 мест за 30 дней | Supercharge your workflow automation with this curated collection of n8n templates! Instantly connect your favorite apps-like Gmail, Telegram, Google Drive, Slack, and more-with ready-to-use, AI-powered automations. Save time, boost productivity, and unlock the true potential of n8n in just a few clicks. | 26 | 515 дней назад | 0 | ||||
| 12973–134703477Опустился на 3477 мест за 30 дней | 26 | 324 дня назад | 0 | |||||
| 12973–134703477Опустился на 3477 мест за 30 дней | 26 | 330 дней назад | 0 | |||||
| 12973–134703477Опустился на 3477 мест за 30 дней | 26 | 323 дня назад | 0 | |||||
| 12973–134704504Поднялся на 4504 места за 30 дней | Современная игра в стиле тетриса с обновленной графикой на движке Unity для мобильных устройств | 26 | 320 дней назад | 0 | C# | |||
| 12973–13470 | 26 | мало данных | 24 дня назад | 0 | C# | |||
| 12973–13470 | ридмик моего профиля | 26 | 48 дней назад | 0 | ||||
| 12973–134703477Опустился на 3477 мест за 30 дней | ###We're no strangers to love You know the rules and so do I A full commitment's what I'm thinking of You wouldn't get this from any other guy I just wanna tell you how I'm feeling Gotta make you understand Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you We've know each other for so long Your heart's been aching But you're too shy to say it Inside we both know what's been going on We know the game and we're gonna play it And if you ask me how I'm feeling Don't tell me you're too blind to see Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you | 26 | 355 дней назад | 0 | Python | |||
| 12973–13470 | import socket import threading import json import os import sys import time from datetime import datetime class SimpleMessenger: def init(self): self.my_port = 5000 self.target_ip = "127.0.0.1" self.target_port = 5000 self.socket = None self.connected = False self.listening = False self.running = True self.messages = [] def clear(self): """Очистка экрана""" os.system('cls' if os.name == 'nt' else 'clear') def print_header(self): """Печать заголовка""" print("\n" + "█"*50) print(" ОФФЛАЙН МЕССЕНДЖЕР v1.0") print("█"*50) def print_status(self): """Печать статуса""" status = "ПОДКЛЮЧЕН" if self.connected else "НЕ ПОДКЛЮЧЕН" color = "\033[92m" if self.connected else "\033[91m" print(f"\nСтатус: {color}{status}\033[0m") if self.connected: print(f"Соединение: {self.target_ip}:{self.target_port}") print("-"*50) def show_menu(self): """Показать главное меню""" self.clear() self.print_header() self.print_status() print("\n1. 📡 Запустить сервер (режим ожидания)") print("2. 🔌 Подключиться к серверу") print("3. 💬 Отправить сообщение") print("4. 📁 Отправить файл") print("5. ❌ Отключиться") print("6. ⚙️ Настройки") print("7. 🚪 Выход") print("\n" + "-"*50) def start_server(self): """Запуск сервера""" if self.listening: print("⚠️ Сервер уже запущен!") return try: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', self.my_port)) server.listen(1) print(f"\n✅ Сервер запущен на порту {self.my_port}") print("⏳ Ожидание подключения...") # Принимаем подключение в отдельном потоке def accept(): try: self.socket, addr = server.accept() self.connected = True self.target_ip, self.target_port = addr print(f"\n🎉 Подключено к {self.target_ip}:{self.target_port}") # Запускаем прием сообщений receive_thread = threading.Thread(target=self.receive_messages, daemon=True) receive_thread.start() server.close() except Exception as e: print(f"\n❌ Ошибка: {e}") threading.Thread(target=accept, daemon=True).start() self.listening = True except Exception as e: print(f"\n❌ Ошибка запуска сервера: {e}") def connect(self): """Подключение к серверу""" if self.connected: print("⚠️ Уже подключены!") return try: print(f"\n🔄 Подключение к {self.target_ip}:{self.target_port}...") self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.target_ip, self.target_port)) self.connected = True print(f"✅ Подключено успешно!") # Запускаем прием сообщений receive_thread = threading.Thread(target=self.receive_messages, daemon=True) receive_thread.start() except Exception as e: print(f"\n❌ Ошибка подключения: {e}") def send_message(self): """Отправка сообщения""" if not self.connected: print("\n❌ Нет подключения!") return print("\n📝 Введите сообщение (пустая строка для отмены):") message = input("➤ ").strip() if not message: return data = {"type": "msg", "content": message, "time": datetime.now().strftime("%H:%M:%S") } try: self.socket.send((json.dumps(data) + "\n").encode()) print(f"\n💬 [{datetime.now().strftime('%H:%M:%S')}] Вы: {message}") self.messages.append(("Вы", message, datetime.now().strftime("%H:%M:%S"))) except Exception as e: print(f"\n❌ Ошибка отправки: {e}") self.disconnect() def send_file(self): """Отправка файла""" if not self.connected: print("\n❌ Нет подключения!") return path = input("\n📂 Введите путь к файлу: ").strip() if not os.path.exists(path): print("❌ Файл не найден!") return try: name = os.path.basename(path) size = os.path.getsize(path) print(f"📤 Отправка файла {name} ({size} байт)...") # Отправляем информацию о файле info = { "type": "file", "name": name, "size": size } self.socket.send((json.dumps(info) + "\n").encode()) # Отправляем содержимое файла with open(path, "rb") as f: sent = 0 while sent < size: chunk = f.read(4096) if not chunk: break self.socket.send(chunk) sent += len(chunk) print(f"✅ Файл {name} отправлен!") self.messages.append(("Вы", f"[Файл] {name}", datetime.now().strftime("%H:%M:%S"))) except Exception as e: print(f"❌ Ошибка: {e}") def receive_messages(self): """Прием сообщений""" buffer = "" while self.connected: try: data = self.socket.recv(4096).decode() if not data: break buffer += data while "\n" in buffer: line, buffer = buffer.split("\n", 1) if line.strip(): self.process_message(line) except Exception as e: if self.connected: print(f"\n⚠️ Потеряно соединение: {e}") break self.disconnect() def process_message(self, data_str): """Обработка полученного сообщения""" try: data = json.loads(data_str) if data["type"] == "msg": text = f"[{data['time']}] Собеседник: {data['content']}" print(f"\n💬 {text}") self.messages.append(("Собеседник", data['content'], data['time'])) print("\n➤ ", end="", flush=True) elif data["type"] == "file": self.receive_file(data["name"], data["size"]) except Exception as e: print(f"❌ Ошибка обработки: {e}") def receive_file(self, name, size): """Получение файла""" save_path = input(f"\n📥 Сохранить файл '{name}' как (Enter для '{name}'): ").strip() if not save_path: save_path = name try: print(f"📥 Получение файла {name} ({size} байт)...") received = 0 with open(save_path, "wb") as f: while received < size: chunk = self.socket.recv(min(4096, size - received)) if not chunk: break f.write(chunk) received += len(chunk) print(f"✅ Файл сохранен как {save_path}") self.messages.append(("Собеседник", f"[Файл] {name}", datetime.now().strftime("%H:%M:%S"))) print("\n➤ ", end="", flush=True)except Exception as e: print(f"❌ Ошибка сохранения: {e}") def disconnect(self): """Отключение""" if self.socket: try: self.socket.close() except: pass self.socket = None self.connected = False self.listening = False print("\n🔌 Отключено") def settings(self): """Настройки""" self.clear() self.print_header() print("\n⚙️ НАСТРОЙКИ") print("-"*50) print(f"1. Мой порт: {self.my_port}") print(f"2. IP собеседника: {self.target_ip}") print(f"3. Порт собеседника: {self.target_port}") print("4. Показать историю сообщений") print("5. Очистить историю") print("6. Назад") print("-"*50) choice = input("\nВыберите параметр: ") if choice == "1": try: port = int(input("Введите новый порт: ")) self.my_port = port print(f"✅ Порт изменен на {port}") except: print("❌ Неверный порт!") elif choice == "2": ip = input("Введите IP адрес: ") self.target_ip = ip print(f"✅ IP изменен на {ip}") elif choice == "3": try: port = int(input("Введите порт: ")) self.target_port = port print(f"✅ Порт изменен на {port}") except: print("❌ Неверный порт!") elif choice == "4": self.show_history() elif choice == "5": self.messages = [] print("✅ История очищена") input("\nНажмите Enter для продолжения...") def show_history(self): """Показать историю сообщений""" self.clear() self.print_header() print("\n📜 ИСТОРИЯ СООБЩЕНИЙ") print("-"*50) if not self.messages: print("История пуста") else: for sender, text, time in self.messages: print(f"[{time}] {sender}: {text}") print("-"*50) input("\nНажмите Enter для продолжения...") def run(self): """Основной цикл""" while self.running: self.show_menu() choice = input("Выберите действие (1-7): ").strip() if choice == "1": self.start_server() elif choice == "2": self.connect() elif choice == "3": self.send_message() elif choice == "4": self.send_file() elif choice == "5": self.disconnect() elif choice == "6": self.settings() elif choice == "7": print("\n👋 До свидания!") self.running = False else: print("\n❌ Неверный выбор!") if self.running and not self.connected and choice not in ["1", "6", "7"]: input("\nНажмите Enter для продолжения...") self.disconnect() | 26 | 238 дней назад | 0 | ||||
| 12973–134704491Опустился на 4491 место за 30 дней | 26 | 179 дней назад | 0 | Python | ||||
| 12973–13470 | 26 | 244 дня назад | 0 | |||||
| 12973–13470 | Профиль Fullstack-разработчика | 26 | 147 дней назад | 0 |
- 12973–13470sourcecraft/ai-champ-spring-26-yandex26
Шаблон хакатона ИИ ЧЕМП для кейса «Пользовательский ИИ-навык» от SourceCraft (Яндекс)
245 дней назад0лайков - 12973–13470sr-close/app2624 дня назад0лайков
- 12973–13470st-kraynov/docker26HTML416 дней назад0лайков
- 12973–13470stepanovanaya/rasspisanie26
srtj
Python473 дня назад0лайков - 12973–13470stepanovnn-yandexlyceum-ru/krutptoject26248 дней назад0лайков
- 12973–13470storie/su2624 дня назад0лайков
- 12973–13470sudarikovalexey/vibe-projects26HTML24 дня назад0лайков
- 12973–13470svconsult2015/quit-and-push26
Веб-приложение для отказа от курения с системой физической ответственности: за каждую сигарету пользователь выполняет отжимания, количество которых растет каждую неделю. Включает личный кабинет, статистику, настройки и подписку.
TypeScript63 дня назад0лайков - 12973–13470svmikhajlo-mts-ru/neuroscale-serverless26HTML416 дней назад0лайков
- 12973–13470sziuzev/sbz26JavaScript585 дней назад0лайков
- 12973–13470taboo1993/ap-mo-sever-426
import asyncio from datetime import datetime, date from aiogram import Bot, Dispatcher, F from aiogram.types import ( Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton ) # ================== НАСТРОЙКИ ================== BOT_TOKEN = "PASTE_YOUR_BOT_TOKEN" WORK_CHAT_ID = -1001111111111 # рабочий чат SUPERVISOR_ID = 222222222 # супервайзер CONTROL_TIMES = { "morning": "09:00", "day": "12:30", "evening": "17:00" } TERRITORIES = [ "Дмитров", "Долгопрудный", "Зеленоград", "Клин", "Митино", "Солнечногорск" ] # ================== ХРАНИЛИЩЕ (IN-MEMORY) ================== users = {} # user_id: {fio, territory} reports = {} # user_id: {date: {morning, day, evening}} discipline = {} # user_id: {late, missed} def today(): return date.today().isoformat() # ================== КНОПКИ ================== def territory_kb(): return InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text=t, callback_data=f"territory:{t}")] for t in TERRITORIES ] ) def report_kb(): return InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="🌅 Утро", callback_data="report:morning")], [InlineKeyboardButton(text="🕧 День", callback_data="report:day")], [InlineKeyboardButton(text="🌙 Вечер", callback_data="report:evening")] ] ) # ================== BOT ================== bot = Bot(token=BOT_TOKEN) dp = Dispatcher() # ================== HANDLERS ================== @dp.message(F.text == "/start") async def start(msg: Message): await msg.answer( "👋 Добро пожаловать!\nВыберите территорию:", reply_markup=territory_kb() ) @dp.callback_query(F.data.startswith("territory:")) async def set_territory(cb: CallbackQuery): territory = cb.data.split(":")[1] users[cb.from_user.id] = { "fio": cb.from_user.full_name, "territory": territory } await cb.message.answer( f"📍 Территория закреплена: {territory}\n\n" f"Выберите тип отчета:", reply_markup=report_kb() ) await cb.answer() @dp.callback_query(F.data.startswith("report:")) async def submit_report(cb: CallbackQuery): report_type = cb.data.split(":")[1] uid = cb.from_user.id reports.setdefault(uid, {}).setdefault(today(), {}) reports[uid][today()][report_type] = True await cb.message.answer( f"✅ Отчет «{report_type.upper()}» принят" ) await bot.send_message( WORK_CHAT_ID, f"📊 Отчет сдан\n" f"👤 {users[uid]['fio']}\n" f"📍 {users[uid]['territory']}\n" f"🕘 Тип: {report_type}" ) await cb.answer() # ================== SCHEDULER ================== async def check_reports(): now = datetime.now().strftime("%H:%M") for report_type, control_time in CONTROL_TIMES.items(): if now == control_time: for uid, user in users.items(): user_reports = reports.get(uid, {}).get(today(), {}) if not user_reports.get(report_type): # личка ТП await bot.send_message( uid, f"❗ ВНИМАНИЕ\n\n" f"{user['fio']}, отчет НЕ СДАН\n" f"Тип: {report_type.upper()}\n" f"📍 Территория: {user['territory']}" ) # рабочий чат await bot.send_message( WORK_CHAT_ID, f"⏰ Контроль отчетов\n" f"❌ {user['fio']} — {user['territory']}\n" f"Отчет: {report_type.upper()}" ) # дисциплина discipline.setdefault(uid, {"late": 0, "missed": 0}) discipline[uid]["missed"] += 1 # эскалация await bot.send_message( SUPERVISOR_ID, f"🚨 ЭСКАЛАЦИЯ\n\n" f"ТП не сдал отчет:\n" f"{user['fio']} — {user['territory']}\n" f"Тип: {report_type.upper()}" ) async def scheduler(): while True: await check_reports() await asyncio.sleep(60) # ================== START ================== async def main(): asyncio.create_task(scheduler()) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())
Python310 дней назад0лайков - 12973–13470tantana-benua/trainer1234test26HTML24 дня назад0лайков
- 12973–13470tayablumm/lab4informatika26
Создание лендинга с использованием современных технологий искусственного интеллекта
HTML40 дней назад0лайков - 12973–13470tchiv63/awesome-n8n-templates26
Supercharge your workflow automation with this curated collection of n8n templates! Instantly connect your favorite apps-like Gmail, Telegram, Google Drive, Slack, and more-with ready-to-use, AI-powered automations. Save time, boost productivity, and unlock the true potential of n8n in just a few clicks.
515 дней назад0лайков - 12973–13470tdanil776/day-1026324 дня назад0лайков
- 12973–13470terekhovetvos/git-day-0526330 дней назад0лайков
- 12973–13470terekhovetvos/git-day-1026323 дня назад0лайков
- 12973–13470tetris-project/modern-tetris-unity26
Современная игра в стиле тетриса с обновленной графикой на движке Unity для мобильных устройств
C#320 дней назад0лайков - 12973–13470teu19628-gmail-com/chis26C#24 дня назад0лайков
- 12973–13470themakarik/themakarik26
ридмик моего профиля
48 дней назад0лайков - 12973–13470tigratyt/saint-petersburg-chernov26
###We're no strangers to love You know the rules and so do I A full commitment's what I'm thinking of You wouldn't get this from any other guy I just wanna tell you how I'm feeling Gotta make you understand Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you We've know each other for so long Your heart's been aching But you're too shy to say it Inside we both know what's been going on We know the game and we're gonna play it And if you ask me how I'm feeling Don't tell me you're too blind to see Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you
Python355 дней назад0лайков - 12973–13470tigrlvovichx228/khuinia-kakaeto26
import socket import threading import json import os import sys import time from datetime import datetime class SimpleMessenger: def init(self): self.my_port = 5000 self.target_ip = "127.0.0.1" self.target_port = 5000 self.socket = None self.connected = False self.listening = False self.running = True self.messages = [] def clear(self): """Очистка экрана""" os.system('cls' if os.name == 'nt' else 'clear') def print_header(self): """Печать заголовка""" print("\n" + "█"*50) print(" ОФФЛАЙН МЕССЕНДЖЕР v1.0") print("█"*50) def print_status(self): """Печать статуса""" status = "ПОДКЛЮЧЕН" if self.connected else "НЕ ПОДКЛЮЧЕН" color = "\033[92m" if self.connected else "\033[91m" print(f"\nСтатус: {color}{status}\033[0m") if self.connected: print(f"Соединение: {self.target_ip}:{self.target_port}") print("-"*50) def show_menu(self): """Показать главное меню""" self.clear() self.print_header() self.print_status() print("\n1. 📡 Запустить сервер (режим ожидания)") print("2. 🔌 Подключиться к серверу") print("3. 💬 Отправить сообщение") print("4. 📁 Отправить файл") print("5. ❌ Отключиться") print("6. ⚙️ Настройки") print("7. 🚪 Выход") print("\n" + "-"*50) def start_server(self): """Запуск сервера""" if self.listening: print("⚠️ Сервер уже запущен!") return try: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', self.my_port)) server.listen(1) print(f"\n✅ Сервер запущен на порту {self.my_port}") print("⏳ Ожидание подключения...") # Принимаем подключение в отдельном потоке def accept(): try: self.socket, addr = server.accept() self.connected = True self.target_ip, self.target_port = addr print(f"\n🎉 Подключено к {self.target_ip}:{self.target_port}") # Запускаем прием сообщений receive_thread = threading.Thread(target=self.receive_messages, daemon=True) receive_thread.start() server.close() except Exception as e: print(f"\n❌ Ошибка: {e}") threading.Thread(target=accept, daemon=True).start() self.listening = True except Exception as e: print(f"\n❌ Ошибка запуска сервера: {e}") def connect(self): """Подключение к серверу""" if self.connected: print("⚠️ Уже подключены!") return try: print(f"\n🔄 Подключение к {self.target_ip}:{self.target_port}...") self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.target_ip, self.target_port)) self.connected = True print(f"✅ Подключено успешно!") # Запускаем прием сообщений receive_thread = threading.Thread(target=self.receive_messages, daemon=True) receive_thread.start() except Exception as e: print(f"\n❌ Ошибка подключения: {e}") def send_message(self): """Отправка сообщения""" if not self.connected: print("\n❌ Нет подключения!") return print("\n📝 Введите сообщение (пустая строка для отмены):") message = input("➤ ").strip() if not message: return data = {"type": "msg", "content": message, "time": datetime.now().strftime("%H:%M:%S") } try: self.socket.send((json.dumps(data) + "\n").encode()) print(f"\n💬 [{datetime.now().strftime('%H:%M:%S')}] Вы: {message}") self.messages.append(("Вы", message, datetime.now().strftime("%H:%M:%S"))) except Exception as e: print(f"\n❌ Ошибка отправки: {e}") self.disconnect() def send_file(self): """Отправка файла""" if not self.connected: print("\n❌ Нет подключения!") return path = input("\n📂 Введите путь к файлу: ").strip() if not os.path.exists(path): print("❌ Файл не найден!") return try: name = os.path.basename(path) size = os.path.getsize(path) print(f"📤 Отправка файла {name} ({size} байт)...") # Отправляем информацию о файле info = { "type": "file", "name": name, "size": size } self.socket.send((json.dumps(info) + "\n").encode()) # Отправляем содержимое файла with open(path, "rb") as f: sent = 0 while sent < size: chunk = f.read(4096) if not chunk: break self.socket.send(chunk) sent += len(chunk) print(f"✅ Файл {name} отправлен!") self.messages.append(("Вы", f"[Файл] {name}", datetime.now().strftime("%H:%M:%S"))) except Exception as e: print(f"❌ Ошибка: {e}") def receive_messages(self): """Прием сообщений""" buffer = "" while self.connected: try: data = self.socket.recv(4096).decode() if not data: break buffer += data while "\n" in buffer: line, buffer = buffer.split("\n", 1) if line.strip(): self.process_message(line) except Exception as e: if self.connected: print(f"\n⚠️ Потеряно соединение: {e}") break self.disconnect() def process_message(self, data_str): """Обработка полученного сообщения""" try: data = json.loads(data_str) if data["type"] == "msg": text = f"[{data['time']}] Собеседник: {data['content']}" print(f"\n💬 {text}") self.messages.append(("Собеседник", data['content'], data['time'])) print("\n➤ ", end="", flush=True) elif data["type"] == "file": self.receive_file(data["name"], data["size"]) except Exception as e: print(f"❌ Ошибка обработки: {e}") def receive_file(self, name, size): """Получение файла""" save_path = input(f"\n📥 Сохранить файл '{name}' как (Enter для '{name}'): ").strip() if not save_path: save_path = name try: print(f"📥 Получение файла {name} ({size} байт)...") received = 0 with open(save_path, "wb") as f: while received < size: chunk = self.socket.recv(min(4096, size - received)) if not chunk: break f.write(chunk) received += len(chunk) print(f"✅ Файл сохранен как {save_path}") self.messages.append(("Собеседник", f"[Файл] {name}", datetime.now().strftime("%H:%M:%S"))) print("\n➤ ", end="", flush=True)except Exception as e: print(f"❌ Ошибка сохранения: {e}") def disconnect(self): """Отключение""" if self.socket: try: self.socket.close() except: pass self.socket = None self.connected = False self.listening = False print("\n🔌 Отключено") def settings(self): """Настройки""" self.clear() self.print_header() print("\n⚙️ НАСТРОЙКИ") print("-"*50) print(f"1. Мой порт: {self.my_port}") print(f"2. IP собеседника: {self.target_ip}") print(f"3. Порт собеседника: {self.target_port}") print("4. Показать историю сообщений") print("5. Очистить историю") print("6. Назад") print("-"*50) choice = input("\nВыберите параметр: ") if choice == "1": try: port = int(input("Введите новый порт: ")) self.my_port = port print(f"✅ Порт изменен на {port}") except: print("❌ Неверный порт!") elif choice == "2": ip = input("Введите IP адрес: ") self.target_ip = ip print(f"✅ IP изменен на {ip}") elif choice == "3": try: port = int(input("Введите порт: ")) self.target_port = port print(f"✅ Порт изменен на {port}") except: print("❌ Неверный порт!") elif choice == "4": self.show_history() elif choice == "5": self.messages = [] print("✅ История очищена") input("\nНажмите Enter для продолжения...") def show_history(self): """Показать историю сообщений""" self.clear() self.print_header() print("\n📜 ИСТОРИЯ СООБЩЕНИЙ") print("-"*50) if not self.messages: print("История пуста") else: for sender, text, time in self.messages: print(f"[{time}] {sender}: {text}") print("-"*50) input("\nНажмите Enter для продолжения...") def run(self): """Основной цикл""" while self.running: self.show_menu() choice = input("Выберите действие (1-7): ").strip() if choice == "1": self.start_server() elif choice == "2": self.connect() elif choice == "3": self.send_message() elif choice == "4": self.send_file() elif choice == "5": self.disconnect() elif choice == "6": self.settings() elif choice == "7": print("\n👋 До свидания!") self.running = False else: print("\n❌ Неверный выбор!") if self.running and not self.connected and choice not in ["1", "6", "7"]: input("\nНажмите Enter для продолжения...") self.disconnect()
238 дней назад0лайков - 12973–13470tikanchik135/fittracker26Python179 дней назад0лайков
- 12973–13470timur-rafikov2006/put-the-tea-on-126244 дня назад0лайков
- 12973–13470tolpil4/tolpil26
Профиль Fullstack-разработчика
147 дней назад0лайков
13 376–13 400 из 21 919