1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-26 04:46:37 +02:00

Bug with IRC prefix "!" for mode "a" (channel admin) (bug #29109)

This commit is contained in:
Sebastien Helleu
2010-03-07 21:22:23 +01:00
parent 788df1089b
commit da50ac329a
4 changed files with 105 additions and 32 deletions
+2 -1
View File
@@ -1,7 +1,7 @@
WeeChat ChangeLog
=================
FlashCode <flashcode@flashtux.org>
v0.3.2-dev, 2010-03-03
v0.3.2-dev, 2010-03-07
Version 0.3.2 (under dev!)
@@ -46,6 +46,7 @@ Version 0.3.2 (under dev!)
* irc: fix PART message received on Undernet server (bug #28825)
* irc: fix bug with /away -all: set or unset future away for disconnected
servers (bug #29022)
* irc: bug with prefix "!" for mode "a" (channel admin) (bug #29109)
* irc: add option irc.network.connection_timeout (timeout between TCP connection
to server and reception of message 001)
* irc: add options irc.look.smart_filter_join and irc.look.smart_filter_quit
+100 -21
View File
@@ -61,7 +61,7 @@ irc_mode_channel_set (struct t_irc_server *server,
struct t_irc_channel *channel, const char *modes)
{
char *pos_args, *str_modes, set_flag, **argv, *pos, *ptr_arg;
int modes_count, channel_modes_updated, argc, current_arg;
int mode, modes_count, channel_modes_updated, argc, current_arg;
if (!server || !channel || !modes)
return 0;
@@ -122,9 +122,12 @@ irc_mode_channel_set (struct t_irc_server *server,
case 'a': /* channel admin (unrealircd specific flag) */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '~'))
mode = irc_mode_get_nick_prefix (server, "a", '~');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_CHANADMIN);
set_flag, mode);
}
current_arg++;
break;
case 'b': /* ban (ignored) */
@@ -135,9 +138,12 @@ irc_mode_channel_set (struct t_irc_server *server,
case 'h': /* half-op */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '%'))
mode = irc_mode_get_nick_prefix (server, "h", '%');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_HALFOP);
set_flag, mode);
}
current_arg++;
break;
case 'k': /* channel key */
@@ -172,33 +178,45 @@ irc_mode_channel_set (struct t_irc_server *server,
case 'o': /* op */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '@'))
mode = irc_mode_get_nick_prefix (server, "o", '@');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_OP);
set_flag, mode);
}
current_arg++;
break;
case 'q': /* channel owner (unrealircd specific flag) */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '~'))
mode = irc_mode_get_nick_prefix (server, "q", '~');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_CHANOWNER);
set_flag, mode);
}
current_arg++;
break;
case 'u': /* channel user */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '-'))
mode = irc_mode_get_nick_prefix (server, "u", '-');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_CHANUSER);
set_flag, mode);
}
current_arg++;
break;
case 'v': /* voice */
ptr_arg = ((current_arg >= 0) && (current_arg < argc)) ?
argv[current_arg] : NULL;
if (irc_mode_nick_prefix_allowed (server, '+'))
mode = irc_mode_get_nick_prefix (server, "v", '+');
if (mode >= 0)
{
irc_mode_channel_set_nick (server, channel, ptr_arg,
set_flag, IRC_NICK_VOICE);
set_flag, mode);
}
current_arg++;
break;
default:
@@ -308,24 +326,85 @@ irc_mode_user_set (struct t_irc_server *server, const char *modes)
}
/*
* irc_mode_nick_prefix_allowed: return <> 0 if nick prefix is allowed by server
* for example :
* IRC: 005 (...) PREFIX=(ov)@+
* => allowed prefixes: @+
* irc_mode_get_prefix_value: get internal value for prefix
* return -1 if prefix is unknown
*/
int
irc_mode_nick_prefix_allowed (struct t_irc_server *server, char prefix)
irc_mode_get_prefix_value (char prefix)
{
char str[2];
switch (prefix)
{
case '@': /* op */
return IRC_NICK_OP;
case '~': /* channel owner */
return IRC_NICK_CHANOWNER;
case '&': /* channel admin */
return IRC_NICK_CHANADMIN;
case '!': /* channel admin (2) */
return IRC_NICK_CHANADMIN2;
case '%': /* half-op */
return IRC_NICK_HALFOP;
case '+': /* voice */
return IRC_NICK_VOICE;
case '-': /* channel user */
return IRC_NICK_CHANUSER;
}
return -1;
}
/*
* irc_mode_get_nick_prefix: return nick prefix, if allowed by server
* return -1 if not allowed
* for example :
* IRC: 005 (...) PREFIX=(ov)@+
* => allowed prefixes: @+
*/
int
irc_mode_get_nick_prefix (struct t_irc_server *server, char *mode,
char prefix)
{
char str[2], *pos, *ptr_prefixes, *pos_mode;
int index;
/* if server did not send any prefix info, then use default prefixes */
if (!server->prefix)
{
str[0] = prefix;
str[1] = '\0';
return (strpbrk (str, IRC_NICK_DEFAULT_PREFIXES_LIST)) ? 1 : 0;
pos = strpbrk (str, IRC_NICK_DEFAULT_PREFIXES_LIST);
if (!pos)
return -1;
return irc_mode_get_prefix_value (pos[0]);
}
return (strchr (server->prefix, prefix) != NULL);
/* find start of prefixes, after "(...)" */
ptr_prefixes = strchr (server->prefix, ')');
if (ptr_prefixes)
ptr_prefixes++;
/* we check if mode is in list and return prefix found */
if (mode && ptr_prefixes)
{
pos_mode = strchr (server->prefix + 1, mode[0]);
if (pos_mode)
{
index = pos_mode - server->prefix - 1;
if (pos_mode && (index < (int)strlen (ptr_prefixes)))
{
return irc_mode_get_prefix_value (ptr_prefixes[index]);
}
}
}
if (!ptr_prefixes)
ptr_prefixes = server->prefix;
pos = strchr (ptr_prefixes, prefix);
if (!pos)
return -1;
return irc_mode_get_prefix_value (pos[0]);
}
+2 -2
View File
@@ -27,7 +27,7 @@ extern int irc_mode_channel_set (struct t_irc_server *server,
struct t_irc_channel *channel,
const char *modes);
extern void irc_mode_user_set (struct t_irc_server *server, const char *modes);
extern int irc_mode_nick_prefix_allowed (struct t_irc_server *server,
char prefix);
extern int irc_mode_get_nick_prefix (struct t_irc_server *server, char *mode,
char prefix);
#endif /* irc-mode.h */
+1 -8
View File
@@ -1870,13 +1870,6 @@ irc_protocol_cmd_005 (struct t_irc_server *server, const char *command,
if (pos)
{
pos += 7;
if (pos[0] == '(')
{
pos2 = strchr (pos, ')');
if (!pos2)
return WEECHAT_RC_OK;
pos = pos2 + 1;
}
pos2 = strchr (pos, ' ');
if (pos2)
pos2[0] = '\0';
@@ -3239,7 +3232,7 @@ irc_protocol_cmd_353 (struct t_irc_server *server, const char *command,
{
prefix_found = 0;
if (irc_mode_nick_prefix_allowed (server, pos_nick[0]))
if (irc_mode_get_nick_prefix (server, NULL, pos_nick[0]) >= 0)
{
prefix_found = 1;
switch (pos_nick[0])