Bot para VKontakte MDB (proyecto escolar y proyecto para el concurso de trabajos de diseño de toda Rusia)

¡Hola, Habr! Quiero contarles sobre mi proyecto de investigación, en el que creé un bot de juego para VKontakte.





¡Ahtung!

No soy un desarrollador profesional, soy un estudiante ordinario de noveno grado al que a veces le encanta codificar en idiomas completamente diferentes. Aquí solo estoy hablando de mi proyecto y mi experiencia de participar en un concurso de diseño.





Este artículo no es una guía paso a paso para crear un bot para VKontakte; hay suficientes tanto en Habré como más allá.





¿Qué tipo de proyecto?

, ( ~670 ), . , , , , . 670 .





, . , , , , , , - .





" ", , ( ) , , , . , .





?

, , ( , ).





, . . , . , 24 ( , ), , . , . , . ( - 4).





, 6 , - , .





!

Python vkbottle. CallBack API, aiohttp.





bot.py , ( 4 ), blueprint', .





import pathlib

import aiohttp
import aiohttp_jinja2
import jinja2
from aiohttp import web

import utils.consts
from config import SECRET, WEBHOOK_ACCEPT, CONFIRMATION_TOKEN
from routes import actions, admin_realize, global_admin_realize, users_realize, economic_realize
from utils.db_methods import init_database
from middlewares import ExpMiddleware # dead import for include middleware

INDEX_DIR = str(pathlib.Path(__file__).resolve().parent) + '/index_page'

utils.consts.BOT.loop.run_until_complete(init_database())
utils.consts.BOT.set_blueprints(
    actions.bp, admin_realize.bp, global_admin_realize.bp,
    users_realize.bp, economic_realize.bp
)

APP = aiohttp.web.Application()
ROUTES = aiohttp.web.RouteTableDef()

if not WEBHOOK_ACCEPT:
    aiohttp_jinja2.setup(APP, loader=jinja2.FileSystemLoader(str(INDEX_DIR)))
    APP.router.add_static('/static/',
                          path=str('./index_page/'),
                          name='static')


@ROUTES.get("/")
@aiohttp_jinja2.template('index.html')
async def hello(request):
    """Root site response"""
    return {}


@ROUTES.get("/when_update")
@aiohttp_jinja2.template('whenupdate.html')
async def whenupdate(request):
    """When update site response"""
    return {}
      
      



config.py, , . .env dotenv .





import os

from dotenv import load_dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(dotenv_path):
    load_dotenv(dotenv_path)

# Loading token from .env
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
SECRET = os.getenv("SECRET")
USER_ACCESS_TOKEN = os.getenv("USER_ACCESS_TOKEN")
WEBHOOK_ACCEPT = bool(int(os.getenv("WEBHOOK_ACCEPT", 0)))
CONFIRMATION_TOKEN = os.getenv("CONFIRMATION_TOKEN")
NEW_START = bool(int(os.getenv("NEW_START", 0)))
ADMINS_IN_CONV = list(map(int, os.getenv("ADMINS_IN_CONV").split(',')))
      
      



, .





5 : ( ), (, /profile), (, / ), (, / , , , - , , , ), ( , .).





routes:





:





@bp.on.message_handler(AccessForAllRule(), Registered(), text="/_ <c_id>")
async def buy_car(message: Message, user: User, c_id: str = None):
    if c_id.isdigit():
        c_id = int(c_id)
        car = await Car.get(id=c_id)

        buy_car_user_status = status_on_buy_car(user, car)

        if buy_car_user_status == BuyCarUserStatuses.APPROVED:
            chat = await Conversation.get(peer_id=message.peer_id)
            await User.get(user_id=message.from_id, chat=chat).update(
                coins=user.coins - car.cost, car=car
            )

            await message(f" {car} !")
        elif buy_car_user_status == BuyCarUserStatuses.NOT_ENOUGH_MONEY:
            await message("   !")
        elif buy_car_user_status == BuyCarUserStatuses.NOT_ENOUGH_EXP:
            await message("   !")
        else:
            await message("    !")
    else:
        await message(" -ID !")
      
      



blueprint', "" .





, , status_on_buy_car, , , , .





utils main.py. , , , raise' .





def status_on_buy_car(user: User, car: Car) -> BuyCarUserStatuses:
    if user.coins >= car.cost and user.exp >= car.exp_need and user.car is None:
        return BuyCarUserStatuses.APPROVED
    elif user.coins < car.cost:
        return BuyCarUserStatuses.NOT_ENOUGH_MONEY
    elif user.exp < car.exp_need:
        return BuyCarUserStatuses.NOT_ENOUGH_EXP
    else:
        return BuyCarUserStatuses.NOW_HAVE_CAR
      
      



Tortoise ORM, ( , ?), .





?

, , . , , , , , , 0 .





, , , , , , ( ). .





- , . , , .





PD

Estoy abierto a las críticas en los comentarios, un agradecimiento especial por ello, porque es una crítica, tal vez incluso muy dura, tal vez incluso con un artículo minimizado, lo que me ayudará a desarrollarme como desarrollador y creador de artículos sobre Habré.





Bot en GitHub








All Articles