Repo Health

Рейтинг здоровья открытых репозиториев

Оценка от 0 до 100 по данным SourceCraft.

4 категории из 6, пересчёт раз в сутки. Как считается

  1. 26

    Веб-приложение для отказа от курения с системой физической ответственности: за каждую сигарету пользователь выполняет отжимания, количество которых растет каждую неделю. Включает личный кабинет, статистику, настройки и подписку.

    TypeScript64 дня назад0лайков
  2. 26

    HTML417 дней назад0лайков
  3. 12966–13463sziuzev/sbz
    26

    JavaScript586 дней назад0лайков
  4. 26

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

    Python311 дней назад0лайков
  5. 26

    HTML25 дней назад0лайков
  6. 26

    Создание лендинга с использованием современных технологий искусственного интеллекта

    HTML41 день назад0лайков
  7. 26

    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.

    516 дней назад0лайков
  8. 12966–13463tdanil776/day-10
    26

    325 дней назад0лайков
  9. 26

    331 день назад0лайков
  10. 26

    324 дня назад0лайков
  11. 26

    Современная игра в стиле тетриса с обновленной графикой на движке Unity для мобильных устройств

    C#321 день назад0лайков
  12. 26

    C#25 дней назад0лайков
  13. 26

    ридмик моего профиля

    49 дней назад0лайков
  14. 26

    ###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

    Python356 дней назад0лайков
  15. 26

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

    239 дней назад0лайков
  16. 26

    Python180 дней назад0лайков
  17. 26

    245 дней назад0лайков
  18. 12966–13463tolpil4/tolpil
    26

    Профиль Fullstack-разработчика

    148 дней назад0лайков
  19. 26

    85 дней назад0лайков
  20. 26

    Складская программа для учёта товаров, наценок, скидок, продаж, перефасовки и отчётов

    HTML311 дней назад0лайков
  21. 26

    Template for task: source

    226 дней назад0лайков
  22. 26

    HTML24 дня назад0лайков
  23. 26

    HTML24 дня назад0лайков
  24. 12966–13463tuk4evt/dz-03-seti
    26

    36 дней назад0лайков
  25. 26

    Адаптивный лендинг кофейни «Кофейный котик»: тёплая цветовая гамма, sticky-навигация, меню, акции, бонусная программа и контакты.

    42 дня назад0лайков
Показать ещё 0

13 376–13 400 из 21 912

Выбрано 3 из 3