X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_user%2Fcmd_away.cpp;h=d22886534b93a2356889126eef028f6a645e7d26;hb=a30a0074edac353cb60e134b43fa8ff0ffb67f8b;hp=fb720a5a7d61da7fcdf97a568e32da6fd6b1b1d2;hpb=761e6d75ba37b984998952940ed681e79e456142;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_user/cmd_away.cpp b/src/coremods/core_user/cmd_away.cpp index fb720a5a7..d22886534 100644 --- a/src/coremods/core_user/cmd_away.cpp +++ b/src/coremods/core_user/cmd_away.cpp @@ -1,8 +1,14 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2018 Sadie Powell + * Copyright (C) 2013-2014, 2016 Attila Molnar + * Copyright (C) 2012, 2019 Robby + * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2007 Robin Burchell + * Copyright (C) 2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2006, 2008, 2010 Craig Edwards * * 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 @@ -21,45 +27,62 @@ #include "inspircd.h" #include "core_user.h" +enum +{ + // From RFC 1459. + RPL_UNAWAY = 305, + RPL_NOWAWAY = 306 +}; + CommandAway::CommandAway(Module* parent) - : Command(parent, "AWAY", 0, 0) + : Command(parent, "AWAY", 0, 1) + , awayevprov(parent) { - syntax = "[]"; + allow_empty_last_param = false; + syntax = "[:]"; } /** Handle /AWAY */ -CmdResult CommandAway::Handle (const std::vector& parameters, User *user) +CmdResult CommandAway::Handle(User* user, const Params& parameters) { + LocalUser* luser = IS_LOCAL(user); ModResult MOD_RESULT; - if ((parameters.size()) && (!parameters[0].empty())) + if (!parameters.empty()) { - FIRST_MOD_RESULT(OnSetAway, MOD_RESULT, (user, parameters[0])); - - if (MOD_RESULT == MOD_RES_DENY && IS_LOCAL(user)) - return CMD_FAILURE; + std::string message(parameters[0]); + if (luser) + { + FIRST_MOD_RESULT_CUSTOM(awayevprov, Away::EventListener, OnUserPreAway, MOD_RESULT, (luser, message)); + if (MOD_RESULT == MOD_RES_DENY) + return CMD_FAILURE; + } user->awaytime = ServerInstance->Time(); - user->awaymsg.assign(parameters[0], 0, ServerInstance->Config->Limits.MaxAway); - + user->awaymsg.assign(message, 0, ServerInstance->Config->Limits.MaxAway); user->WriteNumeric(RPL_NOWAWAY, "You have been marked as being away"); + FOREACH_MOD_CUSTOM(awayevprov, Away::EventListener, OnUserAway, (user)); } else { - FIRST_MOD_RESULT(OnSetAway, MOD_RESULT, (user, "")); - - if (MOD_RESULT == MOD_RES_DENY && IS_LOCAL(user)) - return CMD_FAILURE; + if (luser) + { + FIRST_MOD_RESULT_CUSTOM(awayevprov, Away::EventListener, OnUserPreBack, MOD_RESULT, (luser)); + if (MOD_RESULT == MOD_RES_DENY) + return CMD_FAILURE; + } + user->awaytime = 0; user->awaymsg.clear(); user->WriteNumeric(RPL_UNAWAY, "You are no longer marked as being away"); + FOREACH_MOD_CUSTOM(awayevprov, Away::EventListener, OnUserBack, (user)); } return CMD_SUCCESS; } -RouteDescriptor CommandAway::GetRouting(User* user, const std::vector& parameters) +RouteDescriptor CommandAway::GetRouting(User* user, const Params& parameters) { return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST); }