1
0
mirror of https://github.com/osmarks/ngircd.git synced 2024-10-28 04:46:17 +00:00

Channel lists: Fix duplicate check and error messages

- Check correct list for duplicates when adding items.
 - Don't generate any messages when adding duplicates or removing
   non-existing items (this is how ircd-seven and ircu behave).
 - Code cleanup: Add_Ban_Invite(), Del_Ban_Invite().
This commit is contained in:
Alexander Barton 2012-01-15 19:07:15 +01:00
parent 78a3b4c7d6
commit 81cc5f82b5

View File

@ -831,60 +831,80 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req )
} /* IRC_AWAY */
/**
* Add entries to channel ban and invite lists.
*
* @param what Can be 'I' for invite or 'b' for ban list.
* @param Prefix The originator of the command.
* @param Client The sender of the command.
* @param Channel The channel of which the list should be modified.
* @param Pattern The pattern to add to the list.
* @return CONNECTED or DISCONNECTED.
*/
static bool
Add_Ban_Invite(int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern)
Add_Ban_Invite(int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
const char *Pattern)
{
const char *mask;
bool already;
bool ret;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
assert(Client != NULL);
assert(Channel != NULL);
assert(Pattern != NULL);
assert(what == 'I' || what == 'b');
mask = Lists_MakeMask(Pattern);
already = Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask);
if (!already) {
if (what == 'I')
ret = Channel_AddInvite(Channel, mask, false);
else
ret = Channel_AddBan(Channel, mask);
if (!ret)
if (what == 'I') {
if (Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask))
return CONNECTED;
if (!Channel_AddInvite(Channel, mask, false))
return CONNECTED;
}
if (already && (Client_Type(Prefix) == CLIENT_SERVER))
return CONNECTED;
if (what == 'I')
return Send_ListChange("+I", Prefix, Client, Channel, mask);
return Send_ListChange("+b", Prefix, Client, Channel, mask);
} else {
if (Lists_CheckDupeMask(Channel_GetListBans(Channel), mask))
return CONNECTED;
if (!Channel_AddBan(Channel, mask))
return CONNECTED;
return Send_ListChange("+b", Prefix, Client, Channel, mask);
}
}
/**
* Delete entries from channel ban and invite lists.
*
* @param what Can be 'I' for invite or 'b' for ban list.
* @param Prefix The originator of the command.
* @param Client The sender of the command.
* @param Channel The channel of which the list should be modified.
* @param Pattern The pattern to add to the list.
* @return CONNECTED or DISCONNECTED.
*/
static bool
Del_Ban_Invite(int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern)
Del_Ban_Invite(int what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
const char *Pattern)
{
const char *mask;
struct list_head *list;
assert( Client != NULL );
assert( Channel != NULL );
assert( Pattern != NULL );
assert(Client != NULL);
assert(Channel != NULL);
assert(Pattern != NULL);
assert(what == 'I' || what == 'b');
mask = Lists_MakeMask( Pattern );
mask = Lists_MakeMask(Pattern);
if (what == 'I')
list = Channel_GetListInvites(Channel);
else
list = Channel_GetListBans(Channel);
Lists_Del(list, mask);
if (what == 'I')
if (what == 'I') {
if (!Lists_CheckDupeMask(Channel_GetListInvites(Channel), mask))
return CONNECTED;
Lists_Del(Channel_GetListInvites(Channel), mask);
return Send_ListChange( "-I", Prefix, Client, Channel, mask );
return Send_ListChange( "-b", Prefix, Client, Channel, mask );
} else {
if (!Lists_CheckDupeMask(Channel_GetListBans(Channel), mask))
return CONNECTED;
Lists_Del(Channel_GetListBans(Channel), mask);
return Send_ListChange( "-b", Prefix, Client, Channel, mask );
}
}