@Gleen_Ri

Как лучше сделать функцию прибавления +30 в бд, так чтобы при 2 пользователях не вис код, и не ждал окончания цикла?

Приветствую, имея проблему которую изучал неделю так и не поняв пишу сюда, пишу бота игрушку чтобы просто разобраться в программировании... И проблема в том что я никак не могу понять как функцию mine которая прибавляет +30 сделать автономной от кода, потому что имеется проблема что когда 2 пользователя ее прописывают то код просто зацикливается на выполнении 1 функции и забивает на другие, хотя когда 1 пользователь то все нормально работает

import config
import sqlite3
import random
import time
import peewee

import multiprocessing
from select import select
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import asyncio,time
import threading
from multiprocessing import Pool
from concurrent.futures import ThreadPoolExecutor
from time import sleep
from threading import Thread





from peewee import *
db = SqliteDatabase('database1.db')
class User(Model):
    user_id = TextField()
    balance = IntegerField(default=6000)
    s9 = IntegerField(default=0)
    s10 = IntegerField(default=0)
    s11 = IntegerField(default=0)

    class Meta:
        database = db
        db_table = 'users'
User.create_table()
def does_it_exist(model, instance):
    exits = model.select().where(model.user_id == instance)
    if not bool(exits):
        return True
    else:
        return False

def reg_DB(uid):
    if not does_it_exist(User, uid):
        user = User.get(User.user_id == uid)
        user.save()

    else:
        print('I')
        usersDB = User(user_id = uid)
        usersDB.save()


bot = Bot(config.TOKEN)
dp = Dispatcher(bot)
import threading




@dp.message_handler(commands=['start'])
async def start(message):
   await reg_DB(message.from_user.id)
   await bot.send_message(message.chat.id, 'Привет, это чат игра про криптовалюту! Попробуй!')
   await bot.send_message(message.chat.id, 'Напишите мне что хотите выбрать: меню, Магазин, Баланс, /mine')



@dp.message_handler(commands=['/mine'])
async def mine(message):

    reg_DB(message.from_user.id)
    user = User.get(User.user_id == message.from_user.id)
    balance = User.get(User.user_id == message.from_user.id).balance
    s9 = User.get(User.user_id == message.from_user.id).s9
    s10 = User.get(User.user_id == message.from_user.id).s10
    await bot.send_message(message.chat.id, 'GleenCoin Welcome')

    if s9 > 0:
        await  bot.send_message(message.chat.id, 'Start.mining S9 "True" ')
        await bot.send_message(message.chat.id, 'Wallet:')
        await  bot.send_message(message.chat.id, user.user_id)
        while (True):
            user.balance += user.s9 * 30
            time.sleep(30)
            user.save()


    else:
        await bot.send_message(message.chat.id, 'Error, s9 not founded')
    if s10 > 0:
        await   bot.send_message(message.chat.id, 'Start.mining S10 "True" ')
        await  bot.send_message(message.chat.id, 'Wallet:')
        await  bot.send_message(message.chat.id, user.user_id)
        while (True):
            user.balance += user.s10 * 60
            time.sleep(30)
            user.save()

    else:
        await   bot.send_message(message.chat.id, 'Error, s 10 not founded')


@dp.message_handler(func=lambda message: message.text == "магазин")
async def shop(message):
    await  reg_DB(message.from_user.id)
    await  bot.send_message(message.chat.id, 'Добро пожаловать в магазин! :) ')
    await  bot.send_message(message.chat.id, 'Чтобы купить напишите мне название ПРИМЕР: "S9"')
    await   bot.send_message(message.chat.id, 'В наличии "S9 (30 рублей в 40 секунд) Цена: 3000')
    await   bot.send_message(message.chat.id, 'В наличии "S10 (60 рублей в 40 секунд) Цена: 6.000')
    await  bot.send_message(message.chat.id, 'В наличии "S11 (100 рублей в  40 секунду) Цена: 10.000')



@dp.message_handler(func=lambda message: True)
async def message_variant_2(message):
    reg_DB(message.from_user.id)
    user = User.get(User.user_id == message.from_user.id)
    balance = User.get(User.user_id == message.from_user.id).balance
    s9 = User.get(User.user_id == message.from_user.id).s9
    s10 = User.get(User.user_id == message.from_user.id).s10

    if 'S9' in message.text:
        if user.balance >= 3000:
            user.balance -= 3000
            user.s9 += 1
            await bot.send_message(message.chat.id,'Поздравляю с покупкой!')
            await bot.send_message(message.chat.id, 'Количество асиков S9')
            await bot.send_message(message.chat.id, 'Чтобы майнить /mine')
            await bot.send_message(message.chat.id, user.s9)
            await bot.send_message(message.chat.id, user.balance)
            await  print(message.from_user.id, 'Кол-во', user.s9, user.balance)
            user.save()
        else:
            await   bot.send_message(message.chat.id,'Недостаточно средств!')
    if 'S10' in message.text:
        if user.balance >= 6000:
            user.balance -= 6000
            user.s10 += 1
            await bot.send_message(message.chat.id, 'Поздравляю с покупкой!')
            await  bot.send_message(message.chat.id, 'Количество асиков S10')
            await  bot.send_message(message.chat.id, user.s10)
            await  bot.send_message(message.chat.id, 'Чтобы майнить /mine')
            user.save()

        else:
            await bot.send_message(message.chat.id,'Недостаточно средств!')





    if 'Баланс' in message.text:
        user = User.get(User.user_id == message.from_user.id)
        balance = User.get(User.user_id == message.from_user.id).balance
        s9 = User.get(User.user_id == message.from_user.id).s9
        s10 = User.get(User.user_id == message.from_user.id).s10
        await  bot.send_message(message.chat.id, 'Ваш баланс: ' )
        await  bot.send_message(message.chat.id, user.balance)
        await   bot.send_message(message.chat.id, 'Количество Асиков S9: ')
        await   bot.send_message(message.chat.id, user.s9)
        await   bot.send_message(message.chat.id, 'Количество Асиков S10: ')
        await   bot.send_message(message.chat.id, user.s10)

    else:
        await  bot.send_message(message.chat.id,'Не знаю ответа ;) ')








if __name__ == '__main__':
    executor.start_polling(dp)

print('bot_enable')
bot.polling(none_stop=True)
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Учи, как работает асинхронное программирование.
Если на пальцах: всякий раз, когда ты делаешь await чтототам, выполнение асинхронной функции (вроде обработчика события) приостанавливается, и передаётся другой.
А вот код в промежутке между await вызовами (ну или началом-концом функции) выполняется непрерывно, и занимает поток управления. Пока этот код выполняется, остальной бот стоит!
Теперь посмотри что у тебя:
while (True):
            user.balance += user.s9 * 30
            time.sleep(30)
            user.save()

time.sleep() понятия не имеет про асинхронность, и не отдаёт управление другим асинхронным функциям. Поэтому пока она выполняется, остальной бот стоит.
Да, даже для одного пользователя.

Как минимум, нужно исправить две вещи.
1. используй await asyncio.sleep() вместо time.sleep(). asyncio.sleep() знает про асинхронность, и приостановит функцию с передачей управления, т.е. бот сможет делать что-то ещё пока эта функция ждёт.
2. while (True) - это не тру. Предусмотри код выхода из цикла! Или по максимальному числу итераций, или по команде, или по смене статуса пользователя... или по всему вышеперечисленному.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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