[wip] tieing up

This commit is contained in:
ailin-nemui 2018-11-15 10:53:02 +01:00
parent 0aed9a9168
commit eda1cc1f90
29 changed files with 401 additions and 251 deletions

View File

@ -20,6 +20,7 @@
#include "module.h"
#include "signals.h"
#include "fe-common/core/signal-registry.h"
#include "signal-registry.h"
#include "lib-config/iconfig.h"
#include "settings.h"
@ -215,7 +216,7 @@ void channels_setup_init(void)
setupchannels = NULL;
source_host_ok = FALSE;
signal_add__setup_reread(channels_read_config);
signal_add__setup_reread((signal_func_setup_reread_t) channels_read_config);
signal_add__irssi_init_read_settings(channels_read_config);
}
@ -224,6 +225,6 @@ void channels_setup_deinit(void)
while (setupchannels != NULL)
channel_setup_destroy(setupchannels->data);
signal_remove__setup_reread(channels_read_config);
signal_remove__setup_reread((signal_func_setup_reread_t) channels_read_config);
signal_remove__irssi_init_read_settings(channels_read_config);
}

View File

@ -22,6 +22,8 @@
#include "network.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "irc/core/signal-registry.h"
#include "special-vars.h"
#include "lib-config/iconfig.h"
#include "settings.h"
@ -181,7 +183,7 @@ void chatnets_init(void)
chatnets = NULL;
signal_add_first__event_connected(sig_connected);
signal_add__setup_reread(read_chatnets);
signal_add__setup_reread((signal_func_setup_reread_t) read_chatnets);
signal_add_first__irssi_init_read_settings(read_chatnets);
}
@ -189,7 +191,7 @@ void chatnets_deinit(void)
{
module_uniq_destroy("CHATNET");
signal_remove__event_("connected", sig_connected);
signal_remove__setup_reread(read_chatnets);
signal_remove__event_connected(sig_connected);
signal_remove__setup_reread((signal_func_setup_reread_t) read_chatnets);
signal_remove__irssi_init_read_settings(read_chatnets);
}

View File

@ -917,7 +917,7 @@ static void parse_command(const char *command, int expand_aliases,
g_free(orig);
}
static void event_command(const char *line, SERVER_REC *server, void *item)
static void event_command(const char *line, SERVER_REC *server, WI_ITEM_REC *item)
{
char *cmdchar;
int expand_aliases = TRUE;

View File

@ -28,6 +28,7 @@
#include "net-disconnect.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "settings.h"
#include "session.h"
#ifdef HAVE_CAPSICUM

View File

@ -23,6 +23,7 @@
#include "modules.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "expandos.h"
#include "settings.h"
#include "commands.h"
@ -523,7 +524,7 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
}
static void sig_message_private(SERVER_REC *server, const char *msg,
const char *nick, const char *address)
const char *nick, const char *address, const char *target)
{
g_free_not_null(last_privmsg_from);
last_privmsg_from = g_strdup(nick);

View File

@ -526,7 +526,7 @@ void ignore_init(void)
time_tag = g_timeout_add(1000, (GSourceFunc) unignore_timeout, NULL);
read_ignores();
signal_add__setup_reread(read_ignores);
signal_add__setup_reread((signal_func_setup_reread_t) read_ignores);
}
void ignore_deinit(void)
@ -536,5 +536,5 @@ void ignore_deinit(void)
ignore_destroy(ignores->data, TRUE);
nickmatch_deinit(nickmatch);
signal_remove__setup_reread(read_ignores);
signal_remove__setup_reread((signal_func_setup_reread_t) read_ignores);
}

View File

@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "irc/core/signal-registry.h"
#include "levels.h"
#include "log.h"
#include "servers.h"
@ -31,7 +32,7 @@ static LOG_REC *awaylog;
static int away_filepos;
static int away_msgs;
static void sig_log_written(LOG_REC *log)
static void sig_log_written(LOG_REC *log, const char *u0)
{
if (log != awaylog) return;

View File

@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "commands.h"
#include "levels.h"
#include "misc.h"
@ -599,7 +600,7 @@ void log_init(void)
read_settings();
signal_add__setup_changed(read_settings);
signal_add__setup_reread(log_read_config);
signal_add__setup_reread((signal_func_setup_reread_t) log_read_config);
signal_add__irssi_init_finished(log_read_config);
}
@ -613,6 +614,6 @@ void log_deinit(void)
g_free_not_null(log_timestamp);
signal_remove__setup_changed(read_settings);
signal_remove__setup_reread(log_read_config);
signal_remove__setup_reread((signal_func_setup_reread_t) log_read_config);
signal_remove__irssi_init_finished(log_read_config);
}

View File

@ -444,7 +444,7 @@ void nicklist_set_own(CHANNEL_REC *channel, NICK_REC *nick)
g_hash_table_insert(channel->nicks, nick->nick, nick);
}
static void sig_channel_created(CHANNEL_REC *channel)
static void sig_channel_created(CHANNEL_REC *channel, void *u0)
{
g_return_if_fail(IS_CHANNEL(channel));

View File

@ -104,7 +104,7 @@ void nickmatch_cache_init(void)
{
lists = NULL;
signal_add__nicklist_new(sig_nick_new);
signal_add__nicklist_changed(sig_nick_new);
signal_add__nicklist_changed((signal_func_nicklist_changed_t) sig_nick_new);
signal_add__nicklist_host_changed(sig_nick_new);
signal_add__nicklist_remove(sig_nick_remove);
}
@ -115,7 +115,7 @@ void nickmatch_cache_deinit(void)
g_slist_free(lists);
signal_remove__nicklist_new(sig_nick_new);
signal_remove__nicklist_changed(sig_nick_new);
signal_remove__nicklist_changed((signal_func_nicklist_changed_t) sig_nick_new);
signal_remove__nicklist_host_changed(sig_nick_new);
signal_remove__nicklist_remove(sig_nick_remove);
}

View File

@ -23,6 +23,7 @@
#include "network.h"
#include "signals.h"
#include "signal-registry.h"
#include "irc/core/signal-registry.h"
#include "chat-protocols.h"
#include "servers.h"
@ -504,9 +505,9 @@ void servers_reconnect_init(void)
reconnect_timeout_tag = g_timeout_add(1000, (GSourceFunc) server_reconnect_timeout, NULL);
read_settings();
signal_add__server_connect_failed(sig_reconnect);
signal_add__server_connect_failed((signal_func_server_connect_failed_t) sig_reconnect);
signal_add__server_disconnected(sig_reconnect);
signal_add__event_("connected", sig_connected);
signal_add__event_connected(sig_connected);
signal_add__chat_protocol_deinit(sig_chat_protocol_deinit);
signal_add__setup_changed(read_settings);
@ -519,9 +520,9 @@ void servers_reconnect_deinit(void)
{
g_source_remove(reconnect_timeout_tag);
signal_remove__server_connect_failed(sig_reconnect);
signal_remove__server_connect_failed((signal_func_server_connect_failed_t) sig_reconnect);
signal_remove__server_disconnected(sig_reconnect);
signal_remove__event_("connected", sig_connected);
signal_remove__event_connected(sig_connected);
signal_remove__chat_protocol_deinit(sig_chat_protocol_deinit);
signal_remove__setup_changed(read_settings);

View File

@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "network.h"
#include "lib-config/iconfig.h"
#include "settings.h"
@ -659,7 +660,7 @@ void servers_setup_init(void)
read_settings();
signal_add__setup_changed(read_settings);
signal_add__setup_reread(read_servers);
signal_add__setup_reread((signal_func_setup_reread_t) read_servers);
signal_add__irssi_init_read_settings(read_servers);
}
@ -673,7 +674,7 @@ void servers_setup_deinit(void)
server_setup_destroy(setupservers->data);
signal_remove__setup_changed(read_settings);
signal_remove__setup_reread(read_servers);
signal_remove__setup_reread((signal_func_setup_reread_t) read_servers);
signal_remove__irssi_init_read_settings(read_servers);
module_uniq_destroy("SERVER SETUP");

View File

@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "commands.h"
#include "args.h"
#include "network.h"

View File

@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "fe-common/core/signal-registry.h"
#include "commands.h"
#include "levels.h"
#include "misc.h"
@ -886,7 +887,7 @@ void settings_init(void)
(GSourceFunc) sig_autosave, NULL);
signal_add__irssi_init_finished(sig_init_finished);
signal_add__irssi_init_userinfo_changed(sig_init_userinfo_changed);
signal_add__gui_exit(sig_autosave);
signal_add__gui_exit((signal_func_gui_exit_t) sig_autosave);
}
static void settings_hash_free(const char *key, SETTINGS_REC *rec)
@ -899,7 +900,7 @@ void settings_deinit(void)
g_source_remove(timeout_tag);
signal_remove__irssi_init_finished(sig_init_finished);
signal_remove__irssi_init_userinfo_changed(sig_init_userinfo_changed);
signal_remove__gui_exit(sig_autosave);
signal_remove__gui_exit((signal_func_gui_exit_t) sig_autosave);
g_slist_foreach(last_invalid_modules, (GFunc) g_free, NULL);
g_slist_free(last_invalid_modules);

View File

@ -6,22 +6,23 @@
" " -> "_"
"_" -> "__"
*/
inline static void signal_register_fix_name(char *var) {
char *i, *o ;
for (i = o = var; *i; i++, o++) {
if (*i == '_') {
if (i[1] == '_') {
i++;
*o = '_';
} else {
*o = ' ';
}
inline static void signal_register_fix_name(char *var)
{
char *i, *o ;
for (i = o = var; *i; i++, o++) {
if (*i == '_') {
if (i[1] == '_') {
i++;
*o = '_';
} else {
*o = *i;
*o = ' ';
}
} else {
*o = *i;
}
*o = '\0';
}
*o = '\0';
}
#define SIGNAL_REGISTER(SIGNAL, NUM, PROTO, ...) \
inline static int signal_emit__ ## SIGNAL PROTO { \
@ -79,7 +80,7 @@ inline static void signal_register_fix_name(char *var) {
signal_remove_full__ ## SIGNAL (func, data); \
} \
#define SIGNAL_REGISTER_F(SIGNAL, NUM, PROTO, ARG, ...) \
#define SIGNAL_REGISTER_(SIGNAL, NUM, PROTO, PROTO_, ARG, ...) \
inline static int signal_emit__ ## SIGNAL ## _ PROTO { \
int ret; \
char *signal_name, base_signal_name[] = #SIGNAL; \
@ -90,7 +91,7 @@ inline static void signal_register_fix_name(char *var) {
return ret; \
} \
\
typedef void (*signal_func_ ## SIGNAL ## __t) PROTO ; \
typedef void (*signal_func_ ## SIGNAL ## __t) PROTO_ ; \
\
inline static void signal_add_full__ ## SIGNAL ## _ \
(const char *module, int priority, \

View File

@ -1,6 +1,6 @@
// core
SIGNAL_REGISTER(gui_exit, 0, (void))
SIGNAL_REGISTER(gui_dialog, 2, (char *type, const char *text),
SIGNAL_REGISTER(gui_dialog, 2, (const char *type, const char *text),
type, text)
// chat-protocols.c:
@ -49,11 +49,12 @@ SIGNAL_REGISTER(list_subcommands, 1, (const char *command),
SIGNAL_REGISTER(error_command, 2, (int_in_ptr err, const char *cmd),
err, cmd)
SIGNAL_REGISTER(send_command, 3, (char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
SIGNAL_REGISTER(send_command, 3, (const char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
args, server, wi_item)
SIGNAL_REGISTER(send_text, 3, (const char *line, SERVER_REC *server, WI_ITEM_REC *wi_item),
line, server, wi_item)
SIGNAL_REGISTER_F(command, 3, (const char *cmd, const char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
SIGNAL_REGISTER_(command, 3, (const char *cmd, const char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
(const char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
cmd, args, server, wi_item)
SIGNAL_REGISTER(default_command, 3, (const char *args, SERVER_REC *server, WI_ITEM_REC *wi_item),
args, server, wi_item)
@ -61,9 +62,9 @@ SIGNAL_REGISTER(default_command, 3, (const char *args, SERVER_REC *server, WI_IT
// chat-commands.c:
SIGNAL_REGISTER(chat_protocol_unknown, 1, (const char *protocol),
protocol)
SIGNAL_REGISTER(message_own__public, 3, (SERVER_REC *server, char *msg, char *target),
SIGNAL_REGISTER(message_own__public, 3, (SERVER_REC *server, const char *msg, const char *target),
server, msg, target)
SIGNAL_REGISTER(message_own__private, 4, (SERVER_REC *server, char *msg, char *target, char *orig_target),
SIGNAL_REGISTER(message_own__private, 4, (SERVER_REC *server, const char *msg, const char *target, const char *orig_target),
server, msg, target, orig_target)
// ignore.c:
@ -163,7 +164,7 @@ SIGNAL_REGISTER(server_disconnected, 1, (SERVER_REC *server),
server)
SIGNAL_REGISTER(server_quit, 2, (SERVER_REC *server, char *msg),
server, msg)
SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, char *target, char *msg, int_in_ptr target_type),
SIGNAL_REGISTER(server_sendmsg, 4, (SERVER_REC *server, const char *target, const char *msg, int_in_ptr target_type),
server, target, msg, target_type)
SIGNAL_REGISTER(server_destroyed, 1, (SERVER_REC *server),
server)

View File

@ -1,6 +1,6 @@
// core
"gui exit"
"gui dialog", char *type, const char *text
"gui dialog", const char *type, const char *text
// chat-protocols.c:
"chat protocol created", CHAT_PROTOCOL_REC
@ -30,15 +30,15 @@
"list subcommands", const char *command
"error command", int err, const char *cmd
"send command", char *args, SERVER_REC, WI_ITEM_REC
"send command", const char *args, SERVER_REC, WI_ITEM_REC
"send text", const char *line, SERVER_REC, WI_ITEM_REC
"command "<cmd>, const char *args, SERVER_REC, WI_ITEM_REC
"default command", const char *args, SERVER_REC, WI_ITEM_REC
// chat-commands.c:
"chat protocol unknown", const char *protocol
"message own_public", SERVER_REC, char *msg, char *target
"message own_private", SERVER_REC, char *msg, char *target, char *orig_target
"message own_public", SERVER_REC, const char *msg, const char *target
"message own_private", SERVER_REC, const char *msg, const char *target, const char *orig_target
// ignore.c:
"ignore created", IGNORE_REC
@ -98,7 +98,7 @@
"server connect failed", SERVER_REC, const char *msg
"server disconnected", SERVER_REC
"server quit", SERVER_REC, char *msg
"server sendmsg", SERVER_REC, char *target, char *msg, int target_type
"server sendmsg", SERVER_REC, const char *target, const char *msg, int target_type
"server destroyed", SERVER_REC
// servers-setup.c

View File

@ -8,13 +8,15 @@ SIGNAL_REGISTER(gui_print_text_finished, 1, (WINDOW_REC *window),
window)
// completion.c:
SIGNAL_REGISTER_F(complete_command, 5, (const char *cmd, GList **completions/*<char*>*/, WINDOW_REC *window, const char *word, char *linestart, int *want_space),
SIGNAL_REGISTER_(complete_command, 5, (const char *cmd, GList **completions/*<char*>*/, WINDOW_REC *window, const char *word, char *linestart, int *want_space),
(GList **completions/*<char*>*/, WINDOW_REC *window, const char *word, char *linestart, int *want_space),
cmd, completions, window, word, linestart, want_space)
SIGNAL_REGISTER(complete_word, 5, (GList **completions/*<char*>*/, WINDOW_REC *window, const char *word, char *linestart, int *want_space),
completions, window, word, linestart, want_space)
SIGNAL_REGISTER(complete_erase, 3, (WINDOW_REC *window, const char *word, const char *linestart),
window, word, linestart)
SIGNAL_REGISTER_F(complete_erase_command, 3, (const char *cmd, WINDOW_REC *window, const char *word, const char *linestart),
SIGNAL_REGISTER_(complete_erase_command, 3, (const char *cmd, WINDOW_REC *window, const char *word, const char *linestart),
(WINDOW_REC *window, const char *word, const char *linestart),
cmd, window, word, linestart)
SIGNAL_REGISTER(completion_removed, 1, (const char *word),
word)
@ -88,7 +90,8 @@ SIGNAL_REGISTER(key_created, 1, (KEY_REC *key),
key)
SIGNAL_REGISTER(key_destroyed, 1, (KEY_REC *key),
key)
SIGNAL_REGISTER_F(key, 3, (const char *key, const char *data, void *gui_data, KEYINFO_REC *keyinfo),
SIGNAL_REGISTER_(key, 3, (const char *key, const char *data, void *gui_data, KEYINFO_REC *keyinfo),
(const char *data, void *gui_data, KEYINFO_REC *keyinfo),
key, data, gui_data, keyinfo)
SIGNAL_REGISTER(gui_entry_redirect, 4, (SIGNAL_FUNC func, const char *entry, int_in_ptr flags, void *data),
func, entry, flags, data)

View File

@ -53,27 +53,35 @@ static void check_join_failure(IRC_SERVER_REC *server, const char *channel)
}
}
static void irc_server_event(IRC_SERVER_REC *server, const char *line)
static void irc_server_event(SERVER_REC *server, const char *line, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
char *params, *numeric, *channel;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
/* We'll be checking "4xx <your nick> <channel>" for channels
which we haven't joined yet. 4xx are error codes and should
indicate that the join failed. */
params = event_get_params(line, 3, &numeric, NULL, &channel);
if (numeric[0] == '4')
check_join_failure(server, channel);
check_join_failure(irc_server, channel);
g_free(params);
}
static void event_no_such_channel(IRC_SERVER_REC *server, const char *data)
static void event_no_such_channel(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
CHANNEL_REC *chanrec;
CHANNEL_SETUP_REC *setup;
char *params, *channel;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &channel);
chanrec = *channel == '!' && channel[1] != '\0' ?
channel_find(SERVER(server), channel) : NULL;
@ -84,23 +92,27 @@ static void event_no_such_channel(IRC_SERVER_REC *server, const char *data)
chanrec->server->connrec->chatnet);
if (setup != NULL && setup->autojoin) {
/* it's autojoin channel though, so create it */
irc_send_cmdv(server, "JOIN !%s", chanrec->name);
irc_send_cmdv(irc_server, "JOIN !%s", chanrec->name);
g_free(params);
return;
}
}
check_join_failure(server, channel);
check_join_failure(irc_server, channel);
g_free(params);
}
static void event_duplicate_channel(IRC_SERVER_REC *server, const char *data)
static void event_duplicate_channel(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
CHANNEL_REC *chanrec;
char *params, *channel, *p;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
/* this new addition to ircd breaks completely with older
"standards", "nick Duplicate ::!!channel ...." */
params = event_get_params(data, 3, NULL, NULL, &channel);
@ -151,44 +163,56 @@ static void channel_change_topic(IRC_SERVER_REC *server, const char *channel,
signal_emit__channel_topic_changed(chanrec);
}
static void event_topic_get(IRC_SERVER_REC *server, const char *data)
static void event_topic_get(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *topic;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 3, NULL, &channel, &topic);
channel_change_topic(server, channel, topic, NULL, 0);
channel_change_topic(irc_server, channel, topic, NULL, 0);
g_free(params);
}
static void event_topic(IRC_SERVER_REC *server, const char *data,
static void event_topic(SERVER_REC *server, const char *data,
const char *nick, const char *addr)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *topic, *mask;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, &channel, &topic);
mask = addr == NULL ? g_strdup(nick) :
g_strconcat(nick, "!", addr, NULL);
channel_change_topic(server, channel, topic, mask, time(NULL));
channel_change_topic(irc_server, channel, topic, mask, time(NULL));
g_free(mask);
g_free(params);
}
static void event_topic_info(IRC_SERVER_REC *server, const char *data)
static void event_topic_info(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *topicby, *topictime;
time_t t;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 4, NULL, &channel,
&topicby, &topictime);
t = (time_t) atol(topictime);
channel_change_topic(server, channel, NULL, topicby, t);
channel_change_topic(irc_server, channel, NULL, topicby, t);
g_free(params);
}
@ -215,20 +239,24 @@ static IRC_CHANNEL_REC *channel_find_unjoined(IRC_SERVER_REC *server,
return NULL;
}
static void event_join(IRC_SERVER_REC *server, const char *data, const char *nick, const char *address)
static void event_join(SERVER_REC *server, const char *data, const char *nick, const char *address)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *tmp, *shortchan;
IRC_CHANNEL_REC *chanrec;
g_return_if_fail(data != 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) {
/* someone else joined channel, no need to do anything */
return;
}
if (server->userhost == NULL)
server->userhost = g_strdup(address);
if (irc_server->userhost == NULL)
irc_server->userhost = g_strdup(address);
params = event_get_params(data, 1, &channel);
tmp = strchr(channel, 7); /* ^G does something weird.. */
@ -241,7 +269,7 @@ static void event_join(IRC_SERVER_REC *server, const char *data, const char *nic
it's name, it's not known when /join is called so rename
!channel here to !ABCDEchannel */
shortchan = g_strdup_printf("!%s", channel+6);
chanrec = channel_find_unjoined(server, shortchan);
chanrec = channel_find_unjoined(irc_server, shortchan);
if (chanrec != NULL) {
channel_change_name(CHANNEL(chanrec), channel);
g_free(chanrec->name);
@ -249,16 +277,16 @@ static void event_join(IRC_SERVER_REC *server, const char *data, const char *nic
} else {
/* well, did we join it with full name? if so, and if
this was the first short one, change it's name. */
chanrec = channel_find_unjoined(server, channel);
chanrec = channel_find_unjoined(irc_server, channel);
if (chanrec != NULL &&
irc_channel_find(server, shortchan) == NULL) {
irc_channel_find(irc_server, shortchan) == NULL) {
channel_change_visible_name(CHANNEL(chanrec),
shortchan);
}
}
}
chanrec = irc_channel_find(server, channel);
chanrec = irc_channel_find(irc_server, channel);
if (chanrec != NULL && chanrec->joined) {
/* already joined this channel - probably a broken proxy that
forgot to send PART between */
@ -269,12 +297,12 @@ static void event_join(IRC_SERVER_REC *server, const char *data, const char *nic
if (chanrec == NULL) {
/* look again, because of the channel name cut issues. */
chanrec = channel_find_unjoined(server, channel);
chanrec = channel_find_unjoined(irc_server, channel);
}
if (chanrec == NULL) {
/* didn't get here with /join command.. */
chanrec = irc_channel_create(server, channel, shortchan, TRUE);
chanrec = irc_channel_create(irc_server, channel, shortchan, TRUE);
}
chanrec->joined = TRUE;
@ -287,14 +315,18 @@ static void event_join(IRC_SERVER_REC *server, const char *data, const char *nic
g_free(params);
}
static void event_part(IRC_SERVER_REC *server, const char *data, const char *nick)
static void event_part(SERVER_REC *server, const char *data, const char *nick, const char *u0)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *reason;
CHANNEL_REC *chanrec;
g_return_if_fail(data != 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) {
/* someone else part, no need to do anything here */
return;
}
@ -310,16 +342,20 @@ static void event_part(IRC_SERVER_REC *server, const char *data, const char *nic
g_free(params);
}
static void event_kick(IRC_SERVER_REC *server, const char *data)
static void event_kick(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
CHANNEL_REC *chanrec;
char *params, *channel, *nick, *reason;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 3, &channel, &nick, &reason);
if (g_ascii_strcasecmp(nick, server->nick) != 0) {
if (g_ascii_strcasecmp(nick, irc_server->nick) != 0) {
/* someone else was kicked, no need to do anything */
g_free(params);
return;
@ -327,7 +363,7 @@ static void event_kick(IRC_SERVER_REC *server, const char *data)
chanrec = channel_find(SERVER(server), channel);
if (chanrec != NULL) {
irc_server_purge_output(server, channel);
irc_server_purge_output(irc_server, channel);
chanrec->kicked = TRUE;
channel_destroy(chanrec);
}
@ -335,32 +371,36 @@ static void event_kick(IRC_SERVER_REC *server, const char *data)
g_free(params);
}
static void event_invite(IRC_SERVER_REC *server, const char *data)
static void event_invite(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
char *params, *channel, *shortchan;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 2, NULL, &channel);
if (irc_channel_find(server, channel) == NULL) {
if (irc_channel_find(irc_server, channel) == NULL) {
/* check if we're supposed to autojoin this channel */
CHANNEL_SETUP_REC *setup;
setup = channel_setup_find(channel, server->connrec->chatnet);
setup = channel_setup_find(channel, irc_server->connrec->chatnet);
if (setup == NULL && channel[0] == '!' &&
strlen(channel) > 6) {
shortchan = g_strdup_printf("!%s", channel+6);
setup = channel_setup_find(shortchan,
server->connrec->chatnet);
irc_server->connrec->chatnet);
g_free(shortchan);
}
if (setup != NULL && setup->autojoin && settings_get_bool("join_auto_chans_on_invite"))
server->channels_join(SERVER(server), channel, TRUE);
irc_server->channels_join(SERVER(server), channel, TRUE);
}
g_free_not_null(server->last_invite);
server->last_invite = g_strdup(channel);
g_free_not_null(irc_server->last_invite);
irc_server->last_invite = g_strdup(channel);
g_free(params);
}
@ -369,11 +409,11 @@ void channel_events_init(void)
settings_add_bool("misc", "join_auto_chans_on_invite", TRUE);
signal_add_last__server_event(irc_server_event);
signal_add_first__event_403(event_no_such_channel); /* no such channel */
signal_add_first__event_407(event_duplicate_channel); /* duplicate channel */
signal_add_first__event_("403", event_no_such_channel); /* no such channel */
signal_add_first__event_("407", event_duplicate_channel); /* duplicate channel */
signal_add__event_("topic", event_topic);
signal_add_first__event_join(event_join);
signal_add_first__event_("join", event_join);
signal_add__event_("part", event_part);
signal_add__event_("kick", event_kick);
signal_add__event_("invite", event_invite);

View File

@ -113,13 +113,17 @@ static int channel_rejoin(IRC_SERVER_REC *server, const char *channel)
return 1;
}
static void event_duplicate_channel(IRC_SERVER_REC *server, const char *data)
static void event_duplicate_channel(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
CHANNEL_REC *chanrec;
char *params, *channel, *p;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 3, NULL, NULL, &channel);
p = strchr(channel, ' ');
if (p != NULL) *p = '\0';
@ -134,7 +138,7 @@ static void event_duplicate_channel(IRC_SERVER_REC *server, const char *data)
note that this same 407 is sent when trying to
create !!channel that already exists so we don't
want to try rejoining then. */
if (channel_rejoin(server, channel)) {
if (channel_rejoin(irc_server, channel)) {
signal_stop();
}
}
@ -143,23 +147,27 @@ static void event_duplicate_channel(IRC_SERVER_REC *server, const char *data)
g_free(params);
}
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;
IRC_CHANNEL_REC *chanrec;
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)) {
chanrec = irc_channel_find(server, channel);
chanrec = irc_channel_find(irc_server, channel);
if (chanrec != NULL && chanrec->joined) {
/* dalnet event - can't change nick while
banned in channel */
} else {
/* channel is unavailable - try to join again
a bit later */
if (channel_rejoin(server, channel)) {
if (channel_rejoin(irc_server, channel)) {
signal_stop();
}
}
@ -170,27 +178,29 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data)
/* join ok/failed - remove from rejoins list. this happens always after join
except if the "target unavailable" error happens again */
static void sig_remove_rejoin(IRC_CHANNEL_REC *channel)
static void sig_remove_rejoin(CHANNEL_REC *channel)
{
IRC_CHANNEL_REC *irc_channel;
REJOIN_REC *rec;
if (!IS_IRC_CHANNEL(channel))
if ((irc_channel = IRC_CHANNEL(channel)) == NULL)
return;
rec = rejoin_find(channel->server, channel->name);
rec = rejoin_find(irc_channel->server, irc_channel->name);
if (rec != NULL && rec->joining) {
/* join failed, remove the rejoin */
rejoin_destroy(channel->server, rec);
rejoin_destroy(irc_channel->server, rec);
}
}
static void sig_disconnected(IRC_SERVER_REC *server)
static void sig_disconnected(SERVER_REC *server)
{
if (!IS_IRC_SERVER(server))
IRC_SERVER_REC *irc_server;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
while (server->rejoin_channels != NULL)
rejoin_destroy(server, server->rejoin_channels->data);
while (irc_server->rejoin_channels != NULL)
rejoin_destroy(irc_server, irc_server->rejoin_channels->data);
}
static void server_rejoin_channels(IRC_SERVER_REC *server)
@ -268,8 +278,8 @@ void channel_rejoin_init(void)
(GSourceFunc) sig_rejoin, NULL);
command_bind_irc("rmrejoins", NULL, (SIGNAL_FUNC) cmd_rmrejoins);
signal_add_first__event_407(event_duplicate_channel);
signal_add_first__event_437(event_target_unavailable);
signal_add_first__event_("407", event_duplicate_channel);
signal_add_first__event_("437", event_target_unavailable);
signal_add_first__channel_joined(sig_remove_rejoin);
signal_add_first__channel_destroyed(sig_remove_rejoin);
signal_add__server_disconnected(sig_disconnected);

View File

@ -41,6 +41,7 @@ loop:
#include "module.h"
#include "misc.h"
#include "signals.h"
#include "core/signal-registry.h"
#include "signal-registry.h"
#include "settings.h"
@ -68,28 +69,31 @@ typedef struct {
GSList *queries[CHANNEL_QUERIES]; /* All queries that need to be asked from server */
} SERVER_QUERY_REC;
static void sig_connected(IRC_SERVER_REC *server)
static void sig_connected(SERVER_REC *server)
{
IRC_SERVER_REC *irc_server;
SERVER_QUERY_REC *rec;
g_return_if_fail(server != NULL);
if (!IS_IRC_SERVER(server))
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
rec = g_new0(SERVER_QUERY_REC, 1);
server->chanqueries = rec;
irc_server->chanqueries = rec;
}
static void sig_disconnected(IRC_SERVER_REC *server)
static void sig_disconnected(SERVER_REC *server)
{
IRC_SERVER_REC *irc_server;
SERVER_QUERY_REC *rec;
int n;
g_return_if_fail(server != NULL);
if (!IS_IRC_SERVER(server))
irc_server = IRC_SERVER(server);
if (irc_server == NULL)
return;
rec = server->chanqueries;
rec = irc_server->chanqueries;
g_return_if_fail(rec != NULL);
for (n = 0; n < CHANNEL_QUERIES; n++)
@ -97,7 +101,7 @@ static void sig_disconnected(IRC_SERVER_REC *server)
g_slist_free(rec->current_queries);
g_free(rec);
server->chanqueries = NULL;
irc_server->chanqueries = NULL;
}
/* Add channel to query list */
@ -131,12 +135,13 @@ static void query_remove_all(IRC_CHANNEL_REC *channel)
query_check(channel->server);
}
static void sig_channel_destroyed(IRC_CHANNEL_REC *channel)
static void sig_channel_destroyed(CHANNEL_REC *channel)
{
IRC_CHANNEL_REC *irc_channel;
g_return_if_fail(channel != NULL);
if (IS_IRC_CHANNEL(channel))
query_remove_all(channel);
irc_channel = IRC_CHANNEL(channel);
if (irc_channel != NULL)
query_remove_all(irc_channel);
}
static int channels_have_all_names(IRC_SERVER_REC *server)
@ -314,13 +319,17 @@ static void channel_checksync(IRC_CHANNEL_REC *channel)
}
/* Error occurred when trying to execute query - abort and try again. */
static void query_current_error(IRC_SERVER_REC *server)
static void query_current_error(SERVER_REC *server, const char *u0, const char *u1, const char *u2)
{
IRC_SERVER_REC *irc_server;
SERVER_QUERY_REC *rec;
GSList *tmp;
int query, abort_query;
rec = server->chanqueries;
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
rec = irc_server->chanqueries;
/* fix the thing that went wrong - or if it was already fixed,
then all we can do is abort. */
@ -328,15 +337,15 @@ static void query_current_error(IRC_SERVER_REC *server)
query = rec->current_query_type;
if (query == CHANNEL_QUERY_WHO) {
if (server->no_multi_who)
if (irc_server->no_multi_who)
abort_query = TRUE;
else
server->no_multi_who = TRUE;
irc_server->no_multi_who = TRUE;
} else {
if (server->no_multi_mode)
if (irc_server->no_multi_mode)
abort_query = TRUE;
else
server->no_multi_mode = TRUE;
irc_server->no_multi_mode = TRUE;
}
if (!abort_query) {
@ -354,27 +363,29 @@ static void query_current_error(IRC_SERVER_REC *server)
g_slist_free(rec->current_queries);
rec->current_queries = NULL;
query_check(server);
query_check(irc_server);
}
static void sig_channel_joined(IRC_CHANNEL_REC *channel)
static void sig_channel_joined(CHANNEL_REC *channel)
{
if (!IS_IRC_CHANNEL(channel))
IRC_CHANNEL_REC *irc_channel;
if ((irc_channel = IRC_CHANNEL(channel)) == NULL)
return;
if (!settings_get_bool("channel_sync"))
return;
/* Add channel to query lists */
if (!channel->no_modes)
query_add_channel(channel, CHANNEL_QUERY_MODE);
if (g_hash_table_size(channel->nicks) <
if (!irc_channel->no_modes)
query_add_channel(irc_channel, CHANNEL_QUERY_MODE);
if (g_hash_table_size(irc_channel->nicks) <
settings_get_int("channel_max_who_sync"))
query_add_channel(channel, CHANNEL_QUERY_WHO);
if (!channel->no_modes)
query_add_channel(channel, CHANNEL_QUERY_BMODE);
query_add_channel(irc_channel, CHANNEL_QUERY_WHO);
if (!irc_channel->no_modes)
query_add_channel(irc_channel, CHANNEL_QUERY_BMODE);
query_check(channel->server);
query_check(irc_channel->server);
}
static void channel_got_query(IRC_CHANNEL_REC *chanrec, int query_type)
@ -396,17 +407,21 @@ static void channel_got_query(IRC_CHANNEL_REC *chanrec, int query_type)
query_check(chanrec->server);
}
static void event_channel_mode(IRC_SERVER_REC *server, const char *data,
const char *nick)
static void event_channel_mode(SERVER_REC *server, const char *data,
const char *nick, const char *u0)
{
IRC_SERVER_REC *irc_server;
IRC_CHANNEL_REC *chanrec;
char *params, *channel, *mode;
g_return_if_fail(data != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
NULL, &channel, &mode);
chanrec = irc_channel_find(server, channel);
chanrec = irc_channel_find(irc_server, channel);
if (chanrec != NULL) {
if (chanrec->key != NULL && strchr(mode, 'k') == NULL) {
/* we joined the channel with a key,
@ -420,8 +435,9 @@ static void event_channel_mode(IRC_SERVER_REC *server, const char *data,
g_free(params);
}
static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
static void event_end_of_who(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
SERVER_QUERY_REC *rec;
GSList *tmp, *next;
char *params, *channel, **channels;
@ -429,12 +445,15 @@ static void event_end_of_who(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, 2, NULL, &channel);
multiple = strchr(channel, ',') != NULL;
channels = g_strsplit(channel, ",", -1);
failed = FALSE;
rec = server->chanqueries;
rec = irc_server->chanqueries;
for (tmp = rec->current_queries; tmp != NULL; tmp = next) {
IRC_CHANNEL_REC *chanrec = tmp->data;
@ -443,7 +462,7 @@ static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
continue;
if (chanrec->ownnick->host == NULL && multiple &&
!server->one_endofwho) {
!irc_server->one_endofwho) {
/* we should receive our own host for each channel.
However, some servers really are stupid enough
not to reply anything to /WHO requests.. */
@ -457,26 +476,30 @@ static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
g_strfreev(channels);
if (multiple)
server->one_endofwho = TRUE;
irc_server->one_endofwho = TRUE;
if (failed) {
/* server didn't understand multiple WHO replies,
send them again separately */
query_current_error(server);
query_current_error((SERVER_REC *) irc_server, NULL, NULL, NULL);
}
g_free(params);
}
static void event_end_of_banlist(IRC_SERVER_REC *server, const char *data)
static void event_end_of_banlist(SERVER_REC *server, const char *data, const char *u0, const char *u1)
{
IRC_SERVER_REC *irc_server;
IRC_CHANNEL_REC *chanrec;
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);
chanrec = irc_channel_find(server, channel);
chanrec = irc_channel_find(irc_server, channel);
if (chanrec != NULL)
channel_got_query(chanrec, CHANNEL_QUERY_BMODE);

View File

@ -118,7 +118,7 @@ void ctcp_send_reply(IRC_SERVER_REC *server, const char *data)
/* CTCP ping */
static void ctcp_ping(IRC_SERVER_REC *server, const char *data,
const char *nick)
const char *nick, const char *u0, const char *u1)
{
char *str;
@ -166,7 +166,7 @@ static void ctcp_send_parsed_reply(IRC_SERVER_REC *server, const char *nick,
/* CTCP version */
static void ctcp_version(IRC_SERVER_REC *server, const char *data,
const char *nick)
const char *nick, const char *u0, const char *u1)
{
ctcp_send_parsed_reply(server, nick, "VERSION",
settings_get_str("ctcp_version_reply"));
@ -174,7 +174,7 @@ static void ctcp_version(IRC_SERVER_REC *server, const char *data,
/* CTCP time */
static void ctcp_time(IRC_SERVER_REC *server, const char *data,
const char *nick)
const char *nick, const char *u0, const char *u1)
{
char *str, *reply;
@ -190,7 +190,7 @@ static void ctcp_time(IRC_SERVER_REC *server, const char *data,
/* CTCP userinfo */
static void ctcp_userinfo(IRC_SERVER_REC *server, const char *data,
const char *nick)
const char *nick, const char *u0, const char *u1)
{
ctcp_send_parsed_reply(server, nick, "USERINFO",
settings_get_str("ctcp_userinfo_reply"));
@ -198,7 +198,7 @@ static void ctcp_userinfo(IRC_SERVER_REC *server, const char *data,
/* CTCP clientinfo */
static void ctcp_clientinfo(IRC_SERVER_REC *server, const char *data,
const char *nick)
const char *nick, const char *u0, const char *u1)
{
GString *str;
GSList *tmp;
@ -265,7 +265,7 @@ static void ctcp_reply(IRC_SERVER_REC *server, const char *data,
g_free(str);
}
static void event_privmsg(IRC_SERVER_REC *server, const char *data,
static void event_privmsg(SERVER_REC *server, const char *data,
const char *nick, const char *addr)
{
char *params, *target, *msg;
@ -273,6 +273,9 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
g_return_if_fail(data != NULL);
if (!IS_IRC_SERVER(server))
return;
params = event_get_params(data, 2, &target, &msg);
/* handle only ctcp messages.. */
@ -283,20 +286,23 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
if (msg[len-1] == '\001')
msg[len-1] = '\0';
signal_emit__ctcp_msg(server, msg, nick, addr, target);
signal_emit__ctcp_msg((IRC_SERVER_REC *) server, msg, nick, addr, target);
signal_stop();
}
g_free(params);
}
static void event_notice(IRC_SERVER_REC *server, const char *data,
static void event_notice(SERVER_REC *server, const char *data,
const char *nick, const char *addr)
{
char *params, *target, *ptr, *msg;
g_return_if_fail(data != NULL);
if (!IS_IRC_SERVER(server))
return;
params = event_get_params(data, 2, &target, &msg);
/* handle only ctcp replies */
@ -304,22 +310,24 @@ static void event_notice(IRC_SERVER_REC *server, const char *data,
ptr = strrchr(++msg, 1);
if (ptr != NULL) *ptr = '\0';
signal_emit__ctcp_reply(server, msg, nick, addr, target);
signal_emit__ctcp_reply((IRC_SERVER_REC *) server, msg, nick, addr, target);
signal_stop();
}
g_free(params);
}
static void sig_disconnected(IRC_SERVER_REC *server)
static void sig_disconnected(SERVER_REC *server)
{
IRC_SERVER_REC *irc_server;
g_return_if_fail(server != NULL);
if (!IS_IRC_SERVER(server))
irc_server = IRC_SERVER(server);
if (irc_server == NULL)
return;
g_slist_free(server->ctcpqueue);
server->ctcpqueue = NULL;
g_slist_free(irc_server->ctcpqueue);
irc_server->ctcpqueue = NULL;
}
void ctcp_init(void)
@ -332,15 +340,15 @@ void ctcp_init(void)
settings_add_int("flood", "max_ctcp_queue", 5);
signal_add__server_disconnected(sig_disconnected);
signal_add_first__event_privmsg(event_privmsg);
signal_add_first__event_notice(event_notice);
signal_add_first__event_("privmsg", event_privmsg);
signal_add_first__event_("notice", event_notice);
signal_add__ctcp_msg(ctcp_msg);
signal_add__ctcp_reply(ctcp_reply);
signal_add__ctcp_msg_ping(ctcp_ping);
signal_add__ctcp_msg_version(ctcp_version);
signal_add__ctcp_msg_time(ctcp_time);
signal_add__ctcp_msg_userinfo(ctcp_userinfo);
signal_add__ctcp_msg_clientinfo(ctcp_clientinfo);
signal_add__ctcp_msg_("ping", ctcp_ping);
signal_add__ctcp_msg_("version", ctcp_version);
signal_add__ctcp_msg_("time", ctcp_time);
signal_add__ctcp_msg_("userinfo", ctcp_userinfo);
signal_add__ctcp_msg_("clientinfo", ctcp_clientinfo);
ctcp_register("ping");
ctcp_register("version");
@ -359,9 +367,9 @@ void ctcp_deinit(void)
signal_remove__event_("notice", event_notice);
signal_remove__ctcp_msg(ctcp_msg);
signal_remove__ctcp_reply(ctcp_reply);
signal_remove__ctcp_msg_ping(ctcp_ping);
signal_remove__ctcp_msg_version(ctcp_version);
signal_remove__ctcp_msg_time(ctcp_time);
signal_remove__ctcp_msg_userinfo(ctcp_userinfo);
signal_remove__ctcp_msg_clientinfo(ctcp_clientinfo);
signal_remove__ctcp_msg_("ping", ctcp_ping);
signal_remove__ctcp_msg_("version", ctcp_version);
signal_remove__ctcp_msg_("time", ctcp_time);
signal_remove__ctcp_msg_("userinfo", ctcp_userinfo);
signal_remove__ctcp_msg_("clientinfo", ctcp_clientinfo);
}

View File

@ -20,6 +20,7 @@
#include "module.h"
#include "signals.h"
#include "signal-registry.h"
#include "channels.h"
void irc_channels_setup_init(void)

View File

@ -224,18 +224,20 @@ static char *irc_get_join_data(CHANNEL_REC *channel)
g_strconcat(irc_channel->name, " ", irc_channel->key, NULL);
}
static void sig_channel_created(IRC_CHANNEL_REC *channel)
static void sig_channel_created(CHANNEL_REC *channel, void *u0)
{
if (IS_IRC_CHANNEL(channel))
channel->get_join_data = irc_get_join_data;
IRC_CHANNEL_REC *irc_channel;
if ((irc_channel = IRC_CHANNEL(channel)) != NULL)
irc_channel->get_join_data = irc_get_join_data;
}
static void sig_channel_destroyed(IRC_CHANNEL_REC *channel)
static void sig_channel_destroyed(CHANNEL_REC *channel)
{
if (!IS_IRC_CHANNEL(channel))
IRC_CHANNEL_REC *irc_channel;
if ((irc_channel = IRC_CHANNEL(channel)) == NULL)
return;
if (!channel->server->disconnected && !channel->left && !channel->kicked) {
if (!irc_channel->server->disconnected && !irc_channel->left && !irc_channel->kicked) {
/* destroying channel record without actually
having left the channel yet */
signal_emit__command_("part", "", (SERVER_REC *)channel->server, (WI_ITEM_REC *)channel);

View File

@ -20,6 +20,7 @@
#include "module.h"
#include "signals.h"
#include "core/signal-registry.h"
#include "lib-config/iconfig.h"
#include "settings.h"
@ -33,77 +34,81 @@ void ircnet_create(IRC_CHATNET_REC *rec)
chatnet_create((CHATNET_REC *) rec);
}
static void sig_chatnet_read(IRC_CHATNET_REC *rec, CONFIG_NODE *node)
static void sig_chatnet_read(CHATNET_REC *rec, CONFIG_NODE *node)
{
IRC_CHATNET_REC *irc_rec;
char *value;
if (!IS_IRC_CHATNET(rec))
if ((irc_rec = IRC_CHATNET(rec)) == NULL)
return;
value = config_node_get_str(node, "usermode", NULL);
rec->usermode = (value != NULL && *value != '\0') ? g_strdup(value) : NULL;
irc_rec->usermode = (value != NULL && *value != '\0') ? g_strdup(value) : NULL;
value = config_node_get_str(node, "alternate_nick", NULL);
rec->alternate_nick = (value != NULL && *value != '\0') ? g_strdup(value) : NULL;
irc_rec->alternate_nick = (value != NULL && *value != '\0') ? g_strdup(value) : NULL;
rec->max_cmds_at_once = config_node_get_int(node, "cmdmax", 0);
rec->cmd_queue_speed = config_node_get_int(node, "cmdspeed", 0);
rec->max_query_chans = config_node_get_int(node, "max_query_chans", 0);
irc_rec->max_cmds_at_once = config_node_get_int(node, "cmdmax", 0);
irc_rec->cmd_queue_speed = config_node_get_int(node, "cmdspeed", 0);
irc_rec->max_query_chans = config_node_get_int(node, "max_query_chans", 0);
rec->max_kicks = config_node_get_int(node, "max_kicks", 0);
rec->max_msgs = config_node_get_int(node, "max_msgs", 0);
rec->max_modes = config_node_get_int(node, "max_modes", 0);
rec->max_whois = config_node_get_int(node, "max_whois", 0);
irc_rec->max_kicks = config_node_get_int(node, "max_kicks", 0);
irc_rec->max_msgs = config_node_get_int(node, "max_msgs", 0);
irc_rec->max_modes = config_node_get_int(node, "max_modes", 0);
irc_rec->max_whois = config_node_get_int(node, "max_whois", 0);
rec->sasl_mechanism = g_strdup(config_node_get_str(node, "sasl_mechanism", NULL));
rec->sasl_username = g_strdup(config_node_get_str(node, "sasl_username", NULL));
rec->sasl_password = g_strdup(config_node_get_str(node, "sasl_password", NULL));
irc_rec->sasl_mechanism = g_strdup(config_node_get_str(node, "sasl_mechanism", NULL));
irc_rec->sasl_username = g_strdup(config_node_get_str(node, "sasl_username", NULL));
irc_rec->sasl_password = g_strdup(config_node_get_str(node, "sasl_password", NULL));
}
static void sig_chatnet_saved(IRC_CHATNET_REC *rec, CONFIG_NODE *node)
static void sig_chatnet_saved(CHATNET_REC *rec, CONFIG_NODE *node)
{
if (!IS_IRC_CHATNET(rec))
IRC_CHATNET_REC *irc_rec;
if ((irc_rec = IRC_CHATNET(rec)) == NULL)
return;
if (rec->usermode != NULL)
iconfig_node_set_str(node, "usermode", rec->usermode);
if (irc_rec->usermode != NULL)
iconfig_node_set_str(node, "usermode", irc_rec->usermode);
if (rec->alternate_nick != NULL)
iconfig_node_set_str(node, "alternate_nick", rec->alternate_nick);
if (irc_rec->alternate_nick != NULL)
iconfig_node_set_str(node, "alternate_nick", irc_rec->alternate_nick);
if (rec->max_cmds_at_once > 0)
iconfig_node_set_int(node, "cmdmax", rec->max_cmds_at_once);
if (rec->cmd_queue_speed > 0)
iconfig_node_set_int(node, "cmdspeed", rec->cmd_queue_speed);
if (rec->max_query_chans > 0)
iconfig_node_set_int(node, "max_query_chans", rec->max_query_chans);
if (irc_rec->max_cmds_at_once > 0)
iconfig_node_set_int(node, "cmdmax", irc_rec->max_cmds_at_once);
if (irc_rec->cmd_queue_speed > 0)
iconfig_node_set_int(node, "cmdspeed", irc_rec->cmd_queue_speed);
if (irc_rec->max_query_chans > 0)
iconfig_node_set_int(node, "max_query_chans", irc_rec->max_query_chans);
if (rec->max_kicks > 0)
iconfig_node_set_int(node, "max_kicks", rec->max_kicks);
if (rec->max_msgs > 0)
iconfig_node_set_int(node, "max_msgs", rec->max_msgs);
if (rec->max_modes > 0)
iconfig_node_set_int(node, "max_modes", rec->max_modes);
if (rec->max_whois > 0)
iconfig_node_set_int(node, "max_whois", rec->max_whois);
if (irc_rec->max_kicks > 0)
iconfig_node_set_int(node, "max_kicks", irc_rec->max_kicks);
if (irc_rec->max_msgs > 0)
iconfig_node_set_int(node, "max_msgs", irc_rec->max_msgs);
if (irc_rec->max_modes > 0)
iconfig_node_set_int(node, "max_modes", irc_rec->max_modes);
if (irc_rec->max_whois > 0)
iconfig_node_set_int(node, "max_whois", irc_rec->max_whois);
if (rec->sasl_mechanism != NULL)
iconfig_node_set_str(node, "sasl_mechanism", rec->sasl_mechanism);
if (rec->sasl_username != NULL)
iconfig_node_set_str(node, "sasl_username", rec->sasl_username);
if (rec->sasl_password != NULL)
iconfig_node_set_str(node, "sasl_password", rec->sasl_password);
if (irc_rec->sasl_mechanism != NULL)
iconfig_node_set_str(node, "sasl_mechanism", irc_rec->sasl_mechanism);
if (irc_rec->sasl_username != NULL)
iconfig_node_set_str(node, "sasl_username", irc_rec->sasl_username);
if (irc_rec->sasl_password != NULL)
iconfig_node_set_str(node, "sasl_password", irc_rec->sasl_password);
}
static void sig_chatnet_destroyed(IRC_CHATNET_REC *rec)
static void sig_chatnet_destroyed(CHATNET_REC *rec)
{
if (IS_IRC_CHATNET(rec)) {
g_free(rec->usermode);
g_free(rec->alternate_nick);
g_free(rec->sasl_mechanism);
g_free(rec->sasl_username);
g_free(rec->sasl_password);
}
IRC_CHATNET_REC *irc_rec;
if ((irc_rec = IRC_CHATNET(rec)) == NULL)
return;
g_free(irc_rec->usermode);
g_free(irc_rec->alternate_nick);
g_free(irc_rec->sasl_mechanism);
g_free(irc_rec->sasl_username);
g_free(irc_rec->sasl_password);
}
void irc_chatnets_init(void)

View File

@ -861,17 +861,18 @@ static void cmd_server_purge(const char *data, IRC_SERVER_REC *server)
}
/* destroy all knockouts in server */
static void sig_server_disconnected(IRC_SERVER_REC *server)
static void sig_server_disconnected(SERVER_REC *server)
{
IRC_SERVER_REC *irc_server;
g_return_if_fail(server != NULL);
if (!IS_IRC_SERVER(server))
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
g_free(server->last_nick);
g_free(irc_server->last_nick);
while (server->knockoutlist != NULL)
knockout_destroy(server, server->knockoutlist->data);
while (irc_server->knockoutlist != NULL)
knockout_destroy(irc_server, irc_server->knockoutlist->data);
}
/* destroy all knockouts in channel */

View File

@ -24,6 +24,7 @@
#include "net-sendbuffer.h"
#include "rawlog.h"
#include "misc.h"
#include "core/signal-registry.h"
#include "signal-registry.h"
#include "irc-servers.h"
@ -312,15 +313,19 @@ static void strip_params_colon(char *const params)
}
}
static void irc_server_event(IRC_SERVER_REC *server, const char *line,
static void irc_server_event(SERVER_REC *server, const char *line,
const char *nick, const char *address)
{
IRC_SERVER_REC *irc_server;
int emitted;
const char *signal;
char *event, *args;
g_return_if_fail(line != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
/* split event / args */
event = g_strconcat("event ", line, NULL);
args = strchr(event+6, ' ');
@ -329,17 +334,17 @@ static void irc_server_event(IRC_SERVER_REC *server, const char *line,
ascii_strdown(event);
/* check if event needs to be redirected */
signal = server_redirect_get_signal(server, nick, event, args);
signal = server_redirect_get_signal(irc_server, nick, event, args);
if (signal != NULL)
rawlog_redirect(server->rawlog, signal);
rawlog_redirect(irc_server->rawlog, signal);
/* emit it */
current_server_event = event+6;
emitted = signal == NULL ?
signal_emit__event_(line, (SERVER_REC *)server, args, nick, address) :
signal_emit_raw(signal, 4, server, args, nick, address);
signal_emit__event_(line, server, args, nick, address) :
signal_emit_raw(signal, 4, irc_server, args, nick, address);
if (!emitted)
signal_emit__default_event((SERVER_REC *)server, line, nick, address);
signal_emit__default_event(server, line, nick, address);
current_server_event = NULL;
g_free(event);
@ -383,16 +388,20 @@ static char *irc_parse_prefix(char *line, char **nick, char **address)
}
/* Parse command line sent by server */
static void irc_parse_incoming_line(IRC_SERVER_REC *server, char *line)
static void irc_parse_incoming_line(SERVER_REC *server, char *line)
{
IRC_SERVER_REC *irc_server;
char *nick, *address;
g_return_if_fail(server != NULL);
g_return_if_fail(line != NULL);
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
line = irc_parse_prefix(line, &nick, &address);
if (*line != '\0')
signal_emit__server_event((SERVER_REC *)server, line, nick, address);
signal_emit__server_event(server, line, nick, address);
}
/* input function: handle incoming server messages */
@ -428,17 +437,18 @@ static void irc_parse_incoming(SERVER_REC *server)
server_unref(server);
}
static void irc_init_server(IRC_SERVER_REC *server)
static void irc_init_server(SERVER_REC *server)
{
IRC_SERVER_REC *irc_server;
g_return_if_fail(server != NULL);
if (!IS_IRC_SERVER(server))
if ((irc_server = IRC_SERVER(server)) == NULL)
return;
server->readtag =
g_input_add(net_sendbuffer_handle(server->handle),
irc_server->readtag =
g_input_add(net_sendbuffer_handle(irc_server->handle),
G_INPUT_READ,
(GInputFunction) irc_parse_incoming, server);
(GInputFunction) irc_parse_incoming, irc_server);
}
void irc_irc_init(void)

View File

@ -20,17 +20,33 @@ SIGNAL_REGISTER(channel_rejoin_remove, 2, (SERVER_REC *server, REJOIN_REC *rejoi
SIGNAL_REGISTER(channel_rejoin_new, 2, (SERVER_REC *server, REJOIN_REC *rejoin),
server, rejoin)
// channels-query.c:
SIGNAL_REGISTER(chanquery_mode, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(chanquery_who_end, 4, (SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
server, args, sender_nick, sender_address)
SIGNAL_REGISTER(chanquery_abort, 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_who, 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),
server, args, sender_nick, sender_address)
// ctcp.c:
SIGNAL_REGISTER(ctcp_msg, 5, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
irc_server, args, nick, addr, target)
SIGNAL_REGISTER_F(ctcp_msg, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
SIGNAL_REGISTER_(ctcp_msg, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
(IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
cmd, irc_server, args, nick, addr, target)
SIGNAL_REGISTER(default_ctcp_msg, 5, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
irc_server, args, nick, addr, target)
SIGNAL_REGISTER(ctcp_reply, 5, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
irc_server, args, nick, addr, target)
SIGNAL_REGISTER_F(ctcp_reply, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
SIGNAL_REGISTER_(ctcp_reply, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
(IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
cmd, irc_server, args, nick, addr, target)
SIGNAL_REGISTER(default_ctcp_reply, 5, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
irc_server, args, nick, addr, target)
@ -42,13 +58,17 @@ SIGNAL_REGISTER(event_connected, 1, (SERVER_REC *server),
server)
// irc-cap.c
SIGNAL_REGISTER_F(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),
cmd, irc_server)
SIGNAL_REGISTER_F(server_cap_nak, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
SIGNAL_REGISTER_(server_cap_nak, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
(IRC_SERVER_REC *irc_server),
cmd, irc_server)
SIGNAL_REGISTER_F(server_cap_new, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
SIGNAL_REGISTER_(server_cap_new, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
(IRC_SERVER_REC *irc_server),
cmd, irc_server)
SIGNAL_REGISTER_F(server_cap_delete, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
SIGNAL_REGISTER_(server_cap_delete, 1, (const char *cmd, IRC_SERVER_REC *irc_server),
(IRC_SERVER_REC *irc_server),
cmd, irc_server)
SIGNAL_REGISTER(server_cap_end, 1, (IRC_SERVER_REC *irc_server),
irc_server)
@ -63,9 +83,10 @@ SIGNAL_REGISTER(server_sasl_success, 1, (SERVER_REC *server),
// irc.c:
SIGNAL_REGISTER(server_event, 4, (SERVER_REC *server, char *data, char *sender_nick, char *sender_address),
SIGNAL_REGISTER(server_event, 4, (SERVER_REC *server, const char *data, const char *sender_nick, const char *sender_address),
server, data, sender_nick, sender_address)
SIGNAL_REGISTER_F(event, 4, (const char *cmd, SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
SIGNAL_REGISTER_(event, 4, (const char *cmd, SERVER_REC *server, const char *args, const char *sender_nick, const char *sender_address),
(SERVER_REC *server, const char *args, const char *sender_nick, const char *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),
server, data, sender_nick, sender_address)
@ -76,7 +97,8 @@ SIGNAL_REGISTER(server_incoming, 2, (SERVER_REC *server, char *data),
server, data)
// (for perl parser..))
SIGNAL_REGISTER_F(redir, 4, (const char *cmd, SERVER_REC *server, char *args, char *sender_nick, char *sender_address),
SIGNAL_REGISTER_(redir, 4, (const char *cmd, SERVER_REC *server, char *args, char *sender_nick, char *sender_address),
(SERVER_REC *server, char *args, char *sender_nick, char *sender_address),
cmd, server, args, sender_nick, sender_address)
// lag.c:
@ -117,14 +139,16 @@ SIGNAL_REGISTER(netsplit_remove, 1, (NETSPLIT_REC *netsplit),
// dcc*.c:
SIGNAL_REGISTER_F(dcc_ctcp, 2, (const char *cmd, CHAT_DCC_REC *chat_dcc, char *args),
SIGNAL_REGISTER_(dcc_ctcp, 2, (const char *cmd, CHAT_DCC_REC *chat_dcc, char *args),
(CHAT_DCC_REC *chat_dcc, char *args),
cmd, chat_dcc, args)
SIGNAL_REGISTER(default_dcc_ctcp, 3, (CHAT_DCC_REC *chat_dcc, char *cmd, char *args),
chat_dcc, cmd, args)
SIGNAL_REGISTER(dcc_unknown_ctcp, 3, (char *args, char *sender, char *sendaddr),
args, sender, sendaddr)
SIGNAL_REGISTER_F(dcc_reply, 2, (const char *cmd, CHAT_DCC_REC *chat_dcc, char *args),
SIGNAL_REGISTER_(dcc_reply, 2, (const char *cmd, CHAT_DCC_REC *chat_dcc, char *args),
(CHAT_DCC_REC *chat_dcc, char *args),
cmd, chat_dcc, args)
SIGNAL_REGISTER(default_dcc_reply, 3, (CHAT_DCC_REC *chat_dcc, char *cmd, char *args),
chat_dcc, cmd, args)
@ -184,11 +208,13 @@ SIGNAL_REGISTER(default_ctcp_reply_dcc, 5, (IRC_SERVER_REC *irc_server, const ch
irc_server, args, nick, addr, target)
SIGNAL_REGISTER(ctcp_msg_dcc, 6, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target, DCC_REC *dcc),
irc_server, args, nick, addr, target, dcc)
SIGNAL_REGISTER_F(ctcp_msg_dcc, 6, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target, DCC_REC *dcc),
SIGNAL_REGISTER_(ctcp_msg_dcc, 6, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target, DCC_REC *dcc),
(IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target, DCC_REC *dcc),
cmd, irc_server, args, nick, addr, target, dcc)
SIGNAL_REGISTER(ctcp_reply_dcc, 6, (IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target, DCC_REC *dcc),
irc_server, args, nick, addr, target, dcc)
SIGNAL_REGISTER_F(ctcp_reply_dcc, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
SIGNAL_REGISTER_(ctcp_reply_dcc, 5, (const char *cmd, IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
(IRC_SERVER_REC *irc_server, const char *args, const char *nick, const char *addr, const char *target),
cmd, irc_server, args, nick, addr, target)
// autoignore.c:

View File

@ -13,6 +13,14 @@
"channel rejoin remove", SERVER_REC, REJOIN_REC
"channel rejoin new", SERVER_REC, REJOIN_REC
// channels-query.c:
"chanquery mode", 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
"silent event who", 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
// ctcp.c:
"ctcp msg", IRC_SERVER_REC, const char *args, const char *nick, const char *addr, const char *target
@ -40,7 +48,7 @@
// irc.c:
"server event", SERVER_REC, char *data, char *sender_nick, 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
"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