mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-26 21:14:19 +00:00
💥 Things.
This commit is contained in:
parent
698643e927
commit
0e986b6eb2
4 changed files with 26 additions and 20 deletions
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "royalnet"
|
name = "royalnet"
|
||||||
version = "6.2.1"
|
version = "6.2.8"
|
||||||
description = "A multipurpose bot framework"
|
description = "A multipurpose bot framework"
|
||||||
authors = ["Stefano Pigozzi <me@steffo.eu>"]
|
authors = ["Stefano Pigozzi <me@steffo.eu>"]
|
||||||
license = "AGPL-3.0-or-later"
|
license = "AGPL-3.0-or-later"
|
||||||
|
|
|
@ -64,8 +64,12 @@ class FullCommand(c.Conversation):
|
||||||
A reference to the unteleported function :attr:`.f`\\ .
|
A reference to the unteleported function :attr:`.f`\\ .
|
||||||
"""
|
"""
|
||||||
|
|
||||||
teleported = tp.Teleporter(f, validate_input=True, validate_output=False)
|
self.teleported_f = tp.Teleporter(f, validate_input=True, validate_output=False)
|
||||||
super().__init__(teleported)
|
"""
|
||||||
|
.. todo:: Document this.
|
||||||
|
"""
|
||||||
|
|
||||||
|
super().__init__(self.run)
|
||||||
|
|
||||||
if len(names) < 1:
|
if len(names) < 1:
|
||||||
raise MissingNameError(f"Passed 'names' list is empty", names)
|
raise MissingNameError(f"Passed 'names' list is empty", names)
|
||||||
|
@ -108,12 +112,12 @@ class FullCommand(c.Conversation):
|
||||||
plus = f" + {nc-1} other names" if (nc := len(self.names)) > 1 else ""
|
plus = f" + {nc-1} other names" if (nc := len(self.names)) > 1 else ""
|
||||||
return f"<{self.__class__.__qualname__}: {self.name()!r}{plus}>"
|
return f"<{self.__class__.__qualname__}: {self.name()!r}{plus}>"
|
||||||
|
|
||||||
async def run(self, *, _sentry: s.Sentry, **base_kwargs) -> t.Optional[c.ConversationProtocol]:
|
async def run(self, *, _sentry: s.Sentry, **kwargs) -> t.Optional[c.ConversationProtocol]:
|
||||||
"""
|
"""
|
||||||
Run the command as if it was a conversation.
|
Run the command as if it was a conversation.
|
||||||
|
|
||||||
:param _sentry: The :class:`~royalnet.engineer.sentry.Sentry` to use for the conversation.
|
:param _sentry: The :class:`~royalnet.engineer.sentry.Sentry` to use for the conversation.
|
||||||
:param base_kwargs: Keyword arguments to pass to the wrapped function :attr:`.f` .
|
:param kwargs: Keyword arguments to pass to the wrapped function :attr:`.f` .
|
||||||
:return: The result of the wrapped function :attr:`.f` , or :data:`None` if the first projectile received does
|
:return: The result of the wrapped function :attr:`.f` , or :data:`None` if the first projectile received does
|
||||||
not satisfy the requirements of the command.
|
not satisfy the requirements of the command.
|
||||||
"""
|
"""
|
||||||
|
@ -156,7 +160,7 @@ class FullCommand(c.Conversation):
|
||||||
_proj=projectile,
|
_proj=projectile,
|
||||||
_msg=msg,
|
_msg=msg,
|
||||||
_text=text,
|
_text=text,
|
||||||
**base_kwargs,
|
**kwargs,
|
||||||
**message_kwargs
|
**message_kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -167,7 +171,7 @@ class FullCommand(c.Conversation):
|
||||||
_proj=projectile,
|
_proj=projectile,
|
||||||
_msg=msg,
|
_msg=msg,
|
||||||
_text=text,
|
_text=text,
|
||||||
**base_kwargs,
|
**kwargs,
|
||||||
**message_kwargs
|
**message_kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,11 @@ class PDA:
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self.implementations)
|
return len(self.implementations)
|
||||||
|
|
||||||
|
async def _run(self):
|
||||||
|
await asyncio.gather(*[implementation.run() for implementation in self.implementations.values()])
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
asyncio.run(asyncio.gather(*[implementation.run() for implementation in self.implementations.values()]))
|
asyncio.run(self._run())
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
|
|
@ -6,10 +6,10 @@ import royalnet.royaltyping as t
|
||||||
import abc
|
import abc
|
||||||
import contextlib
|
import contextlib
|
||||||
import asyncio
|
import asyncio
|
||||||
|
from royalnet.engineer.dispenser import Dispenser
|
||||||
|
|
||||||
if t.TYPE_CHECKING:
|
if t.TYPE_CHECKING:
|
||||||
from royalnet.engineer.conversation import ConversationProtocol
|
from royalnet.engineer.conversation import ConversationProtocol
|
||||||
from royalnet.engineer.dispenser import Dispenser
|
|
||||||
from royalnet.engineer.pda.extensions.base import PDAExtension
|
from royalnet.engineer.pda.extensions.base import PDAExtension
|
||||||
from royalnet.engineer.pda.base import PDA
|
from royalnet.engineer.pda.base import PDA
|
||||||
from royalnet.engineer.command import PartialCommand, FullCommand
|
from royalnet.engineer.command import PartialCommand, FullCommand
|
||||||
|
@ -54,8 +54,8 @@ class PDAImplementation(metaclass=abc.ABCMeta):
|
||||||
raise ImplementationAlreadyBound()
|
raise ImplementationAlreadyBound()
|
||||||
self.bound_to = pda
|
self.bound_to = pda
|
||||||
|
|
||||||
@abc.abstractmethod
|
|
||||||
@property
|
@property
|
||||||
|
@abc.abstractmethod
|
||||||
def namespace(self):
|
def namespace(self):
|
||||||
"""
|
"""
|
||||||
.. todo:: Document this.
|
.. todo:: Document this.
|
||||||
|
@ -87,8 +87,8 @@ class ConversationListImplementation(PDAImplementation, metaclass=abc.ABCMeta):
|
||||||
:class:`~royalnet.engineer.dispenser.Dispenser` .
|
:class:`~royalnet.engineer.dispenser.Dispenser` .
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name: str):
|
def __init__(self, name: str, extensions: list["PDAExtension"] = None):
|
||||||
super().__init__(name)
|
super().__init__(name=name, extensions=extensions)
|
||||||
|
|
||||||
self.conversations: list["ConversationProtocol"] = self._create_conversations()
|
self.conversations: list["ConversationProtocol"] = self._create_conversations()
|
||||||
"""
|
"""
|
||||||
|
@ -178,12 +178,11 @@ class ConversationListImplementation(PDAImplementation, metaclass=abc.ABCMeta):
|
||||||
.. todo:: Document this.
|
.. todo:: Document this.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
extension: "PDAExtension" = remaining.pop(0)
|
if len(remaining) == 0:
|
||||||
|
yield kwargs
|
||||||
async with extension.kwargs(kwargs) as kwargs:
|
else:
|
||||||
if not remaining:
|
extension = remaining.pop(0)
|
||||||
yield kwargs
|
async with extension.kwargs(kwargs) as kwargs:
|
||||||
else:
|
|
||||||
async with self._kwargs(kwargs=kwargs, remaining=remaining) as kwargs:
|
async with self._kwargs(kwargs=kwargs, remaining=remaining) as kwargs:
|
||||||
yield kwargs
|
yield kwargs
|
||||||
|
|
||||||
|
@ -250,7 +249,7 @@ class ConversationListImplementation(PDAImplementation, metaclass=abc.ABCMeta):
|
||||||
async with self.kwargs(conv=conv) as kwargs:
|
async with self.kwargs(conv=conv) as kwargs:
|
||||||
await dispenser.run(conv=conv, **kwargs)
|
await dispenser.run(conv=conv, **kwargs)
|
||||||
|
|
||||||
def _run_all_conversations(self, dispenser: "Dispenser") -> list[asyncio.Task]:
|
async def _run_all_conversations(self, dispenser: "Dispenser") -> list[asyncio.Task]:
|
||||||
"""
|
"""
|
||||||
.. todo:: Document this.
|
.. todo:: Document this.
|
||||||
"""
|
"""
|
||||||
|
@ -273,7 +272,7 @@ class ConversationListImplementation(PDAImplementation, metaclass=abc.ABCMeta):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
dispenser = self.get_or_create_dispenser(key=key)
|
dispenser = self.get_or_create_dispenser(key=key)
|
||||||
self._run_all_conversations(dispenser=dispenser)
|
await self._run_all_conversations(dispenser=dispenser)
|
||||||
await dispenser.put(projectile)
|
await dispenser.put(projectile)
|
||||||
await asyncio.sleep(0)
|
await asyncio.sleep(0)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue