@maclinchy

Как избежать конфликт пользователей? Как создать N объектов?

Ситуация такая: есть чат-бот, для однго человека работает хорошо, а вот для двух, начинаются проблемы. Один начал раньше другого, второй пытается что-то написать, но бот реагирует на нажатия второго и пишет их первому. Подозреваю, что надо для каждого пользователя создавать новый объект, но как это сделать, не понимаю.

Файл main.py:
# -*- coding: utf-8 -*-
import bot
import vk_api
import time
from os import listdir
import json

vk = vk_api.VkApi(token = '')
vk._auth_token()
values = {'out':0, 'count':100, 'time_offset':60}

def auth(user_id_):   # DONE
    #if user_in_group(user_id_):
    user_id = user_id_
    data_base = listdir('/workdir/data_base')
    name_file = str(user_id)+".json"
    values_for_user = {
                        "fac": None,
                        "id": user_id_,
                        "answers": [0,0,0,0,0,0,0,0,0,0,0,0,0]
                      }
    PATH = '/workdir/data_base/'
    bot_ = 0

    if name_file in data_base:
        print('File exist...')
        print('Authorization success for '+str(user_id))
    else:
        print('Creating json_file for '+str(user_id))
        with open(PATH+name_file, "w+") as file:
            json.dump(values_for_user, file)
        file.close()
        print('File for '+ str(user_id) +' has been created!')
        bot_ = bot.Bot(vk, values, user_id_)
    # else:
        # print('Authorization for '+srt(user_id_)+' failed!')

while True:
    response = vk.method('messages.get', values)

    if response['items']:  # если items не пусто
        values['last_message_id'] = response['items'][0]['id']

    for item in response['items']:
        # bot.send_message(item['user_id'], 'Hello')
        if response['items'][0]['body'] == '1':
            auth(item['user_id'])

            # bot.main_menu(item['user_id'])
        # else:
            #bot.send_message(item['user_id'], 'What?')

    time.sleep(1)


Файл bot.py:
# -*- coding: utf-8 -*-
# import neural_net
import json
import numpy as np
from os import listdir

class Bot:

    vk_token = 0
    vk_values = 0

    def __init__(self, vk_, values_, user_id_): #DONE
        self.vk_token = vk_
        self.vk_values = values_
        self.main_menu(user_id_)

    def check_f(self, user_id_):    # DONE
        user_id = user_id_
        data_base = listdir('/workdir/data_base')
        name_file = str(user_id)+'.json'
        PATH = '/workdir/data_base/'

        # self.auth(user_id_)

        with open(PATH+name_file, "r") as file:
            user_file = json.load(file)

        if user_file['fac'] == None:
            print('No fac!')
            return True
        else:
            print(str(user_id)+' has been already sorted!')
            return False
        # print(user_file['fac'])

    def get_message(self): #DONE
        res = self.vk_token.method('messages.get', self.vk_values)

        if res['items']:
            self.vk_values['last_message_id'] = res['items'][0]['id']

        return res

    def send_message(self, user_id_, msg): #DONE
        self.vk_token.method('messages.send', {'user_id':user_id_, 'message':msg})

    def main_menu(self, user_id_): #DONE

        PATH = '/workdir/data_base/'
        name_file = 'main_menu.txt'
        menu = open(PATH + name_file, "r")
        self.send_message(user_id_, menu)
        # self.auth(user_id_)

        while True:
            response = self.get_message()

            for item in response['items']:
                if response['items'][0]['body'] == '1':
                    self.sort(user_id_)
                    return False
                elif response['items'][0]['body'] == '2':
                    self.faq(user_id_)
                    return False
                else:
                    self.send_message(user_id_, 'What?')

    def faq(self, user_id_):
        # TODO
        # по ключевым словам нейросеть должна выдавать
        # предположение о вопросе и
        # предпологаемый ответ
        self.send_message(user_id_, 'faq')

    def sort(self, user_id_):
        # TODO
        # прогнать ответы через сеть
        # удалить ответы из json_file
        # поставить отметку о сортировке в json_file пользователя
        if self.check_f(user_id_):

            self.send_message(user_id_, 'sort')
            name_file = str(user_id_)+".json"
            PATH = '/workdir/data_base/'

            response_ = self.get_message()
            last_id = 0

            for item in response_['items']:
                last_id = response_['items'][0]['id']

            id_ = last_id
            i = 0

            with open(PATH+name_file, "r+") as file:
                json_file = json.load(file)

            x = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0]])

            while i < 13:
                self.send_message(user_id_, 'Question N '+str(i+1))

                while id_ == last_id:
                    #print('Now in while')
                    new_id = self.vk_token.method('messages.get', self.vk_values)
                    #print(new_id['items'][0]['id'])
                    if new_id['items']:
                        last_id = new_id['items'][0]['id']

                res = self.get_message()

                with open(PATH+name_file, "r+") as file:
                    user_file = json.load(file)


                a = 0

                for item in res['items']:
                    a = res['items'][0]['body']

                user_file['answers'][i] = int(a)

                # print(user_file['answers'][0][str(i+1)])

                with open(PATH+name_file, "w") as file:
                    json.dump(user_file, file)

                print('Question N'+str(i+1))
                print(user_file)
                id_ = last_id
                i += 1

            #tmp = json_file['fac']
            #user_file['fac'] = 'S'

            with open(PATH+name_file, "w") as file:
                json.dump(user_file, file)

            return False

        else:
            self.send_message(user_id_, 'You have been already sorted!')
            # return False - сразу перекидывает в меню

    # def user_in_group(self, user_id_): # MAYBE DONE
        # TODO
        # Сделать проверку
        # Состоит ли пользователь в данной группе
        # Если нет, то сказать ему об этом, и закончить разговор
        # Если да, то разрешить ему пользоваться ботом
        # response = self.vk_token.method('groups.getMembers',
                                            # {'group_id':storms_ahead}

        # for item in response['items']:
            # if item == user_id_: # может и прокатит
                # return True
            # else:
                # self.send_message(user_id_, "You're not here!")
                # return False
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ответы на вопрос 1
DarkWizardUa
@DarkWizardUa
Математик, кодер
answers=[0]*n
#это тоже самое, что и
answers=[0,0,0,...,0]
#где эти "..." это еще 0 и вообщем их n
Ответ написан
Ваш ответ на вопрос

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

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