Use new-style register.
authorBenjamin Braatz <bb@bbraatz.eu>
Tue, 14 Dec 2021 22:54:02 +0000 (23:54 +0100)
committerBenjamin Braatz <bb@bbraatz.eu>
Tue, 14 Dec 2021 22:54:02 +0000 (23:54 +0100)
controlpi_plugins/statemachine.py

index 6f47d8c439a1fe1c5d5d61d115be96a748c80a0d..3415f410174abd407558002b48b26421a41ce186 100644 (file)
@@ -58,14 +58,7 @@ class StateMachine(BasePlugin):
                                          'required': ['commands',
                                                       'transitions']}},
                                        'additionalProperties': False}}))
-        receives = []
-        receives.append(MessageTemplate({'target': {'const': self.name},
-                                         'command': {'const': 'get state'}}))
-        receives.append(MessageTemplate({'target': {'const': self.name},
-                                         'command': {'const': 'get machine'}}))
-        receives.append(MessageTemplate({'target': {'const': self.name},
-                                         'command': {'const': 'set state'},
-                                         'new state': {'type': 'string'}}))
+        triggers = []
         for state in self.conf['states']:
             commands = self.conf['states'][state]['commands']
             for command in commands:
@@ -75,34 +68,51 @@ class StateMachine(BasePlugin):
             transitions = self.conf['states'][state]['transitions']
             for transition in transitions:
                 template = MessageTemplate(transition['trigger'])
-                if template not in receives:
-                    receives.append(template)
-        self.bus.register(self.name, 'StateMachine',
-                          sends, receives, self._receive)
+                if template not in triggers:
+                    triggers.append(template)
+        self.bus.register(self.name, 'StateMachine', sends,
+                          [([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get state'}})],
+                            self._get_state),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'get machine'}})],
+                            self._get_machine),
+                           ([MessageTemplate({'target':
+                                              {'const': self.name},
+                                              'command':
+                                              {'const': 'set state'},
+                                              'new state':
+                                              {'type': 'string'}})],
+                            self._set_state),
+                           (triggers, self._trigger)])
 
-    async def _receive(self, message: Message) -> None:
-        if ('target' in message and message['target'] == self.name and
-                'command' in message):
-            if message['command'] == 'get state':
-                await self.bus.send(Message(self.name,
-                                            {'state': self._current_state}))
-            if message['command'] == 'get machine':
-                await self.bus.send(Message(self.name,
-                                            {'init': self.conf['init'],
-                                             'states': self.conf['states']}))
-            if (message['command'] == 'set state' and
-                    'new state' in message and
-                    message['new state'] != self._current_state and
-                    message['new state'] in self.conf['states']):
-                assert isinstance(message['new state'], str)
-                new_state = message['new state']
-                self._current_state = new_state
-                await self.bus.send(Message(self.name,
-                                            {'event': 'changed',
-                                             'state': new_state}))
-                commands = self.conf['states'][new_state]['commands']
-                for command in commands:
-                    await self.bus.send(Message(self.name, command))
+    async def _get_state(self, message: Message) -> None:
+        await self.bus.send(Message(self.name,
+                                    {'state': self._current_state}))
+
+    async def _get_machine(self, message: Message) -> None:
+        await self.bus.send(Message(self.name,
+                                    {'init': self.conf['init'],
+                                     'states': self.conf['states']}))
+
+    async def _set_state(self, message: Message) -> None:
+        if (message['new state'] != self._current_state and
+                message['new state'] in self.conf['states']):
+            assert isinstance(message['new state'], str)
+            new_state = message['new state']
+            self._current_state = new_state
+            await self.bus.send(Message(self.name,
+                                        {'event': 'changed',
+                                         'state': new_state}))
+            commands = self.conf['states'][new_state]['commands']
+            for command in commands:
+                await self.bus.send(Message(self.name, command))
+
+    async def _trigger(self, message: Message) -> None:
         transitions = self.conf['states'][self._current_state]['transitions']
         for transition in transitions:
             if (MessageTemplate(transition['trigger']).check(message) and