diff options
Diffstat (limited to 'src/plugins/scripts')
-rw-r--r-- | src/plugins/scripts/lua/weechat-lua.c | 305 | ||||
-rw-r--r-- | src/plugins/scripts/perl/weechat-perl.c | 320 | ||||
-rw-r--r-- | src/plugins/scripts/python/weechat-python.c | 252 | ||||
-rw-r--r-- | src/plugins/scripts/ruby/weechat-ruby.c | 245 |
4 files changed, 998 insertions, 124 deletions
diff --git a/src/plugins/scripts/lua/weechat-lua.c b/src/plugins/scripts/lua/weechat-lua.c index f5f55620c..0398365bf 100644 --- a/src/plugins/scripts/lua/weechat-lua.c +++ b/src/plugins/scripts/lua/weechat-lua.c @@ -241,24 +241,24 @@ weechat_lua_print (lua_State *L) switch (n) { - case 1: - message = lua_tostring (lua_current_interpreter, -1); - break; - case 2: - channel_name = lua_tostring (lua_current_interpreter, -2); - message = lua_tostring (lua_current_interpreter, -1); - break; - case 3: - server_name = lua_tostring (lua_current_interpreter, -3); - channel_name = lua_tostring (lua_current_interpreter, -2); - message = lua_tostring (lua_current_interpreter, -1); - break; - default: - lua_plugin->print_server (lua_plugin, - "Lua error: wrong parameters for " - "\"print\" function"); - lua_pushnumber (lua_current_interpreter, 0); - return 1; + case 1: + message = lua_tostring (lua_current_interpreter, -1); + break; + case 2: + channel_name = lua_tostring (lua_current_interpreter, -2); + message = lua_tostring (lua_current_interpreter, -1); + break; + case 3: + server_name = lua_tostring (lua_current_interpreter, -3); + channel_name = lua_tostring (lua_current_interpreter, -2); + message = lua_tostring (lua_current_interpreter, -1); + break; + default: + lua_plugin->print_server (lua_plugin, + "Lua error: wrong parameters for " + "\"print\" function"); + lua_pushnumber (lua_current_interpreter, 0); + return 1; } lua_plugin->print (lua_plugin, @@ -271,6 +271,49 @@ weechat_lua_print (lua_State *L) } /* + * weechat_lua_print_server: print message into a buffer server + */ + +static int +weechat_lua_print_server (lua_State *L) +{ + const char *message; + int n; + + /* make gcc happy */ + (void) L; + + if (!lua_current_script) + { + lua_plugin->print_server (lua_plugin, + "Lua error: unable to print message, " + "script not initialized"); + lua_pushnumber (lua_current_interpreter, 0); + return 1; + } + + message = NULL; + + n = lua_gettop (lua_current_interpreter); + + if (n == 1) + message = lua_tostring (lua_current_interpreter, -1); + else + { + lua_plugin->print_server (lua_plugin, + "Lua error: wrong parameters for " + "\"print_server\" function"); + lua_pushnumber (lua_current_interpreter, 0); + return 1; + } + + lua_plugin->print_server (lua_plugin, "%s", (char *) message); + + lua_pushnumber (lua_current_interpreter, 1); + return 1; +} + +/* * weechat_lua_print_infobar: print message to infobar */ @@ -350,7 +393,7 @@ weechat_lua_remove_infobar (lua_State *L) } /* - * weechat_lua_print: log message in server/channel (current or specified ones) + * weechat_lua_log: log message in server/channel (current or specified ones) */ static int @@ -1544,6 +1587,226 @@ weechat_lua_get_irc_color (lua_State *L) } /* + * weechat_lua_get_window_info: get infos about windows + */ + +static int +weechat_lua_get_window_info (lua_State *L) +{ + t_plugin_window_info *window_info, *ptr_window; + int i; + + /* make gcc happy */ + (void) L; + + if (!lua_current_script) + { + lua_plugin->print_server (lua_plugin, + "Lua error: unable to get window info, " + "script not initialized"); + lua_pushnil (lua_current_interpreter); + return 1; + } + + window_info = lua_plugin->get_window_info (lua_plugin); + if (!window_info) + { + lua_pushboolean (lua_current_interpreter, 0); + return 1; + } + + lua_newtable (lua_current_interpreter); + + for (i = 0, ptr_window = window_info; ptr_window; ptr_window = ptr_window->next_window, i++) + { + lua_pushnumber (lua_current_interpreter, i); + lua_newtable (lua_current_interpreter); + + lua_pushstring (lua_current_interpreter, "num_buffer"); + lua_pushnumber (lua_current_interpreter, ptr_window->num_buffer); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_x"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_x); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_y"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_y); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_width"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_width); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_height"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_height); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_width_pct"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_width_pct); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "win_height_pct"); + lua_pushnumber (lua_current_interpreter, ptr_window->win_height_pct); + lua_rawset (lua_current_interpreter, -3); + + lua_rawset (lua_current_interpreter, -3); + } + + lua_plugin->free_window_info (lua_plugin, window_info); + + return 1; +} + +/* + * weechat_lua_get_buffer_info: get infos about buffers + */ + +static int +weechat_lua_get_buffer_info (lua_State *L) +{ + t_plugin_buffer_info *buffer_info, *ptr_buffer; + + /* make gcc happy */ + (void) L; + + if (!lua_current_script) + { + lua_plugin->print_server (lua_plugin, + "Lua error: unable to get buffer info, " + "script not initialized"); + lua_pushnil (lua_current_interpreter); + return 1; + } + + buffer_info = lua_plugin->get_buffer_info (lua_plugin); + if (!buffer_info) { + lua_pushboolean (lua_current_interpreter, 0); + return 1; + } + + lua_newtable (lua_current_interpreter); + + for (ptr_buffer = buffer_info; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) + { + lua_pushnumber (lua_current_interpreter, ptr_buffer->number); + lua_newtable (lua_current_interpreter); + + lua_pushstring (lua_current_interpreter, "type"); + lua_pushnumber (lua_current_interpreter, ptr_buffer->type); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "num_displayed"); + lua_pushnumber (lua_current_interpreter, ptr_buffer->num_displayed); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "server"); + lua_pushstring (lua_current_interpreter, + ptr_buffer->server_name == NULL ? "" : ptr_buffer->server_name); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "channel"); + lua_pushstring (lua_current_interpreter, + ptr_buffer->channel_name == NULL ? "" : ptr_buffer->channel_name); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "notify_level"); + lua_pushnumber (lua_current_interpreter, ptr_buffer->notify_level); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "log_filename"); + lua_pushstring (lua_current_interpreter, + ptr_buffer->log_filename == NULL ? "" : ptr_buffer->log_filename); + lua_rawset (lua_current_interpreter, -3); + + lua_rawset (lua_current_interpreter, -3); + } + + lua_plugin->free_buffer_info(lua_plugin, buffer_info); + + return 1; +} + +/* + * weechat_lua_get_buffer_data: get buffer content + */ + +static int +weechat_lua_get_buffer_data (lua_State *L) +{ + t_plugin_buffer_line *buffer_data, *ptr_data; + const char *server, *channel; + int i, n; + + /* make gcc happy */ + (void) L; + + if (!lua_current_script) + { + lua_plugin->print_server (lua_plugin, + "Lua error: unable to get buffer data, " + "script not initialized"); + lua_pushnil (lua_current_interpreter); + return 1; + } + + server = NULL; + channel = NULL; + + n = lua_gettop (lua_current_interpreter); + + switch (n) + { + case 0: + break; + case 1: + server = lua_tostring (lua_current_interpreter, -1); + break; + case 2: + channel = lua_tostring (lua_current_interpreter, -2); + server = lua_tostring (lua_current_interpreter, -1); + break; + default: + lua_plugin->print_server (lua_plugin, + "Lua error: wrong parameters for " + "\"get_buffer_data\" function"); + lua_pushnumber (lua_current_interpreter, 0); + return 1; + } + + buffer_data = lua_plugin->get_buffer_data (lua_plugin, (char *) server, (char *) channel); + if (!buffer_data) + { + lua_pushboolean (lua_current_interpreter, 0); + return 1; + } + + lua_newtable (lua_current_interpreter); + + for (i = 0, ptr_data = buffer_data; ptr_data; ptr_data = ptr_data->next_line, i++) + { + lua_pushnumber (lua_current_interpreter, i); + lua_newtable (lua_current_interpreter); + + lua_pushstring (lua_current_interpreter, "nick"); + lua_pushstring (lua_current_interpreter, + ptr_data->nick == NULL ? "" : ptr_data->nick); + lua_rawset (lua_current_interpreter, -3); + + lua_pushstring (lua_current_interpreter, "data"); + lua_pushstring (lua_current_interpreter, + ptr_data->data == NULL ? "" : ptr_data->data); + lua_rawset (lua_current_interpreter, -3); + + lua_rawset (lua_current_interpreter, -3); + } + + lua_plugin->free_buffer_data (lua_plugin, buffer_data); + + return 1; +} + +/* * Lua constant as functions */ @@ -1605,6 +1868,7 @@ static const struct luaL_reg weechat_lua_funcs[] = { { "register", weechat_lua_register}, { "print", weechat_lua_print}, + { "print_server", weechat_lua_print_server}, { "print_infobar", weechat_lua_print_infobar}, { "remove_infobar", weechat_lua_remove_infobar}, { "log", weechat_lua_log}, @@ -1626,6 +1890,9 @@ const struct luaL_reg weechat_lua_funcs[] = { { "get_channel_info", weechat_lua_get_channel_info}, { "get_nick_info", weechat_lua_get_nick_info}, { "get_irc_color", weechat_lua_get_irc_color}, + { "get_window_info", weechat_lua_get_window_info}, + { "get_buffer_info", weechat_lua_get_buffer_info}, + { "get_buffer_data", weechat_lua_get_buffer_data}, /* define constants as function which returns values */ { "PLUGIN_RC_OK", weechat_lua_constant_plugin_rc_ok}, { "PLUGIN_RC_KO", weechat_lua_constant_plugin_rc_ko}, diff --git a/src/plugins/scripts/perl/weechat-perl.c b/src/plugins/scripts/perl/weechat-perl.c index 48777cf30..52ac3e8a4 100644 --- a/src/plugins/scripts/perl/weechat-perl.c +++ b/src/plugins/scripts/perl/weechat-perl.c @@ -241,7 +241,6 @@ weechat_perl_keyboard_handler (t_weechat_plugin *plugin, static XS (XS_weechat_register) { char *name, *version, *shutdown_func, *description; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -258,10 +257,10 @@ static XS (XS_weechat_register) XSRETURN_NO; } - name = SvPV (ST (0), integer); - version = SvPV (ST (1), integer); - shutdown_func = SvPV (ST (2), integer); - description = SvPV (ST (3), integer); + name = SvPV (ST (0), PL_na); + version = SvPV (ST (1), PL_na); + shutdown_func = SvPV (ST (2), PL_na); + description = SvPV (ST (3), PL_na); if (weechat_script_search (perl_plugin, &perl_scripts, name)) { @@ -302,7 +301,6 @@ static XS (XS_weechat_register) static XS (XS_weechat_print) { - unsigned int integer; char *message, *channel_name, *server_name; dXSARGS; @@ -325,16 +323,16 @@ static XS (XS_weechat_print) XSRETURN_NO; } - message = SvPV (ST (0), integer); + message = SvPV (ST (0), PL_na); channel_name = NULL; server_name = NULL; if (items > 1) { - channel_name = SvPV (ST (1), integer); + channel_name = SvPV (ST (1), PL_na); if (items > 2) - server_name = SvPV (ST (2), integer); + server_name = SvPV (ST (2), PL_na); } perl_plugin->print (perl_plugin, @@ -345,12 +343,46 @@ static XS (XS_weechat_print) } /* + * weechat::print_server: print message into a server buffer + */ + +static XS (XS_weechat_print_server) +{ + char *message; + dXSARGS; + + /* make gcc happy */ + (void) cv; + + if (!perl_current_script) + { + perl_plugin->print_server (perl_plugin, + "Perl error: unable to print message, " + "script not initialized"); + XSRETURN_NO; + } + + if (items < 1) + { + perl_plugin->print_server (perl_plugin, + "Perl error: wrong parameters for " + "\"print_server\" function"); + XSRETURN_NO; + } + + message = SvPV (ST (0), PL_na); + + perl_plugin->print_server (perl_plugin, "%s", message); + + XSRETURN_YES; +} + +/* * weechat::print_infobar: print message to infobar */ static XS (XS_weechat_print_infobar) { - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -375,7 +407,7 @@ static XS (XS_weechat_print_infobar) perl_plugin->print_infobar (perl_plugin, SvIV (ST (0)), "%s", - SvPV (ST (1), integer)); + SvPV (ST (1), PL_na)); XSRETURN_YES; } @@ -411,7 +443,6 @@ static XS (XS_weechat_remove_infobar) static XS (XS_weechat_log) { - unsigned int integer; char *message, *channel_name, *server_name; dXSARGS; @@ -434,16 +465,16 @@ static XS (XS_weechat_log) XSRETURN_NO; } - message = SvPV (ST (0), integer); + message = SvPV (ST (0), PL_na); channel_name = NULL; server_name = NULL; if (items > 1) { - channel_name = SvPV (ST (1), integer); + channel_name = SvPV (ST (1), PL_na); if (items > 2) - server_name = SvPV (ST (2), integer); + server_name = SvPV (ST (2), PL_na); } perl_plugin->log (perl_plugin, @@ -459,7 +490,6 @@ static XS (XS_weechat_log) static XS (XS_weechat_command) { - unsigned int integer; char *channel_name, *server_name; dXSARGS; @@ -487,14 +517,14 @@ static XS (XS_weechat_command) if (items > 1) { - channel_name = SvPV (ST (1), integer); + channel_name = SvPV (ST (1), PL_na); if (items > 2) - server_name = SvPV (ST (2), integer); + server_name = SvPV (ST (2), PL_na); } perl_plugin->exec_command (perl_plugin, server_name, channel_name, - SvPV (ST (0), integer)); + SvPV (ST (0), PL_na)); XSRETURN_YES; } @@ -506,7 +536,6 @@ static XS (XS_weechat_command) static XS (XS_weechat_add_message_handler) { char *irc_command, *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -528,8 +557,8 @@ static XS (XS_weechat_add_message_handler) XSRETURN_NO; } - irc_command = SvPV (ST (0), integer); - function = SvPV (ST (1), integer); + irc_command = SvPV (ST (0), PL_na); + function = SvPV (ST (1), PL_na); if (perl_plugin->msg_handler_add (perl_plugin, irc_command, weechat_perl_cmd_msg_handler, function, @@ -547,7 +576,6 @@ static XS (XS_weechat_add_command_handler) { char *command, *function, *description, *arguments, *arguments_description; char *completion_template; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -569,12 +597,12 @@ static XS (XS_weechat_add_command_handler) XSRETURN_NO; } - command = SvPV (ST (0), integer); - function = SvPV (ST (1), integer); - description = (items >= 3) ? SvPV (ST (2), integer) : NULL; - arguments = (items >= 4) ? SvPV (ST (3), integer) : NULL; - arguments_description = (items >= 5) ? SvPV (ST (4), integer) : NULL; - completion_template = (items >= 6) ? SvPV (ST (5), integer) : NULL; + command = SvPV (ST (0), PL_na); + function = SvPV (ST (1), PL_na); + description = (items >= 3) ? SvPV (ST (2), PL_na) : NULL; + arguments = (items >= 4) ? SvPV (ST (3), PL_na) : NULL; + arguments_description = (items >= 5) ? SvPV (ST (4), PL_na) : NULL; + completion_template = (items >= 6) ? SvPV (ST (5), PL_na) : NULL; if (perl_plugin->cmd_handler_add (perl_plugin, command, @@ -598,7 +626,6 @@ static XS (XS_weechat_add_timer_handler) { int interval; char *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -621,7 +648,7 @@ static XS (XS_weechat_add_timer_handler) } interval = SvIV (ST (0)); - function = SvPV (ST (1), integer); + function = SvPV (ST (1), PL_na); if (perl_plugin->timer_handler_add (perl_plugin, interval, weechat_perl_timer_handler, function, @@ -638,7 +665,6 @@ static XS (XS_weechat_add_timer_handler) static XS (XS_weechat_add_keyboard_handler) { char *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -660,7 +686,7 @@ static XS (XS_weechat_add_keyboard_handler) XSRETURN_NO; } - function = SvPV (ST (0), integer); + function = SvPV (ST (0), PL_na); if (perl_plugin->keyboard_handler_add (perl_plugin, weechat_perl_keyboard_handler, @@ -678,7 +704,6 @@ static XS (XS_weechat_add_keyboard_handler) static XS (XS_weechat_remove_handler) { char *command, *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -700,8 +725,8 @@ static XS (XS_weechat_remove_handler) XSRETURN_NO; } - command = SvPV (ST (0), integer); - function = SvPV (ST (1), integer); + command = SvPV (ST (0), PL_na); + function = SvPV (ST (1), PL_na); weechat_script_remove_handler (perl_plugin, perl_current_script, command, function); @@ -716,7 +741,6 @@ static XS (XS_weechat_remove_handler) static XS (XS_weechat_remove_timer_handler) { char *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -738,7 +762,7 @@ static XS (XS_weechat_remove_timer_handler) XSRETURN_NO; } - function = SvPV (ST (0), integer); + function = SvPV (ST (0), PL_na); weechat_script_remove_timer_handler (perl_plugin, perl_current_script, function); @@ -753,7 +777,6 @@ static XS (XS_weechat_remove_timer_handler) static XS (XS_weechat_remove_keyboard_handler) { char *function; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -775,7 +798,7 @@ static XS (XS_weechat_remove_keyboard_handler) XSRETURN_NO; } - function = SvPV (ST (0), integer); + function = SvPV (ST (0), PL_na); weechat_script_remove_keyboard_handler (perl_plugin, perl_current_script, function); @@ -790,7 +813,6 @@ static XS (XS_weechat_remove_keyboard_handler) static XS (XS_weechat_get_info) { char *arg, *info, *server_name; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -812,9 +834,9 @@ static XS (XS_weechat_get_info) XSRETURN_NO; } - server_name = (items == 2) ? SvPV (ST (1), integer) : NULL; + server_name = (items == 2) ? SvPV (ST (1), PL_na) : NULL; - arg = SvPV (ST (0), integer); + arg = SvPV (ST (0), PL_na); if (arg) { info = perl_plugin->get_info (perl_plugin, arg, server_name); @@ -904,7 +926,6 @@ static XS (XS_weechat_get_dcc_info) static XS (XS_weechat_get_config) { char *option, *return_value; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -915,7 +936,7 @@ static XS (XS_weechat_get_config) perl_plugin->print_server (perl_plugin, "Perl error: unable to get config option, " "script not initialized"); - XSRETURN_NO; + XSRETURN_EMPTY; } if (items < 1) @@ -923,10 +944,10 @@ static XS (XS_weechat_get_config) perl_plugin->print_server (perl_plugin, "Perl error: wrong parameters for " "\"get_config\" function"); - XSRETURN_NO; + XSRETURN_EMPTY; } - option = SvPV (ST (0), integer); + option = SvPV (ST (0), PL_na); if (option) { @@ -951,7 +972,6 @@ static XS (XS_weechat_get_config) static XS (XS_weechat_set_config) { char *option, *value; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -973,8 +993,8 @@ static XS (XS_weechat_set_config) XSRETURN_NO; } - option = SvPV (ST (0), integer); - value = SvPV (ST (1), integer); + option = SvPV (ST (0), PL_na); + value = SvPV (ST (1), PL_na); if (option && value) { @@ -992,7 +1012,6 @@ static XS (XS_weechat_set_config) static XS (XS_weechat_get_plugin_config) { char *option, *return_value; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -1003,7 +1022,7 @@ static XS (XS_weechat_get_plugin_config) perl_plugin->print_server (perl_plugin, "Perl error: unable to get plugin config option, " "script not initialized"); - XSRETURN_NO; + XSRETURN_EMPTY; } if (items < 1) @@ -1011,10 +1030,10 @@ static XS (XS_weechat_get_plugin_config) perl_plugin->print_server (perl_plugin, "Perl error: wrong parameters for " "\"get_plugin_config\" function"); - XSRETURN_NO; + XSRETURN_EMPTY; } - option = SvPV (ST (0), integer); + option = SvPV (ST (0), PL_na); if (option) { @@ -1041,7 +1060,6 @@ static XS (XS_weechat_get_plugin_config) static XS (XS_weechat_set_plugin_config) { char *option, *value; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -1063,8 +1081,8 @@ static XS (XS_weechat_set_plugin_config) XSRETURN_NO; } - option = SvPV (ST (0), integer); - value = SvPV (ST (1), integer); + option = SvPV (ST (0), PL_na); + value = SvPV (ST (1), PL_na); if (option && value) { @@ -1152,7 +1170,6 @@ static XS (XS_weechat_get_server_info) } perl_plugin->free_server_info (perl_plugin, server_info); - //XPUSHs(newRV_inc((SV *) server_hash)); ST (0) = newRV_inc((SV *) server_hash); XSRETURN (1); } @@ -1165,7 +1182,6 @@ static XS (XS_weechat_get_channel_info) { t_plugin_channel_info *channel_info, *ptr_channel; char *server; - unsigned int integer; HV *channel_hash, *channel_hash_member; dXSARGS; @@ -1188,7 +1204,7 @@ static XS (XS_weechat_get_channel_info) XSRETURN_EMPTY; } - server = SvPV (ST (0), integer); + server = SvPV (ST (0), PL_na); if (!server) XSRETURN_EMPTY; @@ -1220,7 +1236,6 @@ static XS (XS_weechat_get_channel_info) } perl_plugin->free_channel_info (perl_plugin, channel_info); - //XPUSHs(newRV_inc((SV *) channel_hash)); ST (0) = newRV_inc((SV *) channel_hash); XSRETURN (1); } @@ -1233,7 +1248,6 @@ static XS (XS_weechat_get_nick_info) { t_plugin_nick_info *nick_info, *ptr_nick; char *server, *channel; - unsigned int integer; HV *nick_hash; dXSARGS; @@ -1256,8 +1270,8 @@ static XS (XS_weechat_get_nick_info) XSRETURN_EMPTY; } - server = SvPV (ST (0), integer); - channel = SvPV (ST (1), integer); + server = SvPV (ST (0), PL_na); + channel = SvPV (ST (1), PL_na); if (!server || !channel) XSRETURN_EMPTY; @@ -1286,7 +1300,6 @@ static XS (XS_weechat_get_nick_info) } perl_plugin->free_nick_info (perl_plugin, nick_info); - //XPUSHs(newRV_inc((SV *) nick_hash)); ST (0) = newRV_inc((SV *) nick_hash); XSRETURN (1); } @@ -1336,7 +1349,6 @@ static XS (XS_weechat_input_color) static XS (XS_weechat_get_irc_color) { char *color; - unsigned int integer; dXSARGS; /* make gcc happy */ @@ -1360,7 +1372,7 @@ static XS (XS_weechat_get_irc_color) XSRETURN (1); } - color = SvPV (ST (0), integer); + color = SvPV (ST (0), PL_na); if (color) { XST_mIV (0, perl_plugin->get_irc_color (perl_plugin, color)); @@ -1372,6 +1384,176 @@ static XS (XS_weechat_get_irc_color) } /* + * weechat::get_window_info: get infos about windows + */ + +static XS (XS_weechat_get_window_info) +{ + t_plugin_window_info *window_info, *ptr_window; + int count; + HV *window_hash_member; + dXSARGS; + + /* make gcc happy */ + (void) cv; + (void) items; + + if (!perl_current_script) + { + perl_plugin->print_server (perl_plugin, + "Perl error: unable to get window info, " + "script not initialized"); + XSRETURN_EMPTY; + } + + window_info = perl_plugin->get_window_info (perl_plugin); + count = 0; + if (!window_info) + XSRETURN_EMPTY; + + for (ptr_window = window_info; ptr_window; ptr_window = ptr_window->next_window) + { + window_hash_member = (HV *) sv_2mortal((SV *) newHV()); + + hv_store (window_hash_member, "num_buffer", 10, newSViv (ptr_window->num_buffer), 0); + hv_store (window_hash_member, "win_x", 5, newSViv (ptr_window->win_x), 0); + hv_store (window_hash_member, "win_y", 5, newSViv (ptr_window->win_y), 0); + hv_store (window_hash_member, "win_width", 9, newSViv (ptr_window->win_width), 0); + hv_store (window_hash_member, "win_height", 10, newSViv (ptr_window->win_height), 0); + hv_store (window_hash_member, "win_width_pct", 13, newSViv (ptr_window->win_width_pct), 0); + hv_store (window_hash_member, "win_height_pct", 14, newSViv (ptr_window->win_height_pct), 0); + + XPUSHs(newRV_inc((SV *) window_hash_member)); + count++; + } + perl_plugin->free_window_info (perl_plugin, window_info); + + XSRETURN (count); +} + +/* + * weechat::get_buffer_info: get infos about buffers + */ + +static XS (XS_weechat_get_buffer_info) +{ + t_plugin_buffer_info *buffer_info, *ptr_buffer; + HV *buffer_hash, *buffer_hash_member; + char conv[8]; + dXSARGS; + + /* make gcc happy */ + (void) cv; + (void) items; + + if (!perl_current_script) + { + perl_plugin->print_server (perl_plugin, + "Perl error: unable to get buffer info, " + "script not initialized"); + XSRETURN_EMPTY; + } + + buffer_info = perl_plugin->get_buffer_info (perl_plugin); + if (!buffer_info) + { + XSRETURN_EMPTY; + } + + buffer_hash = (HV *) sv_2mortal((SV *) newHV()); + if (!buffer_hash) + { + perl_plugin->free_buffer_info (perl_plugin, buffer_info); + XSRETURN_EMPTY; + } + + for (ptr_buffer = buffer_info; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) + { + buffer_hash_member = (HV *) sv_2mortal((SV *) newHV()); + + hv_store (buffer_hash_member, "type", 4, newSViv (ptr_buffer->type), 0); + hv_store (buffer_hash_member, "num_displayed", 13, newSViv (ptr_buffer->num_displayed), 0); + hv_store (buffer_hash_member, "server", 6, + newSVpv (ptr_buffer->server_name == NULL ? "" : ptr_buffer->server_name, 0), 0); + hv_store (buffer_hash_member, "channel", 7, + newSVpv (ptr_buffer->channel_name == NULL ? "" : ptr_buffer->channel_name, 0), 0); + hv_store (buffer_hash_member, "notify_level", 12, newSViv (ptr_buffer->notify_level), 0); + hv_store (buffer_hash_member, "log_filename", 12, + newSVpv (ptr_buffer->log_filename == NULL ? "" : ptr_buffer->log_filename, 0), 0); + + snprintf(conv, sizeof(conv), "%d", ptr_buffer->number); + hv_store (buffer_hash, conv, strlen(conv), newRV_inc((SV *) buffer_hash_member), 0); + } + perl_plugin->free_buffer_info (perl_plugin, buffer_info); + + ST (0) = newRV_inc((SV *) buffer_hash); + XSRETURN (1); +} + +/* + * weechat::get_buffer_data: get buffer content + */ + +static XS (XS_weechat_get_buffer_data) +{ + t_plugin_buffer_line *buffer_data, *ptr_data; + HV *data_list_member; + char *server, *channel; + int count; + + dXSARGS; + + /* make gcc happy */ + (void) cv; + (void) items; + + if (!perl_current_script) + { + perl_plugin->print_server (perl_plugin, + "Perl error: unable to get buffer data, " + "script not initialized"); + XSRETURN_EMPTY; + } + + if (items > 2) + { + perl_plugin->print_server (perl_plugin, + "Perl error: wrong parameters for " + "\"get_buffer_data\" function"); + XSRETURN_EMPTY; + } + + channel = NULL; + server = NULL; + + if (items >= 1) + server = SvPV (ST (0), PL_na); + if (items >= 2) + channel = SvPV (ST (1), PL_na); + + buffer_data = perl_plugin->get_buffer_data (perl_plugin, server, channel); + count = 0; + if (!buffer_data) + XSRETURN_EMPTY; + + for (ptr_data = buffer_data; ptr_data; ptr_data = ptr_data->next_line) + { + data_list_member = (HV *) sv_2mortal((SV *) newHV()); + + hv_store (data_list_member, "nick", 4, + newSVpv (ptr_data->nick == NULL ? "" : ptr_data->nick, 0), 0); + hv_store (data_list_member, "data", 4, + newSVpv (ptr_data->data == NULL ? "" : ptr_data->data, 0), 0); + + XPUSHs(newRV_inc((SV *) data_list_member)); + count++; + } + perl_plugin->free_buffer_data (perl_plugin, buffer_data); + + XSRETURN (count); +} + +/* * weechat_perl_xs_init: initialize subroutines */ @@ -1385,6 +1567,7 @@ weechat_perl_xs_init (pTHX) /* interface functions */ newXS ("weechat::register", XS_weechat_register, "weechat"); newXS ("weechat::print", XS_weechat_print, "weechat"); + newXS ("weechat::print_server", XS_weechat_print_server, "weechat"); newXS ("weechat::print_infobar", XS_weechat_print_infobar, "weechat"); newXS ("weechat::remove_infobar", XS_weechat_remove_infobar, "weechat"); newXS ("weechat::log", XS_weechat_log, "weechat"); @@ -1407,6 +1590,9 @@ weechat_perl_xs_init (pTHX) newXS ("weechat::get_nick_info", XS_weechat_get_nick_info, "weechat"); newXS ("weechat::input_color", XS_weechat_input_color, "weechat"); newXS ("weechat::get_irc_color", XS_weechat_get_irc_color, "weechat"); + newXS ("weechat::get_window_info", XS_weechat_get_window_info, "weechat"); + newXS ("weechat::get_buffer_info", XS_weechat_get_buffer_info, "weechat"); + newXS ("weechat::get_buffer_data", XS_weechat_get_buffer_data, "weechat"); /* interface constants */ stash = gv_stashpv ("weechat", TRUE); diff --git a/src/plugins/scripts/python/weechat-python.c b/src/plugins/scripts/python/weechat-python.c index fff32ca85..a54e6884f 100644 --- a/src/plugins/scripts/python/weechat-python.c +++ b/src/plugins/scripts/python/weechat-python.c @@ -268,6 +268,41 @@ weechat_python_print (PyObject *self, PyObject *args) } /* + * weechat_python_print_server: print message into a buffer server + */ + +static PyObject * +weechat_python_print_server (PyObject *self, PyObject *args) +{ + char *message; + + /* make gcc happy */ + (void) self; + + if (!python_current_script) + { + python_plugin->print_server (python_plugin, + "Python error: unable to print message (server), " + "script not initialized"); + return Py_BuildValue ("i", 0); + } + + message = NULL; + + if (!PyArg_ParseTuple (args, "s", &message)) + { + python_plugin->print_server (python_plugin, + "Python error: wrong parameters for " + "\"print_server\" function"); + return Py_BuildValue ("i", 0); + } + + python_plugin->print_server (python_plugin, "%s", message); + + return Py_BuildValue ("i", 1); +} + +/* * weechat_python_print_infobar: print message to infobar */ @@ -822,22 +857,9 @@ weechat_python_get_dcc_info (PyObject *self, PyObject *args) PyDict_SetItem(dcc_list_member, Py_BuildValue("s", "start_resume"), Py_BuildValue("k", ptr_dcc->start_resume)); PyDict_SetItem(dcc_list_member, Py_BuildValue("s", "cps"), - Py_BuildValue("k", ptr_dcc->bytes_per_sec)); + Py_BuildValue("k", ptr_dcc->bytes_per_sec)); - - if (PyList_Append(dcc_list, dcc_list_member) != 0) - { - Py_DECREF(dcc_list_member); - Py_DECREF(dcc_list); - python_plugin->free_dcc_info (python_plugin, dcc_info); - return Py_None; - } - } - else - { - Py_DECREF(dcc_list); - python_plugin->free_dcc_info (python_plugin, dcc_info); - return Py_None; + PyList_Append(dcc_list, dcc_list_member); } } @@ -864,7 +886,7 @@ weechat_python_get_config (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: unable to get config option, " "script not initialized"); - return Py_BuildValue ("i", 0); + return Py_None; } option = NULL; @@ -874,7 +896,7 @@ weechat_python_get_config (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: wrong parameters for " "\"get_config\" function"); - return Py_BuildValue ("i", 0); + return Py_None; } if (option) @@ -950,7 +972,7 @@ weechat_python_get_plugin_config (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: unable to get plugin config option, " "script not initialized"); - return Py_BuildValue ("i", 0); + return Py_None; } option = NULL; @@ -960,7 +982,7 @@ weechat_python_get_plugin_config (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: wrong parameters for " "\"get_plugin_config\" function"); - return Py_BuildValue ("i", 0); + return Py_None; } if (option) @@ -1042,7 +1064,7 @@ weechat_python_get_server_info (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: unable to get server infos, " "script not initialized"); - return Py_BuildValue ("i", 0); + return Py_None; } server_hash = PyDict_New (); @@ -1145,7 +1167,7 @@ weechat_python_get_channel_info (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: unable to get channel infos, " "script not initialized"); - return Py_BuildValue ("i", 0); + return Py_None; } server = NULL; @@ -1154,7 +1176,7 @@ weechat_python_get_channel_info (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: wrong parameters for " "\"get_channel_info\" function"); - return Py_BuildValue ("i", 0); + return Py_None; } channel_hash = PyDict_New (); @@ -1212,7 +1234,7 @@ weechat_python_get_nick_info (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: unable to get nick infos, " "script not initialized"); - return Py_BuildValue ("i", 0); + return Py_None; } server = NULL; @@ -1222,7 +1244,7 @@ weechat_python_get_nick_info (PyObject *self, PyObject *args) python_plugin->print_server (python_plugin, "Python error: wrong parameters for " "\"get_nick_info\" function"); - return Py_BuildValue ("i", 0); + return Py_None; } nick_hash = PyDict_New (); @@ -1291,6 +1313,184 @@ weechat_python_get_irc_color (PyObject *self, PyObject *args) } /* + * weechat_python_get_window_info: get infos about windows + */ + +static PyObject * +weechat_python_get_window_info (PyObject *self, PyObject *args) +{ + t_plugin_window_info *window_info, *ptr_window; + PyObject *window_list, *window_list_member; + + /* make gcc happy */ + (void) self; + (void) args; + + if (!python_current_script) + { + python_plugin->print_server (python_plugin, + "Python error: unable to get window info, " + "script not initialized"); + return Py_None; + } + + window_list = PyList_New (0); + if (!window_list) + return Py_None; + + window_info = python_plugin->get_window_info (python_plugin); + if (!window_info) + return window_list; + + for(ptr_window = window_info; ptr_window; ptr_window = ptr_window->next_window) + { + window_list_member = PyDict_New(); + + if (window_list_member) + { + PyDict_SetItem(window_list_member, Py_BuildValue("s", "num_buffer"), + Py_BuildValue("i", ptr_window->num_buffer)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_x"), + Py_BuildValue("i", ptr_window->win_x)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_y"), + Py_BuildValue("i", ptr_window->win_y)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_width"), + Py_BuildValue("i", ptr_window->win_width)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_height"), + Py_BuildValue("i", ptr_window->win_height)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_width_pct"), + Py_BuildValue("i", ptr_window->win_width_pct)); + PyDict_SetItem(window_list_member, Py_BuildValue("s", "win_height_pct"), + Py_BuildValue("i", ptr_window->win_height_pct)); + + PyList_Append(window_list, window_list_member); + } + } + + python_plugin->free_window_info(python_plugin, window_info); + + return window_list; +} + +/* + * weechat_python_get_buffer_info: get infos about buffers + */ + +static PyObject * +weechat_python_get_buffer_info (PyObject *self, PyObject *args) +{ + t_plugin_buffer_info *buffer_info, *ptr_buffer; + PyObject *buffer_hash, *buffer_hash_member; + + /* make gcc happy */ + (void) self; + (void) args; + + if (!python_current_script) + { + python_plugin->print_server (python_plugin, + "Python error: unable to get buffer info, " + "script not initialized"); + return Py_None; + } + + buffer_hash = PyDict_New (); + if (!buffer_hash) + return Py_None; + + buffer_info = python_plugin->get_buffer_info (python_plugin); + if (!buffer_info) + return buffer_hash; + + for(ptr_buffer = buffer_info; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) + { + buffer_hash_member = PyDict_New(); + + if (buffer_hash_member) + { + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "type"), + Py_BuildValue("i", ptr_buffer->type)); + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "num_displayed"), + Py_BuildValue("i", ptr_buffer->num_displayed)); + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "server"), + Py_BuildValue("s", ptr_buffer->server_name == NULL ? "" : ptr_buffer->server_name)); + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "channel"), + Py_BuildValue("s", ptr_buffer->channel_name == NULL ? "" : ptr_buffer->channel_name)); + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "notify_level"), + Py_BuildValue("i", ptr_buffer->notify_level)); + PyDict_SetItem(buffer_hash_member, Py_BuildValue("s", "log_filename"), + Py_BuildValue("s", ptr_buffer->log_filename == NULL ? "" : ptr_buffer->log_filename)); + + PyDict_SetItem(buffer_hash, + Py_BuildValue("i", ptr_buffer->number), buffer_hash_member); + } + } + + python_plugin->free_buffer_info(python_plugin, buffer_info); + + return buffer_hash; +} + +/* + * weechat_python_get_buffer_data: get buffer content + */ + +static PyObject * +weechat_python_get_buffer_data (PyObject *self, PyObject *args) +{ + t_plugin_buffer_line *buffer_data, *ptr_data; + PyObject *data_list, *data_list_member; + char *server, *channel; + + /* make gcc happy */ + (void) self; + (void) args; + + if (!python_current_script) + { + python_plugin->print_server (python_plugin, + "Python error: unable to get buffer data, " + "script not initialized"); + return Py_None; + } + + if (!PyArg_ParseTuple (args, "|ss", &server, &channel)) + { + python_plugin->print_server (python_plugin, + "Python error: wrong parameters for " + "\"get_buffer_data\" function"); + return Py_None; + } + + data_list = PyList_New (0); + if (!data_list) + return Py_None; + + buffer_data = python_plugin->get_buffer_data (python_plugin, server, channel); + if (!buffer_data) + return data_list; + + for(ptr_data = buffer_data; ptr_data; ptr_data = ptr_data->next_line) + { + data_list_member= PyDict_New(); + + if (data_list_member) + { + PyDict_SetItem(data_list_member, Py_BuildValue("s", "nick"), + Py_BuildValue("s", ptr_data->nick == NULL ? "" : ptr_data->nick)); + PyDict_SetItem(data_list_member, Py_BuildValue("s", "data"), + Py_BuildValue("s", ptr_data->data == NULL ? "" : ptr_data->data)); + + PyList_Append(data_list, data_list_member); + } + } + + python_plugin->free_buffer_data (python_plugin, buffer_data); + + return data_list; +} + +/* * Python subroutines */ @@ -1298,6 +1498,7 @@ static PyMethodDef weechat_python_funcs[] = { { "register", weechat_python_register, METH_VARARGS, "" }, { "prnt", weechat_python_print, METH_VARARGS, "" }, + { "print_server", weechat_python_print_server, METH_VARARGS, "" }, { "print_infobar", weechat_python_print_infobar, METH_VARARGS, "" }, { "remove_infobar", weechat_python_remove_infobar, METH_VARARGS, "" }, { "log", weechat_python_log, METH_VARARGS, "" }, @@ -1319,6 +1520,9 @@ PyMethodDef weechat_python_funcs[] = { { "get_channel_info", weechat_python_get_channel_info, METH_VARARGS, "" }, { "get_nick_info", weechat_python_get_nick_info, METH_VARARGS, "" }, { "get_irc_color", weechat_python_get_irc_color, METH_VARARGS, "" }, + { "get_window_info", weechat_python_get_window_info, METH_VARARGS, "" }, + { "get_buffer_info", weechat_python_get_buffer_info, METH_VARARGS, "" }, + { "get_buffer_data", weechat_python_get_buffer_data, METH_VARARGS, "" }, { NULL, NULL, 0, NULL } }; diff --git a/src/plugins/scripts/ruby/weechat-ruby.c b/src/plugins/scripts/ruby/weechat-ruby.c index aacee77d7..b813a5018 100644 --- a/src/plugins/scripts/ruby/weechat-ruby.c +++ b/src/plugins/scripts/ruby/weechat-ruby.c @@ -337,6 +337,44 @@ weechat_ruby_print (int argc, VALUE *argv, VALUE class) } /* + * weechat_ruby_print_server: print message into a buffer server + */ + +static VALUE +weechat_ruby_print_server (VALUE class, VALUE message) +{ + char *c_message; + + /* make gcc happy */ + (void) class; + + if (!ruby_current_script) + { + ruby_plugin->print_server (ruby_plugin, + "Ruby error: unable to print message, " + "script not initialized"); + return INT2FIX (0); + } + + c_message = NULL; + + if (NIL_P (message)) + { + ruby_plugin->print_server (ruby_plugin, + "Ruby error: wrong parameters for " + "\"print_server\" function"); + return INT2FIX (0); + } + + Check_Type (message, T_STRING); + c_message = STR2CSTR (message); + + ruby_plugin->print_server (ruby_plugin, "%s", c_message); + + return INT2FIX (1); +} + +/* * weechat_ruby_print_infobar: print message to infobar */ @@ -1024,20 +1062,8 @@ weechat_ruby_get_dcc_info (VALUE class) rb_hash_aset (dcc_list_member, rb_str_new2("cps"), INT2FIX(ptr_dcc->bytes_per_sec)); - if (NIL_P (rb_ary_push (dcc_list, dcc_list_member))) - { - rb_gc_unregister_address (&dcc_list_member); - rb_gc_unregister_address (&dcc_list); - ruby_plugin->free_dcc_info (ruby_plugin, dcc_info); - return Qnil; - } + rb_ary_push (dcc_list, dcc_list_member); } - else - { - rb_gc_unregister_address (&dcc_list); - ruby_plugin->free_dcc_info (ruby_plugin, dcc_info); - return Qnil; - } } ruby_plugin->free_dcc_info (ruby_plugin, dcc_info); @@ -1523,6 +1549,193 @@ weechat_ruby_get_irc_color (VALUE class, VALUE color) } /* + * weechat_ruby_get_window_info: get infos about windows + */ + +static VALUE +weechat_ruby_get_window_info (VALUE class) +{ + t_plugin_window_info *window_info, *ptr_window; + VALUE window_list, window_list_member; + + /* make gcc happy */ + (void) class; + + if (!ruby_current_script) + { + ruby_plugin->print_server (ruby_plugin, + "Ruby error: unable to get window info, " + "script not initialized"); + return INT2FIX (0); + } + + window_list = rb_ary_new(); + + if (NIL_P (window_list)) + return Qnil; + + window_info = ruby_plugin->get_window_info (ruby_plugin); + if (!window_info) + return window_list; + + for(ptr_window = window_info; ptr_window; ptr_window = ptr_window->next_window) + { + window_list_member = rb_hash_new (); + + if (!NIL_P (window_list_member)) + { + rb_hash_aset (window_list_member, rb_str_new2("num_buffer"), + INT2FIX(ptr_window->num_buffer)); + rb_hash_aset (window_list_member, rb_str_new2("win_x"), + INT2FIX(ptr_window->win_x)); + rb_hash_aset (window_list_member, rb_str_new2("win_y"), + INT2FIX(ptr_window->win_y)); + rb_hash_aset (window_list_member, rb_str_new2("win_width"), + INT2FIX(ptr_window->win_width)); + rb_hash_aset (window_list_member, rb_str_new2("win_height"), + INT2FIX(ptr_window->win_height)); + rb_hash_aset (window_list_member, rb_str_new2("win_width_pct"), + INT2FIX(ptr_window->win_width_pct)); + rb_hash_aset (window_list_member, rb_str_new2("win_height_pct"), + INT2FIX(ptr_window->win_height_pct)); + + rb_ary_push (window_list, window_list_member); + } + } + + ruby_plugin->free_window_info (ruby_plugin, window_info); + + return window_list; +} + +/* + * weechat_ruby_get_buffer_info: get infos about buffers + */ + +static VALUE +weechat_ruby_get_buffer_info (VALUE class) +{ + t_plugin_buffer_info *buffer_info, *ptr_buffer; + VALUE buffer_hash, buffer_hash_member; + + /* make gcc happy */ + (void) class; + + if (!ruby_current_script) + { + ruby_plugin->print_server (ruby_plugin, + "Ruby error: unable to get buffer info, " + "script not initialized"); + return INT2FIX (0); + } + + buffer_hash = rb_hash_new (); + if (!buffer_hash) + return Qnil; + + buffer_info = ruby_plugin->get_buffer_info (ruby_plugin); + if (!buffer_info) + return buffer_hash; + + for(ptr_buffer = buffer_info; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) + { + buffer_hash_member = rb_hash_new (); + + if (buffer_hash_member) + { + rb_hash_aset (buffer_hash_member, rb_str_new2("type"), + INT2FIX(ptr_buffer->type)); + rb_hash_aset (buffer_hash_member, rb_str_new2("num_displayed"), + INT2FIX(ptr_buffer->num_displayed)); + rb_hash_aset (buffer_hash_member, rb_str_new2("server"), + rb_str_new2(ptr_buffer->server_name == NULL ? "" : ptr_buffer->server_name)); + rb_hash_aset (buffer_hash_member, rb_str_new2("channel"), + rb_str_new2(ptr_buffer->channel_name == NULL ? "" : ptr_buffer->channel_name)); + rb_hash_aset (buffer_hash_member, rb_str_new2("notify_level"), + INT2FIX(ptr_buffer->notify_level)); + rb_hash_aset (buffer_hash_member, rb_str_new2("log_filename"), + rb_str_new2(ptr_buffer->log_filename == NULL ? "" : ptr_buffer->log_filename)); + + rb_hash_aset (buffer_hash, INT2FIX(ptr_buffer->number), buffer_hash_member); + } + } + + ruby_plugin->free_buffer_info(ruby_plugin, buffer_info); + + return buffer_hash; +} + +/* + * weechat_ruby_get_buffer_data: get buffer content + */ + +static VALUE +weechat_ruby_get_buffer_data (int argc, VALUE *argv, VALUE class) +{ + t_plugin_buffer_line *buffer_data, *ptr_data; + VALUE data_list, data_list_member; + VALUE server, channel; + char *c_server, *c_channel; + + /* make gcc happy */ + (void) class; + + if (!ruby_current_script) + { + ruby_plugin->print_server (ruby_plugin, + "Ruby error: unable to get buffer data, " + "script not initialized"); + return INT2FIX (0); + } + + server = Qnil; + channel = Qnil; + c_server = NULL; + c_channel = NULL; + + rb_scan_args (argc, argv, "02", &server, &channel); + + if (!NIL_P (server)) + { + Check_Type (server, T_STRING); + c_server = STR2CSTR (server); + } + + if (!NIL_P (channel)) + { + Check_Type (channel, T_STRING); + c_channel = STR2CSTR (channel); + } + + data_list = rb_ary_new(); + if (NIL_P (data_list)) + return Qnil; + + buffer_data = ruby_plugin->get_buffer_data (ruby_plugin, c_server, c_channel); + if (!buffer_data) + return data_list; + + for(ptr_data = buffer_data; ptr_data; ptr_data = ptr_data->next_line) + { + data_list_member = rb_hash_new (); + + if (!NIL_P (data_list_member)) + { + rb_hash_aset (data_list_member, rb_str_new2("nick"), + rb_str_new2(ptr_data->nick == NULL ? "" : ptr_data->nick)); + rb_hash_aset (data_list_member, rb_str_new2("data"), + rb_str_new2(ptr_data->data == NULL ? "" : ptr_data->data)); + + rb_ary_push (data_list, data_list_member); + } + } + + ruby_plugin->free_buffer_data (ruby_plugin, buffer_data); + + return data_list; +} + +/* * weechat_ruby_output : redirection for stdout and stderr */ @@ -1964,6 +2177,7 @@ weechat_plugin_init (t_weechat_plugin *plugin) rb_define_const(ruby_mWeechat, "PLUGIN_RC_OK_IGNORE_ALL", INT2NUM(PLUGIN_RC_OK_IGNORE_ALL)); rb_define_module_function (ruby_mWeechat, "register", weechat_ruby_register, 4); rb_define_module_function (ruby_mWeechat, "print", weechat_ruby_print, -1); + rb_define_module_function (ruby_mWeechat, "print_server", weechat_ruby_print_server, 1); rb_define_module_function (ruby_mWeechat, "print_infobar", weechat_ruby_print_infobar, 2); rb_define_module_function (ruby_mWeechat, "remove_infobar", weechat_ruby_remove_infobar, -1); rb_define_module_function (ruby_mWeechat, "log", weechat_ruby_log, -1); @@ -1985,7 +2199,10 @@ weechat_plugin_init (t_weechat_plugin *plugin) rb_define_module_function (ruby_mWeechat, "get_channel_info", weechat_ruby_get_channel_info, 1); rb_define_module_function (ruby_mWeechat, "get_nick_info", weechat_ruby_get_nick_info, 2); rb_define_module_function (ruby_mWeechat, "get_irc_color", weechat_ruby_get_irc_color, 1); - + rb_define_module_function (ruby_mWeechat, "get_window_info", weechat_ruby_get_window_info, 0); + rb_define_module_function (ruby_mWeechat, "get_buffer_info", weechat_ruby_get_buffer_info, 0); + rb_define_module_function (ruby_mWeechat, "get_buffer_data", weechat_ruby_get_buffer_data, -1); + /* redirect stdin and stdout */ ruby_mWeechatOutputs = rb_define_module("WeechatOutputs"); rb_define_singleton_method(ruby_mWeechatOutputs, "write", weechat_ruby_output, 1); |