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