summaryrefslogtreecommitdiff
path: root/src/channels.c
diff options
context:
space:
mode:
authorgeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-03-16 20:19:14 +0000
committergeniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b <geniusdex geniusdex@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-03-16 20:19:14 +0000
commit1fec2a9abdd824a41ab1b975bd95829cb44a7d0e (patch)
treedb5bb5fb6cff83414019e8bba516079e071b145d /src/channels.c
parent89e28df398669012ce7cf99e90670a20af6bbc62 (diff)
BUILD : 1.7.8 (631) BUGS : 320 NOTES : Fixed an error in the big if/else if thing when setting the modes on SJOIN, should now give correct modes
git-svn-id: svn://svn.anope.org/anope/trunk@631 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@479 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/channels.c')
-rw-r--r--src/channels.c84
1 files changed, 61 insertions, 23 deletions
diff --git a/src/channels.c b/src/channels.c
index 529073ec2..24f2f639e 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -1217,35 +1217,73 @@ void add_invite(Channel * chan, char *mask)
void chan_set_correct_modes(User * user, Channel * c)
{
- char *chan;
+ char *tmp;
int status;
+ ChannelInfo *ci;
- chan = c->name;
+ ci = c->ci;
- if (get_ignore(user->nick) == NULL) {
- status = chan_get_user_status(c, user);
- /* This looks dirty. For every mode we first check if the IRCd
- * supports it. If true, we check if the user already has the
- * mode. If both are true, we check if they should get the mode,
- * which sends the mode to the uplink and returns true. If the
- * mode is sent, we internally update to finish it off. -GD
- */
- if (ircd->owner && !(status & CUS_OWNER)
- && check_should_owner(user, chan))
- chan_set_user_status(c, user, CUS_OWNER | CUS_OP);
- else if (ircd->protect && !(status & CUS_PROTECT)
- && check_should_protect(user, chan))
- chan_set_user_status(c, user, CUS_PROTECT | CUS_OP);
- else if (ircd->admin && !(status & CUS_PROTECT)
- && check_should_protect(user, chan))
- chan_set_user_status(c, user, CUS_PROTECT | CUS_OP);
- else if (!(status & CUS_OP) && check_should_op(user, chan))
+ if (!ci || (ci->flags & CI_VERBOTEN) || (*(c->name) == '+'))
+ return;
+
+ if ((ci->flags & CI_SECURE) && !nick_identified(user))
+ return;
+
+ if (get_ignore(user->nick) != NULL)
+ return;
+
+ status = chan_get_user_status(c, user);
+ if (ircd->owner
+ && (((ci->flags & CI_SECUREFOUNDER) && is_real_founder(user, ci))
+ || (!(ci->flags & CI_SECUREFOUNDER)
+ && is_founder(user, ci)))) {
+ if (!(status & CUS_OWNER)) {
+ tmp = stripModePrefix(ircd->ownerset);
+ if (!(status & CUS_OP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+o%s %s %s", tmp,
+ user->nick, user->nick);
+ chan_set_user_status(c, user, CUS_OWNER | CUS_OP);
+ } else {
+ anope_cmd_mode(whosends(ci), c->name, "+%s %s", tmp,
+ user->nick);
+ chan_set_user_status(c, user, CUS_OWNER);
+ }
+ } else if (!(status & CUS_OP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+o %s", user->nick);
+ chan_set_user_status(c, user, CUS_OP);
+ }
+ } else if ((ircd->protect || ircd->admin)
+ && check_access(user, ci, CA_AUTOPROTECT)) {
+ tmp = stripModePrefix(ircd->adminset);
+ if (!(status & CUS_PROTECT)) {
+ if (!(status & CUS_OP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+o%s %s %s", tmp,
+ user->nick, user->nick);
+ chan_set_user_status(c, user, CUS_PROTECT | CUS_OP);
+ } else {
+ anope_cmd_mode(whosends(ci), c->name, "+%s %s", tmp,
+ user->nick);
+ chan_set_user_status(c, user, CUS_PROTECT);
+ }
+ } else if (!(status & CUS_OP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+o %s", user->nick);
chan_set_user_status(c, user, CUS_OP);
- else if (ircd->halfop && !(status & CUS_HALFOP)
- && check_should_halfop(user, chan))
+ }
+ } else if (check_access(user, ci, CA_AUTOOP)) {
+ if (!(status & CUS_OP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+o %s", user->nick);
+ chan_set_user_status(c, user, CUS_OP);
+ }
+ } else if (ircd->halfop && check_access(user, ci, CA_AUTOHALFOP)) {
+ if (!(status & CUS_HALFOP)) {
+ anope_cmd_mode(whosends(ci), c->name, "+h %s", user->nick);
chan_set_user_status(c, user, CUS_HALFOP);
- else if (!(status & CUS_VOICE) && check_should_voice(user, chan))
+ }
+ } else if (check_access(user, ci, CA_AUTOVOICE)) {
+ if (!(status & CUS_VOICE)) {
+ anope_cmd_mode(whosends(ci), c->name, "+v %s", user->nick);
chan_set_user_status(c, user, CUS_VOICE);
+ }
}
}