X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_who.cpp;h=fdf8919a22e33a6c2af29001d535546b52d2f5c9;hb=49a165ef13cbe41dd7ed73e53a97437735868046;hp=305733e03e90694bb2397a27a9c91b96b82166b2;hpb=124c17e14134a4999afc1a5e981ab7c75b3694b9;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_who.cpp b/src/coremods/core_who.cpp index 305733e03..fdf8919a2 100644 --- a/src/coremods/core_who.cpp +++ b/src/coremods/core_who.cpp @@ -1,10 +1,16 @@ /* * InspIRCd -- Internet Relay Chat Daemon * - * Copyright (C) 2018 Peter Powell - * Copyright (C) 2014 Adam + * Copyright (C) 2019 linuxdaemon + * Copyright (C) 2017-2019 Sadie Powell + * Copyright (C) 2017-2018 Adam + * Copyright (C) 2013-2014, 2016 Attila Molnar + * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009-2010 Daniel De Graaf - * Copyright (C) 2007-2008 Robin Burchell + * Copyright (C) 2009 John Brooks + * Copyright (C) 2008 Robin Burchell + * Copyright (C) 2007-2008, 2010 Craig Edwards + * Copyright (C) 2007 Dennis Friis * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -22,6 +28,7 @@ #include "inspircd.h" #include "modules/account.h" +#include "modules/who.h" enum { @@ -33,31 +40,37 @@ enum RPL_WHOSPCRPL = 354 }; -struct WhoData -{ - // The flags for matching users to include. - std::bitset flags; - - // Whether we are matching using a wildcard or a flag. - bool fuzzy_match; +static const char whox_field_order[] = "tcuihsnfdlaor"; +static const char who_field_order[] = "cuhsnf"; - // The text to match against. - std::string matchtext; +struct WhoData : public Who::Request +{ + bool GetFieldIndex(char flag, size_t& out) const CXX11_OVERRIDE + { + if (!whox) + { + const char* pos = strchr(who_field_order, flag); + if (pos == NULL) + return false; - // The WHO/WHOX responses we will send to the source. - std::vector results; + out = pos - who_field_order; + return true; + } - // Whether the source requested a WHOX response. - bool whox; + if (!whox_fields[flag]) + return false; - // The fields to include in the WHOX response. - std::bitset whox_fields; + out = 0; + for (const char* c = whox_field_order; *c && *c != flag; ++c) + { + if (whox_fields[*c]) + ++out; + } - // A user specified label for the WHOX response. - std::string whox_querytype; + return whox_field_order[out]; + } - WhoData(const std::vector& parameters) - : whox(false) + WhoData(const CommandBase::Params& parameters) { // Find the matchtext and swap the 0 for a * so we can use InspIRCd::Match on it. matchtext = parameters.size() > 2 ? parameters[2] : parameters[0]; @@ -105,6 +118,7 @@ class CommandWho : public SplitCommand ChanModeReference privatemode; UserModeReference hidechansmode; UserModeReference invisiblemode; + Events::ModuleEventProvider whoevprov; /** Determines whether a user can view the users of a channel. */ bool CanView(Channel* chan, User* user) @@ -137,7 +151,7 @@ class CommandWho : public SplitCommand } /** Determines whether WHO flags match a specific channel user. */ - static bool MatchChannel(LocalUser* source, Membership* memb, WhoData& data); + bool MatchChannel(LocalUser* source, Membership* memb, WhoData& data); /** Determines whether WHO flags match a specific user. */ static bool MatchUser(LocalUser* source, User* target, WhoData& data); @@ -160,15 +174,16 @@ class CommandWho : public SplitCommand , privatemode(parent, "private") , hidechansmode(parent, "hidechans") , invisiblemode(parent, "invisible") + , whoevprov(parent, "event/who") { allow_empty_last_param = false; - syntax = "|||||0 [[Aafhilmnoprstu] |||||0]"; + syntax = "|||||0 [[Aafhilmnoprstux][%acdfhilnorstu] |||||0]"; } /** Sends a WHO reply to a user. */ void SendWhoLine(LocalUser* user, const std::vector& parameters, Membership* memb, User* u, WhoData& data); - CmdResult HandleLocal(const std::vector& parameters, LocalUser* user) CXX11_OVERRIDE; + CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE; }; template<> User* CommandWho::GetUser(UserManager::OperList::const_iterator& t) { return *t; } @@ -293,7 +308,7 @@ bool CommandWho::MatchUser(LocalUser* source, User* user, WhoData& data) long port; while ((port = portrange.GetToken())) { - if (port == lu->GetServerPort()) + if (port == lu->server_sa.port()) { match = true; break; @@ -304,7 +319,7 @@ bool CommandWho::MatchUser(LocalUser* source, User* user, WhoData& data) // The source wants to match against users' real names. else if (data.flags['r']) - match = InspIRCd::Match(user->fullname, data.matchtext, ascii_case_insensitive_map); + match = InspIRCd::Match(user->GetRealName(), data.matchtext, ascii_case_insensitive_map); else if (data.flags['s']) { @@ -340,7 +355,7 @@ bool CommandWho::MatchUser(LocalUser* source, User* user, WhoData& data) } if (!match) - match = InspIRCd::Match(user->fullname, data.matchtext, ascii_case_insensitive_map); + match = InspIRCd::Match(user->GetRealName(), data.matchtext, ascii_case_insensitive_map); if (!match) match = InspIRCd::Match(user->nick, data.matchtext); @@ -484,7 +499,7 @@ void CommandWho::SendWhoLine(LocalUser* source, const std::vector& // Include the user's real name. if (data.whox_fields['r']) - wholine.push(user->fullname); + wholine.push(user->GetRealName()); } else { @@ -530,16 +545,16 @@ void CommandWho::SendWhoLine(LocalUser* source, const std::vector& // Include the number of hops between the users and the user's real name. wholine.push("0 "); - wholine.GetParams().back().append(user->fullname); + wholine.GetParams().back().append(user->GetRealName()); } ModResult res; - FIRST_MOD_RESULT(OnSendWhoLine, res, (source, parameters, user, memb, wholine)); + FIRST_MOD_RESULT_CUSTOM(whoevprov, Who::EventListener, OnWhoLine, res, (data, source, user, memb, wholine)); if (res != MOD_RES_DENY) data.results.push_back(wholine); } -CmdResult CommandWho::HandleLocal(const std::vector& parameters, LocalUser* user) +CmdResult CommandWho::HandleLocal(LocalUser* user, const Params& parameters) { WhoData data(parameters);