skip to Main Content

Hello I am new one for python and telegram api so i have some questions. I am creating telegram bot(python telegram api) with users profile. I have created database(mysql.connector) and store there all users info after registration. Also i have created user class. When user types /start i am checking if it exists, if it is, i am filling this class. Then i use this class to show some profile information(photo, name, age, etc.) if users click on button(my profile). So the problem is when i have 2-users at the same time. First typed "/start" and logged in, wanna watch self profile, everything fine. But when second user do the same, i got that the first users when clicked on (my profile), he or she got the last one profile who typed "/start" loaded for both users. How to fix this? Solution to check and load data all the time sounds not good, i’d like to do smth with "class Users", but i don’t know to make it uniq for each users session. Any solutions? If it’s needed i can give more code, just ask.

class Users:
def __init__(self, id=0, name='', age=0, gender='', balance=0, telegram_id=0, photo='', sallarytext=0, sallaryvideo=0, videocall=0):
    self.id = id
    self.name = name
    self.age = age
    self.gender = gender
    self.balance = balance
    self.telegram_id = telegram_id
    self.photo = photo
    self.sallarytext = sallarytext
    self.sallaryvideo = sallaryvideo
    self.videocall = videocall


user = Users()


def check_auth(connection, telegram_id):
cursor = connection.cursor()
result = None
try:
    cursor.execute("SELECT * FROM users WHERE telegram_id = '%s'" % telegram_id)
    result = cursor.fetchall()
    data = []
    if result:
        for row in result:
            user.id = row[0]
            user.name = row[1]
            user.age = row[2]
            user.gender = row[3]
            user.telegram_id = row[4]
            user.balance = row[5]
            data = [user.name]
        if user.gender == 'Female':
            cursor.execute("SELECT * FROM photos WHERE users_id = '%s'" % user.id)
            result2 = cursor.fetchall()
            for row in result2:
                user.photo = row[1]
                user.sallarytext = row[2]
                user.sallaryvideo = row[3]
                user.videocall = row[4]
        return data
except Error as e:
    print(f"The error '{e}' occurred")


@bot.message_handler(commands=['start'])
def check_reg(message):
    if message.chat.type == 'private':
        telegram_id = message.from_user.id
        # create_db_users(connection)
        # create_db_photos(connection)
        # create_db_chats(connection)
        data_user = check_auth(connection, telegram_id)
        if not data_user:
            new_user(message) # user registration
        else:
            if user.gender == 'Male':
                default_user_keybord(message) # show user keybord
            elif user.gender == 'Female':
                default_model_keybord(message)


def show_profile(message): # funtion show profile when user click on "My profile" button
        profile_text = "ProfilennYour name: " + user.name + "nYour age: " + str(
            user.age)
        menu_keybord = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
        button_name_age = types.KeyboardButton(text="🗣 Change name/age")
        button_back = types.KeyboardButton(text="◀️ Return")
        menu_keybord.add(button_name_age, button_back)
        bot.send_message(message.chat.id, profile_text, reply_markup=menu_keybord)

2

Answers


  1. Chosen as BEST ANSWER

    I have fixed this by doing request to the database, getting data and pushing it to class, then closing connection with database and showing to user


  2. Could you tell me what telegram api package you are using exactly?

    The core of your problem, I think, is the use of a global variable user to store user data. It would be best practice to instantiate and return a new Users every time you call check_auth.

    That being said,

    1. in Python, if you want to update a global variable, say user, you have to use the statement global user before you do so;
    2. consider using an ORM such as SQLAlchemy to spare you some headaches and code.

    Let me know if that solved your issue.

    C

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search