This commit is contained in:
ailin-nemui 2018-11-15 11:22:12 +01:00
parent eda1cc1f90
commit d46d83a3b0
7 changed files with 233 additions and 142 deletions

View File

@ -458,43 +458,59 @@ static void cmd_whois(const char *data, IRC_SERVER_REC *server,
cmd_params_free(free_arg); cmd_params_free(free_arg);
} }
static void event_whois(IRC_SERVER_REC *server, const char *data, static void event_whois(SERVER_REC *server, const char *data,
const char *nick, const char *addr) const char *nick, const char *addr)
{ {
server->whois_found = TRUE; IRC_SERVER_REC *irc_server;
signal_emit__event_("311", (SERVER_REC *)server, data, nick, addr); if ((irc_server = IRC_SERVER(server)) == NULL)
return;
irc_server->whois_found = TRUE;
signal_emit__event_("311", server, data, nick, addr);
} }
static void sig_whois_try_whowas(IRC_SERVER_REC *server, const char *data) static void sig_whois_try_whowas(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
char *params, *nick; char *params, *nick;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
params = event_get_params(data, 2, NULL, &nick); params = event_get_params(data, 2, NULL, &nick);
server->whowas_found = FALSE; if ((irc_server = IRC_SERVER(server)) == NULL)
server_redirect_event(server, "whowas", 1, nick, -1, NULL, return;
irc_server->whowas_found = FALSE;
server_redirect_event(irc_server, "whowas", 1, nick, -1, NULL,
"event 314", "whowas event", "event 314", "whowas event",
"event 369", "whowas event end", "event 369", "whowas event end",
"event 406", "event empty", NULL); "event 406", "event empty", NULL);
irc_send_cmdv(server, "WHOWAS %s 1", nick); irc_send_cmdv(irc_server, "WHOWAS %s 1", nick);
g_free(params); g_free(params);
} }
static void event_end_of_whois(IRC_SERVER_REC *server, const char *data, static void event_end_of_whois(SERVER_REC *server, const char *data,
const char *nick, const char *addr) const char *nick, const char *addr)
{ {
signal_emit__event_("318", (SERVER_REC *)server, data, nick, addr); IRC_SERVER_REC *irc_server;
server->whois_found = FALSE; if ((irc_server = IRC_SERVER(server)) == NULL)
return;
signal_emit__event_("318", server, data, nick, addr);
irc_server->whois_found = FALSE;
} }
static void event_whowas(IRC_SERVER_REC *server, const char *data, static void event_whowas(SERVER_REC *server, const char *data,
const char *nick, const char *addr) const char *nick, const char *addr)
{ {
server->whowas_found = TRUE; IRC_SERVER_REC *irc_server;
signal_emit__event_("314", (SERVER_REC *)server, data, nick, addr); if ((irc_server = IRC_SERVER(server)) == NULL)
return;
irc_server->whowas_found = TRUE;
signal_emit__event_("314", server, data, nick, addr);
} }
/* SYNTAX: WHOWAS [<nicks> [<count> [server]]] */ /* SYNTAX: WHOWAS [<nicks> [<count> [server]]] */
@ -876,19 +892,20 @@ static void sig_server_disconnected(SERVER_REC *server)
} }
/* destroy all knockouts in channel */ /* destroy all knockouts in channel */
static void sig_channel_destroyed(IRC_CHANNEL_REC *channel) static void sig_channel_destroyed(CHANNEL_REC *channel)
{ {
IRC_CHANNEL_REC *irc_channel;
GSList *tmp, *next; GSList *tmp, *next;
if (!IS_IRC_CHANNEL(channel) || !IS_IRC_SERVER(channel->server)) if ((irc_channel = IRC_CHANNEL(channel)) == NULL)
return; return;
for (tmp = channel->server->knockoutlist; tmp != NULL; tmp = next) { for (tmp = irc_channel->server->knockoutlist; tmp != NULL; tmp = next) {
KNOCKOUT_REC *rec = tmp->data; KNOCKOUT_REC *rec = tmp->data;
next = tmp->next; next = tmp->next;
if (rec->channel == channel) if (rec->channel == irc_channel)
knockout_destroy(channel->server, rec); knockout_destroy(irc_channel->server, rec);
} }
} }

View File

@ -22,6 +22,7 @@
#include "misc.h" #include "misc.h"
#include "expandos.h" #include "expandos.h"
#include "settings.h" #include "settings.h"
#include "signal-registry.h"
#include "irc-servers.h" #include "irc-servers.h"
#include "irc-channels.h" #include "irc-channels.h"
@ -141,12 +142,16 @@ static char *expando_cumode_space(SERVER_REC *server, void *item, int *free_ret)
return *ret == '\0' ? " " : ret; return *ret == '\0' ? " " : ret;
} }
static void event_join(IRC_SERVER_REC *server, const char *data, static void event_join(SERVER_REC *server, const char *data,
const char *nick, const char *address) const char *nick, const char *address)
{ {
IRC_SERVER_REC *irc_server;
g_return_if_fail(nick != NULL); g_return_if_fail(nick != NULL);
if (g_ascii_strcasecmp(nick, server->nick) != 0) { if ((irc_server = IRC_SERVER(server)) == NULL)
return;
if (g_ascii_strcasecmp(nick, irc_server->nick) != 0) {
g_free_not_null(last_join); g_free_not_null(last_join);
last_join = g_strdup(nick); last_join = g_strdup(nick);
} }

View File

@ -20,6 +20,7 @@
#include "module.h" #include "module.h"
#include "signals.h" #include "signals.h"
#include "core/signal-registry.h"
#include "signal-registry.h" #include "signal-registry.h"
#include "misc.h" #include "misc.h"
@ -76,8 +77,9 @@ int irc_nickcmp_ascii(const char *m, const char *n)
return *m == *n ? 0 : 1; return *m == *n ? 0 : 1;
} }
static void event_names_list(IRC_SERVER_REC *server, const char *data) static void event_names_list(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
IRC_CHANNEL_REC *chanrec; IRC_CHANNEL_REC *chanrec;
NICK_REC *rec; NICK_REC *rec;
char *params, *type, *channel, *names, *ptr, *host; char *params, *type, *channel, *names, *ptr, *host;
@ -87,15 +89,18 @@ static void event_names_list(IRC_SERVER_REC *server, const char *data)
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 4, NULL, &type, &channel, &names); params = event_get_params(data, 4, NULL, &type, &channel, &names);
chanrec = irc_channel_find(server, channel); chanrec = irc_channel_find(irc_server, channel);
if (chanrec == NULL || chanrec->names_got) { if (chanrec == NULL || chanrec->names_got) {
/* unknown channel / names list already read */ /* unknown channel / names list already read */
g_free(params); g_free(params);
return; return;
} }
nick_flags = server->get_nick_flags(SERVER(server)); nick_flags = irc_server->get_nick_flags(SERVER(server));
nick_flag_op = strchr(nick_flags, '@'); nick_flag_op = strchr(nick_flags, '@');
/* type = '=' = public, '*' = private, '@' = secret. /* type = '=' = public, '*' = private, '@' = secret.
@ -126,7 +131,7 @@ static void event_names_list(IRC_SERVER_REC *server, const char *data)
found. */ found. */
op = halfop = voice = FALSE; op = halfop = voice = FALSE;
prefixes[0] = '\0'; prefixes[0] = '\0';
while (isnickflag(server, *ptr)) { while (isnickflag(irc_server, *ptr)) {
prefix_add(prefixes, *ptr, (SERVER_REC *) server); prefix_add(prefixes, *ptr, (SERVER_REC *) server);
switch (*ptr) { switch (*ptr) {
case '@': case '@':
@ -166,8 +171,9 @@ static void event_names_list(IRC_SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_end_of_names(IRC_SERVER_REC *server, const char *data) static void event_end_of_names(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
char *params, *channel; char *params, *channel;
IRC_CHANNEL_REC *chanrec; IRC_CHANNEL_REC *chanrec;
NICK_REC *ownnick; NICK_REC *ownnick;
@ -175,16 +181,19 @@ static void event_end_of_names(IRC_SERVER_REC *server, const char *data)
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &channel); params = event_get_params(data, 2, NULL, &channel);
chanrec = irc_channel_find(server, channel); chanrec = irc_channel_find(irc_server, channel);
if (chanrec != NULL && !chanrec->names_got) { if (chanrec != NULL && !chanrec->names_got) {
ownnick = nicklist_find(CHANNEL(chanrec), server->nick); ownnick = nicklist_find(CHANNEL(chanrec), irc_server->nick);
if (ownnick == NULL) { if (ownnick == NULL) {
/* stupid server - assume we have ops /* stupid server - assume we have ops
if channel is empty */ if channel is empty */
nicks = g_hash_table_size(chanrec->nicks); nicks = g_hash_table_size(chanrec->nicks);
ownnick = irc_nicklist_insert(chanrec, server->nick, ownnick = irc_nicklist_insert(chanrec, irc_server->nick,
nicks == 0, FALSE, nicks == 0, FALSE,
FALSE, FALSE, NULL); FALSE, FALSE, NULL);
} }
@ -197,7 +206,7 @@ static void event_end_of_names(IRC_SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_who(SERVER_REC *server, const char *data) static void event_who(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *nick, *channel, *user, *host, *stat, *realname, *hops; char *params, *nick, *channel, *user, *host, *stat, *realname, *hops;
CHANNEL_REC *chanrec; CHANNEL_REC *chanrec;
@ -236,14 +245,18 @@ static void event_who(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_whois(IRC_SERVER_REC *server, const char *data) static void event_whois(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
char *params, *nick, *realname; char *params, *nick, *realname;
GSList *nicks, *tmp; GSList *nicks, *tmp;
NICK_REC *rec; NICK_REC *rec;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
/* first remove the gone-flag, if user is gone /* first remove the gone-flag, if user is gone
it will be set later.. */ it will be set later.. */
params = event_get_params(data, 6, NULL, &nick, NULL, params = event_get_params(data, 6, NULL, &nick, NULL,
@ -264,7 +277,7 @@ static void event_whois(IRC_SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_whois_away(SERVER_REC *server, const char *data) static void event_whois_away(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *nick, *awaymsg; char *params, *nick, *awaymsg;
@ -276,7 +289,7 @@ static void event_whois_away(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_own_away(SERVER_REC *server, const char *data) static void event_own_away(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *nick; char *params, *nick;
@ -288,7 +301,7 @@ static void event_own_away(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_own_unaway(SERVER_REC *server, const char *data) static void event_own_unaway(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *nick; char *params, *nick;
@ -300,7 +313,7 @@ static void event_own_unaway(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_whois_ircop(SERVER_REC *server, const char *data) static void event_whois_ircop(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *nick, *awaymsg; char *params, *nick, *awaymsg;
@ -312,7 +325,7 @@ static void event_whois_ircop(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void event_nick_invalid(IRC_SERVER_REC *server, const char *data) static void event_nick_invalid(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
if (!server->connected) if (!server->connected)
/* we used to call server_disconnect but that crashes /* we used to call server_disconnect but that crashes
@ -322,95 +335,107 @@ static void event_nick_invalid(IRC_SERVER_REC *server, const char *data)
server->connection_lost = server->no_reconnect = TRUE; server->connection_lost = server->no_reconnect = TRUE;
} }
static void event_nick_in_use(IRC_SERVER_REC *server, const char *data) static void event_nick_in_use(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
char *str, *cmd, *params, *nick; char *str, *cmd, *params, *nick;
int n; int n;
gboolean try_alternate_nick; gboolean try_alternate_nick;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if (server->connected) { if ((irc_server = IRC_SERVER(server)) == NULL)
return;
if (irc_server->connected) {
/* Already connected, no need to handle this anymore. */ /* Already connected, no need to handle this anymore. */
return; return;
} }
try_alternate_nick = g_ascii_strcasecmp(server->nick, server->connrec->nick) == 0 && try_alternate_nick = g_ascii_strcasecmp(irc_server->nick, irc_server->connrec->nick) == 0 &&
server->connrec->alternate_nick != NULL && irc_server->connrec->alternate_nick != NULL &&
g_ascii_strcasecmp(server->connrec->alternate_nick, server->nick) != 0; g_ascii_strcasecmp(irc_server->connrec->alternate_nick, irc_server->nick) != 0;
params = event_get_params(data, 2, NULL, &nick); params = event_get_params(data, 2, NULL, &nick);
if (g_ascii_strcasecmp(server->nick, nick) != 0) { if (g_ascii_strcasecmp(irc_server->nick, nick) != 0) {
/* the server uses a nick different from the one we send */ /* the server uses a nick different from the one we send */
g_free(server->nick); g_free(irc_server->nick);
server->nick = g_strdup(nick); irc_server->nick = g_strdup(nick);
} }
g_free(params); g_free(params);
/* nick already in use - need to change it .. */ /* nick already in use - need to change it .. */
if (try_alternate_nick) { if (try_alternate_nick) {
/* first try, so try the alternative nick.. */ /* first try, so try the alternative nick.. */
g_free(server->nick); g_free(irc_server->nick);
server->nick = g_strdup(server->connrec->alternate_nick); irc_server->nick = g_strdup(irc_server->connrec->alternate_nick);
} }
else if (strlen(server->nick) < 9) { else if (strlen(irc_server->nick) < 9) {
/* keep adding '_' to end of nick.. */ /* keep adding '_' to end of nick.. */
str = g_strdup_printf("%s_", server->nick); str = g_strdup_printf("%s_", irc_server->nick);
g_free(server->nick); g_free(irc_server->nick);
server->nick = str; irc_server->nick = str;
} else { } else {
/* nick full, keep adding number at the end */ /* nick full, keep adding number at the end */
for (n = 8; n > 0; n--) { for (n = 8; n > 0; n--) {
if (server->nick[n] < '0' || server->nick[n] > '9') { if (irc_server->nick[n] < '0' || irc_server->nick[n] > '9') {
server->nick[n] = '1'; irc_server->nick[n] = '1';
break; break;
} }
if (server->nick[n] < '9') { if (irc_server->nick[n] < '9') {
server->nick[n]++; irc_server->nick[n]++;
break; break;
} }
server->nick[n] = '0'; irc_server->nick[n] = '0';
} }
} }
cmd = g_strdup_printf("NICK %s", server->nick); cmd = g_strdup_printf("NICK %s", irc_server->nick);
irc_send_cmd_now(server, cmd); irc_send_cmd_now(irc_server, cmd);
g_free(cmd); g_free(cmd);
} }
static void event_target_unavailable(IRC_SERVER_REC *server, const char *data) static void event_target_unavailable(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
IRC_SERVER_REC *irc_server;
char *params, *channel; char *params, *channel;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &channel); params = event_get_params(data, 2, NULL, &channel);
if (!server_ischannel(SERVER(server), channel)) { if (!server_ischannel(SERVER(server), channel)) {
/* nick is unavailable. */ /* nick is unavailable. */
event_nick_in_use(server, data); event_nick_in_use(server, data, u0, u1);
} }
g_free(params); g_free(params);
} }
static void event_nick(IRC_SERVER_REC *server, const char *data, static void event_nick(SERVER_REC *server, const char *data,
const char *orignick) const char *orignick, const char *u0)
{ {
IRC_SERVER_REC *irc_server;
char *params, *nick; char *params, *nick;
g_return_if_fail(data != NULL); g_return_if_fail(data != NULL);
g_return_if_fail(orignick != NULL); g_return_if_fail(orignick != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 1, &nick); params = event_get_params(data, 1, &nick);
if (g_ascii_strcasecmp(orignick, server->nick) == 0) { if (g_ascii_strcasecmp(orignick, irc_server->nick) == 0) {
/* You changed your nick */ /* You changed your nick */
if (server->last_nick != NULL && if (irc_server->last_nick != NULL &&
g_ascii_strcasecmp(server->last_nick, nick) == 0) { g_ascii_strcasecmp(irc_server->last_nick, nick) == 0) {
/* changed with /NICK - keep it as wanted nick */ /* changed with /NICK - keep it as wanted nick */
g_free(server->connrec->nick); g_free(irc_server->connrec->nick);
server->connrec->nick = g_strdup(nick); irc_server->connrec->nick = g_strdup(nick);
} }
server_change_nick(SERVER(server), nick); server_change_nick(SERVER(server), nick);
@ -420,7 +445,7 @@ static void event_nick(IRC_SERVER_REC *server, const char *data,
g_free(params); g_free(params);
} }
static void event_userhost(SERVER_REC *server, const char *data) static void event_userhost(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{ {
char *params, *hosts, **phosts, **pos, *ptr; char *params, *hosts, **phosts, **pos, *ptr;
int oper; int oper;
@ -447,7 +472,7 @@ static void event_userhost(SERVER_REC *server, const char *data)
g_free(params); g_free(params);
} }
static void sig_usermode(SERVER_REC *server) static void sig_usermode(SERVER_REC *server, const char *u0)
{ {
g_return_if_fail(IS_SERVER(server)); g_return_if_fail(IS_SERVER(server));
@ -464,30 +489,30 @@ static const char *get_nick_flags(SERVER_REC *server)
return prefix == NULL ? "" : prefix+1; return prefix == NULL ? "" : prefix+1;
} }
static void sig_connected(IRC_SERVER_REC *server) static void sig_connected(SERVER_REC *server)
{ {
if (IS_IRC_SERVER(server)) if (IS_IRC_SERVER(server))
server->get_nick_flags = get_nick_flags; ((IRC_SERVER_REC *)server)->get_nick_flags = get_nick_flags;
} }
void irc_nicklist_init(void) void irc_nicklist_init(void)
{ {
signal_add_first__event_nick(event_nick); signal_add_first__event_("nick", event_nick);
signal_add_first__event_352(event_who); signal_add_first__event_("352", event_who);
signal_add__silent_event_who(event_who); signal_add__silent_event_who(event_who);
signal_add__silent_event_whois(event_whois); signal_add__silent_event_whois(event_whois);
signal_add_first__event_311(event_whois); signal_add_first__event_("311", event_whois);
signal_add_first__whois_away(event_whois_away); signal_add_first__whois_away(event_whois_away);
signal_add_first__whois_oper(event_whois_ircop); signal_add_first__whois_oper(event_whois_ircop);
signal_add_first__event_306(event_own_away); signal_add_first__event_("306", event_own_away);
signal_add_first__event_305(event_own_unaway); signal_add_first__event_("305", event_own_unaway);
signal_add_first__event_353(event_names_list); signal_add_first__event_("353", event_names_list);
signal_add_first__event_366(event_end_of_names); signal_add_first__event_("366", event_end_of_names);
signal_add_first__event_432(event_nick_invalid); signal_add_first__event_("432", event_nick_invalid);
signal_add_first__event_433(event_nick_in_use); signal_add_first__event_("433", event_nick_in_use);
signal_add_first__event_437(event_target_unavailable); signal_add_first__event_("437", event_target_unavailable);
signal_add_first__event_302(event_userhost); signal_add_first__event_("302", event_userhost);
signal_add__userhost_event(event_userhost); //signal_add__userhost_event(event_userhost);
signal_add__user_mode_changed(sig_usermode); signal_add__user_mode_changed(sig_usermode);
signal_add__server_connected(sig_connected); signal_add__server_connected(sig_connected);
} }
@ -509,7 +534,7 @@ void irc_nicklist_deinit(void)
signal_remove__event_("433", event_nick_in_use); signal_remove__event_("433", event_nick_in_use);
signal_remove__event_("437", event_target_unavailable); signal_remove__event_("437", event_target_unavailable);
signal_remove__event_("302", event_userhost); signal_remove__event_("302", event_userhost);
signal_remove__userhost_event(event_userhost); //signal_remove__userhost_event(event_userhost);
signal_remove__user_mode_changed(sig_usermode); signal_remove__user_mode_changed(sig_usermode);
signal_remove__server_connected(sig_connected); signal_remove__server_connected(sig_connected);
} }

View File

@ -20,6 +20,7 @@
#include "module.h" #include "module.h"
#include "signals.h" #include "signals.h"
#include "signal-registry.h"
#include "misc.h" #include "misc.h"
#include "irc-nicklist.h" #include "irc-nicklist.h"
@ -89,7 +90,7 @@ static void ctcp_action(IRC_SERVER_REC *server, const char *msg,
} }
static void event_nick(SERVER_REC *server, const char *data, static void event_nick(SERVER_REC *server, const char *data,
const char *orignick) const char *orignick, const char *u0)
{ {
QUERY_REC *query; QUERY_REC *query;
char *params, *nick; char *params, *nick;

View File

@ -22,6 +22,7 @@
#include "net-sendbuffer.h" #include "net-sendbuffer.h"
#include "signals.h" #include "signals.h"
#include "core/signal-registry.h"
#include "signal-registry.h" #include "signal-registry.h"
#include "rawlog.h" #include "rawlog.h"
#include "misc.h" #include "misc.h"
@ -400,24 +401,25 @@ void irc_server_purge_output(IRC_SERVER_REC *server, const char *target)
} }
} }
static void sig_connected(IRC_SERVER_REC *server) static void sig_connected(SERVER_REC *server)
{ {
if (!IS_IRC_SERVER(server)) IRC_SERVER_REC *irc_server;
if ((irc_server = IRC_SERVER(server)) == NULL)
return; return;
server->isnickflag = isnickflag_func; irc_server->isnickflag = isnickflag_func;
server->ischannel = ischannel_func; irc_server->ischannel = ischannel_func;
server->split_message = split_message; irc_server->split_message = split_message;
server->send_message = send_message; irc_server->send_message = send_message;
server->query_find_func = irc_server->query_find_func =
(QUERY_REC *(*)(SERVER_REC *, const char *)) irc_query_find; (QUERY_REC *(*)(SERVER_REC *, const char *)) irc_query_find;
server->nick_comp_func = irc_nickcmp_rfc1459; irc_server->nick_comp_func = irc_nickcmp_rfc1459;
server->splits = g_hash_table_new((GHashFunc) g_istr_hash, irc_server->splits = g_hash_table_new((GHashFunc) g_istr_hash,
(GCompareFunc) g_istr_equal); (GCompareFunc) g_istr_equal);
if (!server->session_reconnect) if (!irc_server->session_reconnect)
server_init(server); server_init(irc_server);
} }
static void isupport_destroy_hash(void *key, void *value) static void isupport_destroy_hash(void *key, void *value)
@ -426,58 +428,60 @@ static void isupport_destroy_hash(void *key, void *value)
g_free(value); g_free(value);
} }
static void sig_destroyed(IRC_SERVER_REC *server) static void sig_destroyed(SERVER_REC *server)
{ {
IRC_SERVER_REC *irc_server;
GSList *tmp; GSList *tmp;
if (!IS_IRC_SERVER(server)) if ((irc_server = IRC_SERVER(server)) == NULL)
return; return;
for (tmp = server->cmdqueue; tmp != NULL; tmp = tmp->next->next) { for (tmp = irc_server->cmdqueue; tmp != NULL; tmp = tmp->next->next) {
g_free(tmp->data); g_free(tmp->data);
if (tmp->next->data != NULL) if (tmp->next->data != NULL)
server_redirect_destroy(tmp->next->data); server_redirect_destroy(tmp->next->data);
} }
g_slist_free(server->cmdqueue); g_slist_free(irc_server->cmdqueue);
server->cmdqueue = NULL; irc_server->cmdqueue = NULL;
gslist_free_full(server->cap_active, (GDestroyNotify) g_free); gslist_free_full(irc_server->cap_active, (GDestroyNotify) g_free);
server->cap_active = NULL; irc_server->cap_active = NULL;
if (server->cap_supported) { if (irc_server->cap_supported) {
g_hash_table_destroy(server->cap_supported); g_hash_table_destroy(irc_server->cap_supported);
server->cap_supported = NULL; irc_server->cap_supported = NULL;
} }
gslist_free_full(server->cap_queue, (GDestroyNotify) g_free); gslist_free_full(irc_server->cap_queue, (GDestroyNotify) g_free);
server->cap_queue = NULL; irc_server->cap_queue = NULL;
g_free_and_null(server->sasl_buffer); g_free_and_null(irc_server->sasl_buffer);
/* these are dynamically allocated only if isupport was sent */ /* these are dynamically allocated only if isupport was sent */
g_hash_table_foreach(server->isupport, g_hash_table_foreach(irc_server->isupport,
(GHFunc) isupport_destroy_hash, server); (GHFunc) isupport_destroy_hash, irc_server);
g_hash_table_destroy(server->isupport); g_hash_table_destroy(irc_server->isupport);
server->isupport = NULL; irc_server->isupport = NULL;
g_free_and_null(server->wanted_usermode); g_free_and_null(irc_server->wanted_usermode);
g_free_and_null(server->real_address); g_free_and_null(irc_server->real_address);
g_free_and_null(server->usermode); g_free_and_null(irc_server->usermode);
g_free_and_null(server->userhost); g_free_and_null(irc_server->userhost);
g_free_and_null(server->last_invite); g_free_and_null(irc_server->last_invite);
} }
static void sig_server_quit(IRC_SERVER_REC *server, const char *msg) static void sig_server_quit(SERVER_REC *server, const char *msg)
{ {
IRC_SERVER_REC *irc_server;
char *str; char *str;
char *recoded; char *recoded;
if (!IS_IRC_SERVER(server) || !server->connected) if ((irc_server = IRC_SERVER(server)) == NULL || !server->connected)
return; return;
recoded = recode_out(SERVER(server), msg, NULL); recoded = recode_out(SERVER(server), msg, NULL);
str = g_strdup_printf("QUIT :%s", recoded); str = g_strdup_printf("QUIT :%s", recoded);
irc_send_cmd_now(server, str); irc_send_cmd_now(irc_server, str);
g_free(str); g_free(str);
g_free(recoded); g_free(recoded);
} }
@ -684,43 +688,47 @@ char *irc_server_get_channels(IRC_SERVER_REC *server)
return ret; return ret;
} }
static void event_connected(IRC_SERVER_REC *server, const char *data, const char *from) static void event_connected(SERVER_REC *server, const char *data, const char *from, const char *u0)
{ {
IRC_SERVER_REC *irc_server;
char *params, *nick; char *params, *nick;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 1, &nick); params = event_get_params(data, 1, &nick);
if (g_strcmp0(server->nick, nick) != 0) { if (g_strcmp0(irc_server->nick, nick) != 0) {
/* nick changed unexpectedly .. connected via proxy, etc. */ /* nick changed unexpectedly .. connected via proxy, etc. */
g_free(server->nick); g_free(irc_server->nick);
server->nick = g_strdup(nick); irc_server->nick = g_strdup(nick);
} }
/* set the server address */ /* set the server address */
g_free(server->real_address); g_free(irc_server->real_address);
server->real_address = from == NULL ? irc_server->real_address = from == NULL ?
g_strdup(server->connrec->address) : /* shouldn't happen.. */ g_strdup(irc_server->connrec->address) : /* shouldn't happen.. */
g_strdup(from); g_strdup(from);
/* last welcome message found - commands can be sent to server now. */ /* last welcome message found - commands can be sent to server now. */
server->connected = 1; irc_server->connected = 1;
server->real_connect_time = time(NULL); irc_server->real_connect_time = time(NULL);
/* let the queue send now that we are identified */ /* let the queue send now that we are identified */
g_get_current_time(&server->wait_cmd); g_get_current_time(&irc_server->wait_cmd);
if (server->connrec->usermode != NULL) { if (irc_server->connrec->usermode != NULL) {
/* Send the user mode, before the autosendcmd. /* Send the user mode, before the autosendcmd.
* Do not pass this through cmd_mode because it * Do not pass this through cmd_mode because it
* is not known whether the resulting MODE message * is not known whether the resulting MODE message
* (if any) is the initial umode or a reply to this. * (if any) is the initial umode or a reply to this.
*/ */
irc_send_cmdv(server, "MODE %s %s", server->nick, irc_send_cmdv(irc_server, "MODE %s %s", irc_server->nick,
server->connrec->usermode); irc_server->connrec->usermode);
g_free_not_null(server->wanted_usermode); g_free_not_null(irc_server->wanted_usermode);
server->wanted_usermode = g_strdup(server->connrec->usermode); irc_server->wanted_usermode = g_strdup(irc_server->connrec->usermode);
} }
signal_emit__event_connected((SERVER_REC *)server); signal_emit__event_connected((SERVER_REC *)server);
@ -848,9 +856,13 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
} }
static void event_motd(IRC_SERVER_REC *server, const char *data, const char *from) static void event_motd(SERVER_REC *server, const char *data, const char *from, const char *u0)
{ {
if (server->connected) IRC_SERVER_REC *irc_server;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
if (irc_server->connected)
return; return;
/* Stupid broken piece of shit ircd didn't send us 001, /* Stupid broken piece of shit ircd didn't send us 001,
@ -861,8 +873,8 @@ static void event_motd(IRC_SERVER_REC *server, const char *data, const char *fro
Oh, and looks like it also doesn't answer anything to PINGs, Oh, and looks like it also doesn't answer anything to PINGs,
disable lag checking. */ disable lag checking. */
server->disable_lag = TRUE; irc_server->disable_lag = TRUE;
event_connected(server, data, from); 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(IRC_SERVER_REC *server, const char *data)

View File

@ -29,6 +29,8 @@ SIGNAL_REGISTER(chanquery_abort, 4, (SERVER_REC *server, const char *args, const
server, args, sender_nick, sender_address) server, args, sender_nick, sender_address)
SIGNAL_REGISTER(silent_event_who, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address), SIGNAL_REGISTER(silent_event_who, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address) server, args, sender_nick, sender_address)
SIGNAL_REGISTER(silent_event_whois, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(chanquery_ban, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address), SIGNAL_REGISTER(chanquery_ban, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address) server, args, sender_nick, sender_address)
SIGNAL_REGISTER(chanquery_ban_end, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address), SIGNAL_REGISTER(chanquery_ban_end, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
@ -57,6 +59,24 @@ SIGNAL_REGISTER(ctcp_action, 5, (IRC_SERVER_REC *irc_server, const char *args, c
SIGNAL_REGISTER(event_connected, 1, (SERVER_REC *server), SIGNAL_REGISTER(event_connected, 1, (SERVER_REC *server),
server) server)
// irc-commands.c:
SIGNAL_REGISTER(whois_end, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whois_away, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whois_oper, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whois_try_whowas, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whois_event_not_found, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whois_event, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whowas_event, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(whowas_event_end, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
// irc-cap.c // irc-cap.c
SIGNAL_REGISTER_(server_cap_ack, 1, (const char *cmd, IRC_SERVER_REC *irc_server), SIGNAL_REGISTER_(server_cap_ack, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
(IRC_SERVER_REC *irc_server), (IRC_SERVER_REC *irc_server),
@ -90,7 +110,7 @@ SIGNAL_REGISTER_(event, 4, (const char *cmd, SERVER_REC *server, const char *arg
cmd, server, args, sender_nick, sender_address) cmd, server, args, sender_nick, sender_address)
SIGNAL_REGISTER(default_event, 4, (SERVER_REC *server, const char *data, const char *sender_nick, const char *sender_address), SIGNAL_REGISTER(default_event, 4, (SERVER_REC *server, const char *data, const char *sender_nick, const char *sender_address),
server, data, sender_nick, sender_address) server, data, sender_nick, sender_address)
SIGNAL_REGISTER(whois_default_event, 4, (SERVER_REC *server, char *args, char *sender_nick, char *sender_address), SIGNAL_REGISTER(whois_default_event, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address) server, args, sender_nick, sender_address)
SIGNAL_REGISTER(server_incoming, 2, (SERVER_REC *server, char *data), SIGNAL_REGISTER(server_incoming, 2, (SERVER_REC *server, char *data),
@ -122,7 +142,7 @@ SIGNAL_REGISTER(channel_mode_changed, 2, (CHANNEL_REC *channel, const char *setb
channel, setby) channel, setby)
SIGNAL_REGISTER(nick_mode_changed, 5, (CHANNEL_REC *channel, NICK_REC *nick, const char *setby, const char *mode, const char *type), SIGNAL_REGISTER(nick_mode_changed, 5, (CHANNEL_REC *channel, NICK_REC *nick, const char *setby, const char *mode, const char *type),
channel, nick, setby, mode, type) channel, nick, setby, mode, type)
SIGNAL_REGISTER(user_mode_changed, 2, (SERVER_REC *server, char *old), SIGNAL_REGISTER(user_mode_changed, 2, (SERVER_REC *server, const char *old),
server, old) server, old)
SIGNAL_REGISTER(away_mode_changed, 1, (SERVER_REC *server), SIGNAL_REGISTER(away_mode_changed, 1, (SERVER_REC *server),
server) server)

View File

@ -18,6 +18,7 @@
"chanquery who end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "chanquery who end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"chanquery abort", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "chanquery abort", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"silent event who", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "silent event who", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"silent event whois", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"chanquery ban", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "chanquery ban", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"chanquery ban end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "chanquery ban end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
@ -34,6 +35,16 @@
// irc-servers.c: // irc-servers.c:
"event connected", SERVER_REC "event connected", SERVER_REC
// irc-commands.c:
"whois end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whois away", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whois oper", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whois try whowas", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whois event not found", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whois event", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whowas event", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"whowas event end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
// irc-cap.c // irc-cap.c
"server cap ack "<cmd>, IRC_SERVER_REC "server cap ack "<cmd>, IRC_SERVER_REC
"server cap nak "<cmd>, IRC_SERVER_REC "server cap nak "<cmd>, IRC_SERVER_REC
@ -51,7 +62,7 @@
"server event", SERVER_REC, const char *data, const char *sender_nick, const char *sender_address "server event", SERVER_REC, const char *data, const char *sender_nick, const char *sender_address
"event "<cmd>, SERVER_REC, const char *args, const char *sender_nick, const char *sender_address "event "<cmd>, SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"default event", SERVER_REC, const char *data, const char *sender_nick, const char *sender_address "default event", SERVER_REC, const char *data, const char *sender_nick, const char *sender_address
"whois default event", SERVER_REC, char *args, char *sender_nick, char *sender_address "whois default event", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
"server incoming", SERVER_REC, char *data "server incoming", SERVER_REC, char *data
@ -72,7 +83,7 @@
// modes.c: // modes.c:
"channel mode changed", CHANNEL_REC, const char *setby "channel mode changed", CHANNEL_REC, const char *setby
"nick mode changed", CHANNEL_REC, NICK_REC, const char *setby, const char *mode, const char *type "nick mode changed", CHANNEL_REC, NICK_REC, const char *setby, const char *mode, const char *type
"user mode changed", SERVER_REC, char *old "user mode changed", SERVER_REC, const char *old
"away mode changed", SERVER_REC "away mode changed", SERVER_REC
// netsplit.c: // netsplit.c: