chore: switch to dotnet foundation editorconfig preset

This commit is contained in:
Timothy Schenk 2023-11-01 18:18:27 +01:00
parent 8d78bc1752
commit ea1ea5cee7
21 changed files with 535 additions and 744 deletions

View file

@ -1,453 +1,461 @@
# Version: 4.1.1 (Using https://semver.org/) ; EditorConfig to support per-solution formatting.
# Updated: 2022-05-23 ; Use the EditorConfig VS add-in to make this work.
# See https://github.com/RehanSaeed/EditorConfig/releases for release notes. ; http://editorconfig.org/
# See https://github.com/RehanSaeed/EditorConfig for updates to this file. ;
# See http://EditorConfig.org for more information about .editorconfig files. ; Here are some resources for what's supported for .NET/C#
; https://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
; https://learn.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
;
; Be **careful** editing this because some of the rules don't support adding a severity level
; For instance if you change to `dotnet_sort_system_directives_first = true:warning` (adding `:warning`)
; then the rule will be silently ignored.
########################################## ; This is the default for the codeline.
# Common Settings
##########################################
# This file is the top-most EditorConfig file
root = true root = true
# All Files
[*] [*]
charset = utf-8
indent_style = space indent_style = space
indent_size = 4 charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
insert_final_newline = true
########################################## [*.cs]
# File Extension Settings indent_size = 4
##########################################
# Visual Studio Solution Files
[*.sln]
indent_style = tab
# Visual Studio XML Project Files
[*.{csproj,vbproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# XML Configuration Files
[*.{xml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}]
indent_size = 2
# JSON Files
[*.{json,json5,webmanifest}]
indent_size = 2
# YAML Files
[*.{yml,yaml}]
indent_size = 2
# Markdown Files
[*.{md,mdx}]
trim_trailing_whitespace = false
# Web Files
[*.{htm,html,js,jsm,ts,tsx,cjs,cts,ctsx,mjs,mts,mtsx,css,sass,scss,less,pcss,svg,vue}]
indent_size = 2
# Batch Files
[*.{cmd,bat}]
end_of_line = crlf
# Bash Files
[*.sh]
end_of_line = lf
# Makefiles
[Makefile]
indent_style = tab
##########################################
# Default .NET Code Style Severities
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/configuration-options#scope
##########################################
[*.{cs,csx,cake,vb,vbx}]
# Default Severity for all .NET Code Style rules below
dotnet_analyzer_diagnostic.severity = warning
##########################################
# Language Rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules
##########################################
# .NET Style Rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules#net-style-rules
[*.{cs,csx,cake,vb,vbx}]
# "this." and "Me." qualifiers
dotnet_style_qualification_for_field = true:warning
dotnet_style_qualification_for_property = true:warning
dotnet_style_qualification_for_method = true:warning
dotnet_style_qualification_for_event = true:warning
# Language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning
# Modifier preferences
dotnet_style_require_accessibility_modifiers = always:warning
csharp_preferred_modifier_order = public, private, protected, internal, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:warning
visual_basic_preferred_modifier_order = Partial, Default, Private, Protected, Public, Friend, NotOverridable, Overridable, MustOverride, Overloads, Overrides, MustInherit, NotInheritable, Static, Shared, Shadows, ReadOnly, WriteOnly, Dim, Const, WithEvents, Widening, Narrowing, Custom, Async:warning
dotnet_style_readonly_field = true:warning
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning
# Expression-level preferences
dotnet_style_object_initializer = true:warning
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:warning
dotnet_style_prefer_inferred_tuple_names = true:warning
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion
dotnet_diagnostic.IDE0045.severity = suggestion
dotnet_style_prefer_conditional_expression_over_return = false:suggestion
dotnet_diagnostic.IDE0046.severity = suggestion
dotnet_style_prefer_compound_assignment = true:warning
dotnet_style_prefer_simplified_interpolation = true:warning
dotnet_style_prefer_simplified_boolean_expressions = true:warning
# Null-checking preferences
dotnet_style_coalesce_expression = true:warning
dotnet_style_null_propagation = true:warning
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
# File header preferences
# file_header_template = <copyright file="{fileName}" company="PROJECT-AUTHOR">\n© PROJECT-AUTHOR\n</copyright>
# If you use StyleCop, you'll need to disable SA1636: File header copyright text should match.
# dotnet_diagnostic.SA1636.severity = none
# Undocumented
dotnet_style_operator_placement_when_wrapping = end_of_line:warning
csharp_style_prefer_null_check_over_type_check = true:warning
# C# Style Rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules#c-style-rules
[*.{cs,csx,cake}]
# 'var' preferences
csharp_style_var_for_built_in_types = true:warning
csharp_style_var_when_type_is_apparent = true:warning
csharp_style_var_elsewhere = true:warning
# Expression-bodied members
csharp_style_expression_bodied_methods = true:warning
csharp_style_expression_bodied_constructors = true:warning
csharp_style_expression_bodied_operators = true:warning
csharp_style_expression_bodied_properties = true:warning
csharp_style_expression_bodied_indexers = true:warning
csharp_style_expression_bodied_accessors = true:warning
csharp_style_expression_bodied_lambdas = true:warning
csharp_style_expression_bodied_local_functions = true:warning
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
csharp_style_pattern_matching_over_as_with_null_check = true:warning
csharp_style_prefer_switch_expression = true:warning
csharp_style_prefer_pattern_matching = true:warning
csharp_style_prefer_not_pattern = true:warning
# Expression-level preferences
csharp_style_inlined_variable_declaration = true:warning
csharp_prefer_simple_default_expression = true:warning
csharp_style_pattern_local_over_anonymous_function = true:warning
csharp_style_deconstructed_variable_declaration = true:warning
csharp_style_prefer_index_operator = true:warning
csharp_style_prefer_range_operator = true:warning
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
# "Null" checking preferences
csharp_style_throw_expression = true:warning
csharp_style_conditional_delegate_call = true:warning
# Code block preferences
csharp_prefer_braces = true:warning
csharp_prefer_simple_using_statement = true:suggestion
dotnet_diagnostic.IDE0063.severity = suggestion
# 'using' directive preferences
csharp_using_directive_placement = inside_namespace:warning
# Modifier preferences
csharp_prefer_static_local_function = true:warning
##########################################
# Unnecessary Code Rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/unnecessary-code-rules
##########################################
# .NET Unnecessary code rules
[*.{cs,csx,cake,vb,vbx}]
dotnet_code_quality_unused_parameters = all:warning
dotnet_remove_unnecessary_suppression_exclusions = none:warning
# C# Unnecessary code rules
[*.{cs,csx,cake}]
csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion
dotnet_diagnostic.IDE0058.severity = suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
dotnet_diagnostic.IDE0059.severity = suggestion
##########################################
# Formatting Rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules
##########################################
# .NET formatting rules
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#net-formatting-rules
[*.{cs,csx,cake,vb,vbx}]
# Organize using directives
dotnet_sort_system_directives_first = true dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false
# Dotnet namespace options
dotnet_style_namespace_match_folder = true:suggestion
dotnet_diagnostic.IDE0130.severity = suggestion
# C# formatting rules # Don't use this. qualifier
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#c-formatting-rules dotnet_style_qualification_for_field = false:suggestion
[*.{cs,csx,cake}] dotnet_style_qualification_for_property = false:suggestion
# Newline options
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#new-line-options # use int x = .. over Int32
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
# use int.MaxValue over Int32.MaxValue
dotnet_style_predefined_type_for_member_access = true:suggestion
# Require var all the time.
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Disallow throw expressions.
csharp_style_throw_expression = false:suggestion
# Newline settings
csharp_new_line_before_open_brace = all csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true csharp_new_line_before_else = true
csharp_new_line_before_catch = true csharp_new_line_before_catch = true
csharp_new_line_before_finally = true csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation options
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#indentation-options
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = no_change
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = false
# Spacing options
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#spacing-options
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_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_call_parameter_list_parentheses = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_after_comma = true
csharp_space_before_comma = false
csharp_space_after_dot = false
csharp_space_before_dot = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_around_declaration_statements = false
csharp_space_before_open_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_square_brackets = false
# Wrap options
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#wrap-options
csharp_preserve_single_line_statements = false
csharp_preserve_single_line_blocks = true
# Namespace options
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#namespace-options
csharp_style_namespace_declarations = file_scoped:warning
########################################## # Namespace settings
# .NET Naming Rules csharp_style_namespace_declarations = file_scoped
# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/naming-rules
##########################################
[*.{cs,csx,cake,vb,vbx}] # Brace settings
csharp_prefer_braces = true # Prefer curly braces even for one line of code
########################################## # name all constant fields using PascalCase
# Styles dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
########################################## dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
# camel_case_style - Define the camelCase style dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_style.camel_case_style.capitalization = camel_case dotnet_naming_symbols.constant_fields.required_modifiers = const
# pascal_case_style - Define the PascalCase style
dotnet_naming_style.pascal_case_style.capitalization = pascal_case dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# first_upper_style - The first character must start with an upper-case character
dotnet_naming_style.first_upper_style.capitalization = first_word_upper
# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I'
dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case
dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I
# prefix_type_parameters_with_t_style - Generic Type Parameters must be PascalCase and the first character must be a 'T'
dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case
dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T
# disallowed_style - Anything that has this style applied is marked as disallowed
dotnet_naming_style.disallowed_style.capitalization = pascal_case
dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____
dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____
# internal_error_style - This style should never occur... if it does, it indicates a bug in file or in the parser using the file
dotnet_naming_style.internal_error_style.capitalization = pascal_case
dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____
dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____
########################################## # internal and private fields should be _camelCase
# .NET Design Guideline Field Naming Rules dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
# Naming rules for fields follow the .NET Framework design guidelines dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
# https://docs.microsoft.com/dotnet/standard/design-guidelines/index dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
########################################## dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
dotnet_naming_style.camel_case_underscore_style.required_prefix = _
dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
# All public/protected/protected_internal constant fields must be PascalCase [*.{xml,config,*proj,nuspec,props,resx,targets,yml,tasks}]
# https://docs.microsoft.com/dotnet/standard/design-guidelines/field indent_size = 2
dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal
dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const
dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field
dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group
dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style
dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning
# All public/protected/protected_internal static readonly fields must be PascalCase # Xml config files
# https://docs.microsoft.com/dotnet/standard/design-guidelines/field [*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal indent_size = 2
dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly
dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field
dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group
dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style
dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning
# No other public/protected/protected_internal fields are allowed [*.json]
# https://docs.microsoft.com/dotnet/standard/design-guidelines/field indent_size = 2
dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal
dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field
dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group
dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style
dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = error
########################################## [*.{ps1,psm1}]
# StyleCop Field Naming Rules indent_size = 4
# Naming rules for fields follow the StyleCop analyzers
# This does not override any rules using disallowed_style above
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers
##########################################
# All constant fields must be PascalCase [*.sh]
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1303.md indent_size = 4
dotnet_naming_symbols.stylecop_constant_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private end_of_line = lf
dotnet_naming_symbols.stylecop_constant_fields_group.required_modifiers = const
dotnet_naming_symbols.stylecop_constant_fields_group.applicable_kinds = field
dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.symbols = stylecop_constant_fields_group
dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.style = pascal_case_style
dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.severity = warning
# All static readonly fields must be PascalCase [*.{razor,cshtml}]
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1311.md charset = utf-8-bom
dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private
dotnet_naming_symbols.stylecop_static_readonly_fields_group.required_modifiers = static, readonly
dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_kinds = field
dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.symbols = stylecop_static_readonly_fields_group
dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style
dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.severity = warning
# No non-private instance fields are allowed [*.{cs,vb}]
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1401.md
dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected
dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_kinds = field
dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.symbols = stylecop_fields_must_be_private_group
dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.style = disallowed_style
dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.severity = error
# Private fields must be camelCase # SYSLIB1054: Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1306.md dotnet_diagnostic.SYSLIB1054.severity = warning
dotnet_naming_symbols.stylecop_private_fields_group.applicable_accessibilities = private
dotnet_naming_symbols.stylecop_private_fields_group.applicable_kinds = field
dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.symbols = stylecop_private_fields_group
dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.style = camel_case_style
dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.severity = warning
# Local variables must be camelCase # CA1018: Mark attributes with AttributeUsageAttribute
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1312.md dotnet_diagnostic.CA1018.severity = warning
dotnet_naming_symbols.stylecop_local_fields_group.applicable_accessibilities = local
dotnet_naming_symbols.stylecop_local_fields_group.applicable_kinds = local
dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.symbols = stylecop_local_fields_group
dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.style = camel_case_style
dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.severity = silent
# This rule should never fire. However, it's included for at least two purposes: # CA1047: Do not declare protected member in sealed type
# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers. dotnet_diagnostic.CA1047.severity = warning
# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#).
dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = *
dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field
dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group
dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style
dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error
# CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = warning
########################################## # CA1507: Use nameof to express symbol names
# Other Naming Rules dotnet_diagnostic.CA1507.severity = warning
##########################################
# All of the following must be PascalCase: # CA1510: Use ArgumentNullException throw helper
# - Namespaces dotnet_diagnostic.CA1510.severity = warning
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md
# - Classes and Enumerations
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md
# - Delegates
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types
# - Constructors, Properties, Events, Methods
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members
dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property
dotnet_naming_rule.element_rule.symbols = element_group
dotnet_naming_rule.element_rule.style = pascal_case_style
dotnet_naming_rule.element_rule.severity = warning
# Interfaces use PascalCase and are prefixed with uppercase 'I' # CA1511: Use ArgumentException throw helper
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces dotnet_diagnostic.CA1511.severity = warning
dotnet_naming_symbols.interface_group.applicable_kinds = interface
dotnet_naming_rule.interface_rule.symbols = interface_group
dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style
dotnet_naming_rule.interface_rule.severity = warning
# Generics Type Parameters use PascalCase and are prefixed with uppercase 'T' # CA1512: Use ArgumentOutOfRangeException throw helper
# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces dotnet_diagnostic.CA1512.severity = warning
dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter
dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group
dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style
dotnet_naming_rule.type_parameter_rule.severity = warning
# Function parameters use camelCase # CA1513: Use ObjectDisposedException throw helper
# https://docs.microsoft.com/dotnet/standard/design-guidelines/naming-parameters dotnet_diagnostic.CA1513.severity = warning
dotnet_naming_symbols.parameters_group.applicable_kinds = parameter
dotnet_naming_rule.parameters_rule.symbols = parameters_group
dotnet_naming_rule.parameters_rule.style = camel_case_style
dotnet_naming_rule.parameters_rule.severity = warning
# Disable warnings for using LoggerMessage delegates # CA1725: Parameter names should match base declaration
dotnet_diagnostic.CA1848.severity = none dotnet_diagnostic.CA1725.severity = suggestion
########################################## # CA1802: Use literals where appropriate
# License dotnet_diagnostic.CA1802.severity = warning
##########################################
# The following applies as to the .editorconfig file ONLY, and is # CA1805: Do not initialize unnecessarily
# included below for reference, per the requirements of the license dotnet_diagnostic.CA1805.severity = warning
# corresponding to this .editorconfig file.
# See: https://github.com/RehanSaeed/EditorConfig # CA1810: Do not initialize unnecessarily
# dotnet_diagnostic.CA1810.severity = warning
# MIT License
# # CA1821: Remove empty Finalizers
# Copyright (c) 2017-2019 Muhammad Rehan Saeed dotnet_diagnostic.CA1821.severity = warning
# Copyright (c) 2019 Henry Gabryjelski
# # CA1822: Make member static
# Permission is hereby granted, free of charge, to any dotnet_diagnostic.CA1822.severity = warning
# person obtaining a copy of this software and associated dotnet_code_quality.CA1822.api_surface = private, internal
# documentation files (the "Software"), to deal in the
# Software without restriction, including without limitation # CA1823: Avoid unused private fields
# the rights to use, copy, modify, merge, publish, distribute, dotnet_diagnostic.CA1823.severity = warning
# sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject # CA1825: Avoid zero-length array allocations
# to the following conditions: dotnet_diagnostic.CA1825.severity = warning
#
# The above copyright notice and this permission notice shall be # CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly
# included in all copies or substantial portions of the Software. dotnet_diagnostic.CA1826.severity = warning
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # CA1827: Do not use Count() or LongCount() when Any() can be used
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES dotnet_diagnostic.CA1827.severity = warning
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # CA1828: Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, dotnet_diagnostic.CA1828.severity = warning
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # CA1829: Use Length/Count property instead of Count() when available
# OTHER DEALINGS IN THE SOFTWARE. dotnet_diagnostic.CA1829.severity = warning
##########################################
# CA1830: Prefer strongly-typed Append and Insert method overloads on StringBuilder
dotnet_diagnostic.CA1830.severity = warning
# CA1831: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1831.severity = warning
# CA1832: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1832.severity = warning
# CA1833: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1833.severity = warning
# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1834.severity = warning
# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
dotnet_diagnostic.CA1835.severity = warning
# CA1836: Prefer IsEmpty over Count
dotnet_diagnostic.CA1836.severity = warning
# CA1837: Use 'Environment.ProcessId'
dotnet_diagnostic.CA1837.severity = warning
# CA1838: Avoid 'StringBuilder' parameters for P/Invokes
dotnet_diagnostic.CA1838.severity = warning
# CA1839: Use 'Environment.ProcessPath'
dotnet_diagnostic.CA1839.severity = warning
# CA1840: Use 'Environment.CurrentManagedThreadId'
dotnet_diagnostic.CA1840.severity = warning
# CA1841: Prefer Dictionary.Contains methods
dotnet_diagnostic.CA1841.severity = warning
# CA1842: Do not use 'WhenAll' with a single task
dotnet_diagnostic.CA1842.severity = warning
# CA1843: Do not use 'WaitAll' with a single task
dotnet_diagnostic.CA1843.severity = warning
# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'
dotnet_diagnostic.CA1844.severity = warning
# CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = warning
# CA1846: Prefer AsSpan over Substring
dotnet_diagnostic.CA1846.severity = warning
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = warning
# CA1852: Seal internal types
dotnet_diagnostic.CA1852.severity = warning
# CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = warning
# CA1855: Prefer 'Clear' over 'Fill'
dotnet_diagnostic.CA1855.severity = warning
# CA1856: Incorrect usage of ConstantExpected attribute
dotnet_diagnostic.CA1856.severity = error
# CA1857: A constant is expected for the parameter
dotnet_diagnostic.CA1857.severity = warning
# CA1858: Use 'StartsWith' instead of 'IndexOf'
dotnet_diagnostic.CA1858.severity = warning
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = warning
# CA2008: Do not create tasks without passing a TaskScheduler
dotnet_diagnostic.CA2008.severity = warning
# CA2009: Do not call ToImmutableCollection on an ImmutableCollection value
dotnet_diagnostic.CA2009.severity = warning
# CA2011: Avoid infinite recursion
dotnet_diagnostic.CA2011.severity = warning
# CA2012: Use ValueTask correctly
dotnet_diagnostic.CA2012.severity = warning
# CA2013: Do not use ReferenceEquals with value types
dotnet_diagnostic.CA2013.severity = warning
# CA2014: Do not use stackalloc in loops.
dotnet_diagnostic.CA2014.severity = warning
# CA2016: Forward the 'CancellationToken' parameter to methods that take one
dotnet_diagnostic.CA2016.severity = warning
# CA2200: Rethrow to preserve stack details
dotnet_diagnostic.CA2200.severity = warning
# CA2201: Do not raise reserved exception types
dotnet_diagnostic.CA2201.severity = warning
# CA2208: Instantiate argument exceptions correctly
dotnet_diagnostic.CA2208.severity = warning
# CA2245: Do not assign a property to itself
dotnet_diagnostic.CA2245.severity = warning
# CA2246: Assigning symbol and its member in the same statement
dotnet_diagnostic.CA2246.severity = warning
# CA2249: Use string.Contains instead of string.IndexOf to improve readability.
dotnet_diagnostic.CA2249.severity = warning
# IDE0005: Remove unnecessary usings
dotnet_diagnostic.IDE0005.severity = warning
# IDE0011: Curly braces to surround blocks of code
dotnet_diagnostic.IDE0011.severity = warning
# IDE0020: Use pattern matching to avoid is check followed by a cast (with variable)
dotnet_diagnostic.IDE0020.severity = warning
# IDE0029: Use coalesce expression (non-nullable types)
dotnet_diagnostic.IDE0029.severity = warning
# IDE0030: Use coalesce expression (nullable types)
dotnet_diagnostic.IDE0030.severity = warning
# IDE0031: Use null propagation
dotnet_diagnostic.IDE0031.severity = warning
# IDE0035: Remove unreachable code
dotnet_diagnostic.IDE0035.severity = warning
# IDE0036: Order modifiers
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
dotnet_diagnostic.IDE0036.severity = warning
# IDE0038: Use pattern matching to avoid is check followed by a cast (without variable)
dotnet_diagnostic.IDE0038.severity = warning
# IDE0043: Format string contains invalid placeholder
dotnet_diagnostic.IDE0043.severity = warning
# IDE0044: Make field readonly
dotnet_diagnostic.IDE0044.severity = warning
# IDE0051: Remove unused private members
dotnet_diagnostic.IDE0051.severity = warning
# IDE0055: All formatting rules
dotnet_diagnostic.IDE0055.severity = suggestion
# IDE0059: Unnecessary assignment to a value
dotnet_diagnostic.IDE0059.severity = warning
# IDE0060: Remove unused parameter
dotnet_code_quality_unused_parameters = non_public
dotnet_diagnostic.IDE0060.severity = warning
# IDE0062: Make local function static
dotnet_diagnostic.IDE0062.severity = warning
# IDE0073: File header
dotnet_diagnostic.IDE0073.severity = warning
# Not a dotnet foundation project
#file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license.
# IDE0161: Convert to file-scoped namespace
dotnet_diagnostic.IDE0161.severity = warning
# IDE0200: Lambda expression can be removed
dotnet_diagnostic.IDE0200.severity = warning
# IDE2000: Disallow multiple blank lines
dotnet_style_allow_multiple_blank_lines_experimental = false
dotnet_diagnostic.IDE2000.severity = warning
[{eng/tools/**.cs,**/{test,testassets,samples,Samples,perf,benchmarkapps,scripts,stress}/**.cs,src/Hosting/Server.IntegrationTesting/**.cs,src/Servers/IIS/IntegrationTesting.IIS/**.cs,src/Shared/Http2cat/**.cs,src/Testing/**.cs}]
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = suggestion
# CA1507: Use nameof to express symbol names
dotnet_diagnostic.CA1507.severity = suggestion
# CA1510: Use ArgumentNullException throw helper
dotnet_diagnostic.CA1510.severity = suggestion
# CA1511: Use ArgumentException throw helper
dotnet_diagnostic.CA1511.severity = suggestion
# CA1512: Use ArgumentOutOfRangeException throw helper
dotnet_diagnostic.CA1512.severity = suggestion
# CA1513: Use ObjectDisposedException throw helper
dotnet_diagnostic.CA1513.severity = suggestion
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = suggestion
# CA1805: Do not initialize unnecessarily
dotnet_diagnostic.CA1805.severity = suggestion
# CA1810: Do not initialize unnecessarily
dotnet_diagnostic.CA1810.severity = suggestion
# CA1822: Make member static
dotnet_diagnostic.CA1822.severity = suggestion
# CA1823: Avoid zero-length array allocations
dotnet_diagnostic.CA1825.severity = suggestion
# CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly
dotnet_diagnostic.CA1826.severity = suggestion
# CA1827: Do not use Count() or LongCount() when Any() can be used
dotnet_diagnostic.CA1827.severity = suggestion
# CA1829: Use Length/Count property instead of Count() when available
dotnet_diagnostic.CA1829.severity = suggestion
# CA1831: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1831.severity = suggestion
# CA1832: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1832.severity = suggestion
# CA1833: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1833.severity = suggestion
# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1834.severity = suggestion
# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
dotnet_diagnostic.CA1835.severity = suggestion
# CA1837: Use 'Environment.ProcessId'
dotnet_diagnostic.CA1837.severity = suggestion
# CA1838: Avoid 'StringBuilder' parameters for P/Invokes
dotnet_diagnostic.CA1838.severity = suggestion
# CA1841: Prefer Dictionary.Contains methods
dotnet_diagnostic.CA1841.severity = suggestion
# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'
dotnet_diagnostic.CA1844.severity = suggestion
# CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = suggestion
# CA1846: Prefer AsSpan over Substring
dotnet_diagnostic.CA1846.severity = suggestion
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = suggestion
# CA1852: Seal internal types
dotnet_diagnostic.CA1852.severity = suggestion
# CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = suggestion
# CA1855: Prefer 'Clear' over 'Fill'
dotnet_diagnostic.CA1855.severity = suggestion
# CA1856: Incorrect usage of ConstantExpected attribute
dotnet_diagnostic.CA1856.severity = suggestion
# CA1857: A constant is expected for the parameter
dotnet_diagnostic.CA1857.severity = suggestion
# CA1858: Use 'StartsWith' instead of 'IndexOf'
dotnet_diagnostic.CA1858.severity = suggestion
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = suggestion
# CA2008: Do not create tasks without passing a TaskScheduler
dotnet_diagnostic.CA2008.severity = suggestion
# CA2012: Use ValueTask correctly
dotnet_diagnostic.CA2012.severity = suggestion
# CA2201: Do not raise reserved exception types
dotnet_diagnostic.CA2201.severity = suggestion
# CA2249: Use string.Contains instead of string.IndexOf to improve readability.
dotnet_diagnostic.CA2249.severity = suggestion
# IDE0005: Remove unnecessary usings
dotnet_diagnostic.IDE0005.severity = suggestion
# IDE0020: Use pattern matching to avoid is check followed by a cast (with variable)
dotnet_diagnostic.IDE0020.severity = suggestion
# IDE0029: Use coalesce expression (non-nullable types)
dotnet_diagnostic.IDE0029.severity = suggestion
# IDE0030: Use coalesce expression (nullable types)
dotnet_diagnostic.IDE0030.severity = suggestion
# IDE0031: Use null propagation
dotnet_diagnostic.IDE0031.severity = suggestion
# IDE0038: Use pattern matching to avoid is check followed by a cast (without variable)
dotnet_diagnostic.IDE0038.severity = suggestion
# IDE0044: Make field readonly
dotnet_diagnostic.IDE0044.severity = suggestion
# IDE0051: Remove unused private members
dotnet_diagnostic.IDE0051.severity = suggestion
# IDE0059: Unnecessary assignment to a value
dotnet_diagnostic.IDE0059.severity = suggestion
# IDE0060: Remove unused parameters
dotnet_diagnostic.IDE0060.severity = suggestion
# IDE0062: Make local function static
dotnet_diagnostic.IDE0062.severity = suggestion
# IDE0200: Lambda expression can be removed
dotnet_diagnostic.IDE0200.severity = suggestion
# CA2016: Forward the 'CancellationToken' parameter to methods that take one
dotnet_diagnostic.CA2016.severity = suggestion
# Defaults for content in the shared src/ and shared runtime dir
[{**/Shared/runtime/**.{cs,vb},src/Shared/test/Shared.Tests/runtime/**.{cs,vb},**/microsoft.extensions.hostfactoryresolver.sources/**.{cs,vb}}]
# CA1822: Make member static
dotnet_diagnostic.CA1822.severity = silent
# IDE0011: Use braces
dotnet_diagnostic.IDE0011.severity = silent
# IDE0055: Fix formatting
dotnet_diagnostic.IDE0055.severity = silent
# IDE0060: Remove unused parameters
dotnet_diagnostic.IDE0060.severity = silent
# IDE0062: Make local function static
dotnet_diagnostic.IDE0062.severity = silent
# IDE0161: Convert to file-scoped namespace
dotnet_diagnostic.IDE0161.severity = silent
[{**/Shared/**.cs,**/microsoft.extensions.hostfactoryresolver.sources/**.{cs,vb}}]
# IDE0005: Remove unused usings. Ignore for shared src files since imports for those depend on the projects in which they are included.
dotnet_diagnostic.IDE0005.severity = silent

View file

@ -14,30 +14,30 @@ using BenchmarkDotNet.Order;
[ThreadingDiagnoser] [ThreadingDiagnoser]
public class BinaryConversionBenchmarks public class BinaryConversionBenchmarks
{ {
private byte[] data; private byte[] _data;
private int offset; private int _offset;
[GlobalSetup] [GlobalSetup]
public void Setup() public void Setup()
{ {
this.data = RandomNumberGenerator.GetBytes(4000); this._data = RandomNumberGenerator.GetBytes(4000);
this.offset = RandomNumberGenerator.GetInt32(0, 3500); this._offset = RandomNumberGenerator.GetInt32(0, 3500);
} }
[Benchmark] [Benchmark]
public short BitConverterTest() => BitConverter.ToInt16(this.data, this.offset); public short BitConverterTest() => BitConverter.ToInt16(this._data, this._offset);
[Benchmark] [Benchmark]
public short BinaryReader() public short BinaryReader()
{ {
using var ms = new MemoryStream(this.data); using var ms = new MemoryStream(this._data);
using var reader = new BinaryReader(ms); using var reader = new BinaryReader(ms);
reader.BaseStream.Position = this.offset; reader.BaseStream.Position = this._offset;
return reader.ReadInt16(); return reader.ReadInt16();
} }
[Benchmark] [Benchmark]
public short BinaryPrimitives() => public short BinaryPrimitives() =>
System.Buffers.Binary.BinaryPrimitives.ReadInt16LittleEndian( System.Buffers.Binary.BinaryPrimitives.ReadInt16LittleEndian(
new ArraySegment<byte>(this.data, this.offset, sizeof(short))); new ArraySegment<byte>(this._data, this._offset, sizeof(short)));
} }

View file

@ -4,21 +4,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\Server.csp
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{7D560FA1-A61C-4B67-8300-835CA5814621}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmarks", "Benchmarks\Benchmarks.csproj", "{7D560FA1-A61C-4B67-8300-835CA5814621}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "build", "build\build.csproj", "{046A3B46-FC08-4B08-A52A-1DC5D426120D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C1303691-99F6-41CE-BAD3-2CA112D75DBF}"
ProjectSection(SolutionItems) = preProject
docker-compose.yml = docker-compose.yml
EndProjectSection
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{046A3B46-FC08-4B08-A52A-1DC5D426120D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{046A3B46-FC08-4B08-A52A-1DC5D426120D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Release|Any CPU.ActiveCfg = Release|Any CPU {7EDA8B31-3E03-4CA3-87D1-CFEB05C277D6}.Release|Any CPU.ActiveCfg = Release|Any CPU

View file

@ -8,28 +8,28 @@ using Packets;
public class AuthSession : TcpSession public class AuthSession : TcpSession
{ {
private readonly ILogger<AuthSession> logger; private readonly ILogger<AuthSession> _logger;
private readonly IMediator mediator; private readonly IMediator _mediator;
public AuthSession(TcpServer public AuthSession(TcpServer
server, IMediator mediator, ILogger<AuthSession> logger) : base(server) server, IMediator mediator, ILogger<AuthSession> logger) : base(server)
{ {
this.mediator = mediator; this._mediator = mediator;
this.logger = logger; this._logger = logger;
} }
public Guid AccountId { get; set; } public Guid AccountId { get; set; }
public override long Send(byte[] buffer) public override long Send(byte[] buffer)
{ {
this.logger.LogInformation("Data being sent is: {Data}", BitConverter.ToString(buffer)); this._logger.LogInformation("Data being sent is: {Data}", BitConverter.ToString(buffer));
return base.Send(buffer); return base.Send(buffer);
} }
public void Send(IPacket packet) public void Send(IPacket packet)
{ {
var type = packet.GetType(); var type = packet.GetType();
this.logger.LogTrace("Packet of type {Type} is being serialized", type.Name); this._logger.LogTrace("Packet of type {Type} is being serialized", type.Name);
var packetIdAttribute = type.GetCustomAttribute<PacketIdAttribute>(); var packetIdAttribute = type.GetCustomAttribute<PacketIdAttribute>();
if (packetIdAttribute == null) if (packetIdAttribute == null)
{ {
@ -57,40 +57,40 @@ public class AuthSession : TcpSession
buffer[2 + i] = bytesOfOpcode[i]; buffer[2 + i] = bytesOfOpcode[i];
} }
this.logger.LogTrace("Packet data being parsed is: {Data}", BitConverter.ToString(packetData.ToArray())); this._logger.LogTrace("Packet data being parsed is: {Data}", BitConverter.ToString(packetData.ToArray()));
this.logger.LogTrace("Packet being parsed is: {Data}", BitConverter.ToString(buffer.ToArray())); this._logger.LogTrace("Packet being parsed is: {Data}", BitConverter.ToString(buffer.ToArray()));
this.Send(buffer); this.Send(buffer);
} }
protected override void OnReceived(byte[] buffer, long offset, long size) protected override void OnReceived(byte[] buffer, long offset, long size)
{ {
this.logger.LogDebug("Length: {Size} & offset: {Offset}", size, offset); this._logger.LogDebug("Length: {Size} & offset: {Offset}", size, offset);
Span<byte> decryptedBuffer = new byte[size]; Span<byte> decryptedBuffer = new byte[size];
// xor every value after the first 8 bytes // xor every value after the first 8 bytes
var dataBuffer = Decrypt(new ArraySegment<byte>(buffer, 8, (int)size - 8).ToArray()); var dataBuffer = Decrypt(new ArraySegment<byte>(buffer, 8, (int)size - 8).ToArray());
this.logger.LogDebug("Length {Length}", BitConverter.ToUInt16(buffer, 0)); this._logger.LogDebug("Length {Length}", BitConverter.ToUInt16(buffer, 0));
var opCode = BitConverter.ToUInt16(buffer.ToArray(), 2); var opCode = BitConverter.ToUInt16(buffer.ToArray(), 2);
this.logger.LogDebug("Packet Op Code: {OpCode}", opCode); this._logger.LogDebug("Packet Op Code: {OpCode}", opCode);
this.logger.LogDebug("Some Value: {RandomValue}", buffer[4]); this._logger.LogDebug("Some Value: {RandomValue}", buffer[4]);
var clientAliveTime = BitConverter.ToUInt16(buffer.ToArray(), 5); var clientAliveTime = BitConverter.ToUInt16(buffer.ToArray(), 5);
this.logger.LogDebug("Client Alive time: {ClientAliveTime}", clientAliveTime); this._logger.LogDebug("Client Alive time: {ClientAliveTime}", clientAliveTime);
this.logger.LogDebug("Might be a flag: {Flag}", buffer[7]); this._logger.LogDebug("Might be a flag: {Flag}", buffer[7]);
this.logger.LogDebug("Full buffer: {Buffer}", BitConverter.ToString(dataBuffer.ToArray())); this._logger.LogDebug("Full buffer: {Buffer}", BitConverter.ToString(dataBuffer.ToArray()));
var rawPacket = new RawPacket((OperationCode)opCode, dataBuffer, clientAliveTime, buffer[7], var rawPacket = new RawPacket((OperationCode)opCode, dataBuffer, clientAliveTime, buffer[7],
buffer[4], this.Id, this); buffer[4], this.Id, this);
_ = this.mediator.Send(rawPacket); _ = this._mediator.Send(rawPacket);
this.logger.LogInformation("Connection from: {@RemoteEndpoint}", this.Socket.RemoteEndPoint?.ToString()); this._logger.LogInformation("Connection from: {@RemoteEndpoint}", this.Socket.RemoteEndPoint?.ToString());
base.OnReceived(decryptedBuffer.ToArray(), offset, decryptedBuffer.Length); base.OnReceived(decryptedBuffer.ToArray(), offset, decryptedBuffer.Length);
} }

View file

@ -8,34 +8,34 @@ using NetCoreServer;
public class ChannelSession : TcpSession public class ChannelSession : TcpSession
{ {
private static readonly byte[] Key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 } private static readonly byte[] _key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 }
.Reverse().ToArray(); .Reverse().ToArray();
private static readonly byte[] Iv = new byte[] private static readonly byte[] _iv = new byte[]
{ {
0xfe, 220, 0xba, 0x98, 0x76, 0x54, 50, 0x10, 15, 30, 0x2d, 60, 0x4b, 90, 0x69, 120 0xfe, 220, 0xba, 0x98, 0x76, 0x54, 50, 0x10, 15, 30, 0x2d, 60, 0x4b, 90, 0x69, 120
}.Reverse().ToArray(); }.Reverse().ToArray();
private readonly ICryptoTransform decryptor; private readonly ICryptoTransform _decryptor;
private readonly ICryptoTransform encryptor; private readonly ICryptoTransform _encryptor;
private readonly ILogger<ChannelSession> logger; private readonly ILogger<ChannelSession> _logger;
private readonly IMediator mediator; private readonly IMediator _mediator;
public ChannelSession(TcpServer server, IMediator mediator, ILogger<ChannelSession> logger) : base(server) public ChannelSession(TcpServer server, IMediator mediator, ILogger<ChannelSession> logger) : base(server)
{ {
this.mediator = mediator; this._mediator = mediator;
this.logger = logger; this._logger = logger;
var aes = Aes.Create(); var aes = Aes.Create();
aes.Key = Key; aes.Key = _key;
aes.IV = Iv; aes.IV = _iv;
aes.Padding = PaddingMode.None; aes.Padding = PaddingMode.None;
#pragma warning disable SEC0026 #pragma warning disable SEC0026
aes.Mode = CipherMode.ECB; aes.Mode = CipherMode.ECB;
#pragma warning restore SEC0026 #pragma warning restore SEC0026
this.decryptor = aes.CreateDecryptor(aes.Key, aes.IV); this._decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
this.encryptor = aes.CreateEncryptor(aes.Key, aes.IV); this._encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
} }
protected override void OnReceived(byte[] buffer, long offset, long size) protected override void OnReceived(byte[] buffer, long offset, long size)
@ -43,12 +43,12 @@ public class ChannelSession : TcpSession
try try
{ {
using (var ms = new MemoryStream(Decrypt(buffer))) using (var ms = new MemoryStream(Decrypt(buffer)))
using (var cs = new CryptoStream(ms, this.decryptor, CryptoStreamMode.Read)) using (var cs = new CryptoStream(ms, this._decryptor, CryptoStreamMode.Read))
{ {
var amountOfReadBytes = cs.Read(buffer); var amountOfReadBytes = cs.Read(buffer);
if (amountOfReadBytes != buffer.Length) if (amountOfReadBytes != buffer.Length)
{ {
this.logger.LogError("Amount of read bytes is not equal to buffer length."); this._logger.LogError("Amount of read bytes is not equal to buffer length.");
} }
} }
@ -56,8 +56,8 @@ public class ChannelSession : TcpSession
} }
catch (CryptographicException ex) catch (CryptographicException ex)
{ {
this.logger.LogError("An error has occured while decrypting: {ErrorMessage}", ex.Message); this._logger.LogError("An error has occured while decrypting: {ErrorMessage}", ex.Message);
this.logger.LogError("Default buffer message: {Message}", Encoding.ASCII.GetString(buffer)); this._logger.LogError("Default buffer message: {Message}", Encoding.ASCII.GetString(buffer));
} }
} }

View file

@ -6,13 +6,13 @@ using Services;
public class PacketConsumer : IConsumer<RawPacket> public class PacketConsumer : IConsumer<RawPacket>
{ {
private readonly PacketDistributorService distributorService; private readonly PacketDistributorService _distributorService;
public PacketConsumer(PacketDistributorService distributorService) => this.distributorService = distributorService; public PacketConsumer(PacketDistributorService distributorService) => this._distributorService = distributorService;
public Task Consume(ConsumeContext<RawPacket> context) public Task Consume(ConsumeContext<RawPacket> context)
{ {
this.distributorService.AddPacket(context.Message); this._distributorService.AddPacket(context.Message);
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

View file

@ -7,13 +7,13 @@ using Microsoft.Extensions.Logging;
public class WonderkingContext : DbContext public class WonderkingContext : DbContext
{ {
private readonly IConfiguration configuration; private readonly IConfiguration _configuration;
private readonly ILoggerFactory loggerFactory; private readonly ILoggerFactory _loggerFactory;
public WonderkingContext(ILoggerFactory loggerFactory, IConfiguration configuration) public WonderkingContext(ILoggerFactory loggerFactory, IConfiguration configuration)
{ {
this.loggerFactory = loggerFactory; this._loggerFactory = loggerFactory;
this.configuration = configuration; this._configuration = configuration;
} }
public DbSet<Account> Accounts { get; set; } public DbSet<Account> Accounts { get; set; }
@ -22,8 +22,8 @@ public class WonderkingContext : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder optionsBuilder
.UseNpgsql( .UseNpgsql(
$"Host={this.configuration["DB:Host"]};Username={this.configuration["DB:Username"]};Password={this.configuration["DB:Password"]};Database={this.configuration["DB:Database"]};Port={this.configuration["DB:Port"]}") $"Host={this._configuration["DB:Host"]};Username={this._configuration["DB:Username"]};Password={this._configuration["DB:Password"]};Database={this._configuration["DB:Database"]};Port={this._configuration["DB:Port"]}")
.EnableSensitiveDataLogging().UseLoggerFactory(this.loggerFactory); .EnableSensitiveDataLogging().UseLoggerFactory(this._loggerFactory);
protected override void OnModelCreating(ModelBuilder modelBuilder) => protected override void OnModelCreating(ModelBuilder modelBuilder) =>
modelBuilder.Entity<Account>(builder => modelBuilder.Entity<Account>(builder =>

View file

@ -43,7 +43,6 @@ public static partial class PacketLoggerMessages
Message = "Packet data {PacketData}")] Message = "Packet data {PacketData}")]
public static partial void PacketData(this ILogger logger, string packetData); public static partial void PacketData(this ILogger logger, string packetData);
[LoggerMessage(EventId = 9, Level = LogLevel.Critical, [LoggerMessage(EventId = 9, Level = LogLevel.Critical,
Message = "No Packets have been found")] Message = "No Packets have been found")]
public static partial void NoPacketsFound(this ILogger logger); public static partial void NoPacketsFound(this ILogger logger);

View file

@ -8,16 +8,16 @@ using Packets.Incoming;
public class ChannelSelectionHandler : IPacketHandler<ChannelSelectionPacket> public class ChannelSelectionHandler : IPacketHandler<ChannelSelectionPacket>
{ {
private readonly IConfiguration configuration; private readonly IConfiguration _configuration;
private readonly ILogger<ChannelSelectionHandler> logger; private readonly ILogger<ChannelSelectionHandler> _logger;
private readonly WonderkingContext wonderkingContext; private readonly WonderkingContext _wonderkingContext;
public ChannelSelectionHandler(IConfiguration configuration, ILogger<ChannelSelectionHandler> logger, public ChannelSelectionHandler(IConfiguration configuration, ILogger<ChannelSelectionHandler> logger,
WonderkingContext wonderkingContext) WonderkingContext wonderkingContext)
{ {
this.configuration = configuration; this._configuration = configuration;
this.logger = logger; this._logger = logger;
this.wonderkingContext = wonderkingContext; this._wonderkingContext = wonderkingContext;
} }
public ChannelSelectionHandler() public ChannelSelectionHandler()
@ -27,7 +27,7 @@ public class ChannelSelectionHandler : IPacketHandler<ChannelSelectionPacket>
public Task HandleAsync(ChannelSelectionPacket packet, TcpSession session) public Task HandleAsync(ChannelSelectionPacket packet, TcpSession session)
{ {
var authSession = (AuthSession)session; var authSession = (AuthSession)session;
var charactersOfAccount = this.wonderkingContext.Accounts.FirstOrDefault(a => a.Id == authSession.AccountId); var charactersOfAccount = this._wonderkingContext.Accounts.FirstOrDefault(a => a.Id == authSession.AccountId);
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

View file

@ -13,23 +13,23 @@ using Packets.Outgoing;
public class LoginHandler : IPacketHandler<LoginInfoPacket> public class LoginHandler : IPacketHandler<LoginInfoPacket>
{ {
private readonly IConfiguration configuration; private readonly IConfiguration _configuration;
private readonly ILogger<LoginHandler> logger; private readonly ILogger<LoginHandler> _logger;
private readonly WonderkingContext wonderkingContext; private readonly WonderkingContext _wonderkingContext;
public LoginHandler(ILogger<LoginHandler> logger, WonderkingContext wonderkingContext, IConfiguration configuration) public LoginHandler(ILogger<LoginHandler> logger, WonderkingContext wonderkingContext, IConfiguration configuration)
{ {
this.logger = logger; this._logger = logger;
this.wonderkingContext = wonderkingContext; this._wonderkingContext = wonderkingContext;
this.configuration = configuration; this._configuration = configuration;
} }
public async Task HandleAsync(LoginInfoPacket packet, TcpSession session) public async Task HandleAsync(LoginInfoPacket packet, TcpSession session)
{ {
LoginResponseReason loginResponseReason; LoginResponseReason loginResponseReason;
this.logger.LogInformation("Login data: Username {Username} & Password {Password}", packet.Username, this._logger.LogInformation("Login data: Username {Username} & Password {Password}", packet.Username,
packet.Password); packet.Password);
var account = this.wonderkingContext.Accounts.FirstOrDefault(a => a.Username == packet.Username); var account = this._wonderkingContext.Accounts.FirstOrDefault(a => a.Username == packet.Username);
// https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Chea1t_Sheet.html#argon2id // https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Chea1t_Sheet.html#argon2id
// "Use Argon2id with a minimum configuration of 19 MiB of memory, an iteration count of 2, and 1 degree of parallelism." // "Use Argon2id with a minimum configuration of 19 MiB of memory, an iteration count of 2, and 1 degree of parallelism."
@ -41,22 +41,22 @@ public class LoginHandler : IPacketHandler<LoginInfoPacket>
}; };
if (account == null) if (account == null)
{ {
if (this.configuration.GetSection("Testing").GetValue<bool>("CreateAccountOnLogin")) if (this._configuration.GetSection("Testing").GetValue<bool>("CreateAccountOnLogin"))
{ {
argon2Id.Salt = RandomNumberGenerator.GetBytes(16); argon2Id.Salt = RandomNumberGenerator.GetBytes(16);
var finalAccount = var finalAccount =
await this.wonderkingContext.Accounts.AddAsync(new Account(packet.Username, Array.Empty<byte>(), "", await this._wonderkingContext.Accounts.AddAsync(new Account(packet.Username, Array.Empty<byte>(), "",
0, argon2Id.Salt)).ConfigureAwait(true); 0, argon2Id.Salt)).ConfigureAwait(true);
await this.wonderkingContext.SaveChangesAsync().ConfigureAwait(true); await this._wonderkingContext.SaveChangesAsync().ConfigureAwait(true);
argon2Id.AssociatedData = finalAccount.Entity.Id.ToByteArray(); argon2Id.AssociatedData = finalAccount.Entity.Id.ToByteArray();
finalAccount.Entity.Password = await argon2Id.GetBytesAsync(16).ConfigureAwait(true); finalAccount.Entity.Password = await argon2Id.GetBytesAsync(16).ConfigureAwait(true);
this.wonderkingContext.Accounts.Update(finalAccount.Entity); this._wonderkingContext.Accounts.Update(finalAccount.Entity);
loginResponseReason = LoginResponseReason.Ok; loginResponseReason = LoginResponseReason.Ok;
await this.wonderkingContext.SaveChangesAsync().ConfigureAwait(true); await this._wonderkingContext.SaveChangesAsync().ConfigureAwait(true);
} }
else else
{ {
this.logger.LogInformation("Requested account for user: {Username} does not exist", packet.Username); this._logger.LogInformation("Requested account for user: {Username} does not exist", packet.Username);
loginResponseReason = LoginResponseReason.AccountDoesNotExit; loginResponseReason = LoginResponseReason.AccountDoesNotExit;
} }
} }

View file

@ -1,4 +1,3 @@
#pragma warning disable AV1500
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
using MassTransit; using MassTransit;
@ -35,11 +34,10 @@ builder.Services.AddHostedService(provider => new WonderkingAuthServer(IPAddress
provider.GetService<IServiceProvider>() ?? throw new InvalidOperationException())); provider.GetService<IServiceProvider>() ?? throw new InvalidOperationException()));
using var host = builder.Build(); using var host = builder.Build();
await using (var scope = host.Services.CreateAsyncScope()) using (var scope = host.Services.CreateScope())
{ {
var db = scope.ServiceProvider.GetRequiredService<WonderkingContext>(); var db = scope.ServiceProvider.GetRequiredService<WonderkingContext>();
await db.Database.MigrateAsync().ConfigureAwait(true); await db.Database.MigrateAsync().ConfigureAwait(true);
} }
await host.RunAsync().ConfigureAwait(true); await host.RunAsync().ConfigureAwait(true);
#pragma warning restore AV1500

View file

@ -45,10 +45,6 @@
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1"/> <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1"/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0"/> <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0"/>
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0"/> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0"/>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.7.30">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="NetCoreServer" Version="7.0.0"/> <PackageReference Include="NetCoreServer" Version="7.0.0"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3"/> <PackageReference Include="Newtonsoft.Json" Version="13.0.3"/>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.11"/> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.11"/>
@ -61,6 +57,10 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog.Extensions.Logging.File" Version="3.0.0"/> <PackageReference Include="Serilog.Extensions.Logging.File" Version="3.0.0"/>
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.12.0.78982">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -17,35 +17,35 @@ using static DotNext.Metaprogramming.CodeGenerator;
public class PacketDistributorService : IHostedService public class PacketDistributorService : IHostedService
{ {
private readonly ConcurrentQueue<RawPacket> concurrentQueue; private readonly ConcurrentQueue<RawPacket> _concurrentQueue;
private readonly private readonly
ImmutableDictionary<OperationCode, ImmutableDictionary<OperationCode,
Func<byte[], IPacket>> deserializationMap; Func<byte[], IPacket>> _deserializationMap;
private readonly ILogger<PacketDistributorService> logger; private readonly ILogger<PacketDistributorService> _logger;
private readonly ConcurrentDictionary<OperationCode, object> packetHandlersInstantiation; private readonly ConcurrentDictionary<OperationCode, object> _packetHandlersInstantiation;
private readonly IServiceProvider serviceProvider; private readonly IServiceProvider _serviceProvider;
public PacketDistributorService(ILogger<PacketDistributorService> logger, IServiceProvider serviceProvider) public PacketDistributorService(ILogger<PacketDistributorService> logger, IServiceProvider serviceProvider)
{ {
this.concurrentQueue = new ConcurrentQueue<RawPacket>(); this._concurrentQueue = new ConcurrentQueue<RawPacket>();
this.logger = logger; this._logger = logger;
this.serviceProvider = serviceProvider; this._serviceProvider = serviceProvider;
var tempDeserializationMap = var tempDeserializationMap =
new Dictionary<OperationCode, Func<byte[], IPacket>>(); new Dictionary<OperationCode, Func<byte[], IPacket>>();
var executingAssembly = Assembly.GetExecutingAssembly(); var executingAssembly = Assembly.GetExecutingAssembly();
var packetsTypes = this.GetPacketsWithId(executingAssembly); var packetsTypes = this.GetPacketsWithId(executingAssembly);
var packetHandlers = this.GetAllPacketHandlersWithId(executingAssembly); var packetHandlers = this.GetAllPacketHandlersWithId(executingAssembly);
this.packetHandlersInstantiation = new ConcurrentDictionary<OperationCode, object>(); this._packetHandlersInstantiation = new ConcurrentDictionary<OperationCode, object>();
packetHandlers.ForEach(x => packetHandlers.ForEach(x =>
{ {
var packetHandler = var packetHandler =
ActivatorUtilities.GetServiceOrCreateInstance(this.serviceProvider, ActivatorUtilities.GetServiceOrCreateInstance(this._serviceProvider,
x.Value); x.Value);
this.packetHandlersInstantiation.TryAdd(x.Key, packetHandler); this._packetHandlersInstantiation.TryAdd(x.Key, packetHandler);
}); });
foreach (var packetsType in packetsTypes) foreach (var packetsType in packetsTypes)
{ {
@ -64,7 +64,7 @@ public class PacketDistributorService : IHostedService
tempDeserializationMap.Add(packetsType.Key, lambda); tempDeserializationMap.Add(packetsType.Key, lambda);
} }
this.deserializationMap = tempDeserializationMap.ToImmutableDictionary(); this._deserializationMap = tempDeserializationMap.ToImmutableDictionary();
} }
public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
@ -82,11 +82,11 @@ public class PacketDistributorService : IHostedService
if (packetsWithId is not { Count: 0 }) if (packetsWithId is not { Count: 0 })
{ {
packetsWithId.AsParallel() packetsWithId.AsParallel()
.ForAll(packet => this.logger.PacketWithIdAdded(packet.Key, packet.Value.FullName)); .ForAll(packet => this._logger.PacketWithIdAdded(packet.Key, packet.Value.FullName));
return packetsWithId; return packetsWithId;
} }
this.logger.NoPacketsFound(); this._logger.NoPacketsFound();
throw new IncompleteInitialization(); throw new IncompleteInitialization();
} }
@ -102,24 +102,24 @@ public class PacketDistributorService : IHostedService
if (packetHandlersWithId is not { Count: 0 }) if (packetHandlersWithId is not { Count: 0 })
{ {
packetHandlersWithId.AsParallel().ForAll(packetHandler => packetHandlersWithId.AsParallel().ForAll(packetHandler =>
this.logger.PacketHandlerWithIdAdded(packetHandler.Key, packetHandler.Value.FullName)); this._logger.PacketHandlerWithIdAdded(packetHandler.Key, packetHandler.Value.FullName));
return packetHandlersWithId; return packetHandlersWithId;
} }
this.logger.NoPacketHandlersFound(); this._logger.NoPacketHandlersFound();
throw new IncompleteInitialization(); throw new IncompleteInitialization();
} }
public void AddPacket(RawPacket rawPacket) public void AddPacket(RawPacket rawPacket)
{ {
this.concurrentQueue.Enqueue(rawPacket); this._concurrentQueue.Enqueue(rawPacket);
this.DequeueRawPacket(); this.DequeueRawPacket();
this.logger.PacketReceived(rawPacket.OperationCode); this._logger.PacketReceived(rawPacket.OperationCode);
} }
private void DequeueRawPacket() private void DequeueRawPacket()
{ {
if (this.concurrentQueue.TryDequeue(out var item)) if (this._concurrentQueue.TryDequeue(out var item))
{ {
ThreadPool.QueueUserWorkItem(this.InvokePacketHandler, item, true); ThreadPool.QueueUserWorkItem(this.InvokePacketHandler, item, true);
} }
@ -127,18 +127,18 @@ public class PacketDistributorService : IHostedService
private void InvokePacketHandler(RawPacket item) private void InvokePacketHandler(RawPacket item)
{ {
this.logger.PacketDequeued(item.Session.Id, item.OperationCode); this._logger.PacketDequeued(item.Session.Id, item.OperationCode);
if (!this.deserializationMap.TryGetValue(item.OperationCode, out var value)) if (!this._deserializationMap.TryGetValue(item.OperationCode, out var value))
{ {
this.logger.PacketTypeNotFound(item.OperationCode); this._logger.PacketTypeNotFound(item.OperationCode);
return; return;
} }
var packet = value(item.MessageBody); var packet = value(item.MessageBody);
this.logger.PacketData(JsonConvert.SerializeObject(packet)); this._logger.PacketData(JsonConvert.SerializeObject(packet));
this.packetHandlersInstantiation[item.OperationCode].GetType().GetMethod(nameof(IPacketHandler<IPacket>.HandleAsync)) this._packetHandlersInstantiation[item.OperationCode].GetType().GetMethod(nameof(IPacketHandler<IPacket>.HandleAsync))
?.Invoke(this.packetHandlersInstantiation[item.OperationCode], new object[] { packet, item.Session }); ?.Invoke(this._packetHandlersInstantiation[item.OperationCode], new object[] { packet, item.Session });
this.logger.PacketFinished(item.Session.Id, item.OperationCode); this._logger.PacketFinished(item.Session.Id, item.OperationCode);
} }
} }

View file

@ -9,14 +9,14 @@ using NetCoreServer;
public class WonderkingAuthServer : TcpServer, IHostedService public class WonderkingAuthServer : TcpServer, IHostedService
{ {
private readonly ILogger<WonderkingAuthServer> logger; private readonly ILogger<WonderkingAuthServer> _logger;
private readonly IServiceProvider serviceProvider; private readonly IServiceProvider _serviceProvider;
public WonderkingAuthServer(IPAddress address, int port, ILogger<WonderkingAuthServer> logger, public WonderkingAuthServer(IPAddress address, int port, ILogger<WonderkingAuthServer> logger,
IServiceProvider serviceProvider) : base(address, port) IServiceProvider serviceProvider) : base(address, port)
{ {
this.logger = logger; this._logger = logger;
this.serviceProvider = serviceProvider; this._serviceProvider = serviceProvider;
} }
public Task StartAsync(CancellationToken cancellationToken) public Task StartAsync(CancellationToken cancellationToken)
@ -32,31 +32,31 @@ public class WonderkingAuthServer : TcpServer, IHostedService
} }
protected override TcpSession CreateSession() => protected override TcpSession CreateSession() =>
ActivatorUtilities.CreateInstance<AuthSession>(this.serviceProvider, this); ActivatorUtilities.CreateInstance<AuthSession>(this._serviceProvider, this);
protected override void OnStarting() protected override void OnStarting()
{ {
this.logger.LogInformation("Starting"); this._logger.LogInformation("Starting");
base.OnStarting(); base.OnStarting();
} }
protected override void OnStarted() protected override void OnStarted()
{ {
this.logger.LogInformation("Started"); this._logger.LogInformation("Started");
base.OnStarted(); base.OnStarted();
} }
protected override void OnStopping() protected override void OnStopping()
{ {
this.logger.LogInformation("Stopping"); this._logger.LogInformation("Stopping");
base.OnStopping(); base.OnStopping();
} }
protected override void OnStopped() protected override void OnStopped()
{ {
this.logger.LogInformation("Stopped"); this._logger.LogInformation("Stopped");
base.OnStopped(); base.OnStopped();
} }
protected override void OnError(SocketError error) => this.logger.LogError("An error has occured {Error}", error); protected override void OnError(SocketError error) => this._logger.LogError("An error has occured {Error}", error);
} }

View file

@ -1,11 +0,0 @@
[*.cs]
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning
dotnet_style_require_accessibility_modifiers = never:warning
csharp_style_expression_bodied_methods = true:silent
csharp_style_expression_bodied_properties = true:warning
csharp_style_expression_bodied_indexers = true:warning
csharp_style_expression_bodied_accessors = true:warning

View file

@ -1,116 +0,0 @@
using Nuke.Common;
using Nuke.Common.Git;
using Nuke.Common.IO;
using Nuke.Common.Tools.Docker;
using Nuke.Common.Tools.DotNet;
using Nuke.Common.Tools.SonarScanner;
using Serilog;
sealed class Build : NukeBuild
{
/// Support plugins are available for:
/// - JetBrains ReSharper https://nuke.build/resharper
/// - JetBrains Rider https://nuke.build/rider
/// - Microsoft VisualStudio https://nuke.build/visualstudio
/// - Microsoft VSCode https://nuke.build/vscode
public static int Main() => Execute<Build>(x => x.Information, x => x.Deploy);
[Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")]
readonly Configuration Configuration = IsLocalBuild ? Configuration.Debug : Configuration.Release;
[Parameter] readonly bool SupportsDocker = true;
[Parameter] readonly string SonarToken;
[Parameter] readonly string SonarHostUrl;
GitRepository GitRepository => GitRepository.FromLocalDirectory(RootDirectory);
Target Information => _ => _
.Before(Clean)
.Executes(() =>
{
Log.Information("Branch Name: {BranchName}", GitRepository.Branch);
Log.Information("Commit: {Commit}", GitRepository.Commit);
});
Target Clean => _ => _
.Before(Restore)
.Executes(() => DotNetTasks.DotNetClean());
Target Restore => _ => _
.Executes(() => DotNetTasks.DotNetRestore());
Target Compile => _ => _
.DependsOn(Clean)
.DependsOn(Restore)
.Executes(() =>
{
if (IsLocalBuild && SupportsDocker)
{
DockerTasks.DockerStackRm(settings => settings.SetStacks("continuity"));
}
DotNetTasks.DotNetBuild(settings => settings.SetNoRestore(true));
});
Target Pack => _ => _
.DependsOn(SonarScan)
.Executes(() =>
{
if (!SupportsDocker)
{
return;
}
DockerTasks.DockerBuild(settings => settings
.SetPath(AbsolutePath.Create(RootDirectory))
.SetFile("Server/Dockerfile")
.SetTag("continuity-server:latest")
.SetCompress(true)
.SetProgress(ProgressType.auto));
if (!IsLocalBuild)
{
//DockerTasks.DockerPush(settings => settings.SetName("continuity-server:latest"));
}
});
Target SonarScan => _ => _.DependsOn(Compile).Executes(() =>
{
if (IsLocalBuild)
{
return;
}
var sonarScannerSettings = new SonarScannerBeginSettings()
.SetProjectKey("wonderking_continuity_AYeecUUTs-PH__JrTRky")
.SetLogin(SonarToken)
.SetServer(SonarHostUrl);
var sonarScannerEndSettings = new SonarScannerEndSettings().SetLogin(SonarToken);
SonarScannerTasks.SonarScannerBegin(sonarScannerSettings);
DotNetTasks.DotNetBuild(settings => settings.SetNoRestore(true));
SonarScannerTasks.SonarScannerEnd(sonarScannerEndSettings);
});
Target Deploy => _ => _.DependsOn(Pack).Executes(() =>
{
if (!SupportsDocker)
{
return;
}
DockerTasks.DockerPull(settings => settings.SetName("postgres:16.0-alpine"));
if (IsLocalBuild)
{
var dockerComposeFile = AbsolutePath.Create(RootDirectory / "Server" / "docker-compose.yml");
DockerTasks.DockerStackDeploy(settings => settings
.AddComposeFile(dockerComposeFile)
.SetStack("continuity")
.SetPrune(true)
);
return;
}
Log.Error("Deploy is only available on local builds.");
});
}

View file

@ -1,11 +0,0 @@
using System.ComponentModel;
using Nuke.Common.Tooling;
[TypeConverter(typeof(TypeConverter<Configuration>))]
public class Configuration : Enumeration
{
public static Configuration Debug { get; } = new() { Value = nameof(Debug) };
public static Configuration Release { get; } = new() { Value = nameof(Release) };
public static implicit operator string(Configuration configuration) => configuration.Value;
}

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This file prevents unintended imports of unrelated MSBuild files -->
<!-- Uncomment to include parent Directory.Build.props file -->
<!--<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />-->
</Project>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This file prevents unintended imports of unrelated MSBuild files -->
<!-- Uncomment to include parent Directory.Build.targets file -->
<!--<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)../'))" />-->
</Project>

View file

@ -1,23 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<RootNamespace></RootNamespace>
<NoWarn>CS0649;CS0169;CA1050;CA1822;CA2211;IDE1006</NoWarn>
<NukeRootDirectory>..</NukeRootDirectory>
<NukeScriptDirectory>..</NukeScriptDirectory>
<NukeTelemetryVersion>1</NukeTelemetryVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Nuke.Common" Version="7.0.6" />
</ItemGroup>
<ItemGroup>
<PackageDownload Include="coverlet.console" Version="[6.0.0]" />
<PackageDownload Include="dotnet-sonarscanner" Version="[5.14.0]" />
</ItemGroup>
</Project>

View file

@ -1,28 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=HeapView_002EDelegateAllocation/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=VariableHidesOuterVariable/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ClassNeverInstantiated_002EGlobal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=MemberCanBeMadeStatic_002ELocal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=InterpolatedStringExpressionIsNotIFormattable/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/DEFAULT_INTERNAL_MODIFIER/@EntryValue">Implicit</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/DEFAULT_PRIVATE_MODIFIER/@EntryValue">Implicit</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/METHOD_OR_OPERATOR_BODY/@EntryValue">ExpressionBody</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpCodeStyle/ThisQualifier/INSTANCE_MEMBERS_QUALIFY_MEMBERS/@EntryValue">0</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue">NEXT_LINE</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_USER_LINEBREAKS/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_AFTER_INVOCATION_LPAR/@EntryValue">False</s:Boolean>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/MAX_ATTRIBUTE_LENGTH_FOR_SAME_LINE/@EntryValue">120</s:Int64>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">IF_OWNER_IS_SINGLE_LINE</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_ARGUMENTS_STYLE/@EntryValue">WRAP_IF_LONG</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_ANONYMOUSMETHOD_ON_SINGLE_LINE/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpRenamePlacementToArrangementMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>