1

I'm writing a telegram bot on aiogram and I've decided to use MongoDB as database for the project. Unfortunately I'm stuck on the user balance feature. I need to give user a balance and I need to have a possibility to change it.

from aiogram import types
from db import collection
from loader import dp 
from states.balance_state import balance
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher import FSMContext
import motor.motor_asyncio
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import asyncio

storage=MemoryStorage()

@dp.message_handler(text='/balance', state = None)
async def change_balance(message: types.Message):
    await message.answer('Amount')
    await balance.amount.set()

async def check_balance(user_id: int, amount, now_balance):
    try:
        amount = int(amount)
        if now_balance + amount >= 0:
           await change_balance(user_id, amount)
           return True
        elif now_balance + amount < 0:
            return 'no money'
    except Exception:
        return False

@dp.message_handler(state=balance.amount)
async def change_balance(message: types.Message, state: FSMContext):
    user_id = message.chat.id
    answer = message.text
    await state.update_data(amount=answer)
    check_balance = await check_balance(user_id=user_id, amount=answer) 

    now_balance = collection.find_one({"_id" : user_id})["money"]
    new_balance = now_balance + answer
    collection.update_one({"_id" : user_id}, {"$set" : {"money" : new_balance}}) 

    if check_balance == 'no money':
        await message.answer('error ')
        await state.finish
    elif check_balance:
        await message.answer('Success')
        await state.finish
    else:
        await message.answer('error')
        await state.finish

Ive tried different options but none of them seems to work for some reason

Here is code for database

collection = cluster.Mafia_users.user
async def add_user(user_id, username):
    date = datetime.now().date()
    collection.insert_one({
        "_id" : user_id,
        "name" : username,
        "date" : str(date),
        "money" : int(1),
    })

(cluster is connected but i havent add it here for safety purposes)

This is the error that appears in terminal when user writes /balance

FSMStorageWarning: You haven’t set any storage yet so no states and no data will be saved.
You can connect MemoryStorage for debug purposes or non-essential data.
  await state.set_state(self.state)
David Scholz
  • 8,421
  • 12
  • 19
  • 34
TetSigma
  • 11
  • 2

0 Answers0