Python telegram bot, how to store and show users data for each users?

Question:

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)
Asked By: Falubii

||

Answers:

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

I get email from user and i save it in a tuple:)
I want to show user data just for themselves ‍ ️
my bot actually shows to every one. can anyone lep

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

Answered By: Falubii