Exemplo n.º 1
0
def callbackapi(request):
    body_unicode = request.body.decode('utf-8')
    body = json.loads(body_unicode)

    if body['type'] == 'confirmation':

        return HttpResponse(settings.VK_CONFIRMATION_KEY) # подтверждение запроса от вк

    elif body['type'] == 'message_new':
        user_id = body['object']['user_id'] # получить id пользователя
        body = body['object']['body'] # получить тело сообщения
        reply_body =  '' # возвращаемое сообщение
        reply_delimeters = '' # возвращаемый разделитель

        user_context = redis_connection.get( 'vk:{user_id}'.format(user_id=user_id) ) # получить предыдущий контекст сохраненный в redis
        if user_context is not None:
            context = json.loads( user_context.decode("utf-8") ) # если контекст существует в бд, то десериализовать его в объект
        else:
            context = {'status': 'clear', 'messages': []} # иначе создать новый объект контекста

        if body.lower().strip() == 'привет' and context['status'] != 'record': # если введена команда привет и до это не было команды начать запись
            context['status'] = 'new' # установить статус
            context['messages'] = [] # установить пустой массив сообщений
            reply_delimeters = 'Запись началась.' # вернуть ответ о начале записи

        elif body.lower().strip() == 'пока': # если введена команда пока
            context['status'] = 'closed' # установить статус закрыто
            reply_delimeters = 'Запись завершена.' # вернуть запись завершена

        if context['status'] == 'record': # если статус record
            context['messages'].append(body) # добавить сообщение в массив messages в контексте
            message = Message(
                user_id = user_id,
                body = body,
                source = Message.SOURCE_VK
            )
            message.save() # сохранить запись в вк
        elif context['status'] == 'new': # если статус new
            if context.get('count'): # если в контексте есть кол-во слов
                reply_body = 'В прошлом диалоге было {count} слов.'.format(count=context['count']) # вернуть кол-во слов
                del context['count'] # удалить кол-во слов из контекста
            context['status'] = 'record' # установить статус запись
        elif context['status'] == 'closed': # если статус closed
            messages = context['messages']
            count = 0
            for message in messages: # посчитать кол-во слов
                count += len(message.strip().split(' '))
            context['count'] = count
            context['status'] = 'unknown' # установить статус unknown
        elif context['status'] == 'clear': # если статус clear
            reply_body = 'Для начала диалога напишите мне Привет, а для окончания Пока' # вернуть сообщение
        elif context['status'] == 'unknown': # если статус unknown
            reply_body = 'Для начала диалога напишите мне Привет' # вернуть сообщение

        redis_connection.set( 'vk:{user_id}'.format(user_id=user_id), json.dumps( context ) ) # сохранить контекст в redis

        api.message_send(reply_delimeters + "\n" + reply_body, user_id) # написать пользователю сформированный ответ

        return HttpResponse('ok') # вернуть ответ вк, чтобы он не повторял запросы
Exemplo n.º 2
0
Arquivo: bot.py Projeto: BON4/telbot
def do_echo(update: Update, context: CallbackContext):
    chat_id = update.message.chat_id
    text = update.message.text

    print("Echo")

    profile, _ = Profile.objects.get_or_create(
        telegram_id=chat_id,
        defaults={
            'name': update.message.from_user.username,
        })

    m = Message(
        profile=profile,
        text=text,
    )
    m.save()

    reply_text = f'Profile ID: {chat_id}\nText: {text}\nMessage ID: {m.pk}'
    update.message.reply_text(text=reply_text)
Exemplo n.º 3
0
Arquivo: bot.py Projeto: BON4/telbot
def button(update: Update, context: CallbackContext):
    query = update.callback_query
    chat_id = update.callback_query.message.chat_id
    name = update.callback_query.message.chat.username

    profile, _ = Profile.objects.get_or_create(telegram_id=chat_id,
                                               defaults={
                                                   'name': name,
                                               })

    store = Store.objects.get(id=int(query.data), )

    m = Message(
        profile=profile,
        text='Зарезервировано',
        store=store,
    )
    m.save()

    query.edit_message_text(text="Selected option: {}".format(query.data))
Exemplo n.º 4
0
    def get_context(self, bot, update, **kwargs):
        user_id = update.message.chat.id  # id пользователя
        body = update.message.text  # тело сообщения
        reply_body = ''

        user_context = redis_connection.get(
            'telegram:{user_id}'.format(user_id=user_id)
        )  # получить предыдущий контекст сохраненный в redis
        if user_context is not None:
            context = json.loads(
                user_context.decode("utf-8")
            )  # если контекст существует в бд, то десериализовать его в объект
        else:
            context = {
                'status': 'clear',
                'messages': []
            }  # иначе создать новый объект контекста

        if context['status'] == 'record':  # если статус record
            context['messages'].append(
                body)  # добавить сообщение в messages в объекте контекст
            message = Message(user_id=user_id,
                              body=body,
                              source=Message.SOURCE_TELEGRAM)
            message.save()  # сохранить в базу данных сообщение
            reply_body = 'Записал: {body}'.format(
                body=body)  # ответное сообщение после сохранения
        elif context['status'] == 'clear':  # если статус clear
            reply_body = 'Для начала диалога напишите мне /hello, а для окончания /bye'  # ответное сообщение с уведомлением
        elif context['status'] == 'closed':  # если статус clear
            reply_body = 'Для начала диалога напишите мне /hello'  # ответное сообщение с уведомлением

        redis_connection.set('telegram:{user_id}'.format(user_id=user_id),
                             json.dumps(context))  # сохранить контекст в redis

        response = {
            self.context_object_name: reply_body
        }  # переопределение контекста шаблона

        return response