- /*
- * XXX: If the user is an oper here, we can just extend their user->chans vector by one
- * and put the channel in here. Same for remote users which are not bound by
- * the channel limits. Otherwise, nope, youre boned.
- */
- if (!IS_LOCAL(user)) /* was a check on fd < 0 */
+bool Channel::IsBanned(User* user)
+{
+ char mask[MAXBUF];
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnCheckBan,OnCheckBan(user, this));
+ if (!MOD_RESULT)
+ {
+ snprintf(mask, MAXBUF, "%s!%s@%s", user->nick, user->ident, user->GetIPString());
+ for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
+ {
+ /* This allows CIDR ban matching
+ *
+ * Full masked host Full unmasked host IP with/without CIDR
+ */
+ if ((match(user->GetFullHost(),i->data)) || (match(user->GetFullRealHost(),i->data)) || (match(mask, i->data, true)))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/* Channel::PartUser
+ * remove a channel from a users record, and return the number of users left.
+ * Therefore, if this function returns 0 the caller should delete the Channel.
+ */
+long Channel::PartUser(User *user, const char* reason)
+{
+ bool silent = false;
+
+ if (!user)
+ return this->GetUserCounter();
+
+ UCListIter i = user->chans.find(this);
+ if (i != user->chans.end())
+ {
+ FOREACH_MOD(I_OnUserPart,OnUserPart(user, this, reason ? reason : "", silent));
+
+ if (!silent)
+ this->WriteChannel(user, "PART %s%s%s", this->name, reason ? " :" : "", reason ? reason : "");
+
+ user->chans.erase(i);
+ this->RemoveAllPrefixes(user);
+ }
+
+ if (!this->DelUser(user)) /* if there are no users left on the channel... */
+ {
+ chan_hash::iterator iter = ServerInstance->chanlist->find(this->name);
+ /* kill the record */
+ if (iter != ServerInstance->chanlist->end())
+ {
+ FOREACH_MOD(I_OnChannelDelete,OnChannelDelete(this));
+ ServerInstance->chanlist->erase(iter);
+ }
+ return 0;
+ }
+
+ return this->GetUserCounter();
+}
+
+long Channel::ServerKickUser(User* user, const char* reason, bool triggerevents)
+{
+ bool silent = false;
+
+ if (!user || !reason)
+ return this->GetUserCounter();
+
+ if (IS_LOCAL(user))