welcomecenterbot/handlers/messages_routing.py

113 lines
4.2 KiB
Python
Raw Normal View History

2024-06-03 10:27:42 +00:00
import logging
import math
2024-09-27 06:23:55 +00:00
from state.redis import redis
from state.scan import get_average_pattern
2024-01-07 09:19:46 +00:00
from bot.api import telegram_api
from bot.config import FEEDBACK_CHAT_ID
from handlers.handle_private import handle_private
2024-09-27 06:23:55 +00:00
from nlp.toxicity_detector import detector
from nlp.normalize import normalize
2024-06-03 10:27:42 +00:00
2024-09-27 06:23:55 +00:00
logger = logging.getLogger("handlers.messages_routing")
2024-09-27 08:28:41 +00:00
2024-01-07 09:19:46 +00:00
2024-09-27 06:23:55 +00:00
2024-01-07 09:19:46 +00:00
async def messages_routing(msg, state):
cid = msg["chat"]["id"]
uid = msg["from"]["id"]
2024-09-26 18:00:55 +00:00
text = msg.get("text", msg.get("caption"))
2024-09-26 12:50:50 +00:00
reply_msg = msg.get("reply_to_message")
2024-01-07 09:19:46 +00:00
if cid == uid:
# сообщения в личке с ботом
2024-09-26 17:07:55 +00:00
logger.info("private chat message: ", msg)
2024-01-07 09:19:46 +00:00
await handle_private(msg, state)
elif str(cid) == FEEDBACK_CHAT_ID:
# сообщения из группы обратной связи
2024-09-26 17:07:55 +00:00
logger.info("feedback chat message: ", msg)
2024-01-07 09:19:46 +00:00
logger.debug(msg)
if reply_msg:
reply_chat_id = reply_msg.get("chat", {}).get("id")
if reply_chat_id != FEEDBACK_CHAT_ID:
2024-09-27 06:23:55 +00:00
await telegram_api(
"sendMessage",
chat_id=reply_chat_id,
text=text,
reply_to_message_id=reply_msg.get("message_id"),
)
2024-01-07 09:19:46 +00:00
2024-02-12 12:50:35 +00:00
elif bool(text):
2024-09-26 10:07:01 +00:00
mid = msg.get("message_id")
2024-09-27 06:23:55 +00:00
if text == "/toxic@welcomecenter_bot":
2024-09-26 19:42:21 +00:00
# latest in chat
2024-09-26 15:48:41 +00:00
latest_toxic_message_id = await redis.get(f"toxic:{cid}")
2024-09-26 19:42:21 +00:00
# reply_to message_id
reply_to_msg_id = mid
2024-09-26 17:17:42 +00:00
if reply_msg:
2024-09-26 19:42:21 +00:00
reply_to_msg_id = reply_msg.get("message_id")
if not reply_to_msg_id and latest_toxic_message_id:
reply_to_msg_id = int(latest_toxic_message_id)
# count average between all of messages
2024-09-27 06:03:34 +00:00
toxic_pattern = f"toxic:{cid}:{uid}:*"
toxic_score = await get_average_pattern(toxic_pattern)
2024-09-26 19:42:21 +00:00
2024-09-27 06:03:34 +00:00
# current mesasage toxicity
2024-09-26 19:42:21 +00:00
if reply_to_msg_id:
one_score = await redis.get(f"toxic:{cid}:{uid}:{reply_to_msg_id}")
2024-09-26 17:49:31 +00:00
if one_score:
2024-09-26 17:52:09 +00:00
logger.debug(one_score)
2024-09-27 06:23:55 +00:00
emoji = (
"😳"
if toxic_score > 90
else "😟"
if toxic_score > 80
else "😏"
if toxic_score > 60
else "🙂"
if toxic_score > 20
else "😇"
)
2024-09-26 17:55:47 +00:00
text = f"{int(one_score)}% токсичности\nСредняя токсичность сообщений: {toxic_score}% {emoji}"
2024-09-26 17:17:42 +00:00
await telegram_api(
"sendMessage",
chat_id=cid,
2024-09-26 19:42:21 +00:00
reply_to_message_id=reply_to_msg_id,
2024-09-27 06:23:55 +00:00
text=text,
2024-09-26 17:17:42 +00:00
)
2024-09-27 10:13:23 +00:00
try:
await telegram_api("deleteMessage", chat_id=cid, message_id=mid)
except:
pass
2024-09-27 06:23:55 +00:00
elif text == "/removed@welcomecenter_bot":
2024-09-27 10:13:23 +00:00
try:
await telegram_api("deleteMessage", chat_id=cid, message_id=mid)
except:
pass
2024-09-26 12:38:14 +00:00
else:
2024-09-26 18:36:14 +00:00
toxic_score = detector(normalize(text))
2024-09-27 06:23:55 +00:00
toxic_perc = math.floor(toxic_score * 100)
2024-09-26 13:28:29 +00:00
await redis.set(f"toxic:{cid}", mid)
2024-09-27 06:23:55 +00:00
await redis.set(f"toxic:{cid}:{uid}:{mid}", toxic_perc, ex=60 * 60 * 24 * 3)
logger.info(f"\ntext: {text}\ntoxic: {toxic_perc}%")
2024-09-26 12:38:14 +00:00
if toxic_score > 0.81:
if toxic_score > 0.90:
await redis.set(f"removed:{uid}:{cid}:{mid}", text)
2024-09-27 10:13:23 +00:00
try:
await telegram_api("deleteMessage", chat_id=cid, message_id=mid)
except:
pass
2024-09-26 12:38:14 +00:00
else:
await telegram_api(
"setMessageReaction",
chat_id=cid,
is_big=True,
message_id=mid,
2024-09-27 06:23:55 +00:00
reaction='[{"type":"emoji", "emoji":"🙉"}]',
2024-09-26 12:38:14 +00:00
)
2024-02-12 12:50:35 +00:00
2024-01-07 09:19:46 +00:00
else:
pass