my $mutemessageid = ''; while(1) { # Read from socket while(1) { my $char; sysread($sock, $char, 1); last if(!defined($char) || !length($char)); $frame->append($char); } while(my $data = $frame->next_bytes) { my $msg = decode_json($data); # Got any kind of OBS packet, so it's still alive. Reset our timeout and notify display that we have OBS connection $lastobspacket = time; $sendobsversionrequest = 0; $clacks->set('OBS::Alive', 1); if(defined($msg->{'authRequired'})) { # Start authentication my $secret = sha256_b64($obsconfig->{password} . $msg->{salt}); $secret .= $msg->{challenge}; my $auth = sha256_b64($secret); $authmsgid = 'auth_' . int(rand(1_000_000)); my %request = ( 'request-type' => 'Authenticate', 'auth' => $auth, 'message-id' => $authmsgid, ); my $outframe = $frame->new(buffer => encode_json(\%request), type => 'text', masked => 1)->to_bytes; syswrite($sock, $outframe); } elsif(defined($msg->{'message-id'}) && $msg->{'message-id'} =~ /^auth\_/ && $msg->{'message-id'} eq $authmsgid) { # Auth reply if(defined($msg->{status}) && $msg->{status} eq 'ok') { # auth ok print "Authenticated to OBS\n"; # Enable real heartbeat my %request = ( 'request-type' => 'SetHeartbeat', 'enable' => \1, # Boolean TRUE 'message-id' => 'heartbeat_' . int(rand(1_000_000)), ); my $outframe = $frame->new(buffer => encode_json(\%request), type => 'text', masked => 1)->to_bytes; syswrite($sock, $outframe); } else { # Auth failed! print "AUTHENTICATION FAILED!!!!!\n"; sleep(30); exit(1); } } elsif(defined($msg->{'message-id'}) && $msg->{'message-id'} =~ /^heartbeat\_/) { if(defined($msg->{status}) && $msg->{status} eq 'ok') { print "Heartbeat enabled\n"; } else { print "Failed to enable heartbeat!\n"; }