CS2-Kit
C++23 library for CS2 Metamod:Source plugin development
Loading...
Searching...
No Matches
StringUtils.cpp
Go to the documentation of this file.
1#include <CS2Kit/Utils/SteamId.hpp>
2#include <CS2Kit/Utils/StringUtils.hpp>
3#include <algorithm>
4#include <cctype>
5#include <sstream>
6
7namespace CS2Kit::Utils
8{
9
10std::string StringUtils::ToLower(const std::string& str)
11{
12 std::string result = str;
13 std::transform(result.begin(), result.end(), result.begin(), [](unsigned char c) { return std::tolower(c); });
14 return result;
15}
16
17std::string StringUtils::ToUpper(const std::string& str)
18{
19 std::string result = str;
20 std::transform(result.begin(), result.end(), result.begin(), [](unsigned char c) { return std::toupper(c); });
21 return result;
22}
23
24std::string StringUtils::TrimLeft(const std::string& str)
25{
26 auto it = std::find_if(str.begin(), str.end(), [](unsigned char c) { return !std::isspace(c); });
27 return std::string(it, str.end());
28}
29
30std::string StringUtils::TrimRight(const std::string& str)
31{
32 auto it = std::find_if(str.rbegin(), str.rend(), [](unsigned char c) { return !std::isspace(c); });
33 return std::string(str.begin(), it.base());
34}
35
36std::string StringUtils::Trim(const std::string& str)
37{
38 return TrimLeft(TrimRight(str));
39}
40
41std::vector<std::string> StringUtils::Split(const std::string& str, char delimiter)
42{
43 std::vector<std::string> result;
44 std::stringstream ss(str);
45 std::string item;
46 while (std::getline(ss, item, delimiter))
47 result.push_back(item);
48 return result;
49}
50
51std::string StringUtils::Join(const std::vector<std::string>& parts, const std::string& delimiter)
52{
53 if (parts.empty())
54 return "";
55
56 std::string result = parts[0];
57 for (size_t i = 1; i < parts.size(); ++i)
58 result += delimiter + parts[i];
59 return result;
60}
61
62bool StringUtils::StartsWith(const std::string& str, const std::string& prefix)
63{
64 return str.length() >= prefix.length() && str.substr(0, prefix.length()) == prefix;
65}
66
67bool StringUtils::EndsWith(const std::string& str, const std::string& suffix)
68{
69 return str.length() >= suffix.length() && str.substr(str.length() - suffix.length()) == suffix;
70}
71
72bool StringUtils::ContainsIgnoreCase(const std::string& str, const std::string& substr)
73{
74 return ToLower(str).find(ToLower(substr)) != std::string::npos;
75}
76
77std::string StringUtils::ReplaceAll(const std::string& str, const std::string& from, const std::string& to)
78{
79 if (from.empty())
80 return str;
81
82 std::string result = str;
83 size_t pos = 0;
84 while ((pos = result.find(from, pos)) != std::string::npos)
85 {
86 result.replace(pos, from.length(), to);
87 pos += to.length();
88 }
89 return result;
90}
91
92bool StringUtils::IsNumeric(const std::string& str)
93{
94 if (str.empty())
95 return false;
96 return std::all_of(str.begin(), str.end(), [](unsigned char c) { return std::isdigit(c); });
97}
98
99StringUtils::TargetInfo StringUtils::ParseTarget(const std::string& target)
100{
101 if (target.empty())
102 return {TargetType::Name, ""};
103
104 if (target == "@all" || target == "@*")
105 return {TargetType::All, target};
106
107 if (target == "@me")
108 return {TargetType::Me, target};
109
110 if (target[0] == '#' && target.length() > 1)
111 {
112 auto indexStr = target.substr(1);
113 if (IsNumeric(indexStr))
114 return {TargetType::Index, indexStr};
115 }
116
117 if (IsNumeric(target) && target.length() >= 15)
118 {
119 try
120 {
121 int64_t steamId64 = std::stoll(target);
122 if (SteamId::IsValid(steamId64))
123 return {TargetType::SteamId, target};
124 }
125 catch (...)
126 {}
127 }
128
129 if (StartsWith(target, "[U:1:"))
130 {
131 auto steamId64 = SteamId::FromSteamId3(target);
132 if (steamId64.has_value())
133 return {TargetType::SteamId, std::to_string(*steamId64)};
134 }
135
136 if (StartsWith(target, "STEAM_"))
137 {
138 auto steamId64 = SteamId::FromSteamId(target);
139 if (steamId64.has_value())
140 return {TargetType::SteamId, std::to_string(*steamId64)};
141 }
142
143 return {TargetType::Name, target};
144}
145
146} // namespace CS2Kit::Utils