public static int HostGame(Guid g, Version v, string name, string pass, NewUser u) { Logger.PreLock(); Locker.EnterWriteLock();//Enter Lock Logger.InLock(); while (Games.ContainsKey(_currentHostPort) || !Networking.IsPortAvailable(_currentHostPort)) { _currentHostPort++; if (_currentHostPort >= 20000) { _currentHostPort = 10000; } } var hs = new HostedGame(_currentHostPort, g, v, name, pass, u); hs.HostedGameDone += HostedGameExited; if (hs.StartProcess()) { Games.Add(_currentHostPort, hs); _totalHostedGames++; Locker.ExitWriteLock();//Exit Lock Logger.EndLock(); return(_currentHostPort); } hs.HostedGameDone -= HostedGameExited; Locker.ExitWriteLock();//Exit Lock Logger.EndLock(); return(-1); }
public Task <bool> HostGame(HostedGame hostedGame, HostedGameSource source, string username, string password) { DebugValidate(hostedGame, true); //duct-tape fix for a game server bug where online-hosted games lose the chosen password //TODO: remove this check when the bug is fixed server-side (see git issue ticket #2109) if (!password.Equals(hostedGame.Password)) { hostedGame.Password = password; } var args = "-h "; if (CommandLineHandler.Instance.DevMode) { args += "-x "; } if (source == HostedGameSource.Lan) { new HostedGameProcess( hostedGame, X.Instance.Debug, true ).Start(); } args += $"-u \"{username}\" "; args += "-k \"" + HostedGame.Serialize(hostedGame) + "\""; return(LaunchJodsEngine(args)); }
public static async Task <Guid> HostGame(HostedGame req) { // Try to kill every other game this asshole started before this one. if (req.HostUser.Id != "26950") { var others = _gameListener.Games.Where(x => x.HostUser.Equals(req.HostUser)) .ToArray(); foreach (var g in others) { try { g.KillGame(); } catch (InvalidOperationException ex) { Log.Error($"{nameof(HostGame)}: Error killing game. See inner exception for more details.", ex); } } } req.Id = Guid.NewGuid(); req.HostAddress = AppConfig.Instance.HostName + ":" + _networkHelper.NextPort.ToString(); var waitTask = _gameListener.WaitForGame(req.Id); StartHostedGameProcess(req); await waitTask; return(req.Id); }
private static void StartHostedGameProcess(HostedGame req) { var broadcastPort = AppConfig.Instance.GameBroadcastPort; var args = HostedGameProcess.CreateArguments(req, broadcastPort, false); var argString = string.Join(Environment.NewLine, args); var fileName = "F:\\SASRequests"; if (!Directory.Exists(fileName)) { Directory.CreateDirectory(fileName); } fileName = Path.Combine(fileName, req.Id.ToString() + ".startrequest"); using (var stream = File.Open(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.None)) using (var writer = new StreamWriter(stream)) { writer.WriteLine(req.OctgnVersion); writer.Write(argString); writer.Flush(); } }
void StartLocalGame(DataNew.Entities.Game game, string name, string password) { var hs = new HostedGame(HostPort, game.Id, game.Version, game.Name, name, null, new User(Prefs.Nickname + "@" + AppConfig.ChatServerPath), true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Program.LobbyClient.CurrentHostedGamePort = HostPort; Program.GameSettings.UseTwoSidedTable = HostGame.UseTwoSidedTable; Program.IsHost = true; Program.GameEngine = new GameEngine(game, Prefs.Nickname, password,true); var ip = IPAddress.Parse("127.0.0.1"); for (var i = 0; i < 5; i++) { try { Program.Client = new Octgn.Networking.ClientSocket(ip, HostPort); Program.Client.Connect(); return; } catch (Exception e) { Log.Warn("Start local game error", e); if (i == 4) throw; } Thread.Sleep(2000); } throw new UserMessageException("Cannot start local game. You may be missing a file."); }
public Task <bool> HostGame(HostedGame hostedGame, HostedGameSource source, string username, string password) { DebugValidate(hostedGame, true); var args = "-h "; if (CommandLineHandler.Instance.DevMode) { args += "-x "; } if (source == HostedGameSource.Lan) { new HostedGameProcess( hostedGame, X.Instance.Debug, true ).Start(); } args += $"-u \"{username}\" "; args += "-k \"" + HostedGame.Serialize(hostedGame) + "\""; return(LaunchJodsEngine(args)); }
public static async Task <Guid> HostGame(HostedGame req, User u) { // Try to kill every other game this asshole started before this one. var others = _gameListener.Games.Where(x => x.HostUser.Equals(u)) .ToArray(); foreach (var g in others) { try { g.KillGame(); } catch (InvalidOperationException ex) { Log.Error($"{nameof(HostGame)}: Error killing game. See inner exception for more details.", ex); } } var bport = AppConfig.Instance.GameBroadcastPort; req.Id = Guid.NewGuid(); req.HostAddress = AppConfig.Instance.HostName + ":" + Ports.NextPort.ToString(); var waitTask = _gameListener.WaitForGame(req.Id); var gameProcess = new HostedGameProcess(req, Service.IsDebug, false, AppConfig.Instance.GameBroadcastPort); gameProcess.Start(); await waitTask; return(req.Id); }
Task <bool> StartLocalGame(DataNew.Entities.Game game, string name, string password) { var octgnVersion = typeof(Server.Server).Assembly.GetName().Version; var user = Program.LobbyClient?.User ?? new User(Guid.NewGuid().ToString(), Username); var username = user.DisplayName; var hg = new HostedGame() { Id = Guid.NewGuid(), Name = name, HostUser = user, GameName = game.Name, GameId = game.Id, GameVersion = game.Version.ToString(), HostAddress = $"0.0.0.0:{Prefs.LastLocalHostedGamePort}", Password = password, OctgnVersion = octgnVersion.ToString(), GameIconUrl = game.IconUrl, Spectators = true, DateCreated = DateTimeOffset.Now }; if (Program.LobbyClient?.User != null) { hg.HostUserIconUrl = ApiUserCache.Instance.ApiUser(Program.LobbyClient.User)?.IconUrl; } return(Program.JodsEngine.HostGame(hg, HostedGameSource.Lan, username, password)); }
public HostedGameProcess( HostedGame game, bool isDebug, bool isLocal, int broadcastPort = 21234 ) { HostedGame = game ?? throw new ArgumentNullException(nameof(game)); if (game.HostUser == null) { throw new InvalidOperationException($"{nameof(game)}.{nameof(game.HostUser)} can't be null."); } var arguments = CreateArguments(game, broadcastPort, isLocal); if (!Version.TryParse(game.OctgnVersion, out var sasVersion) && !isLocal) { throw new InvalidOperationException($"{nameof(game.OctgnVersion)} '{game.OctgnVersion}' is invalid."); } var path = GetSASPath(sasVersion, isLocal, isDebug); _process = new Process(); _process.StartInfo.Arguments = string.Join(" ", arguments); _process.StartInfo.FileName = path; if (isLocal) //Launch as a subprocess and share our console. Don't do this on the server otherwise it causes issues restarting things individually { _process.StartInfo.UseShellExecute = false; _process.StartInfo.CreateNoWindow = true; } }
public static string[] CreateArguments(HostedGame game, int broadcastPort, bool isLocal) { var atemp = new List <string>(); atemp.Add("-id=" + game.Id.ToString()); atemp.Add("-name=\"" + game.Name + "\""); atemp.Add("-hostuserid=\"" + game.HostUser.Id + "\""); atemp.Add("-hostusername=\"" + game.HostUser.DisplayName + "\""); atemp.Add("-gamename=\"" + game.GameName + "\""); atemp.Add("-gameid=" + game.GameId); atemp.Add("-gameversion=" + game.GameVersion); atemp.Add("-bind=" + game.HostAddress); atemp.Add("-password="******"-broadcastport=" + broadcastPort); if (!string.IsNullOrWhiteSpace(game.GameIconUrl)) { atemp.Add("-gameiconurl=" + game.GameIconUrl); } if (!string.IsNullOrWhiteSpace(game.HostUserIconUrl)) { atemp.Add("-usericonurl=" + game.HostUserIconUrl); } if (game.Spectators) { atemp.Add("-spectators"); } if (isLocal) { atemp.Add("-local"); } return(atemp.ToArray()); }
void StartLocalGame(Data.Game game, string name, string password) { var hostport = new Random().Next(5000, 6000); while (!Networking.IsPortAvailable(hostport)) { hostport++; } var hs = new HostedGame(hostport, game.Id, game.Version, game.Name, name, Password, new User(Username + "@" + Program.ChatServerPath), true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Prefs.Nickname = Username; Program.LobbyClient.CurrentHostedGamePort = hostport; Program.GameSettings.UseTwoSidedTable = true; Program.Game = new Game(GameDef.FromO8G(game.FullPath), Username, true); Program.IsHost = true; var ip = IPAddress.Parse("127.0.0.1"); Program.Client = new Client(ip, hostport); Program.Client.Connect(); SuccessfulHost = true; }
void StartLocalGame(DataNew.Entities.Game game, string name, string password) { var hs = new HostedGame(HostPort, game.Id, game.Version, game.Name, name, null, new User(Prefs.Nickname + "@" + AppConfig.ChatServerPath), true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Program.LobbyClient.CurrentHostedGamePort = HostPort; Program.GameSettings.UseTwoSidedTable = true; Program.GameEngine = new GameEngine(game, Prefs.Nickname, true); Program.IsHost = true; var ip = IPAddress.Parse("127.0.0.1"); for (var i = 0; i < 5; i++) { try { Program.Client = new Octgn.Networking.Client(ip, HostPort); Program.Client.Connect(); return; } catch (Exception e) { Log.Warn("Start local game error", e); if (i == 4) { throw; } } Thread.Sleep(2000); } throw new UserMessageException("Cannot start local game. You may be missing a file."); }
private void SendTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) { try { if (!this.IsBroadcasting) { return; } var game = new HostedGame(_state.Game, false); game.ProcessId = Process.GetCurrentProcess().Id; using (var ms = new MemoryStream()) { var ser = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); ser.Serialize(ms, game); ms.Flush(); ms.Position = 0; var bytes = ms.ToArray(); var mess = new List <byte>(); mess.AddRange(BitConverter.GetBytes((Int32)bytes.Length)); mess.AddRange(bytes); var ip = IPAddress.Broadcast; if (game.Source == HostedGameSource.Online) { ip = IPAddress.Loopback; } this.Client.Send(mess.ToArray(), mess.Count, new IPEndPoint(ip, BroadcastPort)); } } catch (Exception ex) { Log.Error($"{nameof(SendTimerOnElapsed)}", ex); } }
public Task <bool> JoinGame(DataGameViewModel game, IPAddress host, int port, string username, string password, bool spectate) { var user = new User(Guid.NewGuid().ToString(), username); var hostedGame = new HostedGame() { Id = Guid.NewGuid(), GameId = game.Id, GameName = game.Name, OctgnVersion = Const.OctgnVersion.ToString(), GameVersion = game.Version.ToString(), HostAddress = $"{host}:{port}", Password = password, DateCreated = DateTime.UtcNow }; DebugValidate(hostedGame, false); var args = "-j "; if (CommandLineHandler.Instance.DevMode) { args += "-x "; } args += $"-u \"{username}\" "; if (spectate) { args += "-s "; } args += "-k \"" + HostedGame.Serialize(hostedGame) + "\""; return(LaunchJodsEngine(args)); }
private void GOnOnGameClick(object sender, EventArgs eventArgs) { var hg = sender as Octgn.Data.Game; if (hg == null || Program.PlayWindow != null) { Program.LauncherWindow.Navigate(new Login()); return; } var hostport = 5000; while (!Skylabs.Lobby.Networking.IsPortAvailable(hostport)) { hostport++; } var hs = new HostedGame(hostport, hg.Id, hg.Version, "LocalGame", "", null, true); hs.HostedGameDone += hs_HostedGameDone; if (!hs.StartProcess()) { hs.HostedGameDone -= hs_HostedGameDone; Program.LauncherWindow.Navigate(new Login()); return; } Program.IsHost = true; Data.Game theGame = Program.GamesRepository.Games.FirstOrDefault(g => g.Id == hg.Id); if (theGame == null) { return; } Program.Game = new Game(GameDef.FromO8G(theGame.FullPath), true); var ad = new IPAddress[1]; IPAddress ip = IPAddress.Parse("127.0.0.1"); if (ad.Length <= 0) { return; } try { Program.Client = new Client(ip, hostport); Program.Client.Connect(); Dispatcher.Invoke(new Action(() => Program.LauncherWindow.NavigationService.Navigate(new StartGame(true) { Width = 400 }))); } catch (Exception ex) { Debug.WriteLine(ex); if (Debugger.IsAttached) { Debugger.Break(); } } }
public GameBroadcaster(HostedGame game, int broadcastPort = 21234) { this._game = game; this.BroadcastPort = broadcastPort; this.IsBroadcasting = false; this.SendTimer = new Timer(5000); this.SendTimer.Elapsed += this.SendTimerOnElapsed; }
public State(HostedGame game, bool isLocal, bool isDebug) { Game = game; IsLocal = isLocal; IsDebug = isDebug; Handler = new Handler(this); Broadcaster = new Broadcaster(this); }
public void Join(string clientName, HostedGameInfo gameToJoin) { _client = ClientList.Current.Single(c => c.Name == clientName); _game = GameList.Current.Single(g => g.Name == gameToJoin.GameName); var callback = OperationContext.Current.GetCallbackChannel<IHostedGameServiceCallback>(); _game.AddClient(_client, callback); }
public GameContext(HostedGame game, Config config) { Config = config ?? throw new ArgumentNullException(nameof(config)); State = new GameState(game, this); Broadcaster = new Broadcaster(State.Players); }
public async Task StartSinglePlayer() { DbContext.SetContext(new DesktopDbContext()); var configLoader = new ConfigLoader(); await configLoader.Load(null); var octgnVersion = typeof(Server.Server).Assembly.GetName().Version; var username = Prefs.Username; if (string.IsNullOrWhiteSpace(username)) { username = Library.Randomness.GrabRandomNounWord() + Library.Randomness.GrabRandomJargonWord(); } var user = new User(Guid.NewGuid().ToString(), username); var name = Prefs.LastRoomName; if (string.IsNullOrWhiteSpace(name)) { name = Library.Randomness.RandomRoomName(); } var gameId = GetGameId(); var gameName = Details.Name; var gameVersion = Package.Record.Version; var hostedGame = new HostedGame() { Id = Guid.NewGuid(), Name = name, HostUser = user, GameName = gameName, GameId = gameId, GameVersion = gameVersion, HostAddress = $"0.0.0.0:{Prefs.LastLocalHostedGamePort}", OctgnVersion = octgnVersion.ToString(), Spectators = true, }; var args = "-h "; new HostedGameProcess( hostedGame, X.Instance.Debug, true ).Start(); args += $"-u \"{username}\" "; args += "-p "; args += "-k \"" + HostedGame.Serialize(hostedGame) + "\""; await LaunchEngine(args); }
async Task StartOnlineGame(DataNew.Entities.Game game, string name, string password) { var client = new Octgn.Site.Api.ApiClient(); if (!await client.IsGameServerRunning(Prefs.Username, Prefs.Password.Decrypt())) { throw new UserMessageException("The game server is currently down. Please try again later."); } Program.CurrentOnlineGameName = name; // TODO: Replace this with a server-side check password = SubscriptionModule.Get().IsSubscribed == true ? password : String.Empty; var octgnVersion = typeof(Server.Server).Assembly.GetName().Version; var req = new HostedGame { GameId = game.Id, GameVersion = game.Version.ToString(), Name = name, GameName = game.Name, GameIconUrl = game.IconUrl, Password = password, HasPassword = !string.IsNullOrWhiteSpace(password), OctgnVersion = octgnVersion.ToString(), Spectators = Specators }; var result = await Program.LobbyClient.HostGame(req); Program.CurrentHostedGame = result ?? throw new InvalidOperationException("HostGame returned a null"); Program.GameEngine = new GameEngine(game, Program.LobbyClient.Me.DisplayName, false, this.Password); Program.IsHost = true; foreach (var address in Dns.GetHostAddresses(AppConfig.GameServerPath)) { try { if (address == IPAddress.IPv6Loopback) { continue; } // Should use gameData.IpAddress sometime. Log.Info($"{nameof(StartOnlineGame)}: Trying to connect to {address}:{result.Port}"); Program.Client = new ClientSocket(address, result.Port); await Program.Client.Connect(); SuccessfulHost = true; return; } catch (Exception ex) { Log.Error($"{nameof(StartOnlineGame)}: Couldn't connect to address {address}:{result.Port}", ex); } } throw new InvalidOperationException($"Unable to connect to {AppConfig.GameServerPath}.{result.Port}"); }
public static int AddGame(HostedGame game) { int i = Games.Add(game); HostedGame h = (HostedGame)Games[i]; h.ID = i; Version V = new Version(h.GameVersion); Guid G = new Guid(h.GUID); int port = 6000 + i; ConsoleEventLog.addEvent(new ConsoleEvent("#Starting server on port " + port.ToString()), true); h.Server = new Octgn.Server.Server(port, false, G, V); return i; }
private readonly TcpListener _tcp; // Underlying windows socket public Server(Config config, HostedGame game, int broadcastPort) { Context = new GameContext(game, config); Context.State.Players.PlayerDisconnected += Players_PlayerDisconnected; Context.State.Players.AllPlayersDisconnected += Players_AllPlayersDisconnected; Log.InfoFormat("Creating server {0}", Context.Game.HostAddress); _tcp = new TcpListener(IPAddress.Any, Context.Game.Port); _broadcaster = new GameBroadcaster(Context.Game, broadcastPort); }
public JoinGameLauncher( HostedGame game, string username, bool isHost, bool spectate ) { _username = username; _spectate = spectate; _isHost = isHost; _game = game ?? throw new ArgumentNullException(nameof(game)); }
private async Task <object> ChatClient_RequestReceived(object sender, RequestReceivedEventArgs args) { if (args.Request.Name == nameof(IClientHostingRPC.HostGame)) { try { var game = HostedGame.GetFromPacket(args.Request); if (game == null) { throw new InvalidOperationException("game is null"); } game.HostUser = args.Request.Origin ?? throw new InvalidOperationException("args.Request.Origin is null"); Log.InfoFormat("Host game from {0}", args.Request.Origin); var endTime = DateTime.Now.AddSeconds(10); while (SasUpdater.Instance.IsUpdating) { await Task.Delay(100); if (endTime > DateTime.Now) { throw new Exception("Couldn't host, sas is updating"); } } var id = await HostedGames.HostGame(game); if (id == Guid.Empty) { throw new InvalidOperationException("id == Guid.Empty"); } game = HostedGames.Get(id); if (game == null) { throw new InvalidOperationException("game from HostedGames is null"); } if (game.HostUser == null) { throw new InvalidOperationException("game.HostUser is null"); } return(game); } catch (Exception ex) { Log.Error($"{nameof(ChatClient_RequestReceived)}", ex); return(new ErrorResponseData(Communication.ErrorResponseCodes.UnhandledServerError, "Problem starting SAS", false)); } } return(null); }
public GameContext(HostedGame game, Config config) { Game = game ?? throw new ArgumentNullException(nameof(game)); Config = config ?? throw new ArgumentNullException(nameof(config)); Players = new PlayerCollection(this); Broadcaster = new Broadcaster(Players); GameSettings = new GameSettings() { AllowSpectators = Game.Spectators }; }
async Task StartLocalGame(DataNew.Entities.Game game, string name, string password) { var hg = new HostedGame() { Id = Guid.NewGuid(), Name = name, HostUser = Program.LobbyClient?.Me, GameName = game.Name, GameId = game.Id, GameVersion = game.Version.ToString(), HostAddress = $"0.0.0.0:{HostPort}", Password = password, GameIconUrl = game.IconUrl, Spectators = true, }; if (Program.LobbyClient?.Me != null) { hg.HostUserIconUrl = ApiUserCache.Instance.ApiUser(Program.LobbyClient.Me).IconUrl; } // We don't use a userid here becuase we're doing a local game. var hs = new HostedGameProcess(hg, X.Instance.Debug, true); hs.Start(); Program.GameSettings.UseTwoSidedTable = HostGame.UseTwoSidedTable; Program.IsHost = true; Program.GameEngine = new GameEngine(game, Prefs.Nickname, false, password, true); var ip = IPAddress.Parse("127.0.0.1"); for (var i = 0; i < 5; i++) { try { Program.Client = new Octgn.Networking.ClientSocket(ip, HostPort); await Program.Client.Connect(); return; } catch (Exception e) { Log.Warn("Start local game error", e); if (i == 4) { throw; } } Thread.Sleep(2000); } throw new UserMessageException("Cannot start local game. You may be missing a file."); }
async Task <bool> StartOnlineGame(DataNew.Entities.Game game, string name, string password) { var client = new Octgn.Site.Api.ApiClient(); if (!await client.IsGameServerRunning(Prefs.Username, Prefs.Password.Decrypt())) { throw new UserMessageException("The game server is currently down. Please try again later."); } Program.CurrentOnlineGameName = name; // TODO: Replace this with a server-side check password = SubscriptionModule.Get().IsSubscribed == true ? password : String.Empty; var octgnVersion = typeof(Server.Server).Assembly.GetName().Version; var req = new HostedGame { GameId = game.Id, GameVersion = game.Version.ToString(), Name = name, GameName = game.Name, GameIconUrl = game.IconUrl, Password = password, HasPassword = !string.IsNullOrWhiteSpace(password), OctgnVersion = octgnVersion.ToString(), Spectators = Specators }; var lobbyClient = Program.LobbyClient ?? throw new InvalidOperationException("lobby client null"); HostedGame result = null; try { result = await lobbyClient.HostGame(req); } catch (ErrorResponseException ex) { if (ex.Code != ErrorResponseCodes.UserOffline) { throw; } throw new UserMessageException("The Game Service is currently offline. Please try again."); } var launchedEngine = await Program.JodsEngine.HostGame( result, HostedGameSource.Online, lobbyClient.User.DisplayName, Password ); return(launchedEngine); }
void StartLocalGame(DataNew.Entities.Game game, string name, string password) { var hostport = new Random().Next(5000, 6000); while (!Networking.IsPortAvailable(hostport)) { hostport++; } var hs = new HostedGame(hostport, game.Id, game.Version, game.Name, name , Password, new User(Username + "@" + AppConfig.ChatServerPath), Specators, true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Prefs.Nickname = Username; Program.LobbyClient.CurrentHostedGamePort = hostport; Program.GameEngine = new GameEngine(game, Username, false, password, true); // Program.GameSettings.UseTwoSidedTable = true; Program.CurrentOnlineGameName = name; Program.IsHost = true; Program.IsMatchmaking = false; var ip = IPAddress.Parse("127.0.0.1"); for (var i = 0; i < 5; i++) { try { Program.Client = new ClientSocket(ip, hostport); Program.Client.Connect(); SuccessfulHost = true; return; } catch (Exception e) { Log.Warn("Start local game error", e); if (i == 4) { throw; } } Thread.Sleep(2000); } }
private static void Validate(HostedGame hostedGame) { var minCreatedDate = DateTimeOffset.UtcNow.AddHours(-6); var maxCreatedDate = DateTimeOffset.UtcNow.AddMinutes(1); if (hostedGame.DateCreated.UtcDateTime <= minCreatedDate) { throw new UserMessageException($"Invalid game CreatedDate is too ancient {hostedGame.DateCreated}"); } if (hostedGame.DateCreated.UtcDateTime >= maxCreatedDate) { throw new UserMessageException($"Invalid game CreatedDate is in the future {hostedGame.DateCreated}"); } if (hostedGame.Id == Guid.Empty) { throw new UserMessageException($"Game Id Empty"); } }
public void HostGame(HostGameRequest req, User u) { var bport = 21237; if (AppConfig.Instance.Test) bport = 21235; var game = new HostedGame(Ports.NextPort, req.GameGuid, req.GameVersion, req.GameName, req.Name, req.Password, u, false, true,req.RequestId,bport); if (game.StartProcess(true)) { // Try to kill every other game this asshole started before this one. var others = GameListener.Games.Where(x => x.Username.Equals(u.UserName, StringComparison.InvariantCultureIgnoreCase)) .ToArray(); foreach (var g in others) { g.TryKillGame(); } } }
public Guid HostGame(HostGameRequest req, User u) { var bport = AppConfig.Instance.BroadcastPort; var game = new HostedGame(Ports.NextPort, req.GameGuid, req.GameVersion, req.GameName, req.Name, req.Password, u, req.Spectators, false, true, req.RequestId, bport, req.SasVersion); if (game.StartProcess(true)) { // Try to kill every other game this asshole started before this one. var others = GameListener.Games.Where(x => x.Username.Equals(u.UserName, StringComparison.InvariantCultureIgnoreCase)) .ToArray(); foreach (var g in others) { g.TryKillGame(); } return(game.Id); } return(Guid.Empty); }
private static void DebugValidate(HostedGame hostedGame, bool isHosting) { DateTimeOffset minCreatedDate; if (isHosting) { minCreatedDate = DateTimeOffset.UtcNow.AddMinutes(-2); } else { minCreatedDate = DateTimeOffset.UtcNow.AddHours(-6); } DateTimeOffset maxCreatedDate = DateTimeOffset.UtcNow; Debug.Assert(hostedGame.DateCreated.UtcDateTime >= minCreatedDate, $"Hosted game DateCreated is too ancient {hostedGame.DateCreated}"); Debug.Assert(hostedGame.DateCreated.UtcDateTime <= maxCreatedDate, $"Hosted game DateCreated is too far in the future {hostedGame.DateCreated}"); Debug.Assert(hostedGame.Id != Guid.Empty, $"Hosted game Id is empty"); }
protected virtual HostedGame GenerateHostedGame() { var game = LoadGame(); var name = "zz__TestGame"; var password = "******"; var hostedGame = new HostedGame { GameId = game.Id, GameVersion = game.Version.ToString(), Name = name, GameName = game.Name, GameIconUrl = game.IconUrl, Password = password, HasPassword = !string.IsNullOrWhiteSpace(password), OctgnVersion = _version.ToString(), Spectators = false }; return(hostedGame); }
public Guid HostGame(HostGameRequest req, User u) { var bport = AppConfig.Instance.BroadcastPort; var game = new HostedGame(Ports.NextPort, req.GameGuid, req.GameVersion, req.GameName, req.Name, req.Password, u,req.Spectators ,false, true,req.RequestId,bport,req.SasVersion); if (game.StartProcess(true)) { // Try to kill every other game this asshole started before this one. var others = GameListener.Games.Where(x => x.Username.Equals(u.UserName, StringComparison.InvariantCultureIgnoreCase)) .ToArray(); foreach (var g in others) { g.TryKillGame(); } return game.Id; } return Guid.Empty; }
public static int HostGame(Guid g, Version v, string name, string pass, User u, string gameName) { Locker.EnterWriteLock();//Enter Lock while (Games.ContainsKey(_currentHostPort) || !Networking.IsPortAvailable(_currentHostPort)) { _currentHostPort++; if (_currentHostPort >= 20000) _currentHostPort = 10000; } var hs = new HostedGame(_currentHostPort, g, v, gameName, name, pass, u, true, true); hs.HostedGameDone += HostedGameExitedEventLauncher; if (hs.StartProcess()) { Games.Add(_currentHostPort, hs); Locker.ExitWriteLock();//Exit Lock return _currentHostPort; } hs.HostedGameDone -= HostedGameExitedEventLauncher; Locker.ExitWriteLock();//Exit Lock return -1; }
void StartLocalGame(Data.Game game, string name, string password) { var hostport = new Random().Next(5000,6000); while (!Networking.IsPortAvailable(hostport)) hostport++; var hs = new HostedGame(hostport, game.Id, game.Version, game.Name, name, Password, new User(Username + "@" + Program.ChatServerPath), true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Prefs.Nickname = Username; Program.LobbyClient.CurrentHostedGamePort = hostport; Program.GameSettings.UseTwoSidedTable = true; Program.Game = new Game(GameDef.FromO8G(game.FullPath), Username, true); Program.IsHost = true; var ip = IPAddress.Parse("127.0.0.1"); Program.Client = new Client(ip, hostport); Program.Client.Connect(); SuccessfulHost = true; }
void StartLocalGame(DataNew.Entities.Game game, string name, string password) { var hostport = new Random().Next(5000,6000); while (!Networking.IsPortAvailable(hostport)) hostport++; var hs = new HostedGame(hostport, game.Id, game.Version, game.Name,game.IconUrl, name , Password, new User(Username + "@" + AppConfig.ChatServerPath),Specators, true); if (!hs.StartProcess()) { throw new UserMessageException("Cannot start local game. You may be missing a file."); } Prefs.Nickname = Username; Program.LobbyClient.CurrentHostedGamePort = hostport; Program.GameEngine = new GameEngine(game, Username, false, password, true); // Program.GameSettings.UseTwoSidedTable = true; Program.CurrentOnlineGameName = name; Program.IsHost = true; Program.IsMatchmaking = false; var ip = IPAddress.Parse("127.0.0.1"); for (var i = 0; i < 5; i++) { try { Program.Client = new ClientSocket(ip, hostport); Program.Client.Connect(); SuccessfulHost = true; return; } catch (Exception e) { Log.Warn("Start local game error",e); if (i == 4) throw; } Thread.Sleep(2000); } }
/// <summary> /// Whenever a SkySocket gets a message, it goes here for processing. /// </summary> /// <param name="sm">SocketMessage</param> private void OnMessageReceived(SkySocket ss,Net.SocketMessage sm) { User u; if (Callbacks.ContainsKey(sm.Header.ToLower())) { SocketMessageResult a = Callbacks[sm.Header.ToLower()]; if (a != null) { a.Invoke(sm); Callbacks.Remove(sm.Header.ToLower()); return; } } switch (sm.Header.ToLower()) { case "end": { Stop(); break; } case "loginsuccess": Trace.TraceInformation("Got LoginSuccess"); Me = (User)sm["me"]; if (Me != null) { _onLoginFinished.Invoke(LoginResult.Success, DateTime.Now, ""); Chatting.JoinChatRoom(0); } else { _onLoginFinished.Invoke(LoginResult.Failure, DateTime.Now, "Data failure."); Stop(); //Close(DisconnectReason.CleanDisconnect); } break; case "loginfailed": Trace.TraceInformation("Got LoginFailed"); _onLoginFinished.Invoke(LoginResult.Failure, DateTime.Now, (sm["message"] != null) ? (string)sm["message"] : ""); break; case "friends": lock (friendLocker) { FriendList = new List<User>(); foreach (NameValuePair p in sm.Data) { FriendList.Add((User)p.Value); } if (OnDataRecieved != null) { foreach (DataRecieved d in OnDataRecieved.GetInvocationList()) d.BeginInvoke(DataRecType.FriendList, null, new AsyncCallback((IAsyncResult r) => { }), null); } } break; case "servermessage": { string mess = sm["message"] as string; if (mess != null && OnDataRecieved != null) { foreach(DataRecieved d in OnDataRecieved.GetInvocationList()) d.BeginInvoke(DataRecType.ServerMessage, mess, new AsyncCallback((IAsyncResult r) => { }), null); } break; } case "friendrequest": lock (noteLocker) { u = (User)sm.Data[0].Value; foreach (Notification n in Notifications) { FriendRequestNotification fr = n as FriendRequestNotification; if (fr != null) { if (fr.User.Uid == u.Uid) return; } } Notifications.Add(new FriendRequestNotification(u, this, _nextNoteId)); _nextNoteId++; if (OnFriendRequest != null) foreach (FriendRequest fr in OnFriendRequest.GetInvocationList()) fr.BeginInvoke(u, new AsyncCallback((IAsyncResult r) => { }), null); } break; case "status": lock (friendLocker) { u = (User)sm.Data[0].Value; User f = FriendList.FirstOrDefault(us => us.Equals(u)); if (f != null) { f.DisplayName = u.DisplayName; f.Status = u.Status; f.CustomStatus = u.CustomStatus; } if (u.Equals(Me)) { Me.DisplayName = u.DisplayName; Me.Status = u.Status; Me.CustomStatus = u.CustomStatus; } if (OnUserStatusChanged != null) foreach (UserStatusChanged usc in OnUserStatusChanged.GetInvocationList()) usc.BeginInvoke(u.Status, u, new AsyncCallback((IAsyncResult r) => { }), null); if (OnDataRecieved != null) foreach (DataRecieved dr in OnDataRecieved.GetInvocationList()) dr.BeginInvoke(DataRecType.FriendList, null, new AsyncCallback((IAsyncResult r) => { }), null); } break; case "customstatus": lock (friendLocker) { u = (User)sm["user"]; string s = (string)sm["status"]; if (u != null && s != null) { if (u.Equals(Me)) Me.CustomStatus = s; else { int i = FriendList.IndexOf(u); if (i > -1) FriendList[i].CustomStatus = s; if (OnDataRecieved != null) foreach (DataRecieved dr in OnDataRecieved.GetInvocationList()) dr.BeginInvoke(DataRecType.UserCustomStatus, u, new AsyncCallback((IAsyncResult r) => { }), null); } } } break; case "banned": int time = (int)sm["end"]; _onLoginFinished.Invoke(LoginResult.Banned, Skylabs.ValueConverters.FromPhpTime(time), ""); break; case "gamelist": { lock (gameLocker) { List<HostedGame> games = sm["list"] as List<HostedGame>; Games = games; if (games.Count > 0) if (OnGameHostEvent != null) foreach (GameHostEvent ge in OnGameHostEvent.GetInvocationList()) ge.BeginInvoke(Games[0], new AsyncCallback((IAsyncResult r) => { }), null); } break; } case "gamehosting": { lock (gameLocker) { HostedGame gm = new HostedGame(sm); Games.Add(gm); if (OnGameHostEvent != null) LazyAsync.Invoke(() => OnGameHostEvent.Invoke(gm)); } break; } case "gamestarted": { lock (gameLocker) { int p = (int)sm["port"]; HostedGame gm = Games.FirstOrDefault(g => g.Port == p); if (gm != null) { gm.GameStatus = HostedGame.eHostedGame.GameInProgress; if (OnGameHostEvent != null) LazyAsync.Invoke(() => OnGameHostEvent.Invoke(gm)); } } break; } case "gameend": { lock (gameLocker) { int p = (int)sm["port"]; HostedGame gm = Games.FirstOrDefault(g => g.Port == p); if (gm != null) { gm.GameStatus = HostedGame.eHostedGame.StoppedHosting; if (OnGameHostEvent != null) LazyAsync.Invoke(() => OnGameHostEvent.Invoke(gm)); Games.Remove(gm); } } break; } case "userjoinedchatroom": { User us = (User)sm["user"]; List<User> allusers = (List<User>)sm["allusers"]; long? id = (long?)sm["roomid"]; if (us == null || allusers == null || id == null) return; long id2 = (long)id; Chatting.UserJoinedChat(id2, us, allusers); break; } case "userleftchatroom": { User us = (User)sm["user"]; long? id = (long?)sm["roomid"]; if (us == null || id == null) return; long id2 = (long)id; Chatting.UserLeftChat(id2, us); break; } case "chatmessage": { User us = (User)sm["user"]; long? id = (long?)sm["roomid"]; string mess = (string)sm["mess"]; if (us == null || id == null || mess == null) return; long id2 = (long)id; Chatting.RecieveChatMessage(id2, us, mess); break; } } }
private void GOnOnGameClick(object sender, EventArgs eventArgs) { var hg = sender as Octgn.Data.Game; if (hg == null || Program.PlayWindow != null) { Program.LauncherWindow.Navigate(new Login()); return; } var hostport = 5000; while (!Skylabs.Lobby.Networking.IsPortAvailable(hostport)) hostport++; var hs = new HostedGame(hostport, hg.Id, hg.Version, "LocalGame", "", null,true); hs.HostedGameDone += hs_HostedGameDone; if (!hs.StartProcess()) { hs.HostedGameDone -= hs_HostedGameDone; Program.LauncherWindow.Navigate(new Login()); return; } Program.IsHost = true; Data.Game theGame = Program.GamesRepository.Games.FirstOrDefault(g => g.Id == hg.Id); if (theGame == null) return; Program.Game = new Game(GameDef.FromO8G(theGame.FullPath),true); var ad = new IPAddress[1]; IPAddress ip = IPAddress.Parse("127.0.0.1"); if (ad.Length <= 0) return; try { Program.Client = new Client(ip, hostport); Program.Client.Connect(); Dispatcher.Invoke(new Action(() => Program.LauncherWindow.NavigationService.Navigate(new StartGame(true){Width = 400}))); } catch (Exception ex) { Debug.WriteLine(ex); if (Debugger.IsAttached) Debugger.Break(); } }
public static int HostGame(Guid g, Version v, string name, string pass, User u) { Logger.PreLock(); Locker.EnterWriteLock();//Enter Lock Logger.InLock(); while (Games.ContainsKey(_currentHostPort) || !Networking.IsPortAvailable(_currentHostPort)) { _currentHostPort++; if (_currentHostPort >= 20000) _currentHostPort = 10000; } var hs = new HostedGame(_currentHostPort, g, v,"unknown", name, pass, u); hs.HostedGameDone += HostedGameExited; if (hs.StartProcess()) { Games.Add(_currentHostPort, hs); _totalHostedGames++; Locker.ExitWriteLock();//Exit Lock Logger.EndLock(); return _currentHostPort; } hs.HostedGameDone -= HostedGameExited; Locker.ExitWriteLock();//Exit Lock Logger.EndLock(); return -1; }
public override void handleInput(SocketMessage input) { if (!LoggedIn) { switch (input.Header) { case "LOG": Boolean worked = UserMysql.login(this, input.Arguments[0], input.Arguments[1]); if (worked) { for (int i = 0; i < ClientContainer.Clients.Count; i++) { if (ClientContainer.Clients[i].User.UID == User.UID) { if (ClientContainer.Clients[i].ID != this.ID) { if (ClientContainer.Clients[i].Connected) { ClientContainer.UserEvent(UserEventType.LogOut, ClientContainer.Clients[i]); ClientContainer.Clients[i].Close("Another user logged in.", false); } } } } SocketMessage sm; if (input.Arguments.Count < 3) { sm = new SocketMessage("LOGSUCCESS"); sm.Arguments.Add(this.User.Username); writeMessage(sm); ClientContainer.UserEvent(UserEventType.LogIn, this); Thread th = new Thread(new ThreadStart(delegate() { Thread.Sleep(1000); sm = new SocketMessage("CHATINFO"); sm.Arguments.Add("YOU DO NOT HAVE THE LATEST LOBBY VERSION. PLEASE VISIT http://www.skylabsonline.com/blog/project/octgn-w-lobby/ TO GET IT!"); this.writeMessage(sm); sm = new SocketMessage("CHATINFO"); sm.Arguments.Add("User " + this.User.Username + " could not log in because he/she needs an update."); ClientContainer.AllUserCommand(sm); Thread.Sleep(1000); this.Close("Incompatable version.", true); } )); th.Start(); } else { if (!input.Arguments[2].Equals(MainClass.getCurRevision().Trim())) { sm = new SocketMessage("LOGSUCCESS"); sm.Arguments.Add(this.User.Username); writeMessage(sm); ClientContainer.UserEvent(UserEventType.LogIn, this); Thread th = new Thread(new ThreadStart(delegate() { Thread.Sleep(1000); sm = new SocketMessage("CHATINFO"); sm.Arguments.Add("YOU DO NOT HAVE THE LATEST LOBBY VERSION. PLEASE VISIT http://www.skylabsonline.com/blog/project/octgn-w-lobby/ TO GET IT!"); this.writeMessage(sm); sm = new SocketMessage("CHATINFO"); sm.Arguments.Add("User " + this.User.Username + " could not log in because he/she needs an update."); ClientContainer.AllUserCommand(sm); Thread.Sleep(1000); this.Close("Incompatable version.", true); } )); th.Start(); } else { sm = new SocketMessage("LOGSUCCESS"); sm.Arguments.Add(this.User.Username); writeMessage(sm); ClientContainer.UserEvent(UserEventType.LogIn, this); sm = new SocketMessage("CHATINFO"); sm.Arguments.Add(MainClass.getDailyMessage()); this.writeMessage(sm); LoggedIn = true; } } } else { SocketMessage sm = new SocketMessage("LOGERROR"); writeMessage(sm); LoggedIn = false; } break; case "REG": String nick = input.Arguments[0]; String email = input.Arguments[1]; String pass = input.Arguments[2]; String regret = UserMysql.register(nick, email, pass); writeMessage(new SocketMessage(regret)); break; case "RC": this.isRc = true; User = new User(987654321, "rc", "rc"); break; } } else if (LoggedIn) { switch (input.Header) { case "GETONLINELIST": StringBuilder sb = new StringBuilder(); SocketMessage sm = new SocketMessage("ONLINELIST"); List<User> listOnlineUsers = ClientContainer.getOnlineUserList(); int intOnlineUsers = listOnlineUsers.Count; for (int i = 0; i < intOnlineUsers; i++) { sb = new StringBuilder(); sb.Append(listOnlineUsers[i].Email); sb.Append(':'); sb.Append(listOnlineUsers[i].Username); sb.Append(':'); sb.Append(listOnlineUsers[i].Status.ToString()); sm.Arguments.Add(sb.ToString()); } foreach (String user in IrcBot.Users) { sb = new StringBuilder(); sb.Append(user + "@irc.irc"); sb.Append(':'); sb.Append("<irc>" + user); sb.Append(':'); sb.Append(UserStatus.Available.ToString()); sm.Arguments.Add(sb.ToString()); } writeMessage(sm); break; case "LOBCHAT": ClientContainer.LobbyChat(User.Username, input.Arguments[0].Trim()); break; case "HOST": String[] ips = input.Arguments[0].Split(new char[1] { '?' }); HostedGame h = new HostedGame(User.UID, input.Arguments[3], input.Arguments[1], input.Arguments[0], input.Arguments[2], ""); int gID = GameBox.AddGame(h); SocketMessage stemp = input; stemp.Arguments.Add(this.User.Username); stemp.Arguments.Add(gID.ToString()); #if(DEBUG) stemp.Arguments.Add("localhost"); IPAddress[] addresslist = Dns.GetHostAddresses("localhost"); #else stemp.Arguments.Add(MainClass.getProperty("OusideHost")); IPAddress[] addresslist = Dns.GetHostAddresses(MainClass.getProperty("OusideHost")); #endif int port = (gID + 6000); stemp.Arguments.Add(port.ToString()); ClientContainer.AllUserCommand(stemp); IrcBot.GeneralChat(this.User.Username + " is hosting a " + h.GameName + " game at " + addresslist[0].ToString() + ":" + port.ToString() + " :" + h.Name); foreach (IPAddress theaddress in addresslist) { Console.WriteLine(theaddress.ToString()); } break; case "UNHOST": string ret = GameBox.RemoveByUID(User.UID); String[] rets = ret.Split(new char[1] { ':' }, StringSplitOptions.RemoveEmptyEntries); foreach (String b in rets) { if (!ret.Equals("-1")) { SocketMessage stemp2 = input; stemp2.Arguments.Add(b); ClientContainer.AllUserCommand(stemp2); } } break; case "STATUS": User.Status = (UserStatus)Enum.Parse(typeof(UserStatus), input.Arguments[0], true); input.Arguments.Add(User.Username); ClientContainer.AllUserCommand(input); break; case "GAMELIST": int mGames = GameBox.Games.Count; for (int i = 0; i < mGames; i++) { HostedGame hg = (HostedGame)GameBox.Games[i]; if (hg.Available) { SocketMessage stemp3 = new SocketMessage("GAMELIST"); //Game list //GID,IP,Port,GameName,GUID,GameVersion,Username,Name //GID stemp3.Arguments.Add(hg.ID.ToString()); //IP #if(DEBUG) stemp3.Arguments.Add("localhost"); #else stemp3.Arguments.Add(MainClass.getProperty("OusideHost")); #endif //Port port = (hg.ID + 6000); stemp3.Arguments.Add(port.ToString()); //GameName stemp3.Arguments.Add(hg.GameName); //GUID stemp3.Arguments.Add(hg.GUID); //GameVersion stemp3.Arguments.Add(hg.GameVersion); int uid = hg.UID; Client cl = ClientContainer.getClientFromUID(uid); //Username stemp3.Arguments.Add(cl.User.Username); //Name stemp3.Arguments.Add(hg.Name); //Main.writeEvent("Sending GAMELIST: " + stemp3.getMessage()); this.writeMessage(stemp3); } } break; default: //TODO add ConsoleEvent to handle unknown input //Main.writeEvent("Input from `" + super.strHost + "' :" + input.getMessage()); //Main.writeIn(); break; } } if (isRc) { ConsoleEventLog.addEvent(new ConsoleEvent("#RC: ", input.getMessage()), true); switch (input.Header) { case "1": SocketMessage sm = new SocketMessage("CHATINFO"); sm.Arguments.Add(input.Arguments[0]); ClientContainer.AllUserCommand(sm); break; case "2": MainClass.KillServer(); break; case "3": try { int time = int.Parse(input.Arguments[0]); MainClass.TimeKillServer(time, null); } catch (Exception e) { } break; case "4": try { int time = int.Parse(input.Arguments[0]); MainClass.TimeKillServer(time, input.Arguments[1]); } catch (Exception e) { } break; } } }
public static int HostGame(Guid g,Version v, string name,string pass,User u) { Logger.TL(System.Reflection.MethodInfo.GetCurrentMethod().Name, "GamingLocker"); lock(GamingLocker) { Logger.L(System.Reflection.MethodInfo.GetCurrentMethod().Name, "GamingLocker"); while (Games.ContainsKey(_currentHostPort) || !Networking.IsPortAvailable(_currentHostPort)) { _currentHostPort++; if (_currentHostPort >= 8000) _currentHostPort = 5000; } HostedGame hs = new HostedGame(_currentHostPort,g,v,name,pass,u); hs.HostedGameDone += HostedGameExited; if (hs.StartProcess()) { Games.Add(_currentHostPort, hs); _totalHostedGames++; Logger.UL(System.Reflection.MethodInfo.GetCurrentMethod().Name, "GamingLocker"); return _currentHostPort; } else { Logger.UL(System.Reflection.MethodInfo.GetCurrentMethod().Name, "GamingLocker"); hs.HostedGameDone -= HostedGameExited; return -1; } } }
internal GameConnection(GameWebSocketService client, Player player, HostedGame hostedGame) { this.Client = client; this.Player = player; this.hostedGame = hostedGame; }