24 Commits

Author SHA1 Message Date
Souce
6aaf46f9bd Merge pull request #2 from SouceCalve/dev
Massive changes to replacement system + more changes!
Изменена работа системы замен, добавлен рандом и куча новых слов на замену. События должны быть по настоящему редкими.
Добавлена функция отключения рандома, если хотите включать все события на каждое сообщение.
Добавлена функция обнаружения шифрования - если в сообщении появится base64 текст, то он не будет преобразован.
Работами со спецсимволами и символами на конце строки исправлена.
2025-10-08 21:31:54 +07:00
homayk228
942de4995e [FIX] Dumb mode status messages changed places
Перепутал местами вкл и выкл на режиме без рандома
2025-10-08 21:15:33 +07:00
homayk228
ec4170842a [UPD] Added a mad mode
Добавил режим без рандома - вcё что попало, всё под преобразование
2025-10-08 21:11:41 +07:00
homayk228
a2c94ec024 [UPD] Changed word multiplicator
Добавил дефисы в удлинённые буквы, чтобы звучало характернее.
2025-10-08 20:54:22 +07:00
homayk228
f102f4adb3 [FIX] Forgor : 2025-09-20 22:19:13 +07:00
homayk228
4ee7276713 [FIX] Enabled back some random
And added some more randoms
2025-09-20 22:17:37 +07:00
homayk228
77e89fcf05 [TEST] Fix 2 to check problem 2025-09-20 22:10:57 +07:00
homayk228
bcabbca28c [FIX] forgor to add self 2025-09-20 22:03:56 +07:00
homayk228
cc739463ac [TEST] Encryption check moved
Also changed policy on detection: now only one = is need to flag a message to not convert
2025-09-20 22:00:31 +07:00
homayk228
9f2eb2d61b [TEST] sp_char error fix 1 2025-09-20 21:41:07 +07:00
homayk228
ccc2368c45 [TEST] Переработка логики
Перекопана система замены, добавлен больше эффекта случайности, чтобы убрать перебор в заменах.
Исправлена ошибка работы с -ня и мяу~ - больше они не появляются после знаков препинания.
Изменена логика ня-канья - ня распростроняется только на не, но не на его включения.
2025-09-20 21:31:23 +07:00
Souce
aee3dc3282 Merge pull request #1 from SouceCalve/dev
>Chat exclusion func
Added by me, merged by me)
2025-05-21 19:10:49 +07:00
homayk228
d42937dd21 [FIX] string definition in nekospeakin 2025-05-21 18:52:44 +07:00
homayk228
63a32b02a6 [FIX] strings addresing fix 2025-05-21 18:27:39 +07:00
homayk228
6470932b04 [FIX] first try db fix 2025-05-21 18:13:12 +07:00
homayk228
69cd9ed584 [FIX] code wrong moved 2025-05-21 13:55:02 +07:00
homayk228
7a5bcf628b [DEL] deleted buffered file 2025-05-21 13:40:09 +07:00
homayk228
9e88dc8fff [UPD] chat excusion
added chat excusion and inclusion
2025-05-21 13:36:10 +07:00
homayk228
03af5e8716 Revert "[ADD] chat exclusion"
This reverts commit c8e5bf524c.
2025-03-13 09:31:54 +07:00
homayk228
744e054fe1 Revert "[FIX] class fix"
This reverts commit ec3e1f841a.
2025-03-13 09:31:50 +07:00
homayk228
554ecf8ed7 Revert "[FIX] internal db access fix"
This reverts commit 6f86effff5.
2025-03-13 09:31:47 +07:00
homayk228
4e1b5bf89c Revert "[FIX] another db read fix."
This reverts commit 0c3ed45b72.
2025-03-13 09:31:43 +07:00
homayk228
6513185e1a Revert "[FIX] looks like 3rd time."
This reverts commit a7de4ae2af.
2025-03-13 09:31:11 +07:00
homayk228
6acd59a141 Revert "[FIX] Another fix for db access."
This reverts commit 840c2e53bd.
2025-03-13 09:31:05 +07:00

View File

@@ -1,152 +1,199 @@
from hikkatl.types import Message from hikkatl.types import Message
from .. import loader, utils from .. import loader, utils
import random import random
@loader.tds @loader.tds
class NekoSpeakModule(loader.Module): class NekoSpeakModule(loader.Module):
"""Модуль для стилизации речи под неко""" """Модуль для стилизации речи под неко"""
strings = {"name": "NekoSpeak", "converted": "{text}"}
strings_ru = {"converted": "{text}"} strings = {
"name": "NekoSpeak",
"converted": "{text}",
"banned": "Ня~ Чат {} добавлен в черный список.",
"unbanned": "Ня~ Чат {} удален из черного списка.",
"already_banned": "Ня... Этот чат уже в черном списке!",
"not_banned": "Ня... Этот чат не был забанен!",
"no_access": "Ня? У меня нет доступа к этому чату.",
"banned_list": "Список забаненных чатов:\n{}"
}
def __init__(self): def __init__(self):
self.active = False self.active = False
self.pm_enabled = False self.pm_enabled = False
self.public_enabled = False self.public_enabled = False
self.realcatlike = False # Загружаем из БД или создаём новый список
self.exclude_chats = set() self.banned_chats = set()
self.bad_minded = False
async def config_complete(self): async def client_ready(self):
self.exclude_chats = set(self.get("exclude_chats", [])) # Загружаем из БД saved = self.db.get("NekoSpeak", "banned_chats", [])
self.banned_chats = set(saved)
def save_banned_chats(self):
# Сохраняем список забаненных чатов в БД
self.db.set("NekoSpeak", "banned_chats", list(self.banned_chats))
def is_encrypt(self, text):
flag = False
encrypting_count=0
for x in range(1,3):
if("=" in text[-x]):
encrypting_count+=1
if(encrypting_count>=1):
flag = True
return flag
def neko_speak(self, text): def neko_speak(self, text):
# Замена "н" на "ня" в некоторых словах
words = text.split()
new_words = []
for word in words:
if word.lower().startswith("н") and len(word) > 1:
word = "ня" + word[2:]
word=word.replace("р","р"*random.randint(2,4))
new_words.append(word)
text = " ".join(new_words)
# Замена стандартных фраз if(not self.is_encrypt(text)):
replacements = { words = text.split()
"ничего": "нячего", new_words = []
"что?": "ня?", for word in words:
"ура!": "ня!", if word.lower().startswith("н") and len(word) > 2 and (random.random() < 0.05 or self.bad_minded):
"о нет": "о-ня!", word = "ня" + word[2:]
"привет": "мяувет", if random.random() < 0.05 or self.bad_minded:
"Привет": "Мяувет", word = word.replace("р", "р-" * random.randint(2,4)+"р")
"хорошо":"мяу-ряско", word = word.replace("r", "r" * random.randint(2,4)+"r")
"плохо":"мяу-чалька", new_words.append(word)
"пиздец":"мря!", text = " ".join(new_words)
"Пиздец":"Мря!",
"блять":"мяр!",
"Блять":"Мяр!",
"замечательные":"замуррчательные",
"замечательный":"замуррчательный",
"замечательных":"замуррчательных",
"Замечательные":"Замуррчательные",
"Замечательный":"Замуррчательный",
"Замечательных":"Замуррчательных",
"прекрасное":"замурчательное",
"Прекрасное":"Замурчательное",
"прекрасный":"замурчательный",
"Прекрасный":"Замурчательный",
"прекрасная":"замурчательная",
"Прекрасная":"Замурчательная",
"заебись":"замурчательно",
"Заебись":"Замурчательно",
"охуенно":"замурчательно",
"Охуенно":"Замурчательно",
"няхуя":"МРЯВ?! Ньё-ньё!!",
"Няхуя":"МРЯВ?! Ньё-ньё!!",
"няко":"неко",
"Няко":"неко",
"нядо":"надо",
"Нядо":"Надо",
"В рот ебал":"МРЯФФ!!",
"в рот ебал":"МРЯФФ!!",
"ебал":"мряфф!!",
"Ебал":"МРЯФФ!!",
"хуёво":"ньёрфф...",
"Хуёво":"Ньёрфф...",
"пидрилит":"мряк-мрря!",
"Пидрилит":"Мряк-мрря!",
}
for key, value in replacements.items():
text = text.replace(key, value)
# Добавление "мяу" и концовок replacements = {
if random.random() < 0.3: # 30% шанс добавить "мяу" "ничего": "нячего", "что?": "ня?", "ура!": "ня!", "о нет": "о-ня!",
text += " мяу~" "привет": "мяувет", "Привет": "Мяувет", "хорошо":"мяу-ряско",
elif random.random() < 0.2: # 20% шанс добавить "-ня" "плохо":"мяу-чалька", "пиздец":"мря!", "Пиздец":"Мря!",
text += "-ня" "блять":"мяр!", "Блять":"Мяр!", "замечательные":"замуррчательные",
"замечательный":"замуррчательный", "замечательных":"замуррчательных",
"Замечательные":"Замуррчательные", "Замечательный":"Замуррчательный",
"Замечательных":"Замуррчательных", "прекрасное":"замурчательное",
"Прекрасное":"Замурчательное", "прекрасный":"замурчательный",
"Прекрасный":"Замурчательный", "прекрасная":"замурчательная",
"Прекрасная":"Замурчательная", "заебись":"замурчательно",
"Заебись":"Замурчательно", "охуенно":"замурчательно",
"Охуенно":"Замурчательно", "няхуя":"МРЯВ?! Ньё-ньё!!",
"Няхуя":"МРЯВ?! Ньё-ньё!!", "няко":"неко", "Няко":"неко",
"нядо":"надо", "Нядо":"Надо", "В рот ебал":"МРЯФФ!!",
"в рот ебал":"МРЯФФ!!", "ебал":"мряк-мрря!", "Ебал":"МРЯФФ!!",
"хуёво":"ньёрфф...", "Хуёво":"Ньёрфф...", "пидрилит":"мряк-мрря!",
"Пидрилит":"Мряк-мрря!",
}
specialchar = [",",".","<",">","/","''",'""',":",";","{","}","[","]","|","!","@","#","$","%","^","&","?","*","(",")","-","_","+","=","`","~",""]
for key, value in replacements.items():
if(random.random()<0.05 or self.bad_minded):
text = text.replace(key, value)
if random.random() < 0.05 or self.bad_minded:
text += " мяу~"
elif random.random() < 0.05 or self.bad_minded:
if(text[-1:] in specialchar):
text=text[:-1]+"-ня"+text[-1:]
else:
text += "-ня"
return text return text
@loader.command(ru_doc="Стилизовать текст под неко") @loader.command(ru_doc="Стилизовать текст под неко")
async def neko(self, message: Message): async def neko(self, message: Message):
"""Стилизовать текст под неко"""
text = utils.get_args_raw(message) text = utils.get_args_raw(message)
if not text: if not text:
return await utils.answer(message, "Ня? Введи текст!") return await utils.answer(message, "Ня? Введи текст!")
converted_text = self.neko_speak(text) converted_text = self.neko_speak(text)
await utils.answer(message, self.strings("converted").format(text=converted_text)) await utils.answer(message, self.strings("converted").format(text=converted_text))
@loader.command(ru_doc="Включить автоматическое преобразование речи в неко-стиль") @loader.command(ru_doc="Включить автоматическое преобразование речи в неко-стиль")
async def nekospeak(self, message: Message): async def nekospeak(self, message: Message):
"""Включить автоматическое преобразование речи в неко-стиль"""
self.active = True self.active = True
await utils.answer(message, "Ня~ Теперь все твои сообщения будут преобразовываться!") await utils.answer(message, "Ня~ Теперь все твои сообщения будут преобразовываться!")
@loader.command(ru_doc="Отключить автоматическое преобразование речи в неко-стиль") @loader.command(ru_doc="Отключить автоматическое преобразование речи в неко-стиль")
async def nekospeakstop(self, message: Message): async def nekospeakstop(self, message: Message):
"""Отключить автоматическое преобразование речи в неко-стиль"""
self.active = False self.active = False
await utils.answer(message, "Ня... Теперь сообщения не будут изменяться.") await utils.answer(message, "Ня... Теперь сообщения не будут изменяться.")
@loader.command(ru_doc="Переключить преобразование сообщений в ЛС") @loader.command(ru_doc="Переключить преобразование сообщений в ЛС")
async def nekospeakpm(self, message: Message): async def nekospeakpm(self, message: Message):
"""Переключить преобразование сообщений в ЛС"""
self.pm_enabled = not self.pm_enabled self.pm_enabled = not self.pm_enabled
status = "включено" if self.pm_enabled else "выключено" status = "включено" if self.pm_enabled else "выключено"
await utils.answer(message, f"Ня! Преобразование в ЛС теперь {status}.") await utils.answer(message, f"Ня! Преобразование в ЛС теперь {status}.")
@loader.command(ru_doc="Переключить преобразование сообщений в публичных чатах") @loader.command(ru_doc="Переключить преобразование сообщений в публичных чатах")
async def nekospeakpublic(self, message: Message): async def nekospeakpublic(self, message: Message):
"""Переключить преобразование сообщений в публичных чатах"""
self.public_enabled = not self.public_enabled self.public_enabled = not self.public_enabled
status = "включено" if self.public_enabled else "выключено" status = "включено" if self.public_enabled else "выключено"
await utils.answer(message, f"Ня! Преобразование в публичных чатах теперь {status}.") await utils.answer(message, f"Ня! Преобразование в публичных чатах теперь {status}.")
@loader.command(ru_doc="Добавить/удалить чат из исключений для nekospeakpm") @loader.command(ru_doc="Отключает рандом, преобразовывает всё без шансов спастись")
async def nekospeakpmexclude(self, message: Message): async def nekospeakdumb(self, message: Message):
"""Добавить/удалить чат из исключений для nekospeakpm""" self.bad_minded = not self.bad_minded
chat_id = message.chat_id status = "отключён" if self.bad_minded else "включён"
await utils.answer(message, f"Ня! Рандом {status}.")
if chat_id in self.exclude_chats: @loader.command(ru_doc="Заблокировать чат для работы модуля")
self.exclude_chats.remove(chat_id) async def nekospeakex(self, message: Message):
status = "удалён из" args = utils.get_args_raw(message)
else: try:
self.exclude_chats.add(chat_id) chat_id = int(args) if args.isdigit() else None
status = "добавлен в" if not chat_id:
reply = await message.get_reply_message()
if reply:
chat_id = reply.sender_id or reply.chat_id
else:
chat_id = message.chat_id
except Exception:
chat_id = message.chat_id
self.set("exclude_chats", list(self.exclude_chats)) # Сохраняем как список if chat_id in self.banned_chats:
await utils.answer(message, self.strings("already_banned"))
return
await utils.answer(message, f"Чат {status} списка исключений!") self.banned_chats.add(chat_id)
self.save_banned_chats()
await utils.answer(message, self.strings("banned").format(str(chat_id)))
@loader.command(ru_doc="Разблокировать чат")
async def nekospeakin(self, message: Message):
args = utils.get_args_raw(message)
try:
chat_id = int(args) if args.isdigit() else None
if not chat_id:
reply = await message.get_reply_message()
if reply:
chat_id = reply.sender_id or reply.chat_id
else:
chat_id = message.chat_id
except Exception:
chat_id = message.chat_id
if chat_id not in self.banned_chats:
await utils.answer(message, self.strings("not_banned"))
return
self.banned_chats.remove(chat_id)
self.save_banned_chats()
await utils.answer(message, self.strings("unbanned").format(str(chat_id)))
@loader.command(ru_doc="Показать список заблокированных чатов (только в ЛС)")
async def nekospeaklist(self, message: Message):
if not message.is_private:
await utils.answer(message, self.strings("no_access"))
return
if not self.banned_chats:
await utils.answer(message, "Ня... Список забаненных чатов пуст.")
return
banned_list = "\n".join([f"- {chat}" for chat in self.banned_chats])
await utils.answer(message, self.strings("banned_list").format(banned_list))
async def watcher(self, message: Message): async def watcher(self, message: Message):
if not self.active: if not self.active:
return return
chat_id = message.chat_id
if chat_id in self.exclude_chats:
return
if message.out: if message.out:
chat_id = message.chat_id
if chat_id in self.banned_chats:
return
if message.is_private and not self.pm_enabled: if message.is_private and not self.pm_enabled:
return return
if not message.is_private and not self.public_enabled: if not message.is_private and not self.public_enabled: