From 4db145fd9359edb6d8f50cd3a2f23e5038436fcd Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Sat, 24 Dec 2022 00:53:05 +0000 Subject: [PATCH] Initial commit --- .editorconfig | 684 ++++++++++++++++++++++++++++++++++++++++++++ .gitignore | 38 +++ CONTRIBUTING.md | 34 +++ Dockerfile | 18 ++ LICENSE.md | 7 + README.md | 68 +++++ USAGE.md | 84 ++++++ config.example.json | 26 ++ example.env | 1 + global.json | 7 + icon.png | Bin 0 -> 53918 bytes 11 files changed, 967 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 USAGE.md create mode 100644 config.example.json create mode 100644 example.env create mode 100644 global.json create mode 100644 icon.png diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..772e07a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,684 @@ +[*] +charset = utf-8-bom +end_of_line = crlf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 130 +tab_width = 4 +trim_trailing_whitespace = false +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = false +ij_smart_tabs = false +ij_visual_guides = none +ij_wrap_on_typing = false + +[*.css] +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false +ij_less_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.properties] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false +ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false +ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.styl] +indent_size = 2 +ij_stylus_align_closing_brace_with_properties = false +ij_stylus_blank_lines_around_nested_selector = 1 +ij_stylus_blank_lines_between_blocks = 1 +ij_stylus_brace_placement = 0 +ij_stylus_enforce_quotes_on_format = false +ij_stylus_hex_color_long_format = false +ij_stylus_hex_color_lower_case = false +ij_stylus_hex_color_short_format = false +ij_stylus_hex_color_upper_case = false +ij_stylus_keep_blank_lines_in_code = 2 +ij_stylus_keep_indents_on_empty_lines = false +ij_stylus_keep_single_line_blocks = false +ij_stylus_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow +ij_stylus_space_after_colon = true +ij_stylus_space_before_opening_brace = true +ij_stylus_use_double_quotes = true +ij_stylus_value_alignment = 0 + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant,*.appxmanifest,*.axml,*.cscfg,*.csdef,*.disco,*.filelayout,*.fxml,*.jhm,*.jnlp,*.jrxml,*.manifest,*.myapp,*.nuspec,*.rng,*.stylecop,*.svcmap,*.tld,*.tps,*.wadcfgx,*.webref,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,StyleCop.Cache}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal + +[{*.ats,*.cts,*.mts,*.ts}] +ij_continuation_indent_size = 4 +ij_typescript_align_imports = false +ij_typescript_align_multiline_array_initializer_expression = false +ij_typescript_align_multiline_binary_operation = false +ij_typescript_align_multiline_chained_methods = false +ij_typescript_align_multiline_extends_list = false +ij_typescript_align_multiline_for = true +ij_typescript_align_multiline_parameters = true +ij_typescript_align_multiline_parameters_in_calls = false +ij_typescript_align_multiline_ternary_operation = false +ij_typescript_align_object_properties = 0 +ij_typescript_align_union_types = false +ij_typescript_align_var_statements = 0 +ij_typescript_array_initializer_new_line_after_left_brace = false +ij_typescript_array_initializer_right_brace_on_new_line = false +ij_typescript_array_initializer_wrap = off +ij_typescript_assignment_wrap = off +ij_typescript_binary_operation_sign_on_next_line = false +ij_typescript_binary_operation_wrap = off +ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +ij_typescript_blank_lines_around_class = 1 +ij_typescript_blank_lines_around_field = 0 +ij_typescript_blank_lines_around_field_in_interface = 0 +ij_typescript_blank_lines_around_function = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = end_of_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true +ij_typescript_call_parameters_new_line_after_left_paren = false +ij_typescript_call_parameters_right_paren_on_new_line = false +ij_typescript_call_parameters_wrap = off +ij_typescript_catch_on_new_line = false +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = end_of_line +ij_typescript_comma_on_new_line = false +ij_typescript_do_while_brace_force = never +ij_typescript_else_on_new_line = false +ij_typescript_enforce_trailing_comma = keep +ij_typescript_enum_constants_wrap = on_every_item +ij_typescript_extends_keyword_wrap = off +ij_typescript_extends_list_wrap = off +ij_typescript_field_prefix = _ +ij_typescript_file_name_style = relaxed +ij_typescript_finally_on_new_line = false +ij_typescript_for_brace_force = never +ij_typescript_for_statement_new_line_after_left_paren = false +ij_typescript_for_statement_right_paren_on_new_line = false +ij_typescript_for_statement_wrap = off +ij_typescript_force_quote_style = false +ij_typescript_force_semicolon_style = false +ij_typescript_function_expression_brace_style = end_of_line +ij_typescript_if_brace_force = never +ij_typescript_import_merge_members = global +ij_typescript_import_prefer_absolute_path = global +ij_typescript_import_sort_members = true +ij_typescript_import_sort_module_name = false +ij_typescript_import_use_node_resolution = true +ij_typescript_imports_wrap = on_every_item +ij_typescript_indent_case_from_switch = true +ij_typescript_indent_chained_calls = true +ij_typescript_indent_package_children = 0 +ij_typescript_jsdoc_include_types = false +ij_typescript_jsx_attribute_value = braces +ij_typescript_keep_blank_lines_in_code = 2 +ij_typescript_keep_first_column_comment = true +ij_typescript_keep_indents_on_empty_lines = false +ij_typescript_keep_line_breaks = true +ij_typescript_keep_simple_blocks_in_one_line = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = end_of_line +ij_typescript_method_call_chain_wrap = off +ij_typescript_method_parameters_new_line_after_left_paren = false +ij_typescript_method_parameters_right_paren_on_new_line = false +ij_typescript_method_parameters_wrap = off +ij_typescript_object_literal_wrap = on_every_item +ij_typescript_parentheses_expression_new_line_after_left_paren = false +ij_typescript_parentheses_expression_right_paren_on_new_line = false +ij_typescript_place_assignment_sign_on_next_line = false +ij_typescript_prefer_as_type_cast = false +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false +ij_typescript_prefer_parameters_wrap = false +ij_typescript_reformat_c_style_comments = false +ij_typescript_space_after_colon = true +ij_typescript_space_after_comma = true +ij_typescript_space_after_dots_in_rest_parameter = false +ij_typescript_space_after_generator_mult = true +ij_typescript_space_after_property_colon = true +ij_typescript_space_after_quest = true +ij_typescript_space_after_type_colon = true +ij_typescript_space_after_unary_not = false +ij_typescript_space_before_async_arrow_lparen = true +ij_typescript_space_before_catch_keyword = true +ij_typescript_space_before_catch_left_brace = true +ij_typescript_space_before_catch_parentheses = true +ij_typescript_space_before_class_lbrace = true +ij_typescript_space_before_class_left_brace = true +ij_typescript_space_before_colon = true +ij_typescript_space_before_comma = false +ij_typescript_space_before_do_left_brace = true +ij_typescript_space_before_else_keyword = true +ij_typescript_space_before_else_left_brace = true +ij_typescript_space_before_finally_keyword = true +ij_typescript_space_before_finally_left_brace = true +ij_typescript_space_before_for_left_brace = true +ij_typescript_space_before_for_parentheses = true +ij_typescript_space_before_for_semicolon = false +ij_typescript_space_before_function_left_parenth = true +ij_typescript_space_before_generator_mult = false +ij_typescript_space_before_if_left_brace = true +ij_typescript_space_before_if_parentheses = true +ij_typescript_space_before_method_call_parentheses = false +ij_typescript_space_before_method_left_brace = true +ij_typescript_space_before_method_parentheses = false +ij_typescript_space_before_property_colon = false +ij_typescript_space_before_quest = true +ij_typescript_space_before_switch_left_brace = true +ij_typescript_space_before_switch_parentheses = true +ij_typescript_space_before_try_left_brace = true +ij_typescript_space_before_type_colon = false +ij_typescript_space_before_unary_not = false +ij_typescript_space_before_while_keyword = true +ij_typescript_space_before_while_left_brace = true +ij_typescript_space_before_while_parentheses = true +ij_typescript_spaces_around_additive_operators = true +ij_typescript_spaces_around_arrow_function_operator = true +ij_typescript_spaces_around_assignment_operators = true +ij_typescript_spaces_around_bitwise_operators = true +ij_typescript_spaces_around_equality_operators = true +ij_typescript_spaces_around_logical_operators = true +ij_typescript_spaces_around_multiplicative_operators = true +ij_typescript_spaces_around_relational_operators = true +ij_typescript_spaces_around_shift_operators = true +ij_typescript_spaces_around_unary_operator = false +ij_typescript_spaces_within_array_initializer_brackets = false +ij_typescript_spaces_within_brackets = false +ij_typescript_spaces_within_catch_parentheses = false +ij_typescript_spaces_within_for_parentheses = false +ij_typescript_spaces_within_if_parentheses = false +ij_typescript_spaces_within_imports = false +ij_typescript_spaces_within_interpolation_expressions = false +ij_typescript_spaces_within_method_call_parentheses = false +ij_typescript_spaces_within_method_parentheses = false +ij_typescript_spaces_within_object_literal_braces = false +ij_typescript_spaces_within_object_type_braces = true +ij_typescript_spaces_within_parentheses = false +ij_typescript_spaces_within_switch_parentheses = false +ij_typescript_spaces_within_type_assertion = false +ij_typescript_spaces_within_union_types = true +ij_typescript_spaces_within_while_parentheses = false +ij_typescript_special_else_if_treatment = true +ij_typescript_ternary_operation_signs_on_next_line = false +ij_typescript_ternary_operation_wrap = off +ij_typescript_union_types_wrap = on_every_item +ij_typescript_use_chained_calls_group_indents = false +ij_typescript_use_double_quotes = true +ij_typescript_use_explicit_js_extension = auto +ij_typescript_use_path_mapping = always +ij_typescript_use_public_modifier = false +ij_typescript_use_semicolon_after_statement = true +ij_typescript_var_declaration_wrap = normal +ij_typescript_while_brace_force = never +ij_typescript_while_on_new_line = false +ij_typescript_wrap_comments = false + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.cjs,*.js}] +ij_continuation_indent_size = 4 +ij_javascript_align_imports = false +ij_javascript_align_multiline_array_initializer_expression = false +ij_javascript_align_multiline_binary_operation = false +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = false +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = false +ij_javascript_align_multiline_ternary_operation = false +ij_javascript_align_object_properties = 0 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 0 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = off +ij_javascript_assignment_wrap = off +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = off +ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = off +ij_javascript_catch_on_new_line = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = never +ij_javascript_else_on_new_line = false +ij_javascript_enforce_trailing_comma = keep +ij_javascript_extends_keyword_wrap = off +ij_javascript_extends_list_wrap = off +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = false +ij_javascript_for_brace_force = never +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = off +ij_javascript_force_quote_style = false +ij_javascript_force_semicolon_style = false +ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_if_brace_force = never +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = global +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = false +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = end_of_line +ij_javascript_method_call_chain_wrap = off +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = off +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = false +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_reformat_c_style_comments = false +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = true +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = true +ij_javascript_space_before_catch_parentheses = true +ij_javascript_space_before_class_lbrace = true +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = true +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = true +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = true +ij_javascript_space_before_for_left_brace = true +ij_javascript_space_before_for_parentheses = true +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = true +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = true +ij_javascript_space_before_if_parentheses = true +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = true +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = true +ij_javascript_space_before_switch_parentheses = true +ij_javascript_space_before_try_left_brace = true +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = true +ij_javascript_space_before_while_parentheses = true +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = off +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = false +ij_javascript_use_double_quotes = true +ij_javascript_use_explicit_js_extension = auto +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = never +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.cjsx,*.coffee}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_coffeescript_align_function_body = false +ij_coffeescript_align_imports = false +ij_coffeescript_align_multiline_array_initializer_expression = true +ij_coffeescript_align_multiline_parameters = true +ij_coffeescript_align_multiline_parameters_in_calls = false +ij_coffeescript_align_object_properties = 0 +ij_coffeescript_align_union_types = false +ij_coffeescript_align_var_statements = 0 +ij_coffeescript_array_initializer_new_line_after_left_brace = false +ij_coffeescript_array_initializer_right_brace_on_new_line = false +ij_coffeescript_array_initializer_wrap = normal +ij_coffeescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** +ij_coffeescript_blank_lines_around_function = 1 +ij_coffeescript_call_parameters_new_line_after_left_paren = false +ij_coffeescript_call_parameters_right_paren_on_new_line = false +ij_coffeescript_call_parameters_wrap = normal +ij_coffeescript_chained_call_dot_on_new_line = true +ij_coffeescript_comma_on_new_line = false +ij_coffeescript_enforce_trailing_comma = keep +ij_coffeescript_field_prefix = _ +ij_coffeescript_file_name_style = relaxed +ij_coffeescript_force_quote_style = false +ij_coffeescript_force_semicolon_style = false +ij_coffeescript_function_expression_brace_style = end_of_line +ij_coffeescript_import_merge_members = global +ij_coffeescript_import_prefer_absolute_path = global +ij_coffeescript_import_sort_members = true +ij_coffeescript_import_sort_module_name = false +ij_coffeescript_import_use_node_resolution = true +ij_coffeescript_imports_wrap = on_every_item +ij_coffeescript_indent_chained_calls = true +ij_coffeescript_indent_package_children = 0 +ij_coffeescript_jsx_attribute_value = braces +ij_coffeescript_keep_blank_lines_in_code = 2 +ij_coffeescript_keep_first_column_comment = true +ij_coffeescript_keep_indents_on_empty_lines = false +ij_coffeescript_keep_line_breaks = true +ij_coffeescript_keep_simple_methods_in_one_line = false +ij_coffeescript_method_parameters_new_line_after_left_paren = false +ij_coffeescript_method_parameters_right_paren_on_new_line = false +ij_coffeescript_method_parameters_wrap = off +ij_coffeescript_object_literal_wrap = on_every_item +ij_coffeescript_prefer_as_type_cast = false +ij_coffeescript_prefer_explicit_types_function_expression_returns = false +ij_coffeescript_prefer_explicit_types_function_returns = false +ij_coffeescript_prefer_explicit_types_vars_fields = false +ij_coffeescript_reformat_c_style_comments = false +ij_coffeescript_space_after_comma = true +ij_coffeescript_space_after_dots_in_rest_parameter = false +ij_coffeescript_space_after_generator_mult = true +ij_coffeescript_space_after_property_colon = true +ij_coffeescript_space_after_type_colon = true +ij_coffeescript_space_after_unary_not = false +ij_coffeescript_space_before_async_arrow_lparen = true +ij_coffeescript_space_before_class_lbrace = true +ij_coffeescript_space_before_comma = false +ij_coffeescript_space_before_function_left_parenth = true +ij_coffeescript_space_before_generator_mult = false +ij_coffeescript_space_before_property_colon = false +ij_coffeescript_space_before_type_colon = false +ij_coffeescript_space_before_unary_not = false +ij_coffeescript_spaces_around_additive_operators = true +ij_coffeescript_spaces_around_arrow_function_operator = true +ij_coffeescript_spaces_around_assignment_operators = true +ij_coffeescript_spaces_around_bitwise_operators = true +ij_coffeescript_spaces_around_equality_operators = true +ij_coffeescript_spaces_around_logical_operators = true +ij_coffeescript_spaces_around_multiplicative_operators = true +ij_coffeescript_spaces_around_relational_operators = true +ij_coffeescript_spaces_around_shift_operators = true +ij_coffeescript_spaces_around_unary_operator = false +ij_coffeescript_spaces_within_array_initializer_braces = false +ij_coffeescript_spaces_within_array_initializer_brackets = false +ij_coffeescript_spaces_within_imports = false +ij_coffeescript_spaces_within_index_brackets = false +ij_coffeescript_spaces_within_interpolation_expressions = false +ij_coffeescript_spaces_within_method_call_parentheses = false +ij_coffeescript_spaces_within_method_parentheses = false +ij_coffeescript_spaces_within_object_braces = false +ij_coffeescript_spaces_within_object_literal_braces = false +ij_coffeescript_spaces_within_object_type_braces = true +ij_coffeescript_spaces_within_range_brackets = false +ij_coffeescript_spaces_within_type_assertion = false +ij_coffeescript_spaces_within_union_types = true +ij_coffeescript_union_types_wrap = on_every_item +ij_coffeescript_use_chained_calls_group_indents = false +ij_coffeescript_use_double_quotes = true +ij_coffeescript_use_explicit_js_extension = auto +ij_coffeescript_use_path_mapping = always +ij_coffeescript_use_public_modifier = false +ij_coffeescript_use_semicolon_after_statement = false +ij_coffeescript_var_declaration_wrap = normal + +[{*.har,*.inputactions,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}] +indent_size = 2 +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = true +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p +ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a, abbr, acronym, b, basefont, bdo, big, br, cite, cite, code, dfn, em, font, i, img, input, kbd, label, q, s, samp, select, small, span, strike, strong, sub, sup, textarea, tt, u, var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span, pre, textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d9b9e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +.env +*.swp +*.*~ +project.lock.json +.DS_Store +*.pyc +nupkg/ + +# Visual Studio Code +.vscode + +# Rider +.idea + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +msbuild.log +msbuild.err +msbuild.wrn + +# Visual Studio 2015 +.vs/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..559a38c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,34 @@ +# Contribution Guidelines + +When contributing to this repository, please first discuss the change you wish to make by contacting one of the bot developers in the Discord server, or by creating a [discussion](https://github.com/oliverbooth/BrackeysBot/discussions) here in this repository. + +Please note we have a code of conduct, please follow it in all your interactions with the project. + +## Pull Request Process +1. Update [README.md](README.md) outlining any necessary changes made to the project - do not leave this down to the repository owners. +2. Do not increase any version numbers. This process is done by us when we feel it necessary to do so. +3. This repository, and its child repositories, follow Microsoft's [C# coding conventions](https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) and [.NET design guidelines](https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/). Please adhere to these conventions and guidelines. Pull requests which do not fall in line with the code style will be left open until this is adhered to (and may be closed at any time if we feel the changes will not be agreed upon.) + +## Code Style +Where Microsoft's conventions do not suffice, an .editorconfig is provided in the repository which should integrate with Visual Studio or Rider to automate the process. This .editorconfig should roughly coincide with [StyleCop rules](https://github.com/DotNetAnalyzers/StyleCopAnalyzers/tree/master/documentation), with some minor exceptions. + +### Comments +**Please use comments sparingly!** The use of comments to outline what a particular block of code is doing is usually indicative of the code is not being clear enough in its own right. If you feel that a comment is required to clarify logic, consider refactoring the code to includes having meaningfully named variables and methods so that a comment is redundant. + +An example of comment types which would be unacceptable: +```cs +foreach (char character in someString) // loop through every char in the string +{ + Console.WriteLine(character); // print out each character on a new line +} +``` + +The exception to this is if the comment is explaining the "why" rather than the "what". A comment which outlines the rationale behind a specific solution is acceptable. For example: +```cs +for (var index = 0; index < someString.Length; index++) // cheaper than foreach, no allocation of CharEnumerator +{ + char character = someString[index]; + Console.WriteLine(character); +} +``` +In such a case, the comment is not explaining what the code does - but why it does it that way, rather than a different way. This type of comment is accepted and encouraged. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4219b7d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base +WORKDIR /app + +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /src +COPY ["Present/Present.csproj", "Present/"] +RUN dotnet restore "Present/Present.csproj" +COPY . . +WORKDIR "/src/Present" +RUN dotnet build "Present.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Present.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Present.dll"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..34de789 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2022 Oliver Booth + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7d785cd --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +

Present

+

+

A Discord bot for managing giveaways.

+

+ +GitHub Workflow Status +GitHub Issues +MIT License +

+ +## About +Present is a Discord bot which manages giveaways in your server. It is capable of allowing multiple winners, as well as excluding specific users and roles form being able to win. + +## Installing and configuring Present +Present runs in a Docker container, and there is a [docker-compose.yaml](docker-compose.yaml) file which simplifies this process. + +### Clone the repository +To start off, clone the repository into your desired directory: +```bash +git clone https://github.com/BrackeysBot/Present.git +``` +Step into the Present directory using `cd Present`, and continue with the steps below. + +### Setting things up +The bot's token is passed to the container using the `DISCORD_TOKEN` environment variable. Define this environment variable whichever way is most convenient for you. + +Two directories are required to exist for Docker compose to mount as container volumes. A folder for persistent data, and a folder for logs: +```bash +sudo mkdir /etc/brackeysbot/present +sudo mkdir /var/log/brackeysbot/present +``` +Copy the example `config.example.json` to `/etc/brackeysbot/present/config.json`, and assign the necessary config keys. Below is breakdown of the config.json layout: +```json +{ + "GUILD_ID": { + "logChannel": /* The ID of the log channel */, + "giveawayColor": /* The primary branding colour, as a 24-bit RGB integer. Defaults to #7837FF */ + } +} +``` +The `logs` directory is used to store logs in a format similar to that of a Minecraft server. `latest.log` will contain the log for the current day and current execution. All past logs are archived. + +The `data` directory is used to store persistent state of the bot, such as config values and the infraction database. + +### Launch Present +To launch Present, simply run the following commands: +```bash +sudo docker-compose build +sudo docker-compose up --detach +``` + +## Updating Present +To update Present, simply pull the latest changes from the repo and restart the container: +```bash +git pull +sudo docker-compose stop +sudo docker-compose build +sudo docker-compose up --detach +``` + +## Using Present +For further usage breakdown and explanation of commands, see [USAGE.md](USAGE.md). + +## License +This bot is under the [MIT License](LICENSE.md). + +## Disclaimer +This bot is tailored for use within the [Brackeys Discord server](https://discord.gg/brackeys). While this bot is open source and you are free to use it in your own servers, you accept responsibility for any mishaps which may arise from the use of this software. Use at your own risk. diff --git a/USAGE.md b/USAGE.md new file mode 100644 index 0000000..9da6eb0 --- /dev/null +++ b/USAGE.md @@ -0,0 +1,84 @@ +# Slash Commands + +Below is an outline of every slash command currently implemented in Present, along with their descriptions and parameters. + +## User Blocking + +If you wish for a certain user to be discarded as a potential winner of giveaways, you can block them using the following command. +This does not prevent the user from joining the giveaway, but they will not be considered when determining a winner. + +### `/giveaway blockuser` + +Prevent a user from winning giveaways. + +| Parameter | Required | Type | Description | +|:----------|:---------|:-------------------|:--------------------------| +| user | ✅ Yes | User mention or ID | The user to block. | +| reason | ❌ No | String | The reason for the block. | + +### `/giveaway unblockuser` + +Unblocks a user, so that they are able to win giveaways. + +| Parameter | Required | Type | Description | +|:----------|:---------|:-------------------|:---------------------| +| user | ✅ Yes | User mention or ID | The user to unblock. | + +## Role Blocking + +If you wish for members with a certain role to be discarded as potential winners of giveaways, you can block them using the +following command. +This does not prevent members with that role from joining the giveaway, but they will not be considered when determining a winner. + +### `/giveaway blockrole` + +Prevent members with the role from winning giveaways. + +| Parameter | Required | Type | Description | +|:----------|:---------|:-------------------|:--------------------------| +| role | ✅ Yes | Role mention or ID | The role to block. | +| reason | ❌ No | String | The reason for the block. | + +### `/giveaway unblockrole` + +Unblocks a role, so that members with that role are able to win giveaways. + +| Parameter | Required | Type | Description | +|:----------|:---------|:-------------------|:---------------------| +| role | ✅ Yes | Role mention or ID | The role to unblock. | + +## Giveaway Management + +### `/giveaway create` + +Creates a new giveaway. + +| Parameter | Required | Type | Description | +|:------------|:---------|:----------------------|:--------------------------------------------------| +| channel | ✅ Yes | Channel mention or ID | The channel in which the giveaway will be hosted. | +| winnerCount | ✅ Yes | Integer | The number of winners for this giveaway. | + +Following this command, a modal will appear in which you can specify the giveaway's title, description, end time, and image URL. +The end time can either be a relative time (e.g. 1w3d) or a Unix timestamp in seconds (e.g. 1734998400). +The title cannot exceed 255 characters, and the description cannot exceed 4000 characters. +The image URL must be a valid URI, or an empty string. + +### `/giveaway end` + +Prematurely ends an ongoing giveaway. This command bypasses the winner selection. + +| Parameter | Required | Type | Description | +|:----------|:---------|:----------|:-------------------------------| +| id | ✅ Yes | ShortGuid | The ID of the giveaway to end. | + +### `/giveaway view` + +Views the details of a giveaway. + +| Parameter | Required | Type | Description | +|:----------|:---------|:----------|:--------------------------------| +| id | ✅ Yes | ShortGuid | The ID of the giveaway to view. | + +# Ephemeral responses + +None of the commands respond ephemerally, unless an error occurs. diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..fd9c14d --- /dev/null +++ b/config.example.json @@ -0,0 +1,26 @@ +{ + "GUILD_ID": { + "logChannel": 0, + "primaryColor": 7878655, + "secondaryColor": 14892140, + "tertiaryColor": 16769110, + "urgentReportThreshold": 5, + "mute": { + "gagDuration": 300000, + "maxModeratorMuteDuration": 1210000000 + }, + "reactions": { + "deleteMessageReaction": ":wastebasket:", + "gagReaction": ":mute:", + "historyReaction": ":clock4:", + "reportReaction": ":triangular_flag_on_post:", + "trackReaction": ":mag:" + }, + "roles": { + "administratorRoleId": 0, + "guruRoleId": 0, + "moderatorRoleId": 0, + "mutedRoleId": 0 + } + } +} diff --git a/example.env b/example.env new file mode 100644 index 0000000..3f200c2 --- /dev/null +++ b/example.env @@ -0,0 +1 @@ +DISCORD_TOKEN=set_token_here \ No newline at end of file diff --git a/global.json b/global.json new file mode 100644 index 0000000..1bcf6c0 --- /dev/null +++ b/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "6.0.0", + "rollForward": "latestMinor", + "allowPrerelease": false + } +} \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9abf7cd73addce9c190c289b7733b415aef42aea GIT binary patch literal 53918 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 FV1gGS*I@tv literal 0 HcmV?d00001