예제 #1
0
        internal bool _EmitPlayerPreJoin(object user)
        {
            if (user == null || !(user is User castedUser))
            {
                return(false);
            }

            EcoPlayer ecoPlayer = playerManager?.InternalPlayersList.FirstOrDefault(x => x.Id.Equals(castedUser.SlgId) || x.Id.Equals(castedUser.SteamId));

            if (ecoPlayer == null)
            {
                ecoPlayer = new EcoPlayer(castedUser, playerManager, runtime.Container);
                playerManager?.InternalPlayersList.Add(ecoPlayer);
            }
            else if (ecoPlayer.InternalEcoUser == null)
            {
                ecoPlayer.BuildReference(castedUser);
            }

            logger.LogDebug($"Emitting PlayerPreConnectEvent [{ecoPlayer.Id}]");
            PlayerPreConnectEvent e = new PlayerPreConnectEvent(ecoPlayer);

            eventManager.Emit(this, e);

            if (!e.IsCancelled)
            {
                return(true);
            }

            logger.LogInformation($"[{ecoPlayer.Id}] {ecoPlayer.Name} was prevent from joining for the reason: " + (e.RejectionReason ?? "No reason was supplied."));
            ecoPlayer.InternalEcoPlayer.Client.Disconnect("You have been prevented from joining.", e.RejectionReason ?? "No reason was supplied.");
            return(false);
        }
예제 #2
0
        /// <inheritdoc />
        public void Execute(ICommandContext context)
        {
            if (context.Parameters.Length == 0)
            {
                throw new CommandWrongUsageException();
            }

            IPlayerManager playerManager = context.Container.Resolve <IPlayerManager>("eco");

            if (!playerManager.TryGetOnlinePlayer(context.Parameters[0], out IPlayer player))
            {
                context.User.SendMessage("The requested user needs to be online.");
                return;
            }

            EcoPlayer ecoPlayer = (EcoPlayer)player;

            if (ecoPlayer.UserIdType == UserIdType.Both)
            {
                UserManager.Config.Admins.Add(ecoPlayer.InternalEcoUser.SteamId);
            }

            UserManager.Config.Admins.Add(player.Id);
            UserManager.Obj.SaveConfig();

            context.Container.Resolve <ILogger>().LogInformation($"{context.User.Name} has granted {player.Name} administrator permissions.");

            context.User.SendMessage("The requested user has been made an administrator.");
            ((EcoPlayer)player).User.SendMessage("You have been granted administrator permissions.");
        }
예제 #3
0
        internal void _EmitPlayerLeave(object player)
        {
            if (player == null || !(player is User castedUser))
            {
                return;
            }

            EcoPlayer ecoPlayer = playerManager?.InternalPlayersList.FirstOrDefault(x => x.Id.Equals(castedUser.SteamId));

            if (ecoPlayer == null)
            {
                logger.LogWarning("An unknown player has left the game. Please report this to a Rocket.Eco developer!");
                return;
            }

            logger.LogDebug($"Emitting UserDisconnectedEvent [{ecoPlayer.Id}]");
            eventManager.Emit(this, new UserDisconnectedEvent(ecoPlayer.User, null, EventExecutionTargetContext.NextFrame));

            logger.LogInformation($"[{ecoPlayer.Id}] {ecoPlayer.Name} has left.");
        }
예제 #4
0
        internal void _EmitPlayerJoin(object user)
        {
            if (user == null || !(user is User castedUser))
            {
                return;
            }

            EcoPlayer ecoPlayer = playerManager?.InternalPlayersList.FirstOrDefault(x => x.Id.Equals(castedUser.SlgId) || x.Id.Equals(castedUser.SteamId));

            IConfigurationSection configurationSection = permissionProvider.PlayersConfig["EcoUser"];

            List <PlayerPermissionSection> playerPermissions = configurationSection.Get <PlayerPermissionSection[]>().ToList();

            if (playerPermissions.FirstOrDefault(x => x.Id.Equals(ecoPlayer.Id)) == null)
            {
                IEnumerable <GroupPermissionSection> autoGroups = permissionProvider.GroupsConfig["Groups"].Get <GroupPermissionSection[]>().Where(x => x.AutoAssign);

                PlayerPermissionSection section = new PlayerPermissionSection
                {
                    Id          = ecoPlayer.Id,
                    Permissions = new string[0],
                    Groups      = autoGroups.Select(x => x.Id).ToArray()
                };

                playerPermissions.Add(section);

                configurationSection.Set(playerPermissions);

                permissionProvider.PlayersConfig.Save();
            }

            logger.LogDebug($"Emitting UserConnectedEvent [{ecoPlayer.Id}]");
            eventManager.Emit(this, new UserConnectedEvent(ecoPlayer.User, EventExecutionTargetContext.NextFrame));

            logger.LogInformation($"[{ecoPlayer.Id}] {ecoPlayer.Name} has joined.");
        }
예제 #5
0
        internal bool _EmitPlayerChat(object user, string text)
        {
            if (user == null || !(user is User castedUser) || !castedUser.LoggedIn)
            {
                return(true);
            }

            EcoPlayer ecoPlayer = (EcoPlayer)playerManager.GetOnlinePlayerById(castedUser.SteamId);

            if (ecoPlayer == null)
            {
                logger.LogWarning("An unknown player has chatted. Please report this to a Rocket.Eco developer!");
                return(false);
            }

            if (text.StartsWith("/", StringComparison.InvariantCulture))
            {
                logger.LogDebug($"Emitting PreCommandExecutionEvent [{ecoPlayer.Id}, {text}]");
                PreCommandExecutionEvent commandEvent = new PreCommandExecutionEvent(ecoPlayer.User, text.Remove(0, 1));
                eventManager.Emit(this, commandEvent);

                if (commandEvent.IsCancelled)
                {
                    ecoPlayer.SendErrorMessage("Execution of your command has been cancelled!");

                    return(true);
                }

                taskScheduler
                .ScheduleNextFrame(this, () =>
                {
                    bool wasHandled = true;

                    try
                    {
                        wasHandled = commandHandler.HandleCommand(ecoPlayer.User, text.Remove(0, 1), string.Empty);
                    }
                    catch (NotEnoughPermissionsException)
                    {
                        ecoPlayer.SendErrorMessage("You do not have enough permission to execute this command!");
                    }
                    catch (Exception e)
                    {
                        logger.LogError($"{ecoPlayer.Name} failed to execute the command `{text.Remove(0, 1).Split(' ')[0]}`!");
                        logger.LogError($"{e.Message}\n{e.StackTrace}");

                        ecoPlayer.SendErrorMessage("A runtime error occurred while executing this command, please contact an administrator!");

                        return;
                    }

                    if (!wasHandled)
                    {
                        ecoPlayer.SendErrorMessage("That command could not be found!");
                    }
                }, "Player Chat Event");

                return(true);
            }

            logger.LogDebug($"Emitting UserChatEvent [{ecoPlayer.Id}, {text}]");
            UserChatEvent chatEvent = new UserChatEvent(ecoPlayer.User, text)
            {
                IsCancelled = false
            };

            eventManager.Emit(this, chatEvent);

            string commandCancelled = chatEvent.IsCancelled ? "[CANCELLED] " : "";

            logger.LogInformation($"{commandCancelled}[{ecoPlayer.Id}] {ecoPlayer.Name}: {text}");

            return(chatEvent.IsCancelled);
        }