#include "chmode.h"
#include "irc_dictionary.h"
+
/* bitmasks for error returns, so we send once per call */
#define SM_ERR_NOTS 0x00000001 /* No TS on channel */
#define SM_ERR_NOOPS 0x00000002 /* No chan ops */
char cflagsbuf[256];
char cflagsmyinfo[256];
+char cflagsparaminfo[256];
int chmode_flags[256];
break;
default:
- if(chmode_flags[i] != 0)
+ if(chmode_flags[i] != 0 && !(chmode_table[i].set_func == chm_orphaned))
{
*ptr++ = (char) i;
}
}
/* Should we leave orphaned check here? -- dwr */
- if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned))
+ if( !(chmode_table[i].set_func == chm_nosuch) &&
+ !(chmode_table[i].set_func == chm_orphaned) &&
+ !(chmode_table[i].set_func == chm_admin && !ConfigChannel.use_admin) &&
+ !(chmode_table[i].set_func == chm_halfop && !ConfigChannel.use_halfop))
{
*ptr2++ = (char) i;
}
*ptr2++ = '\0';
}
+void
+construct_cflag_param_string(void)
+{
+
+ *cflagsparaminfo = '\0';
+ rb_snprintf(cflagsparaminfo, sizeof cflagsparaminfo, "%sb%s%s%s%sklov%s%s",
+ ConfigChannel.use_admin ? "a" : "",
+ ConfigChannel.use_except ? "e" : "",
+ ConfigChannel.use_forward ? "f" : "",
+ ConfigChannel.use_halfop ? "h" : "",
+ strcasecmp(ConfigChannel.disabledmodes, "j") ? "" : "j",
+ strcasecmp(ConfigChannel.disabledmodes, "q") ? "" : "q",
+ ConfigChannel.use_invex ? "I" : "");
+}
+
/*
* find_umode_slot
*
const char **parv, int *errors, int dir, char c, long mode_type)
{
if(MyClient(source_p))
+ {
+ sendto_one_numeric(source_p, 469, "Mode %c is disabled.", c);
return;
+ }
if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
{
if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE))
return;
+
/* setting + */
if((dir == MODE_ADD) && !(chptr->mode.mode & mode_type))
{
mode_changes[mode_count].mems = ONLY_OPERS;
mode_changes[mode_count].override = 0;
mode_changes[mode_count++].arg = NULL;
+
+ /* A little ugly */
+ sendto_wallops_flags(UMODE_WALLOP, &me,
+ "+%c set on [%s] by %s!%s@%s",
+ c, chptr->chname, source_p->name, source_p->username, source_p->host);
+ ilog(L_MAIN, "+%c set on [%s] by %s",
+ c, chptr->chname, get_oper_name(source_p));
+
+ if(*chptr->chname != '&')
+ sendto_server(NULL, NULL, NOCAPS, NOCAPS,
+ ":%s WALLOPS :+%c set on [%s] by %s!%s@%s",
+ me.name, c, chptr->chname, source_p->name, source_p->username,
+ source_p->host);
}
else if((dir == MODE_DEL) && (chptr->mode.mode & mode_type))
{
mode_changes[mode_count].id = NULL;
mode_changes[mode_count].override = 0;
mode_changes[mode_count++].arg = NULL;
+
+ /* A little ugly */
+ sendto_wallops_flags(UMODE_WALLOP, &me,
+ "+%c unset from [%s] by %s!%s@%s",
+ c, chptr->chname, source_p->name, source_p->username, source_p->host);
+ ilog(L_MAIN, "+%c unset from [%s] by %s",
+ c, chptr->chname, get_oper_name(source_p));
+
+ if(*chptr->chname != '&')
+ sendto_server(NULL, NULL, NOCAPS, NOCAPS,
+ ":%s WALLOPS :+%c unset from [%s] by %s!%s@%s",
+ me.name, c, chptr->chname, source_p->name, source_p->username,
+ source_p->host);
}
}
if(MyClient(source_p) && !(targptr->mode.mode & MODE_FREETARGET))
{
if((msptr = find_channel_membership(targptr, source_p)) == NULL ||
- is_any_op(msptr))
+ !is_any_op(msptr))
{
if(IsOverride(source_p))
override = 1;