|
|
@@ -475,13 +475,34 @@ real_chk_op(const struct flag_record fr, const struct chanset_t *chan, bool botb
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+chk_homechan_user_op(const memberlist *m, const struct chanset_t *chan)
|
|
|
+{
|
|
|
+ struct chanset_t *homechan_chan = NULL;
|
|
|
+ memberlist *homechan_m = NULL;
|
|
|
+
|
|
|
+ if (!homechan[0] || channel_take(chan))
|
|
|
+ return 0;
|
|
|
+ if (!(homechan_chan = findchan_by_dname(homechan)))
|
|
|
+ return 0;
|
|
|
+ if (homechan_chan == chan)
|
|
|
+ return 0;
|
|
|
+ if (!(homechan_m = ismember(homechan_chan, m->nick)))
|
|
|
+ return 0;
|
|
|
+ if (chan_hasop(homechan_m))
|
|
|
+ return 1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int
|
|
|
-chk_autoop(memberlist *m, const struct flag_record fr, const struct chanset_t *chan)
|
|
|
+chk_autoop(const memberlist *m, const struct flag_record fr, const struct chanset_t *chan)
|
|
|
{
|
|
|
if (glob_bot(fr) || !chan || (m->user && u_pass_match(m->user, "-")) ||
|
|
|
channel_take(chan) || privchan(fr, chan, PRIV_OP) || chk_deop(fr, chan))
|
|
|
return 0;
|
|
|
- if (chk_op(fr, chan)) {
|
|
|
+ if (chk_op(fr, chan) || (chan->homechan_user == HOMECHAN_USER_OP &&
|
|
|
+ chk_homechan_user_op(m, chan))) {
|
|
|
if (channel_autoop(chan) || chan_autoop(fr) || glob_autoop(fr))
|
|
|
return 1;
|
|
|
}
|
|
|
@@ -489,11 +510,13 @@ chk_autoop(memberlist *m, const struct flag_record fr, const struct chanset_t *c
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-chk_voice(struct flag_record fr, const struct chanset_t *chan)
|
|
|
+chk_voice(const memberlist *m, const struct flag_record fr, const struct chanset_t *chan)
|
|
|
{
|
|
|
if (!chan || privchan(fr, chan, PRIV_VOICE) || chk_devoice(fr))
|
|
|
return 0;
|
|
|
- if (chan_voice(fr) || (glob_voice(fr) && !chan_quiet(fr)))
|
|
|
+ if (chan_voice(fr) || (glob_voice(fr) && !chan_quiet(fr)) ||
|
|
|
+ (chan->homechan_user == HOMECHAN_USER_VOICE &&
|
|
|
+ chk_homechan_user_op(m, chan)))
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -607,6 +630,20 @@ whois_access(struct userrec *user, struct userrec *whois_user)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+homechan_user_t homechan_user_translate(const char *buf)
|
|
|
+{
|
|
|
+ if (str_isdigit(buf))
|
|
|
+ return (static_cast<homechan_user_t>(atoi(buf)));
|
|
|
+
|
|
|
+ if (!strcasecmp(buf, "none"))
|
|
|
+ return HOMECHAN_USER_NONE;
|
|
|
+ else if (!strcasecmp(buf, "voice"))
|
|
|
+ return HOMECHAN_USER_VOICE;
|
|
|
+ else if (!strcasecmp(buf, "op"))
|
|
|
+ return HOMECHAN_USER_OP;
|
|
|
+ return HOMECHAN_USER_NONE;
|
|
|
+}
|
|
|
+
|
|
|
deflag_t deflag_translate(const char *buf)
|
|
|
{
|
|
|
if (str_isdigit(buf))
|