public async Task CreateWithPassword(string password) { if (!EntityAssertions.Assert_SenderPlayer(Sender, out Player ply)) { return; } await CreateWithNameAndPassword(ply.Name, password); }
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; } }
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."); } } }
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."); }
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}."); }
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."); }
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}."); }
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}."); } }
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!"); } }
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); }