EN
УчилищеPython

Ботът на ИТ клуба

Discord бот и уеб панел за сбирките на ИТ клуба, известия и забавни команди за общността.

README

README-club.md

Забавни команди за същия Discord бот

main.py остава непроменен. run_club.py импортира същите Discord клиент, дърво с команди и FastAPI приложение и добавя командите от club_fun.py. Съществуващият панел, базата със сбирки и /сбирки продължават да работят. Използва се един процес и същият DISCORD_TOKEN — не е нужен втори бот.

Админ панел: реплики, настройки и история

След вход в съществуващия панел натисни „Забавни команди и история“. Ако панелът ти е на /itc-notif/, новият раздел е на /itc-notif/fun/. Използва същата парола и админ сесия; няма отделен вход. Оттам можеш да:

  • Добавяш, редактираш, временно изключваш и изтриваш реплики за псувни/закачки и телефонни пародии.
  • Избираш български или английски глас за всяка реплика.
  • Включваш/изключваш забавните и гласовите команди, да разрешаваш @everyone, да задаваш разрешени канали и паузи между командите.
  • Преглеждаш история с дата, подател, адресат, текстов/гласов канал, точна реплика и резултат — успешна, отказана, грешка, спряна, изпълнява се или прекъсната при рестарт. Има търсене по човек/ID/реплика, филтри по команда и резултат и страници по 50 записа.

Натисни „Запази“ за съответната реплика или настройките. Промените важат за следващите команди без рестарт; започналата реплика запазва избрания текст. Изключването на командите не спира текущ звук — за него използвай /stop. Ако изключиш всички реплики в категория, ботът съобщава, че няма активни реплики. Историята започва да се събира след пускането на тази версия; стари команди не могат да се възстановят. Редактиране или изтриване на реплика не променя старите записи.

Данните се пазят в club_fun.db до notifications.db. Файлът се създава автоматично, не се качва в GitHub и остава след рестарт. Архивирай и двата файла при преместване на сървъра, най-лесно при спряна услуга. Историята не се изтрива автоматично и съдържа имена и Discord ID-та; достъпна е само след вход. Не се записва звук от участниците.

Репликите по подразбиране и .env настройките се копират само при първото пускане. След това управлявай запазените стойности от панела — промяна в .env не заменя вече запазените настройки. main.py не се редактира: навигацията се добавя в паметта от отделния модул club_admin.py.

Пускане на Debian

Влез в директорията на проекта, след като промените са изтеглени от GitHub. Използвай Python 3.10 или по-нов (Debian 13 е подходящ).

sudo apt update
sudo apt install ffmpeg espeak-ng python3-venv

Ако вече имаш venv, използвай него. Ако нямаш: python3 -m venv venv.

source venv/bin/activate
python -m pip install -r requirements-club.txt

Запази съществуващия .env, включително DISCORD_TOKEN, CHANNEL_ID, PANEL_PASSWORD и настройките на панела. Не публикувай токена в GitHub.

Спри стария процес преди старта. После стартирай:

python run_club.py

Не пускай едновременно python main.py и python run_club.py: това би създало два клиента със същия токен и конфликт на порт 8000. Новият стартер обслужва и панела на 127.0.0.1:8000; Apache конфигурацията не се променя.

При systemd запази съществуващите WorkingDirectory, User, EnvironmentFile и останалите настройки. Смени само последния файл в ExecStart от main.py на run_club.py. След това изпълни sudo systemctl daemon-reload и рестартирай съществуващата си услуга с sudo systemctl restart ИМЕТО-НА-УСЛУГАТА. Ако ползваш Uvicorn CLI, целта е run_club:app, само с един worker и без reload.

Команди

Команда Действие
/psuvai Случайна шеговита псувня и таг на подателя.
/psuvai member:@човек Тагва само избрания човек.
/psuvai everyone:true Тагва всички, ако изрично е разрешено и подателят е администратор.
/voice_psuvai Влиза в твоя гласов канал, казва реплика на български и излиза.
/scammer Влиза при теб и пуска кратко пародийно обаждане на английски с телефонен ефект.
/stop Спира текущата реплика/подготовка и изкарва бота. Достъпна за всеки член.
/сбирки Съществуващата команда остава.

Изборът на човек и everyone:true не могат да се комбинират. Текстовите команди имат общ лимит за сървъра от 15 сек., voice — 30 сек., а @everyone — 5 минути. Няма автоматично следене или говорене при влизане на ученик: ботът влиза и говори само след гласова команда. Не записва и не слуша хората. /stop няма изчакване и може да се използва от всеки текстов канал.

Настройки по желание

Добави в съществуващия .env (не го заменяй):

# 0 = изключено; 1 = разрешено само за администратори
FUN_ALLOW_EVERYONE=0
# Празно = всички текстови канали; иначе реални ID-та, разделени със запетая
FUN_TEXT_CHANNEL_IDS=
# Празно = всички обикновени voice канали; иначе реални ID-та със запетая
FUN_VOICE_CHANNEL_IDS=

За желаното масово тагване включи „Разреши @everyone“ от панела и запази. FUN_ALLOW_EVERYONE=1 задава началната стойност само преди първото пускане. Дай на бота Mention @everyone, @here, and All Roles само в избрания канал. Кодът проверява и правата на подателя, и правата на бота; не тагва роли. Копираш ID-та чрез Discord → Settings → Advanced → Developer Mode → десен клик → Copy ID.

Права и slash команди

В текстовия канал ботът трябва да вижда канала и да изпраща съобщения. В гласовия канал са нужни View Channel, Connect и Speak; за хората — Use Application Commands. Не е нужно да даваш Administrator на бота или да включваш Message Content Intent. Stage каналите не се поддържат.

Сегашният main.py синхронизира всички команди в сървъра, към който принадлежи CHANNEL_ID. След рестарт логът трябва да показва 5 синхронизирани slash команди. Ако не се показват, провери CHANNEL_ID, правата и поканата със scopes bot и applications.commands. Това разширение следва съществуващия модел за един сървър.

Глас и реплики

Гласът се генерира локално с eSpeak NG, без платен API или изпращане на текст към външен TTS доставчик. Той е синтетичен/роботизиран, не естествен актьорски глас. Началните български реплики са в ROASTS, а английските пародии — в SCAMMER_LINES в club_fun.py. След първото пускане добавяй и редактирай репликите от админ панела. Персонажът е измислен комедиен техник-хакер; няма имитация на конкретна националност, реално събиране на данни, пароли или плащания.

Има максимум 35 секунди звук, умерена сила, една реплика наведнъж за сървъра, автоматично излизане и почистване на временните аудиофайлове. При грешка отговорът е видим само за извикалия командата; техническите подробности са в лога. Използвай кратки реплики — по-дългите се отрязват на 35-ата секунда.

Проверка и връщане назад

python -m pip install -r requirements-test.txt
python -m pytest -q

Тестовете проверяват интеграцията, ограниченията на споменаванията, жизнения цикъл на voice, запазването на реплики и история, защитата на админ API и точността на ID-тата. Използват имитация на Discord, временни бази и фиктивни тестови настройки; не се свързват с реален сървър и не използват истински токен. След пускане провери /сбирки, панела, /psuvai, /voice_psuvai, /scammer и /stop в тестов канал. Реалната връзка и чуваемият звук изискват тази проверка в Discord.

За връщане назад спри новия процес и върни стартирането на main.py. При първия успешен slash sync ще остане само /сбирки; базата със сбирките не се променя от разширението.