0, /* m */
0, /* n */
UMODE_OPER, /* o */
- 0, /* p */
+ UMODE_OVERRIDE, /* p */
0, /* q */
0, /* r */
UMODE_SERVNOTICE, /* s */
* from a remote connect.
*/
int
-introduce_client(struct Client *client_p, struct Client *source_p, struct User *user, struct ConfItem *aconf, const char *nick, int use_euid)
+introduce_client(struct Client *client_p, struct Client *source_p, struct User *user, const char *nick, int use_euid)
{
static char ubuf[12];
struct Client *identifyservice_p;
hook_data_umode_changed hdata;
hook_data_client hdata2;
char sockhost[HOSTLEN];
+ struct ConfItem *aconf;
if(MyClient(source_p))
send_umode(source_p, source_p, 0, 0, ubuf);
if(aconf->autojoin != NULL)
{
- user_join(client_p, source_p, aconf->autojoin, NULL, 0);
+ user_join(client_p, source_p, aconf->autojoin, NULL);
}
}
}
}
+static void
+expire_umode_p(void *data)
+{
+ struct Client *source_p = data;
+ char *parv[4] = {source_p->name, source_p->name, "-p", NULL};
+ source_p->localClient->override_timeout_event = NULL;
+ user_mode(source_p, source_p, 3, parv);
+}
+
static void
show_other_user_mode(struct Client *source_p, struct Client *target_p)
{
source_p->umodes &= ~UMODE_ADMIN;
}
+ if(MyConnect(source_p) && (source_p->umodes & UMODE_OVERRIDE) && (!IsOperOverride(source_p)))
+ {
+ sendto_one_notice(source_p, ":*** You need oper and the override flag for +p");
+ source_p->umodes &= ~UMODE_OVERRIDE;
+ }
+
/* let modules providing usermodes know that we've changed our usermode --nenolod */
hdata.client = source_p;
hdata.oldumodes = setflags;
sendto_one_numeric(source_p, RPL_SNOMASK, form_str(RPL_SNOMASK),
construct_snobuf(source_p->snomask));
+ if(ConfigFileEntry.expire_override_time && MyClient(source_p) && (source_p->umodes & ~setflags) & UMODE_OVERRIDE)
+ {
+ source_p->localClient->override_timeout_event =
+ rb_event_addonce("expire_override", expire_umode_p, source_p, ConfigFileEntry.expire_override_time);
+ }
+ else if(MyClient(source_p) && source_p->localClient->override_timeout_event && (setflags & ~source_p->umodes) & UMODE_OVERRIDE)
+ {
+ rb_event_delete(source_p->localClient->override_timeout_event);
+ source_p->localClient->override_timeout_event = NULL;
+ }
+
return (0);
}
* side effects - opers up source_p using aconf for reference
*/
int
-oper_up(struct Client *source_p, struct oper_conf *oper_p, struct ConfItem *aconf)
+oper_up(struct Client *source_p, struct oper_conf *oper_p)
{
unsigned int old = source_p->umodes, oldsnomask = source_p->snomask;
hook_data_umode_changed hdata;
+ struct ConfItem *aconf;
SetOper(source_p);
* Plus this is post-umode being set so you'll pass +I $o or +O.
* Hence why we're making this a normal clean join. --jdhore
*/
- user_join(&me, source_p, aconf->autojoin_opers, NULL, 0);
+ user_join(&me, source_p, aconf->autojoin_opers, NULL);
}
return (1);
struct membership *mscptr;
int changed = irccmp(target_p->name, nick);
int changed_case = strcmp(target_p->name, nick);
- int do_qjm = irccmp(target_p->username, user) || irccmp(target_p->host, host);
+ int do_qjm = irccmp(target_p->username, user) || (irccmp(target_p->host, host) && ConfigChannel.cycle_host_change);
char mode[10], modeval[NICKLEN * 2 + 2], reason[256], *mptr;
va_list ap;