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)