From 8cf832ce1e9617e62cd58acb26ca812a383f7da1 Mon Sep 17 00:00:00 2001 From: Anders Lindh Olsson Date: Wed, 13 May 2026 11:38:30 +0200 Subject: [PATCH] refactor(server): merge announce + udpbcast into announcer.py The two files were small, always imported together, and split a single UDP subsystem across two modules. Merging them into announcer.py (named after the main class) also removes the name shadow with protocol/announce.py. SharedUDPServer was never imported anywhere and is dropped. --- .../recceiver/{announce.py => announcer.py} | 21 +++++++++-- server/recceiver/application.py | 3 +- server/recceiver/udpbcast.py | 37 ------------------- 3 files changed, 19 insertions(+), 42 deletions(-) rename server/recceiver/{announce.py => announcer.py} (73%) delete mode 100644 server/recceiver/udpbcast.py diff --git a/server/recceiver/announce.py b/server/recceiver/announcer.py similarity index 73% rename from server/recceiver/announce.py rename to server/recceiver/announcer.py index 266e5cc8..1cad0fbe 100644 --- a/server/recceiver/announce.py +++ b/server/recceiver/announcer.py @@ -1,16 +1,31 @@ # -*- coding: utf-8 -*- import logging +import socket -from twisted.internet import protocol +from twisted.internet import protocol, udp from twisted.internet.error import MessageLengthError -from recceiver.protocol.announce import ANNOUNCE_PORT, BROADCAST_ADDRESS, Announce +from .protocol.announce import ANNOUNCE_PORT, BROADCAST_ADDRESS, Announce _log = logging.getLogger(__name__) -__all__ = ["Announcer"] +__all__ = ["Announcer", "SharedUDP"] + + +class SharedUDP(udp.Port): + """UDP socket that can share a port with other similarly configured sockets. + + Broadcasts are delivered to all sockets on the port; unicast traffic goes + to one (implementation-defined) socket. + """ + + def createInternetSocket(self): + sock = udp.Port.createInternetSocket(self) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + return sock class Announcer(protocol.DatagramProtocol): diff --git a/server/recceiver/application.py b/server/recceiver/application.py index 6fded6bb..4c1d82da 100644 --- a/server/recceiver/application.py +++ b/server/recceiver/application.py @@ -12,10 +12,9 @@ from twisted import plugin from . import metrics -from .announce import Announcer +from .announcer import Announcer, SharedUDP from .processors import ProcessorController from .recast import CastFactory -from .udpbcast import SharedUDP _log = logging.getLogger(__name__) diff --git a/server/recceiver/udpbcast.py b/server/recceiver/udpbcast.py deleted file mode 100644 index 4927ecdf..00000000 --- a/server/recceiver/udpbcast.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -from twisted.application import internet -from twisted.internet import udp - -__all__ = ["SharedUDP", "SharedUDPServer"] - - -class SharedUDP(udp.Port): - """A UDP socket which can share - a port with other similarly configured - sockets. Broadcasts to this port will - be copied to all sockets. - However, unicast traffic will only be - delivered to one (implementation defined) - socket. - """ - - def createInternetSocket(self): - import socket - - sock = udp.Port.createInternetSocket(self) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - return sock - - -class SharedUDPServer(internet.UDPServer): - """A UDP server using SharedUDP""" - - def _getPort(self): - from twisted.internet import reactor - - R = getattr(self, "reactor", reactor) - port = SharedUDP(reactor=R, *self.args, **self.kwargs) - port.startListening() - return port