Compare commits
2 Commits
6102da7266
...
09-29-a
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a2492f14b | |||
| 55aa7db97e |
23
.vscode/launch.json
vendored
23
.vscode/launch.json
vendored
@ -11,6 +11,29 @@
|
||||
"preLaunchTask": "Build",
|
||||
"program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/File-Folder-Helper.dll",
|
||||
"args": [
|
||||
"s",
|
||||
"X",
|
||||
"X:/Production/Logs/EAF-Warn-Error-002-014-004~X:/Production/Logs/EAF-Info-Warn-002-059-000~X:/Production/Logs/EAF-Info-Warn-002-060-000~X:/Production/Logs/EAF-Info-Warn-002-061-001",
|
||||
"Day-Helper-2025-09-26",
|
||||
"EAF_INFO*.lo*~EAF_WARN*.lo*",
|
||||
"S1F4 W-Bit",
|
||||
"yyyy-MM-dd HH:mm:ss,fff",
|
||||
"0",
|
||||
"10",
|
||||
"EAF_INFO*.lo*~EAF_WARN*.lo*",
|
||||
"DF_Error*.lo*~DF_Notification*.lo*~DF_Unit*.lo*",
|
||||
"2025-*.log",
|
||||
"X:/Production/Logs/EAF-Warn-Error-002-014-004~X:/Production/Logs/EAF-Info-Warn-002-059-000~X:/Production/Logs/EAF-Info-Warn-002-060-000~X:/Production/Logs/EAF-Info-Warn-002-061-001",
|
||||
"X:/Production/Logs/EDA_004_016_001~X:/Production/Logs/EDA_004_021_000",
|
||||
"s",
|
||||
"X",
|
||||
"A:/6-Other-Large-Z/Linux-Ubuntu-Affirm/etc/nginx/include~B:/6-Other-Large-Z/Linux-Ubuntu-BCHS/etc/nginx/include~J:/6-Other-Large-Z/Linux-Ubuntu-JMLC/etc/nginx/include~P:/6-Other-Large-Z/Linux-Ubuntu-Phares/etc/nginx/include",
|
||||
"Day-Helper-2025-09-08",
|
||||
"*.conf",
|
||||
"/etc/nginx/include/",
|
||||
"server_name",
|
||||
"proxy_pass~root",
|
||||
"oauth2",
|
||||
"s",
|
||||
"X",
|
||||
"P:/6-Other-Large-Z/Current-Results/A2)People/c9dbce3b/([])/File-Folder-Helper/638443643487798783/638443643487798783",
|
||||
|
||||
@ -235,12 +235,15 @@ internal static partial class Helper20250407 {
|
||||
|
||||
private static Review? GetJsonResponse(ILogger<Worker> logger, string fileName, string rootUniformResourceLocator, string format, TimeZoneInfo timeZoneInfo) {
|
||||
Review? result;
|
||||
string url;
|
||||
Task<string> response;
|
||||
HttpClient httpClient = new();
|
||||
Task<HttpResponseMessage> httpResponseMessage;
|
||||
string url = new(rootUniformResourceLocator.EndsWith('/') ?
|
||||
$"{rootUniformResourceLocator[..^1]}/{fileName}" :
|
||||
$"{rootUniformResourceLocator}/{fileName}");
|
||||
if (rootUniformResourceLocator.EndsWith('/')) {
|
||||
url = new($"{rootUniformResourceLocator[..^1]}/{fileName}");
|
||||
} else {
|
||||
url = new($"{rootUniformResourceLocator}/{fileName}");
|
||||
}
|
||||
httpResponseMessage = httpClient.GetAsync(rootUniformResourceLocator);
|
||||
httpResponseMessage.Wait();
|
||||
if (!httpResponseMessage.Result.IsSuccessStatusCode) {
|
||||
@ -266,9 +269,11 @@ internal static partial class Helper20250407 {
|
||||
} else {
|
||||
response = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
||||
response.Wait();
|
||||
result = string.IsNullOrEmpty(response.Result) ?
|
||||
null :
|
||||
JsonSerializer.Deserialize(response.Result, ReviewCommonSourceGenerationContext.Default.Review);
|
||||
if (string.IsNullOrEmpty(response.Result)) {
|
||||
result = null;
|
||||
} else {
|
||||
result = JsonSerializer.Deserialize(response.Result, ReviewCommonSourceGenerationContext.Default.Review);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -217,10 +217,12 @@ internal static partial class Helper20250519 {
|
||||
File.WriteAllText(args[2], "{}");
|
||||
}
|
||||
string? json = !args[2].EndsWith("input.json") ? null : File.ReadAllText(args[2]);
|
||||
Input input = string.IsNullOrEmpty(json)
|
||||
? Input.Get(args)
|
||||
: JsonSerializer.Deserialize(json, Helper20250519Input.Default.Input)
|
||||
?? throw new Exception();
|
||||
Input input;
|
||||
if (string.IsNullOrEmpty(json)) {
|
||||
input = Input.Get(args);
|
||||
} else {
|
||||
input = JsonSerializer.Deserialize(json, Helper20250519Input.Default.Input) ?? throw new Exception();
|
||||
}
|
||||
Logic? logic = input.Segments.Length != 6 ? null : Logic.Get(input.Segments);
|
||||
if (logic is null || input.BaseAddresses.Length == 0) {
|
||||
logger.LogInformation($"Invalid input!{Environment.NewLine}{input}");
|
||||
|
||||
296
ADO2025/PI7/.editorconfig
Normal file
296
ADO2025/PI7/.editorconfig
Normal file
@ -0,0 +1,296 @@
|
||||
[*.md]
|
||||
end_of_line = crlf
|
||||
file_header_template = unset
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
insert_final_newline = false
|
||||
root = true
|
||||
tab_width = 2
|
||||
[*.csproj]
|
||||
end_of_line = crlf
|
||||
file_header_template = unset
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
insert_final_newline = false
|
||||
root = true
|
||||
tab_width = 2
|
||||
[*.cs]
|
||||
csharp_indent_block_contents = true
|
||||
csharp_indent_braces = false
|
||||
csharp_indent_case_contents = true
|
||||
csharp_indent_case_contents_when_block = true
|
||||
csharp_indent_labels = one_less_than_current
|
||||
csharp_indent_switch_labels = true
|
||||
csharp_new_line_before_catch = false
|
||||
csharp_new_line_before_else = false
|
||||
csharp_new_line_before_finally = false
|
||||
csharp_new_line_before_members_in_anonymous_types = true
|
||||
csharp_new_line_before_members_in_object_initializers = true
|
||||
csharp_new_line_before_open_brace = none
|
||||
csharp_new_line_between_query_expression_clauses = true
|
||||
csharp_prefer_braces = true
|
||||
csharp_prefer_qualified_reference = true:error
|
||||
csharp_prefer_simple_default_expression = true:warning
|
||||
csharp_prefer_simple_using_statement = true:warning
|
||||
csharp_prefer_static_local_function = true:warning
|
||||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
|
||||
csharp_preserve_single_line_blocks = true
|
||||
csharp_preserve_single_line_statements = false
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_after_comma = true
|
||||
csharp_space_after_dot = false
|
||||
csharp_space_after_keywords_in_control_flow_statements = true
|
||||
csharp_space_after_semicolon_in_for_statement = true
|
||||
csharp_space_around_binary_operators = before_and_after
|
||||
csharp_space_around_declaration_statements = false
|
||||
csharp_space_before_colon_in_inheritance_clause = true
|
||||
csharp_space_before_comma = false
|
||||
csharp_space_before_dot = false
|
||||
csharp_space_before_open_square_brackets = false
|
||||
csharp_space_before_semicolon_in_for_statement = false
|
||||
csharp_space_between_empty_square_brackets = false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||
csharp_space_between_parentheses = false
|
||||
csharp_space_between_square_brackets = false
|
||||
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
|
||||
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
|
||||
csharp_style_allow_embedded_statements_on_same_line_experimental = true
|
||||
csharp_style_conditional_delegate_call = true
|
||||
csharp_style_deconstructed_variable_declaration = false
|
||||
csharp_style_expression_bodied_accessors = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_constructors = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_indexers = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_lambdas = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_local_functions = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_methods = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_operators = when_on_single_line:warning
|
||||
csharp_style_expression_bodied_properties = when_on_single_line:warning
|
||||
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
|
||||
csharp_style_inlined_variable_declaration = false
|
||||
csharp_style_namespace_declarations = file_scoped:warning
|
||||
csharp_style_pattern_local_over_anonymous_function = true:warning
|
||||
csharp_style_pattern_matching_over_as_with_null_check = true:warning
|
||||
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
|
||||
csharp_style_prefer_index_operator = true:warning
|
||||
csharp_style_prefer_not_pattern = true:warning
|
||||
csharp_style_prefer_null_check_over_type_check = true
|
||||
csharp_style_prefer_pattern_matching = true:warning
|
||||
csharp_style_prefer_range_operator = true:warning
|
||||
csharp_style_prefer_switch_expression = true:warning
|
||||
csharp_style_throw_expression = true
|
||||
csharp_style_unused_value_assignment_preference = discard_variable:warning
|
||||
csharp_style_unused_value_expression_statement_preference = discard_variable:warning
|
||||
csharp_style_var_elsewhere = false:warning
|
||||
csharp_style_var_for_built_in_types = false:warning
|
||||
csharp_style_var_when_type_is_apparent = false:warning
|
||||
csharp_using_directive_placement = outside_namespace
|
||||
dotnet_analyzer_diagnostic.category-Design.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Documentation.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Globalization.severity = none
|
||||
dotnet_analyzer_diagnostic.category-Interoperability.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Maintainability.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Naming.severity = none
|
||||
dotnet_analyzer_diagnostic.category-Performance.severity = none
|
||||
dotnet_analyzer_diagnostic.category-Reliability.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Security.severity = error
|
||||
dotnet_analyzer_diagnostic.category-SingleFile.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Style.severity = error
|
||||
dotnet_analyzer_diagnostic.category-Usage.severity = error
|
||||
dotnet_code_quality_unused_parameters = all
|
||||
dotnet_code_quality_unused_parameters = non_public
|
||||
dotnet_code_quality.CAXXXX.api_surface = private, internal
|
||||
dotnet_diagnostic.CA1001.severity = error # CA1001: Types that own disposable fields should be disposable
|
||||
dotnet_diagnostic.CA1051.severity = error # CA1051: Do not declare visible instance fields
|
||||
dotnet_diagnostic.CA1511.severity = warning # CA1511: Use 'ArgumentException.ThrowIfNullOrEmpty' instead of explicitly throwing a new exception instance
|
||||
dotnet_diagnostic.CA1513.severity = warning # Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
|
||||
dotnet_diagnostic.CA1825.severity = warning # CA1825: Avoid zero-length array allocations
|
||||
dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available
|
||||
dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
|
||||
dotnet_diagnostic.CA1860.severity = error # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
|
||||
dotnet_diagnostic.CA1862.severity = warning # CA1862: Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'
|
||||
dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead.
|
||||
dotnet_diagnostic.CA2201.severity = none # CA2201: Exception type System.NullReferenceException is reserved by the runtime
|
||||
dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
|
||||
dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name
|
||||
dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2");
|
||||
dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant.
|
||||
dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary
|
||||
dotnet_diagnostic.IDE0010.severity = none # Add missing cases to switch statement (IDE0010)
|
||||
dotnet_diagnostic.IDE0028.severity = error # IDE0028: Collection initialization can be simplified
|
||||
dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
|
||||
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
|
||||
dotnet_diagnostic.IDE0048.severity = none # Parentheses preferences (IDE0047 and IDE0048)
|
||||
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
|
||||
dotnet_diagnostic.IDE0051.severity = error # Private member '' is unused [, ]
|
||||
dotnet_diagnostic.IDE0058.severity = warning # IDE0058: Expression value is never used
|
||||
dotnet_diagnostic.IDE0060.severity = error # IDE0060: Remove unused parameter
|
||||
dotnet_diagnostic.IDE0074.severity = warning # IDE0074: Use compound assignment
|
||||
dotnet_diagnostic.IDE0130.severity = none # Namespace does not match folder structure (IDE0130)
|
||||
dotnet_diagnostic.IDE0270.severity = warning # IDE0270: Null check can be simplified
|
||||
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
|
||||
dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified
|
||||
dotnet_diagnostic.IDE0301.severity = error #IDE0301: Collection initialization can be simplified
|
||||
dotnet_diagnostic.IDE0305.severity = none # IDE0305: Collection initialization can be simplified
|
||||
dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method
|
||||
dotnet_naming_rule.class_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.class_should_be_pascal_case.symbols = class
|
||||
dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate
|
||||
dotnet_naming_rule.enum_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum
|
||||
dotnet_naming_rule.event_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.event_should_be_pascal_case.symbols = event
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
|
||||
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
|
||||
dotnet_naming_rule.method_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.method_should_be_pascal_case.symbols = method
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
|
||||
dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field
|
||||
dotnet_naming_rule.property_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.property_should_be_pascal_case.symbols = property
|
||||
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning
|
||||
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field
|
||||
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field
|
||||
dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field
|
||||
dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method
|
||||
dotnet_naming_rule.struct_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct
|
||||
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
|
||||
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
|
||||
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
|
||||
dotnet_naming_style.begins_with_i.capitalization = pascal_case
|
||||
dotnet_naming_style.begins_with_i.required_prefix = I
|
||||
dotnet_naming_style.begins_with_i.required_suffix =
|
||||
dotnet_naming_style.begins_with_i.word_separator =
|
||||
dotnet_naming_style.pascal_case.capitalization = pascal_case
|
||||
dotnet_naming_style.pascal_case.required_prefix =
|
||||
dotnet_naming_style.pascal_case.required_suffix =
|
||||
dotnet_naming_style.pascal_case.word_separator =
|
||||
dotnet_naming_style.private_of_internal_field.capitalization = pascal_case
|
||||
dotnet_naming_style.private_of_internal_field.required_prefix = _
|
||||
dotnet_naming_style.private_of_internal_field.required_suffix =
|
||||
dotnet_naming_style.private_of_internal_field.word_separator =
|
||||
dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.abstract_method.applicable_kinds = method
|
||||
dotnet_naming_symbols.abstract_method.required_modifiers = abstract
|
||||
dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.class.applicable_kinds = class
|
||||
dotnet_naming_symbols.class.required_modifiers =
|
||||
dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.delegate.applicable_kinds = delegate
|
||||
dotnet_naming_symbols.delegate.required_modifiers =
|
||||
dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.enum.applicable_kinds = enum
|
||||
dotnet_naming_symbols.enum.required_modifiers =
|
||||
dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.event.applicable_kinds = event
|
||||
dotnet_naming_symbols.event.required_modifiers =
|
||||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||
dotnet_naming_symbols.interface.required_modifiers =
|
||||
dotnet_naming_symbols.method.applicable_accessibilities = public
|
||||
dotnet_naming_symbols.method.applicable_kinds = method
|
||||
dotnet_naming_symbols.method.required_modifiers =
|
||||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
|
||||
dotnet_naming_symbols.non_field_members.required_modifiers =
|
||||
dotnet_naming_symbols.private_method.applicable_accessibilities = private
|
||||
dotnet_naming_symbols.private_method.applicable_kinds = method
|
||||
dotnet_naming_symbols.private_method.required_modifiers =
|
||||
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
|
||||
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
|
||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
|
||||
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
|
||||
dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.property.applicable_kinds = property
|
||||
dotnet_naming_symbols.property.required_modifiers =
|
||||
dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected
|
||||
dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.public_or_protected_field.required_modifiers =
|
||||
dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.static_field.applicable_kinds = field
|
||||
dotnet_naming_symbols.static_field.required_modifiers = static
|
||||
dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.static_method.applicable_kinds = method
|
||||
dotnet_naming_symbols.static_method.required_modifiers = static
|
||||
dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.struct.applicable_kinds = struct
|
||||
dotnet_naming_symbols.struct.required_modifiers =
|
||||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
|
||||
dotnet_naming_symbols.types.required_modifiers =
|
||||
dotnet_remove_unnecessary_suppression_exclusions = 0
|
||||
dotnet_separate_import_directive_groups = false
|
||||
dotnet_sort_system_directives_first = false
|
||||
dotnet_style_allow_multiple_blank_lines_experimental = false:warning
|
||||
dotnet_style_allow_statement_immediately_after_block_experimental = true
|
||||
dotnet_style_coalesce_expression = true
|
||||
dotnet_style_collection_initializer = true:warning
|
||||
dotnet_style_explicit_tuple_names = true:warning
|
||||
dotnet_style_namespace_match_folder = true
|
||||
dotnet_style_null_propagation = true:warning
|
||||
dotnet_style_object_initializer = true:warning
|
||||
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||
dotnet_style_predefined_type_for_locals_parameters_members = true
|
||||
dotnet_style_predefined_type_for_member_access = true:warning
|
||||
dotnet_style_prefer_auto_properties = true:warning
|
||||
dotnet_style_prefer_compound_assignment = true:warning
|
||||
dotnet_style_prefer_conditional_expression_over_assignment = false
|
||||
dotnet_style_prefer_conditional_expression_over_return = false
|
||||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
|
||||
dotnet_style_prefer_inferred_tuple_names = true:warning
|
||||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
|
||||
dotnet_style_prefer_simplified_boolean_expressions = true:warning
|
||||
dotnet_style_prefer_simplified_interpolation = true
|
||||
dotnet_style_qualification_for_event = false:error
|
||||
dotnet_style_qualification_for_field = false
|
||||
dotnet_style_qualification_for_method = false:error
|
||||
dotnet_style_qualification_for_property = false:error
|
||||
dotnet_style_readonly_field = true:warning
|
||||
dotnet_style_require_accessibility_modifiers = for_non_interface_members
|
||||
end_of_line = crlf
|
||||
file_header_template = unset
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
insert_final_newline = false
|
||||
root = true
|
||||
tab_width = 4
|
||||
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822
|
||||
# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig
|
||||
# https://github.com/dotnet/project-system/blob/main/.editorconfig
|
||||
70
ADO2025/PI7/Helper-2025-09-08.cs
Normal file
70
ADO2025/PI7/Helper-2025-09-08.cs
Normal file
@ -0,0 +1,70 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace File_Folder_Helper.ADO2025.PI7;
|
||||
|
||||
internal static partial class Helper20250908 {
|
||||
|
||||
internal static void DebugProxyPass(ILogger<Worker> logger, List<string> args) {
|
||||
logger.LogInformation(args[0]);
|
||||
logger.LogInformation(args[1]);
|
||||
logger.LogInformation(args[2]);
|
||||
logger.LogInformation(args[3]);
|
||||
logger.LogInformation(args[4]);
|
||||
logger.LogInformation(args[5]);
|
||||
logger.LogInformation(args[6]);
|
||||
string debug;
|
||||
string domain;
|
||||
string[] lines;
|
||||
string[] files;
|
||||
string fileName;
|
||||
string[] segments;
|
||||
string[] segmentsB;
|
||||
string includePath = args[3];
|
||||
string searchString = args[4];
|
||||
string searchPattern = args[2];
|
||||
string searchStringBreak = args[6];
|
||||
string[] searchStrings = args[5].Split('~');
|
||||
string[] sourceDirectories = Path.GetFullPath(args[0]).Split('~');
|
||||
foreach (string sourceDirectory in sourceDirectories) {
|
||||
files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.AllDirectories);
|
||||
logger.LogInformation("With search pattern '{SearchPattern}' found {files} file(s)", searchPattern, files.Length);
|
||||
foreach (string file in files) {
|
||||
debug = string.Empty;
|
||||
domain = string.Empty;
|
||||
lines = File.ReadAllLines(file);
|
||||
fileName = Path.GetFileName(file);
|
||||
foreach (string line in lines) {
|
||||
if (line.Contains(searchStringBreak)) {
|
||||
if (!string.IsNullOrEmpty(domain)) {
|
||||
domain = $"{domain}/#has-{searchStringBreak}";
|
||||
}
|
||||
break;
|
||||
}
|
||||
segments = line.Split(searchString, StringSplitOptions.None);
|
||||
if (segments.Length > 1 && segments[1][0] is ' ' or '\t') {
|
||||
domain = segments[1].Trim().Trim(';');
|
||||
}
|
||||
segments = line.Split(searchStrings, StringSplitOptions.None);
|
||||
if (segments.Length < 2) {
|
||||
continue;
|
||||
}
|
||||
if (segments[1][0] is not ' ' and not '\t') {
|
||||
continue;
|
||||
}
|
||||
segmentsB = segments[1].Trim().TrimEnd(';').TrimEnd('/').Split(':');
|
||||
if (segmentsB.Length == 1 || string.IsNullOrEmpty(segmentsB[0]) || segmentsB[0][0] == '/') {
|
||||
debug = segmentsB[0];
|
||||
} else {
|
||||
debug = $"{segmentsB[0]}:{segmentsB[^1]}";
|
||||
}
|
||||
}
|
||||
logger.LogInformation("include {includePath}{fileName}; # https://{domain} # {debug}",
|
||||
includePath,
|
||||
fileName,
|
||||
domain,
|
||||
debug);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
272
ADO2025/PI7/Helper-2025-09-26.cs
Normal file
272
ADO2025/PI7/Helper-2025-09-26.cs
Normal file
@ -0,0 +1,272 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Globalization;
|
||||
|
||||
namespace File_Folder_Helper.ADO2025.PI7;
|
||||
|
||||
internal static partial class Helper20250926 {
|
||||
|
||||
internal static void RenameThenFindFirstAndLast(ILogger<Worker> logger, List<string> args) {
|
||||
logger.LogInformation(args[0]);
|
||||
logger.LogInformation(args[1]);
|
||||
logger.LogInformation(args[2]);
|
||||
logger.LogInformation(args[3]);
|
||||
logger.LogInformation(args[4]);
|
||||
logger.LogInformation(args[5]);
|
||||
const char star = '*';
|
||||
const char underscore = '_';
|
||||
string dateFormat = args[4];
|
||||
string searchString = args[3];
|
||||
int seconds = int.Parse(args[5]);
|
||||
string[] searchPatterns = args[2].Split('~');
|
||||
string key = searchString.ToLower().Split(' ')[0];
|
||||
string[] sourceDirectories = Path.GetFullPath(args[0]).Split('~');
|
||||
if (args.Count == 999) {
|
||||
Redo(logger, star, underscore, dateFormat, searchString, key, searchPatterns, sourceDirectories);
|
||||
}
|
||||
Rename(logger, star, underscore, dateFormat, searchString, key, searchPatterns, sourceDirectories);
|
||||
if (seconds > 0) {
|
||||
FindFirstAndLast(logger, star, underscore, dateFormat, searchString, seconds, searchPatterns, sourceDirectories);
|
||||
}
|
||||
}
|
||||
|
||||
private static void Redo(ILogger<Worker> logger, char star, char underscore, string dateFormat, string searchString, string key, string[] searchPatterns, string[] sourceDirectories) {
|
||||
bool found;
|
||||
string check;
|
||||
string[] files;
|
||||
string[] lines;
|
||||
string fileName;
|
||||
string checkFile;
|
||||
string checkPath;
|
||||
DateTime lastDate;
|
||||
DateTime firstDate;
|
||||
string directoryName;
|
||||
string[] directories;
|
||||
string? directoryPath;
|
||||
foreach (string sourceDirectory in sourceDirectories) {
|
||||
directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string searchPattern in searchPatterns) {
|
||||
if (searchPattern.Contains(underscore) || !searchPattern.Contains(star)) {
|
||||
throw new Exception($"{nameof(searchPattern)} must not contain {underscore} and must contain {star}");
|
||||
}
|
||||
foreach (string directory in directories) {
|
||||
directoryName = Path.GetFileName(directory);
|
||||
files = Directory.GetFiles(directory, searchPattern, SearchOption.AllDirectories);
|
||||
logger.LogInformation("With search pattern '{SearchPattern}' found {files} file(s)", searchPattern, files.Length);
|
||||
foreach (string file in files) {
|
||||
found = false;
|
||||
lastDate = DateTime.MinValue;
|
||||
firstDate = DateTime.MinValue;
|
||||
fileName = Path.GetFileName(file);
|
||||
directoryPath = Path.GetDirectoryName(file);
|
||||
if (string.IsNullOrEmpty(directoryPath)) {
|
||||
logger.LogInformation("skipped (empty) '{directoryPath}'", directoryPath);
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
lines = File.ReadAllLines(file);
|
||||
foreach (string line in lines) {
|
||||
if (!found && line.Contains(searchString)) {
|
||||
found = true;
|
||||
}
|
||||
if (line.Length < dateFormat.Length) {
|
||||
continue;
|
||||
}
|
||||
check = line[..dateFormat.Length];
|
||||
if (!DateTime.TryParseExact(check, dateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime logDate)) {
|
||||
continue;
|
||||
}
|
||||
if (firstDate == DateTime.MinValue) {
|
||||
firstDate = logDate;
|
||||
}
|
||||
lastDate = logDate;
|
||||
}
|
||||
if (!found) {
|
||||
checkFile = $"{directoryName}_{firstDate:yyyy-MM-dd_HH-mm-ss}---{lastDate:yyyy-MM-dd_HH-mm-ss}.log";
|
||||
} else {
|
||||
checkFile = $"{directoryName}_{firstDate:yyyy-MM-dd_HH-mm-ss}---{lastDate:yyyy-MM-dd_HH-mm-ss}~~~{key}.log";
|
||||
}
|
||||
checkPath = Path.Combine(directoryPath, checkFile);
|
||||
if (checkFile == fileName) {
|
||||
logger.LogDebug("skipped (match) '{checkFile}'", checkFile);
|
||||
} else if (File.Exists(checkPath)) {
|
||||
logger.LogInformation("skipped (exists) '{checkPath}'", checkPath);
|
||||
} else {
|
||||
logger.LogInformation("rename to '{checkPath}'", checkPath);
|
||||
File.Move(file, checkPath);
|
||||
}
|
||||
} catch {
|
||||
logger.LogWarning("skipped (error) {TotalHours} hour(s) -> '{FileInfo}'", file, (DateTime.Now - new FileInfo(file).LastWriteTime).TotalHours);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void Rename(ILogger<Worker> logger, char star, char underscore, string dateFormat, string searchString, string key, string[] searchPatterns, string[] sourceDirectories) {
|
||||
bool found;
|
||||
string check;
|
||||
string[] files;
|
||||
string[] lines;
|
||||
string checkFile;
|
||||
string checkPath;
|
||||
DateTime lastDate;
|
||||
string[] segments;
|
||||
DateTime firstDate;
|
||||
string[] segmentsB;
|
||||
string directoryName;
|
||||
string[] directories;
|
||||
string destinationDirectory;
|
||||
FileInfo[] fileInfoCollection;
|
||||
foreach (string sourceDirectory in sourceDirectories) {
|
||||
directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string searchPattern in searchPatterns) {
|
||||
if (!searchPattern.Contains(underscore) || !searchPattern.Contains(star)) {
|
||||
throw new Exception($"{nameof(searchPattern)} must contain {underscore} and {star}");
|
||||
}
|
||||
segments = searchPattern.Split(star);
|
||||
segmentsB = segments[0].Split(underscore);
|
||||
foreach (string directory in directories) {
|
||||
directoryName = Path.GetFileName(directory);
|
||||
destinationDirectory = Path.Combine(directory, segmentsB[0], segmentsB[1]);
|
||||
if (!Directory.Exists(destinationDirectory)) {
|
||||
_ = Directory.CreateDirectory(destinationDirectory);
|
||||
}
|
||||
files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
|
||||
logger.LogInformation("With search pattern '{SearchPattern}' found {files} file(s)", searchPattern, files.Length);
|
||||
fileInfoCollection = files.Select(f => new FileInfo(f)).ToArray();
|
||||
foreach (FileInfo fileInfo in fileInfoCollection.OrderBy(f => f.LastWriteTime)) {
|
||||
if (fileInfo.Length == 0) {
|
||||
logger.LogDebug("skipped (0k) '{FileInfo}'", fileInfo.FullName);
|
||||
continue;
|
||||
} else if (fileInfo.LastWriteTime > DateTime.Now.AddMinutes(-1)) {
|
||||
logger.LogDebug("skipped (too new) '{FileInfo}'", fileInfo.FullName);
|
||||
continue;
|
||||
}
|
||||
found = false;
|
||||
lastDate = DateTime.MinValue;
|
||||
firstDate = DateTime.MinValue;
|
||||
try {
|
||||
lines = File.ReadAllLines(fileInfo.FullName);
|
||||
foreach (string line in lines) {
|
||||
if (!found && line.Contains(searchString)) {
|
||||
found = true;
|
||||
}
|
||||
if (line.Length < dateFormat.Length) {
|
||||
continue;
|
||||
}
|
||||
check = line[..dateFormat.Length];
|
||||
if (!DateTime.TryParseExact(check, dateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime logDate)) {
|
||||
continue;
|
||||
}
|
||||
if (firstDate == DateTime.MinValue) {
|
||||
firstDate = logDate;
|
||||
}
|
||||
lastDate = logDate;
|
||||
}
|
||||
if (!found) {
|
||||
checkFile = $"{directoryName}_{firstDate:yyyy-MM-dd_HH-mm-ss}---{lastDate:yyyy-MM-dd_HH-mm-ss}.log";
|
||||
} else {
|
||||
checkFile = $"{directoryName}_{firstDate:yyyy-MM-dd_HH-mm-ss}---{lastDate:yyyy-MM-dd_HH-mm-ss}~~~{key}.log";
|
||||
}
|
||||
checkPath = Path.Combine(destinationDirectory, checkFile);
|
||||
if (checkFile == fileInfo.Name) {
|
||||
logger.LogDebug("skipped (match) '{checkFile}'", checkFile);
|
||||
} else if (File.Exists(checkPath)) {
|
||||
logger.LogInformation("skipped (exists) '{checkPath}'", checkPath);
|
||||
} else {
|
||||
logger.LogInformation("rename to '{checkPath}'", checkPath);
|
||||
File.Move(fileInfo.FullName, checkPath);
|
||||
}
|
||||
} catch {
|
||||
logger.LogWarning("skipped (error) {TotalHours} hour(s) -> '{FileInfo}'", (DateTime.Now - fileInfo.LastWriteTime).TotalHours, fileInfo.FullName);
|
||||
}
|
||||
}
|
||||
Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, directory);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void FindFirstAndLast(ILogger<Worker> logger, char star, char underscore, string dateFormat, string searchString, int seconds, string[] searchPatterns, string[] sourceDirectories) {
|
||||
string line;
|
||||
string check;
|
||||
string[] files;
|
||||
string[] lines;
|
||||
DateTime lastDate;
|
||||
double totalHours;
|
||||
string[] segments;
|
||||
TimeSpan timeSpan;
|
||||
DateTime firstDate;
|
||||
string[] segmentsB;
|
||||
string directoryName;
|
||||
string[] directories;
|
||||
string searchPatternB;
|
||||
string destinationDirectory;
|
||||
FileInfo[] fileInfoCollection;
|
||||
DateTime logDate = DateTime.MinValue;
|
||||
foreach (string sourceDirectory in sourceDirectories) {
|
||||
directories = Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string searchPattern in searchPatterns) {
|
||||
if (!searchPattern.Contains(underscore) || !searchPattern.Contains(star)) {
|
||||
throw new Exception($"{nameof(searchPattern)} must contain {underscore} and {star}");
|
||||
}
|
||||
segments = searchPattern.TrimEnd(star).Split(star);
|
||||
segmentsB = segments[0].Split(underscore);
|
||||
foreach (string directory in directories) {
|
||||
directoryName = Path.GetFileName(directory);
|
||||
destinationDirectory = Path.Combine(directory, segmentsB[0], segmentsB[1]);
|
||||
if (!Directory.Exists(destinationDirectory)) {
|
||||
logger.LogInformation("skipped (doesn't exist) '{destinationDirectory}'", destinationDirectory);
|
||||
continue;
|
||||
}
|
||||
searchPatternB = $"*{segments[^1]}*";
|
||||
files = Directory.GetFiles(destinationDirectory, searchPatternB, SearchOption.TopDirectoryOnly);
|
||||
logger.LogInformation("For {destinationDirectory} with search pattern '{SearchPatternB}' found {files} file(s)", destinationDirectory, searchPatternB, files.Length);
|
||||
fileInfoCollection = files.Select(f => new FileInfo(f)).ToArray();
|
||||
foreach (FileInfo fileInfo in fileInfoCollection.OrderBy(f => f.LastWriteTime)) {
|
||||
if (fileInfo.Length == 0) {
|
||||
logger.LogDebug("skipped (0k) '{FileInfo}'", fileInfo.FullName);
|
||||
continue;
|
||||
} else if (fileInfo.LastWriteTime > DateTime.Now.AddMinutes(-1)) {
|
||||
logger.LogDebug("skipped (too new) '{FileInfo}'", fileInfo.FullName);
|
||||
continue;
|
||||
}
|
||||
lastDate = DateTime.MinValue;
|
||||
firstDate = DateTime.MinValue;
|
||||
try {
|
||||
lines = File.ReadAllLines(fileInfo.FullName);
|
||||
for (int i = 0; i < lines.Length; i++) {
|
||||
line = lines[i];
|
||||
if (!line.Contains(searchString) || lines[i - 1].Length < dateFormat.Length) {
|
||||
continue;
|
||||
}
|
||||
check = lines[i - 1][..dateFormat.Length];
|
||||
if (!DateTime.TryParseExact(check, dateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out logDate)) {
|
||||
continue;
|
||||
}
|
||||
timeSpan = logDate - lastDate;
|
||||
if (firstDate == DateTime.MinValue || timeSpan.TotalSeconds > seconds) {
|
||||
if (firstDate != DateTime.MinValue) {
|
||||
totalHours = Math.Round((lastDate - firstDate).TotalHours, 2);
|
||||
logger.LogInformation("Ran for {totalHours} hour(s) {logDate} - {firstDate} {file}", totalHours, logDate.ToString("HH:mm:ss"), firstDate.ToString("HH:mm:ss"), fileInfo.FullName[directory.Length..]);
|
||||
}
|
||||
firstDate = logDate;
|
||||
}
|
||||
lastDate = logDate;
|
||||
}
|
||||
if (firstDate != DateTime.MinValue && logDate != DateTime.MinValue) {
|
||||
totalHours = Math.Round((lastDate - firstDate).TotalHours, 2);
|
||||
logger.LogInformation("Ran for {totalHours} hour(s) {logDate} - {firstDate} {file}", totalHours, logDate.ToString("HH:mm:ss"), firstDate.ToString("HH:mm:ss"), fileInfo.FullName[directory.Length..]);
|
||||
}
|
||||
} catch {
|
||||
logger.LogWarning("skipped (error) {TotalHours} hour(s) -> '{FileInfo}'", (DateTime.Now - fileInfo.LastWriteTime).TotalHours, fileInfo.FullName);
|
||||
}
|
||||
}
|
||||
Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(logger, directory);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -185,6 +185,10 @@ internal static class HelperDay
|
||||
ADO2025.PI6.Helper20250720.WriteFaceData(logger, args);
|
||||
else if (args[1] == "Day-Helper-2025-07-26")
|
||||
ADO2025.PI6.Helper20250726.CopyToCombinedEnumAndIndexFormat(logger, args);
|
||||
else if (args[1] == "Day-Helper-2025-09-08")
|
||||
ADO2025.PI7.Helper20250908.DebugProxyPass(logger, args);
|
||||
else if (args[1] == "Day-Helper-2025-09-26")
|
||||
ADO2025.PI7.Helper20250926.RenameThenFindFirstAndLast(logger, args);
|
||||
else
|
||||
throw new Exception(appSettings.Company);
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
|
||||
<PackageReference Include="Phares.Metadata" Version="8.0.118.14905" />
|
||||
<PackageReference Include="Phares.Shared" Version="8.0.118.14905" />
|
||||
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.18" />
|
||||
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.20" />
|
||||
<PackageReference Include="System.Text.Json" Version="9.0.7" />
|
||||
<PackageReference Include="TextCopy" Version="6.2.1" />
|
||||
<PackageReference Include="WindowsShortcutFactory" Version="1.2.0" />
|
||||
|
||||
Reference in New Issue
Block a user