diff options
Diffstat (limited to 'src/irc/core')
-rw-r--r-- | src/irc/core/channel-rejoin.c | 2 | ||||
-rw-r--r-- | src/irc/core/ignore.c | 4 | ||||
-rw-r--r-- | src/irc/core/irc-channels-setup.c | 87 | ||||
-rw-r--r-- | src/irc/core/irc-channels.c | 4 | ||||
-rw-r--r-- | src/irc/core/irc-channels.h | 4 | ||||
-rw-r--r-- | src/irc/core/irc-commands.c | 68 | ||||
-rw-r--r-- | src/irc/core/irc-core.c | 9 | ||||
-rw-r--r-- | src/irc/core/irc-nicklist.c | 55 | ||||
-rw-r--r-- | src/irc/core/irc-nicklist.h | 3 | ||||
-rw-r--r-- | src/irc/core/irc-servers-reconnect.c | 4 | ||||
-rw-r--r-- | src/irc/core/irc-servers.c | 27 | ||||
-rw-r--r-- | src/irc/core/irc-servers.h | 1 |
12 files changed, 58 insertions, 210 deletions
diff --git a/src/irc/core/channel-rejoin.c b/src/irc/core/channel-rejoin.c index 0715952e..9efed72c 100644 --- a/src/irc/core/channel-rejoin.c +++ b/src/irc/core/channel-rejoin.c @@ -75,7 +75,7 @@ static void server_rejoin_channels(IRC_SERVER_REC *server) while (server->rejoin_channels != NULL) { char *channel = server->rejoin_channels->data; - irc_channels_join(server, channel, TRUE); + server->channels_join(server, channel, TRUE); server->rejoin_channels = g_slist_remove(server->rejoin_channels, channel); } diff --git a/src/irc/core/ignore.c b/src/irc/core/ignore.c index ae85a22b..7ec3122e 100644 --- a/src/irc/core/ignore.c +++ b/src/irc/core/ignore.c @@ -56,7 +56,7 @@ static int ignore_check_replies(IGNORE_REC *rec, IRC_SERVER_REC *server, for (tmp = nicks; tmp != NULL; tmp = tmp->next) { NICK_REC *nick = tmp->data; - if (irc_nick_match(nick->nick, text)) + if (nick_match_msg(SERVER(server), text, nick->nick)) return TRUE; } g_slist_free(nicks); @@ -114,7 +114,7 @@ int ignore_check(IRC_SERVER_REC *server, const char *nick, const char *host, /* pattern */ patt_len = 0; - if (rec->pattern != NULL) { + if (rec->pattern != NULL && text != NULL) { if (!mask_len && !best_mask) { patt_len = strlen(rec->pattern); if (patt_len <= best_patt) continue; diff --git a/src/irc/core/irc-channels-setup.c b/src/irc/core/irc-channels-setup.c index 51d8a991..33e383de 100644 --- a/src/irc/core/irc-channels-setup.c +++ b/src/irc/core/irc-channels-setup.c @@ -20,95 +20,14 @@ #include "module.h" #include "signals.h" -#include "nicklist.h" -#include "servers.h" -#include "special-vars.h" - -#include "servers-setup.h" -#include "channels-setup.h" - -#include "irc.h" -#include "irc-chatnets.h" -#include "irc-servers.h" -#include "irc-channels.h" - -/* connected to server, autojoin to channels. */ -static void event_connected(IRC_SERVER_REC *server) -{ - GString *chans; - GSList *tmp; - - if (!IS_IRC_SERVER(server) || server->connrec->reconnection) - return; - - /* join to the channels marked with autojoin in setup */ - chans = g_string_new(NULL); - for (tmp = setupchannels; tmp != NULL; tmp = tmp->next) { - CHANNEL_SETUP_REC *rec = tmp->data; - - if (!rec->autojoin || - !channel_chatnet_match(rec->chatnet, - server->connrec->chatnet)) - continue; - - g_string_sprintfa(chans, "%s,", rec->name); - } - - if (chans->len > 0) { - g_string_truncate(chans, chans->len-1); - irc_channels_join(server, chans->str, TRUE); - } - - g_string_free(chans, TRUE); -} - -/* channel wholist received: send the auto send command */ -static void channel_wholist(CHANNEL_REC *channel) -{ - CHANNEL_SETUP_REC *rec; - NICK_REC *nick; - char **bots, **bot; - - g_return_if_fail(IS_CHANNEL(channel)); - - rec = channels_setup_find(channel->name, channel->server->connrec->chatnet); - if (rec == NULL || rec->autosendcmd == NULL || !*rec->autosendcmd) - return; - - if (rec->botmasks == NULL || !*rec->botmasks) { - /* just send the command. */ - eval_special_string(rec->autosendcmd, "", channel->server, channel); - return; - } - - /* find first available bot.. */ - bots = g_strsplit(rec->botmasks, " ", -1); - for (bot = bots; *bot != NULL; bot++) { - const char *botnick = *bot; - - nick = nicklist_find(channel, isnickflag(*botnick) ? - botnick+1 : botnick); - if (nick == NULL) - continue; - if ((*botnick == '@' && !nick->op) || - (*botnick == '+' && !nick->voice && !nick->op)) - continue; - - /* got one! */ - eval_special_string(rec->autosendcmd, nick->nick, channel->server, channel); - break; - } - g_strfreev(bots); -} +#include "channels.h" void irc_channels_setup_init(void) { - signal_add("event connected", (SIGNAL_FUNC) event_connected); - signal_add("channel wholist", (SIGNAL_FUNC) channel_wholist); + signal_add("channel wholist", (SIGNAL_FUNC) channel_send_autocommands); } void irc_channels_setup_deinit(void) { - signal_remove("event connected", (SIGNAL_FUNC) event_connected); - signal_remove("channel wholist", (SIGNAL_FUNC) channel_wholist); + signal_remove("channel wholist", (SIGNAL_FUNC) channel_send_autocommands); } diff --git a/src/irc/core/irc-channels.c b/src/irc/core/irc-channels.c index 7786199a..fffd2445 100644 --- a/src/irc/core/irc-channels.c +++ b/src/irc/core/irc-channels.c @@ -92,7 +92,8 @@ static void sig_channel_destroyed(IRC_CHANNEL_REC *channel) #define get_join_key(key) \ (((key) == NULL || *(key) == '\0') ? "x" : (key)) -void irc_channels_join(IRC_SERVER_REC *server, const char *data, int automatic) +static void irc_channels_join(IRC_SERVER_REC *server, const char *data, + int automatic) { CHANNEL_SETUP_REC *schannel; IRC_CHANNEL_REC *chanrec; @@ -191,6 +192,7 @@ static void sig_connected(SERVER_REC *server) return; server->channel_find_func = (void *) irc_channel_find_server; + server->channels_join = (void *) irc_channels_join; } void irc_channels_init(void) diff --git a/src/irc/core/irc-channels.h b/src/irc/core/irc-channels.h index 5181378f..41826cb1 100644 --- a/src/irc/core/irc-channels.h +++ b/src/irc/core/irc-channels.h @@ -35,8 +35,4 @@ IRC_CHANNEL_REC *irc_channel_create(IRC_SERVER_REC *server, #define irc_channel_find(server, name) \ IRC_CHANNEL(channel_find(SERVER(server), name)) -/* Join to channels. `data' contains channels and channel keys */ -void irc_channels_join(IRC_SERVER_REC *server, - const char *data, int automatic); - #endif diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c index 035b17b1..5c8fe19b 100644 --- a/src/irc/core/irc-commands.c +++ b/src/irc/core/irc-commands.c @@ -153,42 +153,6 @@ static void cmd_server(const char *data, IRC_SERVER_REC *server, cmd_params_free(free_arg); } -/* SYNTAX: MSG [-<server tag>] <targets> <message> */ -static void cmd_msg(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) -{ - GHashTable *optlist; - char *target, *msg; - void *free_arg; - int free_ret; - - g_return_if_fail(data != NULL); - - if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | - PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, - "msg", &optlist, &target, &msg)) - return; - if (*target == '\0' || *msg == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); - - server = IRC_SERVER(cmd_options_get_server("msg", optlist, SERVER(server))); - if (!IS_IRC_SERVER(server) || !server->connected) - cmd_param_error(CMDERR_NOT_CONNECTED); - - free_ret = FALSE; - if (strcmp(target, ",") == 0 || strcmp(target, ".") == 0) - target = parse_special(&target, SERVER(server), item, NULL, &free_ret, NULL); - else if (strcmp(target, "*") == 0 && - (IS_IRC_CHANNEL(item) || IS_IRC_QUERY(item))) - target = item->name; - if (target != NULL) { - g_string_sprintf(tmpstr, "PRIVMSG %s :%s", target, msg); - irc_send_cmd_split(server, tmpstr->str, 2, server->max_msgs_in_cmd); - } - - if (free_ret && target != NULL) g_free(target); - - cmd_params_free(free_arg); -} - /* SYNTAX: NOTICE <targets> <message> */ static void cmd_notice(const char *data, IRC_SERVER_REC *server) { @@ -254,33 +218,6 @@ static void cmd_nctcp(const char *data, IRC_SERVER_REC *server) cmd_params_free(free_arg); } -/* SYNTAX: JOIN [-invite] [-<server tag>] <channels> [<keys>] */ -static void cmd_join(const char *data, IRC_SERVER_REC *server) -{ - GHashTable *optlist; - char *channels; - void *free_arg; - - g_return_if_fail(data != NULL); - if (!IS_IRC_SERVER(server) || !server->connected) - cmd_return_error(CMDERR_NOT_CONNECTED); - - if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS | - PARAM_FLAG_GETREST, "join", &optlist, &channels)) - return; - - if (g_hash_table_lookup(optlist, "invite")) { - if (server->last_invite != NULL) - irc_channels_join(server, server->last_invite, FALSE); - } else { - /* -<server tag> */ - server = IRC_SERVER(cmd_options_get_server("join", optlist, SERVER(server))); - if (server != NULL) irc_channels_join(server, channels, FALSE); - } - - cmd_params_free(free_arg); -} - /* SYNTAX: PART [<channels>] [<message>] */ static void cmd_part(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { @@ -946,11 +883,9 @@ void irc_commands_init(void) signal_add("server connected", (SIGNAL_FUNC) sig_connected); command_bind("server", NULL, (SIGNAL_FUNC) cmd_server); command_bind("connect", NULL, (SIGNAL_FUNC) cmd_connect); - command_bind("msg", NULL, (SIGNAL_FUNC) cmd_msg); command_bind("notice", NULL, (SIGNAL_FUNC) cmd_notice); command_bind("ctcp", NULL, (SIGNAL_FUNC) cmd_ctcp); command_bind("nctcp", NULL, (SIGNAL_FUNC) cmd_nctcp); - command_bind("join", NULL, (SIGNAL_FUNC) cmd_join); command_bind("part", NULL, (SIGNAL_FUNC) cmd_part); command_bind("kick", NULL, (SIGNAL_FUNC) cmd_kick); command_bind("topic", NULL, (SIGNAL_FUNC) cmd_topic); @@ -1036,7 +971,6 @@ void irc_commands_init(void) command_set_options("topic", "delete"); command_set_options("list", "yes"); command_set_options("away", "one all"); - command_set_options("join", "invite"); } void irc_commands_deinit(void) @@ -1046,11 +980,9 @@ void irc_commands_deinit(void) signal_remove("server connected", (SIGNAL_FUNC) sig_connected); command_unbind("server", (SIGNAL_FUNC) cmd_server); command_unbind("connect", (SIGNAL_FUNC) cmd_connect); - command_unbind("msg", (SIGNAL_FUNC) cmd_msg); command_unbind("notice", (SIGNAL_FUNC) cmd_notice); command_unbind("ctcp", (SIGNAL_FUNC) cmd_ctcp); command_unbind("nctcp", (SIGNAL_FUNC) cmd_nctcp); - command_unbind("join", (SIGNAL_FUNC) cmd_join); command_unbind("part", (SIGNAL_FUNC) cmd_part); command_unbind("kick", (SIGNAL_FUNC) cmd_kick); command_unbind("topic", (SIGNAL_FUNC) cmd_topic); diff --git a/src/irc/core/irc-core.c b/src/irc/core/irc-core.c index 657696ef..104fc403 100644 --- a/src/irc/core/irc-core.c +++ b/src/irc/core/irc-core.c @@ -51,7 +51,14 @@ void irc_channels_setup_deinit(void); void irc_core_init(void) { - chat_protocol_register("IRC", "Internet Relay Chat", "ircnet"); + CHAT_PROTOCOL_REC *rec; + + rec = g_new0(CHAT_PROTOCOL_REC, 1); + rec->name = "IRC"; + rec->fullname = "Internet Relay Chat"; + rec->chatnet = "ircnet"; + + chat_protocol_register(rec); irc_chatnets_init(); irc_servers_init(); diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c index 3b3dcd8a..420b3834 100644 --- a/src/irc/core/irc-nicklist.c +++ b/src/irc/core/irc-nicklist.c @@ -34,9 +34,6 @@ (a) == '[' || (a) == ']' || (a) == '{' || (a) == '}' || \ (a) == '|' || (a) == '\\' || (a) == '^') -#define isalnumhigh(a) \ - (isalnum(a) || (unsigned char) (a) >= 128) - /* Remove all "extra" characters from `nick'. Like _nick_ -> nick */ char *irc_nick_strip(const char *nick) { @@ -56,45 +53,6 @@ char *irc_nick_strip(const char *nick) return stripped; } -/* Check is `msg' is meant for `nick'. */ -int irc_nick_match(const char *nick, const char *msg) -{ - int len; - - g_return_val_if_fail(nick != NULL, FALSE); - g_return_val_if_fail(msg != NULL, FALSE); - - /* first check for identical match */ - len = strlen(nick); - if (g_strncasecmp(msg, nick, len) == 0 && !isalnumhigh((int) msg[len])) - return TRUE; - - /* check if it matches for alphanumeric parts of nick */ - while (*nick != '\0' && *msg != '\0') { - if (*nick == *msg) { - /* total match */ - msg++; - } else if (isalnum(*msg) && !isalnum(*nick)) { - /* some strange char in your nick, pass it */ - } else - break; - - nick++; - } - - if (isalnumhigh(*msg)) { - /* message continues with another alphanumeric character, - it isn't for us. */ - return FALSE; - } - - /* remove all the non-alphanumeric characters at the end of - the nick and check if message matched that far. */ - while (*nick != '\0' && !isalnum(*nick)) nick++; - - return *nick == '\0'; -} - static void event_names_list(const char *data, SERVER_REC *server) { CHANNEL_REC *chanrec; @@ -378,6 +336,17 @@ static void sig_usermode(SERVER_REC *server) nicklist_update_flags(server, server->nick, server->usermode_away, -1); } +static const char *get_nick_flags(void) +{ + return "@+%"; +} + +static void sig_connected(IRC_SERVER_REC *server) +{ + if (IS_IRC_SERVER(server)) + server->get_nick_flags = (void *) get_nick_flags; +} + void irc_nicklist_init(void) { signal_add("event nick", (SIGNAL_FUNC) event_nick); @@ -395,6 +364,7 @@ void irc_nicklist_init(void) signal_add("event 302", (SIGNAL_FUNC) event_userhost); signal_add("userhost event", (SIGNAL_FUNC) event_userhost); signal_add("user mode changed", (SIGNAL_FUNC) sig_usermode); + signal_add("server connected", (SIGNAL_FUNC) sig_connected); } void irc_nicklist_deinit(void) @@ -414,4 +384,5 @@ void irc_nicklist_deinit(void) signal_remove("event 302", (SIGNAL_FUNC) event_userhost); signal_remove("userhost event", (SIGNAL_FUNC) event_userhost); signal_remove("user mode changed", (SIGNAL_FUNC) sig_usermode); + signal_remove("server connected", (SIGNAL_FUNC) sig_connected); } diff --git a/src/irc/core/irc-nicklist.h b/src/irc/core/irc-nicklist.h index e4172b89..f6c7be51 100644 --- a/src/irc/core/irc-nicklist.h +++ b/src/irc/core/irc-nicklist.h @@ -9,7 +9,4 @@ void irc_nicklist_deinit(void); /* Remove all "extra" characters from `nick'. Like _nick_ -> nick */ char *irc_nick_strip(const char *nick); -/* Check if `msg' is meant for `nick'. */ -int irc_nick_match(const char *nick, const char *msg); - #endif diff --git a/src/irc/core/irc-servers-reconnect.c b/src/irc/core/irc-servers-reconnect.c index 2b44ea4b..7ff72eac 100644 --- a/src/irc/core/irc-servers-reconnect.c +++ b/src/irc/core/irc-servers-reconnect.c @@ -90,11 +90,9 @@ static int sig_set_user_mode(IRC_SERVER_REC *server) static void sig_connected(IRC_SERVER_REC *server) { - if (!server->connrec->reconnection) + if (!IS_IRC_SERVER(server) || !server->connrec->reconnection) return; - if (server->connrec->channels != NULL) - irc_channels_join(server, server->connrec->channels, TRUE); if (server->connrec->away_reason != NULL) signal_emit("command away", 2, server->connrec->away_reason, server, NULL); if (server->connrec->usermode != NULL) { diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 16e6ed40..5ce3b45e 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -61,6 +61,30 @@ static void sig_server_connect_free(IRC_SERVER_CONNECT_REC *conn) g_free_not_null(conn->alternate_nick); } +static int isnickflag_func(char flag) +{ + return isnickflag(flag); +} + +static int ischannel_func(char flag) +{ + return ischannel(flag); +} + +static void send_message(IRC_SERVER_REC *server, const char *target, + const char *msg) +{ + char *str; + + g_return_if_fail(server != NULL); + g_return_if_fail(target != NULL); + g_return_if_fail(msg != NULL); + + str = g_strdup_printf("PRIVMSG %s :%s", target, msg); + irc_send_cmd_split(server, str, 2, server->max_msgs_in_cmd); + g_free(str); +} + static void server_init(IRC_SERVER_REC *server) { IRC_SERVER_CONNECT_REC *conn; @@ -100,6 +124,9 @@ static void server_init(IRC_SERVER_REC *server) address, conn->realname); server->cmdcount = 0; + server->isnickflag = isnickflag_func; + server->ischannel = ischannel_func; + server->send_message = (void *) send_message; } IRC_SERVER_REC *irc_server_connect(IRC_SERVER_CONNECT_REC *conn) diff --git a/src/irc/core/irc-servers.h b/src/irc/core/irc-servers.h index 0b66f27c..25b6f422 100644 --- a/src/irc/core/irc-servers.h +++ b/src/irc/core/irc-servers.h @@ -37,7 +37,6 @@ typedef struct { char *real_address; /* address the irc server gives */ char *usermode; /* The whole mode string .. */ char *userhost; /* /USERHOST <nick> - set when joined to first channel */ - char *last_invite; /* channel where you were last invited */ int whois_coming:1; /* Mostly just to display away message right.. */ int whois_found:1; /* Did WHOIS return any entries? */ |