static void identd_start_server (void) { GError *error = NULL; int enabled, port = 113; if (hexchat_get_prefs (ph, "identd_server", NULL, &enabled) == 3) { if (!enabled) return; } if (hexchat_get_prefs (ph, "identd_port", NULL, &port) == 2 && (port <= 0 || port > G_MAXUINT16)) { port = 113; } service = g_socket_service_new (); g_socket_listener_add_inet_port (G_SOCKET_LISTENER (service), port, NULL, &error); if (error) { hexchat_printf (ph, _("*\tError starting identd server: %s"), error->message); g_error_free (error); g_clear_object (&service); return; } /*hexchat_printf (ph, "*\tIdentd listening on port: %d", port); */ g_signal_connect (G_OBJECT (service), "incoming", G_CALLBACK(identd_incoming_cb), NULL); g_socket_service_start (service); }
static gboolean should_alert (void) { int omit_away, omit_focused, omit_tray; if (hexchat_get_prefs (ph, "gui_focus_omitalerts", NULL, &omit_focused) == 3 && omit_focused) { const char *status = hexchat_get_info (ph, "win_status"); if (status && !g_strcmp0 (status, "active")) return FALSE; } if (hexchat_get_prefs (ph, "away_omit_alerts", NULL, &omit_away) == 3 && omit_away) { if (hexchat_get_info (ph, "away")) return FALSE; } if (hexchat_get_prefs (ph, "gui_tray_quiet", NULL, &omit_tray) == 3 && omit_tray) { int tray_enabled; if (hexchat_get_prefs (ph, "gui_tray", NULL, &tray_enabled) == 3 && tray_enabled) { const char *status = hexchat_get_info (ph, "win_status"); if (status && g_strcmp0 (status, "hidden") != 0) return FALSE; } } return TRUE; }
static int incoming_priv_cb (char *word[], gpointer userdata) { int priv; if (hexchat_get_prefs (ph, "input_balloon_priv", NULL, &priv) == 3 && priv && should_alert ()) { const char *network = hexchat_get_info (ph, "network"); if (!network) network = hexchat_get_info (ph, "server"); if (userdata != NULL) /* Special event */ { if (GPOINTER_TO_INT (userdata) == 3) { if (!is_ignored (word[2])) show_notificationf (word[1], _("File offer from: %s (%s)"), word[2], network); } else if (GPOINTER_TO_INT (userdata) == 2) { if (!is_ignored (word[2])) show_notificationf (word[1], _("Invited to channel by: %s (%s)"), word[2], network); } else { if (!is_ignored (word[1])) show_notificationf (word[2], _("Notice from: %s (%s)"), word[1], network); } } else show_notificationf (word[2], _("Private message from: %s (%s)"), word[1], network); } return HEXCHAT_EAT_NONE; }
static gboolean is_ignored (char *nick) { const char *no_hilight; if (hexchat_get_prefs (ph, "irc_no_hilight", &no_hilight, NULL) == 1 && no_hilight) { return alert_match_word (nick, (char*)no_hilight); } return FALSE; }
static int incoming_message_cb (char *word[], gpointer userdata) { int message; if (hexchat_get_prefs (ph, "input_balloon_chans", NULL, &message) == 3 && message && should_alert ()) { show_notificationf (word[2], _("Channel message from: %s (%s)"), word[1], hexchat_get_info (ph, "channel")); } return HEXCHAT_EAT_NONE; }
static int incoming_hilight_cb (char *word[], gpointer userdata) { int hilight; if (hexchat_get_prefs (ph, "input_balloon_hilight", NULL, &hilight) == 3 && hilight && should_alert()) { show_notificationf (word[2], _("Highlighted message from: %s (%s)"), word[1], hexchat_get_info (ph, "channel")); } return HEXCHAT_EAT_NONE; }
static void perl_init (void) { int warn; int arg_count; char *perl_args[] = { "", "-e", "0", "-w" }; char *env[] = { "" }; static const char xchat_definitions[] = { /* Redefine the $SIG{__WARN__} handler to have HexChat printing warnings in the main window. (TheHobbit) */ #include "xchat.pm.h" }; #ifdef OLD_PERL static const char irc_definitions[] = { #include "irc.pm.h" }; #endif #ifdef ENABLE_NLS /* Problem is, dynamicaly loaded modules check out the $] var. It appears that in the embedded interpreter we get 5,00503 as soon as the LC_NUMERIC locale calls for a comma instead of a point in separating integer and decimal parts. I realy can't understant why... The following appears to be an awful workaround... But it'll do until I (or someone else :)) found the "right way" to solve this nasty problem. (TheHobbit <*****@*****.**>) */ setlocale (LC_NUMERIC, "C"); #endif warn = 0; hexchat_get_prefs (ph, "perl_warnings", NULL, &warn); arg_count = warn ? 4 : 3; PERL_SYS_INIT3 (&arg_count, (char ***)&perl_args, (char ***)&env); my_perl = perl_alloc (); perl_construct (my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse (my_perl, xs_init, arg_count, perl_args, (char **)NULL); /* Now initialising the perl interpreter by loading the perl_definition array. */ eval_pv (xchat_definitions, TRUE); #ifdef OLD_PERL eval_pv (irc_definitions, TRUE); #endif }
static int dccrecv_cb (char *word[], void *userdata) { int result; struct stat buffer; /* buffer for storing file info */ char sum[65]; /* buffer for checksum */ const char *file; char *cfile; if (hexchat_get_prefs (ph, "dcc_completed_dir", &file, NULL) == 1 && file[0] != 0) { cfile = g_strconcat (file, G_DIR_SEPARATOR_S, word[1], NULL); } else { cfile = g_strdup(word[2]); } result = stat (cfile, &buffer); if (result == 0) /* stat returns 0 on success */ { if (buffer.st_size <= (unsigned long long) get_limit () * 1048576) { sha256_file (cfile, sum); /* file is the full filename even if completed dir set */ /* try to print the checksum in the privmsg tab of the sender */ hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3])); hexchat_printf (ph, "SHA-256 checksum for %s (local): %s\n", word[1], sum); } else { hexchat_set_context (ph, hexchat_find_context (ph, NULL, word[3])); hexchat_printf (ph, "SHA-256 checksum for %s (local): (size limit reached, no checksum calculated, you can increase it with /CHECKSUM INC)\n", word[1]); } } else { hexchat_printf (ph, "File access error!\n"); } g_free (cfile); return HEXCHAT_EAT_NONE; }
static XS (XS_Xchat_get_prefs) { const char *str; int integer; SV *temp = NULL; dXSARGS; if (items != 1) { hexchat_print (ph, "Usage: Xchat::get_prefs(name)"); } else { switch (hexchat_get_prefs (ph, SvPV_nolen (ST (0)), &str, &integer)) { case 0: XSRETURN_UNDEF; break; case 1: temp = newSVpv (str, 0); SvUTF8_on (temp); SP -= items; sp = mark; XPUSHs (sv_2mortal (temp)); PUTBACK; break; case 2: XSRETURN_IV (integer); break; case 3: if (integer) { XSRETURN_YES; } else { XSRETURN_NO; } } } }
static int api_hexchat_prefs_meta_index(lua_State *L) { char const *key = luaL_checkstring(L, 2); char const *string; int number; int ret = hexchat_get_prefs(ph, key, &string, &number); switch(ret) { case 0: lua_pushnil(L); return 1; case 1: lua_pushstring(L, string); return 1; case 2: lua_pushnumber(L, number); return 1; case 3: lua_pushboolean(L, number); return 1; default: return 0; } }