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