@ -1,8 +1,10 @@
from telethon import TelegramClient , events
from telethon import functions, types
from telethon import types
from datetime import timedelta
from db import DBAction , db_action , create_table
import aiosqlite
from df_utils import detect_intent_text
import random
@ -11,29 +13,12 @@ import asyncio
import os
from dotenv import load_dotenv
load_dotenv ( )
bot = TelegramClient ( os . environ [ ' SESSION_NAME ' ] , int ( os . environ [ ' API_ID ' ] ) ,
os . environ [ ' API_HASH ' ] ) . start ( bot_token = os . environ [ ' BOT_TOKEN ' ] )
async def check_admin ( msg ) :
""" Checks if a user is an admin in the chat """
return any ( [ user . id == msg . sender_id async for user in bot . iter_participants ( msg . chat_id ,
filter = types . ChannelParticipantsAdmins ) ] )
@bot . on ( events . NewMessage ( ) )
async def on_message ( msg ) :
""" Handle DM and add chat id to database if not exists """
if msg . is_private :
await msg . respond ( ' Я не работаю в личных сообщениях. Добавь меня в группу, для начала работы ' )
raise events . StopPropagation
chats = await db_action ( ' SELECT chat_id FROM chats ' , ( ) , DBAction . fetchall )
if not any ( [ msg . chat_id == chat [ 0 ] for chat in chats ] ) :
await db_action ( ' INSERT INTO chats (chat_id) VALUES (?) ' , ( msg . chat_id , ) , DBAction . commit )
@bot . on ( events . NewMessage ( pattern = ' /help ' ) )
async def on_help ( msg ) :
""" Send detailed help message """
@ -41,10 +26,34 @@ async def on_help(msg):
' /help - помощь \n '
' /bs [add/rm] <id стикерапка> - запретить, разрешить стикерпак в группе, можно написать в ответ на стикер из нужного стикерпака \n '
' /exc [add/rm] [id пользователя/@упомянуть пользователя/ " me " ] - сделать пользователя неприкасаемым для бота, можно написать в ответ на любое сообщение нужного пользователя \n '
' /report в ответ на сообщение бота отправляет отчет о б ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя' )
' /report в ответ на сообщение , отправляет отчет о б ошибке распознавания запрещенных слов разработчику, если отправил администратор, размучивает пользователя' )
raise events . StopPropagation
@bot . on ( events . NewMessage ( ) )
async def check_dm ( msg ) :
if msg . is_private :
await msg . reply ( ' Привет!, я не работаю в личных сообщениях. Добавь меня в группу и мы будем избавляться от вагонов вместе! ' )
raise events . StopPropagation
async def check_admin ( msg ) :
""" Checks if a user is an admin in the chat """
return any ( [ user . id == msg . sender_id async for user in bot . iter_participants ( msg . chat_id ,
filter = types . ChannelParticipantsAdmins ) ] )
@bot . on ( events . NewMessage ( pattern = ' /report ' ) )
async def on_report ( msg ) :
""" Send detection error report """
if msg . is_reply :
reply_message = await msg . get_reply_message ( )
await bot . edit_permissions ( msg . chat_id , reply_message . sender_id , send_messages = True )
await bot . send_message ( msg . chat_id , ' пользователь размучен. ' )
else :
await msg . reply ( ' Ответь командой на сообщение, которое было неправильно распознано, чтобы отправить отчет о б ошибке и размутить пользователя ' )
async def check_user_in_exceptions ( user_id , chat_id ) :
""" Checks if a user is in the exceptions list """
return await db_action ( ' SELECT id FROM user_exceptions WHERE user_id = ? AND chat_id = ? ' , ( user_id , chat_id ) ,
@ -133,7 +142,7 @@ async def manage_stickerpack(msg):
elif msg . is_reply and len ( args ) > 1 :
reply_message = await msg . get_reply_message ( )
if not reply_message . sticker :
await msg . reply ( ' Ответь сообщением с командой именно на стикер, не на медиафайл или текст' )
await msg . reply ( ' Ответь те сообщением с командой именно на стикер, не на медиафайл или текст' )
raise events . StopPropagation
for attr in reply_message . media . document . attributes :
@ -141,7 +150,7 @@ async def manage_stickerpack(msg):
stickerpack_id = attr . stickerset . id
break
else :
await msg . reply ( ' Неверный синтаксис ю Вы можете использовать: /bs [add/rm] [stickerpack_id], или ответить сообщением с командой на стикер' )
await msg . reply ( ' Неверный синтаксис . Вы можете использовать: /bs [add/rm] [stickerpack_id] или ответить сообщением с командой на стикер' )
raise events . StopPropagation
match args [ 1 ] :
@ -172,26 +181,31 @@ async def process_message(msg):
""" if await check_admin(msg) or await check_user_in_exceptions(msg.sender_id, msg.chat_id):
return """
if msg . message :
resp = await detect_intent_text ( os . environ [ ' GOOGLE_PROJECT_ID ' ] , msg . chat_id , msg . raw_text , os . environ [ ' GOOGLE_MODEL_LANGUAGE ' ] )
if msg . text :
resp = await detect_intent_text ( os . environ [ ' GOOGLE_PROJECT_ID ' ] , msg . chat_id , msg . raw_text ,
os . environ [ ' GOOGLE_MODEL_LANGUAGE ' ] )
if resp :
await msg . reply ( resp )
await bot . edit_permissions ( msg . chat_id , msg . sender_id , timedelta ( minutes = 5 ) , send_messages = False )
await msg . reply ( random . choice ( [ ' Х а р е уже свои вагоны слать' ,
' Вагончиками балуемся? ' ,
' Вагоны тут не приветствуются ' ,
' Надоел уже с о своими вагонами ' ] ) )
await msg . respond ( ' Бот работает в режиме обучения, напишите /report в ответ на сообщение, если оно не было распознано или распознано по ошибке ' )
await bot . edit_permissions ( msg . chat_id , msg . sender_id , timedelta ( minutes = 10 ) , send_messages = False )
raise events . StopPropagation
if msg . sticker :
banstickerpacks = [ stickerpack [ 0 ] for stickerpack in await db_action ( ' SELECT pack_id FROM banned_stickerpacks WHERE chat_id = ? ' ,
( msg . chat_id , ) , DBAction . fetchall ) ]
if any ( [ x . stickerset . id in banstickerpacks for x in msg . sticker . attributes if isinstance ( x , types . DocumentAttributeSticker ) ] ) :
await bot . edit_permissions ( msg . chat_id , msg . sender_id , timedelta ( minutes = 10 ) , send_messages = False )
await msg . reply ( random . choice ( [ ' Ай-ай-ай, стикеры с вагончиками, не хорошо ' ,
' Стикерами с вагонами балуемся? Негоже так делать ' ,
' Надоел уже с о своими вагонами ' ,
' Щас высажу с поезда, будете тут бегать и про номерные свои кричать! ' ] ) )
await bot . edit_permissions ( msg . chat_id , msg . sender_id , timedelta ( minutes = 5 ) , send_messages = False )
' Щас высажу с поезда, будете тут про номерные свои кричать! ' ] ) )
async def main ( ) :
load_dotenv ( )
await create_table ( )
await bot . run_until_disconnected ( )