summaryrefslogtreecommitdiff
path: root/src/mode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mode.cpp')
-rw-r--r--src/mode.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/mode.cpp b/src/mode.cpp
index f3cf54e6a..790720c6b 100644
--- a/src/mode.cpp
+++ b/src/mode.cpp
@@ -65,8 +65,8 @@ using namespace std;
/* +n (notice mask - our implementation of snomasks) */
#include "modes/umode_n.h"
-ModeHandler::ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly)
- : ServerInstance(Instance), mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly)
+ModeHandler::ModeHandler(InspIRCd* Instance, char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly, char mprefix)
+ : ServerInstance(Instance), mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly), prefix(mprefix)
{
}
@@ -79,6 +79,11 @@ bool ModeHandler::IsListMode()
return list;
}
+unsigned int ModeHandler::GetPrefixRank()
+{
+ return 0;
+}
+
ModeType ModeHandler::GetModeType()
{
return m_type;
@@ -89,6 +94,11 @@ bool ModeHandler::NeedsOper()
return oper;
}
+char ModeHandler::GetPrefix()
+{
+ return prefix;
+}
+
int ModeHandler::GetNumParams(bool adding)
{
return adding ? n_params_on : n_params_off;
@@ -273,9 +283,10 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool
*/
if ((targetchannel) && (pcnt == 2))
{
+ ServerInstance->Log(DEBUG,"Spool list");
const char* mode = parameters[1];
if (*mode == '+')
- mode++;
+ mode++;
unsigned char handler_id = ((*mode) - 65) | MASK_CHANNEL;
ModeHandler* mh = modehandlers[handler_id];
if ((mh) && (mh->IsListMode()))
@@ -287,10 +298,13 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool
if (pcnt == 1)
{
+ ServerInstance->Log(DEBUG,"Mode list request");
this->DisplayCurrentModes(user, targetuser, targetchannel, parameters[0]);
}
else if (pcnt > 1)
{
+ ServerInstance->Log(DEBUG,"More than one parameter");
+
if (targetchannel)
{
type = MODETYPE_CHANNEL;
@@ -341,6 +355,8 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool
{
unsigned char modechar = *letter;
+ ServerInstance->Log(DEBUG,"Process letter %c", modechar);
+
switch (modechar)
{
/* NB:
@@ -397,7 +413,7 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool
parameter = parameters[parameter_counter++];
/* Yerk, invalid! */
- if ((parameter.rfind(':') || (parameter.rfind(' '))))
+ if ((parameter.rfind(':') != std::string::npos) || (parameter.rfind(' ') != std::string::npos))
parameter = "";
}
else
@@ -436,7 +452,17 @@ void ModeParser::Process(const char** parameters, int pcnt, userrec *user, bool
/* Is there a valid parameter for this mode? If so add it to the parameter list */
if ((modehandlers[handler_id]->GetNumParams(adding)) && (parameter != ""))
+ {
parameter_list << " " << parameter;
+ /* Does this mode have a prefix? */
+ if (modehandlers[handler_id]->GetPrefix() && targetchannel)
+ {
+ userrec* user_to_prefix = ServerInstance->FindNick(parameter);
+ if (user_to_prefix)
+ targetchannel->SetPrefix(user_to_prefix, modehandlers[handler_id]->GetPrefix(),
+ modehandlers[handler_id]->GetPrefixRank(), adding);
+ }
+ }
/* Call all the AfterMode events in the mode watchers for this mode */
for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++)