void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip, int id) { char *po,*ptr=to; session *sess = 0; int server_notice = FALSE; if (is_channel (serv, ptr)) sess = find_channel (serv, ptr); if (!sess && ptr[0] == '@') { ptr++; sess = find_channel (serv, ptr); } if (!sess && ptr[0] == '%') { ptr++; sess = find_channel (serv, ptr); } if (!sess && ptr[0] == '+') { ptr++; sess = find_channel (serv, ptr); } if (strcmp (nick, ip) == 0) server_notice = TRUE; if (!sess) { ptr = 0; if (prefs.hex_irc_notice_pos == 0) { /* paranoia check */ if (msg[0] == '[' && (!serv->have_idmsg || id)) { /* guess where chanserv meant to post this -sigh- */ if (!g_ascii_strcasecmp (nick, "ChanServ") && !find_dialog (serv, nick)) { char *dest = strdup (msg + 1); char *end = strchr (dest, ']'); if (end) { *end = 0; sess = find_channel (serv, dest); } free (dest); } } if (!sess) sess = find_session_from_nick (nick, serv); } else if (prefs.hex_irc_notice_pos == 1) { int stype = server_notice ? SESS_SNOTICES : SESS_NOTICES; sess = find_session_from_type (stype, serv); if (!sess) { if (stype == SESS_NOTICES) sess = new_ircwindow (serv, "(notices)", SESS_NOTICES, 0); else sess = new_ircwindow (serv, "(snotices)", SESS_SNOTICES, 0); fe_set_channel (sess); fe_set_title (sess); fe_set_nonchannel (sess, FALSE); userlist_clear (sess); log_open_or_close (sess); } /* Avoid redundancy with some Undernet notices */ if (!strncmp (msg, "*** Notice -- ", 14)) msg += 14; } else { sess = serv->front_session; } if (!sess) { if (server_notice) sess = serv->server_session; else sess = serv->front_session; } } if (msg[0] == 1) { msg++; if (!strncmp (msg, "PING", 4)) { inbound_ping_reply (sess, msg + 5, nick); return; } } po = strchr (msg, '\001'); if (po) po[0] = 0; if (server_notice) EMIT_SIGNAL (XP_TE_SERVNOTICE, sess, msg, nick, NULL, NULL, 0); else if (ptr) EMIT_SIGNAL (XP_TE_CHANNOTICE, sess, nick, to, msg, NULL, 0); else EMIT_SIGNAL (XP_TE_NOTICE, sess, nick, msg, NULL, NULL, 0); }
void servlist_connect (session *sess, ircnet *net, gboolean join) { ircserver *ircserv; GSList *list; char *port; server *serv; if (!sess) sess = new_ircwindow (NULL, NULL, SESS_SERVER, TRUE); serv = sess->server; /* connect to the currently selected Server-row */ list = g_slist_nth (net->servlist, net->selected); if (!list) list = net->servlist; if (!list) return; ircserv = list->data; /* incase a protocol switch is added to the servlist gui */ server_fill_her_up (sess->server); if (join) { sess->willjoinchannel[0] = 0; if (net->autojoin) { if (serv->autojoin) free (serv->autojoin); serv->autojoin = strdup (net->autojoin); } } serv->password[0] = 0; if (net->pass) safe_strcpy (serv->password, net->pass, sizeof (serv->password)); if (net->flags & FLAG_USE_GLOBAL) { strcpy (serv->nick, prefs.nick1); } else { if (net->nick) strcpy (serv->nick, net->nick); } serv->dont_use_proxy = (net->flags & FLAG_USE_PROXY) ? FALSE : TRUE; #ifdef USE_OPENSSL serv->use_ssl = (net->flags & FLAG_USE_SSL) ? TRUE : FALSE; serv->accept_invalid_cert = (net->flags & FLAG_ALLOW_INVALID) ? TRUE : FALSE; #endif serv->network = net; port = strrchr (ircserv->hostname, '/'); if (port) { *port = 0; /* support "+port" to indicate SSL (like mIRC does) */ if (port[1] == '+') { #ifdef USE_OPENSSL serv->use_ssl = TRUE; #endif serv->connect (serv, ircserv->hostname, atoi (port + 2), FALSE); } else { serv->connect (serv, ircserv->hostname, atoi (port + 1), FALSE); } *port = '/'; } else serv->connect (serv, ircserv->hostname, -1, FALSE); server_set_encoding (serv, net->encoding); }
static void xchat_init (void) { char buf[3068]; const char *cs = NULL; #ifdef _WIN32 WSADATA wsadata; #ifdef USE_IPV6 if (WSAStartup(0x0202, &wsadata) != 0) { MessageBox (NULL, "Cannot find winsock 2.2+", "Error", MB_OK); exit (0); } #else WSAStartup(0x0101, &wsadata); #endif /* !USE_IPV6 */ #endif /* !_WIN32 */ #ifdef USE_SIGACTION struct sigaction act; /* ignore SIGPIPE's */ act.sa_handler = SIG_IGN; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGPIPE, &act, NULL); /* Deal with SIGUSR1's & SIGUSR2's */ act.sa_sigaction = sigusr1_handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGUSR1, &act, NULL); act.sa_sigaction = sigusr2_handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGUSR2, &act, NULL); #else #ifndef _WIN32 /* good enough for these old systems */ signal (SIGPIPE, SIG_IGN); #endif #endif if (g_get_charset (&cs)) prefs.utf8_locale = TRUE; load_text_events (); sound_load (); notify_load (); ignore_load (); g_snprintf (buf, sizeof (buf), "NAME %s~%s~\n" "CMD query %%s\n\n"\ "NAME %s~%s~\n" "CMD send %%s\n\n"\ "NAME %s~%s~\n" "CMD whois %%s %%s\n\n"\ "NAME %s~%s~\n" "CMD notify -n ASK %%s\n\n"\ "NAME %s~%s~\n" "CMD ignore %%s!*@* ALL\n\n"\ "NAME SUB\n" "CMD %s\n\n"\ "NAME %s\n" "CMD op %%a\n\n"\ "NAME %s\n" "CMD deop %%a\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s\n" "CMD voice %%a\n\n"\ "NAME %s\n" "CMD devoice %%a\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME SUB\n" "CMD %s\n\n"\ "NAME %s\n" "CMD kick %%s\n\n"\ "NAME %s\n" "CMD ban %%s\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s *!*@*.host\n""CMD ban %%s 0\n\n"\ "NAME %s *!*@domain\n""CMD ban %%s 1\n\n"\ "NAME %s *!*user@*.host\n""CMD ban %%s 2\n\n"\ "NAME %s *!*user@domain\n""CMD ban %%s 3\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s *!*@*.host\n""CMD kickban %%s 0\n\n"\ "NAME %s *!*@domain\n""CMD kickban %%s 1\n\n"\ "NAME %s *!*user@*.host\n""CMD kickban %%s 2\n\n"\ "NAME %s *!*user@domain\n""CMD kickban %%s 3\n\n"\ "NAME ENDSUB\n" "CMD \n\n"\ "NAME ENDSUB\n" "CMD \n\n", _("_Open Dialog Window"), "gtk-go-up", _("_Send a File"), "gtk-floppy", _("_User Info (WhoIs)"), "gtk-info", _("_Add to Friends List"), "gtk-add", _("_Ignore"), "gtk-stop", _("O_perator Actions"), _("Give Ops"), _("Take Ops"), _("Give Voice"), _("Take Voice"), _("Kick/Ban"), _("Kick"), _("Ban"), _("Ban"), _("Ban"), _("Ban"), _("Ban"), _("KickBan"), _("KickBan"), _("KickBan"), _("KickBan")); list_loadconf ("popup.conf", &popup_list, buf); g_snprintf (buf, sizeof (buf), "NAME %s\n" "CMD part\n\n" "NAME %s\n" "CMD getstr # join \"%s\"\n\n" "NAME %s\n" "CMD quote LINKS\n\n" "NAME %s\n" "CMD ping\n\n" "NAME TOGGLE %s\n" "CMD irc_hide_version\n\n", _("Leave Channel"), _("Join Channel..."), _("Enter Channel to Join:"), _("Server Links"), _("Ping Server"), _("Hide Version")); list_loadconf ("usermenu.conf", &usermenu_list, buf); g_snprintf (buf, sizeof (buf), "NAME %s\n" "CMD op %%a\n\n" "NAME %s\n" "CMD deop %%a\n\n" "NAME %s\n" "CMD ban %%s\n\n" "NAME %s\n" "CMD getstr \"%s\" \"kick %%s\" \"%s\"\n\n" "NAME %s\n" "CMD send %%s\n\n" "NAME %s\n" "CMD query %%s\n\n", _("Op"), _("DeOp"), _("Ban"), _("Kick"), _("bye"), _("Enter reason to kick %s:"), _("Sendfile"), _("Dialog")); list_loadconf ("buttons.conf", &button_list, buf); g_snprintf (buf, sizeof (buf), "NAME %s\n" "CMD whois %%s %%s\n\n" "NAME %s\n" "CMD send %%s\n\n" "NAME %s\n" "CMD dcc chat %%s\n\n" "NAME %s\n" "CMD clear\n\n" "NAME %s\n" "CMD ping %%s\n\n", _("WhoIs"), _("Send"), _("Chat"), _("Clear"), _("Ping")); list_loadconf ("dlgbuttons.conf", &dlgbutton_list, buf); list_loadconf ("tabmenu.conf", &tabmenu_list, NULL); list_loadconf ("ctcpreply.conf", &ctcp_list, defaultconf_ctcp); list_loadconf ("commands.conf", &command_list, defaultconf_commands); list_loadconf ("replace.conf", &replace_list, defaultconf_replace); list_loadconf ("urlhandlers.conf", &urlhandler_list, defaultconf_urlhandlers); servlist_init (); /* load server list */ /* if we got a URL, don't open the server list GUI */ if (!prefs.pchat_gui_slist_skip && !arg_url && !arg_urls) fe_serverlist_open (NULL); /* turned OFF via -a arg or by passing urls */ if (!arg_dont_autoconnect && !arg_urls) { /* do any auto connects */ if (!servlist_have_auto ()) /* if no new windows open .. */ { /* and no serverlist gui ... */ if (prefs.pchat_gui_slist_skip || arg_url || arg_urls) /* we'll have to open one. */ new_ircwindow (NULL, NULL, SESS_SERVER, 0); } else { fe_idle_add (xchat_auto_connect, NULL); } } else { if (prefs.pchat_gui_slist_skip || arg_url || arg_urls) new_ircwindow (NULL, NULL, SESS_SERVER, 0); } }
void servlist_connect (session *sess, ircnet &net, bool join) { ircserver *ircserv; GSList *list; char *port; server *serv; if (!sess) sess = new_ircwindow(nullptr, nullptr, session::SESS_SERVER, true); serv = sess->server; /* connect to the currently selected Server-row */ list = g_slist_nth (net.servlist, net.selected); if (!list) list = net.servlist; if (!list) return; ircserv = static_cast<ircserver*>(list->data); /* in case a protocol switch is added to the servlist gui */ server_fill_her_up (*sess->server); if (join) { sess->willjoinchannel[0] = 0; if (net.favchanlist) { if (serv->favlist) { g_slist_free_full (serv->favlist, (GDestroyNotify) servlist_favchan_free); } serv->favlist = g_slist_copy_deep (net.favchanlist, (GCopyFunc) servlist_favchan_copy, nullptr); } } if (net.logintype) { serv->loginmethod = net.logintype; } else { serv->loginmethod = LOGIN_DEFAULT_REAL; } serv->password[0] = 0; if (net.pass) { safe_strcpy (serv->password, net.pass, sizeof (serv->password)); } if (net.flags & FLAG_USE_GLOBAL) { strcpy (serv->nick, prefs.hex_irc_nick1); } else { if (net.nick) safe_strcpy(serv->nick, net.nick->c_str()); } serv->dont_use_proxy = (net.flags & FLAG_USE_PROXY) ? false : true; #ifdef USE_OPENSSL serv->use_ssl = (net.flags & FLAG_USE_SSL) ? true : false; serv->accept_invalid_cert = (net.flags & FLAG_ALLOW_INVALID) ? true : false; #endif serv->network = &net; port = strrchr (ircserv->hostname, '/'); if (port) { *port = 0; /* support "+port" to indicate SSL (like mIRC does) */ if (port[1] == '+') { #ifdef USE_OPENSSL serv->use_ssl = true; #endif serv->connect (ircserv->hostname, atoi (port + 2), false); } else { serv->connect (ircserv->hostname, atoi (port + 1), false); } *port = '/'; } else serv->connect (ircserv->hostname, -1, false); serv->set_encoding (net.encoding); }
void inbound_notice (server *serv, char *to, char *nick, char *msg, char *ip) { char *po,*ptr=to; session *sess = 0; int server_notice = FALSE; if (is_channel (serv, ptr)) sess = find_channel (serv, ptr); if (!sess && ptr[0] == '@') { ptr++; sess = find_channel (serv, ptr); } if (!sess && ptr[0] == '+') { ptr++; sess = find_channel (serv, ptr); } if (strcmp (nick, ip) == 0) server_notice = TRUE; if (!sess) { ptr = 0; if (prefs.notices_tabs) { int stype = server_notice ? SESS_SNOTICES : SESS_NOTICES; sess = find_session_from_type (stype, serv); if (!sess) { register unsigned int oldh = prefs.hideuserlist; prefs.hideuserlist = 1; if (stype == SESS_NOTICES) sess = new_ircwindow (serv, "(notices)", SESS_NOTICES); else sess = new_ircwindow (serv, "(snotices)", SESS_SNOTICES); prefs.hideuserlist = oldh; fe_set_channel (sess); fe_set_title (sess); fe_set_nonchannel (sess, FALSE); clear_user_list (sess); if (prefs.logging) log_open (sess); } /* Avoid redundancy with some Undernet notices */ if (!strncmp (msg, "*** Notice -- ", 14)) msg += 14; } else { sess = find_session_from_nick (nick, serv); } if (!sess) { if (server_notice) sess = serv->server_session; else sess = serv->front_session; } } if (msg[0] == 1) { msg++; if (!strncmp (msg, "PING", 4)) { inbound_ping_reply (sess, msg + 5, nick); return; } } po = strchr (msg, '\001'); if (po) po[0] = 0; if (server_notice) EMIT_SIGNAL (XP_TE_SERVNOTICE, sess, msg, nick, NULL, NULL, 0); else if (ptr) EMIT_SIGNAL (XP_TE_CHANNOTICE, sess, nick, to, msg, NULL, 0); else EMIT_SIGNAL (XP_TE_NOTICE, sess, nick, msg, NULL, NULL, 0); }
void inbound_action (session *sess, char *chan, char *from, char *text, int fromme) { session *def = sess; server *serv = sess->server; int beep = FALSE; int hilight = FALSE; if (!fromme) { if (is_channel (serv, chan)) { sess = find_channel (serv, chan); beep = prefs.beepchans; } else { /* it's a private action! */ beep = prefs.beepmsg; /* find a dialog tab for it */ sess = find_dialog (serv, from); /* if non found, open a new one */ if (!sess && prefs.autodialog) sess = new_ircwindow (serv, from, SESS_DIALOG); } } if (!sess) sess = def; if (sess != current_tab) { if (fromme) { sess->msg_said = FALSE; sess->new_data = TRUE; } else { sess->msg_said = TRUE; sess->new_data = FALSE; } } if (!fromme) { hilight = is_hilight (text, sess, serv); if (hilight && prefs.beephilight) beep = TRUE; if (beep || sess->beep) fe_beep (); if (hilight) { EMIT_SIGNAL (XP_TE_HCHANACTION, sess, from, text, NULL, NULL, 0); return; } } if (prefs.colorednicks) { char tbuf[NICKLEN + 4]; snprintf (tbuf, sizeof (tbuf), "\003%d%s", color_of (from), from); EMIT_SIGNAL (XP_TE_CHANACTION, sess, tbuf, text, NULL, NULL, 0); } else { EMIT_SIGNAL (XP_TE_CHANACTION, sess, from, text, NULL, NULL, 0); } }
static void xchat_init (void) { char buf[3068]; const char *cs = NULL; session *sess; #ifdef USE_SIGACTION struct sigaction act; /* ignore SIGPIPE's */ act.sa_handler = SIG_IGN; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGPIPE, &act, NULL); /* Deal with SIGUSR1's & SIGUSR2's */ act.sa_sigaction = sigusr1_handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGUSR1, &act, NULL); act.sa_sigaction = sigusr2_handler; act.sa_flags = 0; sigemptyset (&act.sa_mask); sigaction (SIGUSR2, &act, NULL); #else /* good enough for these old systems */ signal (SIGPIPE, SIG_IGN); #endif if (g_get_charset (&cs)) prefs.utf8_locale = TRUE; command_init (); load_text_events (); notify_load (); ignore_load (); signal_printer_init(); proto_irc_init(); upnp_init(); sasl_init(); snprintf (buf, sizeof (buf), "NAME %s\n" "CMD query %%s\n\n"\ "NAME %s\n" "CMD send %%s\n\n"\ "NAME %s\n" "CMD whois %%s %%s\n\n"\ "NAME SUB\n" "CMD %s\n\n"\ "NAME %s\n" "CMD op %%a\n\n"\ "NAME %s\n" "CMD deop %%a\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s\n" "CMD voice %%a\n\n"\ "NAME %s\n" "CMD devoice %%a\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME SUB\n" "CMD %s\n\n"\ "NAME %s\n" "CMD kick %%s\n\n"\ "NAME %s\n" "CMD ban %%s\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s *!*@*.host\n" "CMD ban %%s 0\n\n"\ "NAME %s *!*@domain\n" "CMD ban %%s 1\n\n"\ "NAME %s *!*user@*.host\n" "CMD ban %%s 2\n\n"\ "NAME %s *!*user@domain\n" "CMD ban %%s 3\n\n"\ "NAME SEP\n" "CMD \n\n"\ "NAME %s *!*@*.host\n" "CMD kickban %%s 0\n\n"\ "NAME %s *!*@domain\n" "CMD kickban %%s 1\n\n"\ "NAME %s *!*user@*.host\n" "CMD kickban %%s 2\n\n"\ "NAME %s *!*user@domain\n" "CMD kickban %%s 3\n\n"\ "NAME ENDSUB\n" "CMD \n\n"\ "NAME ENDSUB\n" "CMD \n\n", _("Open Query"), _("Send a File"), _("User Info (WHOIS)"), _("Operator Actions"), _("Give Ops"), _("Take Ops"), _("Give Voice"), _("Take Voice"), _("Kick/Ban"), _("Kick"), _("Ban"), _("Ban"), _("Ban"), _("Ban"), _("Ban"), _("KickBan"), _("KickBan"), _("KickBan"), _("KickBan")); list_loadconf ("popup.conf", &popup_list, buf); snprintf (buf, sizeof (buf), "NAME %s\n" "CMD part\n\n" "NAME %s\n" "CMD getstr # join \"%s\"\n\n" "NAME %s\n" "CMD quote LINKS\n\n" "NAME %s\n" "CMD ping\n\n" "NAME TOGGLE %s\n" "CMD irc_hide_version\n\n", _("Leave Channel"), _("Join Channel..."), _("Enter Channel to Join:"), _("Server Links"), _("Ping Server"), _("Hide Version")); list_loadconf ("usermenu.conf", &usermenu_list, buf); snprintf (buf, sizeof (buf), "NAME %s\n" "CMD op %%a\n\n" "NAME %s\n" "CMD deop %%a\n\n" "NAME %s\n" "CMD ban %%s\n\n" "NAME %s\n" "CMD getstr \"%s\" \"kick %%s\" \"%s\"\n\n" "NAME %s\n" "CMD send %%s\n\n" "NAME %s\n" "CMD query %%s\n\n", _("Op"), _("DeOp"), _("Ban"), _("Kick"), _("bye"), _("Enter reason to kick %s:"), _("Sendfile"), _("Query")); list_loadconf ("buttons.conf", &button_list, buf); snprintf (buf, sizeof (buf), "NAME %s\n" "CMD whois %%s %%s\n\n" "NAME %s\n" "CMD send %%s\n\n" "NAME %s\n" "CMD dcc chat %%s\n\n" "NAME %s\n" "CMD clear\n\n" "NAME %s\n" "CMD ping %%s\n\n", _("WhoIs"), _("Send"), _("Chat"), _("Clear"), _("Ping")); list_loadconf ("dlgbuttons.conf", &dlgbutton_list, buf); list_loadconf ("tabmenu.conf", &tabmenu_list, NULL); list_loadconf ("ctcpreply.conf", &ctcp_list, defaultconf_ctcp); list_loadconf ("commands.conf", &command_list, defaultconf_commands); list_loadconf ("replace.conf", &replace_list, defaultconf_replace); #ifdef REGEX_SUBSTITUTION regex_list_loadconf("regex_replace.conf", ®ex_replace_list, defaultconf_regex_replace); #endif list_loadconf ("urlhandlers.conf", &urlhandler_list, defaultconf_urlhandlers); servlist_init (); /* load server list */ sess = new_ircwindow (NULL, _("Event Console"), SESS_SERVER, 0); /* turned OFF via -a arg */ if (!arg_dont_autoconnect && servlist_have_auto()) g_idle_add ((GSourceFunc) servlist_auto_connect, NULL); /* if we got a URL, don't open the server list GUI */ if (!prefs.skip_serverlist && !servlist_have_auto() && !arg_url) fe_serverlist_open (NULL); }