import socket from edmond.plugin import Plugin class ShrlokPlugin(Plugin): """Use an available shrlok server to allow sharing longer stuff. This plugin does not do anything on its own, but can be used from other plugins to share longer texts through a Web portal. """ def __init__(self, bot): super().__init__(bot) self.socket = "" self.file_root = "" self.url_root = "" def on_welcome(self, _): if all( conf in self.config for conf in ("socket_path", "file_root", "url_root") ): self.socket = self.config["socket_path"] self.file_root = self.config["file_root"] self.url_root = self.config["url_root"] self.bot.log_d(f"shrlok socket path '{self.socket}'") else: self.bot.log_d("No socket path specified, shrlok plugin disabled.") self.is_ready = False def post(self, content_type, content_data): header = '{{"type":"{}"}}'.format(content_type).encode() + b"\0" try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: sock.connect(self.socket) data = header + content_data sock.sendall(str(len(data)).encode() + b"\0" + data) response = sock.recv(4096) except OSError as exc: self.bot.log_e(f"Can't post data: {exc}") return None url = response.decode().replace(self.file_root, self.url_root, 1) return url def post_text(self, text): self.post("txt", text.encode()) def post_html(self, html): self.post("html", html.encode())