@gelugu

Бот на python vk api. Как отправлять сообщения только один раз?

Есть код бота, в целом работа его устраивает. Но не могу закончить, как сделать, чтоб пользователю не отправлялись похожие сообщения?
Вот файл, описывающий методы связанные с отправкой сообщений (damerau_levenshtein_distance - это для опечаток, в данном вопросе не важно):

import vkapi
import os
import importlib
from command_system import command_list


def damerau_levenshtein_distance(s1, s2):
    d = {}
    lenstr1 = len(s1)
    lenstr2 = len(s2)
    for i in range(-1, lenstr1 + 1):
        d[(i, -1)] = i + 1
    for j in range(-1, lenstr2 + 1):
        d[(-1, j)] = j + 1
    for i in range(lenstr1):
        for j in range(lenstr2):
            if s1[i] == s2[j]:
                cost = 0
            else:
                cost = 1
            d[(i, j)] = min(
                d[(i - 1, j)] + 1,  # deletion
                d[(i, j - 1)] + 1,  # insertion
                d[(i - 1, j - 1)] + cost,  # substitution
            )
            if i and j and s1[i] == s2[j - 1] and s1[i - 1] == s2[j]:
                d[(i, j)] = min(d[(i, j)], d[i - 2, j - 2] + cost)  # transposition
    return d[lenstr1 - 1, lenstr2 - 1]


def load_modules():
    files = os.listdir("mysite/commands")
    modules = filter(lambda x: x.endswith('.py'), files)
    for m in modules:
        importlib.import_module("commands." + m[0:-3])


def get_answer(body):
    attachment = ''
    distance = len(body)
    command = None
    for c in command_list:
        for k in c.keys:
            d = damerau_levenshtein_distance(body, k)
            if d < distance:
                distance = d
                command = c
                if distance == 0:
                    attachment = c.process()
                return attachment
    if distance < len(body)*0.4:
        attachment = command.process()
    return attachment


def create_answer(data, token):
    load_modules()
    user_id = data['user_id']
    message, attachment = get_answer(data['body'].lower())
    vkapi.send_message(user_id, token, message, attachment)


Задача такова:
есть список команд (2), пользователь может отправить только запросы на эти команды. И бот отвечает заготовленные ответы. Здесь всё хорошо и работает.
Надо дополнить таким образом, чтобы на каждую команду бот отвечал только раз, а потом просто игнорировал пользователя.

Знаю, что можно использовать методы messages.get и messages.search, но не понимаю, как их применить в этой задаче.
Подскажите куда копать...
  • Вопрос задан
  • 1807 просмотров
Решения вопроса 1
@trofimovdev
Python
Записывать id пользователя и все сообщения проверять на наличия юзера в базе.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы