mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-07-08 09:43:12 +02:00
Get rid of Usermode_Table[] and use a linked list called usermodes.
Just like already done for Channelmode_Table[] -> channelmodes.
This commit is contained in:
+16
-23
@@ -1079,7 +1079,7 @@ void _set_mode(Channel *channel, Client *client, int parc, const char *parv[], u
|
||||
*/
|
||||
CMD_FUNC(_cmd_umode)
|
||||
{
|
||||
int i;
|
||||
Umode *um;
|
||||
const char *m;
|
||||
Client *acptr;
|
||||
int what;
|
||||
@@ -1120,10 +1120,7 @@ CMD_FUNC(_cmd_umode)
|
||||
|
||||
userhost_save_current(client); /* save host, in case we do any +x/-x or similar */
|
||||
|
||||
/* find flags already set for user */
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
if ((client->umodes & Usermode_Table[i].mode))
|
||||
oldumodes |= Usermode_Table[i].mode;
|
||||
oldumodes = client->umodes;
|
||||
|
||||
if (RESTRICT_USERMODES && MyUser(client) && !ValidatePermissionsForPath("immune:restrict-usermodes",client,NULL,NULL,NULL))
|
||||
chk_restrict = 1;
|
||||
@@ -1238,24 +1235,23 @@ CMD_FUNC(_cmd_umode)
|
||||
break;
|
||||
default:
|
||||
def:
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
for (um = usermodes; um; um = um->next)
|
||||
{
|
||||
if (*m == Usermode_Table[i].letter)
|
||||
if (um->letter == *m)
|
||||
{
|
||||
if (Usermode_Table[i].allowed)
|
||||
if (!Usermode_Table[i].allowed(client,what))
|
||||
if (um->allowed && !um->allowed(client,what))
|
||||
break;
|
||||
if (what == MODE_ADD)
|
||||
client->umodes |= Usermode_Table[i].mode;
|
||||
client->umodes |= um->mode;
|
||||
else
|
||||
client->umodes &= ~Usermode_Table[i].mode;
|
||||
client->umodes &= ~um->mode;
|
||||
break;
|
||||
}
|
||||
else if (i == Usermode_highest && MyConnect(client) && !rpterror)
|
||||
{
|
||||
sendnumeric(client, ERR_UMODEUNKNOWNFLAG);
|
||||
rpterror = 1;
|
||||
}
|
||||
}
|
||||
if (!um && MyConnect(client) && !rpterror)
|
||||
{
|
||||
sendnumeric(client, ERR_UMODEUNKNOWNFLAG);
|
||||
rpterror = 1;
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
@@ -1273,19 +1269,16 @@ CMD_FUNC(_cmd_umode)
|
||||
int i;
|
||||
|
||||
/* MODES */
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
for (um = usermodes; um; um = um->next)
|
||||
{
|
||||
if (!Usermode_Table[i].letter)
|
||||
continue;
|
||||
if (Usermode_Table[i].unset_on_deoper)
|
||||
if (um->unset_on_deoper)
|
||||
{
|
||||
/* This is an oper mode. Is it set now and wasn't earlier?
|
||||
* then it needs to be stripped, as setting it is not
|
||||
* permitted.
|
||||
*/
|
||||
long m = Usermode_Table[i].mode;
|
||||
if ((client->umodes & m) && !(oldumodes & m))
|
||||
client->umodes &= ~Usermode_Table[i].mode; /* remove */
|
||||
if ((client->umodes & um->mode) && !(oldumodes & um->mode))
|
||||
client->umodes &= ~um->mode; /* remove */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-13
@@ -83,19 +83,7 @@ CMD_FUNC(cmd_sendumode)
|
||||
|
||||
sendto_server(client, 0, 0, mtags, ":%s SENDUMODE %s :%s", client->id, parv[1], message);
|
||||
|
||||
for (p = parv[1]; *p; p++)
|
||||
{
|
||||
for(i = 0; i <= Usermode_highest; i++)
|
||||
{
|
||||
if (!Usermode_Table[i].letter)
|
||||
continue;
|
||||
if (Usermode_Table[i].letter == *p)
|
||||
{
|
||||
umode_s |= Usermode_Table[i].mode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
umode_s = set_usermode(parv[1]);
|
||||
|
||||
list_for_each_entry(acptr, &oper_list, special_node)
|
||||
{
|
||||
|
||||
+11
-16
@@ -317,11 +317,11 @@ void channel_svsmode(Client *client, int parc, const char *parv[])
|
||||
*/
|
||||
void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], int show_change)
|
||||
{
|
||||
int i;
|
||||
Umode *um;
|
||||
const char *m;
|
||||
Client *target;
|
||||
int what;
|
||||
long setflags = 0;
|
||||
long oldumodes = 0;
|
||||
|
||||
if (!IsULine(client))
|
||||
return;
|
||||
@@ -342,10 +342,7 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
|
||||
|
||||
userhost_save_current(target);
|
||||
|
||||
/* initialize setflag to be the user's pre-SVSMODE flags */
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
if (Usermode_Table[i].letter && (target->umodes & Usermode_Table[i].mode))
|
||||
setflags |= Usermode_Table[i].mode;
|
||||
oldumodes = target->umodes;
|
||||
|
||||
/* parse mode change string(s) */
|
||||
for (m = parv[2]; *m; m++)
|
||||
@@ -505,16 +502,14 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
|
||||
break;
|
||||
default:
|
||||
setmodex:
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
for (um = usermodes; um; um = um->next)
|
||||
{
|
||||
if (!Usermode_Table[i].letter)
|
||||
continue;
|
||||
if (*m == Usermode_Table[i].letter)
|
||||
if (um->letter == *m)
|
||||
{
|
||||
if (what == MODE_ADD)
|
||||
target->umodes |= Usermode_Table[i].mode;
|
||||
target->umodes |= um->mode;
|
||||
else
|
||||
target->umodes &= ~Usermode_Table[i].mode;
|
||||
target->umodes &= ~um->mode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -531,15 +526,15 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *pa
|
||||
parv[1], parv[2]);
|
||||
|
||||
/* Here we trigger the same hooks that cmd_mode does and, likewise,
|
||||
only if the old flags (setflags) are different than the newly-
|
||||
only if the old flags (oldumodes) are different than the newly-
|
||||
set ones */
|
||||
if (setflags != target->umodes)
|
||||
RunHook(HOOKTYPE_UMODE_CHANGE, target, setflags, target->umodes);
|
||||
if (oldumodes != target->umodes)
|
||||
RunHook(HOOKTYPE_UMODE_CHANGE, target, oldumodes, target->umodes);
|
||||
|
||||
if (show_change)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
build_umode_string(target, setflags, ALL_UMODES, buf);
|
||||
build_umode_string(target, oldumodes, ALL_UMODES, buf);
|
||||
if (MyUser(target) && *buf)
|
||||
sendto_one(target, NULL, ":%s MODE %s :%s", client->name, target->name, buf);
|
||||
}
|
||||
|
||||
+1
-11
@@ -330,17 +330,7 @@ static int parse_who_options(Client *client, int argc, const char **argv)
|
||||
else
|
||||
umodes = &wfl.umodes_dontwant;
|
||||
|
||||
while (*s)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
if (*s == Usermode_Table[i].letter)
|
||||
{
|
||||
*umodes |= Usermode_Table[i].mode;
|
||||
break;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
*umodes = set_usermode(s);
|
||||
|
||||
if (!IsOper(client))
|
||||
*umodes = *umodes & UMODE_OPER; /* these are usermodes regular users may search for. just oper now. */
|
||||
|
||||
+4
-4
@@ -295,7 +295,7 @@ CMD_FUNC(cmd_whox)
|
||||
|
||||
while (*s)
|
||||
{
|
||||
int i;
|
||||
Umode *um;
|
||||
|
||||
switch (*s)
|
||||
{
|
||||
@@ -317,11 +317,11 @@ CMD_FUNC(cmd_whox)
|
||||
else
|
||||
umodes = &fmt.noumodes;
|
||||
|
||||
for (i = 0; i <= Usermode_highest; i++)
|
||||
for (um = usermodes; um; um = um->next)
|
||||
{
|
||||
if (*s == Usermode_Table[i].letter)
|
||||
if (um->letter == *s)
|
||||
{
|
||||
*umodes |= Usermode_Table[i].mode;
|
||||
*umodes |= um->mode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user