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); }
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 } }
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); } }
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(); }
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"); }
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); }
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()); }
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()); } } } }
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); }
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 }); }
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); } }