1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-27 21:44:21 +00:00
royalnet/rpgpack/commands/dndactive.py

67 lines
2.7 KiB
Python
Raw Normal View History

2019-11-11 09:34:05 +00:00
from royalnet.commands import *
from royalnet.utils import asyncify
from ..tables import DndCharacter, DndActiveCharacter
2020-02-18 13:48:21 +00:00
from ..utils import get_active_character, get_interface_data
import pickle
2019-11-11 09:34:05 +00:00
class DndactiveCommand(Command):
name: str = "dndactive"
description: str = "Set a DnD character as active."
aliases = ["da", "dnda", "active", "dactive"]
syntax = "{name|id}"
async def run(self, args: CommandArgs, data: CommandData) -> None:
identifier = args.optional(0)
author = await data.get_author(error_if_none=True)
2020-02-18 13:48:21 +00:00
active_character = await get_active_character(data)
2020-03-16 19:03:49 +00:00
DndCharacterT = self.alchemy.get(DndCharacter)
DndActiveCharacterT = self.alchemy.get(DndActiveCharacter)
2020-02-18 13:48:21 +00:00
# Display the active character
2019-11-11 09:34:05 +00:00
if identifier is None:
2020-02-18 13:48:21 +00:00
if active_character is None:
await data.reply(" You haven't activated any character in this chat.")
2019-11-11 09:34:05 +00:00
else:
2020-02-18 13:48:21 +00:00
await data.reply(f" Your active character for this chat is [b]{active_character.character}[/b].")
2019-11-11 09:34:05 +00:00
return
2020-02-18 13:48:21 +00:00
# Find the character by name
2019-11-11 09:34:05 +00:00
try:
identifier = int(identifier)
except ValueError:
2020-03-16 19:03:49 +00:00
chars = await asyncify(data.session.query(DndCharacterT).filter_by(name=identifier).all)
2019-11-11 09:34:05 +00:00
if len(chars) >= 2:
char_string = "\n".join([f"[c]{char.character_id}[/c] (LV {char.level}) by {char.creator})" for char in chars])
raise CommandError(f"Multiple characters share the name {identifier}, "
f"please activate them using their id:\n{char_string}")
elif len(chars) == 1:
char = chars[0]
else:
char = None
else:
# Find the character by id
2020-03-16 19:03:49 +00:00
char = await asyncify(data.session.query(DndCharacterT)
2019-11-11 09:34:05 +00:00
.filter_by(character_id=identifier)
.one_or_none)
if char is None:
raise CommandError("No character found.")
# Check if the player already has an active character
2020-02-18 13:48:21 +00:00
if active_character is None:
2019-11-11 09:34:05 +00:00
# Create a new active character
2020-03-16 19:03:49 +00:00
achar = DndActiveCharacterT(
2020-02-18 13:48:21 +00:00
character=char,
user=author,
interface_name=self.interface.name,
interface_data=pickle.dumps(get_interface_data(data)))
2019-11-11 09:34:05 +00:00
data.session.add(achar)
else:
# Change the active character
2020-02-18 13:48:21 +00:00
active_character.character = char
2019-11-11 09:34:05 +00:00
await data.session_commit()
await data.reply(f"✅ Active character set to [b]{char}[/b]!")