diff --git a/menuflow/flow.py b/menuflow/flow.py index f264b1d..ab66ff0 100644 --- a/menuflow/flow.py +++ b/menuflow/flow.py @@ -14,6 +14,7 @@ HTTPRequest, Input, InteractiveInput, + Leave, Location, Media, Message, @@ -134,6 +135,10 @@ def node( node_initialized = InteractiveInput( interactive_input_data=node_data, room=room, default_variables=self.flow_variables ) + elif node_data.get("type") == "leave": + node_initialized = Leave( + leave_node_data=node_data, room=room, default_variables=self.flow_variables + ) else: return diff --git a/menuflow/nodes/__init__.py b/menuflow/nodes/__init__.py index 00cfac2..57daed8 100644 --- a/menuflow/nodes/__init__.py +++ b/menuflow/nodes/__init__.py @@ -4,6 +4,7 @@ from .http_request import HTTPRequest from .input import Input from .interactive_input import InteractiveInput +from .leave import Leave from .location import Location from .media import Media from .message import Message diff --git a/menuflow/nodes/leave.py b/menuflow/nodes/leave.py new file mode 100644 index 0000000..818d6ad --- /dev/null +++ b/menuflow/nodes/leave.py @@ -0,0 +1,22 @@ +from typing import Dict + +from ..db.room import RoomState +from ..repository import Leave as LeaveModel +from ..room import Room +from .base import Base + + +class Leave(Base): + def __init__(self, leave_node_data: LeaveModel, room: Room, default_variables: Dict) -> None: + Base.__init__(self, room=room, default_variables=default_variables) + self.log = self.log.getChild(leave_node_data.get("id")) + self.content: Dict = leave_node_data + + @property + def reason(self) -> str: + return self.render_data(data=self.content.get("reason", "")) + + async def run(self): + self.log.debug(f"Room {self.room.room_id} enters leave node {self.id}") + await self.room.matrix_client.leave_room(self.room.room_id, self.reason) + await self.room.update_menu(node_id=None, state=RoomState.END) diff --git a/menuflow/repository/__init__.py b/menuflow/repository/__init__.py index de8b81a..5bb3b4f 100644 --- a/menuflow/repository/__init__.py +++ b/menuflow/repository/__init__.py @@ -10,6 +10,7 @@ Input, InteractiveInput, InteractiveMessage, + Leave, Location, Media, Message, diff --git a/menuflow/repository/nodes/__init__.py b/menuflow/repository/nodes/__init__.py index c88902e..5af4f7a 100644 --- a/menuflow/repository/nodes/__init__.py +++ b/menuflow/repository/nodes/__init__.py @@ -3,6 +3,7 @@ from .http_request import HTTPRequest from .input import InactivityOptions, Input from .interactive_input import InteractiveInput, InteractiveMessage +from .leave import Leave from .location import Location from .media import Media from .message import Message diff --git a/menuflow/repository/nodes/leave.py b/menuflow/repository/nodes/leave.py new file mode 100644 index 0000000..0d2b3d5 --- /dev/null +++ b/menuflow/repository/nodes/leave.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from attr import dataclass, ib + +from ..flow_object import FlowObject + + +@dataclass +class Leave(FlowObject): + """ + ## Leave + Leave the room. + + - id: leave1 + type: leave + reason: "I'm leaving" + """ + + reason: str = ib(default=None)