import logging, random, pymorphy2, requests
import asyncio, emoji, base, re, os

from gtts import gTTS
from sql import SQLighter
from datetime import datetime
from script import cheker, translator, notice, lang_form, times, autozak, update_stat, revers
from aiogram import Bot, Dispatcher, executor, types

# log level
logging.basicConfig(level=logging.INFO)

# bot init
bot = Bot(token=base.TOKEN)
dp = Dispatcher(bot)
morph = pymorphy2.MorphAnalyzer()

# инициализируем соединение с БД
db = SQLighter('groups.db')


# events
@dp.message_handler(content_types=["new_chat_members"])
async def notification(message: types.Message):
    if not db.group_exists(message.chat.id):
        db.add_group(message.chat.id)
        db.add_month_group(message.chat.id)
        db.created_group(message.chat.id)
        await bot.send_message(message.chat.id, f'ID <b>[ {message.chat.id} ]</b>\n\nДля того, чтобы уведомления по '
                                                f'имени и команда /all нормально функционировали, необходимо чтобы '
                                                f'каждый участник группы написал хотя бы одно сообщение в чат! Также '
                                                f'для того, чтобы системные сообщения удалялись автоматически, '
                                                f'необходимо боту выдать права администратора!', types.ParseMode.HTML)
    else:
        try:
            await message.delete()
        except Exception:
            print(f'{message.chat.title} >>> НЕ УДАЛОСЬ УДАЛИТЬ СООБЩЕНИЕ')


@dp.message_handler(commands=['start'])
async def helps(message: types.Message):
    if message.chat.id > 0:
        id_group, user = message.chat.id, message.from_user.id
        name_db = re.sub(r'[^\w\s]', '', message.from_user.first_name.lower())
        try:
            if not db.user_exists(user, id_group):
                db.add_user(user, name_db, id_group)
            else:
                if user in db.get_users(id_group):
                    db.update_name(user, name_db, id_group)
        except Exception as e:
            await message.answer("Вы запустили бота в личном чате! Для работы в группе или в общем чате нечего делать "
                                 "не надо, лишь добавить в чат и выдать права на удаление сообщений в чате!\n\n- Для "
                                 "введения в обширный функционал бота можете воспользоваться командой /help!")
            db.add_group(id_group)
            db.add_month_group(id_group)
            db.created_group(id_group)
            db.add_user(user, name_db, id_group)
    else:
        return


@dp.message_handler(commands=['help'])
async def helps(message: types.Message):
    update_stat(3, message, True)

    buttons = [types.InlineKeyboardButton(text="КОМАНДЫ", callback_data="com"),
               types.InlineKeyboardButton(text="ИВЕНТЫ", callback_data="even"),
               types.InlineKeyboardButton(text="ОШИБКИ", callback_data="err"),
               types.InlineKeyboardButton(text="АВТОР", callback_data="auth"),
               types.InlineKeyboardButton(text="ФУНКЦИИ", callback_data="fun")]
    
    keyboard = types.InlineKeyboardMarkup(row_width=2)
    keyboard.add(*buttons)

    await bot.send_voice(chat_id=message.chat.id, voice=open('data/tts.ogg', 'rb'),
                         caption='*-* Этот АБОБОТ поможет вам приятно провести время в чате с различными командами, '
                                 'ивентами и удобными функциями, которые облегчают использование чата)\n\n'
                                 '*-* Также прошу если вам понравился бот, оставить отзыв о его использовании на '
                                 'команду /report)', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard)


# ИЛАЙН КЛАВИАТУРА HELP
@dp.callback_query_handler(text="err")
async def error(call: types.CallbackQuery):
    await call.message.answer(text='*| ОШИБКИ |*\n\n*-* Так как бот разрабатывается одним человеком, все баги и '
                                   'недочёты програмы выявить сразу очень трудно, поэтому я буду признателен вам если '
                                   'о найденых ошибка вы сообщите по команде /report\n\n*>* Отправить в формате '
                                   '*[ /report {сообщение} ]*', parse_mode=types.ParseMode.MARKDOWN)


@dp.callback_query_handler(text="auth")
async def function(call: types.CallbackQuery):
    await call.message.answer(text='*| АВТОР |*\n\n*>>* Официальный телеграмм канал автора *@govnacoder*\n\n*-* Я '
                                   'практикуюсь в програмировании разрабатывая ботов и простенькие приложения, если '
                                   'интерестно ознокомиться с моими работами, то переходити ко мне в телеграм канал!',
                              parse_mode=types.ParseMode.MARKDOWN)


@dp.callback_query_handler(text="fun")
async def function(call: types.CallbackQuery):
    await call.message.answer(text='*| ФУНКЦИИ |*\n\n*1.* Возможность перевода случайно написанного текста на '
                                   'транслите\n*2.* Ведение обширной статистики сообщений\n*3.* Упоминание участника '
                                   'при написании его имени в чате\n*4.* Автоматическое удаление системных сообщений',
                              parse_mode=types.ParseMode.MARKDOWN)


@dp.callback_query_handler(text="com")
async def commands(call: types.CallbackQuery):
    await call.message.answer(text='<b>| КОМАНДЫ |</b>\n\n/all - упомянуть всех в чате\n/vote - напишите в начале '
                                   'сообщения и создасться простой опрос (Да / Нет)\n/report - жалобы и '
                                   'предложения\n/help - полный список функций\n/statistic_group - полная статистика '
                                   'группы\n/statistic_user - полная статистика отправителя\n/srednya_statistic - '
                                   'средняя статистика группы\n/edit и /back_edit - первая команда даёт возможность '
                                   'сменить имя для упоминаний на любое слово, а вторая для возврата динамического '
                                   'имени\n/start_bot и /stop_bot - возможность отключения текстовых ивентов\n/like '
                                   'и /dislike - даёт возможность оценить то или иное сообщение пользователя',
                              parse_mode=types.ParseMode.HTML)


@dp.callback_query_handler(text="even")
async def events(call: types.CallbackQuery):
    await call.message.answer(text='*| ИВЕНТЫ |*\n\n*"Чмокнуть"* - сделать кому-нибудь приятно\n*"Отмудохать"* - '
                                   'выместить злость на кого-нибудь\n*"Число от ... до ..."* - случайное значение из '
                                   'диапозона\n*"Подраться с ..."* - повод кого-нибудь побить\n*"Переведи (..) - ..."* '
                                   '- перевод слова на керпичный язык\n*"Дай блять совет!"* - даёт рандомный охуенный '
                                   'совет\n*"Переверни - ..."* - переворачивает слова в предложении\n*"Озвучь - ..."* '
                                   '- озвучивает написанный текст',
                              parse_mode=types.ParseMode.MARKDOWN)


# ОСТАЛЬНЫЕ КОМАНДЫ
@dp.message_handler(commands=['all'], commands_prefix='@/')
async def always(message: types.Message):
    update_stat(3, message, True)
    try:
        await message.reply(notice(message.from_user.first_name, True, message.chat.id, message.from_user.id),
                            types.ParseMode.HTML)
    except Exception:
        await message.reply('В группе состоит менее 3х человек, из-за чего команда не работает!')


@dp.message_handler(commands=['report'])
async def answer(message: types.Message):
    update_stat(3, message, True)
    if len(message.text.split()) > 1:
        await bot.send_message(chat_id='-1001510980656',
                               text=f'{message.chat.title} >> '
                                    f'[{message.from_user.first_name}](tg://user?id={message.from_user.id}) '
                                    f'> {message.text}', parse_mode=types.ParseMode.MARKDOWN)
        await message.answer("Ваше сообщение передано администратору)")
    else:
        await message.answer("Заполнять обращение к администратору надо по форме */report { жалоба или предложение }*",
                             types.ParseMode.MARKDOWN)


@dp.message_handler(commands=['statistic_group'])
async def stat(message: types.Message):
    update_stat(3, message, True)
    group = db.stat_element_group(message.chat.id)
    month = db.stat_element_month_group(message.chat.id)

    try:
        await message.answer(text=f'*| СТАТИСТИКА ГРУППЫ |*\n\n*>>* В целом сообщений *[ {message.message_id} ]*\n*>>* '
                                  f'Сообщений в базе *[ {group[0]} ]*\n*>>* Среднее количество сообщений в месяц - *[ '
                                  f'{month[0] // group[8]} ]*\n\n*👍* Лайков *[ {group[10]} ]* / *👎* Дизлайков *[ '
                                  f'{group[9]} ]*\n\n*>* Команд *[ {group[2]} ]*\n*>* Ссылок *[ '
                                  f'{group[3]} ]*\n*>* Стикеров *[ {group[6]} ]*\n*>* Тик-токов *[ {group[4]} ]*\n*>* Медиа'
                                  f' файлов *[ {group[5]} ]*\n*>* Ответов на сообщения *[ {group[1]} ]*\n*>* Голос / Видео '
                                  f'сообщений *[ {group[7]} ]*', parse_mode=types.ParseMode.MARKDOWN)
    except Exception:
        await message.answer(text=f'*| СТАТИСТИКА ГРУППЫ |*\n\n*>>* В целом сообщений *[ {message.message_id} ]*\n*>>* '
                                  f'Сообщений в базе *[ {group[0]} ]*\n\n*👍* Лайков *[ {group[10]} ]* / *👎* Дизлайков *[ '
                                  f'{group[9]} ]*\n\n*>* Команд *[ {group[2]} ]*\n*>* Ссылок *[ '
                                  f'{group[3]} ]*\n*>* Стикеров *[ {group[6]} ]*\n*>* Тик-токов *[ {group[4]} ]*\n*>* Медиа'
                                  f' файлов *[ {group[5]} ]*\n*>* Ответов на сообщения *[ {group[1]} ]*\n*>* Голос / Видео '
                                  f'сообщений *[ {group[7]} ]*', parse_mode=types.ParseMode.MARKDOWN)


@dp.message_handler(commands=['statistic_user'])
async def stat(message: types.Message):
    update_stat(3, message, True)
    user = db.stat_element_user(message.from_user.id, message.chat.id)
    try:
        name = morph.parse(db.get_name_user(message.from_user.id, message.chat.id))[0]
        name = name.inflect({"gent"}).word.upper()
    except Exception:
        name = message.from_user.first_name.lower().upper()

    try:
        err = 1 // user[8]
        await message.answer(text=f'*| СТАТИСТИКА {name} |*\n\n*>>* Всего сообщений *[ '
                                  f'{user[0]} ]*\n*>>* Среднее количество сообщений в месяц - *[ {user[0] // user[8]} '
                                  f']*\n\n*👍* Лайков *[ {user[10]} ]* / *👎* Дизлайков *[ {user[9]} ]*\n\n*>* Команд *[ '
                                  f'{user[2]} ]*\n*>* Ссылок *[ {user[3]} ]*\n*>* Стикеров '
                                  f'*[ {user[6]} ]*\n*>* Тик-токов *[ {user[4]} ]*\n*>* Медиа файлов *[ {user[5]} ]*\n*>* '
                                  f'Ответов на сообщения *[ {user[1]} ]*\n*>* Голос / Видео сообщений *[ {user[7]} ]*',
                             parse_mode=types.ParseMode.MARKDOWN)
    except Exception:
        await message.answer(text=f'*| СТАТИСТИКА {name} |*\n\n*>>* Всего сообщений *[ '
                                  f'{user[0]} ]*\n\n*👍* Лайков *[ {user[10]} ]* / *👎* Дизлайков *[ {user[9]} ]*\n\n*>* '
                                  f'Команд *[ {user[2]} ]*\n*>* Ссылок *[ {user[3]} ]*\n*>* Стикеров '
                                  f'*[ {user[6]} ]*\n*>* Тик-токов *[ {user[4]} ]*\n*>* Медиа файлов *[ {user[5]} ]*\n*>* '
                                  f'Ответов на сообщения *[ {user[1]} ]*\n*>* Голос / Видео сообщений *[ {user[7]} ]*',
                             parse_mode=types.ParseMode.MARKDOWN)


@dp.message_handler(commands=['srednya_statistic'])
async def stat(message: types.Message):
    update_stat(3, message, True)
    timer = db.stat_element_group(message.chat.id)[8]
    month = db.stat_element_month_group(message.chat.id)

    try:
	    if timer != 0:
	        await message.answer(text=f'*| СРЕДНЯЯ СТАТИСТИКА ГРУППЫ |*\n\n*>>* Среднее количество сообщений в месяц - '
	                                  f'*[ {month[0] // timer} ]*\n\n*👍* Лайков *[ {month[9] // timer} ]* / *👎* Дизлайков *[ {month[8] // timer} '
	                                  f']*\n\n*>* Команд *[ {month[2] // timer} ]*\n*>* Ссылок *[ {month[3] // timer} ]*\n*>* Стикеров '
	                                  f'*[ {month[6] // timer} ]*\n*>* Тик-токов *[ {month[4] // timer} ]*\n*>* Медиа файлов *[ {month[5] // timer} ]*\n*>* '
	                                  f'Ответов на сообщения *[ {month[1] // timer} ]*\n*>* Голос / Видео сообщений *[ {month[7] // timer} ]*',
	                             parse_mode=types.ParseMode.MARKDOWN)
	    else:
	        await message.reply('Статистика не может быть показана, так как с момента добавления бота прошло менее месяца!')
    except Exception:
        await message.reply('Вывод стаистики произвёл ошибку, вероятнее всего в вашем чате были использованы не все виды сообщений!')


# ЕЖЕМЕСЕЧНОЕ УВЕДОМЛЕНИЕ
async def time(wait_for):
    while True:
        await asyncio.sleep(wait_for)

        file = open('month.txt', 'r')
        data = file.readline()
        file.close()

        month = datetime.now().date().month
        day = datetime.now().date().day
        if int(data) != int(month):
            for group in db.all_id_group_lst():
                last = db.month_stat_group(group)
                await bot.send_message(chat_id=group,
                                       text=f'*| СТАТИСТИКА ГРУППЫ ЗА ПРОШЕДШИЙ МЕСЯЦ |*\n\n*>>* В целом сообщений *[ '
                                            f'{last[0]} ]*\n\n*👍* Лайков *[ {last[9]} ]* / *👎* Дизлайков *[ '
                                            f'{last[8]} ]*\n\n*>* Команд *[ {last[2]} ]*\n*>* Ссылок *[ {last[3]} '
                                            f']*\n*>* Стикеров *[ {last[6]} ]*\n*>* Тик-токов *[ {last[4]} ]*\n*>* '
                                            f'Медиа файлов *[ {last[5]} ]*\n*>* Ответов на сообщения *[ {last[1]} '
                                            f']*\n*>* Голос / Видео сообщений *[ {last[7]} ]*',
                                       parse_mode=types.ParseMode.MARKDOWN)
                db.statistics_group(group, 0)
                for user in db.id_lst(group):
                    db.user_statistic(user, group, 0)
                    
            file = open('month.txt', 'w')
            file.write(str(month))
            file.close()
        elif (month == 6) and (day == 28):
            for group in db.all_id_group_lst():
                await bot.send_message(chat_id=group,
                                       text=f'Уряяя! У меня сегодня день рождения!',
                                       parse_mode=types.ParseMode.MARKDOWN)


@dp.message_handler(commands=['like'])
async def like(message: types.Message):
    update_stat(3, message, True)
    if message.reply_to_message:
        update_stat(2, message)
        love = (message.reply_to_message.from_user.id == message.from_user.id)
        try:
            comm = (message.reply_to_message.text[0] == '/')
        except Exception:
            comm = False
        if love is False and comm is False:
            db.statistics_group(message.chat.id, 10)
            db.user_statistic(message.reply_to_message.from_user.id, message.chat.id, 10)
            try:
                await message.delete()
            except Exception:
                pass
            await bot.send_message(chat_id=message.chat.id, text=emoji.emojize(':thumbs_up:'),
                                   reply_to_message_id=message.reply_to_message.message_id)

        else:
            if love:
                await message.answer('Ай-яй-яй! За себя голосовать не хорошо!')
            elif comm:
                await message.answer('Оценивать команду не рационально!')
    else:
        await message.answer('Команда должна быть ответом на сообщение пользователя!')


@dp.message_handler(commands=['dislike'])
async def dislike(message: types.Message):
    update_stat(3, message, True)
    if message.reply_to_message:
        update_stat(2, message)
        love = (message.reply_to_message.from_user.id == message.from_user.id)
        try:
            comm = (message.reply_to_message.text[0] == '/')
        except Exception:
            comm = False
        if love is False and comm is False:
            db.statistics_group(message.chat.id, 9)
            print(">>", message.from_user.first_name, datetime.now())
            db.user_statistic(message.reply_to_message.from_user.id, message.chat.id, 9)
            try:
                await message.delete()
            except Exception:
                pass
            await bot.send_message(chat_id=message.chat.id, text=emoji.emojize(':thumbs_down:'),
                                   reply_to_message_id=message.reply_to_message.message_id)

        else:
            if love:
                await message.answer('Ай-яй-яй! За себя голосовать не хорошо!')
            elif comm:
                await message.answer('Оценивать команду не рационально!')
    else:
        await message.answer('Команда должна быть ответом на сообщение пользователя!')


@dp.message_handler(commands=['edit'])
async def update(message: types.Message):
    update_stat(3, message, True)
    text_edit = re.sub(r'[^\w\s]', '', message.text.lower()).split()
    if len(text_edit) == 2:
        norm = morph.parse(text_edit[1])[0].normal_form
        db.edit_name(message.from_user.id, norm, message.chat.id, 1)
        name_edit = db.name_lst(message.chat.id)[db.id_lst(message.chat.id).index(str(message.from_user.id))]
        await message.reply(f'{name_edit.title()}, ваше имя было успешно изменено)')
    else:
        await message.reply(f'Вы не правильно ввели имя! Имя должно быть из одного слова и идти сразу после команды!')


@dp.message_handler(commands=['back_edit'])
async def update_return(message: types.Message):
    update_stat(3, message, True)
    text_name = re.sub(r'[^\w\s]', '', message.from_user.first_name.lower())
    db.edit_name(message.from_user.id, text_name, message.chat.id, 0)
    await message.reply(f'{text_name.title()}, вы успешно вернулись к динамическому изменению имени)')


@dp.message_handler(commands=['vote'])
async def voting(message: types.Message):
    update_stat(3, message, True)
    await bot.send_poll(chat_id=message.chat.id, question="Итак, что вы выберите?",
                        options=['Да', 'Нет'], is_anonymous=False, open_period=600,
                        reply_to_message_id=message.message_id)


@dp.message_handler(commands=['start_bot'])
async def opening(message: types.Message):
    update_stat(3, message, True)
    if not db.group_exists(message.chat.id):
        db.add_group(message.chat.id)
        await message.answer(
            "Ваша группа изменила свой статус, из-за чего данные о пользователях были стёрты, "
            "вам надо снова отправить хотя бы по одному сообщению от каждого пользователя! Текстовые ивенты включены!")
    else:
        for group in db.get_group():
            if str(group[1]) == str(message.chat.id):
                await message.answer("У вас уже включены текстовые ивенты!")
                break
        else:
            db.update_status_group(message.chat.id, True)
            await message.answer("Текстовые ивенты включены!")


@dp.message_handler(commands=['stop_bot'])
async def closing(message: types.Message):
    update_stat(3, message, True)
    if not db.group_exists(message.chat.id):
        db.add_group(message.chat.id, False)
        await message.answer(
            "Ваша группа изменила свой статус, из-за чего данные о пользователях были стёрты, "
            "вам надо снова отправить хотя бы по одному сообщению от каждого пользователя! Текстовые ивенты отключены!")
    else:
        for group in db.get_group():
            if str(group[1]) == str(message.chat.id):
                db.update_status_group(message.chat.id, False)
                await message.answer("Текстовые ивенты отключены!")
                break
        else:
            await message.answer("У вас уже отключены текстовые ивенты!")


# ФИКСАЦИЯ СТАТИСТИКИ СООБЩЕНИЙ
@dp.message_handler(
    content_types=["migrate_to_chat_id", "migrate_from_chat_id", "new_chat_title", "new_chat_photo", "pinned_message", 
                   "voice_chat_scheduled", "voice_chat_started", "voice_chat_ended", "voice_chat_participants_invited",
                   "left_chat_member"])
async def chat_events(message: types.Message):
    try:
        await message.delete()
    except Exception:
        print(f'{message.chat.title} >>> НЕ УДАЛОСЬ УДАЛИТЬ СООБЩЕНИЕ')


# СТАТИСТИКА
@dp.message_handler(content_types=['location', 'contact', 'video', 'photo', 'audio', 'document'])
async def media(message: types.Message):
    update_stat(6, message, True)


@dp.message_handler(content_types=['voice', 'video_note'])
async def mms(message: types.Message):
    update_stat(8, message, True)


@dp.message_handler(content_types=['sticker'])
async def stick(message: types.Message):
    update_stat(7, message, True)


# ТЕКСТОВЫЕ ИВЕНТЫ
@dp.message_handler(content_types=['text'])
async def send_events(message: types.Message):
    id_group, name_group, user = message.chat.id, message.chat.title, message.from_user.id
    name_db = re.sub(r'[^\w\s]', '', message.from_user.first_name.lower())
    txt = message.text.lower()     # СООБЩЕНИЕ В НИЖНЕМ РЕГИСТРЕ
    bk = [i for i in txt]          # СПИСОК СИМВОЛОВ СООБЩЕНИЯ

    # ПРОВЕРКА ПОЛЬЗОВАТЕЛЯ
    try:
        if not db.user_exists(user, id_group):
            db.add_user(user, name_db, id_group)
        else:
            if user in db.get_users(id_group):
                db.update_name(user, name_db, id_group)
    except Exception as e:
        await message.answer(f'<b>Ваша группа [ {name_group} ] изменила свой статус на супергруппу! '
                             f'Из-за этого, список участников был стёрт, и вам необходимо заново отослать '
                             f'хотя бы одно сообщение, для коректного упоминания!</b>', types.ParseMode.HTML)
        db.add_group(id_group)
        db.add_month_group(id_group)
        db.created_group(id_group)
        db.add_user(user, name_db, id_group)

    # ОБНОВЛЕНИЕ КОЛ-ВО СООБЩЕНИЙ
    update_stat(1, message)

    # ОБНОВЛЕНИЕ КОЛ-ВО КОМАНД
    if len(message.text) > 1 and message.text[0] == '/':
        update_stat(3, message)

    # ОБНОВЛЕНИЕ КОЛ-ВО ОТВЕТОВ НА СООБЩЕНИЯ
    try:
        if int(message.reply_to_message.message_id) > 1:
            update_stat(2, message)
    except Exception:
        pass

    # ИВЕНТЫ
    if str(message.chat.id) in db.id_group_lst():

        # ПЕРЕМЕННЫЕ
        original = message.text.split()                                 # СПИСОК СЛОВ В СООБЩЕНИИ
        no_pct = re.sub(r'[^\w\s]', '', txt)                            # СООБЩЕНИЕ БЕЗ ПУНКТУАЦИИ
        norm = [morph.parse(i)[0].normal_form for i in no_pct.split()]  # СПИСОК СЛОВ В ПЕРВОЙ ФОРМЕ
        names = [_ for _ in norm if _ in db.name_lst(message.chat.id)]  # СПИСОК ИМЕН В СООБЩЕНИИ

        # ПОЛЕЗНЫЕ ФУНКЦИИ
        if len(original) == 5 and "число от" in txt:
            await message.answer(text=f"Число <b>[ {random.randint(int(txt.split()[2]), int(txt.split()[4]))} ]</b>",
                                 parse_mode=types.ParseMode.HTML)
            return

        if len(original) > 1 and no_pct.split()[0] == 'переведи':
            if "переведи - " in txt:
                await message.answer(lang_form([original[_] for _ in range(len(original)) if _ > 1]))
            elif f"переведи ({no_pct.split()[1]}) - " in txt:
                if len(no_pct.split()[1]) == 1:
                    await message.answer(lang_form([original[_] for _ in range(len(original)) if _ > 2],
                                                   no_pct.split()[1]))
            return

        if len(original) > 1 and no_pct.split()[0] == 'переверни':
            if "переверни - " in txt:
                await message.answer(revers(message.text[12:], True))
            elif "переверни полностью - " in txt:
                await message.answer(revers(message.text[22:], False))
            return

        if len(original) > 1 and no_pct.split()[0] == 'озвучь' and "озвучь - " in txt:
            text_to_voice = message.text[9:]
            tts = gTTS(text_to_voice, lang='ru')
            tts.save('voice.ogg')
            await bot.send_voice(chat_id=message.chat.id, voice=open('voice.ogg', 'rb'), 
                                 caption=f"<b>{text_to_voice}</b>", parse_mode=types.ParseMode.HTML)
            os.remove("voice.ogg")

        # РАНДОМ ИВЕНТЫ
        if len(original) >= 2:
            if "подраться с" in txt:
                text = " ".join([original[i] for i in range(len(original)) if i > 1])

                if random.randint(0, 1) == 0:
                    await message.bot.send_photo(chat_id=id_group,
                                                 photo=open(f"data/fight/({random.randint(1, 8)}).jpg", 'rb'),
                                                 caption=f"{message.from_user.first_name} ты был унижен {text.title()}"
                                                         f" с помощью {base.VAR_LOSE[random.randint(0, 3)]}")
                else:
                    await message.bot.send_photo(chat_id=id_group,
                                                 photo=open(f"data/fight/({random.randint(1, 8)}).jpg", 'rb'),
                                                 caption=f"{message.from_user.first_name} ты победил в драке "
                                                         f"с {text.title()}, {base.VAR_WIN[random.randint(0, 1)]}")

        # ИВЕНТ ВЗАИМОДЕЙСТВИЯ
        if len(original) >= 2:
            if "путин" not in txt:
                for word in base.TMOK_LIST:
                    if word in txt:
                        lst = [original[i] for i in range(len(original)) if i != 0]
                        text = " ".join(lst)

                        slv = morph.parse(original[0].lower())[0]

                        await message.bot.send_photo(chat_id=id_group,
                                                     photo=open(f"data/tmok/({random.randint(1, 4)}).jpg", 'rb'),
                                                     caption=f"{message.from_user.first_name} "
                                                             f"{slv.inflect({'past', 'sing', 'indc'}).word} {text}")

                for word in base.KILL_LIST:
                    if word in txt:
                        lst = [original[i] for i in range(len(original)) if i != 0]
                        text = " ".join(lst)

                        slv = morph.parse(original[0].lower())[0]

                        await message.bot.send_photo(chat_id=id_group,
                                                     photo=open(f"data/kill/({random.randint(1, 6)}).jpg", 'rb'),
                                                     caption=f"{message.from_user.first_name} "
                                                             f"{slv.inflect({'past', 'sing', 'indc'}).word} {text}")
                
                for word_1 in base.QUAT_LIST[0]:
                    flag = False
                    for word_2 in base.QUAT_LIST[1]:
                        for word_3 in base.QUAT_LIST[2]:
                            if no_pct == " ".join([word_1, word_2, word_3]):
                                word = (requests.get('http://fucking-great-advice.ru/api/random').text).split('"')[5]
                                await message.reply(word)
                                flag = True
                        if flag:
                            break
                    if flag:
                        break

                if no_pct == 'совет дня':
                    word = (requests.get('http://fucking-great-advice.ru/api/latest').text).split('"')[5]
                    await message.reply(word)

        # PUTIN
        if len(original) >= 2:
            if "поклониться путину" in txt:
                await message.bot.send_photo(chat_id=id_group,
                                             photo=open("data/putin/putin.jpg", 'rb'),
                                             caption=f"{message.from_user.first_name}! "
                                                     f"Я рад, что ты выбрал правильную сторону)")
                return

            if "чмокнуть путина" in txt:
                if message.from_user.first_name != "Вадим":
                    await message.bot.send_photo(chat_id=id_group,
                                                 photo=open(f"data/putin/chmok/({random.randint(1, 5)}).jpg", 'rb'),
                                                 caption=f"{message.from_user.first_name}, "
                                                         f"был удостоен чести чмокнуть великого!")
                else:
                    await message.bot.send_photo(chat_id=id_group,
                                                 photo=open(f"data/putin/chmok/vadim.jpg", 'rb'),
                                                 caption=f"{message.from_user.first_name}, а ты ему сразу приглянулся)")
                return

            if "путин вор" in txt:
                await message.bot.send_photo(chat_id=id_group,
                                             photo=open(f"data/putin/autozak/({random.randint(1, 4)}).jpg", 'rb'),
                                             caption=f"{message.from_user.first_name}! Ваш автозак уже в пути! "
                                                     f"Примерное время ожидания составляет "
                                                     f"{autozak(message.from_user.first_name)} Рекомендуеться "
                                                     f"подготовить паспорт и наркотики для избежания лишней работы!")
                return

            if "лёша выйдет погулять" in txt:
                await message.bot.send_photo(chat_id=id_group,
                                             photo=open("data/putin/lesha.jpg", 'rb'),
                                             caption=f"{message.from_user.first_name}, нет! Он сидит дома из-за "
                                                     f"плохого поведения, приходи через {times()}")
                return

        # ЛИСТ КОМАНДЫ
        if names:
            if "крид" not in norm:
                await message.reply(notice(names, False, id_group, message.from_user.id), types.ParseMode.HTML)
                return
            else:
                if int(id_group) == int(base.MY_GROUP):
                    if random.randint(1, 10) == 1:
                        await message.reply("Заебал уже, со своим ебучим Игорем Кридом")
                        return
                else:
                    await message.reply(notice(names, False, id_group, message.from_user.id), types.ParseMode.HTML)
                    return

        # ПЕРЕВОДЧИК СЛОВ
        if cheker(bk, original, id_group, user) == len(txt):
            await message.reply(f"[{message.from_user.first_name}](tg://user?id={user}) *>* {translator(original)}", 
                                types.ParseMode.MARKDOWN)
            return


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(time(21600)) # КАЖДЫЕ 6 ЧАСОВ ПРОВЕРКА
    executor.start_polling(dp, skip_updates=True)