Edm0nd/edmond/plugins/shrlok.py

50 lines
1.7 KiB
Python
Raw Normal View History

import json
2022-07-05 22:06:44 +02:00
import socket
from typing import Optional
2022-07-05 22:06:44 +02:00
from edmond.bot import Bot
2022-07-05 22:06:44 +02:00
from edmond.plugin import Plugin
class ShrlokPlugin(Plugin):
2022-07-05 23:35:58 +02:00
"""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.
"""
2022-07-05 22:06:44 +02:00
def __init__(self, bot: Bot):
2022-07-05 22:06:44 +02:00
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:
2022-07-05 23:35:58 +02:00
self.bot.log_d("No socket path specified, shrlok plugin disabled.")
2022-07-05 22:06:44 +02:00
self.is_ready = False
def post(self, header: dict, data: bytes) -> Optional[str]:
encoded_header = json.dumps(header).encode()
2022-07-05 22:06:44 +02:00
try:
2022-07-05 23:35:58 +02:00
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock:
2022-07-05 22:06:44 +02:00
sock.connect(self.socket)
header_and_data = encoded_header + b"\0" + data
length = len(header_and_data)
packet = str(length).encode() + b"\0" + header_and_data
sock.sendall(packet)
2022-07-05 22:06:44 +02:00
response = sock.recv(4096)
except OSError as exc:
2022-07-10 18:25:40 +02:00
self.bot.log_e(f"Can't post data: {exc}")
2022-07-05 23:35:58 +02:00
return None
2022-07-06 17:18:01 +02:00
url = response.decode().replace(self.file_root, self.url_root, 1)
return url or None # returning empty strings could cause confusion