From c1949ae45f5ebb904b54f61b3b27f609acc46359 Mon Sep 17 00:00:00 2001 From: Kylmakalle Date: Sun, 2 Jul 2017 03:19:07 +0300 Subject: [PATCH] chat and leave commands --- bot.py | 111 ++++++++++++++++++++++++++++--------------------- vk_messages.py | 3 +- 2 files changed, 65 insertions(+), 49 deletions(-) diff --git a/bot.py b/bot.py index 30f2e36..5253700 100644 --- a/bot.py +++ b/bot.py @@ -12,9 +12,7 @@ import wget from PIL import Image from telebot import types -import cherrypy - -from credentials import token, vk_app_id, local_port, bot_url +from credentials import token, vk_app_id from vk_messages import VkMessage, VkPolling logging.basicConfig(format='%(levelname)-8s [%(asctime)s] %(message)s', level=logging.WARNING, filename='vk.log') @@ -25,13 +23,11 @@ vk_dialogs = {} FILE_URL = 'https://api.telegram.org/file/bot{0}/{1}' -tokens_pool = redis.ConnectionPool(host='localhost', port=6379, db=0) -vk_tokens = redis.StrictRedis(connection_pool=tokens_pool) +vk_tokens = redis.from_url(os.environ.get("REDIS_URL")) currentchat = {} bot = telebot.AsyncTeleBot(token) -# bot.remove_webhook() link = 'https://oauth.vk.com/authorize?client_id={}&' \ 'display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,messages,offline,docs,photos,video' \ @@ -110,10 +106,10 @@ def create_markup(message, user, page, edit=False): if edit: bot.edit_message_text( 'Выберите Диалог: {}/{} стр.'.format(page + 1, len(vk_dialogs[str(user)])), - message.chat.id, message.message_id, + message.from_user.id, message.message_id, parse_mode='HTML', reply_markup=markup).wait() else: - bot.send_message(message.chat.id, + bot.send_message(message.from_user.id, 'Выберите Диалог: {}/{} стр.'.format(page + 1, len(vk_dialogs[str(user)])), parse_mode='HTML', reply_markup=markup).wait() @@ -131,7 +127,7 @@ def callback_buttons(call): 'Вы в беседе {}'.format(replace_shields(chat['title']))).wait() if chat['title'].replace('\\', ''): chat['title'] = chat['title'].replace('\\', '') - bot.send_message(call.message.chat.id, + bot.send_message(call.message.from_user.id, 'Вы в беседе {}'.format(chat['title']), parse_mode='HTML').wait() currentchat[str(call.from_user.id)] = call.data @@ -141,7 +137,7 @@ def callback_buttons(call): user = vk.API(session).users.get(user_ids=call.data, fields=[])[0] bot.answer_callback_query(call.id, 'Вы в чате с {} {}'.format(user['first_name'], user['last_name'])).wait() - bot.send_message(call.message.chat.id, + bot.send_message(call.message.from_user.id, 'Вы в чате с {} {}'.format(user['first_name'], user['last_name']), parse_mode='HTML').wait() currentchat[str(call.from_user.id)] = call.data @@ -198,6 +194,43 @@ def info_extractor(info): return info +@bot.message_handler(commands=['chat']) +def chat_command(message): + if str(message.from_user.id) in currentchat: + if 'group' in currentchat[str(message.from_user.id)]: + session = VkMessage(vk_tokens.get(str(message.from_user.id))).session + chat = vk.API(session).messages.getChat(chat_id=currentchat[str(message.from_user.id)].split('group')[1], + fields=[]) + if chat['title'].replace('\\', ''): + chat['title'] = chat['title'].replace('\\', '') + bot.send_message(message.from_user.id, + 'Вы в беседе {}'.format(chat['title']), + parse_mode='HTML').wait() + else: + session = VkMessage(vk_tokens.get(str(message.from_user.id))).session + user = vk.API(session).users.get(user_ids=currentchat[str(message.from_user.id)], fields=[])[0] + bot.send_message(message.from_user.id, + 'Вы в чате с {} {}'.format(user['first_name'], user['last_name']), + parse_mode='HTML').wait() + else: + bot.send_message(message.from_user.id, + 'Вы не находитесь в чате', + parse_mode='HTML').wait() + + +@bot.message_handler(commands=['leave']) +def leave_command(message): + if str(message.from_user.id) in currentchat: + currentchat.pop(str(message.from_user.id), None) + bot.send_message(message.from_user.id, + 'Вы вышли из чата', + parse_mode='HTML').wait() + else: + bot.send_message(message.from_user.id, + 'Вы не находитесь в чате', + parse_mode='HTML').wait() + + @bot.message_handler(commands=['dialogs']) def dialogs_command(message): session = VkMessage(vk_tokens.get(str(message.from_user.id))).session @@ -209,20 +242,20 @@ def dialogs_command(message): def stop_command(message): if not check_thread(message.from_user.id): stop_thread(message) - bot.send_message(message.chat.id, 'Успешный выход!').wait() + bot.send_message(message.from_user.id, 'Успешный выход!').wait() else: - bot.send_message(message.chat.id, 'Вход не был выполнен!').wait() + bot.send_message(message.from_user.id, 'Вход не был выполнен!').wait() @bot.message_handler(commands=['start']) def start_command(message): if check_thread(message.from_user.id): - bot.send_message(message.chat.id, + bot.send_message(message.from_user.id, 'Привет, этот бот поможет тебе общаться ВКонтакте, войди по кнопке ниже' ' и отправь мне то, что получишь в адресной строке.', reply_markup=mark).wait() else: - bot.send_message(message.chat.id, 'Вход уже выполнен!\n/stop для выхода.').wait() + bot.send_message(message.from_user.id, 'Вход уже выполнен!\n/stop для выхода.').wait() def form_request(message, method, info): @@ -264,7 +297,7 @@ def logged(message): if vk_tokens.get(str(message.from_user.id)): return True else: - bot.send_message(message.chat.id, 'Вход не выполнен! /start для входа').wait() + bot.send_message(message.from_user.id, 'Вход не выполнен! /start для входа').wait() return False @@ -498,7 +531,7 @@ def reply_photo(message): try: vk_sender(message, send_photo) except: - bot.send_message(message.chat.id, 'Фото слишком большое, максимально допустимый размер *20мб*!', + bot.send_message(message.from_user.id, 'Фото слишком большое, максимально допустимый размер *20мб*!', parse_mode='Markdown').wait() @@ -531,25 +564,26 @@ def reply_text(message): try: verifycode(code) create_thread(message.from_user.id, code) - bot.send_message(message.chat.id, 'Вход выполнен!').wait() + bot.send_message(message.from_user.id, 'Вход выполнен!').wait() # ---------------- INSTRUCTIONS ---------------- # - bot.send_message(message.chat.id, 'Бот позволяет получать и отвечать на текстовые сообщения' - ' из ВКонтакте\nПример личного сообщения:').wait() - bot.send_message(message.chat.id, '*Иван Петров:*\nПривет, я тут классный мессенджер нашёл,' - ' попробуешь? telegram.org/download', parse_mode='Markdown').wait() - bot.send_message(message.chat.id, 'Для сообщений из групповых чатов будет указываться' - ' чат после имени отправителя:').wait() - bot.send_message(message.chat.id, '*Ник Невидов @ My English is perfect:*\n' - 'London is the capital of Great Britain', + bot.send_message(message.from_user.id, 'Бот позволяет получать и отвечать на текстовые сообщения' + ' из ВКонтакте\nПример личного сообщения:').wait() + bot.send_message(message.from_user.id, '*Иван Петров:*\nПривет, я тут классный мессенджер нашёл,' + ' попробуешь? telegram.org/download', parse_mode='Markdown').wait() - bot.send_message(message.chat.id, 'Чтобы ответить, используй Reply на нужное сообщение.' - ' (нет, на эти не сработает, нужно реальное)', + bot.send_message(message.from_user.id, 'Для сообщений из групповых чатов будет указываться' + ' чат после имени отправителя:').wait() + bot.send_message(message.from_user.id, '*Ник Невидов @ My English is perfect:*\n' + 'London is the capital of Great Britain', + parse_mode='Markdown').wait() + bot.send_message(message.from_user.id, 'Чтобы ответить, используй Reply на нужное сообщение.' + ' (нет, на эти не сработает, нужно реальное)', parse_mode='Markdown').wait() # ---------------- INSTRUCTIONS ---------------- # except: - bot.send_message(message.chat.id, 'Неверная ссылка, попробуй ещё раз!').wait() + bot.send_message(message.from_user.id, 'Неверная ссылка, попробуй ещё раз!').wait() else: - bot.send_message(message.chat.id, 'Вход уже выполнен!\n/stop для выхода.').wait() + bot.send_message(message.from_user.id, 'Вход уже выполнен!\n/stop для выхода.').wait() return try: @@ -560,21 +594,4 @@ def reply_text(message): print('Error: {}'.format(traceback.format_exc())) -# bot.polling(none_stop=True) -class WebhookServer(object): - # index равнозначно /, т.к. отсутствию части после ip-адреса (грубо говоря) - @cherrypy.expose - def index(self): - length = int(cherrypy.request.headers['content-length']) - json_string = cherrypy.request.body.read(length).decode("utf-8") - update = telebot.types.Update.de_json(json_string) - bot.process_new_updates([update]) - return '' - - -if __name__ == '__main__': - bot.remove_webhook() - bot.set_webhook('https://{}/{}/'.format(bot_url, token)) - cherrypy.config.update( - {'server.socket_host': '127.0.0.1', 'server.socket_port': local_port, 'engine.autoreload.on': False}) - cherrypy.quickstart(WebhookServer(), '/', {'/': {}}) +bot.polling(none_stop=True) diff --git a/vk_messages.py b/vk_messages.py index 09de34d..07586b2 100644 --- a/vk_messages.py +++ b/vk_messages.py @@ -6,8 +6,7 @@ import traceback import vk import wget -tokens_pool = redis.ConnectionPool(host='localhost', port=6379, db=0) -vk_tokens = redis.StrictRedis(connection_pool=tokens_pool) +vk_tokens = redis.from_url(os.environ.get("REDIS_URL")) class VkPolling: