mirror of
https://github.com/nsnail/dot.git
synced 2025-08-03 02:18:00 +08:00
refactor: ♻️ 2.0 (#13)
This commit is contained in:
66
src/backend/Dot/Pwd/Main.cs
Normal file
66
src/backend/Dot/Pwd/Main.cs
Normal file
@ -0,0 +1,66 @@
|
||||
// ReSharper disable ClassNeverInstantiated.Global
|
||||
|
||||
using NSExt.Extensions;
|
||||
#if NET8_0_WINDOWS
|
||||
using TextCopy;
|
||||
#endif
|
||||
|
||||
namespace Dot.Pwd;
|
||||
|
||||
[Description(nameof(Ln.随机密码生成器))]
|
||||
[Localization(typeof(Ln))]
|
||||
internal sealed class Main : ToolBase<Option>
|
||||
{
|
||||
private readonly char[][] _charTable = {
|
||||
"0123456789".ToCharArray() //
|
||||
, "abcdefghijklmnopqrstuvwxyz".ToCharArray()
|
||||
, "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()
|
||||
, "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~".ToCharArray()
|
||||
};
|
||||
|
||||
protected override Task CoreAsync()
|
||||
{
|
||||
unsafe {
|
||||
var pSource = stackalloc char[_charTable.Sum(x => x.Length)];
|
||||
var pDest = stackalloc char[Opt.Length];
|
||||
var sourceLen = 0;
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.Number)) {
|
||||
foreach (var c in _charTable[0]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.LowerCaseLetter)) {
|
||||
foreach (var c in _charTable[1]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.UpperCaseLetter)) {
|
||||
foreach (var c in _charTable[2]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (Opt.Type.HasFlag(Option.GenerateTypes.SpecialCharacter)) {
|
||||
foreach (var c in _charTable[3]) {
|
||||
*(pSource + sourceLen++) = c;
|
||||
}
|
||||
}
|
||||
|
||||
var randScope = new[] { 0, sourceLen };
|
||||
for (var i = 0; i != Opt.Length; ++i) {
|
||||
*(pDest + i) = *(pSource + randScope.Rand());
|
||||
}
|
||||
|
||||
var result = new string(pDest, 0, Opt.Length);
|
||||
Console.WriteLine($"{Ln.已复制到剪贴板}: {result}");
|
||||
#if NET8_0_WINDOWS
|
||||
ClipboardService.SetText(result);
|
||||
#endif
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
27
src/backend/Dot/Pwd/Option.cs
Normal file
27
src/backend/Dot/Pwd/Option.cs
Normal file
@ -0,0 +1,27 @@
|
||||
// ReSharper disable ClassNeverInstantiated.Global
|
||||
// ReSharper disable UnusedAutoPropertyAccessor.Global
|
||||
|
||||
namespace Dot.Pwd;
|
||||
|
||||
internal sealed class Option : OptionBase
|
||||
{
|
||||
[Flags]
|
||||
public enum GenerateTypes
|
||||
{
|
||||
None = 0
|
||||
, Number = 1
|
||||
, LowerCaseLetter = 1 << 1
|
||||
, UpperCaseLetter = 1 << 2
|
||||
, SpecialCharacter = 1 << 3
|
||||
}
|
||||
|
||||
[CommandArgument(1, "<PASSWORD LENGTH>")]
|
||||
[Description(nameof(Ln.密码长度))]
|
||||
[Localization(typeof(Ln))]
|
||||
public int Length { get; set; }
|
||||
|
||||
[CommandArgument(0, "<GENERATE TYPE>")]
|
||||
[Description(nameof(Ln.密码创建类型))]
|
||||
[Localization(typeof(Ln))]
|
||||
public GenerateTypes Type { get; set; }
|
||||
}
|
Reference in New Issue
Block a user