mirror of
https://github.com/weechat/weechat.git
synced 2026-07-01 15:26:37 +02:00
irc: add command /quiet, fix display of messages 728/729 (quiet list, end of quiet list) (task #12278)
This commit is contained in:
committed by
Sebastien Helleu
parent
b1005fc23e
commit
8e5d313885
@@ -3460,6 +3460,88 @@ irc_command_query (void *data, struct t_gui_buffer *buffer, int argc,
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_command_quiet: quiet nicks or hosts
|
||||
*/
|
||||
|
||||
int
|
||||
irc_command_quiet (void *data, struct t_gui_buffer *buffer, int argc,
|
||||
char **argv, char **argv_eol)
|
||||
{
|
||||
char *pos_channel;
|
||||
int pos_args;
|
||||
|
||||
IRC_BUFFER_GET_SERVER_CHANNEL(buffer);
|
||||
IRC_COMMAND_CHECK_SERVER("quiet", 1);
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) data;
|
||||
(void) argv_eol;
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
if (irc_channel_is_channel (ptr_server, argv[1]))
|
||||
{
|
||||
pos_channel = argv[1];
|
||||
pos_args = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
pos_channel = NULL;
|
||||
pos_args = 1;
|
||||
}
|
||||
|
||||
/* channel not given, use default buffer */
|
||||
if (!pos_channel)
|
||||
{
|
||||
if (ptr_channel && (ptr_channel->type == IRC_CHANNEL_TYPE_CHANNEL))
|
||||
pos_channel = ptr_channel->name;
|
||||
else
|
||||
{
|
||||
weechat_printf (ptr_server->buffer,
|
||||
_("%s%s: \"%s\" command can only be "
|
||||
"executed in a channel buffer"),
|
||||
weechat_prefix ("error"), IRC_PLUGIN_NAME,
|
||||
"quiet");
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if (argv[pos_args])
|
||||
{
|
||||
/* loop on users */
|
||||
while (argv[pos_args])
|
||||
{
|
||||
irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
|
||||
"MODE %s +q %s",
|
||||
pos_channel, argv[pos_args]);
|
||||
pos_args++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
|
||||
"MODE %s +q",
|
||||
pos_channel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!ptr_channel)
|
||||
{
|
||||
weechat_printf (ptr_server->buffer,
|
||||
_("%s%s: \"%s\" command can only be "
|
||||
"executed in a channel buffer"),
|
||||
weechat_prefix ("error"), IRC_PLUGIN_NAME, "quiet");
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL,
|
||||
"MODE %s +q", ptr_channel->name);
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_command_quote: send raw data to server
|
||||
*/
|
||||
@@ -5399,6 +5481,14 @@ irc_command_init ()
|
||||
" nick: nick for private conversation\n"
|
||||
" text: text to send"),
|
||||
"%(nicks)|-server %(irc_servers) %-", &irc_command_query, NULL);
|
||||
weechat_hook_command ("quiet",
|
||||
N_("quiet nicks or hosts"),
|
||||
N_("[<channel>] [<nick> [<nick>...]]"),
|
||||
N_("channel: channel for quiet\n"
|
||||
" nick: user or host to quiet\n\n"
|
||||
"Without argument, this command display quiet list "
|
||||
"for current channel."),
|
||||
"%(irc_channel_nicks_hosts)", &irc_command_quiet, NULL);
|
||||
weechat_hook_command ("quote",
|
||||
N_("send raw data to server without parsing"),
|
||||
N_("[-server <server>] <data>"),
|
||||
|
||||
@@ -4306,6 +4306,122 @@ IRC_PROTOCOL_CALLBACK(438)
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_protocol_cb_728: '728' command received (quietlist)
|
||||
*/
|
||||
|
||||
IRC_PROTOCOL_CALLBACK(728)
|
||||
{
|
||||
struct t_irc_channel *ptr_channel;
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
time_t datetime;
|
||||
|
||||
/*
|
||||
* 728 message looks like:
|
||||
* :server 728 mynick #channel mode quietmask nick!user@host 1351350090
|
||||
*/
|
||||
|
||||
IRC_PROTOCOL_MIN_ARGS(6);
|
||||
|
||||
ptr_channel = irc_channel_search (server, argv[3]);
|
||||
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
|
||||
ptr_channel->buffer : server->buffer;
|
||||
if (argc >= 8)
|
||||
{
|
||||
datetime = (time_t)(atol (argv[7]));
|
||||
weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
|
||||
command, "quietlist",
|
||||
ptr_buffer),
|
||||
irc_protocol_tags (command, "irc_numeric", NULL),
|
||||
/* TRANSLATORS: "%s" after "on" is a date */
|
||||
_("%s%s[%s%s%s] %s%s%s quieted by "
|
||||
"%s%s %s(%s%s%s)%s on %s"),
|
||||
weechat_prefix ("network"),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_CHANNEL,
|
||||
argv[3],
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_HOST,
|
||||
argv[5],
|
||||
IRC_COLOR_RESET,
|
||||
irc_nick_color_for_server_message (server, NULL,
|
||||
irc_message_get_nick_from_host (argv[5])),
|
||||
irc_message_get_nick_from_host (argv[6]),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_HOST,
|
||||
irc_message_get_address_from_host (argv[6]),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_RESET,
|
||||
weechat_util_get_time_string (&datetime));
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
|
||||
command, "quietlist",
|
||||
ptr_buffer),
|
||||
irc_protocol_tags (command, "irc_numeric", NULL),
|
||||
_("%s%s[%s%s%s] %s%s%s quieted by "
|
||||
"%s%s %s(%s%s%s)"),
|
||||
weechat_prefix ("network"),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_CHANNEL,
|
||||
argv[3],
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_HOST,
|
||||
argv[5],
|
||||
IRC_COLOR_RESET,
|
||||
irc_nick_color_for_server_message (server, NULL,
|
||||
irc_message_get_nick_from_host (argv[6])),
|
||||
irc_message_get_nick_from_host (argv[6]),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_HOST,
|
||||
irc_message_get_address_from_host (argv[6]),
|
||||
IRC_COLOR_CHAT_DELIMITERS);
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_protocol_cb_729: '729' command received (end of quietlist)
|
||||
*/
|
||||
|
||||
IRC_PROTOCOL_CALLBACK(729)
|
||||
{
|
||||
char *pos_args;
|
||||
struct t_irc_channel *ptr_channel;
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
|
||||
/*
|
||||
* 729 message looks like:
|
||||
* :server 729 mynick #channel mode :End of Channel Quiet List
|
||||
*/
|
||||
|
||||
IRC_PROTOCOL_MIN_ARGS(5);
|
||||
|
||||
pos_args = (argc > 5) ?
|
||||
((argv_eol[5][0] == ':') ? argv_eol[5] + 1 : argv_eol[5]) : NULL;
|
||||
|
||||
ptr_channel = irc_channel_search (server, argv[3]);
|
||||
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
|
||||
ptr_channel->buffer : server->buffer;
|
||||
weechat_printf_tags (irc_msgbuffer_get_target_buffer (server, NULL,
|
||||
command, "quietlist",
|
||||
ptr_buffer),
|
||||
irc_protocol_tags (command, "irc_numeric", NULL),
|
||||
"%s%s[%s%s%s]%s%s%s",
|
||||
weechat_prefix ("network"),
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_CHAT_CHANNEL,
|
||||
argv[3],
|
||||
IRC_COLOR_CHAT_DELIMITERS,
|
||||
IRC_COLOR_RESET,
|
||||
(pos_args) ? " " : "",
|
||||
(pos_args) ? pos_args : "");
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_protocol_cb_900: '900' command (logged in as (SASL))
|
||||
*/
|
||||
@@ -4540,6 +4656,8 @@ irc_protocol_recv_command (struct t_irc_server *server,
|
||||
{ "501", /* unknown mode flag */ 1, 0, &irc_protocol_cb_generic_error },
|
||||
{ "502", /* can't change mode for other users */ 1, 0, &irc_protocol_cb_generic_error },
|
||||
{ "671", /* whois (secure connection) */ 1, 0, &irc_protocol_cb_whois_nick_msg },
|
||||
{ "728", /* quietlist */ 1, 0, &irc_protocol_cb_728 },
|
||||
{ "729", /* end of quietlist */ 1, 0, &irc_protocol_cb_729 },
|
||||
{ "900", /* logged in as (SASL) */ 1, 0, &irc_protocol_cb_900 },
|
||||
{ "901", /* you are now logged in */ 1, 0, &irc_protocol_cb_901 },
|
||||
{ "903", /* SASL authentication successful */ 1, 0, &irc_protocol_cb_sasl_end },
|
||||
|
||||
Reference in New Issue
Block a user