98 lines
2.9 KiB
Dart
98 lines
2.9 KiB
Dart
import 'dart:io';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:libac_dart/utils/rcon/rcon_helpers.dart';
|
|
import 'package:libac_dart/utils/rcon/rcon_vars.dart';
|
|
|
|
/// Creates and stores a socket connected to the RCON server
|
|
/// with the given host (IP/FQDN) and port. Port defaults to
|
|
/// 25575 if no port is specified.
|
|
Future<void> createSocket(String host, {int port = 25575}) async {
|
|
// Creates the socket by connecting the socket to the specified
|
|
// host and port.
|
|
rconSck = await Socket.connect(host, port);
|
|
}
|
|
|
|
/// Closes the socket to the RCON server. Returns a bool that
|
|
/// specified whether the socket was successfully destroyed.
|
|
bool close() {
|
|
// Checks to ensure that the RCON socket exists.
|
|
if (rconSck == null) {
|
|
return false;
|
|
}
|
|
|
|
// Destroys the socket, which also closes the connection.
|
|
rconSck!.destroy();
|
|
|
|
return true;
|
|
}
|
|
|
|
/// Send a message with the given message ID and message payload.
|
|
/// Returns a boolean that specifies if the command was successful.
|
|
bool sendMsg(int msgID, String payload) {
|
|
// Ensures that the RCON socket exists.
|
|
if (rconSck == null) {
|
|
return false;
|
|
}
|
|
|
|
// Message length is the payload length + 10 to account
|
|
// for the headers and suffix.
|
|
int msgLen = 10 + payload.length;
|
|
|
|
// Creates the full RCON message.
|
|
Uint8List fullMsg = cM(msgLen, msgID, payload);
|
|
|
|
// Add the RCON message to the socket stream.
|
|
rconSck!.add(fullMsg);
|
|
print("mc_rcon: sent payload ($fullMsg) on socket");
|
|
|
|
return true;
|
|
}
|
|
|
|
/// Log in to the RCON server using the given socket and password.
|
|
/// Returns a boolean that specifies if the command was successful.
|
|
bool login(String password) {
|
|
// Sends an RCON message with request ID = 3 (authenticate)
|
|
// with the password as the payload.
|
|
return sendMsg(3, password);
|
|
}
|
|
|
|
/// Send the provided command to the RCON server using the
|
|
/// Returns a boolean that specifies if the command was successful.
|
|
bool sendCommand(String command) {
|
|
// Sends an RCON message with request ID = 2 (command)
|
|
// with the String command as the payload.
|
|
return sendMsg(2, command);
|
|
}
|
|
|
|
/// Starts listening on the socket for packets sent by the RCON
|
|
/// server. Returns a boolean that specifies if the socket has
|
|
/// started listening. Note: onData must accept a List<int> and
|
|
/// a String as the only parameters.
|
|
bool listen(Function onData) {
|
|
// Checks to ensure that the RCON socket exists.
|
|
if (rconSck == null) {
|
|
return false;
|
|
}
|
|
|
|
// Starts listening on the RCON socket.
|
|
// Calls the first handler if we receive data, calls onError
|
|
// if there is an error on the stream, calls onDone when the
|
|
// client or the server ends the connection.
|
|
rconSck!.listen(
|
|
(Uint8List data) {
|
|
pSR(data, onData);
|
|
},
|
|
onError: (error) {
|
|
print('mc_rcon: Error with the connection to the server: $error');
|
|
rconSck!.destroy();
|
|
},
|
|
onDone: () {
|
|
print('mc_rcon: The server has ended the connection.');
|
|
rconSck!.destroy();
|
|
},
|
|
cancelOnError: false,
|
|
);
|
|
|
|
return true;
|
|
}
|