Перейти к публикации

Рекомендованные сообщения

Опубликовано:

Сердечно приветсвую всех!

Давно не ковырялись с сервером и тут решили восстановить работу, но видимо после каких-то изменения и обновлений старые наработки перестали работать. На сервере настройки никакие не меняли.

Сейчас Rcon не хочет коннектиться снаружи по айпи и даже не коннектит по внутресетевому адресу "192.168.0.4". Коннект идет только по локалхосту (127.0.0.1). В чем может быть дело? Порты на роутере проброшены. Но даже если бы не было проброса портов почему не коннектит на 192,168,0,4?

Есть идеи?

Опубликовано:

В пределах локалки, работает, только что проверил.

Опубликовано:

 

 

Сейчас Rcon не хочет коннектиться

В СДС прописаны настройки ркон?

Опубликовано:

 

В СДС прописаны настройки ркон?

Да конечно прописаны. Я же говорю что по адресу 127,0,0,1 коннектит и работает как надо. 

Опубликовано: (изменено)

Да конечно прописаны. Я же говорю что по адресу 127,0,0,1 коннектит и работает как надо. 

А сделайте плз скриншоты менеджера сдс и в этом менеджере вкладки ркон.

Без паролей.

Изменено пользователем -DED-ASF
Опубликовано:

Сорри! затупил нереально!!!....Настроился. Кто-то в сдс айпи сменил!

Опубликовано:

:lol:

Так часто, да, бывает. Внимательность наше фсьо!

Опубликовано:

Еще по ркон. А отправку сообщений в чат прикрыли?


остыл всяких команд работает а вот чат что-то перестал(((

Опубликовано:

Работает. В том числе и персональные сообщения

Опубликовано:

Работает. В том числе и персональные сообщения

через румтайп 3 и 36-значный идентификатор пользователя

Опубликовано:

Вдруг кому пригодится.

 

Код на питоне и C# для работы с ркон.

Python код немного не дописан, но обёртки команд по образцу дописать не сложно. Всё в итоге работает через метод __rcon_send_raw_command (формирование пакета подсмотрено в открытом коде Xedoc'а)

C# код писан в том году, работоспособность на тот момент была.
 
Python:

 

import socket
# import time


class RconCommunicator:
    """Communicate with IL-2 Battle of Stalingrad dedicated server
    through Server Remote Console - 'RCon'"""

    def __init__(self, tcp_ip, tcp_port, buffer_size=1024):
        self.TCP_IP = tcp_ip
        self.TCP_PORT = tcp_port
        self.BUFFER_SIZE = buffer_size
        self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.SOCKET.settimeout(500)
        self.CONNECTED = False
        if self.TCP_IP and self.TCP_PORT:
            try:
                self.SOCKET.connect((self.TCP_IP, self.TCP_PORT))
                self.CONNECTED = True
            finally:
                self.AUTHED = False
                self.RESPONSE_LIST = []

    def __rcon_send_raw_command(self, command='mystatus'):
        """Sends command 'as is', may cause errors"""
        if hasattr(self, 'TCP_IP') == False \
                or hasattr(self, 'TCP_PORT') == False \
                or hasattr(self, 'BUFFER_SIZE') == False \
                or hasattr(self, 'SOCKET') == False:
            raise NameError("RconCommunicator NotInitialized")
        if type(command) is not str:
            raise NameError("type(command) is not str")

        if not self.CONNECTED:
            return None
        # формируем пакет
        cl = len(command) + 1
        pack_l = cl.to_bytes(2, byteorder='little')
        pack_m = command.encode(encoding='utf-8')
        pack_z = (0).to_bytes(1, byteorder='little')
        packet = pack_l + pack_m + pack_z

        # добавить проверку, установлено ли соединение
        # отправляем пакет
        try:
            self.SOCKET.send(packet)
        except:
            self.CONNECTED = False
            return None
        resp = self.SOCKET.recv(self.BUFFER_SIZE)
        self.RESPONSE_LIST.append((resp, command))
        return str(resp[2:-1], encoding="ascii")

    def reconnect(self):
        self.SOCKET.close()
        self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.SOCKET.settimeout(500)
        self.CONNECTED = False
        try:
            self.SOCKET.connect((self.TCP_IP, self.TCP_PORT))
            self.CONNECTED = True
        finally:
            self.AUTHED = False

    def auth(self, user, password):
        """Authenticate communicator. Gives more permission if true"""
        if not self.CONNECTED:
            return False

        resp = self.__rcon_send_raw_command("auth {0} {1}".format(user, password))

        if len(resp):
            if resp[-1] == "1":
                self.AUTHED = True
                return True
            else:
                # self.AUTHED = False
                return False
        elif type(resp) is bytes and len(resp) == 0:
            self.AUTHED = True
            return True
        else:
            # self.AUTHED = False
            return False

    def server_status(self):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("serverstatus")
        return resp

    def player_list(self):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("getplayerlist")
        return resp

    def chatmsg(self, roomtype, id, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("chatmsg {0} {1} {2}".format(roomtype, id, message))
        return resp

    def private_message(self, account_id, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(3, account_id, message)

    def allies_message(self, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(2, 1, message)

    def axis_message(self, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(2, 2, message)

    def kick(self, name):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("kick name {0}".format(name))
        return resp

    def server_input(self, server_input):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("serverinput {0}".format(server_input))
        return resp

    pass  # class

 


 
C#

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;

namespace IL2RAconnector
{
    public class TcpConnector: IDisposable
    {
        TcpClient connection;
        NetworkStream stream;
        string host;
        ushort port;

        public TcpConnector(string host, ushort port)
        {
            // TODO: Complete member initialization
            this.host = host;
            this.port = port;
            connection = new TcpClient(host, (int)port);
            stream = connection.GetStream();
            
        }

        public string ExecuteCommand(string command)
        {
            Byte[] sendBytes = Encoding.UTF8.GetBytes(String.Concat(command));
            Byte[] length = BitConverter.GetBytes((ushort)(command.Length + 1));
            Byte[] zero = { 0 };
            Byte[] packet = length.Concat(sendBytes).Concat(zero).ToArray();

            stream.Write(packet, 0, packet.Length);

            packet = new Byte[connection.ReceiveBufferSize];

            Int32 bytes = stream.Read(packet, 0, packet.Length);

            UInt16 responseLength = BitConverter.ToUInt16(packet.Take(2).ToArray(), 0);

            string response = null;
            if (responseLength > 2)
                response = Encoding.UTF8.GetString(packet.Skip(2).Take((int)responseLength - 1).ToArray());
            //else
                //throw new Exception(BitConverter.ToString(packet));
            return response;
        }

        

        public int RecieveBufferSize { get { return connection.ReceiveBufferSize; } }



        public void Dispose()
        {
            stream.Close();
            connection.Close();
        }
    }
}
namespace IL2RAconnector
{
    public class RconCommunicator
    {
        private TcpConnector connection;
        
        public Stack<KeyValuePair<StatusCode, string>> History { get; private set; }
        public StatusCode lastCommandStatus { get; private set; }
        public string lastCommandResult { get; private set; }
        public List<Player> Players { get; private set; }

        public RconCommunicator(string host, ushort port)
        {
            connection = new TcpConnector(host, port);
            History = new Stack<KeyValuePair<StatusCode, string>>(Globals.HistorySize);
            Players = new List<Player>();
        }

        private void Execute(string cmd)
        {
            string response = connection.ExecuteCommand(cmd);
            string[] arr = { response, "" };

            if (response.Contains('&'))
            {
                arr = response.Split('&');
            }
            lastCommandStatus = (StatusCode)int.Parse(arr[0].Substring(7));
            lastCommandResult = Uri.UnescapeDataString(arr[1]); 

            History.Push(new KeyValuePair<StatusCode, string>(lastCommandStatus, lastCommandResult));
        }

        public string MyStatus()
        {
            //cmd: mystatus (no parameters)
            //response example: STATUS=1&authed=1
            string command = "mystatus";
            Execute(command);
            return lastCommandResult;
        }

        public string Auth(string user, string password)
        {
            //cmd: auth e-mail password
            //response example: STATUS=1
            string command = "auth " + user + " " + password;
            Execute(command);
            return lastCommandResult;
        }

        public string GetConsole()
        {
            //cmd: getconsole
            //response example: STATUS=1&console=
            string command = "getconsole";
            Execute(command);
            return lastCommandResult;
        }

        public List<Player> GetPlayerList()
        {
            //cmd: getplayerlist
            //response example: STATUS=1&playerList=
            //    playerList isnot defined when there is no players on the server,
            //    or a list of records with a columns:
            //playerList=cId,profileId,playerId,name,ingameStatus,nServerPing|
            //enum ingameStatus
            //{
            //    PS_SPECTATOR=0,
            //    PS_LOBBY_READY,
            //    PS______NONE___,
            //    PS_DOGFIGHT_READY,
            //    PS_CRAFTSITE_READY
            //}
            string command = "getplayerlist";
            Execute(command);

            string[] p = lastCommandResult.Split('|').Skip(1).ToArray();
            Players = new List<Player>(p.Count());

            foreach(var s in p)
            {
                string[] playerInfo = s.Split(',');
                Players.Add(new Player(int.Parse(playerInfo[0]), playerInfo[1], int.Parse(playerInfo[2]), playerInfo[3], playerInfo[4], playerInfo[5]));
            }

            return Players;
        }

        public string ServerStatus()
        {
            //cmd: serverstatus
            //response example: STATUS=1
            string command = "serverstatus";
            Execute(command);
            return lastCommandResult;
        }

        public string Kick(CmdValueType cmdValueType, string value)
        {
            //cmd: kick cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "kick ";
            switch (cmdValueType)
            {
                case CmdValueType.cid: 
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string Ban(CmdValueType cmdValueType, string value)
        {
            //cmd: ban cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "ban ";
            switch (cmdValueType)
            {
                case CmdValueType.cid:
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string BanUser(CmdValueType cmdValueType, string value)
        {
            //cmd: banuser cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "banuser ";
            switch (cmdValueType)
            {
                case CmdValueType.cid:
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string UnbanAll()
        {
            //cmd: unbanall 
            //response example: STATUS=1
            string command = "unbanall";
            Execute(command);
            return lastCommandResult;
        }

        public string ServerInput(string translatorName)
        {
            //cmd: serverinput translator_name
            //response example: STATUS=1
            string command = "serverinput " + translatorName;
            Execute(command);
            return lastCommandResult;
        }

        public string SendStatNow()
        {
            //cmd: sendstatnow 
            //response example: STATUS=1
            string command = "sendstatnow";
            Execute(command);
            return lastCommandResult;
        }

        public string CutChatLog()
        {
            //cmd: cutchatlog
            //response example: STATUS=1
            string command = "cutchatlog";
            Execute(command);
            return lastCommandResult;
        }

        public string ChatMsg(RoomType roomType, string message, int recipientId)
        {
            //cmd: chatmsg roomtype id Message to send
            //response example: STATUS=1
            //chatmsg 0 -1 msg      (all)
            //chatmsg 1 cid msg     (coalition message, 0 - neutral, 1 - allies, 2 - axis)
            //chatmsg 2 cid msg     (country message, 0 - all)
            //chatmsg 3 cid msg     (private message, cid - client id from playerlist)
            

            string command;
            switch (roomType)
            {
                case RoomType.All:
                    command = string.Format("chatmsg 0 -1 {0}", message);
                    break;
                case RoomType.Coalition:
                    command = string.Format("chatmsg 1 {0} {1}", recipientId, message);
                    break;
                case RoomType.Country:
                    command = string.Format("chatmsg 2 {0} {1}", recipientId, message);
                    break;
                case RoomType.ClientId:
                    command = string.Format("chatmsg 3 {0} {1}", recipientId, message);
                    break;
                default: return string.Empty;
            }
            Execute(command);
            return lastCommandResult;
        }

        
    }
}

namespace IL2RAconnector
{
    public class Player
    {
        public int Cid { get; private set; }
        public string Name { get; private set; }
        public string ProfileId { get; private set; }
        public string PlayerId { get; private set; }
        public string IngameStatus { get; private set; }
        public int Ping { get; private set; }

        public Player(int cid, string ingameStatus, int ping, string unescapedName, string unescapedPlayerId, string unescapedProfileId)
        {
            Cid = cid;
            ProfileId = Uri.UnescapeDataString(unescapedProfileId);
            PlayerId = Uri.UnescapeDataString(unescapedPlayerId);
            IngameStatus = ingameStatus;
            Ping = ping;
            Name = Uri.UnescapeDataString(unescapedName);
        }
    }
}
 

 

 

  • Поддерживаю! 4
  • 3 года спустя...
Опубликовано:
23.10.2016 в 21:32, 72AG_Crusader сказал:

Вдруг кому пригодится.

 

Код на питоне и C# для работы с ркон.

Python код немного не дописан, но обёртки команд по образцу дописать не сложно. Всё в итоге работает через метод __rcon_send_raw_command (формирование пакета подсмотрено в открытом коде Xedoc'а)

C# код писан в том году, работоспособность на тот момент была.
 
Python:

  Показать содержимое

 



import socket
# import time


class RconCommunicator:
    """Communicate with IL-2 Battle of Stalingrad dedicated server
    through Server Remote Console - 'RCon'"""

    def __init__(self, tcp_ip, tcp_port, buffer_size=1024):
        self.TCP_IP = tcp_ip
        self.TCP_PORT = tcp_port
        self.BUFFER_SIZE = buffer_size
        self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.SOCKET.settimeout(500)
        self.CONNECTED = False
        if self.TCP_IP and self.TCP_PORT:
            try:
                self.SOCKET.connect((self.TCP_IP, self.TCP_PORT))
                self.CONNECTED = True
            finally:
                self.AUTHED = False
                self.RESPONSE_LIST = []

    def __rcon_send_raw_command(self, command='mystatus'):
        """Sends command 'as is', may cause errors"""
        if hasattr(self, 'TCP_IP') == False \
                or hasattr(self, 'TCP_PORT') == False \
                or hasattr(self, 'BUFFER_SIZE') == False \
                or hasattr(self, 'SOCKET') == False:
            raise NameError("RconCommunicator NotInitialized")
        if type(command) is not str:
            raise NameError("type(command) is not str")

        if not self.CONNECTED:
            return None
        # формируем пакет
        cl = len(command) + 1
        pack_l = cl.to_bytes(2, byteorder='little')
        pack_m = command.encode(encoding='utf-8')
        pack_z = (0).to_bytes(1, byteorder='little')
        packet = pack_l + pack_m + pack_z

        # добавить проверку, установлено ли соединение
        # отправляем пакет
        try:
            self.SOCKET.send(packet)
        except:
            self.CONNECTED = False
            return None
        resp = self.SOCKET.recv(self.BUFFER_SIZE)
        self.RESPONSE_LIST.append((resp, command))
        return str(resp[2:-1], encoding="ascii")

    def reconnect(self):
        self.SOCKET.close()
        self.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.SOCKET.settimeout(500)
        self.CONNECTED = False
        try:
            self.SOCKET.connect((self.TCP_IP, self.TCP_PORT))
            self.CONNECTED = True
        finally:
            self.AUTHED = False

    def auth(self, user, password):
        """Authenticate communicator. Gives more permission if true"""
        if not self.CONNECTED:
            return False

        resp = self.__rcon_send_raw_command("auth {0} {1}".format(user, password))

        if len(resp):
            if resp[-1] == "1":
                self.AUTHED = True
                return True
            else:
                # self.AUTHED = False
                return False
        elif type(resp) is bytes and len(resp) == 0:
            self.AUTHED = True
            return True
        else:
            # self.AUTHED = False
            return False

    def server_status(self):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("serverstatus")
        return resp

    def player_list(self):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("getplayerlist")
        return resp

    def chatmsg(self, roomtype, id, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("chatmsg {0} {1} {2}".format(roomtype, id, message))
        return resp

    def private_message(self, account_id, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(3, account_id, message)

    def allies_message(self, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(2, 1, message)

    def axis_message(self, message):
        if not self.CONNECTED:
            raise NameError("Not connected")
        return self.chatmsg(2, 2, message)

    def kick(self, name):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("kick name {0}".format(name))
        return resp

    def server_input(self, server_input):
        if not self.CONNECTED:
            raise NameError("Not connected")
        resp = self.__rcon_send_raw_command("serverinput {0}".format(server_input))
        return resp

    pass  # class

 


 
C#

  Показать содержимое

 



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;

namespace IL2RAconnector
{
    public class TcpConnector: IDisposable
    {
        TcpClient connection;
        NetworkStream stream;
        string host;
        ushort port;

        public TcpConnector(string host, ushort port)
        {
            // TODO: Complete member initialization
            this.host = host;
            this.port = port;
            connection = new TcpClient(host, (int)port);
            stream = connection.GetStream();
            
        }

        public string ExecuteCommand(string command)
        {
            Byte[] sendBytes = Encoding.UTF8.GetBytes(String.Concat(command));
            Byte[] length = BitConverter.GetBytes((ushort)(command.Length + 1));
            Byte[] zero = { 0 };
            Byte[] packet = length.Concat(sendBytes).Concat(zero).ToArray();

            stream.Write(packet, 0, packet.Length);

            packet = new Byte[connection.ReceiveBufferSize];

            Int32 bytes = stream.Read(packet, 0, packet.Length);

            UInt16 responseLength = BitConverter.ToUInt16(packet.Take(2).ToArray(), 0);

            string response = null;
            if (responseLength > 2)
                response = Encoding.UTF8.GetString(packet.Skip(2).Take((int)responseLength - 1).ToArray());
            //else
                //throw new Exception(BitConverter.ToString(packet));
            return response;
        }

        

        public int RecieveBufferSize { get { return connection.ReceiveBufferSize; } }



        public void Dispose()
        {
            stream.Close();
            connection.Close();
        }
    }
}
namespace IL2RAconnector
{
    public class RconCommunicator
    {
        private TcpConnector connection;
        
        public Stack<KeyValuePair<StatusCode, string>> History { get; private set; }
        public StatusCode lastCommandStatus { get; private set; }
        public string lastCommandResult { get; private set; }
        public List<Player> Players { get; private set; }

        public RconCommunicator(string host, ushort port)
        {
            connection = new TcpConnector(host, port);
            History = new Stack<KeyValuePair<StatusCode, string>>(Globals.HistorySize);
            Players = new List<Player>();
        }

        private void Execute(string cmd)
        {
            string response = connection.ExecuteCommand(cmd);
            string[] arr = { response, "" };

            if (response.Contains('&'))
            {
                arr = response.Split('&');
            }
            lastCommandStatus = (StatusCode)int.Parse(arr[0].Substring(7));
            lastCommandResult = Uri.UnescapeDataString(arr[1]); 

            History.Push(new KeyValuePair<StatusCode, string>(lastCommandStatus, lastCommandResult));
        }

        public string MyStatus()
        {
            //cmd: mystatus (no parameters)
            //response example: STATUS=1&authed=1
            string command = "mystatus";
            Execute(command);
            return lastCommandResult;
        }

        public string Auth(string user, string password)
        {
            //cmd: auth e-mail password
            //response example: STATUS=1
            string command = "auth " + user + " " + password;
            Execute(command);
            return lastCommandResult;
        }

        public string GetConsole()
        {
            //cmd: getconsole
            //response example: STATUS=1&console=
            string command = "getconsole";
            Execute(command);
            return lastCommandResult;
        }

        public List<Player> GetPlayerList()
        {
            //cmd: getplayerlist
            //response example: STATUS=1&playerList=
            //    playerList isnot defined when there is no players on the server,
            //    or a list of records with a columns:
            //playerList=cId,profileId,playerId,name,ingameStatus,nServerPing|
            //enum ingameStatus
            //{
            //    PS_SPECTATOR=0,
            //    PS_LOBBY_READY,
            //    PS______NONE___,
            //    PS_DOGFIGHT_READY,
            //    PS_CRAFTSITE_READY
            //}
            string command = "getplayerlist";
            Execute(command);

            string[] p = lastCommandResult.Split('|').Skip(1).ToArray();
            Players = new List<Player>(p.Count());

            foreach(var s in p)
            {
                string[] playerInfo = s.Split(',');
                Players.Add(new Player(int.Parse(playerInfo[0]), playerInfo[1], int.Parse(playerInfo[2]), playerInfo[3], playerInfo[4], playerInfo[5]));
            }

            return Players;
        }

        public string ServerStatus()
        {
            //cmd: serverstatus
            //response example: STATUS=1
            string command = "serverstatus";
            Execute(command);
            return lastCommandResult;
        }

        public string Kick(CmdValueType cmdValueType, string value)
        {
            //cmd: kick cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "kick ";
            switch (cmdValueType)
            {
                case CmdValueType.cid: 
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string Ban(CmdValueType cmdValueType, string value)
        {
            //cmd: ban cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "ban ";
            switch (cmdValueType)
            {
                case CmdValueType.cid:
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string BanUser(CmdValueType cmdValueType, string value)
        {
            //cmd: banuser cid/name/playerid/profileid value
            //response example: STATUS=1
            string command = "banuser ";
            switch (cmdValueType)
            {
                case CmdValueType.cid:
                    command += "cid ";
                    break;
                case CmdValueType.name:
                    command += "name ";
                    break;
                case CmdValueType.playerid:
                    command += "playerid ";
                    break;
                case CmdValueType.profileid:
                    command += "profileid ";
                    break;
            }
            command += value;
            Execute(command);
            return lastCommandResult;
        }

        public string UnbanAll()
        {
            //cmd: unbanall 
            //response example: STATUS=1
            string command = "unbanall";
            Execute(command);
            return lastCommandResult;
        }

        public string ServerInput(string translatorName)
        {
            //cmd: serverinput translator_name
            //response example: STATUS=1
            string command = "serverinput " + translatorName;
            Execute(command);
            return lastCommandResult;
        }

        public string SendStatNow()
        {
            //cmd: sendstatnow 
            //response example: STATUS=1
            string command = "sendstatnow";
            Execute(command);
            return lastCommandResult;
        }

        public string CutChatLog()
        {
            //cmd: cutchatlog
            //response example: STATUS=1
            string command = "cutchatlog";
            Execute(command);
            return lastCommandResult;
        }

        public string ChatMsg(RoomType roomType, string message, int recipientId)
        {
            //cmd: chatmsg roomtype id Message to send
            //response example: STATUS=1
            //chatmsg 0 -1 msg      (all)
            //chatmsg 1 cid msg     (coalition message, 0 - neutral, 1 - allies, 2 - axis)
            //chatmsg 2 cid msg     (country message, 0 - all)
            //chatmsg 3 cid msg     (private message, cid - client id from playerlist)
            

            string command;
            switch (roomType)
            {
                case RoomType.All:
                    command = string.Format("chatmsg 0 -1 {0}", message);
                    break;
                case RoomType.Coalition:
                    command = string.Format("chatmsg 1 {0} {1}", recipientId, message);
                    break;
                case RoomType.Country:
                    command = string.Format("chatmsg 2 {0} {1}", recipientId, message);
                    break;
                case RoomType.ClientId:
                    command = string.Format("chatmsg 3 {0} {1}", recipientId, message);
                    break;
                default: return string.Empty;
            }
            Execute(command);
            return lastCommandResult;
        }

        
    }
}

namespace IL2RAconnector
{
    public class Player
    {
        public int Cid { get; private set; }
        public string Name { get; private set; }
        public string ProfileId { get; private set; }
        public string PlayerId { get; private set; }
        public string IngameStatus { get; private set; }
        public int Ping { get; private set; }

        public Player(int cid, string ingameStatus, int ping, string unescapedName, string unescapedPlayerId, string unescapedProfileId)
        {
            Cid = cid;
            ProfileId = Uri.UnescapeDataString(unescapedProfileId);
            PlayerId = Uri.UnescapeDataString(unescapedPlayerId);
            IngameStatus = ingameStatus;
            Ping = ping;
            Name = Uri.UnescapeDataString(unescapedName);
        }
    }
}
 

 

 

C# Код не полон . Не хватает констант, или чего там - типа StatusCode - или Globals...

Опубликовано:
2 часа назад, ICS_Vortex сказал:

C# Код не полон

 

  • Спасибо! 1
  • 2 недели спустя...
Опубликовано: (изменено)

Дай бог здоровья тому, кто писал этот RCon...

Что за TCP Server там такой кривой блин? 

Ни с PHP, ни с Java, ни с NodeJS ни с Delphi не работает. Только подключается, но не получает ответа, на Delphi программа вообще залипает на вечно.

Неужели в ответе нету '\r\n'?

 

Единственный C# работает...которий я не хочу использовать

Изменено пользователем ICS_Vortex
Опубликовано:

Сдается мне, что дело в TCP Server`e ))

Опубликовано:
Только что, -DED-Zlodey сказал:

Сдается мне, что дело в TCP Server`e ))

 

Так вот говорю же, дай бог здоровья тому, кто писал єтот сервер...ужас. 

Опубликовано:
10 минут назад, ICS_Vortex сказал:

Так вот говорю же

Упс. Я извиняюсь, я там пропустил частицу "не" должно быть так -

 

16 минут назад, -DED-Zlodey сказал:

Сдается мне, что дело НЕ в TCP Server`e ))

 

Опубликовано: (изменено)
Только что, -DED-Zlodey сказал:

Упс. Я извиняюсь, я там пропустил частицу "не" должно быть так -

 

А я не извиняюсь) Там явно дело в сервере. Погуглив - результат - зависание єто причина отсутствия новой строки - символа CRLF. 

Но да ладно. 

Я кое какие пробелы кода восстановил. Там в основном то Энумераторы. 

Но блин. Писать приложение на WinForm - себе дороже, встраивать кнопки в таблицы - тот ещё геморой на C#. А WPF я пока не знаю толком...

Прийдется корячить через WFP и Binding...((( Метод хорош, когда ты его знаешь(

Изменено пользователем ICS_Vortex
Опубликовано:
10 минут назад, ICS_Vortex сказал:

Там явно дело в сервере.

1. Выше есть код на питоне. Я не проверял, но уверен абсолютно рабочий, так как автор довольно продолжительное время для Рандома писал именно на питоне.

2. Есть такой сервер польский TAW я не уверен, но подозреваю, что там управление реализовано как раз на PHP.

3 C# я убедительно демонстрирую в ролике выше.

 

Похоже на то, что у тебя все хорошо написано, а у того, кто написал RCON не все хорошо, да. :rofl:

Опубликовано:
Только что, -DED-Zlodey сказал:

Похоже на то, что у тебя все хорошо написано, а у того, кто написал RCON не все хорошо, да. :rofl:

 

Тогда чем обьяснишь факт, что на нескольких языках одна и та же проблема - нету ответа от сервера?

Я понимаю, признать факт кривости реализации этого TCP Socket сервера - это сложно. Но да ладно. Я прогнусь. Напишу на C#.

Опубликовано:
2 минуты назад, ICS_Vortex сказал:

Я понимаю, признать факт кривости реализации этого TCP Socket сервера - это сложно. Но да ладно. Я прогнусь. Напишу на C#.

Послушай.

Не я писал РКОН и ДСервер, я не могу признать кривость реализации так как не эксперт-раз, не видел исходного кода - два. Однако, могу признать работоспособность РКОНа как такового, поскольку на это указывают как минимум три объективные причины приведенные мной выше?, к которым можно добавить еще штатную утилиту.

 

В тоже время, врываешься ты, не показываешь свой код, не показываешь запросы, на которые не отвечает сервер, и объявляешь в криворукости разработчиков. На что это похоже? Как минимум на хамство, как максимум на скупость ума.

 

Думаю, тебе придется самостоятельно в дальнейшем разбираться, так как в таком тоне с тобой вряд ли кто пойдет на диалог с целью оказания информационной помощи. Это к тому, что пиши на чем угодно, прогибайся, выпрямляйся - всем насрать. ;)

Опубликовано:
Только что, -DED-Zlodey сказал:

Послушай.

Не я писал РКОН и ДСервер, я не могу признать кривость реализации так как не эксперт-раз, не видел исходного кода - два. Однако, могу признать работоспособность РКОНа как такового, поскольку на это указывают как минимум три объективные причины приведенные мной выше?, к которым можно добавить еще штатную утилиту.

 

В тоже время, врываешься ты, не показываешь свой код, не показываешь запросы, на которые не отвечает сервер, и объявляешь в криворукости разработчиков. На что это похоже? Как минимум на хамство, как максимум на скупость ума.

 

Думаю, тебе придется самостоятельно в дальнейшем разбираться, так как в таком тоне с тобой вряд ли кто пойдет на диалог с целью оказания информационной помощи. Это к тому, что пиши на чем угодно, прогибайся, выпрямляйся - всем насрать. ;)

 

Больно уж надо. Буд-то до этого кто-то сильно помог...

  • ХА-ХА 1
Опубликовано:
4 часа назад, -DED-Zlodey сказал:

Я не проверял, но уверен абсолютно рабочий, так как автор довольно продолжительное время для Рандома писал именно на питоне.

Даже я смог разробраться, рабочий.

 

Спасибо Максу, кстати!

  • Поддерживаю! 2
  • 4 недели спустя...
Опубликовано: (изменено)

Вот пример. При чем, коннектится к серверу - а ответа от сервера - никакого...что б не слал на сервер...

 

var net = require('net');

var client = new net.Socket();
client.connect(1337, '127.0.0.1', function() {
	console.log('Connected');
	client.write('Hello, server! Love, Client.');
});

client.on('data', function(data) {
	console.log('Received: ' + data);
	client.destroy(); // kill client after server's response
});

client.on('close', function() {
	console.log('Connection closed');
});

 

Изменено пользователем ICS_Vortex
Опубликовано: (изменено)

Шо, все "специалисты" вымерли? Это все? Полномочия окончены? Быстро...

 

Ладно, попытка #2. Какая разница между командами ban и banuser?

Изменено пользователем ICS_Vortex
  • Поддерживаю! 1
  • 3 недели спустя...
  • 2 недели спустя...
Опубликовано:
09.08.2020 в 18:42, -DED-Rapidus сказал:

@ICS_Vortex,Пока никакой, обе команды выдают бан на 15 минут.

 

Спасибо за ответ. 

Я так понимаю, что перманентного бана в RCON API нету? Будет ли?

  • 1CGS
Опубликовано:

Нету, будет или нет пока не могу сказать точно.

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
×
×
  • Создать...