diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 697b720..e517467 100644 Binary files a/Release/Plugins/RenX.Core.lib and b/Release/Plugins/RenX.Core.lib differ diff --git a/RenX.Commands/RenX_Commands.cpp b/RenX.Commands/RenX_Commands.cpp index 1116c45..79cdc64 100644 --- a/RenX.Commands/RenX_Commands.cpp +++ b/RenX.Commands/RenX_Commands.cpp @@ -68,7 +68,7 @@ int RenX_CommandsPlugin::OnRehash() { RenX_CommandsPlugin::_defaultTempBanTime = std::chrono::seconds(Jupiter::IRC::Client::Config->getLongLong(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("TBanTime"), 86400)); RenX_CommandsPlugin::playerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("PlayerInfoFormat"), STRING_LITERAL_AS_REFERENCE(IRCCOLOR "03[Player Info]" IRCCOLOR "{TCOLOR} Name: " IRCBOLD "{RNAME}" IRCBOLD " - ID: {ID} - Team: " IRCBOLD "{TEAML}" IRCBOLD " - Vehicle Kills: {VEHICLEKILLS} - Building Kills {BUILDINGKILLS} - Kills {KILLS} - Deaths: {DEATHS} - KDR: {KDR} - Access: {ACCESS}")); - RenX_CommandsPlugin::adminPlayerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("AdminPlayerInfoFormat"), Jupiter::StringS::Format("%.*s - IP: " IRCBOLD "{IP}" IRCBOLD " - RDNS: " IRCBOLD "{RDNS}" IRCBOLD " - Steam ID: " IRCBOLD "{STEAM}", RenX_CommandsPlugin::playerInfoFormat.size(), RenX_CommandsPlugin::playerInfoFormat.ptr())); + RenX_CommandsPlugin::adminPlayerInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("AdminPlayerInfoFormat"), Jupiter::StringS::Format("%.*s - IP: " IRCBOLD "{IP}" IRCBOLD " - HWID: " IRCBOLD "{HWID}" IRCBOLD " - RDNS: " IRCBOLD "{RDNS}" IRCBOLD " - Steam ID: " IRCBOLD "{STEAM}", RenX_CommandsPlugin::playerInfoFormat.size(), RenX_CommandsPlugin::playerInfoFormat.ptr())); RenX_CommandsPlugin::buildingInfoFormat = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("BuildingInfoFormat"), STRING_LITERAL_AS_REFERENCE(IRCCOLOR) + RenX::tags->buildingTeamColorTag + RenX::tags->buildingNameTag + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " - " IRCCOLOR "07") + RenX::tags->buildingHealthPercentageTag + STRING_LITERAL_AS_REFERENCE("%")); RenX_CommandsPlugin::staffTitle = Jupiter::IRC::Client::Config->get(RenX_CommandsPlugin::getName(), STRING_LITERAL_AS_REFERENCE("StaffTitle"), STRING_LITERAL_AS_REFERENCE("Moderator")); @@ -1865,15 +1865,17 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString return true; case 2: // IP return entry->ip == params.asUnsignedInt(); - case 3: // RDNS + case 3: // HWID + return entry->hwid.equals(params); + case 4: // RDNS return entry->rdns.equals(params); - case 4: // STEAM + case 5: // STEAM return entry->steamid == params.asUnsignedLongLong(); - case 5: // NAME + case 6: // NAME return entry->name.equalsi(params); - case 6: // BANNER + case 7: // BANNER return entry->banner.equalsi(params); - case 7: // ACTIVE + case 8: // ACTIVE return params.asBool() == entry->is_active(); } }; @@ -1884,16 +1886,18 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString type = 1; else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("ip"))) type = 2; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("rdns"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("hwid"))) type = 3; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("steam"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("rdns"))) type = 4; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("name"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("steam"))) type = 5; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("banner"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("name"))) type = 6; - else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("active"))) + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("banner"))) type = 7; + else if (type_str.equalsi(STRING_LITERAL_AS_REFERENCE("active"))) + type = 8; else { type = 0; @@ -1935,9 +1939,9 @@ void BanSearchIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString types += ";"_jrs; } - out.format("ID: %lu (" IRCCOLOR "%sactive" IRCCOLOR "); Date: %s; IP: %.*s/%u; Steam: %llu; Types:%.*s Name: %.*s; Banner: %.*s", - i, entry->is_active() ? "12" : "04in", timeStr, ip_str.size(), ip_str.ptr(), entry->prefix_length, entry->steamid, types.size(), types.ptr(), - entry->name.size(), entry->name.ptr(), entry->banner.size(), entry->banner.ptr()); + out.format("ID: %lu (" IRCCOLOR "%sactive" IRCCOLOR "); Date: %s; IP: %.*s/%u; HWID: %.*s; Steam: %llu; Types:%.*s Name: %.*s; Banner: %.*s", + i, entry->is_active() ? "12" : "04in", timeStr, ip_str.size(), ip_str.ptr(), entry->prefix_length, entry->hwid.size(), entry->hwid.ptr(), entry->steamid, + types.size(), types.ptr(), entry->name.size(), entry->name.ptr(), entry->banner.size(), entry->banner.ptr()); if (entry->rdns.isNotEmpty()) { @@ -2119,6 +2123,7 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c uint32_t ip = 0U; uint8_t prefix_length = 32U; uint64_t steamid = 0U; + Jupiter::ReferenceString hwid; Jupiter::StringS rdns; Jupiter::String banner = nick + "@IRC"_jrs; Jupiter::ReferenceString reason = "No reason"_jrs; @@ -2160,6 +2165,16 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c steamid = Jupiter::ReferenceString::getWord(parameters, index++, ADDBAN_WHITESPACE).asUnsignedLongLong(); } + else if (word.equalsi("HWID"_jrs) || word.equalsi("HardwareID"_jrs)) + { + if (index == words) + { + source->sendNotice(nick, "ERROR: No value specified for token: "_jrs + word); + return; + } + + hwid = Jupiter::ReferenceString::getWord(parameters, index++, ADDBAN_WHITESPACE); + } else if (word.equalsi("RDNS"_jrs) || word.equalsi("DNS"_jrs)) { if (index == words) @@ -2232,7 +2247,7 @@ void AddBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c else flags |= RenX::BanDatabase::Entry::FLAG_USE_RDNS; - RenX::banDatabase->add(name, ip, prefix_length, steamid, rdns, banner, reason, duration, flags); + RenX::banDatabase->add(name, ip, prefix_length, steamid, hwid, rdns, banner, reason, duration, flags); RenX::getCore()->banCheck(); source->sendMessage(channel, Jupiter::StringS::Format("Ban added to the database with ID #%u", RenX::banDatabase->getEntries().size() - 1)); } diff --git a/RenX.Core/RenX_BanDatabase.cpp b/RenX.Core/RenX_BanDatabase.cpp index 5bb3050..b95553a 100644 --- a/RenX.Core/RenX_BanDatabase.cpp +++ b/RenX.Core/RenX_BanDatabase.cpp @@ -54,6 +54,8 @@ void RenX::BanDatabase::process_data(Jupiter::DataBuffer &buffer, FILE *file, fp entry->steamid = buffer.pop(); entry->ip = buffer.pop(); entry->prefix_length = buffer.pop(); + if (this->read_version >= 5U) + entry->hwid = buffer.pop(); entry->rdns = buffer.pop(); entry->name = buffer.pop(); entry->banner = buffer.pop(); @@ -93,6 +95,15 @@ void RenX::BanDatabase::process_file_finish(FILE *file) } return; } + else if (RenX::BanDatabase::read_version < RenX::BanDatabase::write_version) + { + if (freopen(RenX::BanDatabase::filename.c_str(), "wb", file) != nullptr) + { + this->create_header(file); + for (size_t index = 0; index != RenX::BanDatabase::entries.size(); ++index) + RenX::BanDatabase::write(RenX::BanDatabase::entries.get(index), file); + } + } fgetpos(file, std::addressof(RenX::BanDatabase::eof)); } @@ -103,7 +114,7 @@ void RenX::BanDatabase::upgrade_database() if (file != nullptr) { this->create_header(file); - for (size_t index = 0; RenX::BanDatabase::entries.size(); ++index) + for (size_t index = 0; index != RenX::BanDatabase::entries.size(); ++index) RenX::BanDatabase::write(RenX::BanDatabase::entries.get(index), file); fclose(file); @@ -133,6 +144,7 @@ void RenX::BanDatabase::write(RenX::BanDatabase::Entry *entry, FILE *file) buffer.push(entry->steamid); buffer.push(entry->ip); buffer.push(entry->prefix_length); + buffer.push(entry->hwid); buffer.push(entry->rdns); buffer.push(entry->name); buffer.push(entry->banner); @@ -165,6 +177,7 @@ void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player entry->steamid = player->steamid; entry->ip = player->ip32; entry->prefix_length = 32U; + entry->hwid = player->hwid; if (player->rdns_thread.joinable()) player->rdns_thread.join(); entry->rdns = player->rdns; @@ -183,7 +196,7 @@ void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player RenX::BanDatabase::write(entry); } -void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags) +void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &hwid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags) { Entry *entry = new Entry(); entry->set_active(); @@ -193,6 +206,7 @@ void RenX::BanDatabase::add(const Jupiter::ReadableString &name, uint32_t ip, ui entry->steamid = steamid; entry->ip = ip; entry->prefix_length = prefix_length; + entry->hwid = hwid; entry->rdns = rdns; entry->name = name; entry->banner = banner; diff --git a/RenX.Core/RenX_BanDatabase.h b/RenX.Core/RenX_BanDatabase.h index c6de7fd..2f2ef6a 100644 --- a/RenX.Core/RenX_BanDatabase.h +++ b/RenX.Core/RenX_BanDatabase.h @@ -86,6 +86,7 @@ namespace RenX uint64_t steamid /** SteamID of the banned player */; uint32_t ip /** IPv4 address of the banned player */; uint8_t prefix_length /** Prefix length for the IPv4 address block */; + Jupiter::StringS hwid; /** Hardware ID of the banned player */ Jupiter::StringS rdns /** RDNS of the banned player */; Jupiter::StringS name /** Name of the banned player */; Jupiter::StringS banner /** Name of the user who initiated the ban */; @@ -155,7 +156,7 @@ namespace RenX * @param reason Reason the player is getting banned * @param length Duration of the ban */ - void add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags = RenX::BanDatabase::Entry::FLAG_TYPE_GAME); + void add(const Jupiter::ReadableString &name, uint32_t ip, uint8_t prefix_length, uint64_t steamid, const Jupiter::ReadableString &hwid, const Jupiter::ReadableString &rdns, const Jupiter::ReadableString &banner, Jupiter::ReadableString &reason, std::chrono::seconds length, uint16_t flags = RenX::BanDatabase::Entry::FLAG_TYPE_GAME); /** * @brief Upgrades the ban database to the current write_version. @@ -211,7 +212,7 @@ namespace RenX private: /** Database version */ - const uint8_t write_version = 3U; + const uint8_t write_version = 5U; uint8_t read_version = write_version; fpos_t eof; diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 5ce57a2..64d9d34 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -510,6 +510,7 @@ void RenX::Server::banCheck(RenX::PlayerInfo *player) if ((this->localSteamBan && entry->steamid != 0 && entry->steamid == player->steamid) || (this->localIPBan && entry->ip != 0 && (entry->ip & netmask) == (player->ip32 & netmask)) + || (this->localHWIDBan && entry->hwid.isNotEmpty() && entry->hwid.equals(player->hwid)) || (this->localRDNSBan && entry->rdns.isNotEmpty() && entry->is_rdns_ban() && player->rdns_thread.joinable() == false && player->rdns.match(entry->rdns)) || (this->localNameBan && entry->name.isNotEmpty() && entry->name.equalsi(player->name))) { @@ -700,7 +701,7 @@ bool RenX::Server::fetchClientList() { RenX::Server::lastClientListUpdate = std::chrono::steady_clock::now(); if (this->rconVersion >= 4) - return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PING ADMIN STEAM IP PLAYERLOG\n")) > 0 + return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PING ADMIN STEAM IP HWID PLAYERLOG\n")) > 0 && RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cbotvarlist KILLS DEATHS SCORE CREDITS CHARACTER VEHICLE PLAYERLOG\n")) > 0; else return RenX::Server::sock.send(STRING_LITERAL_AS_REFERENCE("cclientvarlist KILLS\xA0""DEATHS\xA0""SCORE\xA0""CREDITS\xA0""CHARACTER\xA0""VEHICLE\xA0""PING\xA0""ADMIN\xA0""STEAM\xA0""IP\xA0""PLAYERLOG\n")) > 0 @@ -1396,7 +1397,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) isBot = false; id = idToken.asInt(10); }; - auto getPlayerOrAdd = [&](const Jupiter::ReadableString &name, int id, RenX::TeamType team, bool isBot, uint64_t steamid, const Jupiter::ReadableString &ip) + auto getPlayerOrAdd = [&](const Jupiter::ReadableString &name, int id, RenX::TeamType team, bool isBot, uint64_t steamid, const Jupiter::ReadableString &ip, const Jupiter::ReadableString &hwid) { RenX::PlayerInfo *r = this->getPlayer(id); if (r == nullptr) @@ -1407,6 +1408,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) r->team = team; r->ip = ip; r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); + r->hwid = hwid; if (this->resolvesRDNS() && r->ip32 != 0) { r->rdns_thread = std::thread(resolve_rdns, r); @@ -1447,6 +1449,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } recalcUUID = true; } + if (r->hwid.isEmpty() && hwid.isNotEmpty()) + { + r->hwid = hwid; + recalcUUID = true; + } if (r->steamid == 0U && steamid != 0U) { r->steamid = steamid; @@ -1472,18 +1479,24 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) auto parseGetPlayerOrAdd = [&parsePlayerData, &getPlayerOrAdd](const Jupiter::ReadableString &token) { PARSE_PLAYER_DATA_P(token); - return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty); + return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); }; - auto gotoToken = [&line, &tokens](size_t index) + auto gotoToken = [&line, &tokens, this](size_t index) { if (index >= tokens.token_count) return Jupiter::ReferenceString::empty; - size_t offset = index; + const char delim = this->getVersion() >= 4 ? RenX::DelimC : RenX::DelimC3; + const char *itr = line.ptr(); + while (index != 0) - offset += tokens.tokens[--index].size() + 1; + { + if (*itr == delim) + --index; + ++itr; + } - return Jupiter::ReferenceString::substring(line, offset); + return Jupiter::ReferenceString::substring(line, itr - line.ptr()); }; auto finished_connecting = [this, &xPlugins]() { @@ -1527,9 +1540,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) team = RenX::getTeam(teamToken); if (adminToken.equalsi("None"_jrs)) - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1)); + getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty); else - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1))->adminType = adminToken; + getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty)->adminType = adminToken; } } else if (this->lastCommand.equalsi("clientvarlist"_jrs)) @@ -1538,7 +1551,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->commandListFormat = tokens; else { - /* + /*e lRCON Command; Conn4 executed: clientvarlist PlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum rPlayerLog Kills PlayerKills BotKills Deaths Score Credits Character BoundVehicle Vehicle Spy RemoteC4 ATMine KDR Ping Admin Steam IP ID Name Team TeamNum rGDI,256,EKT-J 0 0 0 0 0 5217.9629 Rx_FamilyInfo_GDI_Soldier   False 0 0 0.0000 8 None 0x0110000104AE0666 127.0.0.1 256 EKT-J GDI 0 @@ -1590,7 +1603,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair("PlayerLog"_jrs); if (pair != nullptr) - parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), false, table.get("STEAM"_jrs).asUnsignedLongLong(), table.get("IP"_jrs))); + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), false, table.get("STEAM"_jrs).asUnsignedLongLong(), table.get("IP"_jrs), table.get("HWID"_jrs))); else { Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair("Name"_jrs); @@ -1608,6 +1621,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } if (player->ip.isEmpty()) player->ip = table.get("IP"_jrs); + if (player->hwid.isEmpty()) + player->hwid = table.get("HWID"_jrs); if (player->steamid == 0) { uint64_t steamid = table.get("STEAM"_jrs).asUnsignedLongLong(); @@ -1640,6 +1655,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (player->ip.isEmpty()) player->ip = table.get("IP"_jrs); + if (player->hwid.isEmpty()) + player->hwid = table.get("HWID"_jrs); if (player->steamid == 0) { uint64_t steamid = table.get("STEAM"_jrs).asUnsignedLongLong(); @@ -1720,7 +1737,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; Jupiter::INIFile::Section::KeyValuePair *pair = table.getPair("PlayerLog"_jrs); if (pair != nullptr) - parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').substring(1).asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), true, 0ULL, Jupiter::ReferenceString::empty)); + parse(getPlayerOrAdd(Jupiter::ReferenceString::getToken(pair->getValue(), 2, ','), Jupiter::ReferenceString::getToken(pair->getValue(), 1, ',').substring(1).asInt(), RenX::getTeam(Jupiter::ReferenceString::getToken(pair->getValue(), 0, ',')), true, 0ULL, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty)); else { Jupiter::INIFile::Section::KeyValuePair *namePair = table.getPair("Name"_jrs); @@ -2265,7 +2282,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) } else kID = kIDToken.asInt(); - RenX::PlayerInfo *killer = getPlayerOrAdd(kName, kID, vTeam, kIsBot, 0, Jupiter::ReferenceString::empty); + RenX::PlayerInfo *killer = getPlayerOrAdd(kName, kID, vTeam, kIsBot, 0, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); killer->kills++; if (damageType.equals("Rx_DmgType_Headshot")) killer->headshots++; @@ -2356,7 +2373,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) idToken.shiftRight(1); } id = idToken.asInt(); - RenX::PlayerInfo *player = getPlayerOrAdd(name, id, team, isBot, 0, Jupiter::ReferenceString::empty); + RenX::PlayerInfo *player = getPlayerOrAdd(name, id, team, isBot, 0, Jupiter::ReferenceString::empty, Jupiter::ReferenceString::empty); switch (type) { case RenX::ObjectType::Vehicle: @@ -2522,8 +2539,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (tokens.getToken(7).equals("steamid")) steamid = tokens.getToken(8).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4)); - player->hwid = tokens.getToken(6); + player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), tokens.getToken(6)); } else { @@ -2531,7 +2547,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (tokens.getToken(5).equals("steamid")) steamid = tokens.getToken(6).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4)); + player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), Jupiter::ReferenceString::empty); } if (steamid != 0ULL && default_ladder_database != nullptr && (player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_LADDER) == 0) @@ -2688,6 +2704,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) else for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnExecute(this, user, command); + if (this->rconUser.equals(user)) { this->lastCommand = cmd; @@ -3332,6 +3349,7 @@ void RenX::Server::init() RenX::Server::rconBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "RCONBan"_jrs, false); RenX::Server::localSteamBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalSteamBan"_jrs, true); RenX::Server::localIPBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalIPBan"_jrs, true); + RenX::Server::localHWIDBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalHWIDBan"_jrs, true); RenX::Server::localRDNSBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalRDNSBan"_jrs, false); RenX::Server::localNameBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, "LocalNameBan"_jrs, false); RenX::Server::localBan = RenX::Server::localIPBan || RenX::Server::localRDNSBan || RenX::Server::localSteamBan || RenX::Server::localNameBan; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 8cb68b1..72696c3 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -1044,6 +1044,7 @@ namespace RenX bool localBan; bool localSteamBan; bool localIPBan; + bool localHWIDBan; bool localRDNSBan; bool localNameBan; bool neverSay; diff --git a/RenX.Core/RenX_Tags.cpp b/RenX.Core/RenX_Tags.cpp index af9f96d..558d1c8 100644 --- a/RenX.Core/RenX_Tags.cpp +++ b/RenX.Core/RenX_Tags.cpp @@ -89,6 +89,7 @@ TagsImp::TagsImp() this->INTERNAL_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_RAW_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_IP_TAG = this->getUniqueInternalTag(); + this->INTERNAL_HWID_TAG = this->getUniqueInternalTag(); this->INTERNAL_RDNS_TAG = this->getUniqueInternalTag(); this->INTERNAL_STEAM_TAG = this->getUniqueInternalTag(); this->INTERNAL_UUID_TAG = this->getUniqueInternalTag(); @@ -141,6 +142,7 @@ TagsImp::TagsImp() this->INTERNAL_VICTIM_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_RAW_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_IP_TAG = this->getUniqueInternalTag(); + this->INTERNAL_VICTIM_HWID_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_RDNS_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_STEAM_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_UUID_TAG = this->getUniqueInternalTag(); @@ -273,6 +275,7 @@ TagsImp::TagsImp() this->nameTag = Jupiter::IRC::Client::Config->get(configSection, "NameTag"_jrs, "{NAME}"_jrs); this->rawNameTag = Jupiter::IRC::Client::Config->get(configSection, "RawNameTag"_jrs, "{RNAME}"_jrs); this->ipTag = Jupiter::IRC::Client::Config->get(configSection, "IPTag"_jrs, "{IP}"_jrs); + this->hwidTag = Jupiter::IRC::Client::Config->get(configSection, "HWIDTag"_jrs, "{HWID}"_jrs); this->rdnsTag = Jupiter::IRC::Client::Config->get(configSection, "RDNSTag"_jrs, "{RDNS}"_jrs); this->steamTag = Jupiter::IRC::Client::Config->get(configSection, "SteamTag"_jrs, "{STEAM}"_jrs); this->uuidTag = Jupiter::IRC::Client::Config->get(configSection, "UUIDTag"_jrs, "{UUID}"_jrs); @@ -325,6 +328,7 @@ TagsImp::TagsImp() this->victimNameTag = Jupiter::IRC::Client::Config->get(configSection, "VictimNameTag"_jrs, "{VNAME}"_jrs); this->victimRawNameTag = Jupiter::IRC::Client::Config->get(configSection, "VictimRawNameTag"_jrs, "{VRNAME}"_jrs); this->victimIPTag = Jupiter::IRC::Client::Config->get(configSection, "VictimIPTag"_jrs, "{VIP}"_jrs); + this->victimHWIDTag = Jupiter::IRC::Client::Config->get(configSection, "VictimHWIDTag"_jrs, "{VHWID}"_jrs); this->victimRDNSTag = Jupiter::IRC::Client::Config->get(configSection, "VictimRDNSTag"_jrs, "{VRDNS}"_jrs); this->victimSteamTag = Jupiter::IRC::Client::Config->get(configSection, "VictimSteamTag"_jrs, "{VSTEAM}"_jrs); this->victimUUIDTag = Jupiter::IRC::Client::Config->get(configSection, "VictimUUIDTag"_jrs, "{VUUID}"_jrs); @@ -474,6 +478,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_NAME_TAG, RenX::getFormattedPlayerName(player)); PROCESS_TAG(this->INTERNAL_RAW_NAME_TAG, player->name); PROCESS_TAG(this->INTERNAL_IP_TAG, player->ip); + PROCESS_TAG(this->INTERNAL_HWID_TAG, player->hwid); if (player->rdns_thread.joinable()) { PROCESS_TAG(this->INTERNAL_RDNS_TAG, RenX::rdns_pending); @@ -519,6 +524,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_VICTIM_NAME_TAG, RenX::getFormattedPlayerName(victim)); PROCESS_TAG(this->INTERNAL_VICTIM_RAW_NAME_TAG, victim->name); PROCESS_TAG(this->INTERNAL_VICTIM_IP_TAG, victim->ip); + PROCESS_TAG(this->INTERNAL_VICTIM_HWID_TAG, victim->hwid); if (victim->rdns_thread.joinable()) { PROCESS_TAG(this->INTERNAL_VICTIM_RDNS_TAG, RenX::rdns_pending); @@ -701,6 +707,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->nameTag, this->INTERNAL_NAME_TAG); fmt.replace(this->rawNameTag, this->INTERNAL_RAW_NAME_TAG); fmt.replace(this->ipTag, this->INTERNAL_IP_TAG); + fmt.replace(this->hwidTag, this->INTERNAL_HWID_TAG); fmt.replace(this->rdnsTag, this->INTERNAL_RDNS_TAG); fmt.replace(this->steamTag, this->INTERNAL_STEAM_TAG); fmt.replace(this->uuidTag, this->INTERNAL_UUID_TAG); @@ -753,6 +760,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->victimNameTag, this->INTERNAL_VICTIM_NAME_TAG); fmt.replace(this->victimRawNameTag, this->INTERNAL_VICTIM_RAW_NAME_TAG); fmt.replace(this->victimIPTag, this->INTERNAL_VICTIM_IP_TAG); + fmt.replace(this->victimHWIDTag, this->INTERNAL_VICTIM_HWID_TAG); fmt.replace(this->victimRDNSTag, this->INTERNAL_VICTIM_RDNS_TAG); fmt.replace(this->victimSteamTag, this->INTERNAL_VICTIM_STEAM_TAG); fmt.replace(this->victimUUIDTag, this->INTERNAL_VICTIM_UUID_TAG); diff --git a/RenX.Core/RenX_Tags.h b/RenX.Core/RenX_Tags.h index 78432c5..547d8c0 100644 --- a/RenX.Core/RenX_Tags.h +++ b/RenX.Core/RenX_Tags.h @@ -75,6 +75,7 @@ namespace RenX Jupiter::StringS INTERNAL_NAME_TAG; Jupiter::StringS INTERNAL_RAW_NAME_TAG; Jupiter::StringS INTERNAL_IP_TAG; + Jupiter::StringS INTERNAL_HWID_TAG; Jupiter::StringS INTERNAL_RDNS_TAG; Jupiter::StringS INTERNAL_STEAM_TAG; Jupiter::StringS INTERNAL_UUID_TAG; @@ -127,6 +128,7 @@ namespace RenX Jupiter::StringS INTERNAL_VICTIM_NAME_TAG; Jupiter::StringS INTERNAL_VICTIM_RAW_NAME_TAG; Jupiter::StringS INTERNAL_VICTIM_IP_TAG; + Jupiter::StringS INTERNAL_VICTIM_HWID_TAG; Jupiter::StringS INTERNAL_VICTIM_RDNS_TAG; Jupiter::StringS INTERNAL_VICTIM_STEAM_TAG; Jupiter::StringS INTERNAL_VICTIM_UUID_TAG; @@ -259,6 +261,7 @@ namespace RenX Jupiter::StringS nameTag; Jupiter::StringS rawNameTag; Jupiter::StringS ipTag; + Jupiter::StringS hwidTag; Jupiter::StringS rdnsTag; Jupiter::StringS steamTag; Jupiter::StringS uuidTag; @@ -311,6 +314,7 @@ namespace RenX Jupiter::StringS victimNameTag; Jupiter::StringS victimRawNameTag; Jupiter::StringS victimIPTag; + Jupiter::StringS victimHWIDTag; Jupiter::StringS victimRDNSTag; Jupiter::StringS victimSteamTag; Jupiter::StringS victimUUIDTag; diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index 26ce9d0..e69de2a 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -115,10 +115,10 @@ void RenX_LoggingPlugin::init() Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s!", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr())); RenX_LoggingPlugin::joinAdminFmt = Jupiter::IRC::Client::Config->get(this->getName(), "JoinAdminFormat"_jrs, - Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD " using Steam ID " IRCBOLD "%.*s" IRCBOLD ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->steamTag.size(), RenX::tags->steamTag.ptr())); + Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD " using Steam ID " IRCBOLD "%.*s" IRCBOLD ". HWID: \"" IRCBOLD "%.*s" IRCBOLD "\"", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->steamTag.size(), RenX::tags->steamTag.ptr(), RenX::tags->hwidTag.size(), RenX::tags->hwidTag.ptr())); RenX_LoggingPlugin::joinNoSteamAdminFmt = Jupiter::IRC::Client::Config->get(this->getName(), "JoinNoSteamAdminFormat"_jrs, - Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD ", but is " IRCBOLD "not" IRCBOLD " using Steam.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr())); + Jupiter::StringS::Format(IRCCOLOR "12[Join] " IRCBOLD "%.*s" IRCBOLD " joined the game fighting for the %.*s from " IRCBOLD "%.*s" IRCBOLD ", but is " IRCBOLD "not" IRCBOLD " using Steam. HWID: \"" IRCBOLD "%.*s" IRCBOLD "\"", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr(), RenX::tags->ipTag.size(), RenX::tags->ipTag.ptr(), RenX::tags->hwidTag.size(), RenX::tags->hwidTag.ptr())); RenX_LoggingPlugin::partFmt = Jupiter::IRC::Client::Config->get(this->getName(), "PartFormat"_jrs, Jupiter::StringS::Format(IRCCOLOR "12[Part] " IRCBOLD "%.*s" IRCBOLD " left the %.*s.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->teamLongTag.size(), RenX::tags->teamLongTag.ptr()));