Skip to content

aruytehno/membrane-chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

168 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

membrane-chat

Бот: @membrane_chat_bot

Membrane-chat - это простой способ найти новые знакомства и общение в своём окружении. Разместите пригласительную ссылку в группе или канале, или QR-код на видном месте где его заметят (в лифте около кнопок, около домофона и т.д.).

Слоган: "Membrane Chat - твой собственный анонимный чат!"

Чат представляет из себя телеграм-бот для анонимного общения «один на один» внутри изолированных групп — мембран, доступ к которым осуществляется по уникальному 20-символьному ключу. Перед началом общения пользователь настраивает пол и предпочтения по собеседнику, после чего попадает в очередь поиска внутри выбранной мембраны. Сообщения пересылаются в обезличенном виде, без сохранения истории. Мембраны и профили автоматически удаляются через 7 дней неактивности. Ключи генерируются/восстанавливаются по принципу «ключ — это всё»: система хранит только активные мембраны, а сами ключи находятся исключительно у пользователей, что обеспечивает децентрализацию и отсутствие административной нагрузки.


Поддерживаемые типы сообщений

  • Разрешены: текст, emoji, стикеры, GIF, голосовые сообщения (только прямые, не пересланные)
  • Запрещены: фото, видео, видео-сообщения (video notes), контакты, геолокация, файлы любого типа.

Технические спецификации

  • Стек: Python 3.11+, Redis, Docker
  • Хранилище: Все данные хранятся временно в Redis и удаляются при неактивности

Спецификации безопасности

1. Генерация и уникальность ключей

  • Формат: 20 символов (A-Z, a-z, 0-9), визуально группируется как xxxxx-xxxxx-xxxxx-xxxxx
  • Пространство ключей: ≈7.0×10³⁵ уникальных комбинаций
  • Вероятность коллизии: Практически нулевая (≤7.14×10⁻²⁵% при 1 млн ключей)
  • Атака на коллизии: Для достижения 50% вероятности потребуется создавать 1 млрд ключей/день в течение 6000 лет

2. Защита от злоупотреблений

  • Лимит создания: создание/возобновление 1 мембраны в час на пользователя
  • TTL мембран: Автоматическое удаление через 168 часов (7 дней) неактивности
  • TTL профилей: Удаление через 7 дней без активности
  • Ежедневная очистка: Автоматическое удаление "мертвых" мембран и не активных профилей

3. Хранение данных

  • Redis хранит только: Активные сессии, активные мембраны, профили с TTL
  • Не хранится: История сообщений, архив ключей, метаданные переписки
  • Полная анонимность: Сообщения пересылаются без идентификаторов отправителя

4. Управление доступом

  • Децентрализованное хранение: Ключи хранятся у пользователей (сохраненные сообщения, заметки и т.д.)
  • Доступность: Любой пользователь может использовать любой корректный по формату ключ для входа в комнату.
  • Возобновление: Восстановление пользователем мембраны которая ранее была удалена из системы
  • Глубокие ссылки: Поддержка deep-link для удобного приглашения
  • QR-коды: Генерация QR-кодов для быстрого доступа
  • Единовременное присутствие: Пользователь может находиться только в одной мембране одновременно

5. Рекомендации для пользователей

  • Ключ = пароль: Храните ключи как конфиденциальную информацию
  • Не публикуйте открыто: Избегайте публикации ключей в общих чатах/каналах
  • Ротация ключей: При компрометации создайте новую мембрану
  • Естественный цикл: Неиспользуемые ключи автоматически освобождаются через неделю

6. Архитектурные гарантии

  • Нет единой точки отказа: Ключи распределены между пользователями
  • Нет административного доступа: Невозможно принудительно удалить или изменить чужую мембрану
  • Самоочищение: Система автоматически освобождает ресурсы
  • Масштабируемость: Количество активных ключей = количеству мест активности пользователей

Ключевые преимущества подхода

  1. Нулевая административная нагрузка — не нужно управлять ключами вручную
  2. Естественная безопасность — ключи живут только пока их помнят и используют
  3. Математическая надежность — коллизии практически невозможны
  4. Простота понимания — пользователи интуитивно понимают модель "ключ-пароль"
  5. Автоматическое восстановление ресурсов — неактивные ключи освобождаются системой

Данные в Redis

Пользователи (TTL = 7 дней с момента последнего использования):

  • Telegram ID
  • Указанный пол
  • Предпочтение по полу собеседника
  • Время последней активности

Мембраны (TTL = 7 дней с момента последнего успешного match’а):

  • 20-символьный ключ (алфавит: A–Z, a–z, 0–9)
  • Формат ключа: xxxxx-xxxxx-xxxxx-xxxxx (визуальное разделение на 4 блока по 5 символов; в Redis хранится как единая строка из 20 символов).
  • Время последнего match’а

Ограничения и правила

  • Пользователь должен настроить профиль (пол и предпочтения) перед поиском собеседника.
  • Можно находиться только в одной мембране одновременно.
  • Лимит: не более 1 мембраны в час на пользователя (общее количество — не ограничено).
  • При подключении к новой мембране через deep-link из другой мембраны требуется подтверждение выхода.

Интерфейс бота

Основные состояния и экраны

1. Главное меню (/start)

  • Приветственное сообщение с описанием возможностей
  • Кнопки: "Поиск собеседника", "Профиль", "Создать мембрану", "Выйти из мембраны"

2. Настройка профиля (/profile)

  • Текущие настройки: пол, предпочтения по полу, текущая мембрана
  • Инлайн-кнопки для выбора пола (мужской/женский)
  • Инлайн-кнопки для выбора предпочтений (мужской/женский/любой)

3. Создание мембраны (/create)

  • QR-код мембраны (размер 400×400 px)
  • Ключ мембраны в формате xxxxx-xxxxx-xxxxx-xxxxx
  • Инлайн-кнопка "Пригласить" с deep-link

4. Состояние поиска

  • Статус "Ищем собеседника..."
  • Кнопка "Отменить поиск"
  • Таймер ожидания

5. Активный диалог

  • Индикатор "Диалог активен"
  • Кнопки: "Следующий собеседник", "Завершить диалог"
  • Автоматическое получение и отправка сообщений

6. Пустая мембрана (когда собеседник вышел)

  • Уведомление "Собеседник покинул диалог"
  • Кнопки: "Искать снова", "Выйти из мембраны"

7. Подтверждение выхода (при подключении по deep-link)

  • Запрос подтверждения при переходе в новую мембрану
  • Уведомление о потере текущего диалога/поиска
  • Кнопки: "Выйти и перейти", "Остаться"
  • Автоматический переход после подтверждения

Доступные команды

Общие команды:

  • /start — главное меню или перезапуск
  • /start <ключ> — подключение к мембране по ключу
  • /help — справка по командам

Команды профиля:

  • /profile — просмотр и настройка пола и предпочтений

Команды мембран:

  • /create — создать новую мембрану (автовход)
  • /exit — выйти из текущей мембраны

Команды чата:

  • /search — начать поиск собеседника в текущей мембране
  • /next — завершить диалог и вернуться в поиск
  • /stop — выйти из диалога без возврата в очередь

Ограничения доступа:

  • /search — доступна только в мембране, но не в диалоге
  • /next, /stop — доступны только в активном диалоге
  • /create — недоступна при нахождении в другой мембране

Интерфейс использует Reply-клавиатуры для основных действий и Inline-кнопки для настроек. Все сообщения лаконичные, без лишней информации.


Структура проекта:

membrane-chat/
│
├── bot/
│   ├── config.py          # Конфигурация (переменные окружения)
│   ├── handlers.py        # Обработчики команд и сообщений
│   ├── keyboards.py       # Клавиатуры и кнопки
│   ├── logger.py          # Настройка логгера
│   ├── main.py            # Запуск приложения
│   ├── redis.py           # Клиент Redis
│   ├── repositories.py    # Работа с данными (Redis CRUD)
│   ├── services.py        # Бизнес-логика
│   └── utils.py           # Вспомогательные утилиты
│
├── docker-compose.yml
├── requirements.txt
└── README.md

Команды бота

Общие

  • /start — запуск/перезапуск бота
  • /start <ключ> — подключение к мембране
  • /help — справка по командам

Профиль

  • /profile — настройка пола и предпочтений

Мембраны

  • /create — создать новую мембрану и войти в неё
  • /exit — выйти из текущей мембраны (прерывает диалог и поиск)

Чат

  • /search — начать поиск собеседника (если не в диалоге)
  • /next — завершить текущий диалог и вернуться в поиск
  • /stop — просто выйти из диалога без возврата в очередь

Быстрый запуск проекта

Очистить и перезапустить бота:

docker-compose down -v;docker-compose up -d; python -m bot.main
  1. Установить зависимости проекта:
pip install -r requirements.txt
  1. Запустить Redis через Docker:
docker-compose up -d
  1. Запустить бота:
docker-compose up -d; python -m bot.main
python -m bot.main

  1. Остановить бота:
1. Остановить бота (Ctrl+C в терминале где запущен бот)
Остановка контейнеров с сохранением данных (рекомендуется)
docker-compose down
⚠️ Остановка контейнеров с удалением volumes (данные БД будут потеряны!)
docker-compose down -v
  1. Проверка статуса контейнеров:
Показать все запущенные контейнеры
docker-compose ps
Подробная информация о контейнерах
docker ps
Подключение к Redis CLI
Должен ответить: PONG
docker-compose exec redis redis-cli ping
Просмотр статистики использования ресурсов
docker stats

Сборка и запуск проекта

🟩 Вариант 1 — простой (локальная разработка)

🔄 Пересборка контейнера после изменений

Каждый раз, когда меняешь код, ты делаешь:

Просто перезапуск

docker-compose down;docker-compose up -d --build

Перезапуск с логами

docker-compose down;docker-compose up -d --build;docker-compose logs -f

Перезапуск с логами и очисткой redis

docker-compose down -v;docker-compose up -d --build;docker-compose logs -f

Плюсы:

  • Просто.
  • Всегда гарантированно работает.

Минусы:

  • Бот делает перезапуск (1–3 секунды).
  • Пользователь, который как раз писал сообщение → может получить «бот не отвечает».

Для разработки вполне ок 👍


🟦 Вариант 2 — без остановки Redis, только бот

Redis не нужно трогать, он хранит данные. Можно пересобрать только ботбез разрушения сети/томов:

docker-compose build bot;docker-compose up -d bot;docker-compose logs -f

Плюсы:

  • Redis не перезапускается (данные сохранены).
  • Бот будет перезапущен быстрее.

Минусы:

  • Всё ещё небольшая пауза в работе.

Логи в реальном времени (слежение)

# Через docker-compose
docker-compose logs -f

Улучшения и фичи на рассмотрение:

Надо делать:

  • Добавить возможность опционально генерировать qr-код или не генерировать
  • Добавить возможность добавлять своё изображение для обложки приглашения
  • Добавить что пользователь может не указывать пол - будет пол по умолчанию - "Не указан". Будет соединяться с теми - кому пол "Не важен".
  • Добавить подключение к мембране по умолчанию что бы пользователь мог ознакомиться с функционалом и возможностями. - это хорошая идея велком мембраны в канале мембрана чата
  • При подключении к мембране сразу запускается поиск в ней, не надо — останавливаем поиск

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors