summaryrefslogtreecommitdiff
path: root/src/plugins/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/scripts')
-rw-r--r--src/plugins/scripts/Makefile.am2
-rw-r--r--src/plugins/scripts/ruby/weechat-ruby.c787
2 files changed, 469 insertions, 320 deletions
diff --git a/src/plugins/scripts/Makefile.am b/src/plugins/scripts/Makefile.am
index 3ff3b4501..33b70f985 100644
--- a/src/plugins/scripts/Makefile.am
+++ b/src/plugins/scripts/Makefile.am
@@ -31,7 +31,7 @@ python_dir = python
endif
if PLUGIN_RUBY
-#ruby_dir = ruby
+ruby_dir = ruby
endif
SUBDIRS = . $(perl_dir) $(python_dir) $(ruby_dir)
diff --git a/src/plugins/scripts/ruby/weechat-ruby.c b/src/plugins/scripts/ruby/weechat-ruby.c
index b517aa1f2..e11f9cc96 100644
--- a/src/plugins/scripts/ruby/weechat-ruby.c
+++ b/src/plugins/scripts/ruby/weechat-ruby.c
@@ -29,26 +29,72 @@
#include "../weechat-script.h"
+char plugin_name[] = "Ruby";
+char plugin_version[] = "0.1";
+char plugin_description[] = "Ruby scripts support";
+
+t_weechat_plugin *ruby_plugin;
+
t_plugin_script *ruby_scripts = NULL;
-t_plugin_script *last_ruby_script = NULL;
+t_plugin_script *ruby_current_script = NULL;
+char *ruby_current_script_filename = NULL;
+
+
+/*
+ * weechat_ruby_exec: execute a Ruby script
+ */
+
+int
+weechat_ruby_exec (t_weechat_plugin *plugin,
+ t_plugin_script *script,
+ char *function, char *server, char *arguments)
+{
+ /* make gcc happy */
+ (void) plugin;
+ (void) script;
+ (void) function;
+ (void) server;
+ (void) arguments;
+
+ /* TODO: exec Ruby script */
+ return 0;
+}
+/*
+ * weechat_ruby_handler: general message and command handler for Ruby
+ */
+
+int
+weechat_ruby_handler (t_weechat_plugin *plugin,
+ char *server, char *command, char *arguments,
+ char *handler_args, void *handler_pointer)
+{
+ /* make gcc happy */
+ (void) command;
+
+ weechat_ruby_exec (plugin, (t_plugin_script *)handler_pointer,
+ handler_args, server, arguments);
+ return 1;
+}
/*
- * register: startup function for all WeeChat Ruby scripts
+ * weechat_ruby_register: startup function for all WeeChat Ruby scripts
*/
static VALUE
-wee_ruby_register (VALUE class, VALUE name, VALUE version, VALUE shutdown_func, VALUE description)
+weechat_ruby_register (VALUE class, VALUE name, VALUE version,
+ VALUE shutdown_func, VALUE description)
{
char *c_name, *c_version, *c_shutdown_func, *c_description;
- t_plugin_script *ptr_ruby_script, *ruby_script_found, *new_ruby_script;
+
+ /* make gcc happy */
+ (void) class;
if (NIL_P (name) || NIL_P (version) || NIL_P (shutdown_func) || NIL_P (description))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "register");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"register\" function");
return Qnil;
}
@@ -62,70 +108,55 @@ wee_ruby_register (VALUE class, VALUE name, VALUE version, VALUE shutdown_func,
c_shutdown_func = STR2CSTR (shutdown_func);
c_description = STR2CSTR (description);
- ruby_script_found = NULL;
- for (ptr_ruby_script = ruby_scripts; ptr_ruby_script;
- ptr_ruby_script = ptr_ruby_script->next_script)
+ if (weechat_script_search (ruby_plugin, &ruby_scripts, c_name))
{
- if (ascii_strcasecmp (ptr_ruby_script->name, c_name) == 0)
- {
- ruby_script_found = ptr_ruby_script;
- break;
- }
+ /* error: another scripts already exists with this name! */
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: unable to register "
+ "\"%s\" script (another script "
+ "already exists with this name)",
+ c_name);
+ return Qnil;
}
- if (ruby_script_found)
+ /* register script */
+ ruby_current_script = weechat_script_add (ruby_plugin,
+ &ruby_scripts,
+ (ruby_current_script_filename) ?
+ ruby_current_script_filename : "",
+ c_name, c_version, c_shutdown_func,
+ c_description);
+ if (ruby_current_script)
{
- /* error: another script already exists with this name! */
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: unable to register \"%s\" script (another script "
- "already exists with this name)\n"),
- "Ruby", name);
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby: registered script \"%s\", "
+ "version %s (%s)",
+ c_name, c_version, c_description);
}
else
{
- /* registering script */
- new_ruby_script = (t_plugin_script *)malloc (sizeof (t_plugin_script));
- if (new_ruby_script)
- {
- new_ruby_script->name = strdup (c_name);
- new_ruby_script->version = strdup (c_version);
- new_ruby_script->shutdown_func = strdup (c_shutdown_func);
- new_ruby_script->description = strdup (c_description);
-
- /* add new script to list */
- new_ruby_script->prev_script = last_ruby_script;
- new_ruby_script->next_script = NULL;
- if (ruby_scripts)
- last_ruby_script->next_script = new_ruby_script;
- else
- ruby_scripts = new_ruby_script;
- last_ruby_script = new_ruby_script;
-
- wee_log_printf (_("Registered %s script: \"%s\", version %s (%s)\n"),
- "Ruby", c_name, c_version, c_description);
- }
- else
- {
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: unable to load script \"%s\" (not enough memory)\n"),
- "Ruby", c_name);
- }
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: unable to load script "
+ "\"%s\" (not enough memory)",
+ c_name);
+ return Qnil;
}
- return Qnil;
+ return INT2FIX (1);
}
/*
- * print: print message into a buffer (current or specified one)
+ * weechat_ruby_print: print message into a buffer (current or specified one)
*/
static VALUE
-wee_ruby_print (VALUE class, VALUE message, VALUE channel_name, VALUE server_name)
+weechat_ruby_print (VALUE class, VALUE message, VALUE channel_name,
+ VALUE server_name)
{
char *c_message, *c_channel_name, *c_server_name;
- t_gui_buffer *ptr_buffer;
+
+ /* make gcc happy */
+ (void) class;
c_message = NULL;
c_channel_name = NULL;
@@ -133,10 +164,9 @@ wee_ruby_print (VALUE class, VALUE message, VALUE channel_name, VALUE server_nam
if (NIL_P (message))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "print");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"print\" function");
return Qnil;
}
@@ -152,38 +182,35 @@ wee_ruby_print (VALUE class, VALUE message, VALUE channel_name, VALUE server_nam
if (!NIL_P (server_name))
c_server_name = STR2CSTR (server_name);
- ptr_buffer = plugin_find_buffer (c_server_name, c_channel_name);
- if (ptr_buffer)
- {
- irc_display_prefix (ptr_buffer, PREFIX_PLUGIN);
- gui_printf (ptr_buffer, "%s\n", c_message);
- return INT2FIX (1);
- }
+ ruby_plugin->printf (ruby_plugin,
+ c_server_name, c_channel_name,
+ "%s", c_message);
- /* buffer not found */
- return INT2FIX (0);
+ return INT2FIX (1);
}
/*
- * print_infobar: print message to infobar
+ * weechat_ruby_print_infobar: print message to infobar
*/
static VALUE
-wee_ruby_print_infobar (VALUE class, VALUE delay, VALUE message)
+weechat_ruby_print_infobar (VALUE class, VALUE delay, VALUE message)
{
int c_delay;
char *c_message;
+
+ /* make gcc happy */
+ (void) class;
c_delay = 1;
c_message = NULL;
if (NIL_P (delay) || NIL_P (message))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "print_infobar");
- return Qfalse;
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"print_infobar\" function");
+ return Qnil;
}
Check_Type (delay, T_FIXNUM);
@@ -192,20 +219,23 @@ wee_ruby_print_infobar (VALUE class, VALUE delay, VALUE message)
c_delay = FIX2INT (delay);
c_message = STR2CSTR (message);
- gui_infobar_printf (delay, COLOR_WIN_INFOBAR, c_message);
+ ruby_plugin->infobar_printf (ruby_plugin, c_delay, c_message);
- return Qtrue;
+ return INT2FIX (1);
}
/*
- * command: send command to server
+ * weechat_ruby_command: send command to server
*/
static VALUE
-wee_ruby_command (VALUE class, VALUE command, VALUE channel_name, VALUE server_name)
+weechat_ruby_command (VALUE class, VALUE command, VALUE channel_name,
+ VALUE server_name)
{
char *c_command, *c_channel_name, *c_server_name;
- t_gui_buffer *ptr_buffer;
+
+ /* make gcc happy */
+ (void) class;
c_command = NULL;
c_channel_name = NULL;
@@ -213,10 +243,9 @@ wee_ruby_command (VALUE class, VALUE command, VALUE channel_name, VALUE server_n
if (NIL_P (command))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "command");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"command\" function");
return Qnil;
}
@@ -232,32 +261,33 @@ wee_ruby_command (VALUE class, VALUE command, VALUE channel_name, VALUE server_n
if (!NIL_P (server_name))
c_server_name = STR2CSTR (server_name);
- ptr_buffer = plugin_find_buffer (c_server_name, c_channel_name);
- if (ptr_buffer)
- {
- user_command (SERVER(ptr_buffer), ptr_buffer, c_command);
- return INT2FIX (1);
- }
-
- /* buffer not found */
- return INT2FIX (0);
+ ruby_plugin->exec_command (ruby_plugin,
+ c_server_name, c_channel_name,
+ c_command);
+
+ return INT2FIX (1);
}
/*
- * add_message_handler: add handler for messages
+ * weechat_ruby_add_message_handler: add handler for messages
*/
static VALUE
-wee_ruby_add_message_handler (VALUE class, VALUE message, VALUE function)
+weechat_ruby_add_message_handler (VALUE class, VALUE message, VALUE function)
{
char *c_message, *c_function;
+ /* make gcc happy */
+ (void) class;
+
+ c_message = NULL;
+ c_function = NULL;
+
if (NIL_P (message) || NIL_P (function))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "add_message_handler");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"add_message_handler\" function");
return Qnil;
}
@@ -267,137 +297,137 @@ wee_ruby_add_message_handler (VALUE class, VALUE message, VALUE function)
c_message = STR2CSTR (message);
c_function = STR2CSTR (function);
- plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler,
- PLUGIN_TYPE_RUBY, c_message, c_function);
+ if (ruby_current_script)
+ ruby_plugin->msg_handler_add (ruby_plugin, c_message,
+ weechat_ruby_handler, c_function,
+ (void *)ruby_current_script);
+ else
+ {
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: unable to add message handler, "
+ "script not initialized");
+ return Qnil;
+ }
- return Qtrue;
+ return INT2FIX (1);
}
/*
- * add_command_handler: define/redefines commands
+ * weechat_add_command_handler: define/redefines commands
*/
static VALUE
-wee_ruby_add_command_handler (VALUE class, VALUE name, VALUE function)
+weechat_ruby_add_command_handler (VALUE class, VALUE command, VALUE function,
+ VALUE description, VALUE arguments,
+ VALUE arguments_description)
{
- char *c_name, *c_function;
- t_plugin_handler *ptr_plugin_handler;
+ char *c_command, *c_function,*c_description, *c_arguments;
+ char *c_arguments_description;
+
+ /* make gcc happy */
+ (void) class;
+
+ c_command = NULL;
+ c_function = NULL;
+ c_description = NULL;
+ c_arguments = NULL;
+ c_arguments_description = NULL;
- if (NIL_P (name) || NIL_P (function))
+ if (NIL_P (command) || NIL_P (function))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "add_command_handler");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"add_command_handler\" function");
return Qnil;
}
- Check_Type (name, T_STRING);
+ Check_Type (command, T_STRING);
Check_Type (function, T_STRING);
+ if (!NIL_P (description))
+ Check_Type (description, T_STRING);
+ if (!NIL_P (arguments))
+ Check_Type (arguments, T_STRING);
+ if (!NIL_P (arguments_description))
+ Check_Type (arguments_description, T_STRING);
- c_name = STR2CSTR (name);
+ c_command = STR2CSTR (command);
c_function = STR2CSTR (function);
-
- if (!weelist_search (index_commands, c_name))
- weelist_add (&index_commands, &last_index_command, c_name);
-
- ptr_plugin_handler = plugin_handler_search (plugin_cmd_handlers, c_name);
- if (ptr_plugin_handler)
+ if (!NIL_P (description))
+ c_description = STR2CSTR (description);
+ if (!NIL_P (arguments))
+ c_arguments = STR2CSTR (arguments);
+ if (!NIL_P (arguments_description))
+ c_arguments_description = STR2CSTR (arguments_description);
+
+ if (ruby_current_script)
+ ruby_plugin->cmd_handler_add (ruby_plugin,
+ c_command,
+ c_description,
+ c_arguments,
+ c_arguments_description,
+ weechat_ruby_handler,
+ c_function,
+ (void *)ruby_current_script);
+ else
{
- free (ptr_plugin_handler->function_name);
- ptr_plugin_handler->function_name = strdup (c_function);
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: unable to add command handler, "
+ "script not initialized");
+ return Qnil;
}
- else
- plugin_handler_add (&plugin_cmd_handlers, &last_plugin_cmd_handler,
- PLUGIN_TYPE_PYTHON, c_name, c_function);
- return Qtrue;
+ return INT2FIX (1);
}
/*
- * get_info: get various infos
+ * weechat_ruby_get_info: get various infos
*/
static VALUE
-wee_ruby_get_info (VALUE class, VALUE arg, VALUE server_name)
+weechat_ruby_get_info (VALUE class, VALUE arg, VALUE server_name,
+ VALUE channel_name)
{
- char *c_arg, *info, *c_server_name;
- t_irc_server *ptr_server;
+ char *c_arg, *c_server_name, *c_channel_name, *info;
+ VALUE return_value;
+
+ /* make gcc happy */
+ (void) class;
+
+ c_arg = NULL;
+ c_server_name = NULL;
+ c_channel_name = NULL;
if (NIL_P (arg))
{
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: wrong parameters for \"%s\" function\n"),
- "Ruby", "get_info");
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"get_info\" function");
return Qnil;
}
Check_Type (arg, T_STRING);
if (!NIL_P (server_name))
Check_Type (server_name, T_STRING);
+ if (!NIL_P (channel_name))
+ Check_Type (channel_name, T_STRING);
c_arg = STR2CSTR (arg);
if (!NIL_P (server_name))
c_server_name = STR2CSTR (server_name);
+ if (!NIL_P (channel_name))
+ c_channel_name = STR2CSTR (channel_name);
- if (c_server_name == NULL)
- {
- ptr_server = SERVER(gui_current_window->buffer);
- }
- else
- {
- for (ptr_server = irc_servers; ptr_server; ptr_server = ptr_server->next_server)
- {
- if (ascii_strcasecmp (ptr_server->name, c_server_name) == 0)
- break;
- }
- if (!ptr_server)
- {
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: server not found for \"%s\" function\n"),
- "Ruby", "get_info");
- return Qnil;
- }
- }
-
- if (ptr_server && c_arg)
+ if (c_arg)
{
- if ( (ascii_strcasecmp (c_arg, "0") == 0) || (ascii_strcasecmp (c_arg, "version") == 0) )
- {
- info = PACKAGE_STRING;
- }
- else if ( (ascii_strcasecmp (c_arg, "1") == 0) || (ascii_strcasecmp (c_arg, "nick") == 0) )
- {
- if (ptr_server->nick)
- info = ptr_server->nick;
- }
- else if ( (ascii_strcasecmp (c_arg, "2") == 0) || (ascii_strcasecmp (c_arg, "channel") == 0) )
- {
- if (BUFFER_IS_CHANNEL (gui_current_window->buffer))
- info = CHANNEL (gui_current_window->buffer)->name;
- }
- else if ( (ascii_strcasecmp (c_arg, "3") == 0) || (ascii_strcasecmp (c_arg, "server") == 0) )
- {
- if (ptr_server->name)
- info = ptr_server->name;
- }
- else if ( (ascii_strcasecmp (c_arg, "4") == 0) || (ascii_strcasecmp (c_arg, "weechatdir") == 0) )
- {
- info = weechat_home;
- }
- else if ( (ascii_strcasecmp (c_arg, "5") == 0) || (ascii_strcasecmp (c_arg, "away") == 0) )
- {
- return INT2FIX (SERVER(gui_current_window->buffer)->is_away);
- }
- else if ( (ascii_strcasecmp (c_arg, "100") == 0) || (ascii_strcasecmp (c_arg, "dccs") == 0) )
- {
- /* TODO: build dcc list */
- }
+ info = ruby_plugin->get_info (ruby_plugin, c_arg,
+ c_server_name, c_channel_name);
if (info)
- return rb_str_new2 (info);
+ {
+ return_value = rb_str_new2 (info);
+ free (info);
+ return return_value;
+ }
else
return rb_str_new2 ("");
}
@@ -406,194 +436,313 @@ wee_ruby_get_info (VALUE class, VALUE arg, VALUE server_name)
}
/*
- * Ruby subroutines
- */
-
-/*
- * wee_ruby_init: initialize Ruby interface for WeeChat
+ * weechat_ruby_get_dcc_info: get infos about DCC
*/
-void
-wee_ruby_init ()
+static VALUE
+weechat_ruby_get_dcc_info (VALUE class)
{
-
- /* TODO: init Ruby environment */
- /* ruby_init ();
- if ()
- {
- irc_display_prefix (NULL, PREFIX_PLUGIN);
- gui_printf (NULL, _("%s error: error while launching interpreter\n"),
- "Ruby");
- }
- else
- {
- wee_log_printf (_("Loading %s module \"weechat\"\n"), "Ruby");
- }*/
+ /* make gcc happy */
+ (void) class;
+
+ /* TODO: get dcc info for Ruby */
+ return INT2FIX (1);
}
/*
- * wee_ruby_search: search a (loaded) Ruby script by name
+ * weechat_ruby_get_config: get value of a config option
*/
-t_plugin_script *
-wee_ruby_search (char *name)
+static VALUE
+weechat_ruby_get_config (VALUE class, VALUE option)
{
- t_plugin_script *ptr_ruby_script;
+ char *c_option, *value;
+ VALUE return_value;
+
+ /* make gcc happy */
+ (void) class;
- for (ptr_ruby_script = ruby_scripts; ptr_ruby_script;
- ptr_ruby_script = ptr_ruby_script->next_script)
+ c_option = NULL;
+
+ if (NIL_P (option))
+ {
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby error: wrong parameters for "
+ "\"get_config\" function");
+ return Qnil;
+ }
+
+ Check_Type (option, T_STRING);
+ c_option = STR2CSTR (option);
+
+ if (c_option)
{
- if (strcmp (ptr_ruby_script->name, name) == 0)
- return ptr_ruby_script;
+ value = ruby_plugin->get_config (ruby_plugin, c_option);
+
+ if (value)
+ {
+ return_value = rb_str_new2 (value);
+ free (value);
+ return return_value;
+ }
+ else
+ return rb_str_new2 ("");
}
- /* script not found */
- return NULL;
+ return INT2FIX (1);
}
/*
- * wee_ruby_exec: execute a Ruby script
+ * Ruby subroutines
*/
-int
-wee_ruby_exec (char *function, char *server, char *arguments)
-{
- /* TODO: exec Ruby script */
-}
+/* TODO: write Ruby functions interface */
/*
- * wee_ruby_load: load a Ruby script
+ * weechat_ruby_load: load a Ruby script
*/
int
-wee_ruby_load (char *filename)
+weechat_ruby_load (t_weechat_plugin *plugin, char *filename)
{
- FILE *fp;
+ /* make gcc happy */
+ (void) plugin;
+ (void) filename;
/* TODO: load & exec Ruby script */
- gui_printf (NULL, "Ruby scripts not developed!\n");
- /* execute Ruby script */
- /*wee_log_printf (_("Loading %s script \"%s\"\n"), "Ruby", filename);
- irc_display_prefix (NULL, PREFIX_PLUGIN);
- gui_printf (NULL, _("Loading %s script \"%s\"\n"), "Ruby", filename);
-
- if ((fp = fopen (filename, "r")) == NULL)
- {
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: error while opening file \"%s\"\n"),
- "Ruby", filename);
- return 1;
- }
-
- if (xxxxxxx (fp, filename) != 0)
- {
- irc_display_prefix (NULL, PREFIX_ERROR);
- gui_printf (NULL,
- _("%s error: error while parsing file \"%s\"\n"),
- "Ruby", filename);
- return 1;
- }
-
- fclose (fp);
- return 0;*/
+ return 0;
}
/*
- * wee_ruby_script_free: free a Ruby script
+ * weechat_ruby_unload: unload a Ruby script
*/
void
-wee_ruby_script_free (t_plugin_script *ptr_ruby_script)
+weechat_ruby_unload (t_weechat_plugin *plugin, t_plugin_script *script)
{
- t_plugin_script *new_ruby_scripts;
+ /* make gcc happy */
+ (void) plugin;
+ (void) script;
+
+ /* TODO: unload a Ruby script */
+}
- /* remove script from list */
- if (last_ruby_script == ptr_ruby_script)
- last_ruby_script = ptr_ruby_script->prev_script;
- if (ptr_ruby_script->prev_script)
- {
- (ptr_ruby_script->prev_script)->next_script = ptr_ruby_script->next_script;
- new_ruby_scripts = ruby_scripts;
- }
- else
- new_ruby_scripts = ptr_ruby_script->next_script;
-
- if (ptr_ruby_script->next_script)
- (ptr_ruby_script->next_script)->prev_script = ptr_ruby_script->prev_script;
-
- /* free data */
- if (ptr_ruby_script->name)
- free (ptr_ruby_script->name);
- if (ptr_ruby_script->version)
- free (ptr_ruby_script->version);
- if (ptr_ruby_script->shutdown_func)
- free (ptr_ruby_script->shutdown_func);
- if (ptr_ruby_script->description)
- free (ptr_ruby_script->description);
- free (ptr_ruby_script);
- ruby_scripts = new_ruby_scripts;
+/*
+ * weechat_ruby_unload_name: unload a Ruby script by name
+ */
+
+void
+weechat_ruby_unload_name (t_weechat_plugin *plugin, char *name)
+{
+ /* make gcc happy */
+ (void) plugin;
+ (void) name;
+
+ /* TODO: unload a Ruby script by name */
}
/*
- * wee_ruby_unload: unload a Ruby script
+ * weechat_ruby_unload_all: unload all Ruby scripts
*/
void
-wee_ruby_unload (t_plugin_script *ptr_ruby_script)
+weechat_ruby_unload_all (t_weechat_plugin *plugin)
{
- if (ptr_ruby_script)
+ /* make gcc happy */
+ (void) plugin;
+
+ /* TODO: unload all Ruby scripts */
+}
+
+/*
+ * weechat_ruby_cmd: /ruby command handler
+ */
+
+int
+weechat_ruby_cmd (t_weechat_plugin *plugin,
+ char *server, char *command, char *arguments,
+ char *handler_args, void *handler_pointer)
+{
+ int argc, path_length, handler_found;
+ char **argv, *path_script, *dir_home;
+ t_plugin_script *ptr_plugin_script;
+ t_plugin_msg_handler *ptr_msg_handler;
+ t_plugin_cmd_handler *ptr_cmd_handler;
+
+ /* make gcc happy */
+ (void) server;
+ (void) command;
+ (void) handler_args;
+ (void) handler_pointer;
+
+ if (arguments)
+ argv = plugin->explode_string (plugin, arguments, " ", 0, &argc);
+ else
{
- wee_log_printf (_("Unloading %s script \"%s\"\n"),
- "Ruby", ptr_ruby_script->name);
-
- /* call shutdown callback function */
- if (ptr_ruby_script->shutdown_func[0])
- wee_ruby_exec (ptr_ruby_script->shutdown_func, "", "");
- wee_ruby_script_free (ptr_ruby_script);
+ argv = NULL;
+ argc = 0;
+ }
+
+ switch (argc)
+ {
+ case 0:
+ /* list registered Ruby scripts */
+ plugin->printf_server (plugin, "");
+ plugin->printf_server (plugin, "Registered Ruby scripts:");
+ if (ruby_scripts)
+ {
+ for (ptr_plugin_script = ruby_scripts; ptr_plugin_script;
+ ptr_plugin_script = ptr_plugin_script->next_script)
+ {
+ plugin->printf_server (plugin, " %s v%s%s%s",
+ ptr_plugin_script->name,
+ ptr_plugin_script->version,
+ (ptr_plugin_script->description[0]) ? " - " : "",
+ ptr_plugin_script->description);
+ }
+ }
+ else
+ plugin->printf_server (plugin, " (none)");
+
+ /* list Ruby message handlers */
+ plugin->printf_server (plugin, "");
+ plugin->printf_server (plugin, "Ruby message handlers:");
+ handler_found = 0;
+ for (ptr_msg_handler = plugin->msg_handlers; ptr_msg_handler;
+ ptr_msg_handler = ptr_msg_handler->next_handler)
+ {
+ if (ptr_msg_handler->msg_handler_args)
+ {
+ handler_found = 1;
+ plugin->printf_server (plugin, " IRC(%s) => Ruby(%s)",
+ ptr_msg_handler->irc_command,
+ ptr_msg_handler->msg_handler_args);
+ }
+ }
+ if (!handler_found)
+ plugin->printf_server (plugin, " (none)");
+
+ /* list Ruby command handlers */
+ plugin->printf_server (plugin, "");
+ plugin->printf_server (plugin, "Ruby command handlers:");
+ handler_found = 0;
+ for (ptr_cmd_handler = plugin->cmd_handlers; ptr_cmd_handler;
+ ptr_cmd_handler = ptr_cmd_handler->next_handler)
+ {
+ if (ptr_cmd_handler->cmd_handler_args)
+ {
+ handler_found = 1;
+ plugin->printf_server (plugin, " /%s => Ruby(%s)",
+ ptr_cmd_handler->command,
+ ptr_cmd_handler->cmd_handler_args);
+ }
+ }
+ if (!handler_found)
+ plugin->printf_server (plugin, " (none)");
+ break;
+ case 1:
+ if (plugin->ascii_strcasecmp (plugin, argv[0], "autoload") == 0)
+ weechat_script_auto_load (plugin, "ruby", weechat_ruby_load);
+ else if (plugin->ascii_strcasecmp (plugin, argv[0], "reload") == 0)
+ {
+ weechat_ruby_unload_all (plugin);
+ weechat_script_auto_load (plugin, "ruby", weechat_ruby_load);
+ }
+ else if (plugin->ascii_strcasecmp (plugin, argv[0], "unload") == 0)
+ weechat_ruby_unload_all (plugin);
+ break;
+ case 2:
+ if (plugin->ascii_strcasecmp (plugin, argv[0], "load") == 0)
+ {
+ /* load Ruby script */
+ if ((strstr (argv[1], "/")) || (strstr (argv[1], "\\")))
+ path_script = NULL;
+ else
+ {
+ dir_home = plugin->get_info (plugin, "weechat_dir", NULL, NULL);
+ if (dir_home)
+ {
+ path_length = strlen (dir_home) + strlen (argv[1]) + 16;
+ path_script = (char *) malloc (path_length * sizeof (char));
+ if (path_script)
+ snprintf (path_script, path_length, "%s/ruby/%s",
+ dir_home, argv[1]);
+ else
+ path_script = NULL;
+ free (dir_home);
+ }
+ else
+ path_script = NULL;
+ }
+ weechat_ruby_load (plugin, (path_script) ? path_script : argv[1]);
+ if (path_script)
+ free (path_script);
+ }
+ else if (plugin->ascii_strcasecmp (plugin, argv[0], "unload") == 0)
+ {
+ /* unload Ruby script */
+ weechat_ruby_unload_name (plugin, argv[1]);
+ }
+ else
+ {
+ plugin->printf_server (plugin,
+ "Ruby error: unknown option for "
+ "\"ruby\" command");
+ }
+ break;
+ default:
+ plugin->printf_server (plugin,
+ "Ruby error: wrong argument count for \"ruby\" command");
}
+
+ if (argv)
+ plugin->free_exploded_string (plugin, argv);
+
+ return 1;
}
/*
- * wee_ruby_unload_all: unload all Ruby scripts
+ * weechat_plugin_init: initialize Ruby plugin
*/
-void
-wee_ruby_unload_all ()
+int
+weechat_plugin_init (t_weechat_plugin *plugin)
{
- wee_log_printf (_("Unloading all %s scripts...\n"), "Ruby");
- while (ruby_scripts)
- wee_ruby_unload (ruby_scripts);
+ ruby_plugin = plugin;
+
+ plugin->printf_server (plugin, "Loading Ruby module \"weechat\"");
+
+ /* TODO: initialize Ruby interpreter */
+
+
+ plugin->cmd_handler_add (plugin, "ruby",
+ "list/load/unload Ruby scripts",
+ "[load filename] | [autoload] | [reload] | [unload]",
+ "filename: Ruby script (file) to load\n\n"
+ "Without argument, /ruby command lists all loaded Ruby scripts.",
+ weechat_ruby_cmd, NULL, NULL);
+
+ plugin->mkdir_home (plugin, "ruby");
+ plugin->mkdir_home (plugin, "ruby/autoload");
- irc_display_prefix (NULL, PREFIX_PLUGIN);
- gui_printf (NULL, _("%s scripts unloaded\n"), "Ruby");
+ weechat_script_auto_load (plugin, "ruby", weechat_ruby_load);
+
+ return 1;
}
/*
- * wee_ruby_end: shutdown Ruby interface
+ * weechat_plugin_end: shutdown Ruby interface
*/
void
-wee_ruby_end ()
+weechat_plugin_end (t_weechat_plugin *plugin)
{
/* unload all scripts */
- wee_ruby_unload_all ();
-
- /* free all handlers */
- plugin_handler_free_all_type (&plugin_msg_handlers,
- &last_plugin_msg_handler,
- PLUGIN_TYPE_RUBY);
- plugin_handler_free_all_type (&plugin_cmd_handlers,
- &last_plugin_cmd_handler,
- PLUGIN_TYPE_RUBY);
-
- /* TODO: free Ruby interpreter */
- /* free Ruby interpreter */
- /* xxxxx ();
- if ()
- {
- irc_display_prefix (NULL, PREFIX_PLUGIN);
- gui_printf (NULL, _("%s error: error while freeing interpreter\n"),
- "Ruby");
- }*/
+ weechat_ruby_unload_all (plugin);
+
+ /* TODO: free interpreter */
+
+
+ ruby_plugin->printf_server (ruby_plugin,
+ "Ruby plugin ended");
}