1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00
royalnet/rpgpack/commands/dndactive.py
2020-09-16 02:37:31 +02:00

70 lines
3 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from royalnet.commands import *
from royalnet.utils import asyncify
from ..tables import DndCharacter, DndActiveCharacter
from ..utils import get_active_character, get_interface_data
import pickle
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)
async with data.session_acm() as session:
author = await data.find_author(session=session, required=True)
active_character = await get_active_character(session=session, data=data)
DndCharacterT = self.alchemy.get(DndCharacter)
DndActiveCharacterT = self.alchemy.get(DndActiveCharacter)
# Display the active character
if identifier is None:
if active_character is None:
await data.reply(" You haven't activated any character in this chat.")
else:
await data.reply(f" Your active character for this chat is [b]{active_character.character}[/b].")
return
# Find the character by name
try:
identifier = int(identifier)
except ValueError:
chars = await asyncify(session.query(DndCharacterT).filter_by(name=identifier).all)
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
char = await asyncify(session.query(DndCharacterT)
.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
if active_character is None:
# Create a new active character
achar = DndActiveCharacterT(
character=char,
user=author,
interface_name=data.command.serf.__class__.__name__,
interface_data=pickle.dumps(get_interface_data(data)))
session.add(achar)
else:
# Change the active character
active_character.character = char
await asyncify(session.commit)
await data.reply(f"✅ Active character set to [b]{char}[/b]!")