add readme && update for stable

This commit is contained in:
2025-02-28 23:15:33 +03:00
parent 3392df2919
commit 2368b5df8c
7 changed files with 117 additions and 11 deletions
+9 -5
View File
@@ -1,16 +1,20 @@
# Ignore everything
* *
!.gitignore
# Except these files
!.gitignore
!docker-compose.yaml !docker-compose.yaml
!requirements.txt !requirements.txt
!readme.md
# Except these directories and their contents
!/app !/app
!app/* !/app/*
!/app/plugin !/app/plugin
!app/plugin/* !/app/plugin/*
# Ignore specific files and directories
app/bot.py app/bot.py
__pycache__/ __pycache__/
.env .env
.venv
+6 -2
View File
@@ -34,8 +34,11 @@ class Messages:
"Привет! Это бот Quick dates (Random Coffee). Чтобы зарегистрироваться, пожалуйста, ответь на следующие вопросы." # несколько сообщений подряд "Привет! Это бот Quick dates (Random Coffee). Чтобы зарегистрироваться, пожалуйста, ответь на следующие вопросы." # несколько сообщений подряд
] ]
HELPS = [ HELPS = [
"Доступные команды:" "\n/start - начать регистрацию" "n/help - помощь", "Доступные команды:" "\n/start - начать регистрацию",
"Начало мероприятия: {} \nЭто через целых {} минут!", "\n/help - помощь",
"\n/source - исходный код бота на Github",
"\n\nCreated by АйТи блок ВМК with love ❤️",
# "Начало мероприятия: {} \nЭто через целых {} минут!",
] ]
ERROR = "Произошла ошибка" ERROR = "Произошла ошибка"
@@ -57,3 +60,4 @@ class Messages:
MATCHING_START = ( MATCHING_START = (
"Мы начали подбор пар. Пожалуйста, подтверди, что ты находишься в аудитории" "Мы начали подбор пар. Пожалуйста, подтверди, что ты находишься в аудитории"
) )
START_DATE = f"Наше мероприятие начнётся {os.environ.get('DATE_START')} следите за новостями!"
+11
View File
@@ -71,6 +71,17 @@ def help_message(message: types.Message):
return return
@bot.message_handler(commands=BotCommands.Source)
def source(message: types.Message):
bot.send_message(
message.chat.id,
"[Страничка бота на Github!](https://github.com/kr0sh512/rc-tgbot)",
parse_mode="Markdown",
)
return
if __name__ == "__main__": if __name__ == "__main__":
print("/t--- Bot started ---") print("/t--- Bot started ---")
+2 -2
View File
@@ -115,7 +115,7 @@ class Admin:
return wrapper return wrapper
@bot.message_handler(commands=["admin"]) @bot.message_handler(commands=["admin_reg"])
def add_admin_command(message): def add_admin_command(message):
bot.send_message(message.chat.id, "Введите unique_key") bot.send_message(message.chat.id, "Введите unique_key")
bot.register_next_step_handler(message, Admin.add_admin_step) bot.register_next_step_handler(message, Admin.add_admin_step)
@@ -346,7 +346,7 @@ class AdminMessages:
ADMIN_HELP = ( ADMIN_HELP = (
"Вы администратор! Вот что вы можете сделать:\n" "Вы администратор! Вот что вы можете сделать:\n"
"/remove_admin - удалить админа\n" "/remove_admin - удалить админа\n"
"/generate_key - сгенерировать уникальный ключ\n" "/generate_key - сгенерировать уникальный ключ (<code>admin_red</code> - чтобы админ добавился)\n"
"/delete_user - удалить пользователя\n" "/delete_user - удалить пользователя\n"
"/stats - статистика\n" "/stats - статистика\n"
"/send_message - отправить всем сообщение\n" "/send_message - отправить всем сообщение\n"
+22 -1
View File
@@ -1,13 +1,34 @@
import telebot import telebot
from config import config from config import config
import threading import threading
import time
class BotCommands: class BotCommands:
Start = ["start", "s"] Start = ["start", "s"]
Help = ["help", "h"] Help = ["help", "h", "помощь"]
Source = ["source"]
original_send_message = telebot.TeleBot.send_message
def send_message_with_try_catch(self, chat_id, text, *args, **kwargs):
try:
return original_send_message(self, chat_id, text, *args, **kwargs)
except Exception as e:
print(f"Error sending message: {e}. Retrying in 5 seconds...")
try:
time.sleep(5)
return original_send_message(self, chat_id, text, *args, **kwargs)
except Exception as e:
print(f"Second attempt failed: {e}")
telebot.TeleBot.send_message = send_message_with_try_catch
bot = telebot.TeleBot( bot = telebot.TeleBot(
config.API_TOKEN, config.API_TOKEN,
colorful_logs=True, colorful_logs=True,
+2
View File
@@ -176,10 +176,12 @@ def show_result(message: types.Message):
message.chat.id, message.chat.id,
open(image_path, "rb"), open(image_path, "rb"),
caption=text, caption=text,
show_caption_above_media=True,
) )
else: else:
print("Image not found") print("Image not found")
bot.send_message(message.chat.id, TestMessages.TEST_FINISH) bot.send_message(message.chat.id, TestMessages.TEST_FINISH)
bot.send_message(message.chat.id, Messages.START_DATE)
return return
+64
View File
@@ -0,0 +1,64 @@
# Бот Random Coffe для Telegram
Бот реализован с помощью библиотеки [pyTelegramBotAPI](https://pypi.org/project/pyTelegramBotAPI/) и базы данных [MongoDB](https://www.mongodb.com/)
## Запуск
1. Создать [файл .env](#env) в директории `app`
2. Запустить контейнеры с помощью docker compose:
- `docker-compose up -d`
Без контейнеров:
1. Установка нужных модулей
- `pip3 install -r app/requirements.txt`
2. Запуск скрипта:
- `(cd ./app && python3 main.py)`
## Функционал
1. Регистрация участников с мини-тестом для определения типа личности
2. Генерация пар для рассадки людей по:
1. М+Ж по MBTI
2. М
3. одного возраста
4. всех остальных
3. Возможность уведомлять всех пользователей
4. Поддержка нескольких администраторов
5. Отправка за день уведомления о начале мероприятия
## Команды
### Пользователи
- Вначале пользователям предоставляется небольшая регистрация после `/start`
- Довольно бесполезный `/help`
- Исходный код на Github `/source`
### Администраторы
- `/generate_key` - создание уникального ключа для добавления новых админов
- `/admin_reg` - добавиться в админы (с последующим вводом unique_key)
- `/stats` - получить информацию о пользователях
- `/delete_user` - удалить пользователя по id
- `/send_message` - сделать массовую рассылку всем зарегестрированным пользователям
- `/random` - запустить рассылку для регистрации на первый тур
- `/random_again` - сгенерировать повторную рассадку для людей первого тура (без повторной регистрации)
- `/clear_all` - удалить всех людей из базы данных
- `/remove_admin` - удалить админа по id
## <a id="env">Настройка конфигурации</a>
Необходимые поля в `.env` файле:
- `DATE_START` в формате `%Y-%m-%d`
- `TIME_START` в формате `%HH-%MM`
- `API_TOKEN` - токен для tg бота полученный у `@BotFather`
- `ADMIN_ID` - id **_главного админа_**
- `DB_PORT` порт для MongoDB, стандартно `27017`
- `ENV` - если выставлен как `dev`:
- возможность подключаться к базе данных удалённо через SSH
- `SSH_HOST` - имя/ip хоста
- `SSH_USER` - имя пользователя
- `SSH_KEY` - расположение ключа (может быть не указан если есть `SSH_PASSWORD`)
- `SSH_PASSWORD` - пароль порльзователя (может быть не указан если есть `SSH_KEY`)