Ejemplo n.º 1
0
        public static async Task InitServer(string serverLogin)
        {
            var client = XmlRPC_Clients[serverLogin];

            await client.Manager.AsyncSendCall(GbxParam.Create("Authenticate",
                                                               ServersConfig[serverLogin].SuperAdminLogin,
                                                               ServersConfig[serverLogin].SuperAdminPassword));

            await client.Manager.AsyncSendCall(GbxParam.Create("EnableCallbacks", true));

            await client.Manager.AsyncSendCall(GbxParam.Create("SetApiVersion", "2013-04-16"));

            await client.Manager.AsyncSendCall(GbxParam.Create("ChatSendServerMessage", "The controller successfuly made a link to this server!"));

            await client.Refresh();

            client.IsLoaded = true;

            foreach (var service in client.ServerServices)
            {
                await((IServiceServer)service.Value).ServerLoaded();
            }
            for (int i = 0; i < Plugins.Count; i++)
            {
                await Plugins[i].OnServerLoaded(client.ServerInfo.Login);
            }

            await client.ApplyFullInformationsToMaps();
        }
Ejemplo n.º 2
0
        public async Task RefreshMapList()
        {
            var fileNames = new List <string>();

            (await Manager.AsyncSendCall(GbxParam.Create("GetMapList", 2000, 0)))
            .Parameters[0]
            .TypeCast <List <object> >()
            .ForEach((object value) =>
            {
                var hashtable   = value.TypeCast <Dictionary <string, object> >();
                string fileName = (string)hashtable["FileName"];
                string UId      = (string)hashtable["UId"];

                if (!MapList.ContainsKey(UId))
                {
                    MapList[UId] = new CMap();
                }

                var map           = MapList[UId];
                map.UId           = UId;
                map.FileName      = fileName;
                map.Name          = (string)hashtable["Name"];
                map.Author        = (string)hashtable["Author"];
                map.Environnement = (string)hashtable["Environnement"];
                map.LoadingState  = HalfClass.CurrentState.PrimaryInfoFilled;

                fileNames.Add(fileName);
            }
                     );
        }
Ejemplo n.º 3
0
        private async Task <GbxParam> ToGbx(TcpClient socket, byte[] buffer)
        {
            if (socket.Connected)
            {
                byte[] bSize   = new byte[4];
                byte[] bHandle = new byte[4];

                if (buffer == null)
                {
                    Console.WriteLine("Buffer shouldn't be null!");

                    var stream = socket.GetStream();
                    await stream.ReadAsync(bSize, 0, bSize.Length);

                    await stream.ReadAsync(bHandle, 0, bHandle.Length);
                }
                else
                {
                    Array.Copy(buffer, 0, bSize, 0, 4);
                    Array.Copy(buffer, 4, bHandle, 0, 4);
                }
                int size   = BitConverter.ToInt32(bSize, 0);
                int handle = BitConverter.ToInt32(bHandle, 0);

                // receive response body ...
                byte[] data = await ReceiveRpc(socket, size);

                // parse the response ...
                GbxParam gbx = GbxParam.ParseResponse(handle, data);

                return(gbx);
            }
            throw new NotConnectedException();
        }
Ejemplo n.º 4
0
        public async Task RefreshServerInfo()
        {
            var call = await Manager.AsyncSendCall(GbxParam.Create("GetMainServerPlayerInfo"));

            var hash = (Dictionary <string, object>)call.Parameters[0];

            ServerInfo       = new CServerInfo();
            ServerInfo.Login = (string)hash["Login"];

            if (CManiaNextControl.XmlRPC_Clients.ContainsValue(this))
            {
                var keys = new List <string>();
                foreach (var kvp in CManiaNextControl.XmlRPC_Clients)
                {
                    if (ServerInfo.Login == kvp.Key &&
                        this != kvp.Value)
                    {
                        CManiaNextControl.XmlRPC_Clients[kvp.Key] = this;
                    }
                    else if (kvp.Key != ServerInfo.Login &&
                             this == kvp.Value)
                    {
                        keys.Add(kvp.Key);
                    }
                }
                for (int i = 0; i < keys.Count; i++)
                {
                    CManiaNextControl.XmlRPC_Clients.Remove(keys[i]);
                }
                CManiaNextControl.XmlRPC_Clients[ServerInfo.Login] = this;
            }
        }
Ejemplo n.º 5
0
        public async Task InsertMap(string filePath)
        {
            var gbx = await con.Manager.AsyncSendCall(GbxParam.Create("InsertMap", filePath));

            if (gbx.isError)
            {
                await ChatSendServerMessage("$f00ERROR: " + gbx.ErrorString);
            }
        }
Ejemplo n.º 6
0
        public async Task WriteFile(string filePath, string fileContent)
        {
            GbxParam sentGBX = GbxParam.Create("WriteFile", filePath, CodePagesEncodingProvider.Instance.GetEncoding(1252).GetBytes(fileContent));
            var      gbx     = await con.Manager.AsyncSendCall(sentGBX);

            if (gbx.isError)
            {
                await ChatSendServerMessage("$f00ERROR: " + gbx.ErrorString + " \nSent XML:\n");
            }
        }
Ejemplo n.º 7
0
        private async void OnReceive(IAsyncResult result)
        {
            Console.WriteLine("Receiving something!");

            GbxParam gbx = await ToGbx(tcpClient, Buffer);

            tcpClient.Client.Blocking = true;

            Buffer = new byte[8];

            if (gbx.Type == GbxParam.MessageType.Callback)
            {
                CallbackContext cc = new CallbackContext();
                cc.eventName       = gbx.EventName;
                cc.result          = gbx.Parameters;
                cc.realCall        = true;
                cc.operationNumber = gbx.Handle;
                cc.fromManialink   = gbx.EventName == "ManiaPlanet.PlayerManialinkPageAnswer";
                cc.gbx             = gbx;
                cc.callerClient    = Client;

                OnNewCallback?.Invoke(cc);
            }
            else
            {
                if (callbackList.ContainsKey(gbx.Handle) && callbackList[gbx.Handle] != null)
                {
                    // TODO: ((GbxCallCallbackHandler)callbackList[gbx.Handle])?.BeginInvoke(gbx, null, null);
                    var origin = (GbxParam)callbackList[gbx.Handle];
                    gbx.EventName = origin.EventName;
                    callbackList.Remove(gbx.Handle);
                }
                responses[gbx.Handle] = gbx;

                CallbackContext cc = new CallbackContext();
                cc.eventName       = gbx.EventName;
                cc.result          = gbx.Parameters;
                cc.realCall        = true;
                cc.operationNumber = gbx.Handle;
                cc.fromManialink   = gbx.EventName == "ManiaPlanet.PlayerManialinkPageAnswer";
                cc.gbx             = gbx;
                cc.callerClient    = Client;

                OnNewCallback?.Invoke(cc);
            }

            tcpClient.Client.Blocking = false;

            await tcpClient.GetStream().ReadAsync(Buffer, 0, Buffer.Length)
            .ContinueWith(OnReceive);
        }
Ejemplo n.º 8
0
        public async Task RefreshPlayerList()
        {
            var call = await Manager.AsyncSendCall(GbxParam.Create("GetPlayerList", 510, 0));

            foreach (Dictionary <string, object> dico in (List <object>)call.Parameters[0])
            {
                if (!CPlayer.AllPlayers.TryGetValue((string)dico["Login"], out var player))
                {
                    player = new CPlayer()
                    {
                        User = new CUser()
                        {
                            Login = (string)dico["Login"]
                        },
                        NickName      = (string)dico["NickName"],
                        PlayerId      = (int)dico["PlayerId"],
                        TeamId        = (int)dico["TeamId"],
                        IsSpectator   = (int)dico["TeamId"] > 0,
                        LadderRanking = (int)dico["LadderRanking"],
                        Server        = this,
                    };
                }
                else
                {
                    player.NickName      = (string)dico["NickName"];
                    player.PlayerId      = (int)dico["PlayerId"];
                    player.TeamId        = (int)dico["TeamId"];
                    player.IsSpectator   = (int)dico["TeamId"] > 0;
                    player.LadderRanking = (int)dico["LadderRanking"];
                    player.Server        = this;
                }

                player.LoadingState = HalfClass.CurrentState.PrimaryInfoFilled;

                CPlayer.AllPlayers[player.User.Login] = player;

                // Get detailed info
                call = await Manager.AsyncSendCall(GbxParam.Create("GetDetailedPlayerInfo", player.User.Login));

                var dicoDetail = (Dictionary <string, object>)call.Parameters[0];
                player.User.IPAddress    = (string)dicoDetail["IPAddress"];
                player.User.DownloadRate = (int)dicoDetail["DownloadRate"];
                player.User.UploadRate   = (int)dicoDetail["UploadRate"];
                player.User.Language     = (string)dicoDetail["Language"];

                player.User.Player = player;

                player.LoadingState = HalfClass.CurrentState.AllInfoFilled;
            }
        }
Ejemplo n.º 9
0
        public async Task ApplyFullInformationsToMaps()
        {
            foreach (var map in MapList.Values)
            {
                var hashtable = (await Manager.AsyncSendCall(GbxParam.Create("GetMapInfo", map.FileName)))
                                .Parameters[0]
                                .TypeCast <Dictionary <string, object> >();

                map.Convert(hashtable);
                map.LoadingState = HalfClass.CurrentState.AllInfoFilled;

                CManiaNextControl.Events.OnGettingMapInformation_Invoke(this, map);
            }
        }
Ejemplo n.º 10
0
        public async Task RefreshMapCompletely(string uid, string filemapname)
        {
            MapList.TryGetValue(uid, out var map);
            if (map == null)
            {
                map = new CMap()
                {
                    UId      = uid,
                    FileName = filemapname
                }
            }
            ;

            var hashtable = (await Manager.AsyncSendCall(GbxParam.Create("GetMapInfo", map.FileName)))
                            .Parameters[0]
                            .TypeCast <Dictionary <string, object> >();

            map.Convert(hashtable);
            map.LoadingState = HalfClass.CurrentState.AllInfoFilled;

            CManiaNextControl.Events.OnGettingMapInformation_Invoke(this, map);
        }
Ejemplo n.º 11
0
        public async Task <GbxParam> AsyncSendCall(GbxParam callToSend, Action <GbxParam> actionOnResult = null)
        {
            //var data = Encoding.UTF8.GetBytes(callToSend.Result);
            //tcpClient.Client.BeginSend(data, 0, data.Length, 0, new AsyncCallback((result) => { Console.WriteLine(callToSend.Result); }), tcpClient.Client);
            callToSend.Handle = --requests;
            int handle = await SendCall(tcpClient, callToSend);

            await Task.Factory.StartNew(() =>
            {
                bool createdNew;
                var waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, (Guid.NewGuid().ToString() + Guid.NewGuid().ToString()), out createdNew);

                do
                {
                    waitHandle.WaitOne(TimeSpan.FromSeconds(1 / 20f));
                }while (!responses.ContainsKey(handle) || responses[handle] == null);
            }).ContinueWith(x => x);

            actionOnResult?.Invoke(responses[handle]);

            return(responses[handle]);
        }
Ejemplo n.º 12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="server">Parameter ignored if players is not empty. If null, this will be sent to all servers</param>
        /// <param name="timeBeforeHide"></param>
        /// <param name="players"></param>
        public async void Send(XmlRPCManager[] servers = null, int timeBeforeHide = 0, params CPlayer[] players)
        {
            if (!hasCorrectId)
            {
                throw new IncorrectIDException("No ID was put.");
            }
            if (!hasCorrectName)
            {
                throw new IncorrectNameException("No name was put.");
            }

            if (players == null || players.Count() == 0)
            {
                var sendToServers = servers;
                if (sendToServers == null ||
                    sendToServers.Length == 0)
                {
                    sendToServers = CManiaNextControl.XmlRPC_Clients.Select(s => s.Value.Manager).ToArray();
                }

                foreach (var server in sendToServers)
                {
                    await server.AsyncSendCall(GbxParam.Create("SendDisplayManialinkPage", contents ?? "", timeBeforeHide, false), (gbx) =>
                    {
                        Console.WriteLine($"result: hasError:{gbx.isError} errorCode:{gbx.ErrorCode} errorString:{gbx.ErrorString}");
                    });
                }
            }
            else
            {
                foreach (var player in players)
                {
                    await player.Server.Manager.AsyncSendCall(GbxParam.Create("SendDisplayManialinkPageToLogin", player.User.Login, contents ?? "", timeBeforeHide, false), (gbx) =>
                    {
                        Console.WriteLine($"result: hasError:{gbx.isError} errorCode:{gbx.ErrorCode} errorString:{gbx.ErrorString}");
                    });
                }
            }
        }
Ejemplo n.º 13
0
        public static async Task <int> SendCall(TcpClient client, GbxParam inCall)
        {
            if (client == null || inCall == null)
            {
                return(0);
            }
            if (client.Connected)
            {
                try
                {
                    // create request body ...
                    byte[] body = Encoding.UTF8.GetBytes(inCall.Result);

                    // create response header ...
                    byte[] bSize   = BitConverter.GetBytes(body.Length);
                    byte[] bHandle = BitConverter.GetBytes(inCall.Handle);

                    // create call data ...
                    byte[] call = new byte[bSize.Length + bHandle.Length + body.Length];
                    Array.Copy(bSize, 0, call, 0, bSize.Length);
                    Array.Copy(bHandle, 0, call, 4, bHandle.Length);
                    Array.Copy(body, 0, call, 8, body.Length);

                    // send call ...
                    var stream = client.GetStream();
                    await stream.WriteAsync(call, 0, call.Length);

                    await stream.FlushAsync();

                    return(inCall.Handle);
                }
                catch
                {
                    return(0);
                }
            }
            throw new NotConnectedException();
        }
Ejemplo n.º 14
0
 public async Task <GbxParam> ChooseNextMap(string mapFileName)
 {
     return(await con.Manager.AsyncSendCall(GbxParam.Create("ChooseNextMap", mapFileName)));
 }
Ejemplo n.º 15
0
        public async Task <GbxParam> ChooseNextMapList(List <string> mapFilesName)
        {
            var gbx = GbxParam.LegacyCreate("ChooseNextMapList", mapFilesName.ToArray());

            return(await con.Manager.AsyncSendCall(gbx));
        }
Ejemplo n.º 16
0
 public void SendCall(GbxParam callToSend, Action <GbxParam> actionOnResult = null)
 {
     AsyncSendCall(callToSend, actionOnResult).Wait();
 }
Ejemplo n.º 17
0
 public async Task Maniaplanet_UI_SetAltScoresTableVisibility(bool state)
 {
     await con.Manager.AsyncSendCall(GbxParam.Create("Maniaplanet.UI.SetAltScoresTableVisibility", state));
 }
        public async void ProcessCallback(CallbackContext cc)
        {
            var gbx = cc.gbx;
            var op  = gbx.Parameters;

            switch (gbx.EventName)
            {
            case Code_PlayerConnect:
            {
                var player = await CPlayer.GetPlayerFromLogin((string)op[0], new[] { this }, false);

                player.LoadingState = HalfClass.CurrentState.PrimaryInfoFilled;

                CPlayer.AllPlayers[player.User.Login] = player;

                // Get detailed info
                var call = await Manager.AsyncSendCall(GbxParam.Create("GetDetailedPlayerInfo", player.User.Login));

                var dicoDetail = (Dictionary <string, object>)call.Parameters[0];
                player.User              = new CUser();
                player.User.IPAddress    = (string)dicoDetail["IPAddress"];
                player.User.DownloadRate = (int)dicoDetail["DownloadRate"];
                player.User.UploadRate   = (int)dicoDetail["UploadRate"];
                player.User.Language     = (string)dicoDetail["Language"];

                player.User.Player = player;

                player.LoadingState = HalfClass.CurrentState.AllInfoFilled;

                await ApplyInterfaceHelpers(player);

                player.LoadingState     = HalfClass.CurrentState.AllInfoFilled;
                player.ControllerLoaded = true;

                await Manager.AsyncSendCall(GbxParam.Create("ChatSendServerMessage", $"$0f0$555⏵ $fffWelcome $<{player.NickName}$z$s$> $fffto the server!"));

                TriggerListeners <PlayerConnect>(this, o => o.Callback(this, (string)op[0], (bool)op[1]));
                break;
            }

            case Code_PlayerDisconnect:
            {
                CPlayer.AllPlayers.TryGetValue((string)op[0], out var player);
                await Manager.AsyncSendCall(GbxParam.Create("ChatSendServerMessage", $"$0f0$555⏵ $fffBye bye $<{(player == null || player.NickName == null ? (string)op[0] : player.NickName)}$z$s$> $fff:("));

                TriggerListeners <PlayerDisconnect>(this, o => o.Callback(this, (string)op[0], (string)op[1]));
                break;
            }

            case Code_PlayerChat:
                if (op.Length == 4)
                {
                    TriggerListeners <PlayerChat>(this, o => o.Callback(this, (int)op[0], (string)op[1], (string)op[2], (bool)op[3]));
                }
                break;

            case Code_BeginMap:
                var smap = SMapInfo.Convert((Dictionary <string, object>)op[0]);
                await RefreshMapCompletely(smap.UId, smap.FileName);

                if (op.Length == 1)
                {
                    TriggerListeners <BeginMap>(this, o => o.Callback(this, smap));
                }
                break;

            case Code_EndMap:
                if (op.Length == 1)
                {
                    TriggerListeners <EndMap>(this, o => o.Callback(this, SMapInfo.Convert((Dictionary <string, object>)op[0])));
                }
                break;

            case Code_MapListModified:
                TriggerListeners <MapListModified>(this, o => o.Callback(this, 0, 0, true));
                break;

            case Code_PlayerManialinkPageAnswer:
                TriggerListeners <PlayerManialinkPageAnswer>(this, o => o.Callback(this, (int)op[0], (string)op[1], (string)op[2]));
                break;
            }
        }
Ejemplo n.º 19
0
 public async Task ChatSendServerMessage(string message)
 {
     await con.Manager.AsyncSendCall(GbxParam.Create("ChatSendServerMessage", message));
 }