Skip to content

Commit 712e618

Browse files
authored
1.1.3
1 parent c477393 commit 712e618

File tree

7 files changed

+171
-85
lines changed

7 files changed

+171
-85
lines changed

Config/Configs.cs

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,35 +90,81 @@ public static ConfigData Load(string modulePath)
9090
Helper.CreateResource(_PrecacheResources);
9191

9292
_configFilePath = Path.Combine(configFileDirectory, ConfigFileName);
93+
var defaultConfig = new ConfigData();
9394
if (File.Exists(_configFilePath))
9495
{
95-
_configData = JsonSerializer.Deserialize<ConfigData>(File.ReadAllText(_configFilePath), SerializationOptions);
96+
try
97+
{
98+
_configData = JsonSerializer.Deserialize<ConfigData>(File.ReadAllText(_configFilePath), SerializationOptions);
99+
}
100+
catch (JsonException)
101+
{
102+
_configData = MergeConfigWithDefaults(_configFilePath, defaultConfig);
103+
}
104+
96105
_configData!.Validate();
97106
}
98107
else
99108
{
100-
_configData = new ConfigData();
109+
_configData = defaultConfig;
101110
_configData.Validate();
102111
}
103112

104-
if (_configData is null)
113+
SaveConfigData(_configData);
114+
return _configData;
115+
}
116+
117+
private static ConfigData MergeConfigWithDefaults(string path, ConfigData defaults)
118+
{
119+
var mergedConfig = new ConfigData();
120+
var jsonText = File.ReadAllText(path);
121+
122+
var readerOptions = new JsonReaderOptions
123+
{
124+
AllowTrailingCommas = true,
125+
CommentHandling = JsonCommentHandling.Skip
126+
};
127+
128+
using var doc = JsonDocument.Parse(jsonText, new JsonDocumentOptions
105129
{
106-
throw new Exception("Failed to load configs.");
107-
}
130+
AllowTrailingCommas = true,
131+
CommentHandling = JsonCommentHandling.Skip
132+
});
133+
134+
foreach (var jsonProp in doc.RootElement.EnumerateObject())
135+
{
136+
var propInfo = typeof(ConfigData).GetProperty(jsonProp.Name);
137+
if (propInfo == null) continue;
108138

109-
SaveConfigData(_configData);
139+
try
140+
{
141+
var jsonValue = JsonSerializer.Deserialize(
142+
jsonProp.Value.GetRawText(),
143+
propInfo.PropertyType,
144+
new JsonSerializerOptions
145+
{
146+
Converters = { new JsonStringEnumConverter() },
147+
ReadCommentHandling = JsonCommentHandling.Skip
148+
}
149+
);
150+
propInfo.SetValue(mergedConfig, jsonValue);
151+
}
152+
catch (JsonException)
153+
{
154+
propInfo.SetValue(mergedConfig, propInfo.GetValue(defaults));
155+
}
156+
}
110157

111-
return _configData;
158+
return mergedConfig;
112159
}
113160

114161
private static void SaveConfigData(ConfigData configData)
115162
{
116163
if (_configFilePath is null)
117164
throw new Exception("Config not yet loaded.");
118165

119-
string json = JsonSerializer.Serialize(configData, SerializationOptions);
120-
json = Regex.Unescape(json);
121-
166+
var json = JsonSerializer.Serialize(configData, SerializationOptions);
167+
122168
var lines = json.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
123169
var newLines = new List<string>();
124170

@@ -223,9 +269,6 @@ public string Link
223269

224270
[BreakLine("{space}----------------------------[ ↓ Main Config ↓ ]----------------------------{space}")]
225271

226-
[Comment("Compatibility With CS2Fixes?\ntrue = Yes")]
227-
public bool CompatibilityWithCS2Fixes { get; set; }
228-
229272
[Comment("Enable Early Connection Of The Players?\ntrue = Yes\nfalse = No (Wait When Player Fully Connected)")]
230273
public bool EarlyConnection { get; set; }
231274

@@ -242,17 +285,16 @@ public string Link
242285
[Range(0, 2, 0, "[CnD] RemoveDefaultDisconnect: is invalid, setting to default value (2) Please Choose From 0 To 2.\n[CnD] 0 = No\n[CnD] 1 = Yes Completely\n[CnD] 2 = Yes Completely Also Remove Disconnect Icon In Killfeed")]
243286
public int RemoveDefaultDisconnect { get; set; }
244287

245-
[Comment("Commands Toggle On/Off To Sounds\n\"\" = Disable")]
288+
[Comment("Commands To Toggle On/Off Sounds\n\"\" = Disable")]
246289
public string Toggle_Sounds_CommandsInGame { get; set; }
247290

248-
[Comment("Required [Toggle_Sounds_Flags]\nToggle On/Off To Sounds\nExample:\n\"!76561198206086993,@css/include,#css/include,include\"\n\"\" = To Allow Everyone")]
291+
[Comment("Required [Toggle_Sounds_CommandsInGame]\nFlags Or Group Or SteamID To Toggle On/Off Sounds\nExample:\n\"SteamID: 76561198206086993,76561198974936845 | Flag: @css/vips,@css/admins | Group: #css/vips,#css/admins\"\n\"\" = To Allow Everyone")]
249292
public string Toggle_Sounds_Flags { get; set; }
250293

251-
252-
[Comment("Commands Toggle On/Off To Messages Connect/Disconnect\n\"\" = Disable")]
294+
[Comment("Commands To Toggle On/Off Messages Connect/Disconnect\n\"\" = Disable")]
253295
public string Toggle_Messages_CommandsInGame { get; set; }
254296

255-
[Comment("Required [Toggle_Messages_CommandsInGame]\nToggle On/Off To Messages Connect/Disconnect\nExample:\n\"!76561198206086993,@css/include,#css/include,include\"\n\"\" = To Allow Everyone")]
297+
[Comment("Required [Toggle_Messages_CommandsInGame]\nFlags Or Group Or SteamID To Toggle On/Off Messages Connect/Disconnect\nExample:\n\"SteamID: 76561198206086993,76561198974936845 | Flag: @css/vips,@css/admins | Group: #css/vips,#css/admins\"\n\"\" = To Allow Everyone")]
256298
public string Toggle_Messages_Flags { get; set; }
257299

258300
[Comment("Default Value Of Sounds To New Players?\ntrue = On\nfalse = Off")]
@@ -370,16 +412,15 @@ public ConfigData()
370412
Version = MainPlugin.Instance.ModuleVersion;
371413
Link = "https://github.com/oqyh/cs2-Connect-Disconnect-Sound-GoldKingZ";
372414

373-
CompatibilityWithCS2Fixes = true;
374415
EarlyConnection = true;
375416
DisableLoopConnections = true;
376417
DisableServerHibernate = true;
377418
PickRandomSounds = true;
378419
RemoveDefaultDisconnect = 2;
379420
Toggle_Sounds_CommandsInGame = "!sound,!sounds";
380-
Toggle_Sounds_Flags = "@css/vvip,#css/vvip";
421+
Toggle_Sounds_Flags = "SteamID: 76561198206086993,76561198974936845 | Flag: @css/vips,@css/admins | Group: #css/vips,#css/admins";
381422
Toggle_Messages_CommandsInGame = "!message,!message";
382-
Toggle_Messages_Flags = "@css/vvip,#css/vvip";
423+
Toggle_Messages_Flags = "SteamID: 76561198206086993,76561198974936845 | Flag: @css/vips,@css/admins | Group: #css/vips,#css/admins";
383424
Default_Sounds = true;
384425
Default_Messages = true;
385426
DateFormat = "MM-dd-yyyy";

Config/EventPlayerChat.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,8 @@ public HookResult OnPlayerChat(CCSPlayerController? player, CommandInfo info, bo
3636
{
3737
if (!player.IsValid() || !MainPlugin.Instance.g_Main.Player_Data.ContainsKey(player))return HookResult.Continue;
3838

39-
if (Configs.GetConfigData().CompatibilityWithCS2Fixes)
40-
{
41-
if((DateTime.Now - MainPlugin.Instance.g_Main.Player_Data[player].Time).TotalSeconds < 2)
42-
{
43-
return HookResult.Continue;
44-
}
45-
MainPlugin.Instance.g_Main.Player_Data[player].Time = DateTime.Now;
46-
}
39+
if((DateTime.Now - MainPlugin.Instance.g_Main.Player_Data[player].CS2Fixes).TotalSeconds < 0.1)return HookResult.Continue;
40+
MainPlugin.Instance.g_Main.Player_Data[player].CS2Fixes = DateTime.Now;
4741

4842
var playerid = player.SteamID;
4943
var eventmessage = info.ArgString;

Config/Extension.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,16 @@ public static string GetNextSound(this List<string> sounds, bool pickRandom)
102102
return result;
103103
}
104104
}
105+
private const ulong Steam64Offset = 76561197960265728UL;
106+
public static (string steam2, string steam3, string steam32, string steam64)GetPlayerSteamID(this ulong steamId64)
107+
{
108+
uint id32 = (uint)(steamId64 - Steam64Offset);
109+
var steam32 = id32.ToString();
110+
uint y = id32 & 1;
111+
uint z = id32 >> 1;
112+
var steam2 = $"STEAM_0:{y}:{z}";
113+
var steam3 = $"[U:1:{steam32}]";
114+
var steam64 = steamId64.ToString();
115+
return (steam2, steam3, steam32, steam64);
116+
}
105117
}

Config/Globals.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ public class PlayerDataClass
2525
public bool Remove_Icon { get; set; }
2626
public int Toggle_Messages { get; set; }
2727
public int Toggle_Sounds { get; set; }
28-
public DateTime Time { get; set; }
29-
public PlayerDataClass(CCSPlayerController player, ulong steamId, bool remove_Icon, int toggle_Messages, int toggle_Sounds, DateTime time)
28+
public DateTime CS2Fixes { get; set; }
29+
public PlayerDataClass(CCSPlayerController player, ulong steamId, bool remove_Icon, int toggle_Messages, int toggle_Sounds, DateTime CS2Fixess)
3030
{
3131
Player = player;
3232
SteamId = steamId;
3333
Remove_Icon = remove_Icon;
3434
Toggle_Messages = toggle_Messages;
3535
Toggle_Sounds = toggle_Sounds;
36-
Time = time;
36+
CS2Fixes = CS2Fixess;
3737
}
3838
}
3939
public Dictionary<CCSPlayerController, PlayerDataClass> Player_Data = new Dictionary<CCSPlayerController, PlayerDataClass>();

Config/Helper.cs

Lines changed: 81 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -113,37 +113,68 @@ public static void AdvancedServerPrintToChatAll(string message, params object[]
113113

114114
public static bool IsPlayerInGroupPermission(CCSPlayerController player, string groups)
115115
{
116-
if (string.IsNullOrEmpty(groups))
117-
{
116+
if (string.IsNullOrEmpty(groups) || player == null || !player.IsValid)
118117
return false;
119-
}
120-
var Groups = groups.Split(',');
121-
foreach (var group in Groups)
118+
119+
return groups.Split('|')
120+
.Select(segment => segment.Trim())
121+
.Any(trimmedSegment => Permission_CheckPermissionSegment(player, trimmedSegment));
122+
}
123+
124+
private static bool Permission_CheckPermissionSegment(CCSPlayerController player, string segment)
125+
{
126+
if (string.IsNullOrEmpty(segment))
127+
return false;
128+
129+
int colonIndex = segment.IndexOf(':');
130+
131+
if (colonIndex == -1 || colonIndex == 0)
132+
return false;
133+
134+
string prefix = segment.Substring(0, colonIndex).Trim().ToLower();
135+
string values = segment.Substring(colonIndex + 1).Trim();
136+
137+
return prefix switch
122138
{
123-
if (string.IsNullOrEmpty(group))
124-
{
125-
continue;
126-
}
127-
string groupId = group[0] == '!' ? group.Substring(1) : group;
128-
if (group[0] == '#' && AdminManager.PlayerInGroup(player, group))
129-
{
130-
return true;
131-
}
132-
else if (group[0] == '@' && AdminManager.PlayerHasPermissions(player, group))
133-
{
134-
return true;
135-
}
136-
else if (group[0] == '!' && player.AuthorizedSteamID != null && (groupId == player.AuthorizedSteamID.SteamId2.ToString() || groupId == player.AuthorizedSteamID.SteamId3.ToString().Trim('[', ']') ||
137-
groupId == player.AuthorizedSteamID.SteamId32.ToString() || groupId == player.AuthorizedSteamID.SteamId64.ToString()))
138-
{
139-
return true;
140-
}
141-
else if (AdminManager.PlayerInGroup(player, group))
142-
{
143-
return true;
144-
}
145-
}
146-
return false;
139+
"steamid" or "steamids" or "steam" or "steams" => Permission_CheckSteamIds(player, values),
140+
"flag" or "flags" => Permission_CheckFlags(player, values),
141+
"group" or "groups" => Permission_CheckGroups(player, values),
142+
_ => false
143+
};
144+
}
145+
146+
private static bool Permission_CheckSteamIds(CCSPlayerController player, string steamIds)
147+
{
148+
steamIds = steamIds.Replace("[", "").Replace("]", "");
149+
150+
var (steam2, steam3, steam32, steam64) = player.SteamID.GetPlayerSteamID();
151+
var steam3NoBrackets = steam3.Trim('[', ']');
152+
153+
return steamIds
154+
.Split(',', StringSplitOptions.RemoveEmptyEntries)
155+
.Select(id => id.Trim())
156+
.Any(trimmedId =>
157+
string.Equals(trimmedId, steam2, StringComparison.OrdinalIgnoreCase) ||
158+
string.Equals(trimmedId, steam3NoBrackets, StringComparison.OrdinalIgnoreCase) ||
159+
string.Equals(trimmedId, steam32, StringComparison.OrdinalIgnoreCase) ||
160+
string.Equals(trimmedId, steam64, StringComparison.OrdinalIgnoreCase)
161+
);
162+
}
163+
164+
private static bool Permission_CheckFlags(CCSPlayerController player, string flags)
165+
{
166+
return flags.Split(',')
167+
.Select(flag => flag.Trim())
168+
.Where(trimmedFlag => trimmedFlag.StartsWith("@"))
169+
.Any(trimmedFlag => AdminManager.PlayerHasPermissions(player, trimmedFlag));
170+
}
171+
172+
private static bool Permission_CheckGroups(CCSPlayerController player, string groups)
173+
{
174+
return groups.Split(',')
175+
.Select(group => group.Trim())
176+
.Where(trimmedGroup => trimmedGroup.StartsWith("#"))
177+
.Any(trimmedGroup => AdminManager.PlayerInGroup(player, trimmedGroup));
147178
}
148179
public static List<CCSPlayerController> GetPlayersController(bool IncludeBots = false, bool IncludeHLTV = false, bool IncludeNone = true, bool IncludeSPEC = true, bool IncludeCT = true, bool IncludeT = true)
149180
{
@@ -189,8 +220,8 @@ public static void ClearVariables()
189220
public static void CreateResource(string jsonFilePath)
190221
{
191222
string headerLine = "////// vvvvvv Add Paths For Precache Resources Down vvvvvvvvvv //////";
192-
string headerLine2 = "soundevents/goldkingz_sounds.vsndevts";
193-
string headerLine3 = "soundevents/addons_goldkingz_sounds.vsndevts";
223+
string headerLine2 = "// soundevents/goldkingz_sounds.vsndevts";
224+
string headerLine3 = "// soundevents/addons_goldkingz_sounds.vsndevts";
194225
if (!File.Exists(jsonFilePath))
195226
{
196227
using (StreamWriter sw = File.CreateText(jsonFilePath))
@@ -217,6 +248,23 @@ public static void CreateResource(string jsonFilePath)
217248
}
218249
}
219250

251+
public static void CheckPlayerInGlobals(CCSPlayerController player)
252+
{
253+
var g_Main = MainPlugin.Instance.g_Main;
254+
if(!player.IsValid() || g_Main.Player_Data.ContainsKey(player))return;
255+
256+
257+
var initialData = new Globals.PlayerDataClass(
258+
player,
259+
player.SteamID,
260+
false,
261+
Configs.GetConfigData().Default_Messages ? 1 : 2,
262+
Configs.GetConfigData().Default_Sounds ? 1 : 2,
263+
DateTime.Now
264+
);
265+
g_Main.Player_Data.TryAdd(player, initialData);
266+
}
267+
220268
public static async Task LoadPlayerData(CCSPlayerController player)
221269
{
222270
try
@@ -230,15 +278,7 @@ await Server.NextFrameAsync(() =>
230278
{
231279
if (!player.IsValid()) return;
232280

233-
var initialData = new Globals.PlayerDataClass(
234-
player,
235-
steamId,
236-
false,
237-
Configs.GetConfigData().Default_Messages ? 1 : 2,
238-
Configs.GetConfigData().Default_Sounds ? 1 : 2,
239-
DateTime.Now
240-
);
241-
g_Main.Player_Data.TryAdd(player, initialData);
281+
CheckPlayerInGlobals(player);
242282
});
243283

244284
if (Configs.GetConfigData().Cookies_Enable)
@@ -974,7 +1014,7 @@ public static (string, List<string>, string) GetPlayerConnectionSettings(CCSPlay
9741014
return (
9751015
target.Value<string>($"{type}_MESSAGE_CHAT") ?? "",
9761016
ParseSounds(target[$"{type}_SOUND"]!),
977-
target.Value<string>($"{type}_SOUND_VOLUME") ?? ""
1017+
target.Value<string>($"{type}_SOUND_VOLUME") ?? "100%"
9781018
);
9791019
}
9801020

0 commit comments

Comments
 (0)