Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        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();
                }
        }
Example #5
0
        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));
        }
Example #7
0
        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);
        }
Example #8
0
        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));
        }
Example #9
0
        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;
            }
        }
Example #10
0
        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());
        }
Example #11
0
        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;
        }
Example #12
0
        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.");
        }
Example #13
0
        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);
            }
        }
Example #14
0
        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));
        }
Example #15
0
        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();
                }
            }
        }
Example #16
0
 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;
 }
Example #17
0
File: State.cs Project: jaras/OCTGN
 public State(HostedGame game, bool isLocal, bool isDebug)
 {
     Game        = game;
     IsLocal     = isLocal;
     IsDebug     = isDebug;
     Handler     = new Handler(this);
     Broadcaster = new Broadcaster(this);
 }
Example #18
0
        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);
        }
Example #19
0
        public GameContext(HostedGame game, Config config)
        {
            Config = config ?? throw new ArgumentNullException(nameof(config));

            State = new GameState(game, this);

            Broadcaster = new Broadcaster(State.Players);
        }
Example #20
0
        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);
        }
Example #21
0
        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}");
        }
Example #22
0
 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;
 }
Example #23
0
File: Server.cs Project: wlk0/OCTGN
        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);
        }
Example #24
0
 public JoinGameLauncher(
     HostedGame game,
     string username,
     bool isHost,
     bool spectate
     )
 {
     _username = username;
     _spectate = spectate;
     _isHost   = isHost;
     _game     = game ?? throw new ArgumentNullException(nameof(game));
 }
Example #25
0
        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);
        }
Example #26
0
        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
            };
        }
Example #27
0
        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.");
        }
Example #28
0
        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);
        }
Example #29
0
        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);
            }
        }
Example #30
0
        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");
            }
        }
Example #31
0
        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();
                }
            }
        }
Example #32
0
        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);
        }
Example #33
0
        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");
        }
Example #34
0
        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);
        }
Example #35
0
        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;
        }
Example #36
0
 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;
 }
Example #37
0
        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;
        }
Example #38
0
        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);
            }
            
        }
Example #39
0
        /// <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;
                    }

            }
        }
Example #40
0
        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();
                }
        }
Example #41
0
 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;
 }
Example #42
0
        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;
                }
            }
        }
Example #43
0
        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;
                }
            }
        }
Example #44
0
 internal GameConnection(GameWebSocketService client, Player player, HostedGame hostedGame)
 {
     this.Client = client;
     this.Player = player;
     this.hostedGame = hostedGame;
 }