mirror of
https://github.com/Llloooggg/TextSouls.git
synced 2026-03-06 04:26:23 +03:00
backend + telegram: добавлено создание персонажа
This commit is contained in:
@@ -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(
|
||||
|
||||
105
telegram/textsouls/handlers/character_creation.py
Normal file
105
telegram/textsouls/handlers/character_creation.py
Normal 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)
|
||||
38
telegram/textsouls/handlers/control.py
Normal file
38
telegram/textsouls/handlers/control.py
Normal 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)
|
||||
18
telegram/textsouls/keyboards/common.py
Normal file
18
telegram/textsouls/keyboards/common.py
Normal 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
40
telegram/textsouls/main.py
Executable file → Normal 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())
|
||||
|
||||
Reference in New Issue
Block a user