From 99ed172dfee447edddd6e48845f191e84b7266df Mon Sep 17 00:00:00 2001 From: shorelskyi Date: Mon, 16 Jan 2023 23:52:43 +0200 Subject: [PATCH] 2024.08.13: Add UA polling with rebase to upstream with squashing all commits --- .env | 21 ++ README.md | 261 ++----------------- docker-compose.yml | 31 +++ docker/Dockerfile | 17 +- docker/Makefile | 20 -- src/constants.py | 9 +- src/join_captcha_bot.py | 63 ++++- src/language/en.json | 2 +- src/language/uk.json | 2 +- src/language/ukrainer.json | 313 +++++++++++++++++++++++ requirements.txt => src/requirements.txt | 0 src/settings.py | 6 +- src/ukrainer.json | 218 ++++++++++++++++ src/ukrainer.py | 33 +++ telegram_captcha_bot_ua.service | 24 ++ 15 files changed, 741 insertions(+), 279 deletions(-) create mode 100644 .env create mode 100644 docker-compose.yml delete mode 100644 docker/Makefile create mode 100644 src/language/ukrainer.json rename requirements.txt => src/requirements.txt (100%) create mode 100644 src/ukrainer.json create mode 100644 src/ukrainer.py create mode 100644 telegram_captcha_bot_ua.service diff --git a/.env b/.env new file mode 100644 index 00000000..3d4ecba9 --- /dev/null +++ b/.env @@ -0,0 +1,21 @@ +# Used as versioning +TAG=0.3 +# Bot mode +CAPTCHABOT_PRIVATE=1 +# SECURE SECTION +CAPTCHABOT_TOKEN=none +CAPTCHABOT_OWNER=@none +# Initial BOT Language +CAPTCHABOT_INIT_LANG=UK +# Initial captcha solve time (in minutes) +CAPTCHABOT_INIT_CAPTCHA_TIME_MIN=3 +# Auto-remove custom welcome message timeout (in seconds) +CAPTCHABOT_T_DEL_WELCOME_MSG=180 +# Maximum number of times a user fail to solve a Poll captcha. +# If a user don't solve the captcha after this, it will be ban +# instead kick +CAPTCHABOT_MAX_FAIL_BAN_POLL=3 +# Initial captcha characters mode (ascii, hex, nums, math, poll, button, or NEW ukrainer) +CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE=ukrainer +LOCAL_DATA_PATH=/home/admin/github/TLG_JoinCaptchaBot_UA/data + diff --git a/README.md b/README.md index 0173ea0f..eca9f42a 100644 --- a/README.md +++ b/README.md @@ -1,260 +1,29 @@ -# TLG_JoinCaptchaBot +# TLG_JoinCaptchaBot_UA -

- -

+This is a fork of the [J-Rios/TLG_JoinCaptchaBot](https://github.com/J-Rios/TLG_JoinCaptchaBot) with personal improves. -Telegram Bot to verify if a new member joining a group is a human. -Upon a new user join a group, the Bot send an image-based [captcha challenge](https://en.wikipedia.org/wiki/CAPTCHA) that must be solved to allow the user stay in the group. If the new user fails to solve the captcha within a set time limit, they are removed from the group. Additionally, any message from a new user that includes a URL prior to the completion of the captcha will be considered Spam and will be deleted. +This fork-project doesn't provide support. Use on you own risk. -## Donate +## Sync forked master branch with origin master repo -Do you like this Bot? Buy me a coffee :) +1. Add the remote (original repo that you forked) and call it “upstream” -Paypal: + git remote add upstream git@github.com:J-Rios/TLG_JoinCaptchaBot.git -[https://www.paypal.me/josrios](https://www.paypal.me/josrios) +2. Fetch all branches of remote upstream -## Installation + git fetch upstream -Note: Use Python 3.6 or above to install and run the Bot, previous python version are unsupported. +3. Rewrite your master with upstream’s master using git rebase. -To generate Captchas, the Bot uses [multicolor_captcha_generator library](https://github.com/J-Rios/multicolor_captcha_generator), which uses Pillow to generate the images. + git rebase upstream/master -1. Install Pillow prerequisites: +4. Push your updates to master. You may need to force the push with “--force”. - ```bash - sudo apt update - sudo apt install -y libtiff5-dev libjpeg62-turbo-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk - ``` + git push origin master --force -2. Get the project and install JoinCaptchaBot requirements: +## Credits - ```bash - git clone https://github.com/J-Rios/TLG_JoinCaptchaBot - cd TLG_JoinCaptchaBot - python3 -m pip install -r requirements.txt - ``` +Original Author - [Jose](https://github.com/J-Rios) -3. Set Telegram Bot account Token (get it from @BotFather) in "src/settings.py" file: - - ```python - 'TOKEN' : 'XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' - ``` - -## Configuration - -All Bot configurations can be done easily by modifying them in the **"src/settings.json"** file. - -For more experienced users, you can use environment variables to setup all that properties (this is really useful for advance deployment when using [Virtual Environments](https://docs.python.org/3/tutorial/venv.html) and/or [Docker](https://docs.docker.com/get-started/) to isolate the Bot process execution). - - -## Usage - -To ease it usage in Linux, a **Makefile** is provided. - -- Check usage help information: - - ```bash - make - ``` - -- Launch the Bot: - - ```bash - make run - ``` - -- Check if the Bot is running: - - ```bash - make status - ``` - -- Stop the Bot: - - ```bash - make kill - ``` - -## Systemd service - -For systemd based systems, you can setup the Bot as daemon service. - -To do that, you need to create a new service description file for the Bot as follow: - -```bash -[vim or nano] /etc/systemd/system/tlg_joincaptcha_bot.service -``` - -File content: - -```bash -[Unit] -Description=Telegram Join Captcha Bot Daemon -Wants=network-online.target -After=network-online.target - -[Service] -Type=forking -WorkingDirectory=/path/to/TLG_JoinCaptchaBot/src/ -ExecStart=/path/to/TLG_JoinCaptchaBot/tools/run -ExecReload=/path/to/TLG_JoinCaptchaBot/tools/kill - -[Install] -WantedBy=multi-user.target -``` - -Then, to add the new service into systemd, you should enable it: - -```bash -systemctl enable --now tlg_joincaptcha_bot.service -``` - -Now, you can start the service (Bot) by: - -```bash -systemctl start tlg_joincaptcha_bot.service -``` - -You can check if the service (Bot) is running by: - -```bash -systemctl status tlg_joincaptcha_bot.service -``` - -Remember that, if you wan't to disable it, you should execute: - -```bash -systemctl disable tlg_joincaptcha_bot.service -``` - -## Docker - -You can also run the bot on [Docker](https://docs.docker.com/get-started/). This allows easy server migration and automates the installation and setup. Look at the [docker specific documentation](docker/README.md) for more details about how to create a Docker Container for Captcha Bot. - -## Bot Owner - -The **Bot Owner** can run special commands that no one else can use, like /allowgroup (if the Bot is private, this set allowed groups where the Bot can be used) or /allowuserlist (to make Bot don't ask for captcha to some users, useful for example for blind users). - -You can setup a Bot Owner by specifying the Telegram User ID or Alias in "settings.py" file. For example: - -```python -"BOT_OWNER": "@JoseTLG", -``` - -## Make Bot Private - -By default, the Bot is **Public**, so any Telegram user can add and use the Bot in any group, but you can set it to be **Private** so the Bot just can be used in allowed groups (Bot owner allows them with **/allow_group** command). - -You can set Bot to be Private in "settings.py" file: - -```python -"BOT_PRIVATE" : True, -``` - -**Note:** If you have a Public Bot and set it to Private, it will leave any group where is not allowed to be used when a new user joins. - -**Note:** Telegram Private Groups could changes their chat ID when it become a public super-group, so the Bot will leave the group and the owner has to set the new group chat ID with /allow_group. - -## Scalability (Polling or Webhook) - -By default, Bot checks and receives updates from Telegram Servers by **Polling** (it periodically requests and gets from Telegram Server if there is any new updates in the Bot account corresponding to that Bot Token), this is really simple and can be used for low to median scale Bots. However, you can configure the Bot to use **Webhook** instead if you expect to handle a large number of users/groups (with webhook, the Telegram Server is the one that will connect to you machine and send updates to the Bot when there is any new update). - -To use Webhook instead Polling, you need a signed certificate file in the system, you can create the key file and self-sign the cert through openssl tool: - -```bash -openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -x509 -days 3650 -out cert.pem -``` - -Once you have the key and cert files, setup the next lines in "settings.py" file to point to expected host system address, port, path and certificate files: - -```python -"WEBHOOK_IP": "0.0.0.0", -"WEBHOOK_PORT": 8443, -"WEBHOOK_PATH": "/TLG_JoinCaptchaBot" -"WEBHOOK_CERT" : SCRIPT_PATH + "/cert.pem", -"WEBHOOK_CERT_PRIV_KEY" : SCRIPT_PATH + "/private.key", -``` - -(Optional) In case you want to use a reverse proxy between Telegram Server and the system that runs the Bot, you need to setup the Proxy Webhook URL setting: - -```python -"WEBHOOK_URL": "https://example.com:8443/TLG_JoinCaptchaBot" -``` - -Then, you need to change Bot connection mode from polling to webhook by setting to True the next configuration: - -```python -"CAPTCHABOT_USE_WEBHOOK": True, -``` - -To go back and use Polling instead Webhook, just set the config back to False: - -```python -"CAPTCHABOT_USE_WEBHOOK": False, -``` - -## Adding a New Language - -Actual language support is based on external JSON files that contain all bot texts for each language. - -To add support for a new language you must follow this steps: - -1. Fork the project repository, clone it and create a new branch to work on it (i.e. named language-support-en). - -2. Copy from one of the existing language JSON files from [here](https://github.com/J-Rios/TLG_JoinCaptchaBot/tree/master/src/language) to a new one. - -3. Change the name of that file for the language ISO Code of the language that you want. - -4. Translate each text from JSON key values of the file without breaking the JSON format/structure (it should be valid for JSON parsers) and maintaining JSON key names. Keep command names in english (i.e. don't translate "START", "HELP"... /start /help ...) and don't remove special characters (like {}, ", ', \n...) too! - -5. Make a pull request of that branch with the new language file into this repository and wait for it to be accepted. - -6. Then, I will make the integration into source code and actual Bot account (@join_captcha_bot). - -7. Enjoy the new language :) - -## Languages Contributors - -- Arabic: [@damascene](https://github.com/damascene) - -- Basque: [@xa2er](https://github.com/xa2er) - -- Belarusian: [@antikruk](https://github.com/antikruk) - -- Catalán: Adela Casals i Jorba - -- Chinese (Mainland): [神林](https://github.com/jyxjjj) - -- Esperanto: Pablo Busto & Porrumentzio. - -- Finnish: [Aminda Suomalainen (@Mikaela)](https://github.com/Mikaela) - -- French: [Mathieu H (@aurnytoraink)](https://github.com/Aurnytoraink) - -- Galician: [Fernando Flores (Fer6Flores)](https://github.com/Fer6Flores); Iváns - -- German: [@weerdenburg](https://github.com/weerdenburg), [@MossDerg](https://github.com/MossDerg) - -- Indonesian: ForIndonesian - -- Italian: Noquitt, [Nicola Davide (@nidamanx)](https://github.com/nidamanx) - -- Kannada: [@itsAPK](https://github.com/itsAPK) - -- Korean: [@dakeshi](https://github.com/dakeshi) - -- Persian: [@m4hbod](https://github.com/M4hbod) - -- Portuguese (Brazil): Anahuac de Paula Gil - -- Russian: Unattributed (anonymous), [@stezkoy](https://github.com/Stezkoy), [Roman (@toxi22)](https://github.com/toxi22) - -- Serbo-Croatian: [@IlijaDj](https://github.com/IlijaDj) - -- Slovak: [@dumontiskooo](https://t.me/dumontiskooo) - -- Ukrainian: Vadym Zhushman (@zhushman00), [Roman (@toxi22)](https://github.com/toxi22) - -- Uzbek: [@mhwebuz](https://github.com/mhwebuz) +Original Repository - [J-Rios/TLG_JoinCaptchaBot](https://github.com/J-Rios/TLG_JoinCaptchaBot) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..7f578462 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +# This docker-compose file is used in production. For local development +# run_backend.py and run_server_rpc.py script are executed in the python venv. + +version: "3.9" + +services: + UaCaptchaBot: + image: uacaptchabot:${TAG} + build: + dockerfile: docker/Dockerfile + context: . + container_name: UaCaptchaBot + hostname: UaCaptchaBot + environment: + - TAG=${TAG} + - CAPTCHABOT_PRIVATE=${CAPTCHABOT_PRIVATE} + - CAPTCHABOT_TOKEN=${CAPTCHABOT_TOKEN} + - CAPTCHABOT_OWNER=${CAPTCHABOT_OWNER} + - CAPTCHABOT_INIT_LANG=${CAPTCHABOT_INIT_LANG} + - CAPTCHABOT_INIT_CAPTCHA_TIME_MIN=${CAPTCHABOT_INIT_CAPTCHA_TIME_MIN} + - CAPTCHABOT_T_DEL_WELCOME_MSG=${CAPTCHABOT_T_DEL_WELCOME_MSG} + - CAPTCHABOT_MAX_FAIL_BAN_POLL=${CAPTCHABOT_MAX_FAIL_BAN_POLL} + - CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE=${CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE} + volumes: + - "${LOCAL_DATA_PATH}:/srv/app/src/data" + networks: + - UaCaptchaBot + +networks: + UaCaptchaBot: + name: UaCaptchaBot \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index c9aa275b..37a1f5a6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -9,7 +9,7 @@ ARG BOT_USER="nobody" ARG BOT_GROUP="nogroup" ARG BOT_HOME_DIR="/srv" ARG APP_DIR="${BOT_HOME_DIR}/app" -ARG GITHUB_URL="https://github.com/J-Rios/TLG_JoinCaptchaBot" +#ARG GITHUB_URL="https://github.com/J-Rios/TLG_JoinCaptchaBot" # Export ARGs as ENV vars so they can be shared among steps ENV BOT_PROJECT="${BOT_PROJECT}" \ @@ -29,6 +29,8 @@ RUN chown -cR "${BOT_USER}:${BOT_GROUP}" ${BOT_HOME_DIR} && \ FROM base AS builder-deps +RUN sed -e 's/http\:/https\:/g' /etc/apt/sources.list -i + # Install build dependencies RUN apt-get ${APT_OPTS} update && \ apt-get ${APT_OPTS} install \ @@ -52,10 +54,16 @@ FROM builder-deps AS builder # Build the code as unprivileged user USER ${BOT_USER} WORKDIR ${BOT_HOME_DIR} -RUN git clone ${GITHUB_URL} ${APP_DIR} && \ - python3 -m pip install --user --requirement ${APP_DIR}/requirements.txt && \ + + +#RUN git clone ${GITHUB_URL} ${APP_DIR} && \ +COPY --chown=${BOT_USER}:${BOT_GROUP} src/ ${APP_DIR}/src +COPY --chown=${BOT_USER}:${BOT_GROUP} tools/ ${APP_DIR}/tools + +RUN python3 -m pip install --upgrade pip && \ + python3 -m pip install --user --requirement ${APP_DIR}/src/requirements.txt && \ cd ${APP_DIR}/src && \ - chown -cR ${BOT_USER}:${BOT_GROUP} ${BOT_HOME_DIR} && \ + chown -cR ${BOT_USER}:${BOT_GROUP} ${BOT_HOME_DIR}/app/* && \ rm -rf ${BOT_HOME_DIR}/.cache && \ find ${APP_DIR} -iname '.git*' -print0 | xargs -0 -r -t rm -rf @@ -76,4 +84,5 @@ RUN chown -R "${BOT_USER}:${BOT_GROUP}" ${BOT_HOME_DIR} && \ # Set up to run as an unprivileged user USER ${BOT_USER} WORKDIR ${APP_DIR} +RUN chmod +x ./tools/* CMD ["./tools/entrypoint.sh"] diff --git a/docker/Makefile b/docker/Makefile deleted file mode 100644 index 9bf9175f..00000000 --- a/docker/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -SHELL = /bin/bash -NAME = captcha-bot -DOCKERFILE = Dockerfile - - -.PHONY: build force test debug - -build: - docker build -f "${DOCKERFILE}" -t "${NAME}" . - -force: - docker build -f "${DOCKERFILE}" -t "${NAME}" --no-cache . - -test: - $(MAKE) - docker run -it $(NAME):latest - -debug: test - docker run -it --user=root --entrypoint ${SHELL} $(NAME):latest diff --git a/src/constants.py b/src/constants.py index 8f73da4c..2b7ef45a 100644 --- a/src/constants.py +++ b/src/constants.py @@ -116,6 +116,11 @@ os_getenv("CAPTCHABOT_F_BAN_GROUPS", SETTINGS["CAPTCHABOT_F_BAN_GROUPS"]), + # Ukraine specific question for ban russists + "F_UKRAINER": \ + os_getenv("CAPTCHABOT_F_UKRAINER", + SETTINGS["CAPTCHABOT_F_UKRAINER"]), + # Initial enable/disable status at Bot start "INIT_ENABLE": bool(int(os_getenv("CAPTCHABOT_INIT_ENABLE", @@ -322,6 +327,7 @@ "\nSpanish / Español\n/language es\n" \ "\nTurkish / Türkçe\n/language tr\n" \ "\nUkrainian / Українську\n/language uk\n" \ + "\nUkrainian 2.0 / Українську 2.0\n/language ukrainer\n" \ "\nUzbek / o'zbek\n/language uz\n", # Privacy information @@ -379,6 +385,7 @@ "SR": {}, # Serbo-Croatian (Ex-Yugoslavia Countries) "TR": {}, # Turkish "UK": {}, # Ukrainian + "UKRAINER": {}, # Ukrainian v2 "UZ": {}, # Uzbek "ZH_CN": {} # Chinese (Mainland) } @@ -426,7 +433,7 @@ "CAPTCHA_MODE": { "KEY": "captcha_mode", "ARGV": ["poll", "button", "nums", "hex", "ascii", "math", - "random"] + "random", "ukrainer"] }, "RESTRICTION": { diff --git a/src/join_captcha_bot.py b/src/join_captcha_bot.py index ef489567..252674df 100644 --- a/src/join_captcha_bot.py +++ b/src/join_captcha_bot.py @@ -45,7 +45,7 @@ import re # High Level Files Utils Library -from shutil import rmtree +from shutil import rmtree, copy2 # System Library from sys import argv as sys_argv @@ -124,6 +124,9 @@ # Thread-Safe JSON Library from tsjson import TSjson +# Local "Ukrainer" extension +import ukrainer + ############################################################################### # Logger Setup @@ -434,6 +437,9 @@ def initialize_resources(): # Create data directory if it does not exists if not path.exists(CONST["CHATS_DIR"]): makedirs(CONST["CHATS_DIR"]) + # Copy default 'ukrainer.json' if it does not exists + if not path.exists(CONST["F_UKRAINER"]): + copy2("ukrainer.json", CONST["F_UKRAINER"]) else: # If chats directory exists, check all subdirs names (chats ID) files = listdir(CONST["CHATS_DIR"]) @@ -1185,6 +1191,55 @@ async def chat_member_status_change( } } context.bot_data.update(poll_data) + elif captcha_mode == "ukrainer": + ''' + poll_question = get_chat_config(chat_id, "Poll_Q") + poll_options = get_chat_config(chat_id, "Poll_A") + poll_correct_option = get_chat_config(chat_id, "Poll_C_A") + ''' + _poll = ukrainer.get_poll() + poll_question = _poll["Poll_Q"] + poll_options = _poll["Poll_A"] + poll_correct_option = _poll["Poll_C_A"] + if ((poll_question == "") or + (num_config_poll_options(poll_options) < 2) or + (poll_correct_option == 0)): + await tlg_send_autodelete_msg( + bot, chat_id, TEXT[lang]["POLL_NEW_USER_NOT_CONFIG"], + CONST["T_FAST_DEL_MSG"]) + return + # Remove empty strings from options list + poll_options = list(filter(None, poll_options)) + # Send request to solve the poll text message + poll_request_msg_text = TEXT[lang]["POLL_NEW_USER"].format( + join_user_name, chat_title, timeout_str) + sent_result = await tlg_send_autodelete_msg( + bot, chat_id, poll_request_msg_text, captcha_timeout) + solve_poll_request_msg_id = None + if sent_result is not None: + solve_poll_request_msg_id = sent_result + # Send the Poll + sent_result = await tlg_send_poll( + bot, chat_id, poll_question, poll_options, + poll_correct_option - 1, captcha_timeout, False, Poll.QUIZ, + read_timeout=20) + if sent_result["msg"] is None: + send_problem = True + else: + # Save some info about the poll the bot_data for + # later use in receive_quiz_answer + poll_id = sent_result["msg"].poll.id + poll_msg_id = sent_result["msg"].message_id + poll_data = { + poll_id: + { + "chat_id": chat_id, + "poll_msg_id": poll_msg_id, + "user_id": join_user_id, + "correct_option": poll_correct_option + } + } + context.bot_data.update(poll_data) else: # Image captcha # Generate a pseudorandom captcha send it to telegram group and # program message @@ -1289,14 +1344,14 @@ async def chat_member_status_change( if sent_result["msg"]: Global.new_users[chat_id][join_user_id]["msg_to_rm"].append( sent_result["msg"].message_id) - if ((captcha_mode == "poll") and + if ((captcha_mode == "poll" or captcha_mode == "ukrainer") and (solve_poll_request_msg_id is not None)): Global.new_users[chat_id][join_user_id]["msg_to_rm"].append( solve_poll_request_msg_id) # Restrict user to deny send any kind of message until captcha # is solve. Allow send text messages for image based captchas # that requires it - if captcha_mode in ["poll", "button"]: + if captcha_mode in ["poll", "button", "ukrainer"]: await restrict_user_mute(bot, chat_id, join_user_id) else: # Restrict user to only allow send text messages await restrict_user_media(bot, chat_id, join_user_id) @@ -2499,7 +2554,7 @@ async def cmd_captcha_mode(update: Update, context: ContextTypes.DEFAULT_TYPE): # Get and configure chat to provided captcha mode new_captcha_mode = args[0].lower() if (new_captcha_mode in - {"poll", "button", "nums", "hex", "ascii", "math", "random"}): + {"poll", "button", "nums", "hex", "ascii", "math", "random", "ukrainer"}): save_config_property(group_id, "Captcha_Chars_Mode", new_captcha_mode) bot_msg = TEXT[lang]["CAPTCHA_MODE_CHANGE"].format(new_captcha_mode) else: diff --git a/src/language/en.json b/src/language/en.json index 4d0ef101..475ca656 100644 --- a/src/language/en.json +++ b/src/language/en.json @@ -57,7 +57,7 @@ "Captcha mode successfully changed to \"{}\".", "CAPTCHA_MODE_INVALID": - "Invalid captcha mode. Supported modes are: \"nums\", \"hex\", \"ascii\", \"math\", \"button\", \"poll\" and \"random\".\n\nExample:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random", + "Invalid captcha mode. Supported modes are: \"nums\", \"hex\", \"ascii\", \"math\", \"button\", \"poll\" and \"random\".\n\nExample:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random\n/captcha_mode ukrainer", "CAPTCHA_MODE_NOT_ARG": "The command needs a mode to set. Available modes are:\n\n- Numeric Captchas (\"nums\").\n- Hexadecimal Captchas, numbers and characters A-F (\"hex\").\n- Numbers and characters A-Z Captchas (\"ascii\").\n- Math equation to be solved Captchas (\"math\").\n- Button-only challenge (\"button\").\n- Custom Poll challenge (\"poll\").\n- Random challenge (\"random\").\n\nExamples:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random", diff --git a/src/language/uk.json b/src/language/uk.json index 30e17872..ca907d4b 100644 --- a/src/language/uk.json +++ b/src/language/uk.json @@ -57,7 +57,7 @@ "Режим капчі успішно змінено на \"{}\".", "CAPTCHA_MODE_INVALID": - "Недійсний режим капчі. Підтримувані режими: \"nums\", \"hex\", \"ascii\", \"math\", \"button\", \"poll\" та \"random\".\n\nПриклад:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random", + "Недійсний режим капчі. Підтримувані режими: \"nums\", \"hex\", \"ascii\", \"math\", \"button\", \"poll\" та \"random\".\n\nПриклад:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random\n/captcha_mode ukrainer", "CAPTCHA_MODE_NOT_ARG": "Для встановлення команди потрібен режим. Доступні режими:\n- Цифрова капча (\"nums\").\n- Шістнадцяткова капча, цифри та символи A-F (\"hex\").\n- Цифри та символи A-Z капча (\"ascii\").\n- Math equation to be solved Captchas (\"math\").\n- Лише кнопка (\"button\").\n- Custom Poll challenge (\"poll\").\n- Random challenge (\"random\").\n\nПриклади:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random", diff --git a/src/language/ukrainer.json b/src/language/ukrainer.json new file mode 100644 index 00000000..c13dd13e --- /dev/null +++ b/src/language/ukrainer.json @@ -0,0 +1,313 @@ +{ + "START": + "Привіт, я бот, який надсилає капчу для кожного нового користувача, який приєднується до групи, і викидує всіх, хто не може розв’язати капчу протягом певного часу.\n\nЯкщо користувач намагається приєднатися до групи 5 разів поспіль і ніколи не вирішує капчу, я вважаю, що цей \"користувач\" є ботом, і він буде заблокований. Також будь-яке повідомлення, що містить URL-адресу, надіслану новим \"користувачем\" до завершення введення капчі буде розглянуто як спам і буде видалено.\n\nНе забудьте надати мені адміністративні привілеї для блокування користувачів і видалення повідомлень.\n\nПеревірте команду /help для отримання додаткової інформації про моє використання.\n\nЯ корисний? Перевірте команду /about і подумайте про пожертвування, щоб я залишався активним.", + + "HELP": + "Довідка бота:\n————————————————\n- Я бот, який надсилає капчу для кожного нового користувача, який приєднується до групи, і викидую будь-кого з них, який не може вирішити капчу протягом певного часу.\n\n- Якщо користувач намагається приєднатися до групи 5 разів поспіль і ніколи не вирішує капчу, я вважаю, що цей \"користувач\" є ботом, і його буде заблоковано.\n\n- Будь-яке повідомлення, яке містить URL-адресу, надіслану новим \"користувачем\" до завершення введення капчі буде розглянуто як спам і його буде видалено.\n\n- Вам потрібно надати мені права адміністратора, щоб я міг викидувати користувачів і видаляти повідомлення.\n\n- Щоб зберегти чисту групу, я автоматично видаляю всі повідомлення, пов’язані зі мною, коли капчу не вдається вирішити і користувача викинуто (через 5 хвилин).\n\n- Час за який нові користувачі мають вирішити капчу, за замовчуванням становить 5 хвилин, але її можна налаштувати за допомогою команди /time.\n\n- Ви можете увімкнути/вимкнути захист капчею за допомогою команд /enable та /disable.\n\n- Команди конфігурації можуть використовувати лише адміністратори групи.\n\n- Ви можете змінити мову, якою я розмовляю, за допомогою команди /language.\n\n- Ви можете налаштувати рівень складності капчі за допомогою команди /difficulty.\n\n- Ви можете встановити капчу для використання повних цифр і букв A–Z, або цифри та літери A–F, або просто цифри (за замовчуванням), or a math equation to be solved, or a custom poll, або просто кнопку, використовуючи команду /captcha_mode.\n\n- Ви можете налаштувати власне привітальне повідомлення за допомогою команди /welcome_msg.\n\n- Ви можете увімкнути опцію дозволити мені застосовувати обмеження до нових приєднаних користувачів для надсилання нетекстових повідомлень за допомогою команди /restrict_non_text.\n\n- Якщо бот в приваті, дозвольте її з командою /allowgroup.\n\n- Ви можете налаштувати групу з приватного чату з ботом, за допомогою команди /connect.\n\n- Ви можете заборонити користувачам надсилати будь-яке повідомлення, яке містить URL-адресу в групі, за допомогою команди /url_disable.\n\n- Перевірте /commands отримати список усіх доступних команд та короткий опис усіх них.", + + "COMMANDS": + "Список команд:\n————————————————\n/start - Показує початкову інформацію про бота.\n\n/help - Показує довідкову інформацію.\n\n/commands - Показує це повідомлення. Інформація про всі доступні команди та їх опис.\n\n/language - Дозволяє змінювати мову повідомлень бота.\n\n/time - Дозволяє змінювати час, доступний для вирішення капчі.\n\n/difficulty - Дозволяє змінювати рівень складності капчі (від 1 до 5).\n\n/captcha_mode - Дозволяє змінювати режим капчі (nums: цифри, hex: цифри та A-F букви, ascii: цифри та A-Z букви, math: math equation, poll: custom and configurable poll, button: лише кнопка).\n\n/captcha_poll - Configure custom poll question and options for captcha in poll mode.\n\n/welcome_msg - Дозволяє налаштувати привітальне повідомлення, яке надсилається після вирішення капчі.\n\n/welcome_msg_time - Allows to configure the time of automatic removal of the welcome message.\n\n/restrict_non_text - After a new user solves the captha, apply a restriction to don't let them send non-text messages (images, videos, audios) for 1 day (or forever, using \"forever\" keyword).\n\n/add_ignore - Не запитувати у проігнорованого користувача капчу.\n\n/remove_ignore - Припинити ігнорувати користувача.\n\n/ignore_list - список ідентифікаторів ігнорованих користувачів.\n\n/remove_solve_kick_msg - Налаштувати бота так, щоб повідомлення про розв’язання капчі та повідомлення про кик/бан автоматично видалялись через деякий час.\n\n/remove_welcome_msg - Налаштувати бота так, щоб привітальне повідомлення автоматично видалялось через деякий час.\n\n/url_disable - Заборонити учасникам групи надсилати повідомлення, які містять посилання на веб-сайти (URL-адреси).\n\n/url_enable - Дозволити учасникам групи надсилати повідомлення, які містять посилання на веб-сайти (URL-адреси).\n\n/remove_all_msg_kick_off - Налаштувати бота так, щоб він не видаляв текстові повідомлення, надіслані користувачами, які не розгадали капчу.\n\n/remove_all_msg_kick_on - Налаштувати бота так, щоб він видаляв усі повідомлення, надіслані користувачами, які не розгадали капчу.\n\n/allowgroup - Дозвольте групі використовувати бота (якщо бот в приваті).\n\n/enable - Увімкніть захист капчею для групи.\n\n/disable - Вимкніть захист капчею для групи.\n\n/checkcfg - Отримати поточну конфігурацію групи.\n\n/chatid - Показує ідентифікатор поточного чату.\n\n/connect - Підключіться до групи, щоб налаштувати її з приватного чату бота.\n\n/disconnect - Від'єднайтеся від підключеної групи, яка налаштовується, від приватного чату бота.\n\n/version - Показати версію бота.\n\n/about - Показати інформацію про бота.", + + "CMD_NOT_ALLOW": + "Цю команду може використовувати лише адміністратор.", + + "CMD_INVALID_PARAMETER": + "Invalid command parameter.", + + "LANG_CHANGE": + "Мова змінена на Українську v2.0.", + + "LANG_SAME": + "Я вже спілкуюся Українською.\n\nПідтримувані мови:\n{}", + + "LANG_BAD_LANG": + "Надано недійсну мову.\n\nПідтримувані мови:\n{}", + + "LANG_NOT_ARG": + "Команді потрібна мова для встановлення.\n\nПриклади:\n{}", + + "TIME_CHANGE": + "Час вирішення капчі успішно змінено до {}.", + + "WELCOME_TIME_CHANGE": + "Час видалення вітального повідомлення успішно змінено на {}.", + + "TIME_OUT_RANGE": + "недійсний час має бути від 10 секунд до {} хв.", + + "TIME_NOT_NUM": + "Наданий час не є цілим числом.", + + "TIME_NOT_ARG": + "Команді потрібно встановити значення часу.\n\nПриклади:\n/time 30 sec\n/time 5 min\n/time 1 min", + + "WELCOME_TIME_NOT_ARG": + "Команді потрібно встановити значення часу для видалення вітального повідомлення.\n\nПриклади:\n/welcome_msg_time 30 sec\n/welcome_msg_time 5 min\n/welcome_msg_time 1 min", + + "DIFFICULTY_CHANGE": + "Складність капчі успішно змінено на рівень {}.", + + "DIFFICULTY_NOT_NUM": + "Надана складність капчі - це не число.", + + "DIFFICULTY_NOT_ARG": + "Команді потрібно встановити рівень складності (від 1 до 5). Не має ефекту в \"кнопковому\" режимі.\n\nПриклади:\n/difficulty 1\n/difficulty 2\n/difficulty 3\n/difficulty 4\n/difficulty 5", + + "CAPTCHA_MODE_CHANGE": + "Режим капчі успішно змінено на \"{}\".", + + "CAPTCHA_MODE_INVALID": + "Недійсний режим капчі. Підтримувані режими: \"nums\", \"hex\", \"ascii\", \"math\", \"button\", \"poll\", \"ukrainer\" та \"random\".\n\nПриклад:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random\n/captcha_mode ukrainer", + + "CAPTCHA_MODE_NOT_ARG": + "Для встановлення команди потрібен режим. Доступні режими:\n- Цифрова капча (\"nums\").\n- Шістнадцяткова капча, цифри та символи A-F (\"hex\").\n- Цифри та символи A-Z капча (\"ascii\").\n- Math equation to be solved Captchas (\"math\").\n- Лише кнопка (\"button\").\n- Custom Poll challenge (\"poll\").\n- Random challenge (\"random\").\n\nПриклади:\n/captcha_mode nums\n/captcha_mode hex\n/captcha_mode ascii\n/captcha_mode math\n/captcha_mode button\n/captcha_mode poll\n/captcha_mode random\n/captcha_mode ukrainer", + + "CMD_RESTRICTION_CHANGE": + "Restriction to apply when user fail the captcha changed to \"{}\".", + + "CMD_RESTRICTION_NOT_ARG": + "The command requires a type of restriction to set.", + + "CMD_RESTRICTION_AVAILABLE_ARGS": + "Available restrictions to punish an user that has fail the captcha:\n\n/restriction kick - Kick the user from the group (default behavior; after multiple fails, the user will be banned).\n\n/restriction mute - Don't allow the user to write messages in the group for 24h (after this time, the restriction will be automatically removed).\n\n/restriction media - Don't allow the user to write media messages (image, video, audio, etc) in the group for 24h (after this time, the restriction will be automatically removed).", + + "WELCOME_MSG_SET": + "Вітальне повідомлення успішно налаштовано.", + + "WELCOME_MSG_UNSET": + "Вітальне повідомлення вимкнено.", + + "WELCOME_MSG_SET_NOT_ARG": + "Розмістіть привітальне повідомлення після команди.\n\nПриклад:\n/welcome_msg Вітаю $user, ласкаво просимо до групи та пам’ятаємо про повагу до інших користувачів.\n\nВимкнути повідомлення:\n/welcome_msg disable", + + "RESTRICT_NON_TEXT_MSG_ENABLED": + "Увімкнено обмеження надсилання нетекстових повідомлень для нових користувачів. Я збираюся видалити нещодавно приєднані повідомлення користувачів, які не є текстовими повідомленнями.", + + "RESTRICT_NON_TEXT_MSG_DISABLED": + "Обмеження надсилати нетекстові повідомлення для нових користувачів вимкнено.", + + "RESTRICT_NON_TEXT_MSG_NOT_ARG": + "Встановіть, якщо ви хочете ввімкнути або вимкнути обмеження до нещодавно приєднаних користувачів для надсилання нетекстових повідомлень (забороняти користувачеві надсилати медіа чи інші повідомлення, а не текст. Адміністратори можуть надавати ці дозволи користувачам знову в майбутньому).\n\nПриклад:\n/restrict_non_text enable\n/restrict_non_text enable forever\n/restrict_non_text disable", + + "IGNORE_LIST_ADD_NOT_ARG": + "Будь ласка, розмістіть ідентифікатор/псевдонім користувача після команди.\n\nПриклад:\n/add_ignore 1234567890\n/add_ignore @peter", + + "IGNORE_LIST_ADD_DUPLICATED": + "Цей ідентифікатор/псевдонім вже є у списку ігнорувань.", + + "IGNORE_LIST_ADD_LIMIT_EXCEEDED": + "На жаль, ви досягли максимального ліміту користувачів, доданих до списку ігнорувань, видаліть когось, щоб додати ще.", + + "IGNORE_LIST_ADD_INVALID": + "Цей ідентифікатор/псевдонім недійсний.", + + "IGNORE_LIST_ADD_SUCCESS": + "Ідентифікатор/псевдонім успішно додано!", + + "IGNORE_LIST_REMOVE_NOT_ARG": + "Будь ласка, розмістіть ідентифікатор/псевдонім користувача після команди.\n\nПриклад:\n/remove_ignore 1234567890\n/remove_ignore @peter", + + "IGNORE_LIST_REMOVE_SUCCESS": + "Ідентифікатор/псевдонім успішно видалено!", + + "IGNORE_LIST_REMOVE_NOT_IN_LIST": + "Ідентифікатор/псевдонім відсутній у списку ігнорування, нічого не зроблено.", + + "IGNORE_LIST_EMPTY": + "Список ігнорування чату порожній.", + + "NEW_USER_IMG_CAPTION": + "Вітаю {}! Ласкаво просимо у {}. Будь ласка, напишіть повідомлення з цифрами та/або літерами, які відображаються на цьому зображенні, щоб підтвердити, що ви нормальна людина. Якщо ви не вирішите капчу протягом {}, вас автоматично викинуть із групи.", + + "NEW_USER_MATH_CAPTION": + "Вітаю {}! Ласкаво просимо у {}. Будь ласка, напишіть повідомлення з результатом цього математичного рівняння, щоб переконатися, що ви нормальна людина. Якщо ви не розгадаєте цю капчу за {}, ви автоматично будете виключені з групи.", + + "NEW_USER_BUTTON_MODE": + "Вітаю {}! Ласкаво просимо у {}. Натисніть кнопку нижче, щоб підтвердити, що ви нормальна людина. Якщо ви цього не зробите протягом {}, вас автоматично викинуть із групи.", + + "CAPTCHA_FAIL_CANT_RESTRICT": + "Warning: User {} fail to solve the captcha, but I was not able to restrict/remove the user.", + + "CAPTCHA_FAIL_MUTE": + "The user {} failed to resolve the captcha. The \"user\" was muted and won't be able to send messages for 24h.", + + "CAPTCHA_FAIL_NO_MEDIA": + "The user {} failed to resolve the captcha. The \"user\" was restricted and won't be able to send media messages (image, audio, video, etc.) for 24h.", + + "CAPTCHA_SOLVED": + "Капча вирішена, користувача підтверджено.\nЛаскаво просимо до групи, {}", + + "CAPTCHA_INCORRECT_0": + "Це не правильний код. Спробуйте ще раз...", + + "CAPTCHA_INCORRECT_1": + "Це не правильна цифра. Перевірте уважно, капча має 4 цифри...", + + "CAPTCHA_INCORRECT_MATH": + "Це не правильна відповідь. Уважно перевірте відповідь. Вам потрібно розв’язати математичне рівняння...", + + "CAPTCHA_FAIL_KICK": + "{} не вдалося розгадати капчу. \"користувача\" було вигнано.", + + "NEW_USER_KICK_NOT_RIGHTS": + "Я намагався вигнати \"користувача\" {}, але я не маю прав адміністратора, щоб виганяти користувачів із групи.", + + "NEW_USER_KICK_NOT_IN_CHAT": + "Я намагався вигнати \"користувача\" {}, але користувач більше не входить до групи (покинув групу або був вигнаний адміністратором).", + + "BOT_CANT_KICK": + "Я намагався вигнати \"користувача\" {}, але через несподівану проблему (можливо, пов'язану з мережею/сервером), я не можу цього зробити.", + + "CANT_DEL_MSG": + "Я намагався видалити це повідомлення, але у мене немає прав адміністратора на видалення повідомлень, які я не надсилав.", + + "CAPTCHA_FAIL_BAN": + "Warning: The user {} tried and failed to resolve the captcha {} times. The \"user\" was considered a Bot and banned. To let this \"user\" enter again, an Admin has to manually remove it restrictions from the group settings.", + + "NEW_USER_BAN_NOT_IN_CHAT": + "Warning: The user {} tried and failed to resolve the captcha {} times. I tried to ban the \"user\", but the user is not in the group any more (has left the group or has been kicked out/banned by an Admin).", + + "NEW_USER_BAN_NOT_RIGHTS": + "Warning: The user {} tried and failed to resolve the captcha {} times. I tried to ban the \"user\", but I don't have administration rights to ban users in the group.", + + "BOT_CANT_BAN": + "Warning: The user {} tried and failed to resolve the captcha {} times. I tried to ban the \"user\", but due to an unexpected problem (maybe network/server related), I can't do it.", + + "SPAM_DETECTED_RM": + "Виявлено повідомлення з URL-адресою (або псевдонімом) від {}, який ще не вирішив капчу. Повідомлення було видалено заради збереження Telegram від спаму :)", + + "SPAM_DETECTED_NOT_RM": + "Повідомлення з URL-адресою (або псевдонімом), виявлене у {}, який ще не вирішив капчу. Я намагався видалити спам-повідомлення, але у мене немає прав адміністратора на видалення повідомлень, які я не надсилав.", + + "NOT_TEXT_MSG_ALLOWED": + "Видалено нетекстове повідомлення (зображення, аудіо, файл...) з {}, заради збереження Telegram від спаму.\n\nВи можете надсилати нетекстові повідомлення після того, як вирішите капчу.", + + "RM_SOLVE_KICK_MSG": + "Видаляти повідомлення про кік/бан автоматично через деякий час?\n\nНаприклад:\n/remove_solve_kick_msg yes\n/remove_solve_kick_msg no", + + "RM_SOLVE_KICK_MSG_YES": + "Повідомлення про кік/бан будуть автоматично видалені через деякий час.", + + "RM_SOLVE_KICK_MSG_NO": + "Повідомлення про кік/бан повідомлення не буде видалене.", + + "RM_WELCOME_MSG": + "Видаляти вітальні повідомлення автоматично через деякий час?\n\nНаприклад:\n/remove_welcome_msg yes\n/remove_welcome_msg no", + + "RM_WELCOME_MSG_YES": + "Вітальні повідомлення будуть автоматично видалені через деякий час.", + + "RM_WELCOME_MSG_NO": + "Вітальні повідомлення не будуть автоматично видалені.", + + "OTHER_CAPTCHA_BTN_TEXT": + "Інша капча", + + "PASS_BTN_TEXT": + "Я не бот", + + "URL_MSG_NOT_ALLOWED_DETECTED": + "Виявлено та видалено повідомлення, яке містить URL-адресу/посилання, надіслане користувачем {}.\n\nЦя група не дозволяє відправляти URL-адреси в повідомленнях (адміністратор повинен налаштувати бота, щоб дозволити відправляти URL-адреси в повідомленнях).", + + "URL_ENABLE": + "Добре, тепер користувачі можуть надсилати URL-адреси та посилання в цій групі. Заборонити їм знову надсилати URL-адреси, можна за допомогою команди /url_disable", + + "URL_DISABLE": + "Добре, тепер користувачам заборонено надсилати URL-адреси та посилання в цій групі. Дозволити їм знову надсилати URL-адреси, можна за допомогою команди /url_enable", + + "CONFIG_ALREADY_SET": + "Ця конфігурація вже встановлена/ввімкнена.", + + "CONFIG_ALREADY_UNSET": + "Цю конфігурацію вже скасовано/вимкнено.", + + "ENABLE": + "Захист капчі ввімкнено. Вимкніть його за допомогою команди /disable.", + + "DISABLE": + "Захист капчі вимкнено. Увімкніть його за допомогою команди /enable.", + + "ALREADY_ENABLE": + "Захист капчі вже ввімкнено.", + + "ALREADY_DISABLE": + "Захист капчі вже вимкнено.", + + "CAN_NOT_GET_ADMINS": + "Не вдається використати цю команду в поточному чаті.", + + "VERSION": + "Поточна версія бота:\n{}", + + "ABOUT_MSG": + "Цей бот є безкоштовним програмним забезпеченням та відкритим кодом під ліцензією GNU-GPL.\n\nБот розроблено {}.\n\nВи можете перевірити код тут:\n{}\n\nВам подобається моя робота? Купіть мені каву:\n{}", + + "POLL_NEW_USER": + "Привіт, {}, ласкаво просимо в {}. Будь ласка, дайте відповідь на питання нижче, щоб підтвердити, що ви нормальна людина. Якщо ви не зробите цього протягом {}, ви будете автоматично видалені з групи.\n\nІнформація про ваш профіль, IP та відповідь буде надіслана до СБУ! Слава Україні!", + + "CAPTCHA_POLL_FAIL": + "Капча - відповідь на питання не вирішено, {} обрав невірний варіант. Ви будете виключені з групи через 10 сек. Будь-ласка, спробуйте зайти в групу знову...\n\nІнформація щодо Вас буде надіслана до СБУ! Чекайте на дзвінок!", + + "CAPTCHA_POLL_USAGE": + "Налаштування Капчі - відповіді на питання і параметри опитування \n----------------\nТекст питання не може бути довшим {} символів.\n\nВаріант опитування не може бути більше, ніж {} символів.\n\nМаксімальное кількість опцій {}.\n----------------\nЗадайте питання для опитування:\n/captcha_poll question Ви впевнені, що хочете увійти в цю групу?\n\nВстановити варіант опитування 1:\n/captcha_poll option 1 Ні, я не хочу входити в групу.\n\nУстановіть варіант опитування 2:\n/captcha_poll option 2 Так, я людина і хочу увійти в групу.\n\nВстановити варіант опитування 3:\n/captcha_poll option 3 Хто я і що я роблю?\n\nВидалити варіант опитування 2:\n/captcha_poll option 2 remove\n\nВстановити правильний варіант опитування 2:\n/captcha_poll correct_option 2\n\nЗаміна режиму в Капча - відповідь на питання:\n/captcha_mode poll", + + "POLL_QUESTION_CONFIGURED": + "Капча - відповіді на питання успішно налаштовано.", + + "POLL_OPTION_CONFIGURED": + "Параметр Капча - відповідь на питання {} успішно налаштовано.", + + "POLL_CORRECT_OPTION_CONFIGURED": + "Капча - відповідь на питання. Правильний варіант успішно налаштований на номер опції {}.", + + "POLL_CORRECT_OPTION_NOT_CONFIGURED": + "Номер варіанта опитування {} не існує, спочатку налаштуйте цей параметр.\n\nНаприклад:\n/captcha_poll question 1+2 дорівнює 5?\n\n/captcha_poll option 1 Так\n\n/captcha_poll option 2 Ні\n\n/captcha_poll correct_option 2\n\n/captcha_mode poll", + + "POLL_NEW_USER_NOT_CONFIG": + "Прийшов новий користувач, але Капча - відповіді на питання налаштовані не повністю.\n\nНеобхідно налаштувати питання і відповіді, правильну відповідь на питання і мінімум 2 варіанти відповіді. Будь-ласка, налаштуйте його за допомогою команди: /captcha_poll command.\n\nНаприклад:\n/captcha_poll question 1+2 дорівнює 5?\n\n/captcha_poll option 1 Так\n\n/captcha_poll option 2 Ні\n\n/captcha_poll correct_option 2\n\n/captcha_mode poll", + + "CONNECT_USAGE": + "Вам необхідно вказати ID групового чату, до якого потрібно підключитися (використовуйте команду /chatid всередині групи, щоб дізнатися id групового чату).\n\nНаприклад:\n/connect -1234567890", + + "CONNECT_JUST_ADMIN": + "Його може налаштувати тільки адміністратор цієї групи.", + + "CONNECT_OK": + "Підключений до групи {}. Тепер Ви можете налаштувати параметри групової капчи з особистих повідомлень.", + + "DISCONNECT_NOT_CONNECTED": + "Немає підключення.", + + "DISCONNECT_OK": + "Виключений з групи {}.", + + "INVALID_GROUP_ID": + "Невірний ID групового чату.", + + "CHECK_CFG": + "Параметри конфігурації:\n————————————————\n```\n{}\n```", + + "CMD_NOT_ALLOW_PRIVATE": + "Цю команду не можна використовувати в приватному чаті.", + + "CMD_NEEDS_CONNECTION": + "Щоб використовувати цю команду в приватному чаті, потрібно спочатку підключитися до чату через команду: /connect .", + + "CMD_JUST_IN_PRIVATE": + "Цю команду не можна використовувати всередині групи (використовуйте її в приватному чаті з ботом).", + + "RM_ALL_MSGS_AFTER_KICK_ON": + "Конфігурацію змінено, усі повідомлення, надіслані користувачами, які не вирішили капчу, будуть видалені.", + + "RM_ALL_MSGS_AFTER_KICK_OFF": + "Конфігурацію змінено, повідомлення, надіслані користувачами, які не розгадали капчу, не видалятимуться.", + + "BILANG_MSG": + "Configure if text of captcha messages must be shown in both, english and configured language.\n\nExamples:\n/bilanguage yes\n/bilanguage no", + + "BILANG_MSG_NO": + "Configuration changed. Captcha messages text will be shown in a single language.", + + "BILANG_MSG_YES": + "Configuration changed. Captcha messages text will be shown in two languages." +} diff --git a/requirements.txt b/src/requirements.txt similarity index 100% rename from requirements.txt rename to src/requirements.txt diff --git a/src/settings.py b/src/settings.py index c1e4b7fe..fda4dd24 100644 --- a/src/settings.py +++ b/src/settings.py @@ -94,6 +94,9 @@ # and cause overload) "CAPTCHABOT_F_BAN_GROUPS": SCRIPT_PATH + "/data/bannedgroups.txt", + # Ukraine specific question for ban russists + "CAPTCHABOT_F_UKRAINER": SCRIPT_PATH + "/data/ukrainer.json", + # Initial language at Bot start "CAPTCHABOT_INIT_LANG": "EN", @@ -118,8 +121,7 @@ # Initial captcha difficult level "CAPTCHABOT_INIT_CAPTCHA_DIFFICULTY_LEVEL": 3, - # Initial captcha characters mode (ascii, hex, nums, math, poll, or - # button) + # Initial captcha characters mode (ascii, hex, nums, math, poll, or button) "CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE": "nums", # Initial remove result messages group configuration diff --git a/src/ukrainer.json b/src/ukrainer.json new file mode 100644 index 00000000..4bb8c7e3 --- /dev/null +++ b/src/ukrainer.json @@ -0,0 +1,218 @@ +[ + { + "Poll_Q": "Продовжіть гасло: Батько наш ...!", + "Poll_A": [ + "Бендера", + "Бендер", + "Бандера", + "Бандер", + "Бандара", + "Стакан портвейна" + ], + "Poll_C_A": 3 + }, + { + "Poll_Q": "Чий Крим?", + "Poll_A": [ + "Наш", + "Російський", + "Татарський", + "Український", + "Нічий", + "Не интересуюсь политикой" + ], + "Poll_C_A": 4 + }, + { + "Poll_Q": "Продовжіть гасло: Слава Україні - ...", + "Poll_A": [ + "Воістину Слава", + "Не интересуюсь политикой", + "Слава Героям", + "Слава Нації", + "Слава Героям", + "Героям Слава!" + ], + "Poll_C_A": 6 + }, + { + "Poll_Q": "Продовжіть факт: путін - ...", + "Poll_A": [ + "молодець", + "хуйло", + "підарас", + "норм", + "ok", + "Не интересуюсь политикой" + ], + "Poll_C_A": 2 + }, + { + "Poll_Q": "Дякую тобі Боже, що я не ...", + "Poll_A": [ + "кацап", + "москаль", + "русня", + "орк", + "путін", + "окупант" + ], + "Poll_C_A": 2 + }, + { + "Poll_Q": "Хто не скаче той ...", + "Poll_A": [ + "не скаче", + "хворий", + "болить спина", + "русня", + "москаль", + "кацап" + ], + "Poll_C_A": 5 + }, + { + "Poll_Q": "Продовжіть факт: Русні ...", + "Poll_A": [ + "Не интересуюсь политикой", + "жопа", + "пизда", + "смішно", + "класно", + "спекотно" + ], + "Poll_C_A": 3 + }, + { + "Poll_Q": "Продовжіть гасло: Слава нації - ...", + "Poll_A": [ + "Смерть ворогам!", + "Не интересуюсь политикой", + "Слава Україні!", + "Україіні слава!", + "Ворогам слава!", + "Всім слава!" + ], + "Poll_C_A": 1 + }, + { + "Poll_Q": "Немає сечі терпіти ці ...", + "Poll_A": [ + "адские муки", + "адские пуки", + "адкие борошна", + "проблеми", + "страждання", + "пекельні борошна" + ], + "Poll_C_A": 6 + }, + { + "Poll_Q": "Крим це ...", + "Poll_A": [ + "Україна", + "росія", + "Кримська незалежна республіка", + "Не интересуюсь политикой", + "півострів", + "полуостров" + ], + "Poll_C_A": 1 + }, + { + "Poll_Q": "Навіщо окупанту класти соняшникове насіння в кишені?", + "Poll_A": [ + "Щоб було що погризти", + "Щоб не був голодний", + "Вимога статуту", + "Кормити голубів", + "Щоб соняшник проріс", + "Відволікти бойових гусей" + ], + "Poll_C_A": 5 + }, + { + "Poll_Q": "Електрохарчування це ...", + "Poll_A": [ + "Електрохавка", + "Електроживлення", + "Електропитание", + "Електрокар", + "Електропотяг", + "Харчі" + ], + "Poll_C_A": 2 + }, + { + "Poll_Q": "Паляниця це ...", + "Poll_A": [ + "Паляніца", + "Клубніка", + "Полуниця", + "Поле", + "Хліб", + "Поляна" + ], + "Poll_C_A": 5 + }, + { + "Poll_Q": "Орка тіло ляже в ґрунт - ...", + "Poll_A": [ + "Допоможе ТРО!", + "Посприяє ТРО!", + "Посприяє ЗСУ!", + "Допоможе ЗСУ!", + "Так важає ЗСУ!", + "Буде всім капут!" + ], + "Poll_C_A": 4 + }, + { + "Poll_Q": "Доброго вечора, ...", + "Poll_A": [ + "ми з України!", + "ми з Києва!", + "ми з вулиці!", + "ми з вечорниці!", + "ми зі Львова!", + "Як ваші справи?" + ], + "Poll_C_A": 1 + }, + { + "Poll_Q": "Русский воєнний корабль - ...", + "Poll_A": [ + "потонув!", + "пішов нахуй!", + "пішов додому.", + "іді нахуй!", + "fuck you!", + "Я внє політікі!" + ], + "Poll_C_A": 4 + }, + { + "Poll_Q": "На якій горі готується оргія \"в момент ядерного удару\"? ", + "Poll_A": [ + "Андріївська", + "Лиса гора", + "Замкова гора", + "Кирилівська гора", + "Юрковиця", + "Щекавиця" + ], + "Poll_C_A": 6 + }, + { + "Poll_Q": "Українська версія Санта-Барбари", + "Poll_A": [ + "Бахмут", + "Каховка", + "Олешки", + "Мелітополь", + "Чорнобаївка", + "Токмак" + ], + "Poll_C_A": 5 + } +] \ No newline at end of file diff --git a/src/ukrainer.py b/src/ukrainer.py new file mode 100644 index 00000000..bbdf6703 --- /dev/null +++ b/src/ukrainer.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Author: Serhii Horelskyi (https://github.com/kt315ua) + +# JSON Library +from json import load as json_load +import random + +# Constants Library +from constants import ( + SCRIPT_PATH, CONST, TEXT +) + + +def get_data(): + with open(CONST["F_UKRAINER"], 'r') as f: + data = json_load(f) + return data + + +def get_poll(): + data = get_data() + quesrtion_id = random.randrange(0, len(data)) + _question = data[quesrtion_id]["Poll_Q"] + _answers = list(data[quesrtion_id]["Poll_A"]) + _correct_id = data[quesrtion_id]["Poll_C_A"] + q_data = { + "Poll_Q": _question, + "Poll_A": _answers, + "Poll_C_A": _correct_id + } + return q_data diff --git a/telegram_captcha_bot_ua.service b/telegram_captcha_bot_ua.service new file mode 100644 index 00000000..40156e3f --- /dev/null +++ b/telegram_captcha_bot_ua.service @@ -0,0 +1,24 @@ +[Unit] +Description=TLGCaptchaBotUa: https://t.me/UaCaptchaBot +Requires=docker.service +BindsTo=docker.service +Conflicts=shutdown.target reboot.target halt.target + +[Service] +#Restart=always +Restart=on-failure +RestartSec=30 +TimeoutSec=300 + +Group=docker + +ExecStartPre=-/usr/local/bin/docker-compose -f /home/admin/github/TLG_JoinCaptchaBot_UA/docker-compose.yml kill +ExecStartPre=-/usr/local/bin/docker-compose -f /home/admin/github/TLG_JoinCaptchaBot_UA/docker-compose.yml rm +ExecStartPre=-/usr/local/bin/docker-compose -f /home/admin/github/TLG_JoinCaptchaBot_UA/docker-compose.yml rm -f + +ExecStart=/usr/local/bin/docker-compose -f /home/admin/github/TLG_JoinCaptchaBot_UA/docker-compose.yml up --force-recreate --no-deps + +ExecStop=/usr/local/bin/docker-compose -f /home/admin/github/TLG_JoinCaptchaBot_UA/docker-compose.yml stop + +[Install] +WantedBy=multi-user.target