示例#1
0
        public void HandleAdminMessage(NetMessage adminMsgType, NetIncomingMessage messageBody)
        {
            switch (adminMsgType)
            {
            case NetMessage.RequestEntityDeletion:
                int entId = messageBody.ReadInt32();
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin || true)
                //TEMPORARY. REMOVE THE 'TRUE' LATER ON. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                {
                    Entity delEnt = EntityManager.GetEntity(entId);
                    if (delEnt != null)
                    {
                        EntityManager.DeleteEntity(delEnt);
                    }
                }
                break;

            case NetMessage.RequestAdminLogin:
                string password = messageBody.ReadString();
                if (password == IoCManager.Resolve <IServerConfigurationManager>().AdminPassword)
                {
                    LogManager.Log("Admin login: "******"Failed Admin login: "******" -> ' " + password + " '");
                }
                break;

            case NetMessage.RequestAdminPlayerlist:
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin)
                {
                    NetOutgoingMessage adminPlayerListMessage = IoCManager.Resolve <ISS14NetServer>().CreateMessage();
                    adminPlayerListMessage.Write((byte)NetMessage.RequestAdminPlayerlist);
                    adminPlayerListMessage.Write((byte)ClientList.Count);
                    foreach (
                        IPlayerSession plrSession in
                        ClientList.Keys.Select(
                            conn => IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(conn)))
                    {
                        adminPlayerListMessage.Write(plrSession.name);
                        adminPlayerListMessage.Write((byte)plrSession.status);
                        adminPlayerListMessage.Write(plrSession.assignedJob.Name);
                        adminPlayerListMessage.Write(plrSession.connectedClient.RemoteEndPoint.Address.ToString());
                        adminPlayerListMessage.Write(plrSession.adminPermissions.isAdmin);
                    }
                    IoCManager.Resolve <ISS14NetServer>().SendMessage(adminPlayerListMessage,
                                                                      messageBody.SenderConnection,
                                                                      NetDeliveryMethod.ReliableOrdered);
                }
                else
                {
                    NetOutgoingMessage loginMessage = IoCManager.Resolve <ISS14NetServer>().CreateMessage();
                    loginMessage.Write((byte)NetMessage.RequestAdminLogin);
                    IoCManager.Resolve <ISS14NetServer>().SendMessage(loginMessage, messageBody.SenderConnection,
                                                                      NetDeliveryMethod.ReliableOrdered);
                }
                break;

            case NetMessage.RequestAdminKick:
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin)
                {
                    string         ipKick      = messageBody.ReadString();
                    IPlayerSession kickSession = IoCManager.Resolve <IPlayerManager>().GetSessionByIp(ipKick);
                    if (kickSession != null)
                    {
                        IoCManager.Resolve <IPlayerManager>().EndSession(kickSession.connectedClient);
                        kickSession.connectedClient.Disconnect("Kicked by Administrator.");
                    }
                }
                break;

            case NetMessage.RequestAdminBan:
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin)
                {
                    string         ipBan      = messageBody.ReadString();
                    IPlayerSession banSession = IoCManager.Resolve <IPlayerManager>().GetSessionByIp(ipBan);
                    if (banSession != null)
                    {
                        if (BanlistMgr.Singleton.IsBanned(ipBan))
                        {
                            return;
                        }
                        BanlistMgr.Singleton.AddBan(ipBan, "No reason specified.");
                        IoCManager.Resolve <IPlayerManager>().EndSession(banSession.connectedClient);
                        banSession.connectedClient.Disconnect("Banned by Administrator.");
                    }
                }
                break;

            case NetMessage.RequestBanList:
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin)
                {
                    NetOutgoingMessage banListMessage = IoCManager.Resolve <ISS14NetServer>().CreateMessage();
                    banListMessage.Write((byte)NetMessage.RequestBanList);
                    banListMessage.Write(BanlistMgr.Singleton.banlist.List.Count);
                    foreach (BanEntry t in BanlistMgr.Singleton.banlist.List)
                    {
                        banListMessage.Write(t.ip);
                        banListMessage.Write(t.reason);
                        banListMessage.Write(t.tempBan);
                        int      compare     = t.expiresAt.CompareTo(DateTime.Now);
                        TimeSpan timeLeft    = compare < 0 ? new TimeSpan(0) : t.expiresAt.Subtract(DateTime.Now);
                        var      minutesLeft = (uint)Math.Truncate(timeLeft.TotalMinutes);
                        banListMessage.Write(minutesLeft);
                    }
                    IoCManager.Resolve <ISS14NetServer>().SendMessage(banListMessage, messageBody.SenderConnection,
                                                                      NetDeliveryMethod.ReliableOrdered);
                }
                break;

            case NetMessage.RequestAdminUnBan:
                if (
                    IoCManager.Resolve <IPlayerManager>().GetSessionByConnection(messageBody.SenderConnection).
                    adminPermissions.isAdmin)
                {
                    string ip = messageBody.ReadString();
                    BanlistMgr.Singleton.RemoveBanByIp(ip);
                }
                break;
            }
        }