Ejemplo n.º 1
0
        public ActionResult CheckCheatBidsByCandidateId(int candidateId, int configA = 500, int configB = 100, int configC = 100)
        {
            AntiCheat ac = new AntiCheat(configA, configB, configC);

            ac.CheckVoteByCandidate(candidateId);
            return(null);
        }
Ejemplo n.º 2
0
        public ActionResult CheckCheatBids(int topCount, int configA = 500, int configB = 100, int configC = 100)
        {
            CandidateRepository cr = new CandidateRepository();
            IEnumerable <int>   topCandidateIds = cr.GetTopCandidates(topCount);
            AntiCheat           ac = new AntiCheat(configA, configB, configC);

            foreach (int candidateId in topCandidateIds)
            {
                ac.CheckVoteByCandidate(candidateId);
            }
            return(null);
        }
Ejemplo n.º 3
0
        public static cint Encode(int value)
        {
            int v = value;

            v ^= AntiCheat.Factor;
            v += AntiCheat.Factor;
            v  = ~v;
            return(new cint {
                value = v,
                check = AntiCheat.CalcCheck(value),
                inited = true
            });
        }
Ejemplo n.º 4
0
        public static clong Encode(long value)
        {
            long v = value;

            v ^= AntiCheat.Factor;
            v += AntiCheat.Factor;
            v  = ~v;
            return(new clong {
                value = v,
                check = AntiCheat.CalcCheck(value),
                inited = true
            });
        }
Ejemplo n.º 5
0
 public static long Decode(clong value)
 {
     if (value.inited)
     {
         long v = value.value;
         v  = ~v;
         v -= AntiCheat.Factor;
         v ^= AntiCheat.Factor;
         if (value.check == AntiCheat.CalcCheck(v))
         {
             return(v);
         }
         else
         {
             AntiCheat.InvokeOnCheat();
         }
     }
     return(0);
 }
Ejemplo n.º 6
0
 public static bool Decode(cbool value)
 {
     if (!value.inited)
     {
         return(false);
     }
     else if (value.value == AntiCheat.Factor)
     {
         return(true);
     }
     else if (value.value == ~AntiCheat.Factor)
     {
         return(false);
     }
     else
     {
         AntiCheat.InvokeOnCheat();
         return(false);
     }
 }
Ejemplo n.º 7
0
        public static void LoadSub()
        {
            Channels.Load();

            Clan.Load();

            AntiCheat.Load();

            Player.Load();

            LoginEvent.Load();

            Experience.Load();

            ChatEvent.Load();

            Christmas.Load();

            RandomBoxEvent.Load();

            ChristmasBoxEvent.Load();

            SupplyBoxEvent.Load();
        }
        public static void handleGameState(string uri, string serverreply = "", string POST = "", string GET = "")
        {
            RPCstartTimestamp = DateTime.Now;

            var SBRW_XML = new XmlDocument();

            string[] splitted_uri = uri.Split('/');

            if (uri == "/events/gettreasurehunteventsession")
            {
                PersonaTreasure = 0;
                TotalTreasure   = 15;
                TEDay           = 0;

                SBRW_XML.LoadXml(serverreply);
                var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText);
                for (var i = 0; i < 15; i++)
                {
                    if ((xPersonaTreasure & (1 << (15 - i))) != 0)
                    {
                        PersonaTreasure++;
                    }
                }

                TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText);
                TEDay         = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText);
            }

            if (uri == "/events/notifycoincollected")
            {
                PersonaTreasure++;

                _presence.Details = "Collecting gems (" + PersonaTreasure + " of " + TotalTreasure + ")";
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "Treasure Hunt - Day: " + TEDay,
                    SmallImageKey  = "gamemode_treasure"
                };

                MainScreen.discordRpcClient.SetPresence(_presence);
            }


            if (uri == "/User/SecureLoginPersona")
            {
                LoggedPersonaId       = GET.Split(';').Last().Split('=').Last();
                canUpdateProfileField = true;
                Helper.personaid      = LoggedPersonaId;
            }

            if (uri == "/User/SecureLogoutPersona")
            {
                PersonaId       = String.Empty;
                PersonaName     = String.Empty;
                PersonaLevel    = String.Empty;
                PersonaAvatarId = String.Empty;
                PersonaCarId    = String.Empty;
                PersonaCarName  = String.Empty;
                PersonaTreasure = 0;
            }

            //FIRST PERSONA EVER LOCALIZED IN CODE
            if (uri == "/User/GetPermanentSession")
            {
                //try { Statuses.getToken(); } catch { }

                try {
                    SBRW_XML.LoadXml(serverreply);

                    PersonaName     = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]");
                    PersonaLevel    = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText;
                    PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText;
                    PersonaId       = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText;

                    //Let's get rest of PERSONAIDs
                    XmlNode     UserInfo = SBRW_XML.SelectSingleNode("UserInfo");
                    XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData");
                    foreach (XmlNode node in personas)
                    {
                        PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText);
                    }
                } catch (Exception) {
                }
            }

            //CREATE/DELETE PERSONA Handler
            if (uri == "/DriverPersona/CreatePersona")
            {
                SBRW_XML.LoadXml(serverreply);
                PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText);
            }

            //DRIVING CARNAME
            if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField == true)
            {
                if (LoggedPersonaId == GET.Split(';').Last().Split('=').Last())
                {
                    SBRW_XML.LoadXml(serverreply);
                    PersonaName     = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                    PersonaLevel    = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText;
                    PersonaAvatarId = (SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText == "26") ? "nfsw" : "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText;
                    PersonaId       = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText;

                    AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                }
            }

            if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite")
            {
                _presence.Details = "Driving " + PersonaCarName;
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "In-Freeroam",
                    SmallImageKey  = "gamemode_freeroam"
                };

                _presence.Timestamps = GetCurrentTimestamp();
                MainScreen.discordRpcClient.SetPresence(_presence);

                eventTerminatedManually = true;
                Self.CanDisableGame     = true;
            }

            //IN LOBBY
            if (uri == "/matchmaking/acceptinvite")
            {
                Self.CanDisableGame = false;

                SBRW_XML.LoadXml(serverreply);
                var eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId");

                if (eventIdNode != null)
                {
                    EventID = Convert.ToInt32(eventIdNode.InnerText);

                    _presence.Details = "In Lobby: " + EventList.getEventName(EventID);
                    _presence.State   = serverName;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = EventList.getEventName(Convert.ToInt32(EventID)),
                        SmallImageKey  = EventList.getEventType(Convert.ToInt32(EventID))
                    };
                    MainScreen.discordRpcClient.SetPresence(_presence);

                    eventTerminatedManually = false;
                }
            }

            if (uri == "/matchmaking/joinqueueracenow")
            {
                _presence.Details = "Searching for event...";
                _presence.State   = serverName;
                _presence.Assets  = new Assets {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "In-Freeroam",
                    SmallImageKey  = "gamemode_freeroam"
                };
                _presence.Timestamps = GetCurrentTimestamp();
                MainScreen.discordRpcClient.SetPresence(_presence);

                eventTerminatedManually = true;
            }

            //IN SAFEHOUSE/FREEROAM
            if (uri == "/DriverPersona/UpdatePersonaPresence")
            {
                string UpdatePersonaPresenceParam = GET.Split(';').Last().Split('=').Last();
                _presence.Assets = new Assets();
                if (UpdatePersonaPresenceParam == "1")
                {
                    _presence.Details = "Driving " + PersonaCarName;
                    _presence.Assets.SmallImageText = "In-Freeroam";
                    _presence.Assets.SmallImageKey  = "gamemode_freeroam";

                    Self.CanDisableGame = true;
                }
                else
                {
                    _presence.Details = "In Safehouse";
                    _presence.Assets.SmallImageText = "In-Safehouse";
                    _presence.Assets.SmallImageKey  = "gamemode_safehouse";
                    Self.CanDisableGame             = false;
                }

                _presence.State = serverName;
                _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel;
                _presence.Assets.LargeImageKey  = PersonaAvatarId;

                _presence.Timestamps = GetCurrentTimestamp();

                MainScreen.discordRpcClient.SetPresence(_presence);
            }

            //IN EVENT
            if (Regex.Match(uri, "/matchmaking/launchevent").Success)
            {
                Self.CanDisableGame = false;

                EventID = Convert.ToInt32(splitted_uri[3]);

                _presence.Details = "In Event: " + EventList.getEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventList.getEventName(EventID),
                    SmallImageKey  = EventList.getEventType(EventID)
                };


                MainScreen.discordRpcClient.SetPresence(_presence);

                eventTerminatedManually = false;
            }
            if (uri == "/event/arbitration")
            {
                _presence.Details = "In Event: " + EventList.getEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventList.getEventName(EventID),
                    SmallImageKey  = EventList.getEventType(EventID)
                };

                AntiCheat.disableChecks();
                MainScreen.discordRpcClient.SetPresence(_presence);

                eventTerminatedManually = false;
            }
            if (uri == "/event/launched" && eventTerminatedManually == false)
            {
                _presence.Details = "In Event: " + EventList.getEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventList.getEventName(EventID),
                    SmallImageKey  = EventList.getEventType(EventID)
                };

                AntiCheat.event_id = EventID;
                AntiCheat.enableChecks();

                _presence.Timestamps = GetCurrentTimestamp();

                MainScreen.discordRpcClient.SetPresence(_presence);
            }

            //CARS RELATED
            foreach (var single_personaId in PersonaIds)
            {
                if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success)
                {
                    carslotsXML = serverreply;

                    SBRW_XML.LoadXml(carslotsXML);

                    int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText);
                    int current   = 0;

                    XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                    XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                    foreach (XmlNode node in OwnedCarTrans)
                    {
                        if (DefaultID == current)
                        {
                            PersonaCarName = CarList.getCarName(node.SelectSingleNode("CustomCar/Name").InnerText);
                        }
                        current++;
                    }
                }
                if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success)
                {
                    if (splitted_uri.Last() != "defaultcar")
                    {
                        string receivedId = splitted_uri.Last();

                        SBRW_XML.LoadXml(carslotsXML);
                        XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                        XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                        foreach (XmlNode node in OwnedCarTrans)
                        {
                            if (receivedId == node.SelectSingleNode("Id").InnerText)
                            {
                                PersonaCarName = CarList.getCarName(node.SelectSingleNode("CustomCar/Name").InnerText);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
0
        private void LaunchGame()
        {
            WindowState = FormWindowState.Minimized;

            var args = "EU " + Tokens.IPAddress + " " + Tokens.LoginToken + " " + Tokens.UserId;
            var psi  = new ProcessStartInfo();


            psi.WorkingDirectory = Directory.GetCurrentDirectory();
            psi.FileName         = "nfsw.exe";
            psi.Arguments        = args;

            var nfswProcess = Process.Start(psi);

            nfswProcess.PriorityClass = ProcessPriorityClass.AboveNormal;

            var processorAffinity = 0;

            for (var i = 0; i < Math.Min(Math.Max(1, Environment.ProcessorCount), 8); i++)
            {
                processorAffinity |= 1 << i;
            }

            nfswProcess.ProcessorAffinity = (IntPtr)processorAffinity;

            AntiCheat.process_id = nfswProcess.Id;
            AntiCheat.Checks();

            //TIMER HERE
            secondsToShutDown = (result["secondsToShutDown"].AsInt == 0) ? result["secondsToShutDown"].AsInt : 2 * 60 * 60;
            System.Timers.Timer shutdowntimer = new System.Timers.Timer();
            shutdowntimer.Elapsed += (x2, y2) =>
            {
                Process[] allOfThem = Process.GetProcessesByName("nfsw");

                if (secondsToShutDown <= 0)
                {
                    GameKilledBySpeedBugCheck = true;

                    foreach (var oneProcess in allOfThem)
                    {
                        Process.GetProcessById(oneProcess.Id).Kill();
                    }
                }

                //change title

                foreach (var oneProcess in allOfThem)
                {
                    long     p = oneProcess.MainWindowHandle.ToInt64();
                    TimeSpan t = TimeSpan.FromSeconds(secondsToShutDown);
                    string   secondsToShutDownNamed = string.Format("{0:D2}:{1:D2}:{2:D2}", t.Hours, t.Minutes, t.Seconds);

                    User32.SetWindowText((IntPtr)p, "NEED FOR SPEED™ WORLD | Server: " + SelectedServerName + " | " + UserAgent.WindowTextForGame + " | Force Restart In: " + secondsToShutDownNamed);
                }

                --secondsToShutDown;
            };

            shutdowntimer.Interval = 1000;
            shutdowntimer.Enabled  = true;

            if (nfswProcess != null)
            {
                nfswProcess.EnableRaisingEvents = true;
                _nfswPid = nfswProcess.Id;

                nfswProcess.Exited += (sender2, e2) =>
                {
                    _nfswPid = 0;
                    var exitCode = nfswProcess.ExitCode;

                    if (GameKilledBySpeedBugCheck == true && CheatsWasUsed == false)
                    {
                        exitCode = 2137;
                    }
                    if (CheatsWasUsed == true)
                    {
                        exitCode = 2017;
                    }

                    if (exitCode == 0)
                    {
                        CloseButton(null, null);
                    }
                    else
                    {
                        try
                        {
                            AntiCheat.thread.Abort();
                        }
                        catch { }

                        String errorMsg = "Game Crash with exitcode: " + exitCode.ToString() + " (0x" + exitCode.ToString("X") + ")";
                        if (exitCode == -1073741819)
                        {
                            errorMsg = "Game Crash: Access Violation (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -1073740940)
                        {
                            errorMsg = "Game Crash: Heap Corruption (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -1073740791)
                        {
                            errorMsg = "Game Crash: Stack buffer overflow (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -805306369)
                        {
                            errorMsg = "Game Crash: Application Hang (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -1073741515)
                        {
                            errorMsg = "Game Crash: Missing dependency files (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -1073740972)
                        {
                            errorMsg = "Game Crash: Debugger crash (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == -1073741676)
                        {
                            errorMsg = "Game Crash: Division by Zero (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == 1)
                        {
                            errorMsg = "The process nfsw.exe was killed via Task Manager";
                        }
                        if (exitCode == 2017)
                        {
                            errorMsg = "Server replied with Code: " + Tokens.UserId + " (0x" + exitCode.ToString("X") + ")";
                        }
                        if (exitCode == 2137)
                        {
                            errorMsg = "Launcher killed your game to prevent SpeedBugging.";
                        }
                        if (exitCode == -3)
                        {
                            errorMsg = "The Server was unable to resolve the request";
                        }
                        if (exitCode == -4)
                        {
                            errorMsg = "Another instance is already executed";
                        }
                        if (exitCode == -5)
                        {
                            errorMsg = "DirectX Device was not found. Please install GPU Drivers before playing";
                        }
                        if (exitCode == -6)
                        {
                            errorMsg = "Server was unable to resolve your request";
                        }
                        //ModLoader
                        if (exitCode == 2)
                        {
                            errorMsg = "ModNet: Game was launched with invalid command line parameters.";
                        }
                        if (exitCode == 3)
                        {
                            errorMsg = "ModNet: .links file should not exist upon startup!";
                        }
                        if (exitCode == 4)
                        {
                            errorMsg = "ModNet: An Unhandled Error Appeared";
                        }

                        if (_nfswPid != 0)
                        {
                            try
                            {
                                Process.GetProcessById(_nfswPid).Kill();
                            }
                            catch { /* ignored */ }
                        }

                        DialogResult restartApp = MessageBox.Show(null, errorMsg + "\nWould you like to restart the launcher?", "GameLauncher", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (restartApp == DialogResult.Yes)
                        {
                            Application.Restart();
                            Application.ExitThread();
                        }
                        else
                        {
                            CloseButton(null, null);
                        }
                    }
                };
            }
        }
        public static void HandleGameState(string uri, string serverreply, dynamic GET)
        {
            try
            {
                foreach (var param in GET)
                {
                    dynamic value = GET[param];
                    QueryParams[param] = value;
                }

                GETContent = string.Join(";", QueryParams.Select(x => x.Key + "=" + x.Value).ToArray());
            }
            catch (Exception Error)
            {
                LogToFileAddons.OpenLog("DISCORD GAME PRESENCE [GET]", null, Error, null, true);
            }
            finally
            {
                QueryParams.Clear();
            }

            try
            {
                var      SBRW_XML     = new XmlDocument();
                string[] splitted_uri = uri.Split('/');

                String _serverPanelLink   = InformationCache.SelectedServerJSON.webPanelUrl;
                String _serverWebsiteLink = InformationCache.SelectedServerJSON.homePageUrl;
                String _serverDiscordLink = InformationCache.SelectedServerJSON.discordUrl;
                if (!String.IsNullOrWhiteSpace(_serverWebsiteLink) || !String.IsNullOrWhiteSpace(_serverDiscordLink) || !String.IsNullOrWhiteSpace(_serverPanelLink))
                {
                    DiscordLauncherPresence.ButtonsList.Clear();

                    if (!String.IsNullOrWhiteSpace(_serverPanelLink))
                    {
                        /* Let's format it now, if possible */
                        if (AntiCheat.persona_id == String.Empty || AntiCheat.persona_name == String.Empty)
                        {
                            DiscordLauncherPresence.ButtonsList.Add(new DiscordButton()
                            {
                                Label = "View Panel",
                                Url   = _serverPanelLink.Split(new string[] { "{sep}" }, StringSplitOptions.None)[0]
                            });
                        }
                        else
                        {
                            _serverPanelLink = _serverPanelLink.Replace("{personaid}", AntiCheat.persona_id);
                            _serverPanelLink = _serverPanelLink.Replace("{personaname}", AntiCheat.persona_name);
                            _serverPanelLink = _serverPanelLink.Replace("{sep}", String.Empty);

                            DiscordLauncherPresence.ButtonsList.Add(new DiscordButton()
                            {
                                Label = "Check " + AntiCheat.persona_name + " on Panel",
                                Url   = _serverPanelLink
                            });
                        }
                    }
                    else if (!String.IsNullOrWhiteSpace(_serverWebsiteLink) && _serverWebsiteLink != _serverDiscordLink)
                    {
                        DiscordLauncherPresence.ButtonsList.Add(new DiscordButton()
                        {
                            Label = "Website",
                            Url   = _serverWebsiteLink
                        });
                    }

                    if (!String.IsNullOrWhiteSpace(_serverDiscordLink))
                    {
                        DiscordLauncherPresence.ButtonsList.Add(new DiscordButton()
                        {
                            Label = "Discord",
                            Url   = _serverDiscordLink
                        });
                    }
                }

                if (uri == "/User/SecureLoginPersona")
                {
                    LoggedPersonaId       = GETContent.Split(';').Last().Split('=').Last();
                    canUpdateProfileField = true;
                }

                if (uri == "/User/SecureLogoutPersona")
                {
                    PersonaId       = String.Empty;
                    PersonaName     = String.Empty;
                    PersonaLevel    = String.Empty;
                    PersonaAvatarId = String.Empty;
                    PersonaCarId    = String.Empty;
                    PersonaCarName  = String.Empty;
                    LauncherRPC     = String.Empty;
                    PersonaTreasure = 0;
                }

                /* FIRST PERSONA EVER LOCALIZED IN CODE */
                if (uri == "/User/GetPermanentSession")
                {
                    /* Moved Statuses.cs Code to Gist | Check RemovedClasses.cs for Link */
                    //try { Statuses.getToken(); } catch { }

                    SBRW_XML.LoadXml(serverreply);

                    PersonaName     = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]");
                    PersonaLevel    = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText;
                    PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText;
                    PersonaId       = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText;

                    /* Let's get rest of PERSONAIDs */
                    XmlNode     UserInfo = SBRW_XML.SelectSingleNode("UserInfo");
                    XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData");
                    foreach (XmlNode node in personas)
                    {
                        PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText);
                    }
                }

                /* CREATE/DELETE PERSONA Handler  */
                if (uri == "/DriverPersona/CreatePersona")
                {
                    SBRW_XML.LoadXml(serverreply);
                    PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText);
                }

                /* DRIVING CARNAME */
                if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField)
                {
                    if (LoggedPersonaId == GETContent.Split(';').Last().Split('=').Last())
                    {
                        SBRW_XML.LoadXml(serverreply);
                        PersonaName     = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                        PersonaLevel    = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText;
                        PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText;
                        PersonaId       = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText;

                        AntiCheat.persona_id   = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText;
                        AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                    }
                }

                if (uri == "/events/gettreasurehunteventsession")
                {
                    /* Treasure Hunt Streak/Gems From Server */
                    PersonaTreasure = 0;
                    TotalTreasure   = 15;
                    THDay           = 0;

                    SBRW_XML.LoadXml(serverreply);
                    var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText);
                    for (var i = 0; i < 15; i++)
                    {
                        if ((xPersonaTreasure & (1 << (15 - i))) != 0)
                        {
                            PersonaTreasure++;
                        }
                    }

                    TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText);
                    THDay         = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText);
                }

                if (uri == "/events/notifycoincollected")
                {
                    eventTerminatedManually = FunctionStatus.CanCloseGame = true;

                    /* Actively Collection Treasure Hunt Gems */
                    PersonaTreasure++;

                    if (PersonaTreasure != TotalTreasure)
                    {
                        _presence.Details = "Collecting Gems (" + PersonaTreasure + " of " + TotalTreasure + ")";
                    }
                    else if (PersonaTreasure == TotalTreasure)
                    {
                        _presence.Details = "Finished Collecting Gems (" + PersonaTreasure + " of " + TotalTreasure + ")";
                    }

                    _presence.State  = LauncherRPC;
                    _presence.Assets = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = "Treasure Hunt - Day: " + THDay,
                        SmallImageKey  = "gamemode_treasure"
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }

                /* IN SAFEHOUSE/FREEROAM */
                if (uri == "/DriverPersona/UpdatePersonaPresence")
                {
                    string UpdatePersonaPresenceParam = GETContent.Split(';').Last().Split('=').Last();
                    _presence.Assets = new Assets();
                    if (UpdatePersonaPresenceParam == "1")
                    {
                        _presence.Details = "Driving " + PersonaCarName;
                        _presence.Assets.SmallImageText = "In-Freeroam";
                        _presence.Assets.SmallImageKey  = "gamemode_freeroam";
                        _presence.State         = LauncherRPC;
                        eventTerminatedManually = FunctionStatus.CanCloseGame = true;
                        inSafeHouse             = false;
                    }
                    else
                    {
                        _presence.Details = "In Safehouse";
                        _presence.Assets.SmallImageText = "In-Safehouse";
                        _presence.Assets.SmallImageKey  = "gamemode_safehouse";
                        _presence.State         = serverName;
                        eventTerminatedManually = FunctionStatus.CanCloseGame = false;
                        inSafeHouse             = true;
                    }

                    _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel;
                    _presence.Assets.LargeImageKey  = PersonaAvatarId;
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }

                if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite")
                {
                    /* Display Current Car in Freeroam */
                    _presence.Details = "Driving " + PersonaCarName;
                    _presence.State   = LauncherRPC;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = "In-Freeroam",
                        SmallImageKey  = "gamemode_freeroam"
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (uri == "/matchmaking/leavelobby")
                    {
                        AntiCheat.DisableChecks(false);
                    }

                    eventTerminatedManually = FunctionStatus.CanCloseGame = true;

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }
                /* IN LOBBY */
                else if (uri == "/matchmaking/acceptinvite")
                {
                    /* Accept (Group/Search) Event Invite */
                    eventTerminatedManually = FunctionStatus.CanCloseGame = false;

                    SBRW_XML.LoadXml(serverreply);
                    XmlNode eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId");

                    if (eventIdNode != null)
                    {
                        EventID = Convert.ToInt32(eventIdNode.InnerText);

                        _presence.Details = "In Lobby: " + EventsList.GetEventName(EventID);
                        _presence.State   = serverName;
                        _presence.Assets  = new Assets
                        {
                            LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                            LargeImageKey  = PersonaAvatarId,
                            SmallImageText = LauncherRPC,
                            SmallImageKey  = EventsList.GetEventType(Convert.ToInt32(EventID))
                        };
                        _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                        if (DiscordLauncherPresence.Running())
                        {
                            DiscordLauncherPresence.Client.SetPresence(_presence);
                        }
                    }
                }
                else if (uri == "/matchmaking/joinqueueracenow")
                {
                    eventTerminatedManually = FunctionStatus.CanCloseGame = true;

                    /* Searching for Events */
                    _presence.Details = "Searching for Event";
                    _presence.State   = LauncherRPC;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = "In-Freeroam",
                        SmallImageKey  = "gamemode_freeroam"
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }

                /* IN EVENT */
                if (Regex.Match(uri, "/matchmaking/launchevent").Success)
                {
                    /* Singleplayer Event (Launch) */
                    eventTerminatedManually = FunctionStatus.CanCloseGame = false;

                    EventID = Convert.ToInt32(splitted_uri[3]);

                    _presence.Details = "Loading Event: " + EventsList.GetEventName(EventID);
                    _presence.State   = serverName;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = LauncherRPC,
                        SmallImageKey  = EventsList.GetEventType(EventID)
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }
                else if (uri == "/event/launched" && !eventTerminatedManually)
                {
                    /* Once the Race Starts */
                    _presence.Details = "In Event: " + EventsList.GetEventName(EventID);
                    _presence.State   = serverName;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = LauncherRPC,
                        SmallImageKey  = EventsList.GetEventType(EventID)
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    AntiCheat.event_id = EventID;
                    AntiCheat.EnableChecks();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }
                else if (uri == "/event/arbitration")
                {
                    eventTerminatedManually = FunctionStatus.CanCloseGame = false;

                    /* Once the Race Finishes */
                    _presence.Details = "Finished Event: " + EventsList.GetEventName(EventID);
                    _presence.State   = serverName;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = LauncherRPC,
                        SmallImageKey  = EventsList.GetEventType(EventID)
                    };
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    AntiCheat.DisableChecks(true);
                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }

                /* Extending Safehouse */
                if (uri.Contains("catalog") && inSafeHouse)
                {
                    if (GETContent.Contains("categoryName=NFSW_NA_EP_VINYLS_Category"))
                    {
                        _presence.Details = "In Safehouse - Applying Vinyls";
                    }
                    if (GETContent.Contains("clientProductType=PAINTS_BODY"))
                    {
                        _presence.Details = "In Safehouse - Applying Colors";
                    }
                    if (GETContent.Contains("clientProductType=PERFORMANCEPART"))
                    {
                        _presence.Details = "In Safehouse - Applying Performance Parts";
                    }
                    if (GETContent.Contains("clientProductType=VISUALPART"))
                    {
                        _presence.Details = "In Safehouse - Applying Visual Parts";
                    }
                    if (GETContent.Contains("clientProductType=SKILLMODPART"))
                    {
                        _presence.Details = "In Safehouse - Applying Skillmods";
                    }
                    if (GETContent.Contains("clientProductType=PRESETCAR"))
                    {
                        _presence.Details = "In Safehouse - Purchasing Car";
                    }
                    if (GETContent.Contains("categoryName=BoosterPacks"))
                    {
                        _presence.Details = "In Safehouse - Opening Cardpacks";
                    }

                    _presence.Assets = new Assets
                    {
                        SmallImageText = "In-Safehouse",
                        SmallImageKey  = "gamemode_safehouse"
                    };
                    _presence.State = serverName;
                    _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel;
                    _presence.Assets.LargeImageKey  = PersonaAvatarId;
                    _presence.Buttons = DiscordLauncherPresence.ButtonsList.ToArray();

                    if (DiscordLauncherPresence.Running())
                    {
                        DiscordLauncherPresence.Client.SetPresence(_presence);
                    }
                }

                /* CARS RELATED */
                foreach (var single_personaId in PersonaIds)
                {
                    if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success)
                    {
                        carslotsXML = serverreply;

                        SBRW_XML.LoadXml(carslotsXML);

                        int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText);
                        int current   = 0;

                        XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                        XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                        foreach (XmlNode node in OwnedCarTrans)
                        {
                            if (DefaultID == current)
                            {
                                PersonaCarName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes
                                                                             (CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText)));
                            }
                            current++;
                        }
                    }
                    if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success)
                    {
                        if (splitted_uri.Last() != "defaultcar")
                        {
                            string receivedId = splitted_uri.Last();

                            SBRW_XML.LoadXml(carslotsXML);
                            XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                            XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                            foreach (XmlNode node in OwnedCarTrans)
                            {
                                if (receivedId == node.SelectSingleNode("Id").InnerText)
                                {
                                    PersonaCarName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(
                                                                                 CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText)));
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception Error)
            {
                LogToFileAddons.OpenLog("DISCORD GAME PRESENCE", null, Error, null, true);
            }
            finally
            {
                GETContent = string.Empty;
            }
        }
Ejemplo n.º 11
0
        public static void HandleGameState(string uri, string serverreply, string GET)
        {
            var SBRW_XML = new XmlDocument();

            string[] splitted_uri = uri.Split('/');

            String _serverPanelLink   = MainScreen.json.webPanelUrl;
            String _serverWebsiteLink = MainScreen.json.homePageUrl;
            String _serverDiscordLink = MainScreen.json.discordUrl;

            if (!String.IsNullOrEmpty(_serverWebsiteLink) || !String.IsNullOrEmpty(_serverDiscordLink) || !String.IsNullOrEmpty(_serverPanelLink))
            {
                MainScreen.ButtonsList.Clear();

                if (!String.IsNullOrEmpty(_serverPanelLink))
                {
                    //Let's format it now, if possible
                    if (AntiCheat.persona_id == String.Empty || AntiCheat.persona_name == String.Empty)
                    {
                        MainScreen.ButtonsList.Add(new DiscordButton()
                        {
                            Label = "View Panel",
                            Url   = _serverPanelLink.Split(new string[] { "{sep}" }, StringSplitOptions.None)[0]
                        });
                    }
                    else
                    {
                        _serverPanelLink = _serverPanelLink.Replace("{personaid}", AntiCheat.persona_id);
                        _serverPanelLink = _serverPanelLink.Replace("{personaname}", AntiCheat.persona_name);
                        _serverPanelLink = _serverPanelLink.Replace("{sep}", String.Empty);

                        MainScreen.ButtonsList.Add(new DiscordButton()
                        {
                            Label = "Check " + AntiCheat.persona_name + " on Panel",
                            Url   = _serverPanelLink
                        });
                    }
                }
                else if (!String.IsNullOrEmpty(_serverWebsiteLink) && _serverWebsiteLink != _serverDiscordLink)
                {
                    MainScreen.ButtonsList.Add(new DiscordButton()
                    {
                        Label = "Website",
                        Url   = _serverWebsiteLink
                    });
                }

                if (!String.IsNullOrEmpty(_serverDiscordLink))
                {
                    MainScreen.ButtonsList.Add(new DiscordButton()
                    {
                        Label = "Discord",
                        Url   = _serverDiscordLink
                    });
                }
            }

            if (uri == "/events/gettreasurehunteventsession")
            {
                PersonaTreasure = 0;
                TotalTreasure   = 15;
                TEDay           = 0;

                SBRW_XML.LoadXml(serverreply);
                var xPersonaTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/CoinsCollected").InnerText);
                for (var i = 0; i < 15; i++)
                {
                    if ((xPersonaTreasure & (1 << (15 - i))) != 0)
                    {
                        PersonaTreasure++;
                    }
                }

                TotalTreasure = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/NumCoins").InnerText);
                TEDay         = Convert.ToInt32(SBRW_XML.SelectSingleNode("TreasureHuntEventSession/Streak").InnerText);
            }

            if (uri == "/events/notifycoincollected")
            {
                PersonaTreasure++;

                _presence.Details = "Collecting gems (" + PersonaTreasure + " of " + TotalTreasure + ")";
                _presence.State   = LauncherRPC;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "Treasure Hunt - Day: " + TEDay,
                    SmallImageKey  = "gamemode_treasure"
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }
            }


            if (uri == "/User/SecureLoginPersona")
            {
                LoggedPersonaId       = GET.Split(';').Last().Split('=').Last();
                canUpdateProfileField = true;
                Helper.personaid      = LoggedPersonaId;
            }

            if (uri == "/User/SecureLogoutPersona")
            {
                PersonaId       = String.Empty;
                PersonaName     = String.Empty;
                PersonaLevel    = String.Empty;
                PersonaAvatarId = String.Empty;
                PersonaCarId    = String.Empty;
                PersonaCarName  = String.Empty;
                LauncherRPC     = String.Empty;
                PersonaTreasure = 0;
            }

            //FIRST PERSONA EVER LOCALIZED IN CODE
            if (uri == "/User/GetPermanentSession")
            {
                /* Moved Statuses.cs Code to Gist | Check RemovedClasses.cs for Link */
                //try { Statuses.getToken(); } catch { }

                try
                {
                    SBRW_XML.LoadXml(serverreply);

                    PersonaName     = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Name").InnerText.Replace("¤", "[S]");
                    PersonaLevel    = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/Level").InnerText;
                    PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/IconIndex").InnerText;
                    PersonaId       = SBRW_XML.SelectSingleNode("UserInfo/personas/ProfileData/PersonaId").InnerText;

                    //Let's get rest of PERSONAIDs
                    XmlNode     UserInfo = SBRW_XML.SelectSingleNode("UserInfo");
                    XmlNodeList personas = UserInfo.SelectNodes("personas/ProfileData");
                    foreach (XmlNode node in personas)
                    {
                        PersonaIds.Add(node.SelectSingleNode("PersonaId").InnerText);
                    }
                }
                catch (Exception)
                {
                }
            }

            //CREATE/DELETE PERSONA Handler
            if (uri == "/DriverPersona/CreatePersona")
            {
                SBRW_XML.LoadXml(serverreply);
                PersonaIds.Add(SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText);
            }

            //DRIVING CARNAME
            if (uri == "/DriverPersona/GetPersonaInfo" && canUpdateProfileField == true)
            {
                if (LoggedPersonaId == GET.Split(';').Last().Split('=').Last())
                {
                    SBRW_XML.LoadXml(serverreply);
                    PersonaName     = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                    PersonaLevel    = SBRW_XML.SelectSingleNode("ProfileData/Level").InnerText;
                    PersonaAvatarId = "avatar_" + SBRW_XML.SelectSingleNode("ProfileData/IconIndex").InnerText;
                    PersonaId       = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText;

                    AntiCheat.persona_id   = SBRW_XML.SelectSingleNode("ProfileData/PersonaId").InnerText;
                    AntiCheat.persona_name = SBRW_XML.SelectSingleNode("ProfileData/Name").InnerText.Replace("¤", "[S]");
                }
            }

            if (uri == "/matchmaking/leavelobby" || uri == "/matchmaking/declineinvite")
            {
                _presence.Details = "Driving " + PersonaCarName;
                _presence.State   = LauncherRPC;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "In-Freeroam",
                    SmallImageKey  = "gamemode_freeroam"
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }

                eventTerminatedManually     = true;
                FunctionStatus.CanCloseGame = true;
            }

            //IN LOBBY
            if (uri == "/matchmaking/acceptinvite")
            {
                FunctionStatus.CanCloseGame = false;

                SBRW_XML.LoadXml(serverreply);
                var eventIdNode = SBRW_XML.SelectSingleNode("LobbyInfo/EventId");

                if (eventIdNode != null)
                {
                    EventID = Convert.ToInt32(eventIdNode.InnerText);

                    _presence.Details = "In Lobby: " + EventsList.GetEventName(EventID);
                    _presence.State   = serverName;
                    _presence.Assets  = new Assets
                    {
                        LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                        LargeImageKey  = PersonaAvatarId,
                        SmallImageText = EventsList.GetEventName(Convert.ToInt32(EventID)),
                        SmallImageKey  = EventsList.GetEventType(Convert.ToInt32(EventID))
                    };
                    _presence.Buttons = MainScreen.ButtonsList.ToArray();

                    if (MainScreen.discordRpcClient != null)
                    {
                        MainScreen.discordRpcClient.SetPresence(_presence);
                    }

                    eventTerminatedManually = false;
                }
            }

            if (uri == "/matchmaking/joinqueueracenow")
            {
                _presence.Details = "Searching for event...";
                _presence.State   = LauncherRPC;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = "In-Freeroam",
                    SmallImageKey  = "gamemode_freeroam"
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }

                eventTerminatedManually = true;
            }

            //IN SAFEHOUSE/FREEROAM
            if (uri == "/DriverPersona/UpdatePersonaPresence")
            {
                string UpdatePersonaPresenceParam = GET.Split(';').Last().Split('=').Last();
                _presence.Assets = new Assets();
                if (UpdatePersonaPresenceParam == "1")
                {
                    _presence.Details = "Driving " + PersonaCarName;
                    _presence.Assets.SmallImageText = "In-Freeroam";
                    _presence.Assets.SmallImageKey  = "gamemode_freeroam";
                    _presence.State = LauncherRPC;

                    FunctionStatus.CanCloseGame = true;
                }
                else
                {
                    _presence.Details = "In Safehouse";
                    _presence.Assets.SmallImageText = "In-Safehouse";
                    _presence.Assets.SmallImageKey  = "gamemode_safehouse";
                    FunctionStatus.CanCloseGame     = false;
                    _presence.State = serverName;
                }

                _presence.Assets.LargeImageText = PersonaName + " - Level: " + PersonaLevel;
                _presence.Assets.LargeImageKey  = PersonaAvatarId;
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }
            }

            //IN EVENT
            if (Regex.Match(uri, "/matchmaking/launchevent").Success)
            {
                FunctionStatus.CanCloseGame = false;

                EventID = Convert.ToInt32(splitted_uri[3]);

                _presence.Details = "In Event: " + EventsList.GetEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventsList.GetEventName(EventID),
                    SmallImageKey  = EventsList.GetEventType(EventID)
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }

                eventTerminatedManually = false;
            }
            if (uri == "/event/arbitration")
            {
                _presence.Details = "In Event: " + EventsList.GetEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventsList.GetEventName(EventID),
                    SmallImageKey  = EventsList.GetEventType(EventID)
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                AntiCheat.DisableChecks();
                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }

                eventTerminatedManually = false;
            }
            if (uri == "/event/launched" && eventTerminatedManually == false)
            {
                _presence.Details = "In Event: " + EventsList.GetEventName(EventID);
                _presence.State   = serverName;
                _presence.Assets  = new Assets
                {
                    LargeImageText = PersonaName + " - Level: " + PersonaLevel,
                    LargeImageKey  = PersonaAvatarId,
                    SmallImageText = EventsList.GetEventName(EventID),
                    SmallImageKey  = EventsList.GetEventType(EventID)
                };
                _presence.Buttons = MainScreen.ButtonsList.ToArray();

                AntiCheat.event_id = EventID;
                AntiCheat.EnableChecks();

                if (MainScreen.discordRpcClient != null)
                {
                    MainScreen.discordRpcClient.SetPresence(_presence);
                }
            }

            //CARS RELATED
            foreach (var single_personaId in PersonaIds)
            {
                if (Regex.Match(uri, "/personas/" + single_personaId + "/carslots", RegexOptions.IgnoreCase).Success)
                {
                    carslotsXML = serverreply;

                    SBRW_XML.LoadXml(carslotsXML);

                    int DefaultID = Convert.ToInt32(SBRW_XML.SelectSingleNode("CarSlotInfoTrans/DefaultOwnedCarIndex").InnerText);
                    int current   = 0;

                    XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                    XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                    foreach (XmlNode node in OwnedCarTrans)
                    {
                        if (DefaultID == current)
                        {
                            PersonaCarName = CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText);
                        }
                        current++;
                    }
                }
                if (Regex.Match(uri, "/personas/" + single_personaId + "/defaultcar", RegexOptions.IgnoreCase).Success)
                {
                    if (splitted_uri.Last() != "defaultcar")
                    {
                        string receivedId = splitted_uri.Last();

                        SBRW_XML.LoadXml(carslotsXML);
                        XmlNode     CarsOwnedByPersona = SBRW_XML.SelectSingleNode("CarSlotInfoTrans/CarsOwnedByPersona");
                        XmlNodeList OwnedCarTrans      = CarsOwnedByPersona.SelectNodes("OwnedCarTrans");

                        foreach (XmlNode node in OwnedCarTrans)
                        {
                            if (receivedId == node.SelectSingleNode("Id").InnerText)
                            {
                                PersonaCarName = CarsList.GetCarName(node.SelectSingleNode("CustomCar/Name").InnerText);
                            }
                        }
                    }
                }
            }
        }
 private void Start()
 {
     instance = this;
 }
Ejemplo n.º 13
0
        private async Task <Response> ProxyRequest(NancyContext context, CancellationToken cancellationToken)
        {
            string path   = Strings.Encode(context.Request.Path);
            string method = Strings.Encode(context.Request.Method.ToUpperInvariant());

            if (!path.StartsWith("/nfsw/Engine.svc"))
            {
                Log.Error("PROXY HANDLER: Invalid Request: " + path);
                return("SBRW Launcher Version: " + Theming.PrivacyRPCBuild + "\nBuild Date: " + InsiderInfo.BuildNumberOnly());
            }
            else
            {
                path = path.Substring("/nfsw/Engine.svc".Length);

                UrlFlurl resolvedUrl = new UrlFlurl(ServerProxy.Instance.GetServerUrl()).AppendPathSegment(path, false);

                foreach (var queryParamName in context.Request.Query)
                {
                    resolvedUrl = resolvedUrl.SetQueryParam(queryParamName, context.Request.Query[queryParamName],
                                                            NullValueHandling.Ignore);
                }

                IFlurlRequest request = resolvedUrl.AllowAnyHttpStatus();

                foreach (var header in context.Request.Headers)
                {
                    /* Don't send Content-Length for GET requests - HeyItsLeo */
                    if (method == "GET" && header.Key.ToLowerInvariant() == "content-length")
                    {
                        continue;
                    }

                    request = request.WithHeader
                                  (header.Key, (header.Key == "Host") ? resolvedUrl.ToUri().Host : ((header.Value != null) ? header.Value.First() : string.Empty));
                }

                string requestBody = (method != "GET") ? context.Request.Body.AsString(UTF8) : string.Empty;

                CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Request,
                                             new CommunicationLogRequest(requestBody, resolvedUrl.ToString(), method));

                IFlurlResponse responseMessage;

                if (path == "/event/arbitration" && !string.IsNullOrWhiteSpace(requestBody))
                {
                    requestBody = Strings.Encode(
                        requestBody.Replace("</TopSpeed>", "</TopSpeed><Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>"));
                    foreach (var header in context.Request.Headers)
                    {
                        if (header.Key.ToLowerInvariant() == "content-length")
                        {
                            int KonamiCode = Convert.ToInt32(header.Value.First()) +
                                             ("<Konami>" + AntiCheat.Get_Cheat_Status() + "</Konami>").Length;
                            request = request.WithHeader(header.Key, KonamiCode);
                        }
                    }
                }

                switch (method)
                {
                case "GET":
                    responseMessage = await request.GetAsync(cancellationToken);

                    break;

                case "POST":
                    responseMessage = await request.PostAsync(new CapturedStringContent(requestBody),
                                                              cancellationToken);

                    break;

                case "PUT":
                    responseMessage = await request.PutAsync(new CapturedStringContent(requestBody),
                                                             cancellationToken);

                    break;

                case "DELETE":
                    responseMessage = await request.DeleteAsync(cancellationToken);

                    break;

                default:
                    Log.Error("PROXY HANDLER: Cannot handle Request Method " + method);
                    responseMessage = null;
                    break;
                }

                string responseBody = Strings.Encode(await responseMessage.GetStringAsync());

                int statusCode = responseMessage.StatusCode;

                DiscordGamePresence.HandleGameState(path, responseBody, context.Request.Query);

                TextResponse Response = new TextResponse(responseBody,
                                                         responseMessage.ResponseMessage.Content.Headers.ContentType?.MediaType ?? "application/xml;charset=UTF-8")
                {
                    StatusCode = (HttpStatusCode)statusCode
                };

                CommunicationLog.RecordEntry(ServerProxy.Instance.GetServerName(), "SERVER", CommunicationLogEntryType.Response,
                                             new CommunicationLogResponse(responseBody, resolvedUrl.ToString(), method));

                return(Response);
            }
        }
Ejemplo n.º 14
0
        public void ProcessPacket(int packetID, Player player)
        {
            switch ((PacketID)packetID)
            {
            case PacketID.entityUpdate:
                #region entity update
                var    entityUpdate = new EntityUpdate(player.reader);
                string ACmessage    = AntiCheat.Inspect(entityUpdate);
                if (ACmessage != "ok")
                {
                    var kickMessage = new ChatMessage()
                    {
                        message = "illegal " + ACmessage
                    };
                    kickMessage.Write(player.writer, true);
                    Console.WriteLine(player.entityData.name + " kicked for illegal " + kickMessage.message);
                    Thread.Sleep(100);     //thread is about to run out anyway so np
                    Kick(player);
                    return;
                }
                if (entityUpdate.name != null)
                {
                    Announce.Join(entityUpdate.name, player.entityData.name, players);
                }

                entityUpdate.entityFlags |= 1 << 5;     //enable friendly fire flag for pvp
                if (!player.entityData.IsEmpty)
                {
                    entityUpdate.Filter(player.entityData);
                }
                if (!entityUpdate.IsEmpty)
                {
                    entityUpdate.Broadcast(players, 0);
                    if (entityUpdate.HP == 0 && player.entityData.HP > 0)
                    {
                        Tomb.Show(player).Broadcast(players, 0);
                    }
                    else if (player.entityData.HP == 0 && entityUpdate.HP > 0)
                    {
                        Tomb.Hide(player).Broadcast(players, 0);
                    }
                    entityUpdate.Merge(player.entityData);
                }
                break;

                #endregion
            case PacketID.entityAction:
                #region action
                EntityAction entityAction = new EntityAction(player.reader);
                switch (entityAction.type)
                {
                case ActionType.talk:
                    break;

                case ActionType.staticInteraction:
                    //var staticEntity = new StaticEntity();
                    //staticEntity.chunkX = entityAction.chunkX;
                    //staticEntity.chunkY = entityAction.chunkY;
                    //staticEntity.id = entityAction.index;
                    //staticEntity.type = 0;
                    //staticEntity.position = player.entityData.position;
                    //staticEntity.rotation = 0;
                    //staticEntity.size.x = 2;
                    //staticEntity.size.y = 1;
                    //staticEntity.size.z = 1;
                    //staticEntity.closed = 0;
                    //staticEntity.time = 1000;
                    //staticEntity.guid = player.entityData.guid;

                    //var serverUpdate = new ServerUpdate();
                    //serverUpdate.statics.Add(staticEntity);
                    //serverUpdate.Send(players, 0);
                    break;

                case ActionType.pickup:         //shouldn't occur since item drops are disabled
                    break;

                case ActionType.drop:         //send item back to dropper because dropping is disabled to prevent chatspam
                    var pickup = new ServerUpdate.Pickup()
                    {
                        guid = player.entityData.guid,
                        item = entityAction.item
                    };

                    var serverUpdate6 = new ServerUpdate();
                    serverUpdate6.pickups.Add(pickup);
                    serverUpdate6.Write(player.writer, true);
                    break;

                case ActionType.callPet:
                    var petItem = player.entityData.equipment[(int)Equipment.pet];

                    var pet = new EntityUpdate()
                    {
                        guid        = 2000 + player.entityData.guid,
                        position    = player.entityData.position,
                        hostility   = (int)Hostility.pet,
                        entityType  = 28,
                        appearance  = player.entityData.appearance,
                        HP          = 999,
                        parentOwner = 3000 + (long)player.entityData.guid,
                        equipment   = player.entityData.equipment,
                        name        = "doppelganger"
                    };
                    pet.Broadcast(players, 0);

                    pet = new EntityUpdate()
                    {
                        guid        = 3000 + player.entityData.guid,
                        position    = player.entityData.position,
                        hostility   = (int)Hostility.pet,
                        entityType  = 28,
                        mode        = 106,
                        appearance  = player.entityData.appearance,
                        HP          = 999,
                        parentOwner = (long)player.entityData.guid,
                        equipment   = player.entityData.equipment,
                        name        = "doppelganger"
                    };
                    pet.Broadcast(players, 0);
                    break;

                default:
                    Console.WriteLine("unknown action (" + entityAction.type + ") by " + player.entityData.name);
                    break;
                }
                break;

                #endregion
            case PacketID.hit:
                #region hit
                var hit = new Hit(player.reader);
                hit.damage *= 0.75f;
                if (players.ContainsKey(hit.target))
                {
                    var serverUpdate7 = new ServerUpdate();
                    serverUpdate7.hits.Add(hit);
                    serverUpdate7.Broadcast(players, player.entityData.guid);
                }
                break;

                #endregion
            case PacketID.passiveProc:
                #region passiveProc
                var passiveProc = new PassiveProc(player.reader);

                var serverUpdate8 = new ServerUpdate();
                serverUpdate8.passiveProcs.Add(passiveProc);
                serverUpdate8.Broadcast(players, player.entityData.guid);

                switch (passiveProc.type)
                {
                case ProcType.warFrenzy:
                case ProcType.camouflage:
                case ProcType.fireSpark:
                case ProcType.intuition:
                case ProcType.elusivenes:
                case ProcType.swiftness:
                    //nothing particular yet
                    break;

                case ProcType.manashield:
                    var chatMessage6m = new ChatMessage()
                    {
                        message = string.Format("manashield: {0}", passiveProc.modifier),
                        sender  = 0
                    };
                    chatMessage6m.Write(player.writer, true);
                    break;

                case ProcType.bulwalk:
                    var chatMessage6b = new ChatMessage()
                    {
                        message = string.Format("bulwalk: {0}% dmg reduction", 1.0f - passiveProc.modifier),
                        sender  = 0
                    };
                    chatMessage6b.Write(player.writer, true);
                    break;

                case ProcType.poison:
                    if (players.ContainsKey(passiveProc.target))        //in case target is a tomb or sth
                    {
                        var poisonDmg = new Hit()
                        {
                            attacker = passiveProc.source,
                            target   = passiveProc.target,
                            damage   = passiveProc.modifier,
                            position = players[passiveProc.target].entityData.position,
                            type     = DamageType.normal
                        };
                        var poisonTick = new ServerUpdate();
                        poisonTick.hits.Add(poisonDmg);
                        Poison(poisonTick, passiveProc.duration);
                    }
                    break;

                default:
                    Console.WriteLine("unknown passiveProc.type: " + passiveProc.type);
                    break;
                }
                break;

                #endregion
            case PacketID.shoot:
                #region shoot
                var shoot = new Shoot(player.reader);

                var serverUpdate9 = new ServerUpdate();
                serverUpdate9.shoots.Add(shoot);
                serverUpdate9.Broadcast(players, player.entityData.guid);
                break;

                #endregion
            case PacketID.chat:
                #region chat
                var chatMessage = new ChatMessage(player.reader)
                {
                    sender = player.entityData.guid
                };

                if (chatMessage.message.StartsWith("/"))
                {
                    string parameter = "";
                    string command   = chatMessage.message.Substring(1);
                    if (chatMessage.message.Contains(" "))
                    {
                        int spaceIndex = command.IndexOf(" ");
                        parameter = command.Substring(spaceIndex + 1);
                        command   = command.Substring(0, spaceIndex);
                    }
                    Command.TCP(command, parameter, player);     //wip
                }
                else
                {
                    chatMessage.Broadcast(players, 0);
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.Write("#" + player.entityData.guid + " " + player.entityData.name + ": ");
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine(chatMessage.message);
                }
                break;

                #endregion
            case PacketID.chunk:
                #region chunk
                var chunk = new Chunk(player.reader);
                break;

                #endregion
            case PacketID.sector:
                #region sector
                var sector = new Chunk(player.reader);
                break;

                #endregion
            case PacketID.version:
                #region version
                var version = new ProtocolVersion(player.reader);
                if (version.version != 3)
                {
                    version.version = 3;
                    version.Write(player.writer, true);
                    player.tcp.Close();
                }
                else
                {
                    player.entityData.guid = guidCounter;
                    guidCounter++;

                    var join = new Join()
                    {
                        guid = player.entityData.guid,
                        junk = new byte[0x1168]
                    };
                    join.Write(player.writer, true);

                    var mapSeed = new MapSeed()
                    {
                        seed = Database.mapseed
                    };
                    mapSeed.Write(player.writer, true);

                    foreach (Player p in players.Values)
                    {
                        p.entityData.Write(player.writer);
                    }
                    players.Add(player.entityData.guid, player);
                    Task.Delay(10000).ContinueWith(t => Load_world_delayed(player));     //WIP, causes crash when player disconnects before executed
                }
                break;

                #endregion
            default:
                Console.WriteLine("unknown packet ID: " + packetID);     //causes some console spam, but allows resyncing with the player without DC or crash
                break;
            }
        }
Ejemplo n.º 15
0
        public void ProcessDatagram(byte[] datagram, Player source)
        {
            switch ((DatagramID)datagram[0])
            {
            case DatagramID.entityUpdate:
                #region entityUpdate
                var entityUpdate = new EntityUpdate(datagram);

                string ACmessage = AntiCheat.Inspect(entityUpdate);
                if (ACmessage != "ok")
                {
                    //var kickMessage = new ChatMessage() {
                    //    message = "illegal " + ACmessage
                    //};
                    //kickMessage.Write(player.writer, true);
                    //Console.WriteLine(player.entityData.name + " kicked for illegal " + kickMessage.message);
                    //Thread.Sleep(100); //thread is about to run out anyway so np
                    //Kick(player);
                    //return;
                }
                if (entityUpdate.name != null)
                {
                    //Announce.Join(entityUpdate.name, player.entityData.name, players);
                }

                entityUpdate.entityFlags |= 1 << 5;  //enable friendly fire flag for pvp
                if (!source.entityData.IsEmpty)      //dont filter the first packet
                //entityUpdate.Filter(player.entityData);
                {
                }
                if (!entityUpdate.IsEmpty)
                {
                    //entityUpdate.Broadcast(players, 0);
                    BroadcastUDP(entityUpdate.Data, source);
                    if (entityUpdate.HP == 0 && source.entityData.HP > 0)
                    {
                        BroadcastUDP(Tomb.Show(source).Data);
                    }
                    else if (source.entityData.HP == 0 && entityUpdate.HP > 0)
                    {
                        BroadcastUDP(Tomb.Hide(source).Data);
                    }
                    entityUpdate.Merge(source.entityData);
                }
                break;

                #endregion
            case DatagramID.attack:
                #region attack
                var attack = new Attack(datagram);
                source.lastTarget = attack.Target;
                if (players.ContainsKey(attack.Target))      //in case the target is a tombstone
                {
                    SendUDP(datagram, players[attack.Target]);
                }
                break;

                #endregion
            case DatagramID.shoot:
                #region shoot
                var shoot = new Resources.Datagram.Shoot(datagram);
                BroadcastUDP(datagram, source);     //pass to all players except source
                break;

                #endregion
            case DatagramID.proc:
                #region proc
                var proc = new Proc(datagram);

                switch (proc.Type)
                {
                case ProcType.bulwalk:
                    SendUDP(new Chat(string.Format("bulwalk: {0}% dmg reduction", 1.0f - proc.Modifier)).data, source);
                    break;

                case ProcType.poison:
                    var poisonTickDamage = new Attack()
                    {
                        Damage = proc.Modifier,
                        Target = proc.Target
                    };
                    var         target = players[poisonTickDamage.Target];
                    Func <bool> tick   = () => {
                        bool f = players.ContainsKey(poisonTickDamage.Target);
                        if (f)
                        {
                            SendUDP(poisonTickDamage.data, target);
                        }
                        return(!f);
                    };
                    Tools.DoLater(tick, 500, 7);
                    //Poison(players[proc.Target], poisonTickDamage);
                    break;

                case ProcType.manashield:
                    SendUDP(new Chat(string.Format("manashield: {0}", proc.Modifier)).data, source);
                    break;

                case ProcType.warFrenzy:
                case ProcType.camouflage:
                case ProcType.fireSpark:
                case ProcType.intuition:
                case ProcType.elusivenes:
                case ProcType.swiftness:
                    break;

                default:

                    break;
                }
                BroadcastUDP(datagram, source);     //pass to all players except source
                break;

                #endregion
            case DatagramID.chat:
                #region chat
                var chat = new Chat(datagram);
                if (chat.Text.StartsWith("/"))
                {
                    Command.Server(chat.Text, source, this);     //wip
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.Write(players[chat.Sender].entityData.name + ": ");
                    Console.ForegroundColor = ConsoleColor.White;
                    Console.WriteLine(chat.Text);
                    BroadcastUDP(datagram, null, true);     //pass to all players
                }
                break;

                #endregion
            case DatagramID.interaction:
                #region interaction
                var interaction = new Interaction(datagram);
                BroadcastUDP(datagram, source);     //pass to all players except source
                break;

                #endregion
            case DatagramID.connect:
                #region connect
                var connect = new Connect(datagram)
                {
                    Guid    = (ushort)source.entityData.guid,
                    Mapseed = Database.mapseed
                };
                SendUDP(connect.data, source);

                foreach (Player player in players.Values)
                {
                    if (player.playing)
                    {
                        SendUDP(player.entityData.Data, source);
                    }
                }
                source.playing = true;
                //Task.Delay(100).ContinueWith(t => Load_world_delayed(source)); //WIP, causes crash when player disconnects before executed
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine(source.IpEndPoint.Address + " is now playing");
                break;

                #endregion
            case DatagramID.disconnect:
                #region disconnect
                var disconnect = new Disconnect(datagram);
                source.playing = false;
                BroadcastUDP(datagram, source, true);
                source.entityData = new EntityUpdate()
                {
                    guid = source.entityData.guid
                };

                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(source.IpEndPoint.Address + " is now lurking");
                break;

                #endregion
            case DatagramID.specialMove:
                #region specialMove
                var specialMove = new SpecialMove(datagram);
                switch (specialMove.Id)
                {
                case SpecialMoveID.taunt:
                    var targetGuid = specialMove.Guid;
                    specialMove.Guid = (ushort)source.entityData.guid;
                    SendUDP(specialMove.data, players[targetGuid]);
                    break;

                case SpecialMoveID.cursedArrow:
                case SpecialMoveID.arrowRain:
                case SpecialMoveID.shrapnel:
                case SpecialMoveID.smokeBomb:
                case SpecialMoveID.iceWave:
                case SpecialMoveID.confusion:
                case SpecialMoveID.shadowStep:
                    BroadcastUDP(specialMove.data, source);
                    break;

                default:
                    break;
                }
                break;

                #endregion
            case DatagramID.dummy:
                break;

            default:
                Console.WriteLine("unknown DatagramID: " + datagram[0]);
                break;
            }
        }