1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-03 16:23:14 +02:00

irc: add indexed ban list, add completion for /unban and /unquiet (closes #597, task #11374, task #10876)

This commit is contained in:
Simmo Saan
2018-03-24 17:01:50 +01:00
committed by Sébastien Helleu
parent b2f971d4b0
commit d77e1ea499
15 changed files with 1160 additions and 20 deletions
+164 -14
View File
@@ -50,6 +50,7 @@
#include "irc-ignore.h"
#include "irc-message.h"
#include "irc-mode.h"
#include "irc-modelist.h"
#include "irc-msgbuffer.h"
#include "irc-nick.h"
#include "irc-sasl.h"
@@ -947,6 +948,7 @@ IRC_PROTOCOL_CALLBACK(kick)
int rejoin;
struct t_irc_channel *ptr_channel;
struct t_irc_nick *ptr_nick, *ptr_nick_kicked;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(4);
IRC_PROTOCOL_CHECK_HOST;
@@ -1006,6 +1008,10 @@ IRC_PROTOCOL_CALLBACK(kick)
*/
irc_nick_free_all (server, ptr_channel);
for (ptr_modelist = ptr_channel->modelists; ptr_modelist;
ptr_modelist = ptr_modelist->next_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_MODIFIED;
/* read option "autorejoin" in server */
rejoin = IRC_SERVER_OPTION_BOOLEAN(server, IRC_SERVER_OPTION_AUTOREJOIN);
@@ -1066,6 +1072,7 @@ IRC_PROTOCOL_CALLBACK(kill)
char *pos_comment;
struct t_irc_channel *ptr_channel;
struct t_irc_nick *ptr_nick, *ptr_nick_killed;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(3);
IRC_PROTOCOL_CHECK_HOST;
@@ -1120,6 +1127,10 @@ IRC_PROTOCOL_CALLBACK(kill)
*/
irc_nick_free_all (server, ptr_channel);
for (ptr_modelist = ptr_channel->modelists; ptr_modelist;
ptr_modelist = ptr_modelist->next_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_MODIFIED;
irc_bar_item_update_channel ();
}
else
@@ -1162,7 +1173,7 @@ IRC_PROTOCOL_CALLBACK(mode)
ptr_channel = irc_channel_search (server, argv[2]);
if (ptr_channel)
{
smart_filter = irc_mode_channel_set (server, ptr_channel,
smart_filter = irc_mode_channel_set (server, ptr_channel, host,
pos_modes);
}
local_mode = (irc_server_strcasecmp (server, nick, server->nick) == 0);
@@ -1661,6 +1672,7 @@ IRC_PROTOCOL_CALLBACK(part)
struct t_irc_channel *ptr_channel;
struct t_irc_nick *ptr_nick;
struct t_irc_channel_speaking *ptr_nick_speaking;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(3);
IRC_PROTOCOL_CHECK_HOST;
@@ -1757,6 +1769,10 @@ IRC_PROTOCOL_CALLBACK(part)
{
irc_nick_free_all (server, ptr_channel);
for (ptr_modelist = ptr_channel->modelists; ptr_modelist;
ptr_modelist = ptr_modelist->next_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_MODIFIED;
/* cycling ? => rejoin channel immediately */
if (ptr_channel->cycle)
{
@@ -3294,7 +3310,7 @@ IRC_PROTOCOL_CALLBACK(324)
irc_channel_set_modes (ptr_channel, ptr_modes);
if (argc > 4)
{
(void) irc_mode_channel_set (server, ptr_channel,
(void) irc_mode_channel_set (server, ptr_channel, host,
ptr_channel->modes);
}
}
@@ -3878,14 +3894,35 @@ IRC_PROTOCOL_CALLBACK(346)
{
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
time_t datetime;
const char *nick_address;
char str_number[64];
IRC_PROTOCOL_MIN_ARGS(5);
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'I');
if (ptr_modelist) {
/* start receiving new list */
if (ptr_modelist->state != IRC_MODELIST_STATE_RECEIVING)
{
irc_modelist_item_free_all (ptr_modelist);
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVING;
}
sprintf (str_number, "%s[%s%d%s] ",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
((ptr_modelist->last_item) ? ptr_modelist->last_item->number + 1 : 0) + 1,
IRC_COLOR_CHAT_DELIMITERS);
}
else
str_number[0] = '\0';
if (argc >= 6)
{
nick_address = irc_protocol_nick_address (
@@ -3894,18 +3931,21 @@ IRC_PROTOCOL_CALLBACK(346)
if (argc >= 7)
{
datetime = (time_t)(atol (argv[6]));
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], datetime);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "invitelist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
/* TRANSLATORS: "%s" after "on" is a date */
_("%s%s[%s%s%s] %s%s%s invited by %s on %s"),
_("%s%s[%s%s%s] %s%s%s%s invited by %s on %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET,
@@ -3914,17 +3954,20 @@ IRC_PROTOCOL_CALLBACK(346)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "invitelist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s invited by %s"),
_("%s%s[%s%s%s] %s%s%s%s invited by %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET,
@@ -3933,17 +3976,20 @@ IRC_PROTOCOL_CALLBACK(346)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], NULL, 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "invitelist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s invited"),
_("%s%s[%s%s%s] %s%s%s%s invited"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET);
@@ -3964,6 +4010,7 @@ IRC_PROTOCOL_CALLBACK(347)
char *pos_args;
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(4);
@@ -3973,6 +4020,9 @@ IRC_PROTOCOL_CALLBACK(347)
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'I');
if (ptr_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED;
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "invitelist", ptr_buffer),
@@ -4003,14 +4053,35 @@ IRC_PROTOCOL_CALLBACK(348)
{
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
time_t datetime;
const char *nick_address;
char str_number[64];
IRC_PROTOCOL_MIN_ARGS(5);
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'e');
if (ptr_modelist) {
/* start receiving new list */
if (ptr_modelist->state != IRC_MODELIST_STATE_RECEIVING)
{
irc_modelist_item_free_all (ptr_modelist);
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVING;
}
sprintf (str_number, "%s[%s%d%s] ",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
((ptr_modelist->last_item) ? ptr_modelist->last_item->number + 1 : 0) + 1,
IRC_COLOR_CHAT_DELIMITERS);
}
else
str_number[0] = '\0';
if (argc >= 6)
{
nick_address = irc_protocol_nick_address (
@@ -4019,18 +4090,21 @@ IRC_PROTOCOL_CALLBACK(348)
if (argc >= 7)
{
datetime = (time_t)(atol (argv[6]));
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], datetime);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "exceptionlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
/* TRANSLATORS: "%s" after "on" is a date */
_("%s%s[%s%s%s]%s exception %s%s%s by %s on %s"),
_("%s%s[%s%s%s] %s%sexception %s%s%s by %s on %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_RESET,
IRC_COLOR_CHAT_HOST,
argv[4],
@@ -4040,17 +4114,20 @@ IRC_PROTOCOL_CALLBACK(348)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "exceptionlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s]%s exception %s%s%s by %s"),
_("%s%s[%s%s%s] %s%sexception %s%s%s by %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_RESET,
IRC_COLOR_CHAT_HOST,
argv[4],
@@ -4060,17 +4137,20 @@ IRC_PROTOCOL_CALLBACK(348)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], NULL, 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "exceptionlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s]%s exception %s%s"),
_("%s%s[%s%s%s] %s%sexception %s%s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_RESET,
IRC_COLOR_CHAT_HOST,
argv[4]);
@@ -4091,6 +4171,7 @@ IRC_PROTOCOL_CALLBACK(349)
char *pos_args;
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(4);
@@ -4100,6 +4181,9 @@ IRC_PROTOCOL_CALLBACK(349)
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'e');
if (ptr_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED;
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "exceptionlist", ptr_buffer),
@@ -4761,14 +4845,34 @@ IRC_PROTOCOL_CALLBACK(367)
{
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
time_t datetime;
const char *nick_address;
char str_number[64];
IRC_PROTOCOL_MIN_ARGS(5);
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'b');
if (ptr_modelist) {
/* start receiving new list */
if (ptr_modelist->state != IRC_MODELIST_STATE_RECEIVING)
{
irc_modelist_item_free_all (ptr_modelist);
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVING;
}
sprintf (str_number, "%s[%s%d%s] ",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
((ptr_modelist->last_item) ? ptr_modelist->last_item->number + 1 : 0) + 1,
IRC_COLOR_CHAT_DELIMITERS);
}
else
str_number[0] = '\0';
if (argc >= 6)
{
@@ -4778,18 +4882,21 @@ IRC_PROTOCOL_CALLBACK(367)
if (argc >= 7)
{
datetime = (time_t)(atol (argv[6]));
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], datetime);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "banlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
/* TRANSLATORS: "%s" after "on" is a date */
_("%s%s[%s%s%s] %s%s%s banned by %s on %s"),
_("%s%s[%s%s%s] %s%s%s%s banned by %s on %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET,
@@ -4798,17 +4905,20 @@ IRC_PROTOCOL_CALLBACK(367)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], argv[5], 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "banlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s banned by %s"),
_("%s%s[%s%s%s] %s%s%s%s banned by %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET,
@@ -4817,17 +4927,20 @@ IRC_PROTOCOL_CALLBACK(367)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[4], NULL, 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "banlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s banned"),
_("%s%s[%s%s%s] %s%s%s%s banned"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[4],
IRC_COLOR_RESET);
@@ -4848,6 +4961,7 @@ IRC_PROTOCOL_CALLBACK(368)
char *pos_args;
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(4);
@@ -4857,6 +4971,9 @@ IRC_PROTOCOL_CALLBACK(368)
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, 'b');
if (ptr_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED;
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "banlist", ptr_buffer),
@@ -5188,14 +5305,34 @@ IRC_PROTOCOL_CALLBACK(728)
{
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
time_t datetime;
const char *nick_address;
char str_number[64];
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;
ptr_modelist = irc_modelist_search (ptr_channel, argv[4][0]);
if (ptr_modelist) {
/* start receiving new list */
if (ptr_modelist->state != IRC_MODELIST_STATE_RECEIVING)
{
irc_modelist_item_free_all (ptr_modelist);
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVING;
}
sprintf (str_number, "%s[%s%d%s] ",
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_RESET,
((ptr_modelist->last_item) ? ptr_modelist->last_item->number + 1 : 0) + 1,
IRC_COLOR_CHAT_DELIMITERS);
}
else
str_number[0] = '\0';
if (argc >= 7)
{
@@ -5205,18 +5342,21 @@ IRC_PROTOCOL_CALLBACK(728)
if (argc >= 8)
{
datetime = (time_t)(atol (argv[7]));
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[5], argv[6], datetime);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "quietlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
/* TRANSLATORS: "%s" after "on" is a date */
_("%s%s[%s%s%s] %s%s%s quieted by %s on %s"),
_("%s%s[%s%s%s] %s%s%s%s quieted by %s on %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[5],
IRC_COLOR_RESET,
@@ -5225,17 +5365,20 @@ IRC_PROTOCOL_CALLBACK(728)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[5], argv[6], 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "quietlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s quieted by %s"),
_("%s%s[%s%s%s] %s%s%s%s quieted by %s"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[5],
IRC_COLOR_RESET,
@@ -5244,17 +5387,20 @@ IRC_PROTOCOL_CALLBACK(728)
}
else
{
if (ptr_modelist)
irc_modelist_item_new (ptr_modelist, argv[5], NULL, 0);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "quietlist", ptr_buffer),
date,
irc_protocol_tags (command, "irc_numeric", NULL, NULL),
_("%s%s[%s%s%s] %s%s%s quieted"),
_("%s%s[%s%s%s] %s%s%s%s quieted"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_CHANNEL,
argv[3],
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
argv[5],
IRC_COLOR_RESET);
@@ -5275,6 +5421,7 @@ IRC_PROTOCOL_CALLBACK(729)
char *pos_args;
struct t_irc_channel *ptr_channel;
struct t_gui_buffer *ptr_buffer;
struct t_irc_modelist *ptr_modelist;
IRC_PROTOCOL_MIN_ARGS(5);
@@ -5284,6 +5431,9 @@ IRC_PROTOCOL_CALLBACK(729)
ptr_channel = irc_channel_search (server, argv[3]);
ptr_buffer = (ptr_channel && ptr_channel->nicks) ?
ptr_channel->buffer : server->buffer;
ptr_modelist = irc_modelist_search (ptr_channel, argv[4][0]);
if (ptr_modelist)
ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED;
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "quietlist", ptr_buffer),