280 lines
7.7 KiB
Python
280 lines
7.7 KiB
Python
import os
|
|
import random
|
|
import telebot
|
|
import requests
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
API_KEY = os.getenv("API_KEY")
|
|
CZCHAN_LLM_KEY = os.getenv("CZCHAN_LLM_KEY")
|
|
|
|
CHANCE = 1.0
|
|
IMAGE_FOLDER = "obruzky"
|
|
MUSIC_FOLDER = "hudba"
|
|
|
|
bot = telebot.TeleBot(API_KEY)
|
|
|
|
PHRASES_ALL = [
|
|
{"text":"Tak uědlej JINEEJ SKUPINA VOLE TY NUDLE ČÍNSKÁ POSRANA"},
|
|
{"text":"TY KURVO POSRANA ČDJ CIGAN Z USTÍ POSEDLÝ KRETEN ZE SLOVENSKO ESL"},
|
|
{"text":"kordman dicx face reveal\nKORMAN JE NEGR Z OHIA"},
|
|
{"text":"MÁM COKERA A KORDMANA PLNÝ ZUBY\nVOLE"},
|
|
{"text":"léky"},
|
|
{"text":"posedlej"},
|
|
{"text":"Léky tohle nejsou hovna\nJsou to střeva\nJsou to střeva po znásilnění"},
|
|
{"text":"jsem femboy z usteckého kraje a dam ti e-sex přes telefon"},
|
|
{"text":"mugshot ahh negr kočka"},
|
|
{"text":"Ano ale můžu být femgoy"},
|
|
{"text":"OYYYY"},
|
|
{"text":"Dělám to pro ženy"},
|
|
{"text":"I'm not from Nová Vrchoslav 122"},
|
|
{"text":"Kek faildox", "file": "obruzky/nová vrchoslav 122.jpg"},
|
|
{"text":"Posedlost s 15 letím klukem btw"},
|
|
{"text":"Honí si ho tomu nebo co?"},
|
|
{"text":"Jeden měsíc mám troon arc a tohle jse stane"},
|
|
{"text":"jsem validní femGOY"},
|
|
{"text":"xestro..."},
|
|
{"text":"jedy"},
|
|
{"text":"POMOC LIDI\nMĚ BOLÍ MOC PÉRO Z GOONOVANÍ\n\nbolí mě to vole tak MOC\nNEMUŽU PŘESTAT DOE"},
|
|
{"text":"Chtěl bych být foidka ale nemůžu doe je to nemorální"},
|
|
{"text":"I gonna rape you with my slovenian BWC you fucking serbian subhuman"},
|
|
{"text":"I have no friends, not online or offline\n\nI am not kidding, i can jump from my window, overdose or hang myself\nI can do it\nI gonna write a suicide note and post it on my main if that happens\nI dont care anymore"},
|
|
{"text":"Similliar o algx\nIm not Mario Kart pedo i promise"},
|
|
{"text":">Czech kuz?\n<Sort of."},
|
|
{"text":"faildoxx", "file": "obruzky/nová vrchoslav 122.jpg"},
|
|
{"text":"jsem ústejkéj občan a tohle nosím do školy", "file":"obruzky/ústeckéj občan.png"},
|
|
]
|
|
|
|
PHRASES_ZLINC = [
|
|
"Ží N'SEN David Žlinc, es't nánčodnej těpek mžej škôl",
|
|
"Ží přis upřilím",
|
|
"UPLŽTE ŽRŽIDCE CECETKAKU",
|
|
"es't faildoxx, ží tům nebylžím",
|
|
"OBĽÚBENÁ BINCÁ", # nehotovží
|
|
]
|
|
|
|
PHRASES_SNEED = [
|
|
"Tak uědlej JINEEJ SKUPINA VOLE TY NUDLE ČÍNSKÁ POSRANA",
|
|
"MÁM COKERA A KORDMANA PLNÝ ZUBY\nVOLE",
|
|
"Ano ale můžu být femgoy",
|
|
"posedlej",
|
|
"léky",
|
|
"Chtěl bych být foidka ale nemůžu doe je to nemorální",
|
|
"Posedlost s 15 letím klukem btw", # DODĚLŽI
|
|
]
|
|
|
|
PHRASES_BRIMMY = [
|
|
"TY KURVO POSRANA ČDJ CIGAN Z USTÍ POSEDLÝ KRETEN ZE SLOVENSKO ESL",
|
|
"kordman dicx face reveal\nKORMAN JE NEGR Z OHIA",
|
|
"léky",
|
|
"posedlej",
|
|
"I'm not from Nová Vrchoslav 122",
|
|
"Kek faildox",
|
|
"Jeden měsíc mám troon arc a tohle jse stane", # taky dodělži
|
|
]
|
|
|
|
VIDEO_EXT = (
|
|
".mp4",
|
|
".mov",
|
|
".avi",
|
|
".mkv",
|
|
".webm",
|
|
".3gp",
|
|
".3gpp",
|
|
".3g2",
|
|
) # 3GP JE ŽRÍJSKÉ A SUDETKEŠNÍ, ZRÁDCI POUŽÍVAJÍ MPEG
|
|
AUDIO_EXT = (
|
|
".mp3",
|
|
".wav",
|
|
".ogg",
|
|
".flac",
|
|
".m4a",
|
|
".opus",
|
|
".3gp",
|
|
".3gpp",
|
|
".3g2",
|
|
)
|
|
|
|
files = os.listdir(IMAGE_FOLDER)
|
|
files2 = os.listdir(MUSIC_FOLDER)
|
|
|
|
|
|
# Tenhle diddy blud skenuje složku vždecke když posílá žlincerald lebkalebkalebka
|
|
# ANX, ES'T ŽRÍJSKÝ JESENÍKEŠNÍ KÓD PŘE ZRÝDCIJI Z ČIČCICKU
|
|
@bot.message_handler(commands=["zlincerald"])
|
|
def send_random_image(message):
|
|
chosen = random.choice(files)
|
|
|
|
path = os.path.join(IMAGE_FOLDER, chosen)
|
|
|
|
with open(path, "rb") as media:
|
|
if chosen.lower().endswith(VIDEO_EXT):
|
|
bot.send_video(message.chat.id, media)
|
|
else:
|
|
bot.send_photo(message.chat.id, media)
|
|
|
|
#šludba
|
|
@bot.message_handler(commands=["hudba"])
|
|
def send_random_song(message):
|
|
chosen = random.choice(files2)
|
|
path = os.path.join(MUSIC_FOLDER, chosen)
|
|
|
|
with open(path, "rb") as media:
|
|
name = chosen.lower()
|
|
|
|
if name.endswith(AUDIO_EXT):
|
|
bot.send_audio(message.chat.id, media)
|
|
|
|
elif name.endswith(VIDEO_EXT):
|
|
bot.send_video(message.chat.id, media)
|
|
|
|
else:
|
|
bot.send_document(message.chat.id, media)
|
|
|
|
# https://github.com/oobabooga/text-generation-webui/wiki/12-%E2%80%90-OpenAI-API#chat-completions-with-characters
|
|
def llm_api_call(messages):
|
|
# Mistral params:
|
|
# "temperature": 0.3,
|
|
# "top_p": 0.9,
|
|
# "top_k": 40,
|
|
# "repeat_penalty": 1.2,
|
|
# "max_tokens": 512,
|
|
|
|
# Qwen params:
|
|
# "temperature": 0.6,
|
|
# "top_p": 0.8,
|
|
# "top_k": 20,
|
|
# "min_p": 0.0,
|
|
# "presence_penalty": 1.5,
|
|
# "repetition_penalty": 1.00,
|
|
# "max_tokens": 512,
|
|
|
|
response = requests.post(
|
|
"https://llm.czchan.org/v1/chat/completions",
|
|
headers={"Authorization": f"Bearer {CZCHAN_LLM_KEY}"},
|
|
json={
|
|
"messages": messages,
|
|
"mode": "chat",
|
|
"character": "David Šlinc",
|
|
"temperature": 0.3,
|
|
"top_p": 0.9,
|
|
"top_k": 40,
|
|
"repetition_penalty": 1.2,
|
|
"max_tokens": 512,
|
|
},
|
|
)
|
|
|
|
json = response.json()
|
|
|
|
return json["choices"][0]["message"]["content"]
|
|
|
|
|
|
# NSA sledovací databáze
|
|
message_store = {}
|
|
|
|
|
|
def log(message):
|
|
message_store[message.message_id] = {
|
|
"user_id": message.from_user.id,
|
|
"text": message.text or message.caption,
|
|
"reply_to": (
|
|
message.reply_to_message.message_id if message.reply_to_message else None
|
|
),
|
|
}
|
|
|
|
|
|
def maybe_send(message, phrases):
|
|
if random.random() < CHANCE:
|
|
message = bot.reply_to(message, random.choice(phrases))
|
|
log(message)
|
|
|
|
def send_phrase(message, PHRASES_ALL):
|
|
item = random.choice(PHRASES_ALL)
|
|
|
|
text = item["text"]
|
|
path = item.get("file")
|
|
|
|
if not path:
|
|
bot.reply_to(message, text)
|
|
return
|
|
|
|
with open(path, "rb") as media:
|
|
lower = path.lower()
|
|
|
|
if lower.endswith(VIDEO_EXT):
|
|
bot.send_video(message.chat.id, media, caption=text)
|
|
|
|
elif lower.endswith(AUDIO_EXT):
|
|
bot.send_audio(message.chat.id, media, caption=text)
|
|
|
|
else:
|
|
bot.send_photo(message.chat.id, media, caption=text)
|
|
|
|
@bot.message_handler(commands=["czchan"])
|
|
def cmd_czchan(message):
|
|
send_phrase(message, PHRASES_ALL)
|
|
|
|
@bot.message_handler(commands=["sneedmaster"])
|
|
def cmd_sneed(message):
|
|
maybe_send(message, PHRASES_SNEED)
|
|
|
|
|
|
@bot.message_handler(commands=["heckingemmy"])
|
|
def cmd_brimmy(message):
|
|
maybe_send(message, PHRASES_BRIMMY)
|
|
|
|
|
|
@bot.message_handler(commands=["ai"])
|
|
def cmd_ai(message):
|
|
actualmessage = " ".join(message.text.split(" ")[1:])
|
|
messages = [{"role": "user", "content": actualmessage}]
|
|
|
|
try:
|
|
response = llm_api_call(messages)
|
|
message = bot.reply_to(message, response)
|
|
log(message)
|
|
except:
|
|
print("Kurvá pósetí")
|
|
|
|
|
|
@bot.message_handler(
|
|
func=lambda m: True,
|
|
content_types=["text", "photo", "video", "document", "audio", "voice"],
|
|
)
|
|
def reply(message):
|
|
log(message)
|
|
|
|
messages = []
|
|
current_id = message.message_id
|
|
should_reply = False
|
|
|
|
while current_id:
|
|
data = message_store.get(current_id)
|
|
|
|
if not data:
|
|
break
|
|
|
|
if data["user_id"] == bot.user.id:
|
|
should_reply = True
|
|
role = "assistant"
|
|
else:
|
|
role = "user"
|
|
|
|
messages.append({"role": role, "content": data["text"]})
|
|
current_id = data["reply_to"]
|
|
|
|
messages.reverse()
|
|
|
|
if should_reply:
|
|
try:
|
|
response = llm_api_call(messages)
|
|
message = bot.reply_to(message, response)
|
|
log(message)
|
|
except:
|
|
print("Kurvá pósetí")
|
|
|
|
|
|
bot.polling()
|