forked from PsychoticNinja/ailin-nemui-irssi
[wip]
This commit is contained in:
parent
eda1cc1f90
commit
d46d83a3b0
@ -458,43 +458,59 @@ static void cmd_whois(const char *data, IRC_SERVER_REC *server,
|
||||
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)
|
||||
{
|
||||
server->whois_found = TRUE;
|
||||
signal_emit__event_("311", (SERVER_REC *)server, data, nick, addr);
|
||||
IRC_SERVER_REC *irc_server;
|
||||
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;
|
||||
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
params = event_get_params(data, 2, NULL, &nick);
|
||||
|
||||
server->whowas_found = FALSE;
|
||||
server_redirect_event(server, "whowas", 1, nick, -1, NULL,
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
irc_server->whowas_found = FALSE;
|
||||
server_redirect_event(irc_server, "whowas", 1, nick, -1, NULL,
|
||||
"event 314", "whowas event",
|
||||
"event 369", "whowas event end",
|
||||
"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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
signal_emit__event_("318", (SERVER_REC *)server, data, nick, addr);
|
||||
server->whois_found = FALSE;
|
||||
IRC_SERVER_REC *irc_server;
|
||||
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)
|
||||
{
|
||||
server->whowas_found = TRUE;
|
||||
signal_emit__event_("314", (SERVER_REC *)server, data, nick, addr);
|
||||
IRC_SERVER_REC *irc_server;
|
||||
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]]] */
|
||||
@ -876,19 +892,20 @@ static void sig_server_disconnected(SERVER_REC *server)
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
if (!IS_IRC_CHANNEL(channel) || !IS_IRC_SERVER(channel->server))
|
||||
if ((irc_channel = IRC_CHANNEL(channel)) == NULL)
|
||||
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;
|
||||
|
||||
next = tmp->next;
|
||||
if (rec->channel == channel)
|
||||
knockout_destroy(channel->server, rec);
|
||||
if (rec->channel == irc_channel)
|
||||
knockout_destroy(irc_channel->server, rec);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "misc.h"
|
||||
#include "expandos.h"
|
||||
#include "settings.h"
|
||||
#include "signal-registry.h"
|
||||
|
||||
#include "irc-servers.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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
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);
|
||||
last_join = g_strdup(nick);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "module.h"
|
||||
#include "signals.h"
|
||||
#include "core/signal-registry.h"
|
||||
#include "signal-registry.h"
|
||||
#include "misc.h"
|
||||
|
||||
@ -76,8 +77,9 @@ int irc_nickcmp_ascii(const char *m, const char *n)
|
||||
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;
|
||||
NICK_REC *rec;
|
||||
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);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
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) {
|
||||
/* unknown channel / names list already read */
|
||||
g_free(params);
|
||||
return;
|
||||
}
|
||||
nick_flags = server->get_nick_flags(SERVER(server));
|
||||
nick_flags = irc_server->get_nick_flags(SERVER(server));
|
||||
nick_flag_op = strchr(nick_flags, '@');
|
||||
|
||||
/* type = '=' = public, '*' = private, '@' = secret.
|
||||
@ -126,7 +131,7 @@ static void event_names_list(IRC_SERVER_REC *server, const char *data)
|
||||
found. */
|
||||
op = halfop = voice = FALSE;
|
||||
prefixes[0] = '\0';
|
||||
while (isnickflag(server, *ptr)) {
|
||||
while (isnickflag(irc_server, *ptr)) {
|
||||
prefix_add(prefixes, *ptr, (SERVER_REC *) server);
|
||||
switch (*ptr) {
|
||||
case '@':
|
||||
@ -166,8 +171,9 @@ static void event_names_list(IRC_SERVER_REC *server, const char *data)
|
||||
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;
|
||||
IRC_CHANNEL_REC *chanrec;
|
||||
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);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
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) {
|
||||
ownnick = nicklist_find(CHANNEL(chanrec), server->nick);
|
||||
ownnick = nicklist_find(CHANNEL(chanrec), irc_server->nick);
|
||||
if (ownnick == NULL) {
|
||||
/* stupid server - assume we have ops
|
||||
if channel is empty */
|
||||
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,
|
||||
FALSE, FALSE, NULL);
|
||||
}
|
||||
@ -197,7 +206,7 @@ static void event_end_of_names(IRC_SERVER_REC *server, const char *data)
|
||||
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;
|
||||
CHANNEL_REC *chanrec;
|
||||
@ -236,14 +245,18 @@ static void event_who(SERVER_REC *server, const char *data)
|
||||
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;
|
||||
GSList *nicks, *tmp;
|
||||
NICK_REC *rec;
|
||||
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
/* first remove the gone-flag, if user is gone
|
||||
it will be set later.. */
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@ -276,7 +289,7 @@ static void event_whois_away(SERVER_REC *server, const char *data)
|
||||
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;
|
||||
|
||||
@ -288,7 +301,7 @@ static void event_own_away(SERVER_REC *server, const char *data)
|
||||
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;
|
||||
|
||||
@ -300,7 +313,7 @@ static void event_own_unaway(SERVER_REC *server, const char *data)
|
||||
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;
|
||||
|
||||
@ -312,7 +325,7 @@ static void event_whois_ircop(SERVER_REC *server, const char *data)
|
||||
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)
|
||||
/* 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;
|
||||
}
|
||||
|
||||
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;
|
||||
int n;
|
||||
gboolean try_alternate_nick;
|
||||
|
||||
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. */
|
||||
return;
|
||||
}
|
||||
|
||||
try_alternate_nick = g_ascii_strcasecmp(server->nick, server->connrec->nick) == 0 &&
|
||||
server->connrec->alternate_nick != NULL &&
|
||||
g_ascii_strcasecmp(server->connrec->alternate_nick, server->nick) != 0;
|
||||
try_alternate_nick = g_ascii_strcasecmp(irc_server->nick, irc_server->connrec->nick) == 0 &&
|
||||
irc_server->connrec->alternate_nick != NULL &&
|
||||
g_ascii_strcasecmp(irc_server->connrec->alternate_nick, irc_server->nick) != 0;
|
||||
|
||||
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 */
|
||||
g_free(server->nick);
|
||||
server->nick = g_strdup(nick);
|
||||
g_free(irc_server->nick);
|
||||
irc_server->nick = g_strdup(nick);
|
||||
}
|
||||
g_free(params);
|
||||
|
||||
/* nick already in use - need to change it .. */
|
||||
if (try_alternate_nick) {
|
||||
/* first try, so try the alternative nick.. */
|
||||
g_free(server->nick);
|
||||
server->nick = g_strdup(server->connrec->alternate_nick);
|
||||
g_free(irc_server->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.. */
|
||||
str = g_strdup_printf("%s_", server->nick);
|
||||
g_free(server->nick);
|
||||
server->nick = str;
|
||||
str = g_strdup_printf("%s_", irc_server->nick);
|
||||
g_free(irc_server->nick);
|
||||
irc_server->nick = str;
|
||||
} else {
|
||||
/* nick full, keep adding number at the end */
|
||||
for (n = 8; n > 0; n--) {
|
||||
if (server->nick[n] < '0' || server->nick[n] > '9') {
|
||||
server->nick[n] = '1';
|
||||
if (irc_server->nick[n] < '0' || irc_server->nick[n] > '9') {
|
||||
irc_server->nick[n] = '1';
|
||||
break;
|
||||
}
|
||||
|
||||
if (server->nick[n] < '9') {
|
||||
server->nick[n]++;
|
||||
if (irc_server->nick[n] < '9') {
|
||||
irc_server->nick[n]++;
|
||||
break;
|
||||
}
|
||||
server->nick[n] = '0';
|
||||
irc_server->nick[n] = '0';
|
||||
}
|
||||
}
|
||||
|
||||
cmd = g_strdup_printf("NICK %s", server->nick);
|
||||
irc_send_cmd_now(server, cmd);
|
||||
cmd = g_strdup_printf("NICK %s", irc_server->nick);
|
||||
irc_send_cmd_now(irc_server, 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;
|
||||
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
params = event_get_params(data, 2, NULL, &channel);
|
||||
if (!server_ischannel(SERVER(server), channel)) {
|
||||
/* nick is unavailable. */
|
||||
event_nick_in_use(server, data);
|
||||
event_nick_in_use(server, data, u0, u1);
|
||||
}
|
||||
|
||||
g_free(params);
|
||||
}
|
||||
|
||||
static void event_nick(IRC_SERVER_REC *server, const char *data,
|
||||
const char *orignick)
|
||||
static void event_nick(SERVER_REC *server, const char *data,
|
||||
const char *orignick, const char *u0)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
char *params, *nick;
|
||||
|
||||
g_return_if_fail(data != NULL);
|
||||
g_return_if_fail(orignick != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
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 */
|
||||
if (server->last_nick != NULL &&
|
||||
g_ascii_strcasecmp(server->last_nick, nick) == 0) {
|
||||
if (irc_server->last_nick != NULL &&
|
||||
g_ascii_strcasecmp(irc_server->last_nick, nick) == 0) {
|
||||
/* changed with /NICK - keep it as wanted nick */
|
||||
g_free(server->connrec->nick);
|
||||
server->connrec->nick = g_strdup(nick);
|
||||
g_free(irc_server->connrec->nick);
|
||||
irc_server->connrec->nick = g_strdup(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);
|
||||
}
|
||||
|
||||
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;
|
||||
int oper;
|
||||
@ -447,7 +472,7 @@ static void event_userhost(SERVER_REC *server, const char *data)
|
||||
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));
|
||||
|
||||
@ -464,30 +489,30 @@ static const char *get_nick_flags(SERVER_REC *server)
|
||||
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))
|
||||
server->get_nick_flags = get_nick_flags;
|
||||
((IRC_SERVER_REC *)server)->get_nick_flags = get_nick_flags;
|
||||
}
|
||||
|
||||
void irc_nicklist_init(void)
|
||||
{
|
||||
signal_add_first__event_nick(event_nick);
|
||||
signal_add_first__event_352(event_who);
|
||||
signal_add_first__event_("nick", event_nick);
|
||||
signal_add_first__event_("352", event_who);
|
||||
signal_add__silent_event_who(event_who);
|
||||
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_oper(event_whois_ircop);
|
||||
signal_add_first__event_306(event_own_away);
|
||||
signal_add_first__event_305(event_own_unaway);
|
||||
signal_add_first__event_353(event_names_list);
|
||||
signal_add_first__event_366(event_end_of_names);
|
||||
signal_add_first__event_432(event_nick_invalid);
|
||||
signal_add_first__event_433(event_nick_in_use);
|
||||
signal_add_first__event_437(event_target_unavailable);
|
||||
signal_add_first__event_302(event_userhost);
|
||||
signal_add__userhost_event(event_userhost);
|
||||
signal_add_first__event_("306", event_own_away);
|
||||
signal_add_first__event_("305", event_own_unaway);
|
||||
signal_add_first__event_("353", event_names_list);
|
||||
signal_add_first__event_("366", event_end_of_names);
|
||||
signal_add_first__event_("432", event_nick_invalid);
|
||||
signal_add_first__event_("433", event_nick_in_use);
|
||||
signal_add_first__event_("437", event_target_unavailable);
|
||||
signal_add_first__event_("302", event_userhost);
|
||||
//signal_add__userhost_event(event_userhost);
|
||||
signal_add__user_mode_changed(sig_usermode);
|
||||
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_("437", event_target_unavailable);
|
||||
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__server_connected(sig_connected);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "module.h"
|
||||
#include "signals.h"
|
||||
#include "signal-registry.h"
|
||||
#include "misc.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,
|
||||
const char *orignick)
|
||||
const char *orignick, const char *u0)
|
||||
{
|
||||
QUERY_REC *query;
|
||||
char *params, *nick;
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include "net-sendbuffer.h"
|
||||
#include "signals.h"
|
||||
#include "core/signal-registry.h"
|
||||
#include "signal-registry.h"
|
||||
#include "rawlog.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;
|
||||
|
||||
server->isnickflag = isnickflag_func;
|
||||
server->ischannel = ischannel_func;
|
||||
server->split_message = split_message;
|
||||
server->send_message = send_message;
|
||||
server->query_find_func =
|
||||
irc_server->isnickflag = isnickflag_func;
|
||||
irc_server->ischannel = ischannel_func;
|
||||
irc_server->split_message = split_message;
|
||||
irc_server->send_message = send_message;
|
||||
irc_server->query_find_func =
|
||||
(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);
|
||||
|
||||
if (!server->session_reconnect)
|
||||
server_init(server);
|
||||
if (!irc_server->session_reconnect)
|
||||
server_init(irc_server);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static void sig_destroyed(IRC_SERVER_REC *server)
|
||||
static void sig_destroyed(SERVER_REC *server)
|
||||
{
|
||||
IRC_SERVER_REC *irc_server;
|
||||
GSList *tmp;
|
||||
|
||||
if (!IS_IRC_SERVER(server))
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
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);
|
||||
if (tmp->next->data != NULL)
|
||||
server_redirect_destroy(tmp->next->data);
|
||||
}
|
||||
g_slist_free(server->cmdqueue);
|
||||
server->cmdqueue = NULL;
|
||||
g_slist_free(irc_server->cmdqueue);
|
||||
irc_server->cmdqueue = NULL;
|
||||
|
||||
gslist_free_full(server->cap_active, (GDestroyNotify) g_free);
|
||||
server->cap_active = NULL;
|
||||
gslist_free_full(irc_server->cap_active, (GDestroyNotify) g_free);
|
||||
irc_server->cap_active = NULL;
|
||||
|
||||
if (server->cap_supported) {
|
||||
g_hash_table_destroy(server->cap_supported);
|
||||
server->cap_supported = NULL;
|
||||
if (irc_server->cap_supported) {
|
||||
g_hash_table_destroy(irc_server->cap_supported);
|
||||
irc_server->cap_supported = NULL;
|
||||
}
|
||||
|
||||
gslist_free_full(server->cap_queue, (GDestroyNotify) g_free);
|
||||
server->cap_queue = NULL;
|
||||
gslist_free_full(irc_server->cap_queue, (GDestroyNotify) g_free);
|
||||
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 */
|
||||
g_hash_table_foreach(server->isupport,
|
||||
(GHFunc) isupport_destroy_hash, server);
|
||||
g_hash_table_destroy(server->isupport);
|
||||
server->isupport = NULL;
|
||||
g_hash_table_foreach(irc_server->isupport,
|
||||
(GHFunc) isupport_destroy_hash, irc_server);
|
||||
g_hash_table_destroy(irc_server->isupport);
|
||||
irc_server->isupport = NULL;
|
||||
|
||||
g_free_and_null(server->wanted_usermode);
|
||||
g_free_and_null(server->real_address);
|
||||
g_free_and_null(server->usermode);
|
||||
g_free_and_null(server->userhost);
|
||||
g_free_and_null(server->last_invite);
|
||||
g_free_and_null(irc_server->wanted_usermode);
|
||||
g_free_and_null(irc_server->real_address);
|
||||
g_free_and_null(irc_server->usermode);
|
||||
g_free_and_null(irc_server->userhost);
|
||||
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 *recoded;
|
||||
|
||||
if (!IS_IRC_SERVER(server) || !server->connected)
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL || !server->connected)
|
||||
return;
|
||||
|
||||
recoded = recode_out(SERVER(server), msg, NULL);
|
||||
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(recoded);
|
||||
}
|
||||
@ -684,43 +688,47 @@ char *irc_server_get_channels(IRC_SERVER_REC *server)
|
||||
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;
|
||||
|
||||
g_return_if_fail(server != NULL);
|
||||
|
||||
if ((irc_server = IRC_SERVER(server)) == NULL)
|
||||
return;
|
||||
|
||||
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. */
|
||||
g_free(server->nick);
|
||||
server->nick = g_strdup(nick);
|
||||
g_free(irc_server->nick);
|
||||
irc_server->nick = g_strdup(nick);
|
||||
}
|
||||
|
||||
/* set the server address */
|
||||
g_free(server->real_address);
|
||||
server->real_address = from == NULL ?
|
||||
g_strdup(server->connrec->address) : /* shouldn't happen.. */
|
||||
g_free(irc_server->real_address);
|
||||
irc_server->real_address = from == NULL ?
|
||||
g_strdup(irc_server->connrec->address) : /* shouldn't happen.. */
|
||||
g_strdup(from);
|
||||
|
||||
/* last welcome message found - commands can be sent to server now. */
|
||||
server->connected = 1;
|
||||
server->real_connect_time = time(NULL);
|
||||
irc_server->connected = 1;
|
||||
irc_server->real_connect_time = time(NULL);
|
||||
|
||||
/* 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.
|
||||
* Do not pass this through cmd_mode because it
|
||||
* is not known whether the resulting MODE message
|
||||
* (if any) is the initial umode or a reply to this.
|
||||
*/
|
||||
irc_send_cmdv(server, "MODE %s %s", server->nick,
|
||||
server->connrec->usermode);
|
||||
g_free_not_null(server->wanted_usermode);
|
||||
server->wanted_usermode = g_strdup(server->connrec->usermode);
|
||||
irc_send_cmdv(irc_server, "MODE %s %s", irc_server->nick,
|
||||
irc_server->connrec->usermode);
|
||||
g_free_not_null(irc_server->wanted_usermode);
|
||||
irc_server->wanted_usermode = g_strdup(irc_server->connrec->usermode);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
/* 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,
|
||||
disable lag checking. */
|
||||
server->disable_lag = TRUE;
|
||||
event_connected(server, data, from);
|
||||
irc_server->disable_lag = TRUE;
|
||||
event_connected(server, data, from, NULL);
|
||||
}
|
||||
|
||||
static void event_end_of_motd(IRC_SERVER_REC *server, const char *data)
|
||||
|
@ -29,6 +29,8 @@ SIGNAL_REGISTER(chanquery_abort, 4, (SERVER_REC *server, const char *args, const
|
||||
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),
|
||||
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),
|
||||
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),
|
||||
@ -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),
|
||||
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
|
||||
SIGNAL_REGISTER_(server_cap_ack, 1, (const char *cmd, 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)
|
||||
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)
|
||||
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)
|
||||
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
SIGNAL_REGISTER(away_mode_changed, 1, (SERVER_REC *server),
|
||||
server)
|
||||
|
@ -18,6 +18,7 @@
|
||||
"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
|
||||
"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 end", SERVER_REC, const char *args, const char *sender_nick, const char *sender_address
|
||||
|
||||
@ -34,6 +35,16 @@
|
||||
// irc-servers.c:
|
||||
"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
|
||||
"server cap ack "<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
|
||||
"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
|
||||
"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
|
||||
|
||||
@ -72,7 +83,7 @@
|
||||
// modes.c:
|
||||
"channel mode changed", CHANNEL_REC, const char *setby
|
||||
"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
|
||||
|
||||
// netsplit.c:
|
||||
|
Loading…
x
Reference in New Issue
Block a user