forked from PsychoticNinja/ailin-nemui-irssi
[wip]
This commit is contained in:
parent
d46d83a3b0
commit
775c3186ea
@ -116,4 +116,12 @@ pkginc_core_HEADERS = \
|
||||
window-item-def.h \
|
||||
tls.h \
|
||||
write-buffer.h \
|
||||
signal-registry-macros.h \
|
||||
signal-registry.h \
|
||||
$(structure_headers)
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
@ -162,7 +162,7 @@ SIGNAL_REGISTER(server_connect_failed, 2, (SERVER_REC *server, const char *msg),
|
||||
server, msg)
|
||||
SIGNAL_REGISTER(server_disconnected, 1, (SERVER_REC *server),
|
||||
server)
|
||||
SIGNAL_REGISTER(server_quit, 2, (SERVER_REC *server, char *msg),
|
||||
SIGNAL_REGISTER(server_quit, 2, (SERVER_REC *server, const char *msg),
|
||||
server, msg)
|
||||
SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, const char *target, const char *msg, int_in_ptr target_type),
|
||||
server, target, msg, target_type)
|
||||
|
@ -97,7 +97,7 @@
|
||||
"server connecting", SERVER_REC, mem_ptr ip
|
||||
"server connect failed", SERVER_REC, const char *msg
|
||||
"server disconnected", SERVER_REC
|
||||
"server quit", SERVER_REC, char *msg
|
||||
"server quit", SERVER_REC, const char *msg
|
||||
"server sendmsg", SERVER_REC, const char *target, const char *msg, int target_type
|
||||
"server destroyed", SERVER_REC
|
||||
|
||||
|
@ -69,3 +69,9 @@ pkginc_fe_common_core_HEADERS = \
|
||||
window-items.h \
|
||||
windows-layout.h \
|
||||
fe-windows.h
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
@ -42,6 +42,12 @@ pkginc_fe_common_irc_HEADERS = \
|
||||
module.h \
|
||||
module-formats.h
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(real_sources) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
distclean-generic:
|
||||
|
@ -70,5 +70,11 @@ noinst_HEADERS = \
|
||||
module.h \
|
||||
module-formats.h
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(terminfo_sources)
|
||||
|
@ -58,4 +58,11 @@ pkginc_irc_core_HEADERS = \
|
||||
module.h \
|
||||
netsplit.h \
|
||||
servers-idle.h \
|
||||
servers-redirect.h
|
||||
servers-redirect.h \
|
||||
signal-registry.h
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include "commands.h"
|
||||
#include "network.h"
|
||||
#include "signals.h"
|
||||
#include "core/signal-registry.h"
|
||||
#include "signal-registry.h"
|
||||
|
||||
#include "modes.h"
|
||||
#include "irc-servers.h"
|
||||
@ -29,79 +31,89 @@
|
||||
#include "settings.h"
|
||||
|
||||
static void sig_server_connect_copy(SERVER_CONNECT_REC **dest,
|
||||
IRC_SERVER_CONNECT_REC *src)
|
||||
SERVER_CONNECT_REC *src)
|
||||
{
|
||||
IRC_SERVER_CONNECT_REC *rec;
|
||||
IRC_SERVER_CONNECT_REC *rec, *irc_src;
|
||||
|
||||
g_return_if_fail(dest != NULL);
|
||||
if (!IS_IRC_SERVER_CONNECT(src))
|
||||
if ((irc_src = IRC_SERVER_CONNECT(src)) == NULL)
|
||||
return;
|
||||
|
||||
rec = g_new0(IRC_SERVER_CONNECT_REC, 1);
|
||||
rec->chat_type = IRC_PROTOCOL;
|
||||
rec->max_cmds_at_once = src->max_cmds_at_once;
|
||||
rec->cmd_queue_speed = src->cmd_queue_speed;
|
||||
rec->max_query_chans = src->max_query_chans;
|
||||
rec->max_kicks = src->max_kicks;
|
||||
rec->max_modes = src->max_modes;
|
||||
rec->max_msgs = src->max_msgs;
|
||||
rec->max_whois = src->max_whois;
|
||||
rec->usermode = g_strdup(src->usermode);
|
||||
rec->alternate_nick = g_strdup(src->alternate_nick);
|
||||
rec->sasl_mechanism = src->sasl_mechanism;
|
||||
rec->sasl_username = src->sasl_username;
|
||||
rec->sasl_password = src->sasl_password;
|
||||
rec->max_cmds_at_once = irc_src->max_cmds_at_once;
|
||||
rec->cmd_queue_speed = irc_src->cmd_queue_speed;
|
||||
rec->max_query_chans = irc_src->max_query_chans;
|
||||
rec->max_kicks = irc_src->max_kicks;
|
||||
rec->max_modes = irc_src->max_modes;
|
||||
rec->max_msgs = irc_src->max_msgs;
|
||||
rec->max_whois = irc_src->max_whois;
|
||||
rec->usermode = g_strdup(irc_src->usermode);
|
||||
rec->alternate_nick = g_strdup(irc_src->alternate_nick);
|
||||
rec->sasl_mechanism = irc_src->sasl_mechanism;
|
||||
rec->sasl_username = irc_src->sasl_username;
|
||||
rec->sasl_password = irc_src->sasl_password;
|
||||
*dest = (SERVER_CONNECT_REC *) rec;
|
||||
}
|
||||
|
||||
static void sig_server_reconnect_save_status(IRC_SERVER_CONNECT_REC *conn,
|
||||
IRC_SERVER_REC *server)
|
||||
static void sig_server_reconnect_save_status(SERVER_CONNECT_REC *conn,
|
||||
SERVER_REC *server)
|
||||
{
|
||||
if (!IS_IRC_SERVER_CONNECT(conn) || !IS_IRC_SERVER(server) ||
|
||||
IRC_SERVER_CONNECT_REC *irc_conn;
|
||||
IRC_SERVER_REC *irc_server;
|
||||
if ((irc_conn = IRC_SERVER_CONNECT(conn)) == NULL || (irc_server = IRC_SERVER(server)) == NULL ||
|
||||
!server->connected)
|
||||
return;
|
||||
|
||||
g_free_not_null(conn->channels);
|
||||
conn->channels = irc_server_get_channels(server);
|
||||
g_free_not_null(irc_conn->channels);
|
||||
irc_conn->channels = irc_server_get_channels(irc_server);
|
||||
|
||||
g_free_not_null(conn->usermode);
|
||||
conn->usermode = g_strdup(server->wanted_usermode);
|
||||
g_free_not_null(irc_conn->usermode);
|
||||
irc_conn->usermode = g_strdup(irc_server->wanted_usermode);
|
||||
}
|
||||
|
||||
static void sig_connected(IRC_SERVER_REC *server)
|
||||
static void sig_connected(SERVER_REC *server, const char *u0, const char *u1, const char *u2)
|
||||
{
|
||||
if (!IS_IRC_SERVER(server) || !server->connrec->reconnection)
|
||||
IRC_SERVER_REC *irc_server;
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL || !irc_server->connrec->reconnection)
|
||||
return;
|
||||
|
||||
if (server->connrec->away_reason != NULL)
|
||||
irc_server_send_away(server, server->connrec->away_reason);
|
||||
if (irc_server->connrec->away_reason != NULL)
|
||||
irc_server_send_away(irc_server, irc_server->connrec->away_reason);
|
||||
}
|
||||
|
||||
static void event_nick_collision(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_nick_collision(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
|
||||
time_t new_connect;
|
||||
|
||||
if (!IS_IRC_SERVER(server))
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
/* after server kills us because of nick collision, we want to
|
||||
connect back immediately. but no matter how hard they kill us,
|
||||
don't connect to the server more than once in every 10 seconds. */
|
||||
|
||||
new_connect = server->connect_time+10 -
|
||||
new_connect = irc_server->connect_time+10 -
|
||||
settings_get_time("server_reconnect_time")/1000;
|
||||
if (server->connect_time > new_connect)
|
||||
server->connect_time = new_connect;
|
||||
if (irc_server->connect_time > new_connect)
|
||||
irc_server->connect_time = new_connect;
|
||||
|
||||
server->nick_collision = TRUE;
|
||||
irc_server->nick_collision = TRUE;
|
||||
}
|
||||
|
||||
static void event_kill(IRC_SERVER_REC *server, const char *data,
|
||||
static void event_kill(SERVER_REC *server, const char *data,
|
||||
const char *nick, const char *addr)
|
||||
{
|
||||
if (addr != NULL && !server->nick_collision) {
|
||||
IRC_SERVER_REC *irc_server;
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
if (addr != NULL && !irc_server->nick_collision) {
|
||||
/* don't reconnect if we were killed by an oper (not server) */
|
||||
server->no_reconnect = TRUE;
|
||||
irc_server->no_reconnect = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -735,21 +735,25 @@ static void event_connected(SERVER_REC *server, const char *data, const char *fr
|
||||
g_free(params);
|
||||
}
|
||||
|
||||
static void event_server_info(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_server_info(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char *params, *ircd_version, *usermodes, *chanmodes;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
params = event_get_params(data, 5, NULL, NULL, &ircd_version, &usermodes, &chanmodes);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
/* check if server understands I and e channel modes */
|
||||
if (strchr(chanmodes, 'I') && strchr(chanmodes, 'e'))
|
||||
server->emode_known = TRUE;
|
||||
irc_server->emode_known = TRUE;
|
||||
|
||||
/* save server version */
|
||||
g_free_not_null(server->version);
|
||||
server->version = g_strdup(ircd_version);
|
||||
g_free_not_null(irc_server->version);
|
||||
irc_server->version = g_strdup(ircd_version);
|
||||
|
||||
g_free(params);
|
||||
}
|
||||
@ -799,15 +803,19 @@ static void parse_prefix(IRC_SERVER_REC *server, const char *sptr)
|
||||
}
|
||||
}
|
||||
|
||||
static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_isupport(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char **item, *sptr, *eptr;
|
||||
char **isupport;
|
||||
gpointer key, value;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
server->isupport_sent = TRUE;
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
irc_server->isupport_sent = TRUE;
|
||||
|
||||
sptr = strchr(data, ' ');
|
||||
if (sptr == NULL)
|
||||
@ -838,13 +846,13 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
||||
}
|
||||
|
||||
key = value = NULL;
|
||||
if (!g_hash_table_lookup_extended(server->isupport, eptr,
|
||||
if (!g_hash_table_lookup_extended(irc_server->isupport, eptr,
|
||||
&key, &value) && removed)
|
||||
continue;
|
||||
|
||||
g_hash_table_remove(server->isupport, eptr);
|
||||
g_hash_table_remove(irc_server->isupport, eptr);
|
||||
if (!removed) {
|
||||
g_hash_table_insert(server->isupport, g_strdup(eptr),
|
||||
g_hash_table_insert(irc_server->isupport, g_strdup(eptr),
|
||||
g_strdup(sptr != NULL ? sptr : ""));
|
||||
}
|
||||
|
||||
@ -852,7 +860,7 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
||||
g_free(value);
|
||||
}
|
||||
g_strfreev(isupport);
|
||||
irc_server_init_isupport(server);
|
||||
irc_server_init_isupport(irc_server);
|
||||
|
||||
}
|
||||
|
||||
@ -877,28 +885,41 @@ static void event_motd(SERVER_REC *server, const char *data, const char *from, c
|
||||
event_connected(server, data, from, NULL);
|
||||
}
|
||||
|
||||
static void event_end_of_motd(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_end_of_motd(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
server->motd_got = TRUE;
|
||||
IRC_SERVER_REC *irc_server;
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
irc_server->motd_got = TRUE;
|
||||
}
|
||||
|
||||
static void event_channels_formed(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_channels_formed(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char *params, *channels;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
params = event_get_params(data, 2, NULL, &channels);
|
||||
server->channels_formed = atoi(channels);
|
||||
irc_server->channels_formed = atoi(channels);
|
||||
g_free(params);
|
||||
}
|
||||
|
||||
static void event_hosthidden(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_hosthidden(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char *params, *newhost, *p, *newuserhost;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
params = event_get_params(data, 2, NULL, &newhost);
|
||||
/* do a sanity check */
|
||||
if (!strchr(newhost, '*') && !strchr(newhost, '?') &&
|
||||
@ -909,49 +930,62 @@ static void event_hosthidden(IRC_SERVER_REC *server, const char *data)
|
||||
newhost[strlen(newhost) - 1] != '-') {
|
||||
if (strchr(newhost, '@')) {
|
||||
newuserhost = g_strdup(newhost);
|
||||
g_free(server->userhost);
|
||||
server->userhost = newuserhost;
|
||||
} else if (server->userhost != NULL) {
|
||||
g_free(irc_server->userhost);
|
||||
irc_server->userhost = newuserhost;
|
||||
} else if (irc_server->userhost != NULL) {
|
||||
/* no user@, only process if we know the user@
|
||||
* already
|
||||
*/
|
||||
p = strchr(server->userhost, '@');
|
||||
p = strchr(irc_server->userhost, '@');
|
||||
if (p == NULL)
|
||||
p = server->userhost;
|
||||
newuserhost = g_strdup_printf("%.*s@%s", (int)(p - server->userhost), server->userhost, newhost);
|
||||
g_free(server->userhost);
|
||||
server->userhost = newuserhost;
|
||||
p = irc_server->userhost;
|
||||
newuserhost = g_strdup_printf("%.*s@%s", (int)(p - irc_server->userhost), irc_server->userhost, newhost);
|
||||
g_free(irc_server->userhost);
|
||||
irc_server->userhost = newuserhost;
|
||||
}
|
||||
}
|
||||
g_free(params);
|
||||
}
|
||||
|
||||
static void event_server_banned(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_server_banned(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
server->banned = TRUE;
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
irc_server->banned = TRUE;
|
||||
}
|
||||
|
||||
static void event_error(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_error(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
if (!server->connected && (stristr(data, "Unauthorized") != NULL ||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
if (!irc_server->connected && (stristr(data, "Unauthorized") != NULL ||
|
||||
stristr(data, "K-lined") != NULL ||
|
||||
stristr(data, "Banned") != NULL ||
|
||||
stristr(data, "Bad user info") != NULL))
|
||||
server->banned = TRUE;
|
||||
irc_server->banned = TRUE;
|
||||
}
|
||||
|
||||
static void event_ping(IRC_SERVER_REC *server, const char *data)
|
||||
static void event_ping(SERVER_REC *server, const char *data, const char *u0, const char *u1)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char *params, *origin, *target, *str;
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
params = event_get_params(data, 2, &origin, &target);
|
||||
str = *target == '\0' ? g_strconcat("PONG :", origin, NULL) :
|
||||
g_strdup_printf("PONG %s :%s", target, origin);
|
||||
irc_send_cmd_now(server, str);
|
||||
irc_send_cmd_now(irc_server, str);
|
||||
g_free(str);
|
||||
g_free(params);
|
||||
}
|
||||
@ -1051,14 +1085,14 @@ void irc_servers_init(void)
|
||||
signal_add__event_("004", event_server_info);
|
||||
signal_add__event_("005", event_isupport);
|
||||
signal_add__event_("375", event_motd);
|
||||
signal_add_last__event_376(event_end_of_motd);
|
||||
signal_add_last__event_422(event_end_of_motd); /* no motd */
|
||||
signal_add_last__event_("376", event_end_of_motd);
|
||||
signal_add_last__event_("422", event_end_of_motd); /* no motd */
|
||||
signal_add__event_("254", event_channels_formed);
|
||||
signal_add__event_("396", event_hosthidden);
|
||||
signal_add__event_("465", event_server_banned);
|
||||
signal_add__event_("error", event_error);
|
||||
signal_add__event_("ping", event_ping);
|
||||
signal_add__event_("empty", event_empty);
|
||||
signal_add__event_("empty", (signal_func_event__t) event_empty);
|
||||
|
||||
irc_servers_setup_init();
|
||||
irc_servers_reconnect_init();
|
||||
@ -1085,7 +1119,7 @@ void irc_servers_deinit(void)
|
||||
signal_remove__event_("465", event_server_banned);
|
||||
signal_remove__event_("error", event_error);
|
||||
signal_remove__event_("ping", event_ping);
|
||||
signal_remove__event_("empty", event_empty);
|
||||
signal_remove__event_("empty", (signal_func_event__t) event_empty);
|
||||
|
||||
irc_servers_setup_deinit();
|
||||
irc_servers_reconnect_deinit();
|
||||
|
@ -20,6 +20,6 @@ typedef struct SERVER_DCC_REC SERVER_DCC_REC;
|
||||
typedef void *int_in_ptr;
|
||||
typedef void *uint_in_ptr;
|
||||
|
||||
#include "signal-registry.def"
|
||||
#include "irc/core/signal-registry.def"
|
||||
|
||||
#endif
|
||||
|
@ -40,3 +40,9 @@ noinst_HEADERS = \
|
||||
otr-formats.h \
|
||||
otr-fe.h \
|
||||
otr.h
|
||||
|
||||
BUILT_SOURCES = \
|
||||
signal-registry.def
|
||||
|
||||
signal-registry.def: signal-registry.def.in
|
||||
$(top_srcdir)/utils/signals-to-reg.pl $^ > $@
|
||||
|
@ -3,4 +3,5 @@ EXTRA_DIST = \
|
||||
irssi-version.sh \
|
||||
syntax.pl \
|
||||
tap-driver.sh \
|
||||
tap-test
|
||||
tap-test \
|
||||
signals-to-reg.pl
|
||||
|
24
utils/signals-to-reg.pl
Executable file
24
utils/signals-to-reg.pl
Executable file
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/perl
|
||||
use strict; use warnings;
|
||||
|
||||
while (<>) {
|
||||
my $args = y/,//;
|
||||
s{^\s* " ([^"]*?)(\s)? "(?:<([^>]+)>)? }{SIGNAL_REGISTER@{[
|
||||
$2 ? "_" : ""
|
||||
]}(@{[ $1 =~ s/_/__/gr =~ s/ /_/gr ]}, $args@{[
|
||||
$2 ? ", const char *\L$3" : ""]}}gx ;
|
||||
my %X;
|
||||
s{ (\w+)_REC(,|$) }{$1_REC *\L$1@{[ $X{"\L$1"}++ || "" ]}$2}gx ;
|
||||
s{ CONFIG_(\w+)(,|$) }{CONFIG_$1 *\L$1@{[ $X{"\L$1"}++ || "" ]}$2}gx ;
|
||||
/\(/ && s/$/)/ ;
|
||||
s/ (u?)int (?![*])/ $1int_in_ptr /g;
|
||||
s{ (SIGNAL_REGISTER(_)?\(\w+,\ (\d+))(,\ (.*?))?\) }{$1, (@{[ $4 ? $5 : "void" ]})@{[
|
||||
$4
|
||||
? ",\n\t". $5 =~ s{[^,]* [*]*(\w+)\s*(?:/\*.*?\*/\s*)*(,|$)}{ $1$2}gr
|
||||
: ""
|
||||
]})}gx ;
|
||||
s{ SIGNAL_REGISTER_\(\w+,\ \d+,\ \([^,]+(?:,\ (.*?))?\),\K}{\n\t(@{[ $1 ? $1 : "void" ]}),}gx ;
|
||||
}
|
||||
continue {
|
||||
print;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user