From a45809ff84f608f9f3a288117b99a6af03c5505a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 18 Mar 2026 01:23:25 +0300 Subject: [PATCH] clean history --- .gitignore | 4 + README.md | 8 ++ code/.gitignore | 4 + code/README.md | 13 +++ code/add_json.py | 43 ++++++++ code/gitup.sh | 18 ++++ code/sergay.json | 262 +++++++++++++++++++++++++++++++++++++++++++++++ code/sergay.py | 218 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 570 insertions(+) create mode 100644 .gitignore create mode 100644 code/.gitignore create mode 100644 code/README.md create mode 100644 code/add_json.py create mode 100755 code/gitup.sh create mode 100644 code/sergay.json create mode 100644 code/sergay.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..557d2c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +.env.* +dist/ diff --git a/README.md b/README.md index 52d2e20..3f1a7df 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ # sergay +<<<<<<< HEAD +======= +Этот репозиторий создан для унижения Сергея Пидоровича и анального удовлетворения. +Сергей сосал член + +This repository was created to humiliate Sergey Pidorovich and anal satisfaction. +Sergay suck dick +>>>>>>> 8bf51d5 (clean history) diff --git a/code/.gitignore b/code/.gitignore new file mode 100644 index 0000000..557d2c3 --- /dev/null +++ b/code/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.env +.env.* +dist/ diff --git a/code/README.md b/code/README.md new file mode 100644 index 0000000..39a4a7e --- /dev/null +++ b/code/README.md @@ -0,0 +1,13 @@ +# sergay +Здесь будет основной код для унижения, +необходимые pip модули: +``` +python-telegram-bot +python-dotenv +``` +Here will be the basic code for humiliating, +the necessary pip modules: +``` +python-telegram-bot +python-dotenv +``` diff --git a/code/add_json.py b/code/add_json.py new file mode 100644 index 0000000..2ba64c9 --- /dev/null +++ b/code/add_json.py @@ -0,0 +1,43 @@ +import json +from pathlib import Path + +JSON_FILE = "sergay.json" + + +def add_phrase(text: str): + path = Path(JSON_FILE) + + if not path.exists(): + print("Файл sergay.json не найден") + return + + with path.open("r", encoding="utf-8") as f: + data = json.load(f) + + if not isinstance(data, list): + print("JSON должен быть списком") + return + + last_id = max(item["id"] for item in data) + new_id = last_id + 1 + + new_item = { + "id": new_id, + str(new_id): text + } + + data.append(new_item) + + with path.open("w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + print(f"Добавлено: {new_item}") + + +if __name__ == "__main__": + phrase = input("Введите новую фразу: ").strip() + + if phrase: + add_phrase(phrase) + else: + print("Фраза пустая") diff --git a/code/gitup.sh b/code/gitup.sh new file mode 100755 index 0000000..c8e2a3f --- /dev/null +++ b/code/gitup.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -a +source .env +set +a + +cd ~/sergay || exit 1 + +git add . + +if ! git diff --cached --quiet; then + git commit -m "update" || exit 1 +else + echo "Нет новых изменений" +fi + +git pull --rebase "http://usergit.duckdns.org/igor/sergay.git" main || exit 1 +git push "http://igor:${GIT}@usergit.duckdns.org/igor/sergay.git" diff --git a/code/sergay.json b/code/sergay.json new file mode 100644 index 0000000..1caac55 --- /dev/null +++ b/code/sergay.json @@ -0,0 +1,262 @@ +[ + { + "id": 1, + "1": "сын шлюхи" + }, + { + "id": 2, + "2": "Пидорович" + }, + { + "id": 3, + "3": "обосанный мудак" + }, + { + "id": 4, + "4": "дрочит в коморке" + }, + { + "id": 5, + "5": "свин мертвой шлюхи" + }, + { + "id": 6, + "6": "любит когда ему садятся на лицо" + }, + { + "id": 7, + "7": "гнида хаченская" + }, + { + "id": 8, + "8": "зоофил" + }, + { + "id": 9, + "9": "педофил" + }, + { + "id": 10, + "10": "ебал прах своей матери" + }, + { + "id": 11, + "11": "хуесос с грязной жопой" + }, + { + "id": 12, + "12": "иноагент" + }, + { + "id": 13, + "13": "снаряд в пушке" + }, + { + "id": 14, + "14": "уже мертв" + }, + { + "id": 15, + "15": "любит когда ему наступают на яйца" + }, + { + "id": 16, + "16": "без члена" + }, + { + "id": 17, + "17": "людоед" + }, + { + "id": 18, + "18": "сосал член" + }, + { + "id": 19, + "19": "имеет желтый член" + }, + { + "id": 20, + "20": "не умеет ходить" + }, + { + "id": 21, + "21": "пустил по кругу шуру" + }, + { + "id": 22, + "22": "стриптезер без оброзавания" + }, + { + "id": 23, + "23": "безмозглый пидор" + }, + { + "id": 24, + "24": "999999999999999999 сосал и лизал" + }, + { + "id": 25, + "25": "колличество оборотов его пропелера не исчесляется" + }, + { + "id": 26, + "26": "я хз шо писать" + }, + { + "id": 27, + "27": "петушара" + }, + { + "id": 28, + "28": "спит у параши" + }, + { + "id": 29, + "29": "спидозный" + }, + { + "id": 30, + "30": "фембой" + }, + { + "id": 31, + "31": "живет на нудистком пляже" + }, + { + "id": 32, + "32": "живет в подвале" + }, + { + "id": 33, + "33": "пидор со стажем в отлизывание яиц" + }, + { + "id": 34, + "34": "увидел ребенка и повысил обороты перпелера" + }, + { + "id": 35, + "35": "совал хуй в арбуз" + }, + { + "id": 36, + "36": "терпилоид, но не позволит посылать себя нахуй" + }, + { + "id": 37, + "37": "модная сиська" + }, + { + "id": 38, + "38": "складочка" + }, + { + "id": 39, + "39": "любит детскую порнографию духа" + }, + { + "id": 40, + "40": "жидко пернул" + }, + { + "id": 41, + "41": "ебакрыл" + }, + { + "id": 42, + "42": "хуеглот глоп глоп" + }, + { + "id": 43, + "43": "еврей" + }, + { + "id": 44, + "44": "ебал собак, котов, попугаев, львов, тигров, обезьян, воробьев, хомяков, пантер, лис, кроликов, коз, баранов, ослов, лошадей, оленей" + }, + { + "id": 45, + "45": "сосет и его ебали" + }, + { + "id": 46, + "46": "объебаный наркошарик" + }, + { + "id": 47, + "47": "вялый хуй" + }, + { + "id": 48, + "48": "лох цветочный" + }, + { + "id": 49, + "49": "украинец с гейскими наклонностями" + }, + { + "id": 50, + "50": "обсасывает золотые я\b\b\b\b\b\bх\b" + }, + { + "id": 51, + "51": "краник" + }, + { + "id": 52, + "52": "нюхал яйца" + }, + { + "id": 53, + "53": "фетишист" + }, + { + "id": 54, + "54": "говорит гав гав" + }, + { + "id": 55, + "55": "9\b лет как под наркозом хуйхуйхуй" + }, + { + "id": 56, + "56": "очкастая пизда" + }, + { + "id": 57, + "57": "не имеет прав он петух оалклкоал" + }, + { + "id": 58, + "58": "зассаный банан" + }, + { + "id": 59, + "59": "ZZZ ГОЙДА ПАТРИОТ ZZZ" + }, + { + "id": 60, + "60": "варит меф" + }, + { + "id": 61, + "61": "следит за тобой" + }, + { + "id": 62, + "62": "сидит на дереве с биноклем" + }, + { + "id": 63, + "63": "завел канал на пронхабе" + }, + { + "id": 64, + "64": "четырехглазый" + }, + { + "id": 65, + "65": "поставил водник для раскумара" + } +] \ No newline at end of file diff --git a/code/sergay.py b/code/sergay.py new file mode 100644 index 0000000..f8d9024 --- /dev/null +++ b/code/sergay.py @@ -0,0 +1,218 @@ +import json +import os +import random +import subprocess +from pathlib import Path + +from dotenv import load_dotenv +from telegram import Update +from telegram.ext import ( + ApplicationBuilder, + CommandHandler, + ContextTypes, + ConversationHandler, + MessageHandler, + filters, +) + +PREFIX_WORD = "Сергей" +JSON_FILE = "sergay.json" +SERVICE_NAME = "sergay-bot" + +WAITING_NEW_PHRASE = 1 + + +def load_phrases(file_path: str) -> list[str]: + path = Path(file_path) + + if not path.exists(): + return [] + + with path.open("r", encoding="utf-8") as f: + data = json.load(f) + + phrases = [] + + if isinstance(data, list): + for item in data: + if isinstance(item, dict): + item_id = item.get("id") + if isinstance(item_id, int): + value = item.get(str(item_id)) + if isinstance(value, str) and value.strip(): + phrases.append(value.strip()) + else: + for value in item.values(): + if isinstance(value, str) and value.strip(): + phrases.append(value.strip()) + elif isinstance(item, str) and item.strip(): + phrases.append(item.strip()) + + return phrases + + +def load_raw_data(file_path: str) -> list: + path = Path(file_path) + + if not path.exists(): + return [] + + with path.open("r", encoding="utf-8") as f: + data = json.load(f) + + if not isinstance(data, list): + raise ValueError("JSON должен содержать список") + + return data + + +def save_new_phrase(file_path: str, phrase: str) -> None: + phrase = phrase.strip() + if not phrase: + raise ValueError("Пустую фразу добавлять нельзя") + + data = load_raw_data(file_path) + + existing_phrases = set() + max_id = 0 + + for item in data: + if isinstance(item, dict): + item_id = item.get("id") + if isinstance(item_id, int): + max_id = max(max_id, item_id) + value = item.get(str(item_id)) + if isinstance(value, str): + existing_phrases.add(value.strip()) + + if phrase in existing_phrases: + raise ValueError("Такая фраза уже есть в базе") + + new_id = max_id + 1 + data.append({ + "id": new_id, + str(new_id): phrase + }) + + path = Path(file_path) + with path.open("w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + +def restart_service() -> None: + subprocess.Popen( + ["systemctl", "restart", SERVICE_NAME], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + start_new_session=True, + ) + + +def run_gitup() -> tuple[bool, str]: + result = subprocess.run( + ["bash", "gitup.sh"], + capture_output=True, + text=True, + ) + + output = (result.stdout or "").strip() + error = (result.stderr or "").strip() + + if result.returncode == 0: + return True, output or "gitup выполнен" + return False, error or output or "Ошибка выполнения gitup" + + +async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + text = ( + "Вот список команд:\n\n" + "Получить фразу — /phrase\n" + "Добавить фразу — /new\n" + ) + await update.message.reply_text(text) + + +async def phrase(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + try: + phrases = load_phrases(JSON_FILE) + if not phrases: + text = "Фразы пока не добавлены" + else: + phrase_text = random.choice(phrases) + text = f"{PREFIX_WORD} {phrase_text}".strip() + except Exception as e: + text = f"Ошибка: {e}" + + await update.message.reply_text(text) + + +async def new_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + await update.message.reply_text("Введите фразу:") + return WAITING_NEW_PHRASE + + +async def new_save(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + phrase_text = (update.message.text or "").strip() + + if not phrase_text: + await update.message.reply_text("Фраза пустая. Введите фразу:") + return WAITING_NEW_PHRASE + + try: + save_new_phrase(JSON_FILE, phrase_text) + await update.message.reply_text(f"Добавленно {PREFIX_WORD} {phrase_text}") + restart_service() + except Exception as e: + await update.message.reply_text(f"Ошибка: {e}") + + return ConversationHandler.END + + +async def new_cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + await update.message.reply_text("Отменено") + return ConversationHandler.END + + +async def gitup(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text("Запускаю gitup...") + + ok, output = run_gitup() + + if len(output) > 3500: + output = output[:3500] + "\n\n...вывод обрезан" + + if ok: + await update.message.reply_text(f"gitup выполнен\n\n{output}") + else: + await update.message.reply_text(f"Ошибка gitup\n\n{output}") + + +def main() -> None: + load_dotenv() + token = os.getenv("TG_TOKEN") + + if not token: + raise ValueError("Не найден TG_TOKEN в .env") + + app = ApplicationBuilder().token(token).build() + + new_handler = ConversationHandler( + entry_points=[CommandHandler("new", new_start)], + states={ + WAITING_NEW_PHRASE: [ + MessageHandler(filters.TEXT & ~filters.COMMAND, new_save) + ], + }, + fallbacks=[CommandHandler("cancel", new_cancel)], + ) + + app.add_handler(CommandHandler("start", start)) + app.add_handler(CommandHandler("phrase", phrase)) + app.add_handler(CommandHandler("gitup", gitup)) + app.add_handler(new_handler) + + app.run_polling() + + +if __name__ == "__main__": + main()