mirror of
https://github.com/irssi/irssi.git
synced 2024-09-15 04:28:09 -04:00
netsplit fixes
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@882 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
7be16da727
commit
cb03b5c133
@ -241,18 +241,28 @@ static void event_nick(const char *data, IRC_SERVER_REC *server,
|
|||||||
g_free(params);
|
g_free(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_mode(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr)
|
static void event_mode(const char *data, IRC_SERVER_REC *server,
|
||||||
|
const char *nick, const char *addr)
|
||||||
{
|
{
|
||||||
char *params, *channel, *mode;
|
char *params, *channel, *mode;
|
||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
g_return_if_fail(data != NULL);
|
||||||
|
|
||||||
|
params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
|
||||||
|
&channel, &mode);
|
||||||
|
signal_emit("message mode", 5, server, channel, nick, addr, mode);
|
||||||
|
g_free(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: should be moved to fe-common/core/fe-messages.c.. */
|
||||||
|
static void sig_message_mode(IRC_SERVER_REC *server, const char *channel,
|
||||||
|
const char *nick, const char *addr,
|
||||||
|
const char *mode)
|
||||||
|
{
|
||||||
if (nick == NULL) nick = server->real_address;
|
if (nick == NULL) nick = server->real_address;
|
||||||
|
|
||||||
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &channel, &mode);
|
if (!ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES))
|
||||||
if (ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES)) {
|
|
||||||
g_free(params);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (!ischannel(*channel)) {
|
if (!ischannel(*channel)) {
|
||||||
/* user mode change */
|
/* user mode change */
|
||||||
@ -266,8 +276,6 @@ static void event_mode(const char *data, IRC_SERVER_REC *server, const char *nic
|
|||||||
printformat(server, channel, MSGLEVEL_MODES,
|
printformat(server, channel, MSGLEVEL_MODES,
|
||||||
IRCTXT_CHANMODE_CHANGE, channel, mode, nick);
|
IRCTXT_CHANMODE_CHANGE, channel, mode, nick);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_pong(const char *data, IRC_SERVER_REC *server, const char *nick)
|
static void event_pong(const char *data, IRC_SERVER_REC *server, const char *nick)
|
||||||
@ -488,6 +496,7 @@ void fe_events_init(void)
|
|||||||
signal_add("event kill", (SIGNAL_FUNC) event_kill);
|
signal_add("event kill", (SIGNAL_FUNC) event_kill);
|
||||||
signal_add("event nick", (SIGNAL_FUNC) event_nick);
|
signal_add("event nick", (SIGNAL_FUNC) event_nick);
|
||||||
signal_add("event mode", (SIGNAL_FUNC) event_mode);
|
signal_add("event mode", (SIGNAL_FUNC) event_mode);
|
||||||
|
signal_add("message mode", (SIGNAL_FUNC) sig_message_mode);
|
||||||
signal_add("event pong", (SIGNAL_FUNC) event_pong);
|
signal_add("event pong", (SIGNAL_FUNC) event_pong);
|
||||||
signal_add("event invite", (SIGNAL_FUNC) event_invite);
|
signal_add("event invite", (SIGNAL_FUNC) event_invite);
|
||||||
signal_add("event topic", (SIGNAL_FUNC) event_topic);
|
signal_add("event topic", (SIGNAL_FUNC) event_topic);
|
||||||
@ -518,6 +527,7 @@ void fe_events_deinit(void)
|
|||||||
signal_remove("event kill", (SIGNAL_FUNC) event_kill);
|
signal_remove("event kill", (SIGNAL_FUNC) event_kill);
|
||||||
signal_remove("event nick", (SIGNAL_FUNC) event_nick);
|
signal_remove("event nick", (SIGNAL_FUNC) event_nick);
|
||||||
signal_remove("event mode", (SIGNAL_FUNC) event_mode);
|
signal_remove("event mode", (SIGNAL_FUNC) event_mode);
|
||||||
|
signal_remove("message mode", (SIGNAL_FUNC) sig_message_mode);
|
||||||
signal_remove("event pong", (SIGNAL_FUNC) event_pong);
|
signal_remove("event pong", (SIGNAL_FUNC) event_pong);
|
||||||
signal_remove("event invite", (SIGNAL_FUNC) event_invite);
|
signal_remove("event invite", (SIGNAL_FUNC) event_invite);
|
||||||
signal_remove("event topic", (SIGNAL_FUNC) event_topic);
|
signal_remove("event topic", (SIGNAL_FUNC) event_topic);
|
||||||
|
@ -54,34 +54,10 @@ typedef struct {
|
|||||||
GString *nicks;
|
GString *nicks;
|
||||||
} TEMP_PRINT_REC;
|
} TEMP_PRINT_REC;
|
||||||
|
|
||||||
static int join_tag, output_hidden;
|
static int join_tag;
|
||||||
static int netjoin_max_nicks, hide_netsplit_quits;
|
static int netjoin_max_nicks, hide_netsplit_quits;
|
||||||
static GSList *joinservers;
|
static GSList *joinservers;
|
||||||
|
|
||||||
static void sig_stop(void)
|
|
||||||
{
|
|
||||||
signal_stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void remove_hide_output(void)
|
|
||||||
{
|
|
||||||
if (output_hidden) {
|
|
||||||
output_hidden = FALSE;
|
|
||||||
signal_remove("print text stripped", (SIGNAL_FUNC) sig_stop);
|
|
||||||
signal_remove("print text", (SIGNAL_FUNC) sig_stop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hide_output(void)
|
|
||||||
{
|
|
||||||
if (!output_hidden) {
|
|
||||||
output_hidden = TRUE;
|
|
||||||
signal_add_first("print text stripped",
|
|
||||||
(SIGNAL_FUNC) sig_stop);
|
|
||||||
signal_add_first("print text", (SIGNAL_FUNC) sig_stop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static NETJOIN_SERVER_REC *netjoin_find_server(IRC_SERVER_REC *server)
|
static NETJOIN_SERVER_REC *netjoin_find_server(IRC_SERVER_REC *server)
|
||||||
{
|
{
|
||||||
GSList *tmp;
|
GSList *tmp;
|
||||||
@ -257,9 +233,6 @@ static int sig_check_netjoins(void)
|
|||||||
GSList *tmp, *next;
|
GSList *tmp, *next;
|
||||||
int diff;
|
int diff;
|
||||||
|
|
||||||
/* just to make sure that text hiding wasn't left on accidentally */
|
|
||||||
remove_hide_output();
|
|
||||||
|
|
||||||
for (tmp = joinservers; tmp != NULL; tmp = next) {
|
for (tmp = joinservers; tmp != NULL; tmp = next) {
|
||||||
NETJOIN_SERVER_REC *server = tmp->data;
|
NETJOIN_SERVER_REC *server = tmp->data;
|
||||||
|
|
||||||
@ -285,48 +258,42 @@ static int sig_check_netjoins(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_quit(const char *data)
|
static void msg_quit(IRC_SERVER_REC *server, const char *nick,
|
||||||
|
const char *address, const char *reason)
|
||||||
{
|
{
|
||||||
if (quitmsg_is_split(data))
|
if (IS_IRC_SERVER(server) && quitmsg_is_split(reason))
|
||||||
hide_output();
|
signal_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_join(const char *data, IRC_SERVER_REC *server,
|
static void msg_join(IRC_SERVER_REC *server, const char *channel,
|
||||||
const char *nick, const char *address)
|
const char *nick, const char *address)
|
||||||
{
|
{
|
||||||
NETSPLIT_REC *split;
|
NETSPLIT_REC *split;
|
||||||
NETJOIN_REC *netjoin;
|
NETJOIN_REC *netjoin;
|
||||||
char *params, *channel, *tmp;
|
|
||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
if (!IS_IRC_SERVER(server))
|
||||||
|
return;
|
||||||
|
|
||||||
/* just to make sure that text hiding wasn't left on accidentally */
|
if (ignore_check(SERVER(server), nick, address,
|
||||||
remove_hide_output();
|
channel, NULL, MSGLEVEL_JOINS))
|
||||||
|
return;
|
||||||
|
|
||||||
split = netsplit_find(server, nick, address);
|
split = netsplit_find(server, nick, address);
|
||||||
netjoin = netjoin_find(server, nick);
|
netjoin = netjoin_find(server, nick);
|
||||||
if (split == NULL && netjoin == NULL)
|
if (split == NULL && netjoin == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
params = event_get_params(data, 1, &channel);
|
if (join_tag == -1) {
|
||||||
tmp = strchr(channel, 7); /* ^G does something weird.. */
|
join_tag = g_timeout_add(1000, (GSourceFunc)
|
||||||
if (tmp != NULL) *tmp = '\0';
|
sig_check_netjoins, NULL);
|
||||||
|
|
||||||
if (!ignore_check(SERVER(server), nick, address,
|
|
||||||
channel, NULL, MSGLEVEL_JOINS)) {
|
|
||||||
if (join_tag == -1) {
|
|
||||||
join_tag = g_timeout_add(1000, (GSourceFunc)
|
|
||||||
sig_check_netjoins, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (netjoin == NULL)
|
|
||||||
netjoin = netjoin_add(server, nick, split->channels);
|
|
||||||
|
|
||||||
netjoin->now_channels = g_slist_append(netjoin->now_channels,
|
|
||||||
g_strdup(channel));
|
|
||||||
hide_output();
|
|
||||||
}
|
}
|
||||||
g_free(params);
|
|
||||||
|
if (netjoin == NULL)
|
||||||
|
netjoin = netjoin_add(server, nick, split->channels);
|
||||||
|
|
||||||
|
netjoin->now_channels = g_slist_append(netjoin->now_channels,
|
||||||
|
g_strdup(channel));
|
||||||
|
signal_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int netjoin_set_operator(NETJOIN_REC *rec, const char *channel, int on)
|
static int netjoin_set_operator(NETJOIN_REC *rec, const char *channel, int on)
|
||||||
@ -343,23 +310,20 @@ static int netjoin_set_operator(NETJOIN_REC *rec, const char *channel, int on)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_mode(const char *data, IRC_SERVER_REC *server,
|
static void msg_mode(IRC_SERVER_REC *server, const char *channel,
|
||||||
const char *sender, const char *addr)
|
const char *sender, const char *addr, const char *data)
|
||||||
{
|
{
|
||||||
NETJOIN_REC *rec;
|
NETJOIN_REC *rec;
|
||||||
char *params, *channel, *mode, *nicks;
|
char *params, *mode, *nicks;
|
||||||
char **nicklist, **nick, type;
|
char **nicklist, **nick, type;
|
||||||
int show;
|
int show;
|
||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
g_return_if_fail(data != NULL);
|
||||||
|
if (!ischannel(*channel) || addr != NULL)
|
||||||
params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
|
|
||||||
&channel, &mode, &nicks);
|
|
||||||
|
|
||||||
if (!ischannel(*channel) || addr != NULL) {
|
|
||||||
g_free(params);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
|
||||||
|
&mode, &nicks);
|
||||||
|
|
||||||
/* parse server mode changes - hide operator status changes and
|
/* parse server mode changes - hide operator status changes and
|
||||||
show them in the netjoin message instead as @ before the nick */
|
show them in the netjoin message instead as @ before the nick */
|
||||||
@ -386,7 +350,7 @@ static void event_mode(const char *data, IRC_SERVER_REC *server,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!show) hide_output();
|
if (!show) signal_stop();
|
||||||
|
|
||||||
g_strfreev(nicklist);
|
g_strfreev(nicklist);
|
||||||
g_free(params);
|
g_free(params);
|
||||||
@ -401,19 +365,13 @@ static void read_settings(void)
|
|||||||
netjoin_max_nicks = settings_get_int("netjoin_max_nicks");
|
netjoin_max_nicks = settings_get_int("netjoin_max_nicks");
|
||||||
|
|
||||||
if (old_hide && !hide_netsplit_quits) {
|
if (old_hide && !hide_netsplit_quits) {
|
||||||
signal_remove("event quit", (SIGNAL_FUNC) event_quit);
|
signal_remove("message quit", (SIGNAL_FUNC) msg_quit);
|
||||||
signal_remove("event join", (SIGNAL_FUNC) event_join);
|
signal_remove("message join", (SIGNAL_FUNC) msg_join);
|
||||||
signal_remove("event mode", (SIGNAL_FUNC) event_mode);
|
signal_remove("message mode", (SIGNAL_FUNC) msg_mode);
|
||||||
signal_remove("event quit", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
signal_remove("event join", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
signal_remove("event mode", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
} else if (!old_hide && hide_netsplit_quits) {
|
} else if (!old_hide && hide_netsplit_quits) {
|
||||||
signal_add("event quit", (SIGNAL_FUNC) event_quit);
|
signal_add("message quit", (SIGNAL_FUNC) msg_quit);
|
||||||
signal_add("event join", (SIGNAL_FUNC) event_join);
|
signal_add("message join", (SIGNAL_FUNC) msg_join);
|
||||||
signal_add("event mode", (SIGNAL_FUNC) event_mode);
|
signal_add("message mode", (SIGNAL_FUNC) msg_mode);
|
||||||
signal_add_last("event quit", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
signal_add_last("event join", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
signal_add_last("event mode", (SIGNAL_FUNC) remove_hide_output);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,7 +381,6 @@ void fe_netjoin_init(void)
|
|||||||
settings_add_int("misc", "netjoin_max_nicks", 10);
|
settings_add_int("misc", "netjoin_max_nicks", 10);
|
||||||
|
|
||||||
join_tag = -1;
|
join_tag = -1;
|
||||||
output_hidden = FALSE;
|
|
||||||
|
|
||||||
read_settings();
|
read_settings();
|
||||||
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
|
signal_add("setup changed", (SIGNAL_FUNC) read_settings);
|
||||||
|
@ -33,10 +33,10 @@ FORMAT_REC fecommon_irc_formats[] = {
|
|||||||
{ "netsplit_join_more", "{netjoin Netsplit} over, joins: $0 (+$1 more)", 2, { 0, 1 } },
|
{ "netsplit_join_more", "{netjoin Netsplit} over, joins: $0 (+$1 more)", 2, { 0, 1 } },
|
||||||
{ "no_netsplits", "There are no net splits", 0 },
|
{ "no_netsplits", "There are no net splits", 0 },
|
||||||
{ "netsplits_header", "Nick Channel Server Splitted server", 0 },
|
{ "netsplits_header", "Nick Channel Server Splitted server", 0 },
|
||||||
{ "netsplits_line", "$[9]0 {[10]1 $[20]2 $3", 4, { 0, 0, 0, 0 } },
|
{ "netsplits_line", "$[9]0 $[10]1 $[20]2 $3", 4, { 0, 0, 0, 0 } },
|
||||||
{ "netsplits_footer", "", 0 },
|
{ "netsplits_footer", "", 0 },
|
||||||
{ "ircnet_added", "Ircnet $0 saved", 1, { 0 } },
|
{ "ircnet_added", "Ircnet $0 saved", 1, { 0 } },
|
||||||
{ "ircnet_removed", "Ircnet $0} removed", 1, { 0 } },
|
{ "ircnet_removed", "Ircnet $0 removed", 1, { 0 } },
|
||||||
{ "ircnet_not_found", "Ircnet $0 not found", 1, { 0 } },
|
{ "ircnet_not_found", "Ircnet $0 not found", 1, { 0 } },
|
||||||
{ "ircnet_header", "Ircnets:", 0 },
|
{ "ircnet_header", "Ircnets:", 0 },
|
||||||
{ "ircnet_line", "$0: $1", 2, { 0, 0 } },
|
{ "ircnet_line", "$0: $1", 2, { 0, 0 } },
|
||||||
|
Loading…
Reference in New Issue
Block a user