diff --git a/bumblebee_status/modules/contrib/messagereceiver.py b/bumblebee_status/modules/contrib/messagereceiver.py new file mode 100644 index 0000000..1fb8ca2 --- /dev/null +++ b/bumblebee_status/modules/contrib/messagereceiver.py @@ -0,0 +1,96 @@ +# pylint: disable=C0111,R0903 + +""" +Displays the message that's received via unix socket. + +Parameteres: + * messagereceiver : Unix socket address (e.g: /tmp/bumblebee_messagereceiver.sock) + +Example: + The following examples assume that /tmp/bumblebee_messagereceiver.sock is used as unix socket address. + + In order to send the string "I  bumblebee-status" to your status bar, use the following command: + echo -e '{"message":"I  bumblebee-status", "state": ""}' | socat unix-connect:/tmp/bumblebee_messagereceiver.sock STDIO + + In order to highlight the text, the state variable can be used: + echo -e '{"message":"I  bumblebee-status", "state": "warning"}' | socat unix-connect:/tmp/bumblebee_messagereceiver.sock STDIO + + +""" + +import core.module +import core.widget +import core.input + +import socket +import threading +import logging +import os +import queue +import json + + +class Worker(threading.Thread): + def __init__(self, unix_socket_address, queue): + threading.Thread.__init__(self) + self.__unix_socket_address = unix_socket_address + self.__queue = queue + + def run(self): + while True: + try: + os.unlink(self.__unix_socket_address) + except OSError as e: + if os.path.exists(self.__unix_socket_address): + logging.exception( + "Couldn't bind to unix socket %s", self.__unix_socket_address + ) + raise + + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s: + s.bind(self.__unix_socket_address) + s.listen() + + conn, _ = s.accept() + with conn: + while True: + data = conn.recv(1024) + if not data: + break + self.__queue.put(data.decode("utf-8")) + + +class Module(core.module.Module): + @core.decorators.every(seconds=1) + def __init__(self, config, theme): + super().__init__(config, theme, core.widget.Widget(self.message)) + + self.__unix_socket_address = self.parameter("address", "") + + self.__message = "" + self.__state = [] + + self.__queue = queue.Queue() + self.__worker = Worker(self.__unix_socket_address, self.__queue) + self.__worker.daemon = True + self.__worker.start() + + def message(self, widget): + return self.__message + + def update(self): + try: + received_data = self.__queue.get(block=False) + parsed_data = json.loads(received_data) + self.__message = parsed_data["message"] + self.__state = parsed_data["state"] + except json.JSONDecodeError as e: + logging.exception("Couldn't parse message") + except queue.Empty as e: + pass + + def state(self, widget): + return self.__state + + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4