示例#1
0
        protected override void endGameHandler(UserThread client, CSMessage msg)
        {
            try
            {
                ServerThread cl1  = (ServerThread)client;
                ServerThread cl2  = cl1.CurrentChallenger;
                CSMessage    msg2 = new CSMessage(MessageType.END_GAME).
                                    add(MessageType.GAME_STUFF, msg.get(MessageType.GAME_STUFF));

                bool play = new Random().Next(2) != 0;

                if (msg.get(MessageType.WIN_GAME) != null)
                {
                    cl1.ClientUser.win();
                    msg2.add(MessageType.LOSE_GAME, true);
                }
                if (msg.get(MessageType.DRAW_GAME) != null)
                {
                    cl1.ClientUser.draw();
                    cl2.ClientUser.draw();
                    msg2.add(MessageType.DRAW_GAME, true);
                }

                cl1.ClientUser.incrementParties();
                cl2.ClientUser.incrementParties();
                if (cl1.isLogged())
                {
                    manager.update(cl1.ClientUser);
                }
                if (cl2.isLogged())
                {
                    manager.update(cl2.ClientUser);
                }
                if (view != null && view.isOpened())
                {
                    view.update(cl1.ClientUser.Login, cl1.ClientUser);
                }
                if (view != null && view.isOpened())
                {
                    view.update(cl2.ClientUser.Login, cl2.ClientUser);
                }

                msg.add(MessageType.USER, cl2.ClientUser);
                msg.add(MessageType.PLAY_GAME, play);
                msg2.add(MessageType.USER, cl1.ClientUser);
                msg2.add(MessageType.PLAY_GAME, !play);
                cl1.send(msg);
                cl2.send(msg2);
            }
            catch (Exception e)
            {
                log(Severiry.ERROR, "Controller[ENDGAME] - " + e.Message);
            }
        }
示例#2
0
        /// <summary>
        /// Send an end game message to the server.
        /// </summary>
        /// <param name="gameStuff"></param>
        /// <param name="state"></param>
        private void endGameEvent(Object gameStuff, GameState state)
        {
            CSMessage msg = new CSMessage(MessageType.END_GAME);

            msg.add(MessageType.GAME_STUFF, gameStuff);
            if (state == GameState.WON)
            {
                msg.add(MessageType.WIN_GAME, true);
            }
            else
            {
                msg.add(MessageType.DRAW_GAME, true);
            }
            process.send(msg);
        }
示例#3
0
        /// <summary>
        /// Send a login message to the server.
        /// </summary>
        /// <param name="user"></param>
        /// <param name="enrolled">True if the given user is registered</param>
        /// <param name="save">True if the server should save the given user</param>
        private void loginEvent(CSUser user, bool enrolled, bool save)
        {
            if (save)
            {
                manager.createUnique(user);
            }
            CSMessage msg = new CSMessage(MessageType.LOGIN);

            msg.add(MessageType.USER, user);
            if (enrolled)
            {
                msg.add(MessageType.REGISTRATION, true);
            }
            process.send(msg);
        }
示例#4
0
        protected override void stopGameHandler(UserThread client, CSMessage msg)
        {
            try
            {
                ServerThread cl1 = (ServerThread)client;
                if (cl1.playing())
                {
                    ServerThread cl2 = cl1.CurrentChallenger;
                    if (cl2.playing())
                    {
                        msg.add(MessageType.USER, cl1.ClientUser);
                        cl2.send(msg);
                    }
                    cl2.CurrentChallenger = null;
                    cl1.CurrentChallenger = null;
                    if (view != null && view.isOpened())
                    {
                        view.removeParty(cl1.ClientUser, cl2.ClientUser);
                    }

                    broadcast();
                }
            }
            catch (Exception e)
            {
                log(Severiry.ERROR, "Controller[STOPGAME] - " + e.Message);
            }
        }
示例#5
0
        /// <summary>
        /// Start a party between the users behind the given threads.
        /// </summary>
        /// <param name="c1">First user thread</param>
        /// <param name="c2">Second user thread</param>
        private void beginGame(ServerThread c1, ServerThread c2)
        {
            c1.CurrentChallenger = c2;
            c2.CurrentChallenger = c1;

            bool play = new Random().Next(2) != 0;

            CSMessage startMsg = new CSMessage(MessageType.START_GAME);

            startMsg.add(MessageType.PLAY_GAME, play);
            startMsg.add(MessageType.USER, c2.ClientUser);
            c1.send(startMsg);

            startMsg.add(MessageType.PLAY_GAME, !play);
            startMsg.add(MessageType.USER, c1.ClientUser);
            c2.send(startMsg);

            broadcast();

            if (view != null && view.isOpened())
            {
                view.newParty(c1.ClientUser, c2.ClientUser);
            }
        }
示例#6
0
        /// <summary>
        /// Send a broadcast message.
        /// </summary>
        private void broadcast()
        {
            CSMessage     msg   = new CSMessage(MessageType.USER_LIST);
            List <CSUser> users = new List <CSUser>();

            foreach (ServerThread cl in clients)
            {
                if (!cl.playing())
                {
                    users.Add(cl.ClientUser);
                }
            }

            msg.add(MessageType.USER_LIST, users);

            foreach (ServerThread cl in clients)
            {
                if (!cl.playing())
                {
                    cl.send(msg);
                }
            }
        }
示例#7
0
        /// <summary>
        /// Manage incoming message from the given client's socket.
        /// </summary>
        /// <param name="tcpclient"></param>
        private void incomingClient(TcpClient tcpclient)
        {
            ServerThread client = new ServerThread(tcpclient);

            client.messageHandler      = new UserThread.newMessageHandler(handleMessage);
            client.loginHandler        = new UserThread.newLoginHandler(loginHandler);
            client.challengerHandler   = new UserThread.newChallengerHandler(challengerHandler);
            client.deconnectionHandler = new UserThread.newDeconnectionHandler(deconnectionHandler);
            client.endGameHandler      = new UserThread.newEndGameHandler(endGameHandler);
            client.stopGameHandler     = new UserThread.newStopGameHandler(stopGameHandler);

            CSMessage tosend = new CSMessage(MessageType.CONNECTION);

            tosend.add(MessageType.USER, client.ClientUser);
            client.send(tosend);
            client.start();
            clients.Add(client);
            broadcast();

            if (view != null && view.isOpened())
            {
                view.addUser(client.ClientUser);
            }
        }
示例#8
0
        protected override void challengerHandler(UserThread client, CSMessage msg)
        {
            try
            {
                ServerThread to;
                CSUser       user = (CSUser)msg.get(MessageType.USER);

                if ((to = findClient(user)) != null && !to.playing())
                {
                    if (msg.get(MessageType.REQUEST) != null)
                    {
                        if (!user.Equals(client.To) && !client.Froms.Contains(user))
                        {
                            abortRequest(client, client.ClientUser);
                            client.To = to.ClientUser;
                            to.Froms.Add(client.ClientUser);
                            msg.add(MessageType.USER, client.ClientUser);
                            to.send(msg);
                        }
                    }
                    else if (msg.get(MessageType.RESPONSE) != null)
                    {
                        if (client.Froms.Contains(user) && to.To.Equals(client.ClientUser))
                        {
                            abortRequest(client, client.ClientUser);
                            client.To = null;
                            client.Froms.Remove(to.ClientUser);
                            to.To = null;
                            foreach (CSUser u in client.Froms)
                            {
                                abortRequest(u, client.ClientUser);
                            }
                            foreach (CSUser u in to.Froms)
                            {
                                abortRequest(u, to.ClientUser);
                            }
                            client.Froms.Clear();
                            to.Froms.Clear();

                            beginGame((ServerThread)client, to);
                        }
                    }
                    else if (msg.get(MessageType.ABORT) != null)
                    {
                        if (user.Equals(client.To))
                        {
                            client.To = null;
                            to.Froms.Remove(client.ClientUser);
                        }
                        else
                        {
                            to.To = null;
                            client.Froms.Remove(user);
                        }
                        msg.add(MessageType.USER, client.ClientUser);
                        to.send(msg);
                    }
                }
                else
                {
                    msg.clear();
                    msg.Type = MessageType.CHALLENGING;
                    msg.add(MessageType.ABORT, true).add(MessageType.USER, user);
                    client.To = null;
                    client.Froms.Remove(user);
                    client.send(msg);
                }
            }
            catch (Exception e)
            {
                log(Severiry.ERROR, "Controller[PARTY] - " + e.Message);
            }
        }
示例#9
0
        protected override void loginHandler(UserThread client, CSMessage msg)
        {
            try
            {
                CSUser user     = (CSUser)msg.get(MessageType.USER);
                CSUser tempUser = new CSUser(client.ClientUser.Login);
                bool   error    = true;

                if (msg.get(MessageType.REGISTRATION) != null)
                {
                    msg.clear();
                    if (manager.exist(user.Login))
                    {
                        msg.add(MessageType.STATE, false).add(MessageType.ERROR, "Login '" + user.Login + "' already exists !");
                    }
                    else
                    {
                        manager.create(user);
                        if (view != null && view.isOpened())
                        {
                            view.update(client.ClientUser.Login, user);
                        }
                        client.ClientUser.Login = user.Login;
                        msg.add(MessageType.STATE, true).add(MessageType.USER, client.ClientUser);
                        error = false;
                    }
                }
                else if (findClient(user) == null)
                {
                    msg.clear();
                    if ((user = manager.find(user)) != null)
                    {
                        client.ClientUser.Points    = user.Points;
                        client.ClientUser.NbParties = user.NbParties;
                        if (view != null && view.isOpened())
                        {
                            view.update(client.ClientUser.Login, user);
                        }
                        client.ClientUser.Login = user.Login;
                        msg.add(MessageType.STATE, true).add(MessageType.USER, client.ClientUser);
                        error = false;
                    }
                    else
                    {
                        msg.add(MessageType.STATE, false).add(MessageType.ERROR, "Incorrect login or password !");
                    }
                }
                else
                {
                    msg.add(MessageType.STATE, false).add(MessageType.ERROR, "Login already connected !");
                }

                if (!error)
                {
                    abortRequest(client, tempUser);
                    foreach (CSUser u in client.Froms)
                    {
                        abortRequest(u, tempUser);
                    }
                    client.To = null;
                    client.Froms.Clear();
                    CSMessage clearmsg = new CSMessage(MessageType.CLEAR);
                    client.send(clearmsg);
                }

                client.send(msg);
                if (!error)
                {
                    broadcast();
                }
            }
            catch (Exception e)
            {
                log(Severiry.ERROR, "Manager[" + manager + "] - " + e.Message);
            }
        }