diff --git a/code/base.py b/code/base.py new file mode 100644 index 0000000..2ade2d6 --- /dev/null +++ b/code/base.py @@ -0,0 +1,26 @@ +# ДАННЫЕ БОТА +TOKEN = "" # @chat_abobot +DEBAG = "-*********" # Технический чат + +TEX_GROUP = "-*********" + +# ОБРАЩЕНИЯ К ПОЛЬЗОВАТЕЛЯМ +KILL_LIST = ["побить", "отмудохать", "избить", "уебать", "отметелить"] +TMOK_LIST = ["поцеловать", "чмокнуть", "соснуть", "лайкнуть"] +QUAT_LIST = [['дай', 'дайте'], ['ахуенный', 'ахуеный', 'охуеный', 'охуенный', 'блять', 'сука'], ['совет', 'совета']] + +# ФРАЗЫ ИВЕНТ ДРАКИ +VAR_WIN = ["опустив его ниже плинтуса!", "поставив его на место!"] +VAR_LOSE = ["Кунг - Фу!", "магии!", "резинового члена!", "банды цапель!"] + +# ПЕРЕВОДЧИК СЛОВ +ERR = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + "'", 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '`'] +ERR_ = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', + '"', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '~'] +TRU = ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', + 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '.'] +TRU_ = ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', + 'Э', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', ','] + +ALB = ['а', 'у', 'о', 'ы', 'и', 'э', 'я', 'ю', 'ё', 'е', 'А', 'У', 'О', 'Ы', 'И', 'Э', 'Я', 'Ю', 'Ё', 'Е'] diff --git a/code/bot.py b/code/bot.py new file mode 100644 index 0000000..5125fc3 --- /dev/null +++ b/code/bot.py @@ -0,0 +1,422 @@ +import logging, random, pymorphy2, requests +import asyncio, base, re, os, enchant, sql + +from gtts import gTTS +from script import checker, translator, notice, lang_form, revers, upd_stat +from aiogram import Bot, Dispatcher, executor, types +from datetime import datetime as dt +# from filters import Admin + +# log level +logging.basicConfig(level=logging.INFO) + +# bot init +bot = Bot(token=base.TOKEN) +dp = Dispatcher(bot) +morph = pymorphy2.MorphAnalyzer() +engl_dict = enchant.Dict("en_US") + +# инициализируем соединение с БД +db = sql.Base('../db/base.db') +du = sql.User('../db/users.db') +dg = sql.Group('../db/groups.db') +dm = sql.Month('../db/month.db') + +# инициализируем фильтры +# dp.filters_factory.bind(Admin) + + +@dp.message_handler(content_types=["new_chat_members"]) +async def notification(message: types.Message): + if not du.group_exists(message.chat.id): + du.add_group(message.chat.id) + + group_id = du.get_group_id(message.chat.id) + db.add_group(group_id) + dg.created_group(group_id) + + await bot.send_message(message.chat.id, f'Привет группа {message.chat.title}!\n\nВсе функции вы можете ' + f'узнать по команде /help! Для того, чтобы ' + f'уведомления по имени и команда /all нормально функционировали, ' + f'необходимо чтобы каждый участник группы написал хотя бы одно ' + f'сообщение в чат! Также для того, чтобы системные сообщения удалялись ' + f'автоматически, необходимо боту выдать права администратора!', + types.ParseMode.HTML) + else: + try: + await message.delete() + except Exception: + return + + +# ОБНОВЛЕНИЕ АЙДИ ГРУППЫ +@dp.message_handler(content_types=['migrate_to_chat_id', 'migrate_from_chat_id']) +async def chat_reload(message: types.Message): + if du.group_exists(message.migrate_from_chat_id): + du.update_group_id(du.get_group_id(message.migrate_from_chat_id), message.migrate_to_chat_id) + + +# КОМАНДЫ +@dp.message_handler(commands=['start', 'help']) +async def helps(message: types.Message): + if message.chat.id > 0: + user_id = message.from_user.id + if not du.user_exists(user_id): + du.add_user(user_id) + else: + group_id, user_id = message.chat.id, message.from_user.id + if not du.user_exists(user_id): + du.add_user(user_id) + if not du.group_exists(group_id): + du.add_group(group_id) + upd_stat(user_id, group_id, 3, message.from_user.first_name, True) + + buttons = [types.InlineKeyboardButton(text="КОМАНДЫ", callback_data="com"), + types.InlineKeyboardButton(text="ИВЕНТЫ", callback_data="even"), + types.InlineKeyboardButton(text="АВТОР", callback_data="auth"), + types.InlineKeyboardButton(text="ФУНКЦИИ", callback_data="fun")] + + keyboard = types.InlineKeyboardMarkup(row_width=2) + keyboard.add(*buttons) + + try: + 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) + except Exception: + await bot.send_message(chat_id=message.chat.id, + text='*-* Этот АБОБОТ поможет вам приятно провести время в чате с различными командами, ' + 'ивентами и удобными функциями, которые облегчают использование чата)\n\n' + '*-* Также прошу если вам понравился бот, оставить отзыв о его использовании на ' + 'команду /report)', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard) + + +# ИЛАЙН КЛАВИАТУРА HELP +@dp.callback_query_handler(text="auth") +async def author(call: types.CallbackQuery): + await call.message.answer(text='*| АВТОР |*\n\n*>>* Этот бот, как бы это не печально звучало, но одна из лучших' + ' моих работ и если кого-нибудь у меня получится действительно достойный продукт,' + ' вы сможете о нём узнать в моём телеграм канале *@itsproger*', 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='| КОМАНДЫ |\n\n/all - упомянуть всех в чате\n/help - полный список функций\n' + '/stat_group - полная статистика группы\n/stat_user - полная статистика ' + 'отправителя\n/edit и /back_edit - первая команда даёт возможность ' + 'сменить имя для упоминаний на любое слово, а вторая для возврата динамического ' + 'имени\n/start_bot и /stop_bot - возможность отключения текстовых ивентов', + 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 every(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + try: + await message.reply(notice(du.get_user_id(message.from_user.id), True, du.get_group_id(message.chat.id), message.from_user.id), + types.ParseMode.HTML) + except Exception as e: + # print(repr(e)) + await message.reply('В группе состоит менее 3х человек, из-за чего команда не работает!') + else: + await message.reply('Эта команда предназначена для вызова в чате!') + + +@dp.message_handler(commands=['stat_group']) +async def stat_group(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + group_id = du.get_group_id(message.chat.id) + + group = db.stat_group(group_id) + month = db.month_stat_group(group_id) + + await message.answer(text=f'*| СТАТИСТИКА ГРУППЫ |*\n\n' + f'*>>* В целом сообщений *[ {message.message_id} ]*\n\n' + f'*- За всё время* / *За месяц -*\n' + f'*>>* Сообщений в базе *[ {group[0]} / {month[0]} ]*\n\n' + f'*>* Ответов *- [ {group[1]} / {month[1]} ]*\n' + f'*>* Команд *- [ {group[2]} / {month[2]} ]*\n' + f'*>* Ссылок *- [ {group[3]} / {month[3]} ]*\n' + f'*>* Стикеров *- [ {group[5]} / {month[5]} ]*\n' + f'*>* Медиа файлов *- [ {group[4]} / {month[4] } ]*\n' + f'*>* Голос/Кружочки *- [ {group[6]} / {month[6]} ]*', + parse_mode=types.ParseMode.MARKDOWN) + + +@dp.message_handler(commands=['stat_user']) +async def stat_user(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + user_id, group_id = du.get_user_id(message.from_user.id), du.get_group_id(message.chat.id) + + group = dg.stat_user(user_id, group_id) + month = dm.stat_user(user_id, group_id) + + namer = "".join(re.sub(r'[^\w\s]', '', message.from_user.first_name).split()) + name = morph.parse(namer)[0].inflect({"gent"}) + + if name is None: name = namer + else: name = name.word + + await message.answer(text=f'*| СТАТИСТИКА {name.upper()} |*\n\n' + f'*- За всё время* / *За месяц -*\n' + f'*>>* Сообщений в базе *[ {group[0]} / {month[0]} ]*\n\n' + f'*>* Ответов *- [ {group[1]} / {month[1]} ]*\n' + f'*>* Команд *- [ {group[2]} / {month[2]} ]*\n' + f'*>* Ссылок *- [ {group[3]} / {month[3]} ]*\n' + f'*>* Стикеров *- [ {group[5]} / {month[5]} ]*\n' + f'*>* Медиа файлов *- [ {group[4]} / {month[4]} ]*\n' + f'*>* Голос/Кружочки *- [ {group[6]} / {month[6]} ]*', + parse_mode=types.ParseMode.MARKDOWN) + + +@dp.message_handler(commands=['edit']) +async def update(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + user_id, group_id = du.get_user_id(message.from_user.id), du.get_group_id(message.chat.id) + + text_edit = re.sub(r'[^\w\s]', '', message.text.lower()).split() + if len(text_edit) == 2: + name = morph.parse(text_edit[1])[0] + + if name is None: name = text_edit[1] + else: name = name.normal_form + + if name not in list(map(lambda x: x[0], dg.all_names(group_id))): + if not db.edit_user_exists(user_id): + db.add_edit_user(user_id) + + dg.update_name(user_id, group_id, name) + await message.reply(f'{name.title()}, ваше имя было успешно изменено)') + else: + await message.reply(f'{message.from_user.first_name.lower().title()}, такое имя уже присутствует в чате!') + else: + await message.reply('Вы не правильно ввели имя! Имя должно быть ' + 'из одного слова и идти сразу после команды!') + + +@dp.message_handler(commands=['back_edit']) +async def update_return(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + user_id, group_id = du.get_user_id(message.from_user.id), du.get_group_id(message.chat.id) + name = re.sub(r'[^\w\s]', '', message.from_user.first_name.lower()) + + if db.edit_user_exists(user_id): + db.del_edit_user(user_id) + dg.update_name(user_id, group_id, name) + + await message.reply(f'{name.title()}, вы успешно вернулись к динамическому изменению имени)') + else: + await message.reply(f'{name.title()}, вы не устанавливали постоянное имя!') + + +@dp.message_handler(commands=['start_bot']) +async def opening(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + + group_id = du.get_group_id(message.chat.id) + if db.check_status(group_id): + await message.answer("У вас уже включены текстовые ивенты!") + else: + db.update_status(group_id) + await message.answer("Текстовые ивенты включены!") + + +@dp.message_handler(commands=['stop_bot']) +async def closing(message: types.Message): + if message.chat.id < 0: + upd_stat(message.from_user.id, message.chat.id, 3, message.from_user.first_name, True) + + group_id = du.get_group_id(message.chat.id) + if db.check_status(group_id): + db.update_status(group_id) + await message.answer("Текстовые ивенты отключены!") + else: + await message.answer("У вас уже отключены текстовые ивенты!") + + +# УДАЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ АВТОМАТИЧЕСКИ +@dp.message_handler(content_types=["left_chat_member"]) +async def delete(message: types.Message): + if du.user_exists(message.left_chat_member.id): + user_id, group_id = du.get_user_id(message.left_chat_member.id), du.get_group_id(message.chat.id) + + dg.del_user(group_id, user_id) + if db.group_exists_month(group_id): + if dm.user_exists(user_id, group_id): dm.del_user(group_id, user_id) + + try: await message.delete() + except Exception: return + + +# УДАЛЕНИЕ ТЕХ. СООБЩЕНИЙ +@dp.message_handler(content_types=["new_chat_title", "new_chat_photo", "pinned_message", "voice_chat_ended", + "voice_chat_participants_invited"]) +async def chat_events(message: types.Message): + try: await message.delete() + except Exception: return + + +# СТАТИСТИКА +@dp.message_handler(content_types=['location', 'contact', 'video', 'photo', 'audio', 'document']) +async def media(message: types.Message): + if message.chat.id < 0: upd_stat(message.from_user.id, message.chat.id, 5, message.from_user.first_name, True) + + +@dp.message_handler(content_types=['voice', 'video_note']) +async def voice(message: types.Message): + if message.chat.id < 0: upd_stat(message.from_user.id, message.chat.id, 7, message.from_user.first_name, True) + + +@dp.message_handler(content_types=['sticker']) +async def stick(message: types.Message): + if message.chat.id < 0: upd_stat(message.from_user.id, message.chat.id, 6, message.from_user.first_name, True) + + +# ТЕКСТОВЫЕ ИВЕНТЫ +@dp.message_handler(content_types=['text']) +async def send_events(message: types.Message): + group_id, user_id, name = message.chat.id, message.from_user.id, message.from_user.first_name + + # ОБНОВЛЕНИЕ КОЛ-ВО + if message.chat.id < 0: + upd_stat(user_id, group_id, 1, name) # СООБЩЕНИЙ + if len(message.text) > 1 and message.text[0] == '/': upd_stat(user_id, group_id, 3, name) # КОМАНД + if 'reply_to_message' in message: upd_stat(user_id, group_id, 2, name) # ОТВЕТОВ НА СООБЩЕНИЯ + + # ПЕРЕМЕННЫЕ + low_mes = message.text.lower() # СООБЩЕНИЕ В НИЖНЕМ РЕГИСТРЕ + words = message.text.split() # СПИСОК СЛОВ В СООБЩЕНИИ + unsigned = re.sub(r'[^\w\s]', '', low_mes).split() # СПИСОК СЛОВ БЕЗ ПУНКТУАЦИИ + first_form = [morph.parse(i)[0].normal_form for i in unsigned] # СПИСОК СЛОВ В ПЕРВОЙ ФОРМЕ + if message.chat.id < 0: # СПИСОК ИМЕН В СООБЩЕНИИ (ТОЛЬКО В ГРУППЕ) + names = [_ for _ in first_form if _ in list(map(lambda x: x[0], dg.all_names(du.get_group_id(group_id))))] + + if len(words) >= 2: + # ПОЛЕЗНЫЕ ФУНКЦИИ + if len(words) == 5 and "число от" in low_mes: + await message.answer( + text=f"Число [ {random.randint(int(low_mes.split()[2]), int(low_mes.split()[4]))} ]", + parse_mode=types.ParseMode.HTML) + return + + if unsigned[0] == 'переведи': + if "переведи - " in low_mes: + await message.answer(lang_form([words[_] for _ in range(len(words)) if _ > 1])) + elif f"переведи ({unsigned[1]}) - " in low_mes: + if len(unsigned[1]) == 1: + await message.answer(lang_form([words[_] for _ in range(len(words)) if _ > 2], unsigned[1])) + return + + if unsigned[0] == 'переверни': + if "переверни - " in low_mes: + await message.answer(revers(message.text[12:], True)) + elif "переверни полностью - " in low_mes: + await message.answer(revers(message.text[22:], False)) + return + + if unsigned[0] == 'озвучь' and "озвучь - " in low_mes: + text_to_voice = message.text[9:] + tts = gTTS(text_to_voice, lang='ru') + tts.save('../data/voices/voice.ogg') + await bot.send_voice(chat_id=group_id, voice=open('../data/voices/voice.ogg', 'rb'), + caption=f"{text_to_voice}", parse_mode=types.ParseMode.HTML) + os.remove('../data/voices/voice.ogg') + return + + # РАНДОМ ИВЕНТЫ + if "подраться" == words[0].lower() and "с" == words[1].lower(): + text = " ".join([words[i] for i in range(len(words)) if i > 1]) + + if random.randint(0, 1) == 0: + await message.bot.send_photo(chat_id=group_id, + 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=group_id, + 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)]}") + + # ИВЕНТ ВЗАИМОДЕЙСТВИЯ + for word in base.TMOK_LIST: + if word in low_mes: + lst = [words[i] for i in range(len(words)) if i != 0] + text = " ".join(lst) + + slv = morph.parse(words[0].lower())[0] + await message.bot.send_photo(chat_id=group_id, + 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 low_mes: + lst = [words[i] for i in range(len(words)) if i != 0] + text = " ".join(lst) + + slv = morph.parse(words[0].lower())[0] + await message.bot.send_photo(chat_id=group_id, + 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}") + + if unsigned[0] in base.QUAT_LIST[0] and \ + unsigned[1] in base.QUAT_LIST[1] and unsigned[2] in base.QUAT_LIST[2]: + word = requests.get('http://fucking-great-advice.ru/api/random').json() + await message.reply(word["text"]) + return + + if message.chat.id < 0: + # ЛИСТ КОМАНДЫ + if names: + try: + await message.reply(notice(names, False, du.get_group_id(group_id), user_id), types.ParseMode.HTML) + except Exception as e: + return + """ + await bot.send_message(chat_id=base.TEX_GROUP, text=f"[ {str(dt.now())[:-10]} ] " + f"=> {repr(e)} (уведомления по именам)", + parse_mode=types.ParseMode.HTML) + """ + return + + # ПЕРЕВОДЧИК СЛОВ + if checker([i for i in low_mes], words, group_id, user_id, name.lower()) == len(low_mes) and \ + not any([engl_dict.check(i) for i in unsigned]): + await message.reply(f"[{message.from_user.first_name}](tg://user_id?id={user_id}) *>* {translator(words)}", + types.ParseMode.MARKDOWN) + return + + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + executor.start_polling(dp, skip_updates=True) diff --git a/code/script.py b/code/script.py new file mode 100644 index 0000000..9bb2e7f --- /dev/null +++ b/code/script.py @@ -0,0 +1,172 @@ +from base import ERR, ERR_, TRU, TRU_, ALB +from string import digits, punctuation +import re, sql + +# инициализируем соединение с БД +db = sql.Base('../db/base.db') +du = sql.User('../db/users.db') +dg = sql.Group('../db/groups.db') +dm = sql.Month('../db/month.db') + + +def upd_stat(user_id, group_id, var_id, name, mes=False): + name = re.sub(r'[^\w\s]', '', name.lower()) + if not du.user_exists(user_id): + du.add_user(user_id) + user_id = du.get_user_id(user_id) + + if not du.group_exists(group_id): + du.add_group(group_id) + group_id = du.get_group_id(group_id) + + if not db.group_exists(group_id): + db.add_group(group_id) + dg.created_group(group_id) + + if not dg.user_exists(user_id, group_id): + dg.add_user(group_id, user_id, name) + + db.update_stat(group_id, var_id) + dg.update_stat(user_id, group_id, var_id) + + if not db.group_exists_month(group_id): + db.add_group_month(group_id) + dm.created_group(group_id) + dm.add_user(group_id, user_id) + else: + if not dm.user_exists(user_id, group_id): + dm.add_user(group_id, user_id) + + db.update_month_stat(group_id, var_id) + dm.update_stat(user_id, group_id, var_id) + + if mes: + db.update_month_stat(group_id, 1) + dg.update_stat(user_id, group_id, 1) + dm.update_stat(user_id, group_id, 1) + db.update_stat(group_id, 1) + + if not db.edit_user_exists(user_id): + dg.update_name(user_id, group_id, name) + + +def lang_form(text, smbl='г'): + for i in range(len(text)): + word = [str(j) + str(smbl) + str(j).lower() if j in ALB else str(j) for j in text[i]] + text[i] = ''.join(word) + return ' '.join(text) + + +def notice(name, all_users, group_id, author): + names = [i[0] for i in dg.all_names(group_id)] + ids = [du.get_first_user_id(i[0]) for i in dg.all_ids(group_id)] + + if all_users: + name = dg.user_name(name, group_id) + usr = [""+names[i].title()+"" for i in range(len(names)) + if names[i] != name.lower()] + usr.append(f'{usr[-2]} и {usr[-1]}') + del usr[-2], usr[-2] + return f'{", ".join(usr)} вас вызывает {name.title()}' + else: + no_copy = [] + for i in name: + if i not in no_copy: + no_copy.append(i) + + if len(no_copy) > 1: # ПЕРЕПИСАТЬ КОД ГАВНА КУСОК + usr = [""+_.title()+"" for _ in no_copy + if int(author) != ids[names.index(_)]] + usr.append(f'{usr[-2]} и {usr[-1]}') + del usr[-2], usr[-2] + return f"{', '.join(usr)} вас упомянули)" + else: + usr = ""+no_copy[0].title()+"" + return f"{usr}, тебя упомянули)" + + +def checker(signs, words, group_id, user_id, name): + if len([z for z in signs if (z in digits) or (z in punctuation)]) == len(signs) or signs[0] == '/': + return int('-1') + + if len(signs) > 4: + for x in range(3, len(signs)): + http = "".join([signs[x - 3], signs[x - 2], signs[x - 1], signs[x]]) + if 'http' in http: + upd_stat(user_id, group_id, 4, name) + return int('-1') + + count, raw = 0, 0 + for word in words: + for symbol in word: + raw += 1 + if (symbol in ERR) or (symbol in ERR_) or (symbol in digits): + count += 1 + return len(signs) - raw + count + + +def translator(words): + itg = [] + for word in words: + raw_word = [] + for symbol in word: + if symbol in ERR: + count = 0 + for _ in ERR: + if symbol == _: + raw_word.append(TRU[count]) + break + count += 1 + elif symbol in ERR_: + count = 0 + for _ in ERR_: + if symbol == _: + raw_word.append(TRU_[count]) + break + count += 1 + itg.append("".join(raw_word)) + return " ".join(itg) + + +def revers(message, var): + no_pct = re.sub(r'[^\w\s]', '', message) + + if var: + sml, pnc, pct, prf = [i for i in message] + [str(0)], [], [], False + for i in sml: + if i in punctuation or i == ' ': + pnc.append(i) + prf, flag = True if sml.index(i) == 0 else False, False + else: + flag = True + + if flag and len(pnc) > 0: + pct.append(''.join(pnc)) + pnc = [] + + wrd, rev, lst, txt = no_pct.split(), [], [], [] + for i in wrd: + word, up, itg = [i[-1 - l].lower() for l in range(len(i))], [], [] + + for _ in i: + up.append(True if _ in TRU_ else False) + for j in range(len(up)): + itg.append(word[j].upper() if up[j] else word[j]) + + rev.append(''.join(itg)) + + if prf: + for i in range(len(pct)): + txt = (txt + [pct[i]]) if (i + 1) == len(pct) and len(pct) > len(rev) else (txt + [pct[i], rev[i]]) + return ''.join(txt) + else: + for i in range(len(rev)): + if i > 0: + txt.append(pct[i - 1]) + txt.append(rev[i]) + if (i + 1) == len(rev) and len(pct) == len(rev): + txt.append(pct[i]) + return ''.join(txt) + else: + sml = [i for i in message] + return ''.join([sml[-1 - i] for i in range(len(sml))]) \ No newline at end of file diff --git a/code/sql.py b/code/sql.py new file mode 100644 index 0000000..f1c1d8f --- /dev/null +++ b/code/sql.py @@ -0,0 +1,389 @@ +import sqlite3 + + +class Base: + def __init__(self, database): + """Подключаемся к БД и сохраняем курсор соединения""" + self.connection = sqlite3.connect(database) + self.cursor = self.connection.cursor() + + # КОМАНДЫ + def add_group(self, group_id): + """Добавляем нового пользователя""" + with self.connection: + self.cursor.execute(f"INSERT INTO `work` (`group_id`) VALUES(?)", (group_id,)) + self.cursor.execute(f"INSERT INTO `stat` (`group_id`, `mes`, `rep`, `com`, `url`, `med`, `sti`, " + f"`voi`) VALUES(?,?,?,?,?,?,?,?)", (group_id, 0, 0, 0, 0, 0, 0, 0)) + return + + def group_exists(self, group_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute(f'SELECT * FROM `work` WHERE `group_id` = ?', (group_id,)).fetchall() + return bool(len(result)) + + # ТАБЛИЦА STAT + def update_stat(self, group_id, var_id): + """Обновляем статистику""" + try: + with self.connection: + self.cursor.execute(f"SELECT * FROM `stat` WHERE `group_id` = ?", (group_id,)) + if var_id == 1: + return self.cursor.execute(f"UPDATE `stat` SET `mes` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[1] + 1), group_id)) + elif var_id == 2: + return self.cursor.execute(f"UPDATE `stat` SET `rep` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[2] + 1), group_id)) + elif var_id == 3: + return self.cursor.execute(f"UPDATE `stat` SET `com` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[3] + 1), group_id)) + elif var_id == 4: + return self.cursor.execute(f"UPDATE `stat` SET `url` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[4] + 1), group_id)) + elif var_id == 5: + return self.cursor.execute(f"UPDATE `stat` SET `med` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[5] + 1), group_id)) + elif var_id == 6: + return self.cursor.execute(f"UPDATE `stat` SET `sti` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[6] + 1), group_id)) + elif var_id == 7: + return self.cursor.execute(f"UPDATE `stat` SET `voi` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[7] + 1), group_id)) + except Exception as e: + print(repr(e)) + + def stat_group(self, group_id): + """Получение данных пользователя""" + with self.connection: + self.cursor.execute(f"SELECT * FROM `stat` WHERE `group_id` = ?", (group_id,)) + data = self.cursor.fetchone() + return data[1:] + + # ТАБЛИЦА MONTH + def group_exists_month(self, group_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute('SELECT * FROM `month` WHERE `group_id` = ?', (group_id,)).fetchall() + return bool(len(result)) + + def add_group_month(self, group_id): + """Добавляем нового пользователя""" + with self.connection: + return self.cursor.execute("INSERT INTO `month` (`group_id`, `mes`, `rep`, `com`, `url`, `med`, `sti`, " + "`voi`) VALUES(?,?,?,?,?,?,?,?)", (group_id, 0, 0, 0, 0, 0, 0, 0)) + + def update_month_stat(self, group_id, var_id): + """Обновляем статистику""" + try: + with self.connection: + self.cursor.execute(f"SELECT * FROM `month` WHERE `group_id` = ?", (group_id,)) + if var_id == 1: + return self.cursor.execute(f"UPDATE `month` SET `mes` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[1] + 1), group_id)) + elif var_id == 2: + return self.cursor.execute(f"UPDATE `month` SET `rep` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[2] + 1), group_id)) + elif var_id == 3: + return self.cursor.execute(f"UPDATE `month` SET `com` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[3] + 1), group_id)) + elif var_id == 4: + return self.cursor.execute(f"UPDATE `month` SET `url` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[4] + 1), group_id)) + elif var_id == 5: + return self.cursor.execute(f"UPDATE `month` SET `med` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[5] + 1), group_id)) + elif var_id == 6: + return self.cursor.execute(f"UPDATE `month` SET `sti` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[6] + 1), group_id)) + elif var_id == 7: + return self.cursor.execute(f"UPDATE `month` SET `voi` = ? WHERE `group_id` = ?", + ((self.cursor.fetchone()[7] + 1), group_id)) + except Exception as e: + print(repr(e)) + + def month_stat_group(self, group_id): + """Получение данных пользователя""" + with self.connection: + self.cursor.execute(f"SELECT * FROM `month` WHERE `group_id` = ?", (group_id,)) + data = self.cursor.fetchone() + return data[1:] + + # ТАБЛИЦА EDIT + def add_edit_user(self, user_id): + """Добавляем нового пользователя""" + with self.connection: + return self.cursor.execute("INSERT INTO `edit` (`user_id`) VALUES(?)", (user_id,)) + + def edit_user_exists(self, user_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute('SELECT * FROM `edit` WHERE `user_id` = ?', (user_id,)).fetchall() + return bool(len(result)) + + def del_edit_user(self, user_id): + """Удаление пользователя""" + with self.connection: + return self.cursor.execute(f'DELETE FROM `edit` WHERE `user_id` = ?', (user_id,)) + + # ТАБЛИЦА WORK + def check_status(self, group_id): + """Получаем статус""" + with self.connection: + return self.cursor.execute(f'SELECT `state` FROM `work` WHERE `group_id` = ?', (group_id,)).fetchone()[0] + + def update_status(self, group_id): + """Обновляем статус""" + with self.connection: + state = self.cursor.execute(f'SELECT `state` FROM `work` WHERE `group_id` = ?', (group_id,)).fetchone()[0] + return self.cursor.execute(f"UPDATE `work` SET `state` = ? WHERE `group_id` = ?", (not state, group_id)) + + # ЗАКРЫТИЕ ВЫЗОВА + def close(self): + """Закрываем соединение с БД""" + self.connection.close() + + +class User: + def __init__(self, database): + """Подключаемся к БД и сохраняем курсор соединения""" + self.connection = sqlite3.connect(database) + self.cursor = self.connection.cursor() + + # СВЯЗКА ПОЛЬЗОВАТЕЛЯ + def user_exists(self, user_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute(f'SELECT * FROM `users` WHERE `user_id` = ?', (user_id,)).fetchall() + return bool(len(result)) + + def add_user(self, user_id): + """Добавляем нового пользователя""" + with self.connection: + return self.cursor.execute(f"INSERT INTO `users` (`user_id`) VALUES(?)", (user_id,)) + + def get_user_id(self, user_id): + """Получаем короткое айди юзера""" + with self.connection: + return self.cursor.execute(f'SELECT `id` FROM `users` WHERE `user_id` = ?', (user_id,)).fetchone()[0] + + def get_first_user_id(self, user_id): + """Получаем длинное айди юзера""" + with self.connection: + return self.cursor.execute(f'SELECT `user_id` FROM `users` WHERE `id` = ?', (user_id,)).fetchone()[0] + + # СВЯЗКА ГРУППЫ + def group_exists(self, group_id): + """Проверяем, есть ли уже группа в базе""" + with self.connection: + result = self.cursor.execute('SELECT * FROM `groups` WHERE `group_id` = ?', (group_id,)).fetchall() + return bool(len(result)) + + def add_group(self, group_id): + """Добавляем новую группу в таблицу""" + with self.connection: + return self.cursor.execute("INSERT INTO `groups` (`group_id`) VALUES(?)", (group_id,)) + + def get_group_id(self, group_id): + """Получаем короткое айди юзера""" + with self.connection: + return self.cursor.execute(f'SELECT `id` FROM `groups` WHERE `group_id` = ?', (group_id,)).fetchone()[0] + + def get_first_group_id(self, group_id): + """Получаем длинное айди юзера""" + with self.connection: + return self.cursor.execute(f'SELECT `group_id` FROM `groups` WHERE `id` = ?', (group_id,)).fetchone()[0] + + def update_group_id(self, from_id, to_id): + """Заменяем на новый айди""" + with self.connection: + return self.cursor.execute("UPDATE `groups` SET `group_id` = ? WHERE `id` = ?", (to_id, from_id)) + + # ЗАКРЫТИЕ ВЫЗОВА + def close(self): + """Закрываем соединение с БД""" + self.connection.close() + + +class Group: + def __init__(self, database): + """Подключаемся к БД и сохраняем курсор соединения""" + self.connection = sqlite3.connect(database) + self.cursor = self.connection.cursor() + + # КОМАНДЫ + def created_group(self, group_id): + """Создаём новую таблицу""" + with self.connection: + return self.cursor.execute(f"""CREATE TABLE IF NOT EXISTS [{group_id}] ( + user_id INTEGER NOT NULL, + first_name STRING, + mes INTEGER, + rep INTEGER, + com INTEGER, + url INTEGER, + med INTEGER, + sti INTEGER, + voi INTEGER);""") + + def add_user(self, group_id, user_id, name): + """Добавляем нового пользователя""" + with self.connection: + return self.cursor.execute(f"INSERT INTO `{group_id}` (`user_id`, `first_name`, `mes`, `rep`, `com`, `url`, " + f"`med`, `sti`, `voi`) VALUES(?,?,?,?,?,?,?,?,?)", (user_id, name, 0, 0, 0, 0, 0, + 0, 0)) + + def all_names(self, group_id): + """Список имён""" + with self.connection: + return self.cursor.execute(f'SELECT `first_name` FROM `{group_id}`').fetchall() + + def all_ids(self, group_id): + """Список айди""" + with self.connection: + return self.cursor.execute(f'SELECT `user_id` FROM `{group_id}`').fetchall() + + def update_stat(self, user_id, group_id, var_id): + """Обновляем статистику""" + try: + with self.connection: + self.cursor.execute(f"SELECT * FROM `{group_id}` WHERE `user_id` = ?", (user_id,)) + if var_id == 1: + return self.cursor.execute(f"UPDATE `{group_id}` SET `mes` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[2] + 1), user_id)) + elif var_id == 2: + return self.cursor.execute(f"UPDATE `{group_id}` SET `rep` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[3] + 1), user_id)) + elif var_id == 3: + return self.cursor.execute(f"UPDATE `{group_id}` SET `com` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[4] + 1), user_id)) + elif var_id == 4: + return self.cursor.execute(f"UPDATE `{group_id}` SET `url` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[5] + 1), user_id)) + elif var_id == 5: + return self.cursor.execute(f"UPDATE `{group_id}` SET `med` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[6] + 1), user_id)) + elif var_id == 6: + return self.cursor.execute(f"UPDATE `{group_id}` SET `sti` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[7] + 1), user_id)) + elif var_id == 7: + return self.cursor.execute(f"UPDATE `{group_id}` SET `voi` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[8] + 1), user_id)) + except Exception as e: + print(repr(e)) + + def user_exists(self, user_id, group_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute(f'SELECT * FROM `{group_id}` WHERE `user_id` = ?', (user_id,)).fetchall() + return bool(len(result)) + + def update_name(self, user_id, group_id, name): + """Обновляем имя пользователя""" + with self.connection: + return self.cursor.execute(f"UPDATE `{group_id}` SET `first_name` = ? WHERE `user_id` = ?", (name, user_id)) + + def user_name(self, user_id, group_id): + """Получаем имя пользователя по айди""" + with self.connection: + return self.cursor.execute(f"SELECT `first_name` FROM `{group_id}` WHERE `user_id` = ?", (user_id,)).fetchone()[0] + + def stat_user(self, user_id, group_id): + """Получение данных пользователя""" + with self.connection: + self.cursor.execute(f"SELECT * FROM `{group_id}` WHERE `user_id` = ?", (user_id,)) + data = self.cursor.fetchone() + return data[2:] + + def del_user(self, group_id, user_id): + """Удаление пользователя""" + with self.connection: + return self.cursor.execute(f'DELETE FROM `{group_id}` WHERE `user_id` = ?', (user_id,)) + + # ЗАКРЫТИЕ ВЫЗОВА + def close(self): + """Закрываем соединение с БД""" + self.connection.close() + + +class Month: + def __init__(self, database): + """Подключаемся к БД и сохраняем курсор соединения""" + self.connection = sqlite3.connect(database) + self.cursor = self.connection.cursor() + + # КОМАНДЫ + def update_stat(self, user_id, group_id, var_id): + """Обновляем статистику""" + try: + with self.connection: + self.cursor.execute(f"SELECT * FROM `{group_id}` WHERE `user_id` = ?", (user_id,)) + if var_id == 1: + return self.cursor.execute(f"UPDATE `{group_id}` SET `mes` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[1] + 1), user_id)) + elif var_id == 2: + return self.cursor.execute(f"UPDATE `{group_id}` SET `rep` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[2] + 1), user_id)) + elif var_id == 3: + return self.cursor.execute(f"UPDATE `{group_id}` SET `com` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[3] + 1), user_id)) + elif var_id == 4: + return self.cursor.execute(f"UPDATE `{group_id}` SET `url` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[4] + 1), user_id)) + elif var_id == 5: + return self.cursor.execute(f"UPDATE `{group_id}` SET `med` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[5] + 1), user_id)) + elif var_id == 6: + return self.cursor.execute(f"UPDATE `{group_id}` SET `sti` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[6] + 1), user_id)) + elif var_id == 7: + return self.cursor.execute(f"UPDATE `{group_id}` SET `voi` = ? WHERE `user_id` = ?", + ((self.cursor.fetchone()[7] + 1), user_id)) + except Exception as e: + print(repr(e)) + + def created_group(self, group_id): + """Создаём новую таблицу""" + with self.connection: + return self.cursor.execute(f"""CREATE TABLE IF NOT EXISTS [{group_id}] ( + user_id INTEGER NOT NULL, + mes INTEGER, + rep INTEGER, + com INTEGER, + url INTEGER, + med INTEGER, + sti INTEGER, + voi INTEGER);""") + + def add_user(self, group_id, user_id): + """Добавляем нового пользователя""" + with self.connection: + return self.cursor.execute(f"INSERT INTO `{group_id}` (`user_id`, `mes`, `rep`, `com`, `url`, `med`, " + f"`sti`, `voi`) VALUES(?,?,?,?,?,?,?,?)", (user_id, 0, 0, 0, 0, 0, 0, 0)) + + def all_ids(self, group_id): + """Список айди""" + with self.connection: + return self.cursor.execute(f'SELECT `user_id` FROM `{group_id}`').fetchall() + + def user_exists(self, user_id, group_id): + """Проверяем, есть ли уже пользователь в базе""" + with self.connection: + result = self.cursor.execute(f'SELECT * FROM `{group_id}` WHERE `user_id` = ?', (user_id,)).fetchall() + return bool(len(result)) + + def stat_user(self, user_id, group_id): + """Получение данных пользователя""" + with self.connection: + self.cursor.execute(f"SELECT * FROM `{group_id}` WHERE `user_id` = ?", (user_id,)) + data = self.cursor.fetchone() + return data[1:] + + def del_user(self, group_id, user_id): + """Удаление пользователя""" + with self.connection: + return self.cursor.execute(f'DELETE FROM `{group_id}` WHERE `user_id` = ?', (user_id,)) + + # ЗАКРЫТИЕ ВЫЗОВА + def close(self): + """Закрываем соединение с БД""" + self.connection.close() diff --git a/db/base.db b/db/base.db new file mode 100644 index 0000000..515e7aa Binary files /dev/null and b/db/base.db differ diff --git a/db/groups.db b/db/groups.db new file mode 100644 index 0000000..e69de29 diff --git a/db/month.db b/db/month.db new file mode 100644 index 0000000..e69de29 diff --git a/db/users.db b/db/users.db new file mode 100644 index 0000000..0e31838 Binary files /dev/null and b/db/users.db differ