int xchat_plugin_init (xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) { xchat_plugin_get_info (plugin_name, plugin_desc, plugin_version, NULL); ph = plugin_handle; if (notify_init ("XChat-GNOME OSD")) { /* FIXME: multi-head! */ GtkIconTheme *theme = gtk_icon_theme_get_default (); notify_icon = gtk_icon_theme_load_icon (theme, "xchat-gnome", 48, 0, NULL); xchat_hook_print (ph, "Channel Msg Hilight", XCHAT_PRI_NORM, new_msg_cb, NULL); xchat_hook_print (ph, "Channel Action Hilight", XCHAT_PRI_NORM, new_action_cb, NULL); xchat_hook_print (ph, "Private Message", XCHAT_PRI_NORM, private_msg_cb, NULL); xchat_hook_print (ph, "Private Message to Dialog", XCHAT_PRI_NORM, private_msg_cb, NULL); xchat_print (ph, _("OSD loaded\n")); return TRUE; } else { xchat_print (ph, _("OSD initialization failed\n")); } return FALSE; }
int xchat_plugin_init (xchat_plugin * plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) { if (initialized != 0) { xchat_print (plugin_handle, "Perl interface already loaded\n"); return 0; } ph = plugin_handle; initialized = 1; *plugin_name = "Perl"; *plugin_desc = "Perl scripting interface"; *plugin_version = PACKAGE_VERSION; xchat_hook_command (ph, "load", XCHAT_PRI_NORM, perl_command_load, 0, 0); xchat_hook_command (ph, "unload", XCHAT_PRI_NORM, perl_command_unload, 0, 0); xchat_hook_command (ph, "reload", XCHAT_PRI_NORM, perl_command_reload, 0, 0); xchat_hook_command (ph, "pl_reload", XCHAT_PRI_NORM, perl_command_reload, 0, 0); xchat_hook_command (ph, "unloadall", XCHAT_PRI_NORM, perl_command_unloadall, 0, 0); xchat_hook_command (ph, "reloadall", XCHAT_PRI_NORM, perl_command_reloadall, 0, 0); /*perl_init (); */ xchat_hook_timer (ph, 0, perl_auto_load, NULL ); xchat_print (ph, "Perl interface loaded\n"); return 1; }
/* Xchat::Internal::hook_fd(fd, callback, flags, userdata) */ static XS (XS_Xchat_hook_fd) { int fd; SV *callback; int flags; SV *userdata; SV *package; xchat_hook *hook; HookData *data; dXSARGS; if (items != 4) { xchat_print (ph, "Usage: Xchat::Internal::hook_fd(fd, callback, flags, userdata)"); } else { fd = (int) SvIV (ST (0)); callback = ST (1); flags = (int) SvIV (ST (2)); userdata = ST (3); package = ST (4); data = NULL; #ifdef WIN32 if ((flags & XCHAT_FD_NOTSOCKET) == 0) { /* this _get_osfhandle if from win32iop.h in the perl distribution, * not the one provided by Windows */ fd = _get_osfhandle(fd); if (fd < 0) { xchat_print(ph, "Invalid file descriptor"); XSRETURN_UNDEF; } } #endif data = malloc (sizeof (HookData)); if (data == NULL) { XSRETURN_UNDEF; } data->callback = newSVsv (callback); data->userdata = newSVsv (userdata); data->depth = 0; data->package = newSVsv (package); hook = xchat_hook_fd (ph, fd, flags, fd_cb, data); data->hook = hook; XSRETURN_IV (PTR2IV (hook)); } }
/* Xchat::print(output) */ static XS (XS_Xchat_print) { char *text = NULL; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::Internal::print(text)"); } else { text = SvPV_nolen (ST (0)); xchat_print (ph, text); } XSRETURN_EMPTY; }
/* * lua: xchat.print(text) * desc: Prints some text to the current tab/window. * ret: none * args: * * text (string): the text to print */ static int lxc_print(lua_State *L) { const char *txt = luaL_checkstring(L, 1); // FIXME? const char *txt = lua_tostring(L, 1); xchat_print(ph, txt); return 0; }
int xchat_plugin_deinit(void) { xchat_command (ph, "MENU DEL \"Window/Display Current Song (Winamp)\""); xchat_print (ph, "Winamp plugin unloaded\n"); return 1; }
static XS (XS_Xchat_get_info) { SV *temp = NULL; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::get_info(id)"); } else { SV *id = ST (0); const char *RETVAL; RETVAL = xchat_get_info (ph, SvPV_nolen (id)); if (RETVAL == NULL) { XSRETURN_UNDEF; } if (!strncmp ("win_ptr", SvPV_nolen (id), 7)) { XSRETURN_IV (PTR2IV (RETVAL)); } else { if ( !strncmp ("libdirfs", SvPV_nolen (id), 8) || !strncmp ("xchatdirfs", SvPV_nolen (id), 10) ) { XSRETURN_PV (RETVAL); } else { temp = newSVpv (RETVAL, 0); SvUTF8_on (temp); PUSHMARK (SP); XPUSHs (sv_2mortal (temp)); PUTBACK; } } } }
static XS (XS_Xchat_unhook) { xchat_hook *hook; HookData *userdata; int retCount = 0; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::unhook(hook)"); } else { hook = INT2PTR (xchat_hook *, SvUV (ST (0))); userdata = (HookData *) xchat_unhook (ph, hook); if (userdata != NULL) { if (userdata->callback != NULL) { SvREFCNT_dec (userdata->callback); } if (userdata->userdata != NULL) { XPUSHs (sv_mortalcopy (userdata->userdata)); SvREFCNT_dec (userdata->userdata); retCount = 1; } if (userdata->package != NULL) { SvREFCNT_dec (userdata->package); } free (userdata); } XSRETURN (retCount); } XSRETURN_EMPTY; }
int xchat_plugin_deinit (void) { xdcc_save (); xchat_print (ph, "XDCC List saved\n"); return 1; }
void loadThemes(){ char *hDir, *hFile, *line, *val; FILE *f; xchat_print(ph,"loading themes\n"); hDir=(char*)calloc(1024,sizeof(char)); strcpy(hDir,xchat_get_info(ph,"xchatdirfs")); hFile=str3cat(hDir,"\\","mpcInfo.theme.txt"); f = fopen(hFile,"r"); if(f==NULL) { xchat_print(ph,"no theme in homedir, checking global theme"); f=fopen("mpcInfo.theme.txt","r"); } //xchat_printf(ph,"file_desc: %p\n",f); if (f==NULL) xchat_print(ph, "no theme found, using hardcoded\n"); else { if (f > 0) { line=" "; } else { line="\0"; } while (line[0]!=0) { line=readLine(f); val=split(line,'='); printf("line: %s\n",line); printf("val: %s\n",val); if (strcmp(toUpper(line),"OFF_LINE")==0) notRunTheme=themeAdd(notRunTheme,val); if (strcmp(toUpper(line),"TITLE_LINE")==0) titleTheme=themeAdd(titleTheme,val); if (strcmp(toUpper(line),"MP3_LINE")==0) mp3Theme=themeAdd(mp3Theme,val); if (strcmp(toUpper(line),"OGG_LINE")==0) mp3Theme=themeAdd(oggTheme,val); } fclose(f); xchat_print(ph, "theme loaded successfull\n"); } if (notRunTheme.size==0) notRunTheme=themeAdd(notRunTheme,"say Media Player Classic not running"); if (titleTheme.size==0) titleTheme=themeAdd(titleTheme,"say Playing %title in Media Player Classic"); if (mp3Theme.size==0) mp3Theme=themeAdd(mp3Theme,"me listens to %art with %tit from %alb [%gen|%br kbps|%frq kHz|%mode] in Media Player Classic "); if (oggTheme.size==0) oggTheme=themeAdd(oggTheme,"me listens to %art with %tit from %alb [%gen|%br kbps|%frq kHz|%chan channels] in Media Player Classic "); //mp3Theme=themeAdd(mp3Theme,"me listens to %art with %tit from %alb [%time|%length|%perc%|%br kbps|%frq kHz|%mode] in Media Player Classic "); }
static int fd_cb (int fd, int flags, void *userdata) { HookData *data = (HookData *) userdata; int retVal = 0; int count = 0; dSP; ENTER; SAVETMPS; PUSHMARK (SP); XPUSHs (data->userdata); PUTBACK; set_current_package (data->package); count = call_sv (data->callback, G_EVAL); set_current_package (&PL_sv_undef); SPAGAIN; if (SvTRUE (ERRSV)) { xchat_printf (ph, "Error in fd callback %s", SvPV_nolen (ERRSV)); if (!SvOK (POPs)) {} /* remove undef from the top of the stack */ retVal = XCHAT_EAT_ALL; } else { if (count != 1) { xchat_print (ph, "Fd handler should only return 1 value."); retVal = XCHAT_EAT_NONE; } else { retVal = POPi; if (retVal == 0) { /* if 0 is returned, the fd is going to get unhooked */ PUSHMARK (SP); XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook)))); PUTBACK; call_pv ("Xchat::unhook", G_EVAL); SPAGAIN; SvREFCNT_dec (data->callback); if (data->userdata) { SvREFCNT_dec (data->userdata); } free (data); } } } PUTBACK; FREETMPS; LEAVE; return retVal; }
static XS (XS_Xchat_get_context) { dXSARGS; if (items != 0) { xchat_print (ph, "Usage: Xchat::get_context()"); } else { XSRETURN_IV (PTR2IV (xchat_get_context (ph))); } }
int xchat_plugin_deinit (xchat_plugin * plugin_handle) { perl_end (); initialized = 0; xchat_print (plugin_handle, "Perl interface unloaded\n"); return 1; }
static XS (XS_Xchat_find_context) { char *server = NULL; char *chan = NULL; xchat_context *RETVAL; dXSARGS; if (items > 2) xchat_print (ph, "Usage: Xchat::find_context ([channel, [server]])"); { switch (items) { case 0: /* no server name and no channel name */ /* nothing to do, server and chan are already NULL */ break; case 1: /* channel name only */ /* change channel value only if it is true or 0 */ /* otherwise leave it as null */ if (SvTRUE (ST (0)) || SvNIOK (ST (0))) { chan = SvPV_nolen (ST (0)); /* xchat_printf( ph, "XSUB - find_context( %s, NULL )", chan ); */ } /* else { xchat_print( ph, "XSUB - find_context( NULL, NULL )" ); } */ /* chan is already NULL */ break; case 2: /* server and channel */ /* change channel value only if it is true or 0 */ /* otherwise leave it as NULL */ if (SvTRUE (ST (0)) || SvNIOK (ST (0))) { chan = SvPV_nolen (ST (0)); /* xchat_printf( ph, "XSUB - find_context( %s, NULL )", SvPV_nolen(ST(0) )); */ } /* else { xchat_print( ph, "XSUB - 2 arg NULL chan" ); } */ /* change server value only if it is true or 0 */ /* otherwise leave it as NULL */ if (SvTRUE (ST (1)) || SvNIOK (ST (1))) { server = SvPV_nolen (ST (1)); /* xchat_printf( ph, "XSUB - find_context( NULL, %s )", SvPV_nolen(ST(1) )); */ } /* else { xchat_print( ph, "XSUB - 2 arg NULL server" ); } */ break; } RETVAL = xchat_find_context (ph, server, chan); if (RETVAL != NULL) { /* xchat_print (ph, "XSUB - context found"); */ XSRETURN_IV (PTR2IV (RETVAL)); } else { /* xchat_print (ph, "XSUB - context not found"); */ XSRETURN_UNDEF; } } }
static int timer_cb (void *userdata) { HookData *data = (HookData *) userdata; int retVal = 0; int count = 0; dSP; ENTER; SAVETMPS; PUSHMARK (SP); XPUSHs (data->userdata); PUTBACK; if (data->ctx) { xchat_set_context (ph, data->ctx); } set_current_package (data->package); count = call_sv (data->callback, G_EVAL | G_KEEPERR); set_current_package (&PL_sv_undef); SPAGAIN; if (SvTRUE (ERRSV)) { xchat_printf (ph, "Error in timer callback %s", SvPV_nolen (ERRSV)); if (!SvOK (POPs)) {} /* remove undef from the top of the stack */ retVal = XCHAT_EAT_ALL; } else { if (count != 1) { xchat_print (ph, "Timer handler should only return 1 value."); retVal = XCHAT_EAT_NONE; } else { retVal = POPi; if (retVal == 0) { /* if 0 is return the timer is going to get unhooked */ PUSHMARK (SP); XPUSHs (sv_2mortal (newSViv (PTR2IV (data->hook)))); XPUSHs (sv_mortalcopy (data->package)); PUTBACK; call_pv ("XChat::unhook", G_EVAL); SPAGAIN; } } } PUTBACK; FREETMPS; LEAVE; return retVal; }
static XS (XS_Xchat_nickcmp) { dXSARGS; if (items != 2) { xchat_print (ph, "Usage: Xchat::nickcmp(s1, s2)"); } else { XSRETURN_IV ((IV) xchat_nickcmp (ph, SvPV_nolen (ST (0)), SvPV_nolen (ST (1)))); } }
void xchat_printf(xchat_plugin *ph, const char *format, ...) { va_list args; char *buf; va_start(args, format); buf = g_strdup_vprintf(format, args); va_end(args); xchat_print(ph, buf); g_free(buf); }
void ScriptDataList::list() { xchat_print( the_plugin, PNAME ": -------------------------------------------\n" ); if ( m_head == 0 ) { xchat_print( the_plugin, PNAME ": Currently, no module loaded.\n" ); return; } xchat_print( the_plugin, PNAME ": Status Name\n" PNAME ": ------ ----------------------------------\n" ); ScriptData *mod = m_head; while( mod != 0 ) { Falcon::String status = mod->m_bStatus ? "Ok " : "Error"; xchat_print_falcon( PNAME ": "+ status + " " + mod->m_module->name() +"\n" ); mod = mod->m_next; } xchat_print( the_plugin, PNAME ": ----------------------------------------------\n" ); }
static XS (XS_Xchat_emit_print) { char *event_name; int RETVAL; int count; dXSARGS; if (items < 1) { xchat_print (ph, "Usage: Xchat::emit_print(event_name, ...)"); } else { event_name = (char *) SvPV_nolen (ST (0)); RETVAL = 0; /* we need to figure out the number of defined values passed in */ for (count = 0; count < items; count++) { if (!SvOK (ST (count))) { break; } } switch (count) { case 1: RETVAL = xchat_emit_print (ph, event_name, NULL); break; case 2: RETVAL = xchat_emit_print (ph, event_name, SvPV_nolen (ST (1)), NULL); break; case 3: RETVAL = xchat_emit_print (ph, event_name, SvPV_nolen (ST (1)), SvPV_nolen (ST (2)), NULL); break; case 4: RETVAL = xchat_emit_print (ph, event_name, SvPV_nolen (ST (1)), SvPV_nolen (ST (2)), SvPV_nolen (ST (3)), NULL); break; case 5: RETVAL = xchat_emit_print (ph, event_name, SvPV_nolen (ST (1)), SvPV_nolen (ST (2)), SvPV_nolen (ST (3)), SvPV_nolen (ST (4)), NULL); break; } XSRETURN_IV (RETVAL); } }
static XS (XS_Xchat_set_context) { xchat_context *ctx; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::set_context(ctx)"); } else { ctx = INT2PTR (xchat_context *, SvUV (ST (0))); XSRETURN_IV ((IV) xchat_set_context (ph, ctx)); } }
static XS (XS_Xchat_send_modes) { AV *p_targets = NULL; int modes_per_line = 0; char sign; char mode; int i = 0; const char **targets; int target_count = 0; SV **elem; dXSARGS; if (items < 3 || items > 4) { xchat_print (ph, "Usage: Xchat::send_modes( targets, sign, mode, modes_per_line)" ); } else { if (SvROK (ST (0))) { p_targets = (AV*) SvRV (ST (0)); target_count = av_len (p_targets) + 1; targets = malloc (target_count * sizeof (char *)); for (i = 0; i < target_count; i++ ) { elem = av_fetch (p_targets, i, 0); if (elem != NULL) { targets[i] = SvPV_nolen (*elem); } else { targets[i] = ""; } } } else{ targets = malloc (sizeof (char *)); targets[0] = SvPV_nolen (ST (0)); target_count = 1; } if (target_count == 0) { XSRETURN_EMPTY; } sign = (SvPV_nolen (ST (1)))[0]; mode = (SvPV_nolen (ST (2)))[0]; if (items == 4 ) { modes_per_line = (int) SvIV (ST (3)); } xchat_send_modes (ph, targets, target_count, modes_per_line, sign, mode); free (targets); } }
static XS (XS_Xchat_context_info) { const char *const *fields; dXSARGS; if (items > 0 ) { xchat_print (ph, "Usage: Xchat::Internal::context_info()"); } fields = xchat_list_fields (ph, "channels" ); XPUSHs (list_item_to_sv (NULL, fields)); XSRETURN (1); }
static VALUE static_ruby_xchat_print( VALUE klass, VALUE text ) { char *s_text; Check_Type( text, T_STRING ); s_text = StringValueCStr( text ); xchat_print( static_plugin_handle, s_text ); return Qnil; }
static void timer_showlist() { GSList *list; timer *tim; if (timer_list == nullptr) { xchat_print(ph, "No timers installed.\n"); xchat_print(ph, HELP); return; } /* 00000 00000000 0000000 abc */ xchat_print(ph, "\026 Ref# Seconds Repeat Command \026\n"); list = timer_list; while (list) { tim = (timer*)list->data; xchat_printf(ph, "%5d %8.1f %7d %s\n", tim->ref, tim->timeout, tim->repeat, tim->command); list = list->next; } }
static XS (XS_Xchat_Embed_plugingui_remove) { void *gui_entry; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::Embed::plugingui_remove(handle)"); } else { gui_entry = INT2PTR (void *, SvUV (ST (0))); xchat_plugingui_remove (ph, gui_entry); } XSRETURN_EMPTY; }
int xchat_plugin_deinit (xchat_plugin * plugin_handle) { if (reinit_tried) { reinit_tried--; return 1; } perl_end (); xchat_print (plugin_handle, "Perl interface unloaded\n"); return 1; }
static int timer_cb(char *word[], char *word_eol[], void *userdata) { int repeat = 1; float timeout; int offset = 0; int ref = 0; int quiet = FALSE; char *command; if (!word[2][0]) { timer_showlist(); return XCHAT_EAT_XCHAT; } if (strcasecmp(word[2], "-quiet") == 0) { quiet = TRUE; offset++; } if (strcasecmp(word[2 + offset], "-delete") == 0) { timer_del_ref(atoi (word[3 + offset]), quiet); return XCHAT_EAT_XCHAT; } if (strcasecmp(word[2 + offset], "-refnum") == 0) { ref = atoi(word[3 + offset]); offset += 2; } if (strcasecmp(word[2 + offset], "-repeat") == 0) { repeat = atoi(word[3 + offset]); offset += 2; } timeout = atof(word[2 + offset]); command = word_eol[3 + offset]; if (timeout < 0.1 || !command[0]) xchat_print(ph, HELP); else timer_add(ref, timeout, repeat, command); return XCHAT_EAT_XCHAT; }
/* Xchat::Internal::command(command) */ static XS (XS_Xchat_command) { char *cmd = NULL; dXSARGS; if (items != 1) { xchat_print (ph, "Usage: Xchat::Internal::command(command)"); } else { cmd = SvPV_nolen (ST (0)); xchat_command (ph, cmd); } XSRETURN_EMPTY; }
static int command_cb (char *word[], char *word_eol[], void *userdata) { HookData *data = (HookData *) userdata; int retVal = 0; int count = 0; dSP; ENTER; SAVETMPS; if (data->depth) return XCHAT_EAT_NONE; /* xchat_printf (ph, "Recieved %d words in command callback", */ /* av_len (wd)); */ PUSHMARK (SP); XPUSHs (newRV_noinc ((SV *) array2av (word))); XPUSHs (newRV_noinc ((SV *) array2av (word_eol))); XPUSHs (data->userdata); PUTBACK; data->depth++; set_current_package (data->package); count = call_sv (data->callback, G_EVAL); set_current_package (&PL_sv_undef); data->depth--; SPAGAIN; if (SvTRUE (ERRSV)) { xchat_printf (ph, "Error in command callback %s", SvPV_nolen (ERRSV)); if (!SvOK (POPs)) {} /* remove undef from the top of the stack */ retVal = XCHAT_EAT_XCHAT; } else { if (count != 1) { xchat_print (ph, "Command handler should only return 1 value."); retVal = XCHAT_EAT_NONE; } else { retVal = POPi; } } PUTBACK; FREETMPS; LEAVE; return retVal; }
/* Xchat::Internal::hook_command(name, priority, callback, help_text, userdata) */ static XS (XS_Xchat_hook_command) { char *name; int pri; SV *callback; char *help_text = NULL; SV *userdata; xchat_hook *hook; HookData *data; dXSARGS; if (items != 5) { xchat_print (ph, "Usage: Xchat::Internal::hook_command(name, priority, callback, help_text, userdata)"); } else { name = SvPV_nolen (ST (0)); pri = (int) SvIV (ST (1)); callback = ST (2); /* leave the help text has NULL if the help text is undefined to avoid * overriding the default help message for builtin commands */ if (SvOK(ST (3))) { help_text = SvPV_nolen (ST (3)); } userdata = ST (4); data = NULL; data = malloc (sizeof (HookData)); if (data == NULL) { XSRETURN_UNDEF; } data->callback = sv_mortalcopy (callback); SvREFCNT_inc (data->callback); data->userdata = sv_mortalcopy (userdata); SvREFCNT_inc (data->userdata); data->depth = 0; data->package = NULL; hook = xchat_hook_command (ph, name, pri, command_cb, help_text, data); XSRETURN_IV (PTR2IV (hook)); } }