From 27f2adcd4cf304c0e6f4e228fb163cc737dcbb8a Mon Sep 17 00:00:00 2001 From: JAJames Date: Tue, 8 Mar 2016 23:59:37 -0500 Subject: [PATCH] Player reverse DNS resolution is now threaded. Updated Jupiter. --- Jupiter | 2 +- Release/Bot.lib | Bin 24762 -> 24762 bytes Release/Plugins/RenX.Core.lib | Bin 198102 -> 197340 bytes RenX.Core/RenX_BanDatabase.cpp | 2 + RenX.Core/RenX_PlayerInfo.h | 9 +++- RenX.Core/RenX_Plugin.cpp | 5 +++ RenX.Core/RenX_Plugin.h | 1 + RenX.Core/RenX_Server.cpp | 73 ++++++++++++++++++++++++++++++--- RenX.Core/RenX_Server.h | 1 + RenX.Core/RenX_Tags.cpp | 18 +++++++- RenX.Logging/RenX_Logging.cpp | 25 ++++++++++- RenX.Logging/RenX_Logging.h | 4 ++ 12 files changed, 129 insertions(+), 11 deletions(-) diff --git a/Jupiter b/Jupiter index 5620679..2d834a6 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 5620679e80b2489358d0bdcb90e03ca5f530dbde +Subproject commit 2d834a64a6123f968531f81d797f4a97be1f0cac diff --git a/Release/Bot.lib b/Release/Bot.lib index bebfc5faa49a3d11862b4db45a6d366b1c8a7299..0cbc00523131954b9ec683d29fcb46848b93c0d7 100644 GIT binary patch delta 1905 zcmZuxJ4{ni7;Y^f3Xw{o7gK>EASlMx2qBkR+EQBRo3<3FEp3SqCsQ1VIxrYR9DHE% z$H@?3a58{|jl>5dgCUM2l1|3KK^%;OiF(fc?>RkfY^VF>`@ipho}FFo&aU>^*{WVy zzAE>_d`8-mCr#{gHPp1dVY*xV_8ASm{rzVAEgG&jLxR}Ewa8$=q5KDbsM zt%yeL4w1cXH`G$mb|P9q{-CWhK*8QAa-O@9(?U3v$T7mQtGe8Ic@Xn{HE8GIAqoDf zaHAv1V14YOlFXVT!60W6p$pD9gRF504wI<4>0D$mnF{2G5ze|o3|{p~u;)U!;Bt$w zV+i5IP)Y4#Lr;;0e$bg9?dH>`f`pC%`{N*a+cKEOTyDC=;jmX*9re=Q9XJd>mT!A@tG5 zZS;PG?Ebl8pak#zxN_a3!dAL+r}bv|cpEn8=}pNb`7V;YV`g?1qNzSuj5RWzHG+!M zk(&(C`z6?nq2jLyZwH0%jUl`|c0**>Me#)l5ThQl2fM~$Xh~L!KD5r2ag5%L@;cc8 z+GG3xReR+%7$Jg}$*sf7;|_3)@y)Wv)vV(W%knru3#NHkVL#Ch&T%Irs2M1PON4Mm zA$%S;GXiUcCBa)EPG>K{v!)M%WdduC5vg8M^Sh1!shKYZtzt&Kny(XFkVe)`VH@sG z-saW<+&T4Mc&`YvC+b$R{E1SoF-tNUAQ{!xPr*Wr_l#!r|r_nk{tewRAsH+V&rpu?JM7Cvk qr(V1#$f3xioaGEASlKbg*2s>w)6pgQQA_VwzLo-P6ix^IxrYR9DHE% z$Hc@C%iyGfgpI^UM+QS2i4rE`;2;jh!9+dh{`Z`oHn!9K^8MfUKhIWPy_Hu#I$3ey zqNTg12j(-#_$!#;glms56iB~Qs?D<%=>x2ori}d z_^ZJ6jwFM%v9oeAtBwSNoJoYvIO7a5$0gWHqUO4Dk-=mtFy}!y>k2bC=a*pHh48-1 zEy9iggcAcrwTlfsMjHBFV}P`qPoD}Bikzs`T@*<=BEv7-wt|ly4teTi_=LyGU?o|3 za3<2fTHB=3~8sSfX&&C+Uuy8QT!o+dy2aDQh3t`pK5Kl$y z?oOzvyS-s#2g4Dr9aa(-AqlL*$czj}3rq>#4C}P?rmQ6S4wAfMdS(Wqsa{x&)ia(s zf{K%os|?ZxBv_B3;;#sA2Ze8qAiO+sMP%1R@kIy{qb{-sdA$dkl9i$lt#f4*qw`T- zCp$oUj31z4FTVzZMDRShb$E8z0ge&AS?0Ksb^LBg9!F@wG!HZEBwE2a>SP2Z1DSA+ z5V~c;=TRdguvVB7ycObfwi7&S`XHFbu;v(%>LE41Z3~i``C`y2rj@JtI>rTQWX%M& z;r94-ZY{v=6aR&`3ov`4t|d#KDES(*B%?l(QFZMEEW~)vXhsh%W71(lu@TC~X2&1C tmJIJS^H|An4?2_bEVj^)EqZpB6!>Y@#jM4>tC`}u^hg(`P~_f}=^yzQW8VM( diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index acae2dff4b096bf6e9c316fd4336490aa36af54e..ca155b3772c97205e99eec024b0fe254fee73529 100644 GIT binary patch delta 23146 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 QhDQ!i{h+r!lPcGL0HWK#^#A|> delta 23414 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 diff --git a/RenX.Core/RenX_BanDatabase.cpp b/RenX.Core/RenX_BanDatabase.cpp index 382f5bf..5bb3050 100644 --- a/RenX.Core/RenX_BanDatabase.cpp +++ b/RenX.Core/RenX_BanDatabase.cpp @@ -165,6 +165,8 @@ void RenX::BanDatabase::add(RenX::Server *server, const RenX::PlayerInfo *player entry->steamid = player->steamid; entry->ip = player->ip32; entry->prefix_length = 32U; + if (player->rdns_thread.joinable()) + player->rdns_thread.join(); entry->rdns = player->rdns; entry->name = player->name; entry->banner = banner; diff --git a/RenX.Core/RenX_PlayerInfo.h b/RenX.Core/RenX_PlayerInfo.h index a159f04..006a0dd 100644 --- a/RenX.Core/RenX_PlayerInfo.h +++ b/RenX.Core/RenX_PlayerInfo.h @@ -25,6 +25,9 @@ */ #include +#include +#include +#include "Jupiter/Reference_String.h" #include "Jupiter/String.h" #include "Jupiter/INIFile.h" #include "RenX.h" @@ -48,11 +51,12 @@ namespace RenX // TODO: Add backpack Jupiter::StringS name; Jupiter::StringS ip; - Jupiter::StringS rdns; Jupiter::StringS adminType; Jupiter::StringS uuid; Jupiter::StringS character; Jupiter::StringS vehicle; + Jupiter::StringS rdns; + std::mutex rdns_mutex; uint64_t steamid = 0; uint32_t ip32 = 0; uint16_t ban_flags = 0; @@ -61,6 +65,7 @@ namespace RenX int id = 0; bool isBot = false; bool is_dev = false; + bool rdns_resolved = false; unsigned short ping = 0; double score = 0.0f; double credits = 0.0f; @@ -85,10 +90,12 @@ namespace RenX mutable Jupiter::StringS gamePrefix; mutable Jupiter::StringS formatNamePrefix; + mutable std::thread rdns_thread; mutable int access = 0; mutable Jupiter::INIFile varData; // This will be replaced later with a more dedicated type. }; + static Jupiter::ReferenceString rdns_pending = STRING_LITERAL_AS_REFERENCE("RDNS_PENDING"); } /** Re-enable warnings */ diff --git a/RenX.Core/RenX_Plugin.cpp b/RenX.Core/RenX_Plugin.cpp index 5d51432..fea2447 100644 --- a/RenX.Core/RenX_Plugin.cpp +++ b/RenX.Core/RenX_Plugin.cpp @@ -61,6 +61,11 @@ void RenX::Plugin::RenX_OnPlayerUUIDChange(Server *, const RenX::PlayerInfo *, c return; } +void RenX::Plugin::RenX_OnPlayerRDNS(Server *, const RenX::PlayerInfo *) +{ + return; +} + void RenX::Plugin::RenX_OnServerCreate(Server *) { return; diff --git a/RenX.Core/RenX_Plugin.h b/RenX.Core/RenX_Plugin.h index 595b3b7..3ee54d8 100644 --- a/RenX.Core/RenX_Plugin.h +++ b/RenX.Core/RenX_Plugin.h @@ -48,6 +48,7 @@ namespace RenX virtual void RenX_OnPlayerCreate(Server *server, const PlayerInfo *player); virtual void RenX_OnPlayerDelete(Server *server, const PlayerInfo *player); virtual void RenX_OnPlayerUUIDChange(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &newUUID); + virtual void RenX_OnPlayerRDNS(Server *server, const PlayerInfo *player); virtual void RenX_OnServerCreate(Server *server); virtual void RenX_OnServerDisconnect(Server *server, RenX::DisconnectReason reason); virtual bool RenX_OnBan(Server *server, const PlayerInfo *player, Jupiter::StringType &data); diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index d69a0d3..911874c 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -59,9 +59,40 @@ int RenX::Server::think() } else { + auto cycle_player_rdns = [this]() // Cycles through any pending RDNS resolutions, and fires events as necessary. + { + if (this->player_rdns_resolutions_pending != 0) + { + RenX::PlayerInfo *player; + Jupiter::ArrayList &xPlugins = *RenX::getCore()->getPlugins(); + for (Jupiter::DLList::Node *node = this->players.getNode(0); node != nullptr; node = node->next) + { + player = node->data; + if (player->rdns_thread.joinable() && player->rdns_mutex.try_lock()) // RDNS event hasn't fired AND RDNS value has been resolved + { + player->rdns_mutex.unlock(); + player->rdns_thread.join(); + --this->player_rdns_resolutions_pending; + + // Check for bans + this->banCheck(player); + + // Fire RDNS resolved event + for (size_t index = 0; index < xPlugins.size(); ++index) + xPlugins.get(++index)->RenX_OnPlayerRDNS(this, player); + + if (this->player_rdns_resolutions_pending == 0) // No more resolutions pending + return; + } + } + } + }; + // Connected and fine - if (RenX::Server::sock.recv() > 0) + if (RenX::Server::sock.recv() > 0) // Data received { + cycle_player_rdns(); + Jupiter::ReadableString::TokenizeResult result = Jupiter::ReferenceString::tokenize(RenX::Server::sock.getBuffer(), '\n'); if (result.token_count != 0) { @@ -77,8 +108,10 @@ int RenX::Server::think() } } } - else if (Jupiter::Socket::getLastError() == 10035) + else if (Jupiter::Socket::getLastError() == 10035) // Operation would block (no new data) { + cycle_player_rdns(); + if (RenX::Server::awaitingPong == false && std::chrono::steady_clock::now() - RenX::Server::lastActivity >= RenX::Server::pingRate) { RenX::Server::lastActivity = std::chrono::steady_clock::now(); @@ -464,7 +497,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->localRDNSBan && entry->rdns.isNotEmpty() && entry->is_rdns_ban() && player->rdns.match(entry->rdns)) + || (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))) { player->ban_flags |= entry->flags; @@ -625,6 +658,13 @@ bool RenX::Server::removePlayer(int id) xPlugins.get(i)->RenX_OnPlayerDelete(this, p); if (p->isBot) --this->bot_count; + + if (p->rdns_thread.joinable()) // Close the RDNS thread, if one exists + { + --this->player_rdns_resolutions_pending; + p->rdns_thread.join(); + } + delete p; return true; } @@ -1151,6 +1191,14 @@ void RenX::Server::sendLogChan(const Jupiter::ReadableString &msg) const } } +void resolve_rdns(RenX::PlayerInfo *player) +{ + player->rdns_mutex.lock(); + char *resolved = Jupiter::Socket::resolveHostname_alloc(Jupiter::CStringS(player->ip).c_str(), 0); + player->rdns.capture(resolved, strlen(resolved)); + player->rdns_mutex.unlock(); +} + #define PARSE_PLAYER_DATA_P(DATA) \ Jupiter::ReferenceString name; \ TeamType team; \ @@ -1277,7 +1325,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) r->ip = ip; r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); if (this->resolvesRDNS() && r->ip32 != 0) - r->rdns = Jupiter::Socket::resolveHostname(Jupiter::CStringS(r->ip).c_str(), 0); + { + r->rdns_thread = std::thread(resolve_rdns, r); + ++this->player_rdns_resolutions_pending; + } r->steamid = steamid; if (r->isBot = isBot) r->formatNamePrefix = IRCCOLOR "05[B]"; @@ -1306,7 +1357,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { r->ip = ip; r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); - r->rdns = Jupiter::Socket::resolveHostname(Jupiter::CStringS(r->ip).c_str(), 0); + if (this->resolvesRDNS()) + { + r->rdns_thread = std::thread(resolve_rdns, r); + ++this->player_rdns_resolutions_pending; + } recalcUUID = true; } if (r->steamid == 0U && steamid != 0U) @@ -3056,9 +3111,17 @@ void RenX::Server::wipeData() player = RenX::Server::players.remove(0U); for (size_t index = 0; index < xPlugins.size(); ++index) xPlugins.get(index)->RenX_OnPlayerDelete(this, player); + + if (player->rdns_thread.joinable()) // Close the RDNS thread, if one exists + { + --this->player_rdns_resolutions_pending; + player->rdns_thread.join(); + } + delete player; } RenX::Server::bot_count = 0; + RenX::Server::player_rdns_resolutions_pending = 0; RenX::Server::buildings.emptyAndDelete(); RenX::Server::mutators.emptyAndDelete(); RenX::Server::maps.emptyAndDelete(); diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 41e1339..ad90fd7 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -975,6 +975,7 @@ namespace RenX int mineLimit = 0; int timeLimit = 0; size_t bot_count = 0; + size_t player_rdns_resolutions_pending = 0; unsigned int rconVersion = 0; double crateRespawnAfterPickup = 0.0; uuid_func calc_uuid; diff --git a/RenX.Core/RenX_Tags.cpp b/RenX.Core/RenX_Tags.cpp index a09d7ab..0669a29 100644 --- a/RenX.Core/RenX_Tags.cpp +++ b/RenX.Core/RenX_Tags.cpp @@ -499,7 +499,14 @@ 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_RDNS_TAG, player->rdns); + if (player->rdns_thread.joinable()) + { + PROCESS_TAG(this->INTERNAL_RDNS_TAG, RenX::rdns_pending); + } + else + { + PROCESS_TAG(this->INTERNAL_RDNS_TAG, player->rdns); + } PROCESS_TAG(this->INTERNAL_UUID_TAG, player->uuid); PROCESS_TAG(this->INTERNAL_ID_TAG, Jupiter::StringS::Format("%d", player->id)); PROCESS_TAG(this->INTERNAL_CHARACTER_TAG, RenX::translateName(player->character)); @@ -537,7 +544,14 @@ 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_RDNS_TAG, victim->rdns); + if (victim->rdns_thread.joinable()) + { + PROCESS_TAG(this->INTERNAL_VICTIM_RDNS_TAG, RenX::rdns_pending); + } + else + { + PROCESS_TAG(this->INTERNAL_VICTIM_RDNS_TAG, victim->rdns); + } PROCESS_TAG(this->INTERNAL_VICTIM_UUID_TAG, victim->uuid); PROCESS_TAG(this->INTERNAL_VICTIM_ID_TAG, Jupiter::StringS::Format("%d", victim->id)); PROCESS_TAG(this->INTERNAL_VICTIM_CHARACTER_TAG, RenX::translateName(victim->character)); diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index 95edaef..bfa730e 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -30,6 +30,7 @@ using namespace Jupiter::literals; void RenX_LoggingPlugin::init() { RenX_LoggingPlugin::muteOwnExecute = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "MuteOwnExecute"_jrs, true); + RenX_LoggingPlugin::playerRDNSPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "PlayerRDNSPublic"_jrs, false); RenX_LoggingPlugin::joinPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "JoinPublic"_jrs, true); RenX_LoggingPlugin::partPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "PartPublic"_jrs, true); RenX_LoggingPlugin::kickPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "KickPublic"_jrs, true); @@ -107,14 +108,17 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::otherPublic = Jupiter::IRC::Client::Config->getBool(RenX_LoggingPlugin::getName(), "OtherPublic"_jrs, false); /** Event formats */ + RenX_LoggingPlugin::playerRDNSFmt = Jupiter::IRC::Client::Config->get(this->getName(), "PlayerRDNSFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "05[RDNS] " IRCBOLD "%.*s" IRCNORMAL "'s hostname is " IRCBOLD "%.*s", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->rdnsTag.size(), RenX::tags->rdnsTag.ptr())); + RenX_LoggingPlugin::joinPublicFmt = Jupiter::IRC::Client::Config->get(this->getName(), "JoinPublicFormat"_jrs, 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 ". Their hostname is: " IRCBOLD "%.*s", 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->rdnsTag.size(), RenX::tags->rdnsTag.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 ".", 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_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. Their hostname is: " IRCBOLD "%.*s", 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->rdnsTag.size(), RenX::tags->rdnsTag.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.", 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_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())); @@ -416,6 +420,7 @@ void RenX_LoggingPlugin::init() Jupiter::StringS::Format(IRCCOLOR "06[Other]" IRCCOLOR " %.*s", RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); /** Sanitize tags */ + RenX::sanitizeTags(playerRDNSFmt); RenX::sanitizeTags(joinPublicFmt); RenX::sanitizeTags(joinAdminFmt); RenX::sanitizeTags(joinNoSteamAdminFmt); @@ -523,6 +528,22 @@ void RenX_LoggingPlugin::init() typedef void(RenX::Server::*logFuncType)(const Jupiter::ReadableString &msg) const; +void RenX_LoggingPlugin::RenX_OnPlayerRDNS(RenX::Server *server, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::playerRDNSPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->playerRDNSFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + (server->*func)(msg); + } +} + void RenX_LoggingPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) { Jupiter::String msg; diff --git a/RenX.Logging/RenX_Logging.h b/RenX.Logging/RenX_Logging.h index 3d124f5..0e2088e 100644 --- a/RenX.Logging/RenX_Logging.h +++ b/RenX.Logging/RenX_Logging.h @@ -25,6 +25,8 @@ class RenX_LoggingPlugin : public RenX::Plugin { public: // RenX::Plugin + void RenX_OnPlayerRDNS(RenX::Server *server, const RenX::PlayerInfo *player) override; + void RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnKick(RenX::Server *server, const RenX::PlayerInfo *player, const Jupiter::ReadableString &reason) override; @@ -135,6 +137,7 @@ private: STRING_LITERAL_AS_NAMED_REFERENCE(name, "RenX.Logging"); unsigned int muteOwnExecute : 1; + unsigned int playerRDNSPublic : 1; unsigned int joinPublic : 1; unsigned int partPublic : 1; unsigned int kickPublic : 1; @@ -212,6 +215,7 @@ private: unsigned int otherPublic : 1; /** Event formats */ + Jupiter::String playerRDNSFmt; Jupiter::StringS joinPublicFmt, joinAdminFmt, joinNoSteamAdminFmt; Jupiter::StringS partFmt; Jupiter::StringS kickFmt;