Esempio n. 1
0
        public async Task CreateWithPassword(string password)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            await CreateWithNameAndPassword(ply.Name, password);
        }
Esempio n. 2
0
        public async Task CreateWithNameAndPassword(string username, string password)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            if (!SessionUtilities.AcquireSession(ply, out var session))
            {
                return;
            }

            if (session.TryGetAccount(out var accref))
            {
                ply.SendErrorMessage($"You are already logged in!");
                accref.Dispose();
                return;
            }

            //TODO: Determine if this brings any benefit when uncommented.

            //var (findresult, xrefn) = await AccountUtilities.TryFindAccount(username);

            //if (findresult == FindAccountResult.Found)
            //{
            //    ply.SendErrorMessage($"This account is already registered.");
            //    xrefn.Dispose();
            //    return;
            //}

            //The above attempts to short-circuit when an account is verifiably present in memory.
            //A creation attempt will confirm whether or not the account exists in storage.

            (AccountCreateResult result, ObjectReference <Account> refn) = await AccountantPlugin.Instance.Accounts.CreateAccount(username, password);

            switch (result)
            {
            case AccountCreateResult.Success:
                session.Account = refn;
                ply.SendSuccessMessage($"The account {username} was successfully created, and you have been logged in.");
                break;

            case AccountCreateResult.AlreadyExists:
                ply.SendErrorMessage($"This account is already registered.");
                break;

            case AccountCreateResult.PluginBlocked:
                ply.SendErrorMessage($"Account creation denied by another plugin.");
                break;

            case AccountCreateResult.StorageError:
                ply.SendErrorMessage($"Account creation failed due to a database error. Try again later.");
                break;
            }
        }
Esempio n. 3
0
        public async Task LoginWithPassword(string password)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            if (!SessionUtilities.AcquireSession(ply, out var session))
            {
                return;
            }

            if (session.TryGetAccount(out var accref))
            {
                ply.SendErrorMessage($"You are already logged in!");
                accref.Dispose();
                return;
            }

            var(result, refn) = await AccountUtilities.TryFindAccount(ply.Name);

            if (result != FindAccountResult.Found)
            {
                switch (result)
                {
                case FindAccountResult.NotFound:
                    ply.SendErrorMessage($"This account currently is not registered. Please use /register in order to claim it.");
                    break;

                case FindAccountResult.Error:
                    ply.SendErrorMessage("An internal server has occured while looking up this account.");
                    break;
                }
                return;
            }

            Account acc = refn.Object;

            //TODO: Put on another thread.
            if (!BCrypt.Net.BCrypt.EnhancedVerify(password, acc.Password))
            {
                ply.SendErrorMessage("The password you provided is invalid.");
                refn.Dispose();
                return;
            }
            else
            {
                await ply.TryPerformLogon(refn);
            }
        }
        public async Task ChangePassword(string old_password, string new_password, string new_password_confirm)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            if (!SessionUtilities.AcquireSession(ply, out var session))
            {
                return;
            }

            if (!session.TryGetAccount(out var accountref))
            {
                ply.SendErrorMessage($"You must be logged in to change an account's password.");
                return;
            }

            using (accountref)
            {
                if (new_password != new_password_confirm)
                {
                    ply.SendErrorMessage($"The new password and the confirmation password must be the same.");
                    return;
                }

                Account account = accountref.Object;

                if (!BCrypt.Net.BCrypt.EnhancedVerify(old_password, account.Password))
                {
                    ply.SendErrorMessage($"The current password you specified is incorrect.");
                    return;
                }

                var hash = BCrypt.Net.BCrypt.EnhancedHashPassword(new_password);

                account.Password = hash;

                if (await account.Save())
                {
                    ply.SendSuccessMessage($"Your account's password has been successfully updated.");
                }
                else
                {
                    ply.SendErrorMessage($"Your account's password was not updated due to a server error. Please try again.");
                }
            }
        }
Esempio n. 5
0
        public void RespawnSelf()
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out var ply) || !Assert_PlayerDead(Sender, ply))
            {
                return;
            }

            ply.Respawn();

            var infocol  = EssentialsPlugin.Server.Colors.Info;
            var emphasis = EssentialsPlugin.Server.Colors.TargetEmphasis;

            ply.SendFormattedMessage($"You respawned {emphasis}yourself{infocol}.", infocol);

            EssentialsPlugin.Server.Commands.LogCommandActivity(Sender, $"Respawned self.");
        }
Esempio n. 6
0
            public void SelfToPos(int x, int y)
            {
                if (!EntityAssertions.Assert_SenderTeleportable(Sender, out var itp))
                {
                    return;
                }

                itp.TeleportToTile(x, y);

                var infocol  = EssentialsPlugin.Server.Colors.Info;
                var emphasis = EssentialsPlugin.Server.Colors.TargetEmphasis;

                Sender.SendFormattedMessage($"You have been teleported to {emphasis}{x}, {y}{infocol}.", infocol);

                EssentialsPlugin.Server.Commands.LogCommandActivity(Sender, $"Teleported to {x}, {y}.");
            }
Esempio n. 7
0
        public void ToggleSelf()
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out var ply))
            {
                return;
            }

            var new_state = ply.Godmode = !ply.Godmode;

            var infocol   = EssentialsPlugin.Server.Colors.Info;
            var palegreen = EssentialsPlugin.Server.Colors.SuccessPale;
            var palered   = EssentialsPlugin.Server.Colors.ErrorPale;

            Sender.SendFormattedMessage($"Godmode is now {(new_state ? (FormattableString)$"{palegreen}enabled{infocol}" : (FormattableString)$"{palered}disabled{infocol}")}.", infocol);

            EssentialsPlugin.Server.Commands.LogCommandActivity(Sender, $"{(new_state ? "Enabled" : "Disabled")} godmode.");
        }
Esempio n. 8
0
        public void SpawnItem([ItemID] int item_id, int stack = 1, byte prefix = 0)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out var ply))
            {
                return;
            }

            Terraria.Item.NewItem(new EntitySource_DebugCommand(), ply.Handle.position, Vector2.Zero, item_id, stack, false, prefix, true, false);

            var infocol  = EssentialsPlugin.Server.Colors.Info;
            var emphasis = EssentialsPlugin.Server.Colors.TargetEmphasis;

            string item_name = Lang.GetItemNameValue(item_id);

            Sender.SendFormattedMessage($"Spawned {emphasis}{stack}{infocol} of {emphasis}{item_name}{infocol}.", infocol);

            EssentialsPlugin.Server.Commands.LogCommandActivity(Sender, $"Gave self {stack} of {item_name}.");
        }
Esempio n. 9
0
        public void Spawn([NPCID(aliases: true)] int npc_id, int amount = 1, bool on_self = false)
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out var ply))
            {
                return;
            }

            amount = Math.Min(amount, Main.maxNPCs);

            if (PreSpawnActions.TryGetValue(npc_id, out var pre_deleg))
            {
                pre_deleg();
            }

            if (SpecialBindings.TryGetValue(npc_id, out var deleg))
            {
                deleg(ply, amount, on_self);
            }
            else
            {
                for (int i = 0; i < amount; i++)
                {
                    if (on_self)
                    {
                        Terraria.NPC.NewNPC(new EntitySource_DebugCommand(), (int)ply.Position.X, (int)ply.Position.Y, npc_id);
                    }
                    else
                    {
                        (int x, int y) = TileUtils.GetRandomClearTile((int)ply.Position.X / 16, (int)ply.Position.Y / 16, 100, 50);
                        Terraria.NPC.NewNPC(new EntitySource_DebugCommand(), x * 16, y * 16, npc_id);
                    }
                }

                var infocol  = EssentialsPlugin.Server.Colors.Info;
                var emphasis = EssentialsPlugin.Server.Colors.TargetEmphasis;

                var npc_name = Lang.GetNPCNameValue(npc_id);

                ply.SendFormattedMessage($"Spawned {emphasis}{amount}{infocol} of {emphasis}{npc_name}{infocol}.", infocol);

                EssentialsPlugin.Server.Commands.LogCommandActivity(Sender, $"Spawned {amount} of {npc_name}.");
            }
        }
Esempio n. 10
0
        public void Logout()
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            if (!SessionUtilities.AcquireSession(ply, out var session))
            {
                return;
            }

            if (ply.Signout())
            {
                ply.SendSuccessMessage("You have been succesfully logged out.");
            }
            else
            {
                ply.SendErrorMessage("You are not logged in!");
            }
        }
Esempio n. 11
0
        public async Task LoginWithUUID()
        {
            if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply))
            {
                return;
            }

            if (!SessionUtilities.AcquireSession(ply, out var session))
            {
                return;
            }

            if (session.TryGetAccount(out var accref))
            {
                ply.SendErrorMessage($"You are already logged in!");
                accref.Dispose();
                return;
            }

            if (!AccountantPlugin.Instance.Configuration.AllowUUIDSignin)
            {
                ply.SendErrorMessage("Logging in with UUID is disabled in this server. Please use the /login <password> or /login <username> <password> syntax.");
                return;
            }

            var uuid = ply.UUID;

            if (uuid == null || !Guid.TryParse(uuid, out var guid))
            {
                ply.SendErrorMessage("Cannot log you in due to an invalid UUID.");
                return;
            }

            //Ensure the UUID is correctly formatted.
            uuid = guid.ToString();

            var(result, refn) = await AccountUtilities.TryFindAccount(ply.Name);

            if (result != FindAccountResult.Found)
            {
                switch (result)
                {
                case FindAccountResult.NotFound:
                    ply.SendErrorMessage($"This account currently is not registered. Please use /register in order to claim it.");
                    break;

                case FindAccountResult.Error:
                    ply.SendErrorMessage("An internal server has occured while looking up this account.");
                    break;
                }
                return;
            }

            Account acc = refn.Object;

            if (!acc.TryGetMetadata <AccountAutoLogins>(Account.AutoLoginMetaKey, out var aal) || !aal.Enabled)
            {
                ply.SendErrorMessage($"This account cannot be automatically logged into.");
                refn.Dispose();
                return;
            }

            if (!aal.UUIDs.Contains(uuid))
            {
                ply.SendErrorMessage($"You must log into this account with a password from this computer at least once to gain auto-login ability.");
                refn.Dispose();
                return;
            }

            await ply.TryPerformLogon(refn);
        }