Skip to content

Commit b1d2e84

Browse files
committed
🚧 Killfeed pre-release WIP
1 parent 18335cc commit b1d2e84

File tree

14 files changed

+478
-135
lines changed

14 files changed

+478
-135
lines changed

‎.editorconfig‎

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = crlf
6+
indent_style = tab
7+
8+
[*.{csproj,json,props,targets,xslt,yaml,yml}]
9+
indent_style = space
10+
indent_size = 2
11+
12+
[*.cs]
13+
# Organize usings
14+
dotnet_separate_import_directive_groups = false
15+
dotnet_sort_system_directives_first = true
16+
file_header_template = unset
17+
18+
csharp_using_directive_placement = outside_namespace:silent
19+
csharp_prefer_simple_using_statement = true:suggestion
20+
csharp_prefer_braces = true:silent
21+
csharp_style_namespace_declarations = file_scoped:suggestion
22+
csharp_style_prefer_method_group_conversion = true:silent
23+
csharp_style_prefer_top_level_statements = true:silent
24+
csharp_style_expression_bodied_methods = false:silent
25+
csharp_style_expression_bodied_constructors = false:silent
26+
csharp_style_expression_bodied_operators = false:silent
27+
csharp_style_expression_bodied_properties = true:silent
28+
csharp_style_expression_bodied_indexers = true:silent
29+
csharp_style_expression_bodied_accessors = true:silent
30+
csharp_style_expression_bodied_lambdas = true:silent
31+
csharp_style_expression_bodied_local_functions = false:silent
32+
csharp_indent_labels = one_less_than_current
33+
csharp_space_around_binary_operators = before_and_after
34+
csharp_style_throw_expression = true:suggestion
35+
csharp_prefer_simple_default_expression = true:suggestion
36+
csharp_style_prefer_null_check_over_type_check = true:suggestion
37+
csharp_style_prefer_index_operator = true:suggestion
38+
csharp_style_prefer_local_over_anonymous_function = true:suggestion
39+
csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
40+
csharp_style_prefer_range_operator = true:suggestion
41+
csharp_style_prefer_tuple_swap = true:suggestion
42+
csharp_style_prefer_utf8_string_literals = true:suggestion
43+
csharp_style_inlined_variable_declaration = true:suggestion
44+
csharp_style_deconstructed_variable_declaration = true:suggestion
45+
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
46+
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
47+
csharp_prefer_static_local_function = true:suggestion
48+
csharp_style_prefer_readonly_struct = true:suggestion
49+
csharp_style_prefer_readonly_struct_member = true:suggestion
50+
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
51+
csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
52+
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
53+
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
54+
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
55+
csharp_style_conditional_delegate_call = true:suggestion
56+
csharp_style_prefer_switch_expression = true:suggestion
57+
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
58+
csharp_style_prefer_pattern_matching = true:silent
59+
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
60+
csharp_style_prefer_not_pattern = true:suggestion
61+
csharp_style_prefer_extended_property_pattern = true:suggestion
62+
csharp_style_var_for_built_in_types = false:silent
63+
csharp_style_var_when_type_is_apparent = false:silent
64+
csharp_style_var_elsewhere = false:silent
65+
[*.{cs,vb}]
66+
#### Naming styles ####
67+
68+
# Naming rules
69+
70+
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
71+
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
72+
dotnet_naming_rule.interface_should_be_begins_with_i.style = pascal_case
73+
74+
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
75+
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
76+
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
77+
78+
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
79+
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
80+
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
81+
82+
# Symbol specifications
83+
84+
dotnet_naming_symbols.interface.applicable_kinds = interface
85+
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
86+
dotnet_naming_symbols.interface.required_modifiers =
87+
88+
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
89+
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
90+
dotnet_naming_symbols.types.required_modifiers =
91+
92+
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
93+
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
94+
dotnet_naming_symbols.non_field_members.required_modifiers =
95+
96+
# Naming styles
97+
98+
dotnet_naming_style.begins_with_i.required_prefix = I
99+
dotnet_naming_style.begins_with_i.required_suffix =
100+
dotnet_naming_style.begins_with_i.word_separator =
101+
dotnet_naming_style.begins_with_i.capitalization = pascal_case
102+
103+
dotnet_naming_style.pascal_case.required_prefix =
104+
dotnet_naming_style.pascal_case.required_suffix =
105+
dotnet_naming_style.pascal_case.word_separator =
106+
dotnet_naming_style.pascal_case.capitalization = pascal_case
107+
108+
dotnet_naming_style.pascal_case.required_prefix =
109+
dotnet_naming_style.pascal_case.required_suffix =
110+
dotnet_naming_style.pascal_case.word_separator =
111+
dotnet_naming_style.pascal_case.capitalization = pascal_case
112+
dotnet_style_coalesce_expression = true:suggestion
113+
dotnet_style_null_propagation = true:suggestion
114+
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
115+
dotnet_style_prefer_auto_properties = true:silent
116+
dotnet_style_object_initializer = true:suggestion
117+
dotnet_style_collection_initializer = true:suggestion
118+
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
119+
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
120+
dotnet_style_prefer_conditional_expression_over_return = true:silent
121+
dotnet_style_explicit_tuple_names = true:suggestion
122+
dotnet_style_prefer_inferred_tuple_names = true:suggestion
123+
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
124+
dotnet_style_operator_placement_when_wrapping = beginning_of_line
125+
tab_width = 4
126+
indent_size = 4
127+
insert_final_newline = true
128+
dotnet_style_prefer_compound_assignment = true:suggestion
129+
dotnet_style_prefer_simplified_interpolation = true:suggestion
130+
dotnet_style_namespace_match_folder = true:suggestion
131+
dotnet_style_readonly_field = true:suggestion
132+
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
133+
dotnet_style_predefined_type_for_member_access = true:silent
134+
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
135+
dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
136+
dotnet_style_allow_multiple_blank_lines_experimental = true:silent
137+
dotnet_code_quality_unused_parameters = all:suggestion
138+
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
139+
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
140+
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
141+
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
142+
dotnet_style_qualification_for_field = false:silent
143+
dotnet_style_qualification_for_property = false:silent
144+
dotnet_style_qualification_for_method = false:silent
145+
dotnet_style_qualification_for_event = false:silent
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
pull_request:
7+
branches: ["main"]
8+
9+
jobs:
10+
build:
11+
permissions:
12+
contents: write
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: Setup .NET
17+
uses: actions/setup-dotnet@v2
18+
with:
19+
dotnet-version: 6.0.x
20+
21+
- name: Install GitVersion
22+
uses: gittools/actions/gitversion/[email protected]
23+
with:
24+
versionSpec: "5.x"
25+
26+
- name: Checkout
27+
uses: actions/checkout@v3
28+
with:
29+
fetch-depth: 0
30+
31+
- name: Restore dependencies
32+
run: dotnet restore
33+
34+
- name: Determine Version
35+
uses: gittools/actions/gitversion/[email protected]
36+
with:
37+
additionalArguments: '/updateprojectfiles /overrideconfig "mode=Mainline"'
38+
39+
- name: Build (Release)
40+
run: dotnet build . --configuration Release --no-restore -p:Version=$GitVersion_SemVer
41+
42+
- name: Upload a Build Artifact
43+
uses: actions/[email protected]
44+
with:
45+
path: ./dist
46+
47+
- name: GH Release
48+
uses: softprops/action-gh-release@v1
49+
if: github.event_name == 'push'
50+
with:
51+
body: Automatic pre-release of ${{ env.GitVersion_SemVer }} for ${{ env.GitVersion_ShortSha }}
52+
name: v${{ env.GitVersion_SemVer }}
53+
files: ./dist/Killfeed.dll
54+
fail_on_unmatched_files: true
55+
prerelease: true
56+
tag_name: v${{ env.GitVersion_SemVer }}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Release
2+
3+
on:
4+
release:
5+
types: [published]
6+
workflow_dispatch:
7+
inputs:
8+
tag_name:
9+
required: true
10+
description: The tag to release.
11+
type: string
12+
13+
jobs:
14+
release_on_thunderstore:
15+
env:
16+
RELEASE_TAG: ${{ github.event.inputs.tag_name || github.event.release.tag_name }}
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout
20+
uses: actions/checkout@v3
21+
with:
22+
fetch-depth: 0
23+
- name: Setup .NET
24+
uses: actions/setup-dotnet@v2
25+
with:
26+
dotnet-version: 6.0.x
27+
- name: Install GitVersion
28+
uses: gittools/actions/gitversion/[email protected]
29+
with:
30+
versionSpec: "5.x"
31+
- name: Determine Version
32+
uses: gittools/actions/gitversion/[email protected]
33+
with:
34+
additionalArguments: '/overrideconfig "mode=Mainline"'
35+
- name: Download Release
36+
run: gh release download ${{ env.RELEASE_TAG }} -D ./dist
37+
env:
38+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39+
- name: Install tcli
40+
run: dotnet tool install --global tcli
41+
- name: Run tcli
42+
run: tcli publish --token ${{ secrets.THUNDERSTORE_KEY }} --package-version ${RELEASE_TAG:1}
43+
- name: Upload a Build Artifact
44+
uses: actions/[email protected]
45+
with:
46+
path: ./build

‎Commands.cs‎

Lines changed: 69 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,86 @@
1-
using System.Linq;
1+
using System.Linq;
22
using System.Text;
3+
using Cpp2IL.Core.Extensions;
4+
using ProjectM;
5+
using ProjectM.Network;
36
using VampireCommandFramework;
47

5-
namespace LeaderBored;
8+
namespace Killfeed;
69

7-
[CommandGroup("leaderboard", "lb")]
810
public class Commands
911
{
10-
11-
//[Command("test-save")]
12-
//public static void GenerateCmd(ICommandContext ctx)
13-
//{
14-
// DataStore.WriteToDisk();
15-
//}
16-
17-
//[Command("test-generate")]
18-
//public static void GenerateCmd(ICommandContext ctx, int count)
19-
//{
20-
// DataStore.GenerateNTestData(count);
21-
//}
22-
23-
[Command("top")]
12+
[Command("killfeed leaderboard", shortHand: "kf top")]
2413
public void TopCommand(ChatCommandContext ctx)
2514
{
2615
// TODO: Enhance with cache and such
27-
var topKillers = DataStore.PlayerDatas.Values.OrderByDescending(k => k.Kills).Take(10).ToArray();
16+
int num = 10;
17+
int offset = 5;
18+
var topKillers = DataStore.PlayerDatas.Values.OrderByDescending(k => k.Kills).Take(num).ToArray();
19+
20+
offset = offset > topKillers.Length ? topKillers.Length : offset;
21+
num = num > topKillers.Length ? topKillers.Length : num;
22+
23+
24+
25+
var pad = (string name) => new string('\t'.Repeat(6 - name.Length / 5).ToArray());
26+
2827

2928
var sb = new StringBuilder();
30-
sb.AppendLine($"{Markup.Prefix} <u>Top Kills</u>");
31-
for (var i = 0; i < topKillers.Count(); i++)
29+
var sb2 = new StringBuilder();
30+
31+
sb2.AppendLine("");
32+
sb.AppendLine($"{Markup.Prefix} <size=18><u>Top Kills</u></size>");
33+
34+
//var message = (DataStore.PlayerStatistics k) => $"{Markup.Highlight(k.LastName)}{pad(k.LastName)}<color={Markup.SecondaryColor}><b>{k.Kills}</b> / {k.Deaths}</color>";
35+
var message = (DataStore.PlayerStatistics k) => $"\t<color={Markup.SecondaryColor}><b>{k.Kills,-3}</b> / {k.Deaths,3}</color>\t{Markup.Highlight(k.LastName)}";
36+
37+
for (var i = 0; i < offset; i++)
38+
{
39+
var k = topKillers[i];
40+
sb.AppendLine($"{i + 1}. {message(k)}");
41+
//sb.AppendLine($"{i + 1}. {Markup.Highlight(k.LastName.PadRight(1, ' '))}{pad(k.LastName)}{Markup.Secondary(k.LastName.Length)}");
42+
}
43+
44+
45+
46+
for (var i = offset; i < num; i++)
3247
{
3348
var k = topKillers[i];
34-
sb.AppendLine($"{i+1}. {Markup.Highlight(k.LastName)} {k.Kills} {k.Deaths} {k.CurrentStreak}");
49+
sb2.AppendLine($"{i + 1}. {message(k)}");
50+
//sb2.AppendLine($"{i + 1}. {Markup.Highlight(k.LastName.PadRight(1, ' '))}{pad(k.LastName)}{Markup.Secondary(k.LastName.Length)}");
3551
}
52+
ctx.Reply(sb.ToString());
53+
ctx.Reply(sb2.ToString());
54+
}
55+
56+
[Command("killfeed", shortHand: "kf", description: "Shows Killfeed info")]
57+
public void KillfeedCommand(ChatCommandContext ctx)
58+
{
59+
60+
var steamId = ctx.User.PlatformId;
61+
62+
// append current rank based on kills
63+
if (!DataStore.PlayerDatas.TryGetValue(steamId, out _))
64+
{
65+
throw ctx.Error($"You have no stats yet!");
66+
}
67+
68+
var (stats, rank) = DataStore.PlayerDatas.Values.OrderByDescending(k => k.Kills)
69+
.Select((stats, rank) => (stats, rank))
70+
.First(u => u.stats.SteamId == ctx.User.PlatformId);
71+
72+
var sb = new StringBuilder();
73+
sb.AppendLine($"{Markup.Prefix} <size=21><u>Killfeed Stats for {Markup.Highlight(stats.LastName)}</u>");
74+
75+
var rankStr = $"{Markup.Highlight($"{(rank + 1)}")} / {Markup.Secondary(DataStore.PlayerDatas.Count)}";
76+
sb.AppendLine($"Rank: {rankStr}</size>");
77+
78+
sb.AppendLine($"Kills: {Markup.Highlight(stats.Kills)}");
79+
sb.AppendLine($"Deaths: {Markup.Highlight(stats.Deaths)}");
80+
sb.AppendLine($"Current Streak: {Markup.Highlight(stats.CurrentStreak)}");
81+
sb.AppendLine($"Highest Streak: {Markup.Highlight(stats.HighestStreak)}");
82+
3683

3784
ctx.Reply(sb.ToString());
3885
}
39-
}
86+
}

0 commit comments

Comments
 (0)