Esempio n. 1
0
 public Service(int port)
 {
     _port = port;
       _connectionManager = new ConnectionManager(port);
       _clientManager = new ClientManager(_connectionManager);
 }
Esempio n. 2
0
        /// <summary>
        /// 接收客户端发来的信息
        /// </summary>
        /// <param name="obj"></param>
        void ReceMsg(object obj)
        {
            Socket client;

            byte[] mag = new byte[1024 * 1024 * 5];
            int    msgLength;

            while (true)
            {
                client    = obj as Socket;
                msgLength = client.Receive(mag);
                string sqlconn;
                //内存流
                MemoryStream stream = new MemoryStream(mag, 0, msgLength);
                //二进制与Object 类的转换
                BinaryFormatter fomatter = new BinaryFormatter();
                //强制转换并且接收她
                var protocolqq = fomatter.Deserialize(stream) as Protocol.ProtocolQQ;

                switch (protocolqq.mode)
                {
                //用户登录
                case 0:
                    switch (protocolqq.ope)
                    {
                    //验证登录
                    case 0:
                        var userLogin = protocolqq.data as Protocol.UserLogin;
                        //弄错了应该是ID,但是我也并没有很想改转来,所以就不改了。
                        string name = userLogin.Name;
                        string pwd  = userLogin.Pwd;
                        //数据库操作语句
                        sqlconn = "select count(*) from tb_User where ID= '" + name + "'" + "and Pwd = '" + pwd + " '";

                        //新建一个用户登录返回类
                        ReturnLogin IsLogin = new ReturnLogin();
                        //如果num==1则数据库中有该用户
                        int num = DataOperator.ESSql(sqlconn);

                        if (num != 0)
                        {
                            ClientManager.AddClient(name, client);

                            //判断是否重复登录该用户
                            if (ClientManager.reLogin == true)
                            {
                                IsLogin.ResultLogin = false;
                                client.Send(SendMsg(0, 1, IsLogin));
                                //关闭该字
                                string s_1 = "用户:" + client.RemoteEndPoint.ToString() + "下线。" + "\r\n";

                                ShowMsg(s_1);
                                receThread.Abort();
                                while (receThread.ThreadState == ThreadState.Aborted)
                                {
                                    Thread.Sleep(100);
                                }
                                break;
                            }
                            else
                            {
                                IsLogin.ResultLogin = true;
                                User user = new User();
                                user.ID = name;
                                //数据库更新用户记住密码,自动登录操作的操作
                                sqlconn = "update tb_User set Remember = " + userLogin.Remember + ",AutoLogin="******" where ID = '" + name + " '";
                                DataOperator.ENQSql(sqlconn);
                                //访问数据库,得到好友列表

                                List <Friend> friends = new List <Friend>();

                                sqlconn = "select NickName, HeadID,Sign from tb_User where ID='" + name + "'";
                                //查询用户信息和用户好友信息的数据库查询语句
                                SqlDataReader dataReader = DataOperator.GetDataReader(sqlconn);
                                //一直读
                                if (dataReader.Read())
                                {
                                    if (!(dataReader["NickName"] is DBNull))
                                    {
                                        user.NickName = dataReader["NickName"].ToString();
                                    }
                                    user.HeadId = Convert.ToInt32(dataReader["HeadID"]);
                                    user.Sign   = dataReader["Sign"].ToString();
                                }
                                //加载好友的SQL语句
                                sqlconn    = "select FriendID,NickName,HeadID,Flag from tb_User,tb_Friend where tb_Friend.HostID='" + name + "'" + " and tb_User.ID=tb_Friend.FriendID";
                                dataReader = DataOperator.GetDataReader(sqlconn);
                                while (dataReader.Read())
                                {
                                    Friend friend = new Friend();
                                    friend.HeadID = Convert.ToInt32(dataReader["HeadID"]);
                                    //?????
                                    friend.ID       = Convert.ToString(dataReader["FriendID"]);
                                    friend.NickName = dataReader["NickName"].ToString();
                                    friends.Add(friend);
                                }
                                //关闭读取器
                                dataReader.Close();
                                //关闭数据库连接
                                DataOperator.conn.Close();
                                IsLogin.Friends = friends;
                                IsLogin.GetUser = user;
                                client.Send(SendMsg(0, 0, IsLogin));
                            }
                        }
                        else
                        {
                            IsLogin.ResultLogin = false;
                            client.Send(SendMsg(0, 0, IsLogin));
                        }

                        break;

                    //注册用户
                    case 1:
                        //不太对得起我自己---这个只允许注册100个
                        Random rand = new Random();
                        int    v;
                        v = rand.Next(0, 101);
                        var reger = protocolqq.data as Protocol.Regr;
                        reger.ID = Convert.ToString(20000 + v);
                        sqlconn  = "Select ID from tb_User Where ID = '" + reger.ID.Trim() + "'";
                        while (true)
                        {
                            if (DataOperator.ESSql(sqlconn).ToString() != reger.ID)
                            {
                                break;
                            }
                            else
                            {
                                v        = rand.Next(0, 100);
                                reger.ID = Convert.ToString(20000 + v);
                                sqlconn  = "Select ID from tb_User Where ID ='" + reger.ID + "'";
                            }
                        }
                        sqlconn = string.Format("insert into tb_User(ID,Pwd, NickName) values('{0}', '{1}','{2}')", reger.ID.Trim(), reger.PSW, reger.NickName);
                        int num_ = DataOperator.ENQSql(sqlconn);
                        if (num_ == 1)
                        {
                            client.Send(SendMsg(0, 2, reger));
                        }
                        else
                        {
                            reger.ID = "";
                            client.Send(SendMsg(0, 2, reger));
                        }
                        break;

                    //忘记密码---验证账号是否正确
                    case 2:
                        //忘记密码和登录时的协议我们采用一样的
                        var fuser = protocolqq.data as Protocol.UserLogin;

                        string name_ = fuser.Name.Trim();
                        //数据库操作语句
                        sqlconn = "select ID from tb_User where ID= '" + name_ + "'";
                        int num_1 = DataOperator.ESSql(sqlconn);
                        if (num_1 != 0)
                        {
                            client.Send(SendMsg(0, 3, fuser));
                        }
                        else
                        {
                            fuser.Name = "";
                            client.Send(SendMsg(0, 3, fuser));
                        }
                        break;

                    //忘记密码---修改密码
                    case 3:
                        var ffuer = protocolqq.data as UserLogin;
                        //修改密码的数据库语句
                        sqlconn = "update tb_User set Pwd= '" + ffuer.Pwd.Trim() + "'" + "where ID= '" + ffuer.Name + "'";
                        int num_2 = DataOperator.ENQSql(sqlconn);
                        if (num_2 != 0)
                        {
                            client.Send(SendMsg(0, 4, ffuer));
                        }
                        else
                        {
                            ffuer.Name = "";
                            client.Send(SendMsg(0, 4, ffuer));
                        }
                        break;

                    //用户勾选密码
                    case 4:

                        break;
                    }

                    break;

                //用户聊天
                case 1:
                    switch (protocolqq.ope)
                    {
                    //普通聊天
                    case 0:
                        var utu = protocolqq.data as Protocol.UTU;
                        var str = utu.Msg as Str;
                        utu.ReceID = utu.ReceID.Trim();
                        if (ClientManager.CheckingUser(utu.ReceID))
                        {
                            ClientManager.SendMsg(mag, ClientManager.client);
                        }
                        //此处的MessageTypeId为1,表示聊天消息;MessageState为0,表示消息未读

                        //把聊天记录插入数据库
                        sqlconn = string.Format("INSERT INTO tb_Message (FromUserID, ToUserID, Message, MessageTypeID, MessageState,MessageTime) VALUES ('{0}','{1}','{2}',{3},{4},'{5}')",
                                                utu.SendID, utu.ReceID, str.Message, 1, 0, utu.Time);
                        int num = DataOperator.ENQSql(sqlconn);
                        if (num != 1)
                        {
                            //发给客户端
                            MessageBox.Show("用户:" + utu.SendID + "向用户:" + utu.ReceID + "发送消息失败!" + "/r/n");
                        }
                        break;

                    // 发送文件
                    case 1:
                        break;

                    //发送图片
                    case 2:
                        break;

                    //发送抖屏
                    case 3:
                        break;
                    }
                    break;

                //用户离线
                case 3:
                    //关闭套接字且移除用户
                    string s_0 = "用户:" + client.RemoteEndPoint.ToString() + "下线。" + "\r\n";
                    ClientManager.Clear(client);

                    ShowMsg(s_0);
                    receThread.Abort();
                    while (receThread.ThreadState == ThreadState.Aborted)
                    {
                        Thread.Sleep(100);
                    }
                    break;
                }
            }
        }
Esempio n. 3
0
        public void ProcessCommandCallback(object obj)
        {
            int     activeLine  = (int)((ParamObject)obj).Param[0];
            string  command     = (string)((ParamObject)obj).Param[1];
            Command fullCommand = Server.CommandProcessor.ParseCommand(command);
            string  fullArgs    = CommandProcessor.JoinArgs(fullCommand.CommandArgs.ToArray());

            switch (fullCommand.CommandArgs[0].ToLower())
            {
            case "/help": {
                DisplayHelp();
            }
            break;

            case "/clear": {
                mainUI.ClearCommands();
            }
            break;

            case "/global": {
                Messenger.GlobalMsg(fullArgs, Text.White);
                mainUI.AddCommandLine("Global: " + fullArgs);
            }
            break;

            case "/masskick": {
                foreach (Client i in ClientManager.GetClients())
                {
                    if (i.IsPlaying() && Ranks.IsDisallowed(i, Enums.Rank.Moniter))
                    {
                        Messenger.GlobalMsg(i.Player.Name + " has been kicked by the server!", Text.White);
                        Messenger.AlertMsg(i, "You have been kicked by the server!");
                    }
                }
                mainUI.AddCommandLine("Everyone has been kicked.");
            }
            break;

            case "/dumpstats": {
                Statistics.PacketStatistics.DumpStatistics();
                mainUI.AddCommandLine("Packet statistics dumped to database.");
            }
            break;

            case "/clearstats": {
                Statistics.PacketStatistics.ClearStatistics();
                mainUI.AddCommandLine("Packet statistics cleared.");
            }
            break;

            case "/masswarp": {
                if (fullCommand.CommandArgs.Count == 4)
                {
                    int map = fullCommand.CommandArgs[1].ToInt(-1);
                    int x   = fullCommand.CommandArgs[2].ToInt(-1);
                    int y   = fullCommand.CommandArgs[3].ToInt(-1);
                    if (map <= 0)
                    {
                        mainUI.AddCommandLine("Invalid Map.");
                        break;
                    }
                    else if (x == -1)
                    {
                        mainUI.AddCommandLine("Invalid X coordinate.");
                        break;
                    }
                    else if (y == -1)
                    {
                        mainUI.AddCommandLine("Invalid Y coordinate.");
                        break;
                    }
                    // TODO: Mass Warp
                    //if (x > MapManager.Maps[map].MaxX) {
                    //    mainUI.AddCommandLine("Invalid X coordinate.");
                    //    break;
                    //}
                    //if (y > MapManager.Maps[map].MaxY) {
                    //    mainUI.AddCommandLine("Invalid Y coordinate.");
                    //    break;
                    //}
                    foreach (Client i in ClientManager.GetClients())
                    {
                        if (i.IsPlaying() && Ranks.IsDisallowed(i, Enums.Rank.Moniter))
                        {
                            Messenger.GlobalMsg("The server has warped everyone!", Text.White);
                            Messenger.PlayerWarp(i, map, x, y);
                        }
                    }
                    mainUI.AddCommandLine("Everyone has been warped.");
                }
                else
                {
                    mainUI.AddCommandLine("Invalid arguments.");
                }
            }
            break;

            case "/kick": {
                if (fullCommand.CommandArgs.Count == 2)
                {
                    Client client = ClientManager.FindClient(fullCommand.CommandArgs[1]);
                    if (client == null)
                    {
                        mainUI.AddCommandLine("Player is offline.");
                    }
                    else
                    {
                        Messenger.GlobalMsg(client.Player.Name + " has been kicked by the server!", Text.White);
                        Messenger.AlertMsg(client, "You have been kicked by the server!");
                        mainUI.AddCommandLine(client.Player.Name + " has been kicked!");
                    }
                }
                else
                {
                    mainUI.AddCommandLine("Invalid arguments.");
                }
            }
            break;

            case "/warp": {
                if (fullCommand.CommandArgs.Count == 5)
                {
                    Client client = ClientManager.FindClient(fullCommand.CommandArgs[1]);
                    if (client == null)
                    {
                        mainUI.AddCommandLine("Player is offline.");
                    }
                    else
                    {
                        int mapNum = fullCommand.CommandArgs[2].ToInt(-1);
                        int x      = fullCommand.CommandArgs[3].ToInt(-1);
                        int y      = fullCommand.CommandArgs[4].ToInt(-1);
                        if (mapNum <= 0)
                        {
                            mainUI.AddCommandLine("Invalid Map.");
                            break;
                        }
                        else if (x == -1)
                        {
                            mainUI.AddCommandLine("Invalid X coordinate.");
                            break;
                        }
                        else if (y == -1)
                        {
                            mainUI.AddCommandLine("Invalid Y coordinate.");
                            break;
                        }
                        IMap map;
                        if (MapManager.IsMapActive(MapManager.GenerateMapID(mapNum)))
                        {
                            map = MapManager.RetrieveActiveMap(MapManager.GenerateMapID(mapNum));
                        }
                        else
                        {
                            using (Database.DatabaseConnection dbConnection = new Database.DatabaseConnection(Database.DatabaseID.Data)) {
                                map = MapManager.LoadStandardMap(dbConnection, MapManager.GenerateMapID(mapNum));
                            }
                        }
                        if (x > map.MaxX)
                        {
                            mainUI.AddCommandLine("Invalid X coordinate.");
                            break;
                        }
                        if (y > map.MaxY)
                        {
                            mainUI.AddCommandLine("Invalid Y coordinate.");
                            break;
                        }
                        Messenger.PlayerMsg(client, "You have been warped by the server!", Text.White);
                        Messenger.PlayerWarp(client, mapNum, x, y);
                        mainUI.AddCommandLine(client.Player.Name + " has been warped.");
                    }
                }
                else
                {
                    mainUI.AddCommandLine("Invalid arguments.");
                }
            }
            break;

            case "/mapmsg": {
                if (fullCommand.CommandArgs.Count == 3)
                {
                    string map = fullCommand.CommandArgs[1];
                    // Check if the map is active
                    if (!MapManager.IsMapActive(map))
                    {
                        mainUI.AddCommandLine("Invalid Map.");
                        break;
                    }
                    Messenger.MapMsg(map, fullCommand.CommandArgs[2], Text.DarkGrey);
                    mainUI.AddCommandLine("Map Msg (Map " + map.ToString() + "): " + fullCommand.CommandArgs[2]);
                }
                else
                {
                    mainUI.AddCommandLine("Invalid arguments.");
                }
            }
            break;

            case "/reloadscripts": {
                Scripting.ScriptManager.Reload();
                mainUI.AddCommandLine("Scripts reloaded.");
            }
            break;

            case "/players": {
                string players = "";
                int    count   = 0;
                foreach (Client i in ClientManager.GetClients())
                {
                    if (i.IsPlaying())
                    {
                        count++;
                        players += i.Player.Name + "\r\n";
                    }
                }
                mainUI.AddCommandLine("Players online: \r\n" + players);
                mainUI.AddCommandLine("There are " + count.ToString() + " players online");
            }
            break;

            case "/test": {
                //Email.Email.SendEmail("test");
                //mainUI.AddCommandLine("Mail sent!");
                //mainUI.AddCommandLine("There are currently no benchmarking tests");
                //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                //watch.Start();
                //MapGeneralInfo genInfo = MapManager.RetrieveMapGeneralInfo(10);
                //watch.Stop();
                //mainUI.AddCommandLine("Elapsed, New: " + watch.Elapsed.ToString());
                //watch.Reset();
                //watch.Start();
                //Map map = MapManager.LoadMap(10);
                //watch.Stop();
                //mainUI.AddCommandLine("Elapsed, Old: " + watch.Elapsed.ToString());
                //mainUI.AddCommandLine("Name: " + genInfo.Name);
            }
            break;

            case "/finditem": {
                int itemsFound = 0;
                for (int i = 0; i < Server.Items.ItemManager.Items.MaxItems; i++)
                {
                    if (ItemManager.Items[i].Name.ToLower().StartsWith(fullCommand.CommandArgs[1].ToLower()))
                    {
                        mainUI.AddCommandLine(ItemManager.Items[i].Name + "'s number is " + i.ToString());
                        itemsFound++;
                        //return;
                    }
                }
                if (itemsFound == 0)
                {
                    mainUI.AddCommandLine("Unable to find an item that starts with '" + fullCommand.CommandArgs[1] + "'");
                }
            }
            break;

            case "/finditemc": {
                int itemsFound = 0;
                for (int i = 0; i < Server.Items.ItemManager.Items.MaxItems; i++)
                {
                    if (ItemManager.Items[i].Name.ToLower().Contains(fullCommand.CommandArgs[1].ToLower()))
                    {
                        mainUI.AddCommandLine(ItemManager.Items[i].Name + "'s number is " + i.ToString());
                        itemsFound++;
                        //return;
                    }
                }
                if (itemsFound == 0)
                {
                    mainUI.AddCommandLine("Unable to find an item that starts with '" + fullCommand.CommandArgs[1] + "'");
                }
            }
            break;

            case "/calcwm": {
                mainUI.AddCommandLine("Factorial: " + Server.Math.CalculateFactorial(fullCommand.CommandArgs[1].ToInt()).ToString("R"));
            }
            break;

            case "/gmmode": {
                Globals.GMOnly = !Globals.GMOnly;
                mainUI.AddCommandLine("GM Only Mode Active: " + Globals.GMOnly);
            }
            break;

            default: {
                Scripting.ScriptManager.InvokeSub("ProcessServerCommand", mainUI, fullCommand, fullArgs);
            }
            break;
            }
            mainUI.CommandComplete(activeLine, command);
        }
Esempio n. 4
0
        void Authentication(MessageReceivedEventArgs e)
        {
            using (Message message = e.GetMessage() as Message) {
                using (DarkRiftReader reader = message.GetReader()) {
                    var login      = reader.ReadString();
                    var password   = reader.ReadString();
                    var avatarType = reader.ReadUInt16();

                    var authResult = DB.Count("SELECT COUNT(*) FROM users WHERE login = @login AND password = @password", new Dictionary <string, string> {
                        { "@login", login },
                        { "@password", password },
                    });

                    if (authResult > 0)
                    {
                        // Сохраняем данные для нового игрока
                        players[e.Client].Name    = login;
                        players[e.Client].Session = Guid.NewGuid().ToString("n").Substring(0, 20);
                        players[e.Client].Avatar  = avatarType == 0
                            ? AvatarType.Neru
                            : (avatarType == 1 ? AvatarType.Kira : AvatarType.Miku);


                        // Уведомляем всех пользователей о новом игроке
                        using (DarkRiftWriter newPlayerWriter = DarkRiftWriter.Create()) {
                            newPlayerWriter.Write("");
                            newPlayerWriter.Write(players[e.Client].ID);
                            newPlayerWriter.Write(players[e.Client].Name);
                            newPlayerWriter.Write(players[e.Client].Avatar);

                            using (Message newPlayerMessage = Message.Create(Tags.SpawnNewPlayer, newPlayerWriter)) {
                                foreach (IClient client in ClientManager.GetAllClients().Where(x => x != e.Client))
                                {
                                    client.SendMessage(newPlayerMessage, SendMode.Reliable);
                                }
                            }
                        }

                        // Уведомляем нового игрока о удачной авторизации
                        using (DarkRiftWriter playerWriter = DarkRiftWriter.Create()) {
                            playerWriter.Write(players[e.Client].Session);
                            foreach (Player player in players.Values)
                            {
                                playerWriter.Write(player.ID);
                                playerWriter.Write(player.Name);
                                playerWriter.Write(player.Avatar);
                            }

                            using (Message playerMessage = Message.Create(Tags.SpawnCurrentPlayer, playerWriter))
                                e.Client.SendMessage(playerMessage, SendMode.Reliable);
                        }
                    }
                    else
                    {
                        // Уведомляем нового игрока о НЕ удачной авторизации
                        using (DarkRiftWriter playerWriter = DarkRiftWriter.Create()) {
                            playerWriter.Write(players[e.Client].ID);
                            using (Message playerMessage = Message.Create(Tags.AuthorizationFail, playerWriter))
                                e.Client.SendMessage(playerMessage, SendMode.Reliable);
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        private void OnUserAvatarUpdated(User user)
        {
            var avatarNotification = new EntityNotification <Avatar>(user.Avatar, NotificationType.Update);

            ClientManager.SendMessageToClients(avatarNotification);
        }
Esempio n. 6
0
        private void OnUserConnectionUpdated(User user)
        {
            var userNotification = new EntityNotification <ConnectionStatus>(user.ConnectionStatus, NotificationType.Update);

            ClientManager.SendMessageToClients(userNotification);
        }
Esempio n. 7
0
        private void OnUserAdded(object sender, EntityChangedEventArgs <User> e)
        {
            var userNotification = new EntityNotification <User>(e.Entity, NotificationType.Create);

            ClientManager.SendMessageToClients(userNotification);
        }
 public ServerMessageProcessor(ClientManager manager, MayKhach client)
 {
     this.clientManager = manager;
     this.client        = client;
     Response           = new List <MessageBase>();
 }