diff options
-rw-r--r-- | include/modes/cmode_b.h | 1 | ||||
-rw-r--r-- | src/mode.cpp | 21 | ||||
-rw-r--r-- | src/modes/cmode_b.cpp | 11 |
3 files changed, 32 insertions, 1 deletions
diff --git a/include/modes/cmode_b.h b/include/modes/cmode_b.h index 60462d73a..df638005e 100644 --- a/include/modes/cmode_b.h +++ b/include/modes/cmode_b.h @@ -10,5 +10,6 @@ class ModeChannelBan : public ModeHandler ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding); std::string& AddBan(userrec *user,std::string& dest,chanrec *chan,int status); std::string& DelBan(userrec *user,std::string& dest,chanrec *chan,int status); + void DisplayList(userrec* user, chanrec* channel); }; diff --git a/src/mode.cpp b/src/mode.cpp index 25c98fd1a..3dcfec5dc 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -304,12 +304,31 @@ void ModeParser::Process(char **parameters, int pcnt, userrec *user, bool server WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]); return; } + + /* Special case for displaying the list for listmodes, + * e.g. MODE #chan b, or MODE #chan +b without a parameter + */ + if ((type== MODETYPE_CHANNEL) && (pcnt == 2)) + { + char* mode = parameters[1]; + if (*mode == '+') + mode++; + + unsigned char handler_id = ((*mode) - 65) | mask; + ModeHandler* mh = modehandlers[handler_id]; + + if ((mh) && (mh->IsListMode())) + { + mh->DisplayList(user, targetchannel); + } + } + std::string mode_sequence = parameters[1]; std::string parameter = ""; std::ostringstream parameter_list; std::string output_sequence = ""; bool adding = true, state_change = false; - int handler_id = 0; + unsigned char handler_id = 0; int parameter_counter = 2; /* Index of first parameter */ for (std::string::const_iterator letter = mode_sequence.begin(); letter != mode_sequence.end(); letter++) diff --git a/src/modes/cmode_b.cpp b/src/modes/cmode_b.cpp index 5d709d4b7..ccc6bdfcf 100644 --- a/src/modes/cmode_b.cpp +++ b/src/modes/cmode_b.cpp @@ -45,6 +45,17 @@ ModeAction ModeChannelBan::OnModeChange(userrec* source, userrec* dest, chanrec* return MODEACTION_ALLOW; } +void ModeChannelBan::DisplayList(userrec* user, chanrec* channel) +{ + /* Display the channel banlist */ + for (BanList::iterator i = channel->bans.begin(); i != channel->bans.end(); i++) + { + WriteServ(user->fd,"367 %s %s %s %s %d",user->nick, channel->name, i->data, i->set_by, i->set_time); + } + WriteServ(user->fd,"368 %s %s :End of channel ban list",user->nick, channel->name); + return; +} + std::string& ModeChannelBan::AddBan(userrec *user,std::string &dest,chanrec *chan,int status) { if ((!user) || (!chan)) |