X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fchannels.cpp;h=20d61e1d4afa93df84c712388456cc3e22c12678;hb=92cc388aebd55245b24aef5950afe845feffe9e2;hp=cf2afbcd6b59d5bed942abbad1200e14ec2c3ae7;hpb=16398df07d4ce1f1d4a2e43d97bc39043f8d44b5;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/channels.cpp b/src/channels.cpp index cf2afbcd6..20d61e1d4 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -194,7 +194,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co { if (user->chans.size() >= ServerInstance->Config->OperMaxChans) { - user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cname.c_str()); + user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s :You are on too many channels", cname.c_str()); return NULL; } } @@ -205,7 +205,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co maxchans = ServerInstance->Config->MaxChans; if (user->chans.size() >= maxchans) { - user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s %s :You are on too many channels",user->nick.c_str(), cname.c_str()); + user->WriteNumeric(ERR_TOOMANYCHANNELS, "%s :You are on too many channels", cname.c_str()); return NULL; } } @@ -269,7 +269,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co if (!MOD_RESULT.check((ckey == key) || can_bypass)) { // If no key provided, or key is not the right one, and can't bypass +k (not invited or option not enabled) - user->WriteNumeric(ERR_BADCHANNELKEY, "%s %s :Cannot join channel (Incorrect channel key)",user->nick.c_str(), chan->name.c_str()); + user->WriteNumeric(ERR_BADCHANNELKEY, "%s :Cannot join channel (Incorrect channel key)", chan->name.c_str()); return NULL; } } @@ -279,7 +279,7 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co FIRST_MOD_RESULT(OnCheckInvite, MOD_RESULT, (user, chan)); if (!MOD_RESULT.check(invited)) { - user->WriteNumeric(ERR_INVITEONLYCHAN, "%s %s :Cannot join channel (Invite only)",user->nick.c_str(), chan->name.c_str()); + user->WriteNumeric(ERR_INVITEONLYCHAN, "%s :Cannot join channel (Invite only)", chan->name.c_str()); return NULL; } } @@ -290,14 +290,14 @@ Channel* Channel::JoinUser(LocalUser* user, std::string cname, bool override, co FIRST_MOD_RESULT(OnCheckLimit, MOD_RESULT, (user, chan)); if (!MOD_RESULT.check((chan->GetUserCounter() < atol(limit.c_str()) || can_bypass))) { - user->WriteNumeric(ERR_CHANNELISFULL, "%s %s :Cannot join channel (Channel is full)",user->nick.c_str(), chan->name.c_str()); + user->WriteNumeric(ERR_CHANNELISFULL, "%s :Cannot join channel (Channel is full)", chan->name.c_str()); return NULL; } } if (chan->IsBanned(user) && !can_bypass) { - user->WriteNumeric(ERR_BANNEDFROMCHAN, "%s %s :Cannot join channel (You're banned)",user->nick.c_str(), chan->name.c_str()); + user->WriteNumeric(ERR_BANNEDFROMCHAN, "%s :Cannot join channel (You're banned)", chan->name.c_str()); return NULL; } @@ -331,7 +331,7 @@ void Channel::ForceJoin(User* user, const std::string* privs, bool bursting, boo if (!memb) return; // Already on the channel - user->chans.insert(this); + user->chans.push_front(memb); if (privs) { @@ -370,8 +370,8 @@ void Channel::ForceJoin(User* user, const std::string* privs, bool bursting, boo { if (this->topicset) { - user->WriteNumeric(RPL_TOPIC, "%s %s :%s", user->nick.c_str(), this->name.c_str(), this->topic.c_str()); - user->WriteNumeric(RPL_TOPICTIME, "%s %s %s %lu", user->nick.c_str(), this->name.c_str(), this->setby.c_str(), (unsigned long)this->topicset); + user->WriteNumeric(RPL_TOPIC, "%s :%s", this->name.c_str(), this->topic.c_str()); + user->WriteNumeric(RPL_TOPICTIME, "%s %s %lu", this->name.c_str(), this->setby.c_str(), (unsigned long)this->topicset); } this->UserList(user); } @@ -466,7 +466,7 @@ void Channel::PartUser(User *user, std::string &reason) WriteAllExcept(user, false, 0, except_list, "PART %s%s%s", this->name.c_str(), reason.empty() ? "" : " :", reason.c_str()); // Remove this channel from the user's chanlist - user->chans.erase(this); + user->chans.erase(memb); // Remove the Membership from this channel's userlist and destroy it this->DelUser(membiter); } @@ -479,7 +479,7 @@ void Channel::KickUser(User* src, User* victim, const std::string& reason, Membe if (!memb) { - src->WriteNumeric(ERR_USERNOTINCHANNEL, "%s %s %s :They are not on that channel",src->nick.c_str(), victim->nick.c_str(), this->name.c_str()); + src->WriteNumeric(ERR_USERNOTINCHANNEL, "%s %s :They are not on that channel", victim->nick.c_str(), this->name.c_str()); return; } @@ -508,8 +508,8 @@ void Channel::KickUser(User* src, User* victim, const std::string& reason, Membe if (them < req) { - src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You must be a channel %soperator", - src->nick.c_str(), this->name.c_str(), req > HALFOP_VALUE ? "" : "half-"); + src->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s :You must be a channel %soperator", + this->name.c_str(), req > HALFOP_VALUE ? "" : "half-"); return; } } @@ -520,7 +520,7 @@ void Channel::KickUser(User* src, User* victim, const std::string& reason, Membe WriteAllExcept(src, false, 0, except_list, "KICK %s %s :%s", name.c_str(), victim->nick.c_str(), reason.c_str()); - victim->chans.erase(this); + victim->chans.erase(memb); this->DelUser(victimiter); } @@ -654,14 +654,14 @@ const char* Channel::ChanModes(bool showkey) */ void Channel::UserList(User *user) { - if (this->IsModeSet(secretmode) && !this->HasUser(user) && !user->HasPrivPermission("channels/auspex")) + bool has_privs = user->HasPrivPermission("channels/auspex"); + if (this->IsModeSet(secretmode) && !this->HasUser(user) && !has_privs) { - user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nick/channel",user->nick.c_str(), this->name.c_str()); + user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", this->name.c_str()); return; } - std::string list = user->nick; - list.push_back(' '); + std::string list; list.push_back(this->IsModeSet(secretmode) ? '@' : this->IsModeSet(privatemode) ? '*' : '='); list.push_back(' '); list.append(this->name).append(" :"); @@ -678,9 +678,7 @@ void Channel::UserList(User *user) std::string nick; for (UserMembIter i = userlist.begin(); i != userlist.end(); ++i) { - if (i->first->quitting) - continue; - if ((!has_user) && (i->first->IsModeSet(invisiblemode))) + if ((!has_user) && (i->first->IsModeSet(invisiblemode)) && (!has_privs)) { /* * user is +i, and source not on the channel, does not show @@ -719,7 +717,7 @@ void Channel::UserList(User *user) user->WriteNumeric(RPL_NAMREPLY, list); } - user->WriteNumeric(RPL_ENDOFNAMES, "%s %s :End of /NAMES list.", user->nick.c_str(), this->name.c_str()); + user->WriteNumeric(RPL_ENDOFNAMES, "%s :End of /NAMES list.", this->name.c_str()); } /* returns the status character for a given user on a channel, e.g. @ for op, @@ -828,8 +826,8 @@ void Invitation::Create(Channel* c, LocalUser* u, time_t timeout) else { inv = new Invitation(c, u, timeout); - c->invites.push_back(inv); - u->invites.push_back(inv); + c->invites.push_front(inv); + u->invites.push_front(inv); ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Create created new invitation %p", (void*) inv); } } @@ -840,20 +838,17 @@ Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired) if (!u || u->invites.empty()) return NULL; - InviteList locallist; - locallist.swap(u->invites); - Invitation* result = NULL; - for (InviteList::iterator i = locallist.begin(); i != locallist.end(); ) + for (InviteList::iterator i = u->invites.begin(); i != u->invites.end(); ) { Invitation* inv = *i; + ++i; + if ((check_expired) && (inv->expiry != 0) && (inv->expiry <= ServerInstance->Time())) { /* Expired invite, remove it. */ - std::string expiration = ServerInstance->TimeString(inv->expiry); + std::string expiration = InspIRCd::TimeString(inv->expiry); ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Find ecountered expired entry: %p expired %s", (void*) inv, expiration.c_str()); - i = locallist.erase(i); - inv->cull(); delete inv; } else @@ -864,11 +859,9 @@ Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired) result = inv; break; } - ++i; } } - locallist.swap(u->invites); ServerInstance->Logs->Log("INVITATION", LOG_DEBUG, "Invitation::Find result=%p", (void*) result); return result; } @@ -876,22 +869,7 @@ Invitation* Invitation::Find(Channel* c, LocalUser* u, bool check_expired) Invitation::~Invitation() { // Remove this entry from both lists - InviteList::iterator it = std::find(chan->invites.begin(), chan->invites.end(), this); - if (it != chan->invites.end()) - chan->invites.erase(it); - it = std::find(user->invites.begin(), user->invites.end(), this); - if (it != user->invites.end()) - user->invites.erase(it); -} - -void InviteBase::ClearInvites() -{ - ServerInstance->Logs->Log("INVITEBASE", LOG_DEBUG, "InviteBase::ClearInvites %p", (void*) this); - InviteList locallist; - locallist.swap(invites); - for (InviteList::const_iterator i = locallist.begin(); i != locallist.end(); ++i) - { - (*i)->cull(); - delete *i; - } + chan->invites.erase(this); + user->invites.erase(this); + ServerInstance->Logs->Log("INVITEBASE", LOG_DEBUG, "Invitation::~ %p", (void*) this); }