Beispiel #1
0
        public MatchXmlData GetMatch(string matchGuid)
        {
            var database = XNP.Create();
            var matches  = from m in database.Matches // m? MINEN!
                           where m.MatchGuiD == matchGuid
                           select m;

            if (matches.Count() == 0)
            {
                throw new Exception("No such match exists.");
            }

            var match = matches.First();

            var affectedPlayers = from u in database.MatchUsers
                                  where u.MatchID == match.MatchGuiD
                                  select u.MatchUser;

            var matchData = new MatchXmlData();

            matchData.guid     = match.MatchGuiD;
            matchData.time     = match.MatchTime;
            matchData.map      = match.MatchMap;
            matchData.gameType = match.MatchGameType;
            matchData.data     = Convert.ToBase64String(File.ReadAllBytes(match.MatchFilename));
            matchData.players  = affectedPlayers.ToArray();

            return(matchData);
        }
Beispiel #2
0
        public override void Process(NPHandler client)
        {
            var npids = (from npid in Message.npids
                         select(int)(npid & 0xFFFFFFFF)).ToArray();

            var db = XNP.Create();

            var profiles = from profile in db.IW4Profiles
                           where npids.Contains(profile.UserID)
                           select profile;

            var reply = MakeResponse <FriendsGetProfileDataResultMessage>(client);

            foreach (var profile in profiles)
            {
                var profileResult = new ProfileDataResult {
                    npid = (ulong)((uint)profile.UserID | 0x110000100000000)
                };
                profileResult.profile = new byte[8];
                Array.Copy(BitConverter.GetBytes(profile.Experience.Value), 0, profileResult.profile, 0, 4);
                Array.Copy(BitConverter.GetBytes((uint)profile.Prestige.Value), 0, profileResult.profile, 4, 4);

                reply.Message.results.Add(profileResult);
            }

            reply.Send();
        }
        private void RunUpdater()
        {
            var database = XNP.Create();

            if (database == null)
            {
                return;
            }

            while (true)
            {
                try
                {
                    /*var links = from link in database.ExternalPlatforms
                     *          select link;
                     *
                     * foreach (var link in links)
                     * {
                     *  UpdateForUser(link.UserID, link.PlatformID);
                     * }*/
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                Thread.Sleep(6 * 60 * 60 * 1000); // 6 hours
            }
        }
Beispiel #4
0
        private void Run()
        {
            Database = XNP.Create();

            if (Database == null)
            {
                return;
            }

            while (true)
            {
                try
                {
                    // fetch all type 1 binary events (1 = public match)
                    var collection = ADatabase.GetCollection <BinaryEvent>("blobEvents");
                    var query      = Query.EQ("type", 1);
                    var events     = collection.Find(query);

                    foreach (var bevent in events)
                    {
                        ProcessEvent(bevent.data);

                        collection.Remove(Query.EQ("_id", bevent.id));
                        break;
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                Thread.Sleep(5 * 60);
            }
        }
Beispiel #5
0
        private void HandleAuthentication(object cliento)
        {
            var client   = (NPHandler)cliento;
            var database = XNP.Create();
            var keys     = from key in database.LicenseKeys
                           where key.Key == Message.licenseKey
                           select key;

            var  valid  = (keys.Count() == 1);
            var  result = (keys.Count() == 1) ? 0 : 1;
            long npid   = 0;

            if (valid)
            {
                npid = 0x120000100000000 | keys.First().ID;

                NPHandler existingClient = NPSocket.GetClient(npid);

                if (existingClient != null)
                {
                    existingClient.CloseConnection(true);
                }
            }

            var reply = MakeResponse <AuthenticateResultMessage>(client);

            reply.Message.result = result;

            if (valid)
            {
                reply.Message.npid         = (ulong)npid;
                reply.Message.sessionToken = new byte[16] {
                    0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                };
            }
            else
            {
                reply.Message.npid         = (ulong)0;
                reply.Message.sessionToken = new byte[16] {
                    0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
                };
            }

            reply.Send();

            client.Authenticated = valid;
            client.NPID          = npid;

            database.Dispose();
        }
Beispiel #6
0
        private void Migrate()
        {
            // wait for the database to be connected
            Thread.Sleep(5000);

            // get unique user IDs that are 'important' to fetch
            var database = XNP.Create();
            var query    = from association in database.ExternalPlatforms
                           select association.UserID;

            foreach (var userID in query)
            {
                Handle(0x110000100000000 | (uint)userID);
            }

            File.WriteAllText("data/migration_profiledata_001_done", "yep");
        }
Beispiel #7
0
        public bool AddKey(string key, string password)
        {
            if (password != "678452056")
            {
                return(false);
            }

            var licenseKey = new LicenseKeys()
            {
                Key  = key,
                Type = 2
            };

            var database = XNP.Create();

            database.LicenseKeys.InsertOnSubmit(licenseKey);
            database.SubmitChanges();

            return(true);
        }
Beispiel #8
0
        public MatchMetaData[] GetRecentMatches(string userID, int numMatches)
        {
            if (numMatches > 25)
            {
                throw new ArgumentException("a maximum of 25 matches can be returned");
            }

            var user     = int.Parse(userID);
            var database = XNP.Create();
            var matches  = (from match in database.Matches
                            join matchUser in database.MatchUsers on match.MatchGuiD equals matchUser.MatchID
                            where matchUser.MatchUser == user
                            orderby match.MatchTime descending
                            select new MatchMetaData()
            {
                guid = match.MatchGuiD,
                time = match.MatchTime,
                map = match.MatchMap,
                gameType = match.MatchGameType
            }).Take(numMatches);

            return(matches.ToArray());
        }
Beispiel #9
0
        private void Run()
        {
            Log.Info("Connecting to the database...");

            Database = XNP.Create();

            if (Database == null)
            {
                return;
            }

            while (true)
            {
                _event.WaitOne();
                _event.Reset();

                while (_requestQueue.Count > 0)
                {
                    UpdateRequest request;

                    lock (_requestQueue)
                    {
                        request = _requestQueue.Dequeue();
                    }

                    try
                    {
                        Handle(request);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Exception: " + e.ToString());
                    }
                }
            }
        }
Beispiel #10
0
        private void SendAuthResult(RPCAuthenticateWithTokenMessage message, NPHandler client, int userID, int group)
        {
            var reply = message.MakeResponse <AuthenticateResultMessage>(client);

            reply.Message.npid         = (ulong)0;
            reply.Message.sessionToken = new byte[16];

            if (userID > 0)
            {
                var npid = (0x110000100000000 | (uint)userID);

                var existingClient = NPSocket.GetClient(npid);
                //NPHandler existingClient = null;
                if (existingClient != null)
                {
                    //reply.Message.result = 4;
                    existingClient.CloseConnection(true);
                }

                reply.Message.result       = 0;
                reply.Message.npid         = (ulong)npid;
                reply.Message.sessionToken = message.Message.token;

                client.Authenticated = true;
                client.NPID          = npid;
                client.GroupID       = group;
                client.SessionToken  = Encoding.UTF8.GetString(message.Message.token);

                NPSocket.SetClient(npid, client);
            }
            else if (userID == 0)
            {
                reply.Message.result = 1;
            }
            else if (userID == -1)
            {
                reply.Message.result = 2;
            }

            reply.Send();

            if (group > 0)
            {
                var groupReply = new NPRPCResponse <AuthenticateUserGroupMessage>(client);
                groupReply.Message.groupID = group;
                groupReply.Send();
            }

            ThreadPool.QueueUserWorkItem(delegate(object cliento)
            {
                try
                {
                    var cclient = (NPHandler)cliento;
                    var uid     = (int)(cclient.NPID & 0xFFFFFFFF);

                    var db     = XNP.Create();
                    var result = from platform in db.ExternalPlatforms
                                 where platform.UserID == uid && platform.PlatformAuthenticated == 1
                                 select platform.PlatformID;

                    var value = 1;

                    if (result.Count() > 0)
                    {
                        value = 0;
                    }

                    Thread.Sleep(600);

                    var linkReply            = new NPRPCResponse <AuthenticateExternalStatusMessage>(cclient);
                    linkReply.Message.status = value;
                    linkReply.Send();
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }, client);
        }
Beispiel #11
0
        public override void Process(NPHandler client)
        {
            var platformID = (long)Message.steamID;
            var userID     = (int)(client.NPID & 0xFFFFFFFF);
            var gdb        = XNP.Create();

            var currentLink = from link in gdb.ExternalPlatforms
                              where link.UserID == userID// && link.PlatformType == "steam"
                              select link;

            var newLink = new ExternalPlatforms();

            if (currentLink.Count() > 0)
            {
                newLink = currentLink.First();

                if (newLink.PlatformID == platformID && newLink.PlatformAuthenticated == 1)
                {
                    return;
                }

                //gdb.ExternalPlatforms.DeleteOnSubmit(newLink);
                gdb.SubmitChanges();

                newLink = new ExternalPlatforms();
            }

            newLink.UserID                = userID;
            newLink.PlatformType          = "steam";
            newLink.PlatformID            = platformID;
            newLink.PlatformAuthenticated = 0;

            if (currentLink.Count() == 0)
            {
                SteamFriendsLinker.UpdateForUser(userID, platformID);
                gdb.ExternalPlatforms.InsertOnSubmit(newLink);
            }

            gdb.SubmitChanges();

            ThreadPool.QueueUserWorkItem(delegate(object stateo)
            {
                var state  = (SteamAuthCheckState)stateo;
                var result = 3; // error occurred, magic numbers ftw

                try
                {
                    var wc       = new WebClient();
                    var gameList = wc.DownloadString(string.Format("http://steamcommunity.com/profiles/{0}/games?xml=1", state.platformID));

                    // we don't parse xml here, laziness...
                    var ownsTheGame = gameList.Contains(">10190<"); // >< is to prevent accidental hashes containing 10190

                    result = (ownsTheGame) ? 0 : 2;                 // 2 = doesn't own the game

                    // update the database too based on this
                    var db = XNP.Create();

                    var id = (state.client.NPID & 0xFFFFFFFF);

                    var clinks = from link in db.ExternalPlatforms
                                 where link.UserID == id
                                 select link;

                    if (clinks.Count() > 0)
                    {
                        var clink = clinks.First();
                        clink.PlatformAuthenticated = (sbyte)((ownsTheGame) ? 1 : 0);

                        db.SubmitChanges();
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }

                try
                {
                    var linkReply            = new NPRPCResponse <AuthenticateExternalStatusMessage>(client);
                    linkReply.Message.status = result;
                    linkReply.Send();
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }
            }, new SteamAuthCheckState()
            {
                client     = client,
                platformID = platformID
            });
        }
Beispiel #12
0
        static void Main(string[] args)
        {
#if !DEBUG
            Log.Initialize("NPx.log", LogLevel.Data | LogLevel.Info | LogLevel.Error, true);
#else
            Log.Initialize("NPx.log", LogLevel.All, true);
#endif
            Log.Info("NPServer starting...");

            // connect to the database
            Database = XNP.Create();

            if (Database == null)
            {
                return;
            }

            // start the NP socket
            NPSocket streamServer = new NPSocket();
            streamServer.Start();

            // start the NP auth API
            NPAuthAPI authAPI = new NPAuthAPI();
            authAPI.Start();

            // start the Steam friend linker
            SteamFriendsLinker steamLinker = new SteamFriendsLinker();
            steamLinker.Start();

            // start the profile data handler
            ProfileData profileData = new ProfileData();
            profileData.Start();

            // start the matchdata parser
            //MatchData matchData = new MatchData();
            //matchData.Start();

            // start the matchdata converter
            //MatchDataConverter matchDataConverter = new MatchDataConverter();
            //matchDataConverter.Start();

            // start aux threads
            NPHandler.Start();
            TaskScheduler.Start();
            HttpHandler.Start();

            StatFileHandler.Register();

            TaskScheduler.EnqueueTask(Servers.CleanSessions, 300);

            // main idle loop
            while (true)
            {
                try
                {
                    Log.WriteAway();
                }
                catch (Exception e) { Log.Error(e.ToString()); }

                Thread.Sleep(5000);
            }
        }