Source code for evrm.modules.udp

# This file is placed in the Public Domain.
#
# pylint: disable=C0115,C0116,W0105,E0402,R0903


"udp to irc relay"


import select
import socket
import sys
import threading
import time


from ..objects import Default, Object
from ..reactor import Broker
from ..threads import launch


def __dir__():
    return (
            'Cfg',
            'UDP',
            'udp'
           )


def init():
    udpd = UDP()
    udpd.start()
    return udpd


[docs] class Cfg(Default): addr = "" host = "localhost" port = 5500
[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.ready = threading.Event()
[docs] def output(self, txt, addr=None): if addr: Cfg.addr = addr for bot in Broker.objs: bot.announce(txt.replace("\00", ""))
[docs] def loop(self): try: self._sock.bind((Cfg.host, Cfg.port)) except socket.gaierror: return self.ready.set() 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"), (Cfg.host, Cfg.port) )
[docs] def start(self): launch(self.loop)
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): if len(sys.argv) > 2: txt = " ".join(sys.argv[2:]) toudp(Cfg.host, Cfg.port, txt) event.reply(f"{len(txt)} characters sent") 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