clean history
This commit is contained in:
parent
1387ec35c6
commit
a45809ff84
|
|
@ -0,0 +1,4 @@
|
||||||
|
node_modules/
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
dist/
|
||||||
|
|
@ -1,2 +1,10 @@
|
||||||
# sergay
|
# sergay
|
||||||
|
<<<<<<< HEAD
|
||||||
|
|
||||||
|
=======
|
||||||
|
Этот репозиторий создан для унижения Сергея Пидоровича и анального удовлетворения.
|
||||||
|
Сергей сосал член
|
||||||
|
|
||||||
|
This repository was created to humiliate Sergey Pidorovich and anal satisfaction.
|
||||||
|
Sergay suck dick
|
||||||
|
>>>>>>> 8bf51d5 (clean history)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
node_modules/
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
dist/
|
||||||
|
|
@ -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
|
||||||
|
```
|
||||||
|
|
@ -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("Фраза пустая")
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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": "поставил водник для раскумара"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -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()
|
||||||
Loading…
Reference in New Issue