backend + telegram: добавлено создание персонажа

This commit is contained in:
2022-11-19 01:31:35 +03:00
parent 2bc6931525
commit 194b5aaff1
11 changed files with 291 additions and 51 deletions

View File

@@ -8,6 +8,13 @@ with open("textsouls/config.json") as config_file:
class Backend:
base_url = config_data["BACKEND_SETTINGS"]["BASE_URL"]
def get(self, relative_url):
try:
response = requests.get(f"{self.base_url}{relative_url}")
return {"error": None, "response": response}
except Exception as err:
return {"error": err}
def post(self, relative_url, data):
try:
response = requests.post(

View File

@@ -0,0 +1,105 @@
from aiogram import Router
from aiogram.filters import Command
from aiogram.fsm.state import StatesGroup, State
from common import backend
from keyboards.common import row_kb
router = Router()
available_races = {}
available_classes = {}
class CharachterCreation(StatesGroup):
choosing_race = State()
choosing_class = State()
choosing_name = State()
creation_ending = State()
@router.message(Command(commands=["createchar"]))
async def character_creation(message, state):
global available_races
result = backend.get("/character_races")
if not result["error"] and result["response"].status_code == 200:
for race in result["response"].json():
available_races[race["name"]] = race["id"]
await message.answer(
text="Выбери расу:",
reply_markup=row_kb(available_races.keys()),
)
await state.set_state(CharachterCreation.choosing_class)
@router.message(CharachterCreation.choosing_class)
async def race_chosen(message, state):
if not available_races.get(message.text):
await message.answer(
text="Хм, такую не знаю.\nПопробуй из вариантов ниже:",
reply_markup=row_kb(available_races),
)
else:
await state.update_data(chosen_race=message.text)
global available_classes
result = backend.get("/character_classes")
if not result["error"] and result["response"].status_code == 200:
for char_class in result["response"].json():
available_classes[char_class["name"]] = char_class["id"]
await message.answer(
text="А теперь выбери класс:",
reply_markup=row_kb(available_classes.keys()),
)
await state.set_state(CharachterCreation.choosing_name)
@router.message(CharachterCreation.choosing_name)
async def class_chosen(message, state):
if not available_classes.get(message.text):
await message.answer(
text="Хм, такой не знаю.\nПопробуй из вариантов ниже:",
reply_markup=row_kb(available_classes),
)
else:
await state.update_data(chosen_class=message.text)
await message.answer(
text=f"Ну, неплохо.\nА зовут-то тебя как, {message.text.lower()}?",
reply_markup="",
)
await state.set_state(CharachterCreation.creation_ending)
@router.message(CharachterCreation.creation_ending)
async def name_chosen(message, state):
name = message.text
user_elections = await state.get_data()
new_character = {
"owner": message.from_user.id,
"name": name,
"character_race": available_races[user_elections["chosen_race"]],
"character_class": available_classes[user_elections["chosen_class"]],
}
result = backend.post("/characters", new_character)
if not result["error"] and result["response"].status_code == 200:
await message.answer(
text="Так и запишем.\nТеперь постарайся не умереть",
reply_markup="",
)
await state.clear()
else:
await message.answer(
text="Что-то пошло не так!\nДавай-ка по-новой",
)
await state.set_state(CharachterCreation.choosing_race)
await character_creation(message, state)

View File

@@ -0,0 +1,38 @@
from aiogram import Router
from aiogram.filters import Command
from common import backend
from handlers.character_creation import CharachterCreation
from handlers.character_creation import character_creation
router = Router()
@router.message(Command(commands=["start"]))
async def start(message, state):
tg_user = message.from_user
ts_user = {
"id": tg_user.id,
"first_name": tg_user.first_name,
"last_name": tg_user.last_name,
"username": tg_user.username,
}
result = backend.post("/users", ts_user)
if not result["error"]:
response_code = result["response"].status_code
if response_code == 200:
await message.reply("Привет, скиталец!", reply_markup="")
await state.set_state(CharachterCreation.choosing_race)
await character_creation(message, state)
elif response_code == 400:
await message.reply("Добро пожаловать! Снова")
else:
await message.reply("Что-то случилось")
else:
await message.reply("Упс! Что-то пошло не так")
await state.set_state(CharachterCreation.choosing_class)

View File

@@ -0,0 +1,18 @@
from aiogram.utils.keyboard import (
ReplyKeyboardBuilder,
ReplyKeyboardMarkup,
KeyboardButton,
)
def yes_no_kb():
kb = ReplyKeyboardBuilder()
kb.button(text="Да")
kb.button(text="Нет")
kb.adjust(2)
return kb.as_markup(resize_keyboard=True)
def row_kb(items):
row = [KeyboardButton(text=item) for item in items]
return ReplyKeyboardMarkup(keyboard=[row], resize_keyboard=True)

40
telegram/textsouls/main.py Executable file → Normal file
View File

@@ -1,39 +1,27 @@
import json
from aiogram import Bot, Dispatcher, executor
import asyncio
from common import backend
from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.memory import MemoryStorage
from handlers import control
from handlers import character_creation
with open("textsouls/config.json") as config_file:
config_data = json.load(config_file)
API_TOKEN = config_data["MAIN_SETTINGS"]["BOT_TOKEN"]
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
async def main():
bot = Bot(token=config_data["MAIN_SETTINGS"]["BOT_TOKEN"])
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(control.router)
dp.include_router(character_creation.router)
@dp.message_handler(commands=["start"])
async def start(message):
tg_user = message.from_user
ts_user = {
"id": tg_user.id,
"first_name": tg_user.first_name,
"last_name": tg_user.last_name,
"username": tg_user.username,
}
result = backend.post("/users", ts_user)
if not result["error"]:
response_code = result["response"].status_code
if response_code == 200:
await message.reply("Добро пожаловать!")
elif response_code == 400:
await message.reply("Добро пожаловать! Снова")
else:
await message.reply("Что-то другое")
else:
await message.reply("Упс! Что-то пошло не так")
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
asyncio.run(main())