mirror of https://github.com/DJ2LS/FreeDATA.git
132 lines
4.7 KiB
Python
132 lines
4.7 KiB
Python
""" WORK IN PROGRESS by DJ2LS"""
|
|
from command_p2p_connection import P2PConnectionCommand
|
|
import structlog
|
|
|
|
class SocketCommandHandler:
|
|
|
|
def __init__(self, cmd_request, ctx):
|
|
self.logger = structlog.get_logger(type(self).__name__)
|
|
self.cmd_request = cmd_request
|
|
self.session = None
|
|
self.ctx = ctx
|
|
|
|
def log(self, message, isWarning = False):
|
|
msg = f"[{type(self).__name__}]: {message}"
|
|
logger = self.logger.warn if isWarning else self.logger.info
|
|
logger(msg)
|
|
|
|
def send_response(self, message):
|
|
try:
|
|
self.log(f">>>>> {message}")
|
|
full_message = f"{message}\r"
|
|
self.cmd_request.sendall(full_message.encode())
|
|
except Exception as e:
|
|
self.log(f"Error sending to socket: {message}", isWarning = True)
|
|
def handle_connect(self, data):
|
|
try:
|
|
params = {
|
|
'origin': data[0],
|
|
'destination': data[1],
|
|
}
|
|
|
|
cmd = P2PConnectionCommand(self.ctx, params)
|
|
self.session = cmd.run()
|
|
self.send_response(f"OK")
|
|
self.send_response(f"REGISTERED {data[0]}")
|
|
self.send_response(f"UNENCRYPTED LINK")
|
|
self.ctx.socket_interface_manager.connecting_callsign = data[0]
|
|
#if self.session.session_id:
|
|
# self.ctx.state_manager.register_p2p_connection_session(self.session)
|
|
# self.send_response("OK")
|
|
# self.session.connect()
|
|
#else:
|
|
# self.send_response("ERROR")
|
|
except:
|
|
self.send_response(f"ERR: {data}")
|
|
|
|
def handle_disconnect(self, data):
|
|
self.send_response(f"OK")
|
|
try:
|
|
self.session.disconnect()
|
|
except Exception as e:
|
|
self.log(f"Error disconnecting socket: {e}", isWarning = True)
|
|
|
|
def handle_mycall(self, data):
|
|
#Storing all of the callsigns assigned by client, to make sure they are checked later in new frames.
|
|
self.ctx.socket_interface_manager.socket_interface_callsigns = data
|
|
self.send_response(f"OK")
|
|
self.send_response(f"UNENCRYPTED LINK")
|
|
self.send_response(f"ENCRYPTION DISABLED")
|
|
|
|
def handle_bw(self, data):
|
|
# Logic for handling BW command
|
|
self.ctx.socket_interface_manager.socket_interface_bandwidth = int(data[0])
|
|
self.send_response(f"OK")
|
|
|
|
def handle_abort(self, data):
|
|
# Logic for handling ABORT command
|
|
self.send_response(f"OK")
|
|
try:
|
|
self.session.abort_connection()
|
|
except Exception as e:
|
|
self.send_response(f"ERR: {e}")
|
|
self.send_response(f"DISCONNECTED")
|
|
|
|
def handle_public(self, data):
|
|
# Logic for handling PUBLIC command
|
|
self.send_response(f"OK")
|
|
|
|
def handle_cwid(self, data):
|
|
# Logic for handling CWID command
|
|
self.send_response(f"OK")
|
|
|
|
def handle_listen(self, data):
|
|
# Logic for handling LISTEN command
|
|
self.send_response(f"OK")
|
|
|
|
def handle_compression(self, data):
|
|
# Logic for handling COMPRESSION command
|
|
# We are always sending OK, as we have our own compression
|
|
self.send_response(f"OK")
|
|
|
|
def handle_winlink_session(self, data):
|
|
# Logic for handling WINLINK SESSION command
|
|
#self.send_response(f"NOT IMPLEMENTED: {data}")
|
|
self.send_response(f"OK")
|
|
|
|
def handle_version(self, data):
|
|
# Logic for handling VERSION command
|
|
# maybe we need to use a different version, like 5.0
|
|
self.send_response(f"VERSION FREEDATA")
|
|
|
|
def socket_respond_disconnected(self):
|
|
self.send_response("DISCONNECTED")
|
|
|
|
def socket_respond_connected(self, origin, destination, bandwidth):
|
|
print("[socket interface_commands] socket_respond_connected")
|
|
if self.ctx.socket_interface_manager.connecting_callsign:
|
|
#message = f"CONNECTED {self.ctx.socket_interface_manager.connecting_callsign} {destination} {bandwidth}"
|
|
message = f"CONNECTED {origin} {destination} {bandwidth}"
|
|
else:
|
|
message = f"CONNECTED {origin} {destination} {bandwidth}"
|
|
self.send_response(f"UNENCRYPTED LINK")
|
|
self.send_response(f"LINK REGISTERED")
|
|
self.send_response(message)
|
|
|
|
def socket_respond_iamalive(self):
|
|
try:
|
|
self.send_response(f"IAMALIVE")
|
|
except Exception as e:
|
|
self.log(f"sending iamalive failed {e}")
|
|
def socket_respond_buffer_size(self, buffer_size):
|
|
self.send_response(f"BUFFER {buffer_size}")
|
|
|
|
def socket_respond_ptt(self, state):
|
|
""" send the PTT state via command socket"""
|
|
if state:
|
|
message = f"PTT ON"
|
|
else:
|
|
message = f"PTT OFF"
|
|
|
|
self.send_response(message)
|