Source code for president.modules.udp

# This file is placed in the Public Domain.
#
# pylint: disable=C,I,R
# flake8: noqa=E501


"udp to irc relay"


import select
import socket
import sys
import time


from ..bus     import Bus
from ..object  import Default, Object
from ..persist import last
from ..thread  import launch


[docs]def start(): udpd = UDP() udpd.start() return udpd
[docs]class Cfg(Default): def __init__(self): super().__init__() self.host = "localhost" self.port = 5500
[docs] def len(self): return self.server
[docs] def size(self): return self.port
[docs]class UDP(Object): def __init__(self): super().__init__() self.stopped = False self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) self._sock.setblocking(1) self._starttime = time.time() self.cfg = Cfg() self.cfg.addr = ""
[docs] def output(self, txt, addr=None): if addr: self.cfg.addr = addr Bus.announce(txt.replace("\00", ""))
[docs] def loop(self): try: self._sock.bind((self.cfg.host, self.cfg.port)) except socket.gaierror: return while not self.stopped: (txt, addr) = self._sock.recvfrom(64000) if self.stopped: break data = str(txt.rstrip(), "utf-8") if not data: break self.output(data, addr)
[docs] def exit(self): self.stopped = True self._sock.settimeout(0.01) self._sock.sendto(bytes("exit", "utf-8"), (self.cfg.host, self.cfg.port))
[docs] def start(self): last(self.cfg) launch(self.loop)
[docs]def toudp(host, port, txt): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(bytes(txt.strip(), "utf-8"), (host, port))
[docs]def udp(event): cfg = Cfg() last(cfg) if len(sys.argv) > 2: txt = " ".join(sys.argv[2:]) toudp(cfg.host, cfg.port, txt) return if not select.select( [sys.stdin, ], [], [], 0.0 )[0]: return size = 0 while 1: try: (inp, _out, err) = select.select( [sys.stdin,], [], [sys.stderr,] ) except KeyboardInterrupt: return if err: break stop = False for sock in inp: txt = sock.readline() if not txt: stop = True break size += len(txt) toudp(cfg.host, cfg.port, txt) if stop: break event.reply(f"send {size}")