summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-10-27 01:42:10 +0000
committerAdam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864>2009-10-27 01:42:10 +0000
commitc64c2b6fd0c9114c1991a9bf17d1db31a5876bf4 (patch)
tree910cbb7e011dbb494047e1b16fa4a28520cefd2f /src
parenta491eed3ff1982b1b1a048355254b7b14f860a7c (diff)
Rewrote part of chan_set_correct_modes and set Mode::ModeChar correctly
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2590 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src')
-rw-r--r--src/channels.c115
-rw-r--r--src/modes.cpp2
2 files changed, 62 insertions, 55 deletions
diff --git a/src/channels.c b/src/channels.c
index 1013d7e9d..655928d4d 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -1619,16 +1619,18 @@ void do_topic(const char *source, int ac, const char **av)
**/
void chan_set_correct_modes(User * user, Channel * c, int give_modes)
{
- char modebuf[BUFSIZE];
- char userbuf[BUFSIZE];
+ std::string modebuf, userbuf;
int status;
int add_modes = 0;
int rem_modes = 0;
ChannelInfo *ci;
- ChannelMode *owner, *admin;
+ ChannelMode *owner, *admin, *op, *halfop, *voice;
owner = ModeManager::FindChannelModeByName(CMODE_OWNER);
admin = ModeManager::FindChannelModeByName(CMODE_PROTECT);
+ op = ModeManager::FindChannelModeByName(CMODE_OP);
+ halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP);
+ voice = ModeManager::FindChannelModeByName(CMODE_VOICE);
if (!c || !(ci = c->ci))
return;
@@ -1688,70 +1690,73 @@ void chan_set_correct_modes(User * user, Channel * c, int give_modes)
if (!add_modes && !rem_modes)
return;
- /* No need for strn* functions for modebuf, as every possible string
- * will always fit in. -GD
- */
- strlcpy(modebuf, "", sizeof(modebuf));
- strlcpy(userbuf, "", sizeof(userbuf));
- if (add_modes > 0) {
- strcat(modebuf, "+");
- if ((add_modes & CUS_OWNER) && !(status & CUS_OWNER)) {
- strlcat(modebuf, &owner->ModeChar, sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
- } else {
+ if (add_modes > 0)
+ {
+ modebuf += "+";
+
+ if (owner && (add_modes & CUS_OWNER) && !(status & CUS_OWNER))
+ {
+ modebuf += owner->ModeChar;
+ userbuf += " " + std::string(user->nick);
+ }
+ else
add_modes &= ~CUS_OWNER;
+
+ if (admin && (add_modes & CUS_PROTECT) && !(status & CUS_PROTECT))
+ {
+ modebuf += admin->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if ((add_modes & CUS_PROTECT) && !(status & CUS_PROTECT)) {
- strlcat(modebuf, &admin->ModeChar, sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
- } else {
+ else
add_modes &= ~CUS_PROTECT;
+
+ if (op && (add_modes & CUS_OP) && !(status & CUS_OP)) {
+ modebuf += op->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if ((add_modes & CUS_OP) && !(status & CUS_OP)) {
- strlcat(modebuf, "o", sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
- } else {
+ else
add_modes &= ~CUS_OP;
+
+ if (halfop && (add_modes & CUS_HALFOP) && !(status & CUS_HALFOP)) {
+ modebuf += halfop->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if ((add_modes & CUS_HALFOP) && !(status & CUS_HALFOP)) {
- strlcat(modebuf, "h", sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
- } else {
+ else
add_modes &= ~CUS_HALFOP;
- }
+
if ((add_modes & CUS_VOICE) && !(status & CUS_VOICE)) {
- strlcat(modebuf, "v", sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
- } else {
- add_modes &= ~CUS_VOICE;
+ modebuf += voice->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
+ else
+ add_modes &= ~CUS_VOICE;
}
- if (rem_modes > 0) {
- strlcat(modebuf, "-", sizeof(modebuf));
- if (rem_modes & CUS_OWNER) {
- strlcat(modebuf, &owner->ModeChar, sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
+ if (rem_modes > 0)
+ {
+ modebuf += "-";
+
+ if (owner && rem_modes & CUS_OWNER)
+ {
+ modebuf += owner->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if (rem_modes & CUS_PROTECT) {
- strlcat(modebuf, &admin->ModeChar, sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
+
+ if (rem_modes & CUS_PROTECT)
+ {
+ modebuf += admin->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if (rem_modes & CUS_OP) {
- strlcat(modebuf, "o", sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
+
+ if (rem_modes & CUS_OP)
+ {
+ modebuf += op->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
- if (rem_modes & CUS_HALFOP) {
- strlcat(modebuf, "h", sizeof(modebuf));
- strlcat(userbuf, " ", sizeof(userbuf));
- strlcat(userbuf, user->nick, sizeof(userbuf));
+
+ if (rem_modes & CUS_HALFOP)
+ {
+ modebuf += halfop->ModeChar;
+ userbuf += " " + std::string(user->nick);
}
}
@@ -1761,7 +1766,7 @@ void chan_set_correct_modes(User * user, Channel * c, int give_modes)
if (!add_modes && !rem_modes)
return;
- ircdproto->SendMode(whosends(ci), c->name, "%s%s", modebuf, userbuf);
+ ircdproto->SendMode(whosends(ci), c->name, "%s%s", modebuf.c_str(), userbuf.c_str());
if (add_modes > 0)
chan_set_user_status(c, user, add_modes);
if (rem_modes > 0)
diff --git a/src/modes.cpp b/src/modes.cpp
index bc595fdad..10fce2d6f 100644
--- a/src/modes.cpp
+++ b/src/modes.cpp
@@ -28,6 +28,7 @@ std::map<ChannelModeName, ChannelMode *> ModeManager::ChannelModesByName;
*/
bool ModeManager::AddUserMode(char Mode, UserMode *um)
{
+ um->ModeChar = Mode;
bool ret = ModeManager::UserModesByChar.insert(std::make_pair(Mode, um)).second;
if (ret)
ret = ModeManager::UserModesByName.insert(std::make_pair(um->Name, um)).second;
@@ -42,6 +43,7 @@ bool ModeManager::AddUserMode(char Mode, UserMode *um)
*/
bool ModeManager::AddChannelMode(char Mode, ChannelMode *cm)
{
+ cm->ModeChar = Mode;
bool ret = ModeManager::ChannelModesByChar.insert(std::make_pair(Mode, cm)).second;
if (ret)
ret = ModeManager::ChannelModesByName.insert(std::make_pair(cm->Name, cm)).second;