diff --git a/.travis.yml b/.travis.yml index bd2b1d6ae..da61f4b7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,7 +15,7 @@ env: before_script: - echo 'APT::Install-Recommends "false";' | sudo tee -a /etc/apt/apt.conf - sudo apt-get update -qq - - sudo apt-get -y install devscripts equivs python-pip libenchant-dev autopoint asciidoc source-highlight xsltproc docbook-xsl docbook-xml cmake pkg-config libncursesw5-dev gem2deb libperl-dev python-dev python3-dev libaspell-dev liblua5.1-0-dev tcl8.5-dev guile-2.0-dev libcurl4-gnutls-dev libgcrypt11-dev libgnutls-dev zlib1g-dev curl + - sudo apt-get -y install devscripts equivs python-pip libenchant-dev autopoint asciidoc source-highlight xsltproc docbook-xsl docbook-xml cmake pkg-config libncursesw5-dev gem2deb libperl-dev python-dev python3-dev libaspell-dev liblua5.1-0-dev tcl8.5-dev guile-2.0-dev libv8-dev libcurl4-gnutls-dev libgcrypt11-dev libgnutls-dev zlib1g-dev curl - curl -OL https://weechat.org/files/tests/ubuntu/precise/amd64/libcpputest-dev_3.4-3_amd64.deb - sudo dpkg -i libcpputest-dev_3.4-3_amd64.deb - sudo pip install msgcheck pylint diff --git a/AUTHORS.asciidoc b/AUTHORS.asciidoc index 806ad3f29..91eb62215 100644 --- a/AUTHORS.asciidoc +++ b/AUTHORS.asciidoc @@ -46,6 +46,7 @@ Alphabetically: * Jim Ramsay (lack) * Jiri Golembiovsky (GolemJ) * Julien Louis (ptitlouis) +* Koka El Kiwi (KiwiDash) * Krzysztof Koroscik (soltys) * Kyle Fuller (kylef) * Lázaro A. diff --git a/CMakeLists.txt b/CMakeLists.txt index aff740ff2..b94424e9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,33 +74,34 @@ else() set(INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) endif() -option(ENABLE_NCURSES "Enable Ncurses interface" ON) -option(ENABLE_NLS "Enable Native Language Support" ON) -option(ENABLE_GNUTLS "Enable SSLv3/TLS support" ON) -option(ENABLE_LARGEFILE "Enable Large File Support" ON) -option(ENABLE_ALIAS "Enable Alias plugin" ON) -option(ENABLE_ASPELL "Enable Aspell plugin" ON) -option(ENABLE_ENCHANT "Enable Enchant lib for Aspell plugin" OFF) -option(ENABLE_CHARSET "Enable Charset plugin" ON) -option(ENABLE_EXEC "Enable Exec plugin" ON) -option(ENABLE_FIFO "Enable FIFO plugin" ON) -option(ENABLE_IRC "Enable IRC plugin" ON) -option(ENABLE_LOGGER "Enable Logger plugin" ON) -option(ENABLE_RELAY "Enable Relay plugin" ON) -option(ENABLE_SCRIPT "Enable Script plugin (scripts manager)" ON) -option(ENABLE_SCRIPTS "Enable script plugins (perl, python, ...)" ON) -option(ENABLE_PERL "Enable Perl scripting language" ON) -option(ENABLE_PYTHON "Enable Python scripting language" ON) -option(ENABLE_PYTHON3 "Use Python 3.x if found (NOT recommended)" OFF) -option(ENABLE_RUBY "Enable Ruby scripting language" ON) -option(ENABLE_LUA "Enable Lua scripting language" ON) -option(ENABLE_TCL "Enable Tcl scripting language" ON) -option(ENABLE_GUILE "Enable Scheme (guile) scripting language" ON) -option(ENABLE_TRIGGER "Enable Trigger plugin" ON) -option(ENABLE_XFER "Enable Xfer plugin" ON) -option(ENABLE_MAN "Enable build of man page" OFF) -option(ENABLE_DOC "Enable build of documentation" OFF) -option(ENABLE_TESTS "Enable tests" OFF) +option(ENABLE_NCURSES "Enable Ncurses interface" ON) +option(ENABLE_NLS "Enable Native Language Support" ON) +option(ENABLE_GNUTLS "Enable SSLv3/TLS support" ON) +option(ENABLE_LARGEFILE "Enable Large File Support" ON) +option(ENABLE_ALIAS "Enable Alias plugin" ON) +option(ENABLE_ASPELL "Enable Aspell plugin" ON) +option(ENABLE_ENCHANT "Enable Enchant lib for Aspell plugin" OFF) +option(ENABLE_CHARSET "Enable Charset plugin" ON) +option(ENABLE_EXEC "Enable Exec plugin" ON) +option(ENABLE_FIFO "Enable FIFO plugin" ON) +option(ENABLE_IRC "Enable IRC plugin" ON) +option(ENABLE_LOGGER "Enable Logger plugin" ON) +option(ENABLE_RELAY "Enable Relay plugin" ON) +option(ENABLE_SCRIPT "Enable Script plugin (scripts manager)" ON) +option(ENABLE_SCRIPTS "Enable script plugins (perl, python, ...)" ON) +option(ENABLE_PERL "Enable Perl scripting language" ON) +option(ENABLE_PYTHON "Enable Python scripting language" ON) +option(ENABLE_PYTHON3 "Use Python 3.x if found (NOT recommended)" OFF) +option(ENABLE_RUBY "Enable Ruby scripting language" ON) +option(ENABLE_LUA "Enable Lua scripting language" ON) +option(ENABLE_TCL "Enable Tcl scripting language" ON) +option(ENABLE_GUILE "Enable Scheme (guile) scripting language" ON) +option(ENABLE_JAVASCRIPT "Enable JavaScript scripting language" ON) +option(ENABLE_TRIGGER "Enable Trigger plugin" ON) +option(ENABLE_XFER "Enable Xfer plugin" ON) +option(ENABLE_MAN "Enable build of man page" OFF) +option(ENABLE_DOC "Enable build of documentation" OFF) +option(ENABLE_TESTS "Enable tests" OFF) # option WEECHAT_HOME if(NOT DEFINED WEECHAT_HOME OR "${WEECHAT_HOME}" STREQUAL "") diff --git a/Makefile.am b/Makefile.am index acb2dba48..2252148fd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -59,6 +59,7 @@ EXTRA_DIST = AUTHORS.asciidoc \ cmake/FindRuby.cmake \ cmake/FindSourcehighlight.cmake \ cmake/FindTCL.cmake \ + cmake/FindV8.cmake \ cmake/FindZLIB.cmake \ cmake/cmake_uninstall.cmake.in \ po/CMakeLists.txt \ diff --git a/README.asciidoc b/README.asciidoc index 1bcf94e33..1d446b481 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -19,7 +19,8 @@ image:https://travis-ci.org/weechat/weechat.svg?branch=master["Build Status", li * Multi-protocols architecture (mainly IRC). * Compliant with IRC RFCs 1459, 2810, 2811, 2812 and 2813. * Small, fast and very light. -* Customizable and extensible with plugins (C, Perl, Python, Ruby, Lua, Tcl, Guile). +* Customizable and extensible with plugins (C, Perl, Python, Ruby, Lua, Tcl, + Guile, Javascript). * Fully documented and translated into several languages. * Developed from scratch. * Free software, released under GPLv3. @@ -43,7 +44,7 @@ Following packages are optional: * for i18n: gettext * for SSL: gnutls, ca-certificates * for spell checking: aspell -* for scripting: python, perl, ruby, lua, tcl, guile +* for scripting: python, perl, ruby, lua, tcl, guile, libv8 (javascript) * for building doc: asciidoc, source-highlight (for man page: xsltproc, docbook-xml, docbook-xsl) * for building tests: C++ compiler, CppUTest diff --git a/cmake/FindV8.cmake b/cmake/FindV8.cmake new file mode 100644 index 000000000..c9522bd7b --- /dev/null +++ b/cmake/FindV8.cmake @@ -0,0 +1,49 @@ +# +# Copyright (C) 2015 Sébastien Helleu +# +# This file is part of WeeChat, the extensible chat client. +# +# WeeChat is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# WeeChat is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with WeeChat. If not, see . +# + +# - Find Aspell +# This module finds if libaspell is installed and determines where +# the include files and libraries are. +# +# This code sets the following variables: +# +# V8_INCLUDE_DIR = path to where v8.h can be found +# V8_LIBRARY = path to where libv8.so* can be found + +if(V8_FOUND) + # Already in cache, be silent + SET(V8_FIND_QUIETLY TRUE) +endif() + +set(V8_INC_PATHS + /usr/include + ${CMAKE_INCLUDE_PATH} +) +find_path(V8_INCLUDE_DIR v8.h PATHS ${V8_INC_PATHS}) +find_library(V8_LIBRARY + NAMES v8 + PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib +) + +find_package_handle_standard_args(V8 DEFAULT_MSG V8_LIBRARY V8_INCLUDE_DIR) + +mark_as_advanced( + V8_INCLUDE_DIR + V8_LIBRARY +) diff --git a/configure.ac b/configure.ac index 37a67a8f0..66599e5ff 100644 --- a/configure.ac +++ b/configure.ac @@ -119,6 +119,7 @@ AH_VERBATIM([PLUGIN_RUBY], [#undef PLUGIN_RUBY]) AH_VERBATIM([PLUGIN_LUA], [#undef PLUGIN_LUA]) AH_VERBATIM([PLUGIN_TCL], [#undef PLUGIN_TCL]) AH_VERBATIM([PLUGIN_GUILE], [#undef PLUGIN_GUILE]) +AH_VERBATIM([PLUGIN_JAVASCRIPT], [#undef PLUGIN_JAVASCRIPT]) AH_VERBATIM([PLUGIN_TRIGGER], [#undef PLUGIN_TRIGGER]) AH_VERBATIM([PLUGIN_XFER], [#undef PLUGIN_XFER]) AH_VERBATIM([TESTS], [#undef TESTS]) @@ -150,6 +151,7 @@ AC_ARG_ENABLE(ruby, [ --disable-ruby turn off Ruby script plug AC_ARG_ENABLE(lua, [ --disable-lua turn off Lua script plugin (default=compiled if found)],enable_lua=$enableval,enable_lua=yes) AC_ARG_ENABLE(tcl, [ --disable-tcl turn off Tcl script plugin (default=compiled if found)],enable_tcl=$enableval,enable_tcl=yes) AC_ARG_ENABLE(guile, [ --disable-guile turn off Guile (scheme) script plugin (default=compiled if found)],enable_guile=$enableval,enable_guile=yes) +AC_ARG_ENABLE(javascript, [ --disable-javascript turn off Javascript script plugin (default=compiled if found)],enable_javascript=$enableval,enable_javascript=yes) AC_ARG_ENABLE(trigger, [ --disable-trigger turn off Trigger plugin (default=compiled)],enable_trigger=$enableval,enable_trigger=yes) AC_ARG_ENABLE(xfer, [ --disable-xfer turn off Xfer (file transfer) plugin (default=compiled if found)],enable_xfer=$enableval,enable_xfer=yes) AC_ARG_WITH(tclconfig, [ --with-tclconfig=DIR directory containing tcl configuration (tclConfig.sh)],tclconfig=$withval,tclconfig='') @@ -282,6 +284,7 @@ if test "x$enable_scripts" = "xno" ; then enable_lua="no" enable_tcl="no" enable_guile="no" + enable_javascript="no" fi # ---------------------------------- alias ------------------------------------- @@ -783,6 +786,8 @@ if test "x$enable_tcl" = "xyes" ; then enable_tcl="no" not_found="$not_found tcl" fi +else + not_asked="$not_asked tcl" fi if test "x$enable_tcl" = "xyes" ; then @@ -836,6 +841,8 @@ if test "x$enable_guile" = "xyes" ; then enable_guile="no" not_found="$not_found guile" fi +else + not_asked="$not_asked guile" fi if test "x$enable_guile" = "xyes" ; then @@ -844,6 +851,60 @@ if test "x$enable_guile" = "xyes" ; then AC_DEFINE(PLUGIN_GUILE) fi +# ------------------------------ javascript ----------------------------------- + +AC_LANG_PUSH([C++]) + +if test "x$enable_javascript" = "xyes" ; then + enable_plugins="yes" + + v8_found="no" + AC_CHECK_HEADER(v8.h,ac_found_v8_header="yes",ac_found_v8_header="no") + if test "x$ac_found_v8_header" = "xyes" ; then + #AC_CHECK_LIB(v8,v8,ac_found_v8_lib="yes",ac_found_v8_lib="no") + ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -lv8" + AC_MSG_CHECKING(for v8 usability in programs) + AC_TRY_RUN([ + #include + using namespace v8; + int main(int argc, char **argv) { + const char *version = V8::GetVersion(); + return 0; + }],ac_found_v8_lib="yes", ac_found_v8_lib="no", ac_found_v8_lib="assume-yes") + LDFLAGS="$ac_save_LDFLAGS" + if test "x$ac_found_v8_lib" = "xyes" ; then + AC_MSG_RESULT(yes) + v8_found="yes" + V8_CFLAGS="" + V8_LFLAGS="-lv8" + else + AC_MSG_RESULT(no) + AC_MSG_WARN([ +*** V8 library couldn't be found on your system. +*** WeeChat will be built without Javascript support.]) + enable_javascript="no" + not_found="$not_found javascript/v8" + fi + else + AC_MSG_WARN([ +*** V8 header files couldn't be found on your system. +*** WeeChat will be built without Javascript support.]) + enable_javascript="no" + not_found="$not_found javascript/v8" + fi +else + not_asked="$not_asked javascript" +fi + +if test "x$enable_javascript" = "xyes" ; then + AC_SUBST(V8_CFLAGS) + AC_SUBST(V8_LFLAGS) + AC_DEFINE(PLUGIN_JAVASCRIPT) +fi + +AC_LANG_POP + # --------------------------------- trigger ------------------------------------ if test "x$enable_trigger" = "xyes" ; then @@ -1188,6 +1249,7 @@ gnu*) esac CFLAGS="$CFLAGS -DWEECHAT_VERSION=\\\"$VERSION\\\" -DWEECHAT_LICENSE=\\\"$LICENSE\\\"" +CPPFLAGS="$CPPFLAGS -DWEECHAT_VERSION=\\\"$VERSION\\\" -DWEECHAT_LICENSE=\\\"$LICENSE\\\"" # ------------------------------------------------------------------------------ # output Makefiles @@ -1212,6 +1274,7 @@ AM_CONDITIONAL(PLUGIN_RUBY, test "$enable_ruby" = "yes") AM_CONDITIONAL(PLUGIN_LUA, test "$enable_lua" = "yes") AM_CONDITIONAL(PLUGIN_TCL, test "$enable_tcl" = "yes") AM_CONDITIONAL(PLUGIN_GUILE, test "$enable_guile" = "yes") +AM_CONDITIONAL(PLUGIN_JAVASCRIPT, test "$enable_javascript" = "yes") AM_CONDITIONAL(PLUGIN_TRIGGER, test "$enable_trigger" = "yes") AM_CONDITIONAL(PLUGIN_XFER, test "$enable_xfer" = "yes") AM_CONDITIONAL(TESTS, test "$enable_tests" = "yes") @@ -1246,6 +1309,7 @@ AC_OUTPUT([Makefile src/plugins/lua/Makefile src/plugins/tcl/Makefile src/plugins/guile/Makefile + src/plugins/javascript/Makefile src/plugins/trigger/Makefile src/plugins/xfer/Makefile src/gui/Makefile @@ -1315,6 +1379,9 @@ fi if test "x$enable_guile" = "xyes"; then listplugins="$listplugins guile($GUILE_VERSION)" fi +if test "x$enable_javascript" = "xyes"; then + listplugins="$listplugins javascript/v8" +fi if test "x$enable_trigger" = "xyes"; then listplugins="$listplugins trigger" fi diff --git a/debian/control b/debian/control index 694bf9d7c..9c45196c9 100644 --- a/debian/control +++ b/debian/control @@ -18,6 +18,7 @@ Build-Depends: liblua5.1-0-dev, tcl8.5-dev, guile-2.0-dev, + libv8-dev, libcurl4-gnutls-dev, libgcrypt20-dev, libgnutls28-dev, diff --git a/debian/weechat-plugins.install b/debian/weechat-plugins.install index ff345a770..980192fa4 100644 --- a/debian/weechat-plugins.install +++ b/debian/weechat-plugins.install @@ -2,11 +2,12 @@ usr/lib/weechat/plugins/aspell.so usr/lib/weechat/plugins/exec.so usr/lib/weechat/plugins/fifo.so usr/lib/weechat/plugins/guile.so +usr/lib/weechat/plugins/javascript.so +usr/lib/weechat/plugins/lua.so usr/lib/weechat/plugins/perl.so usr/lib/weechat/plugins/python.so -usr/lib/weechat/plugins/ruby.so -usr/lib/weechat/plugins/lua.so -usr/lib/weechat/plugins/tcl.so -usr/lib/weechat/plugins/script.so usr/lib/weechat/plugins/relay.so +usr/lib/weechat/plugins/ruby.so +usr/lib/weechat/plugins/script.so +usr/lib/weechat/plugins/tcl.so usr/lib/weechat/plugins/trigger.so diff --git a/doc/de/autogen/plugin_api/completions.asciidoc b/doc/de/autogen/plugin_api/completions.asciidoc index 87f703843..5c44eea82 100644 --- a/doc/de/autogen/plugin_api/completions.asciidoc +++ b/doc/de/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | Liste der Nicks im aktuellen Channel +| javascript | javascript_script | Liste der Skripten + | lua | lua_script | Liste der Skripten | perl | perl_script | Liste der Skripten diff --git a/doc/de/autogen/plugin_api/hdata.asciidoc b/doc/de/autogen/plugin_api/hdata.asciidoc index a9c06fe16..989eb7036 100644 --- a/doc/de/autogen/plugin_api/hdata.asciidoc +++ b/doc/de/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** Listen: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': Callback eines Skripts +** Erweiterung: javascript +** Variablen: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': Liste der Skripten +** Erweiterung: javascript +** Variablen: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** Listen: +*** 'last_script' +*** 'scripts' * 'lua_callback': Callback eines Skripts ** Erweiterung: lua ** Variablen: diff --git a/doc/de/autogen/plugin_api/infolists.asciidoc b/doc/de/autogen/plugin_api/infolists.asciidoc index 6394b993b..598a84784 100644 --- a/doc/de/autogen/plugin_api/infolists.asciidoc +++ b/doc/de/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | Liste der IRC-Server | Server Pointer (optional) | Servername (Platzhalter "*" kann verwendet werden) (optional) +| javascript | javascript_script | Liste der Skripten | Skript Pointer (optional) | Name des Skriptes (Platzhalter "*" kann verwendet werden) (optional) + | logger | logger_buffer | Auflistung der protokollierten Buffer | Logger-Pointer (optional) | - | lua | lua_script | Liste der Skripten | Skript Pointer (optional) | Name des Skriptes (Platzhalter "*" kann verwendet werden) (optional) diff --git a/doc/de/autogen/plugin_api/plugins_priority.asciidoc b/doc/de/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/de/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/de/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/de/autogen/user/javascript_commands.asciidoc b/doc/de/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..0e405cbca --- /dev/null +++ b/doc/de/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* auflisten/installieren/beenden von Skripten:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q] [] + + list: installierte Skripten werden aufgelistet +listfull: detaillierte Auflistung aller installierten Skripten + load: installiert ein Skript +autoload: startet automatisch alle Skripten aus dem "autoload" Verzeichnis + reload: ein Skript wird erneut gestartet (wird kein Name angegeben, dann werden alle Skripten beendet und erneut gestartet) + unload: beendet ein Skript (wird kein Name angegeben, dann werden alle Skripten beendet) +filename: Skript (Datei) welches geladen werden soll + name: Name eines Skriptes (der Name der in der "register" Funktion der Skript-API genutzt wird) + -q: unterdrückter Modus: Es werden keine Nachrichten ausgegeben + +Ohne Angabe eines Argumentes listet dieser Befehl alle geladenen Skripten auf. +---- + diff --git a/doc/de/weechat_faq.de.asciidoc b/doc/de/weechat_faq.de.asciidoc index 996d0d245..8cf8f8bec 100644 --- a/doc/de/weechat_faq.de.asciidoc +++ b/doc/de/weechat_faq.de.asciidoc @@ -772,7 +772,8 @@ Damit WeeChat weniger Speicher benötigt, solltest Du folgende Tipps umsetzen: * nutze die aktuelle Version (man kann davon ausgehen das eine aktuelle Version weniger Speicherlecks besitzt, als eine vorherige Version) * lade keine Erweiterungen die Du nicht benötigst. Zum Beispiel: ASpell, Fifo, - Logger, Perl, Python, Ruby, Lua, Tcl, Guile, Xfer (wird für DCC benötigst) + Logger, Perl, Python, Ruby, Lua, Tcl, Guile, Javascript, Xfer (wird für DCC + benötigst) * installiere ausschließlich Skripten die Du auch nutzt * falls man SSL *NICHT* nutzt, sollte kein Zertifikat geladen werden. In diesem Fall, einfach den Eintrag in folgender Option leer lassen: diff --git a/doc/de/weechat_scripting.de.asciidoc b/doc/de/weechat_scripting.de.asciidoc index 1371ec20d..765385136 100644 --- a/doc/de/weechat_scripting.de.asciidoc +++ b/doc/de/weechat_scripting.de.asciidoc @@ -33,6 +33,7 @@ werden folgende Programmiersprachen unterstützt: * lua * tcl * guile (scheme) +* javascript [NOTE] Beinahe alle Beispiele in dieser Dokumentation beziehen sich auf Python. @@ -87,6 +88,10 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ** config_new_option ** bar_new +==== Javascript + +* Funktionen werden im Format `weechat.xxx(arg1, arg2, ...);` ausgeführt + [[register_function]] === Die "Register" Funktion @@ -164,7 +169,15 @@ weechat::print "" "Hallo, von einem tcl Skript!" [source,lisp] ---- (weechat:register "test_scheme" "FlashCode" "1.0" "GPL3" "Test script" "" "") -(weechat:print "" "Hello, from scheme script!") +(weechat:print "" "Hallo, von einem scheme Skript!") +---- + +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test Skript", "", ""); +weechat.print("", "Hallo, von einem javascript Skript!"); ---- [[load_script]] @@ -180,18 +193,20 @@ nutzen, zum Beispiel: /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- Es besteht natürlich weiterhin die Möglichkeit, individuell für jede Skriptsprache, den entsprechenden Befehl zu nutzen: ---- -/python load python/skript.py -/perl load perl/skript.pl -/ruby load ruby/skript.rb -/lua load lua/skript.lua -/tcl load tcl/skript.tcl -/guile load guile/skript.scm +/python load script.py +/perl load script.pl +/ruby load script.rb +/lua load script.lua +/tcl load script.tcl +/guile load script.scm +/javascript load script.js ---- Um Skripten automatisch beim Start von WeeChat zu laden sollte man einen Link @@ -355,6 +370,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == Skript API @@ -533,7 +560,8 @@ weechat.prnt(buffer, "Nachricht im #weechat Channel") ---- [NOTE] -Die print Funktion heißt in Perl/Ruby/Lua/Tcl `print`. In Python lautet die Funktion `prnt`. +Die print Funktion heißt in Perl/Ruby/Lua/Tcl/Guile/Javascript `print`. +In Python lautet die Funktion `prnt`. [[buffers_send_text]] ==== Text in einen Buffer senden @@ -804,7 +832,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SKRIPT_NAME + ".*", "config_cb", "") -# für die jeweilige Programmiersprache muss "python" durch "perl", "ruby", "lua" oder "tcl" ersetzt werden. +# für die jeweilige Programmiersprache muss "python" durch perl/ruby/lua/tcl/guile/javascript ersetzt werden. ---- [[config_options_weechat]] diff --git a/doc/de/weechat_user.de.asciidoc b/doc/de/weechat_user.de.asciidoc index 7077c5eb4..e798c577a 100644 --- a/doc/de/weechat_user.de.asciidoc +++ b/doc/de/weechat_user.de.asciidoc @@ -147,6 +147,9 @@ zu kompilieren und welche Pakete optional genutzt werden können. | guile-2.0-dev | ≥ 2.0 | | Guile (scheme) Erweiterung +| libv8-dev | | | + Javascript Erweiterung + | asciidoc | ≥ 8.5.0 | | Zum Erstellen der man page und der Dokumentation @@ -254,6 +257,9 @@ Liste von häufig verwendeten Optionen: | ENABLE_IRC | `ON`, `OFF` | ON | kompiliert <>. +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + kompiliert <>. + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | Unterstützung großer Dateien. @@ -289,8 +295,8 @@ Liste von häufig verwendeten Optionen: kompiliert <>. | ENABLE_SCRIPTS | `ON`, `OFF` | ON | - kompiliert <> (Python, Perl, Ruby, Lua, Tcl, - Guile). + kompiliert <> (Python, Perl, Ruby, + Lua, Tcl, Guile, Javascript). | ENABLE_TCL | `ON`, `OFF` | ON | kompiliert <>. @@ -1816,7 +1822,7 @@ Beispiele wie man Erweiterungen lädt, entfernt und auflistet: Standarderweiterungen: -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== | Erweiterung | Beschreibung | alias | definiert Alias für Befehle @@ -1834,6 +1840,7 @@ Standarderweiterungen: | lua | Lua-Skript API | tcl | Tcl-Skript API | guile | Guile(scheme)-Skript API +| javascript | Javascript-Skript API | trigger | Veränderung von Text und Ausführen von Befehlen bei einem Ereignis, welche durch WeeChat oder eine Erweiterung ausgelöst werden | xfer | Datentransfer und Direktchat |=== @@ -2931,8 +2938,8 @@ Die URI muss immer auf "/weechat" enden ('irc' und 'weechat' Protokoll). [[scripts_plugins]] === Erweiterungen für Skripten -WeeChat unterstützt sechs Skript-Erweiterungen: Python, Perl, Ruby, Lua, Tcl und Guile -(scheme). +WeeChat unterstützt sechs Skript-Erweiterungen: Python, Perl, Ruby, Lua, Tcl, +Guile (scheme) und Javascript. Mit diesen Erweiterungen kann für die jeweilige Skript-Sprache, Skripten geladen, ausgeführt und entfernt werden. @@ -2996,6 +3003,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Javascript Befehle + +include::autogen/user/javascript_commands.asciidoc[] + [[trigger_plugin]] === Trigger Erweiterung diff --git a/doc/docgen.py b/doc/docgen.py index 6ba11f0c4..662fd4853 100644 --- a/doc/docgen.py +++ b/doc/docgen.py @@ -98,6 +98,7 @@ PLUGIN_LIST = { 'script': 'o', 'perl': '', 'python': '', + 'javascript': '', 'ruby': '', 'lua': '', 'tcl': '', diff --git a/doc/en/autogen/plugin_api/completions.asciidoc b/doc/en/autogen/plugin_api/completions.asciidoc index d06f93f47..66da8e0fb 100644 --- a/doc/en/autogen/plugin_api/completions.asciidoc +++ b/doc/en/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | nicks of current IRC channel +| javascript | javascript_script | list of scripts + | lua | lua_script | list of scripts | perl | perl_script | list of scripts diff --git a/doc/en/autogen/plugin_api/hdata.asciidoc b/doc/en/autogen/plugin_api/hdata.asciidoc index 637e5253d..86a48dc3d 100644 --- a/doc/en/autogen/plugin_api/hdata.asciidoc +++ b/doc/en/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** lists: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': callback of a script +** plugin: javascript +** variables: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': list of scripts +** plugin: javascript +** variables: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** lists: +*** 'last_script' +*** 'scripts' * 'lua_callback': callback of a script ** plugin: lua ** variables: diff --git a/doc/en/autogen/plugin_api/infolists.asciidoc b/doc/en/autogen/plugin_api/infolists.asciidoc index 6f6990f9f..7e8e0119b 100644 --- a/doc/en/autogen/plugin_api/infolists.asciidoc +++ b/doc/en/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | list of IRC servers | server pointer (optional) | server name (wildcard "*" is allowed) (optional) +| javascript | javascript_script | list of scripts | script pointer (optional) | script name (wildcard "*" is allowed) (optional) + | logger | logger_buffer | list of logger buffers | logger pointer (optional) | - | lua | lua_script | list of scripts | script pointer (optional) | script name (wildcard "*" is allowed) (optional) diff --git a/doc/en/autogen/plugin_api/plugins_priority.asciidoc b/doc/en/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/en/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/en/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/en/autogen/user/javascript_commands.asciidoc b/doc/en/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..033797446 --- /dev/null +++ b/doc/en/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* list/load/unload scripts:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q] [] + + list: list loaded scripts +listfull: list loaded scripts (verbose) + load: load a script +autoload: load all scripts in "autoload" directory + reload: reload a script (if no name given, unload all scripts, then load all scripts in "autoload" directory) + unload: unload a script (if no name given, unload all scripts) +filename: script (file) to load + name: a script name (name used in call to "register" function) + -q: quiet mode: do not display messages + +Without argument, this command lists all loaded scripts. +---- + diff --git a/doc/en/weechat_dev.en.asciidoc b/doc/en/weechat_dev.en.asciidoc index 976bb9471..6a2e2260b 100644 --- a/doc/en/weechat_dev.en.asciidoc +++ b/doc/en/weechat_dev.en.asciidoc @@ -46,35 +46,36 @@ The main WeeChat directories are: [width="100%",cols="1v,5",options="header"] |=== -| Directory | Description -| src/ | Root of sources -| core/ | Core functions: entry point, internal structures -| gui/ | Functions for buffers, windows, ... (used by all interfaces) -| curses/ | Curses interface -| plugins/ | Plugin and scripting API -| alias/ | Alias plugin -| aspell/ | Aspell plugin -| charset/ | Charset plugin -| exec/ | Exec plugin -| fifo/ | Fifo plugin (FIFO pipe used to remotely send commands to WeeChat) -| irc/ | IRC (Internet Relay Chat) plugin -| logger/ | Logger plugin (write messages displayed to files) -| relay/ | Relay plugin (irc proxy + relay for remote interfaces) -| script/ | Scripts manager -| python/ | Python scripting API -| perl/ | Perl scripting API -| ruby/ | Ruby scripting API -| lua/ | Lua scripting API -| tcl/ | Tcl scripting API -| guile/ | Guile (scheme) scripting API -| trigger/ | Trigger plugin -| xfer/ | Xfer plugin (IRC DCC file/chat) -| tests/ | Tests -| unit/ | Unit tests -| core/ | Unit tests for core functions -| doc/ | Documentation -| po/ | Translations files (gettext) -| debian/ | Debian packaging +| Directory | Description +| src/ | Root of sources +| core/ | Core functions: entry point, internal structures +| gui/ | Functions for buffers, windows, ... (used by all interfaces) +| curses/ | Curses interface +| plugins/ | Plugin and scripting API +| alias/ | Alias plugin +| aspell/ | Aspell plugin +| charset/ | Charset plugin +| exec/ | Exec plugin +| fifo/ | Fifo plugin (FIFO pipe used to remotely send commands to WeeChat) +| irc/ | IRC (Internet Relay Chat) plugin +| logger/ | Logger plugin (write messages displayed to files) +| relay/ | Relay plugin (irc proxy + relay for remote interfaces) +| script/ | Scripts manager +| python/ | Python scripting API +| perl/ | Perl scripting API +| ruby/ | Ruby scripting API +| lua/ | Lua scripting API +| tcl/ | Tcl scripting API +| guile/ | Guile (scheme) scripting API +| javascript/ | Javascript scripting API +| trigger/ | Trigger plugin +| xfer/ | Xfer plugin (IRC DCC file/chat) +| tests/ | Tests +| unit/ | Unit tests +| core/ | Unit tests for core functions +| doc/ | Documentation +| po/ | Translations files (gettext) +| debian/ | Debian packaging |=== [[sources]] @@ -215,6 +216,10 @@ WeeChat "core" is located in following directories: | irc-sasl.c | SASL authentication with IRC server | irc-server.c | I/O communication with IRC server | irc-upgrade.c | Save/restore of IRC data when upgrading WeeChat +| javascript/ | Javascript plugin +| weechat-js.cpp | Main javascript functions (load/unload scripts, execute javascript code) +| weechat-js-api.cpp | Javascript scripting API functions +| weechat-js-v8.cpp | Javascript v8 functions | logger/ | Logger plugin | logger.c | Main logger functions | logger-buffer.c | Logger buffer list management @@ -1031,7 +1036,7 @@ Then you can load this script in your WeeChat, and setup path to your '/doc' dir Then create this alias to build files: ---- -/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /python load docgen.py; /wait 1ms /docgen +/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /javascript unload; /python load docgen.py; /wait 1ms /docgen ---- And use command `/doc` to build all files, for all languages. diff --git a/doc/en/weechat_faq.en.asciidoc b/doc/en/weechat_faq.en.asciidoc index 9667bc6ff..7ec422022 100644 --- a/doc/en/weechat_faq.en.asciidoc +++ b/doc/en/weechat_faq.en.asciidoc @@ -728,7 +728,7 @@ You can try following tips to consume less memory: * use the latest stable version (it is supposed to have less memory leaks than older versions) * do not load some plugins if you don't use them, for example: aspell, fifo, - logger, perl, python, ruby, lua, tcl, guile, xfer (used for DCC) + logger, perl, python, ruby, lua, tcl, guile, javascript, xfer (used for DCC) * load only scripts that you really need * do not load certificates if SSL is *NOT* used: set empty string in option 'weechat.network.gnutls_ca_file' diff --git a/doc/en/weechat_plugin_api.en.asciidoc b/doc/en/weechat_plugin_api.en.asciidoc index ea8ea38d2..449fbc86e 100644 --- a/doc/en/weechat_plugin_api.en.asciidoc +++ b/doc/en/weechat_plugin_api.en.asciidoc @@ -7985,6 +7985,26 @@ List of signals sent by WeeChat and plugins: String: server name + "," + nick | A nick in notify list is back (away status removed) +| javascript | javascript_script_loaded + + _(WeeChat ≥ 1.2)_ | + String: path to script | + Javascript script loaded + +| javascript | javascript_script_unloaded + + _(WeeChat ≥ 1.2)_ | + String: path to script | + Javascript script unloaded + +| javascript | javascript_script_installed + + _(WeeChat ≥ 1.2)_ | + String: comma-separated list of paths to scripts installed | + Javascript script(s) installed + +| javascript | javascript_script_removed + + _(WeeChat ≥ 1.2)_ | + String: comma-separated list of scripts removed | + Javascript script(s) removed + | logger | logger_start | Pointer: buffer | Start logging for buffer @@ -8565,6 +8585,8 @@ Five signals can be sent to install a script, according to language: * 'ruby_script_install' * 'lua_script_install' * 'tcl_script_install' +* 'guile_script_install' +* 'javascript_script_install' The callback will do following actions when receiving signal: @@ -8603,6 +8625,8 @@ Five signals can be sent to remove list of scripts, according to language: * 'ruby_script_remove' * 'lua_script_remove' * 'tcl_script_remove' +* 'guile_script_remove' +* 'javascript_script_remove' For each script in list, the callback will unload then remove script. diff --git a/doc/en/weechat_scripting.en.asciidoc b/doc/en/weechat_scripting.en.asciidoc index d4bb03e73..44dd440f8 100644 --- a/doc/en/weechat_scripting.en.asciidoc +++ b/doc/en/weechat_scripting.en.asciidoc @@ -28,6 +28,7 @@ script languages: * lua * tcl * guile (scheme) +* javascript [NOTE] Almost all examples in this doc are written in Python, but API is the same for @@ -82,6 +83,10 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ** config_new_option ** bar_new +==== Javascript + +* Functions are called with `weechat.xxx(arg1, arg2, ...);` + [[register_function]] === Register function @@ -162,6 +167,14 @@ weechat::print "" "Hello, from tcl script!" (weechat:print "" "Hello, from scheme script!") ---- +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test script", "", ""); +weechat.print("", "Hello, from javascript script!"); +---- + [[load_script]] === Load script @@ -174,17 +187,19 @@ It is recommended to use the "script" plugin to load scripts, for example: /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- Each language has also its own command: ---- -/python load python/script.py -/perl load perl/script.pl -/ruby load ruby/script.rb -/lua load lua/script.lua -/tcl load tcl/script.tcl -/guile load guile/script.scm +/python load script.py +/perl load script.pl +/ruby load script.rb +/lua load script.lua +/tcl load script.tcl +/guile load script.scm +/javascript load script.js ---- You can make link in directory 'language/autoload' to autoload script when @@ -343,6 +358,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == Script API @@ -520,7 +547,8 @@ weechat.prnt(buffer, "message on #weechat channel") ---- [NOTE] -Print function is called `print` in Perl/Ruby/Lua/Tcl and `prnt` in Python. +Print function is called `print` in Perl/Ruby/Lua/Tcl/Guile/Javascript and +`prnt` in Python. [[buffers_send_text]] ==== Send text to buffer @@ -783,7 +811,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_cb", "") -# for other languages, change "python" with your language ("perl", "ruby", "lua" or "tcl") +# for other languages, change "python" with your language (perl/ruby/lua/tcl/guile/javascript) ---- [[config_options_weechat]] diff --git a/doc/en/weechat_user.en.asciidoc b/doc/en/weechat_user.en.asciidoc index 4f78218d2..d76bc78ff 100644 --- a/doc/en/weechat_user.en.asciidoc +++ b/doc/en/weechat_user.en.asciidoc @@ -139,6 +139,9 @@ compile WeeChat. | guile-2.0-dev | ≥ 2.0 | | Guile (scheme) plugin +| libv8-dev | | | + Javascript plugin + | asciidoc | ≥ 8.5.0 | | Build man page and documentation @@ -245,6 +248,9 @@ List of commonly used options: | ENABLE_IRC | `ON`, `OFF` | ON | Compile <>. +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + Compile <>. + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | Support of large files. @@ -281,7 +287,7 @@ List of commonly used options: | ENABLE_SCRIPTS | `ON`, `OFF` | ON | Compile <> (Python, Perl, Ruby, Lua, Tcl, - Guile). + Guile, Javascript). | ENABLE_TCL | `ON`, `OFF` | ON | Compile <>. @@ -1773,26 +1779,27 @@ Examples to load, unload or list plugins: Default plugins are: -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== -| Plugin | Description -| alias | Define alias for commands -| aspell | Spell checking for command line -| charset | Charset decoding/encoding for buffers -| exec | Execution of external commands in WeeChat -| fifo | FIFO pipe used to remotely send commands to WeeChat -| irc | IRC chat protocol -| logger | Log buffers to files -| relay | Relay data via network -| script | Scripts manager -| python | Python scripting API -| perl | Perl scripting API -| ruby | Ruby scripting API -| lua | Lua scripting API -| tcl | Tcl scripting API -| guile | Guile (scheme) scripting API -| trigger | Text replacement and command execution on events triggered by WeeChat/plugins -| xfer | File transfer and direct chat +| Plugin | Description +| alias | Define alias for commands +| aspell | Spell checking for command line +| charset | Charset decoding/encoding for buffers +| exec | Execution of external commands in WeeChat +| fifo | FIFO pipe used to remotely send commands to WeeChat +| irc | IRC chat protocol +| logger | Log buffers to files +| relay | Relay data via network +| script | Scripts manager +| python | Python scripting API +| perl | Perl scripting API +| ruby | Ruby scripting API +| lua | Lua scripting API +| tcl | Tcl scripting API +| guile | Guile (scheme) scripting API +| javascript | Javascript scripting API +| trigger | Text replacement and command execution on events triggered by WeeChat/plugins +| xfer | File transfer and direct chat |=== To learn more about plugin or script development (through API), please read @@ -2857,8 +2864,8 @@ The URI must always end with "/weechat" (for 'irc' and 'weechat' protocols). [[scripts_plugins]] === Scripts plugins -WeeChat provides 6 scripting plugins: Python, Perl, Ruby, Lua, Tcl and Guile -(scheme). +WeeChat provides 7 scripting plugins: Python, Perl, Ruby, Lua, Tcl, Guile +(scheme) and Javascript. These plugins can load, execute and unload scripts for these languages. Another plugin called "script" is a scripts manager and is used to load/unload @@ -2920,6 +2927,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Javascript commands + +include::autogen/user/javascript_commands.asciidoc[] + [[trigger_plugin]] === Trigger plugin diff --git a/doc/fr/autogen/plugin_api/completions.asciidoc b/doc/fr/autogen/plugin_api/completions.asciidoc index 0c341bbcc..5db31f2ee 100644 --- a/doc/fr/autogen/plugin_api/completions.asciidoc +++ b/doc/fr/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | pseudos du canal IRC courant +| javascript | javascript_script | liste des scripts + | lua | lua_script | liste des scripts | perl | perl_script | liste des scripts diff --git a/doc/fr/autogen/plugin_api/hdata.asciidoc b/doc/fr/autogen/plugin_api/hdata.asciidoc index 6fb158cb3..20427661b 100644 --- a/doc/fr/autogen/plugin_api/hdata.asciidoc +++ b/doc/fr/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** listes: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': callback d'un script +** extension: javascript +** variables: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': liste des scripts +** extension: javascript +** variables: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** listes: +*** 'last_script' +*** 'scripts' * 'lua_callback': callback d'un script ** extension: lua ** variables: diff --git a/doc/fr/autogen/plugin_api/infolists.asciidoc b/doc/fr/autogen/plugin_api/infolists.asciidoc index 9330a29e3..b7eb74215 100644 --- a/doc/fr/autogen/plugin_api/infolists.asciidoc +++ b/doc/fr/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | liste des serveurs IRC | pointeur vers le serveur (optionnel) | nom de serveur (le caractère joker "*" est autorisé) (optionnel) +| javascript | javascript_script | liste des scripts | pointeur vers le script (optionnel) | nom de script (le caractère joker "*" est autorisé) (optionnel) + | logger | logger_buffer | liste des enregistreurs de tampons (loggers) | pointeur vers le logger (optionnel) | - | lua | lua_script | liste des scripts | pointeur vers le script (optionnel) | nom de script (le caractère joker "*" est autorisé) (optionnel) diff --git a/doc/fr/autogen/plugin_api/plugins_priority.asciidoc b/doc/fr/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/fr/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/fr/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/fr/autogen/user/javascript_commands.asciidoc b/doc/fr/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..7185f3762 --- /dev/null +++ b/doc/fr/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* lister/charger/décharger des scripts:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q] [] + + list : lister les scripts chargés +listfull : lister les scripts chargés (verbeux) + load : charger un script +autoload : charger tous les scripts dans le répertoire "autoload" + reload : recharger un script (si pas de nom donné, décharger tous les scripts puis charger tous les scripts dans le répertoire "autoload") + unload : décharger un script (si pas de nom donné, décharger tous les scripts) + fichier : script (fichier) à charger + nom : nom de script (nom utilisé dans l'appel à la fonction "register") + -q : mode silencieux : ne pas afficher de messages + +Sans paramètre, cette commande liste les scripts chargés. +---- + diff --git a/doc/fr/weechat_dev.fr.asciidoc b/doc/fr/weechat_dev.fr.asciidoc index 8b4f3ab9f..7928a8577 100644 --- a/doc/fr/weechat_dev.fr.asciidoc +++ b/doc/fr/weechat_dev.fr.asciidoc @@ -47,35 +47,36 @@ Les répertoires principaux de WeeChat sont : [width="100%",cols="1v,5",options="header"] |=== -| Répertoire | Description -| src/ | Racine des sources -| core/ | Fonctions du cœur : point d'entrée, structures internes -| gui/ | Fonctions pour les tampons, fenêtres, ... (utilisées par toutes les interfaces) -| curses/ | Interface Curses -| plugins/ | API extension/script -| alias/ | Extension Alias -| aspell/ | Extension Aspell -| charset/ | Extension Charset -| exec/ | Extension Exec -| fifo/ | Extension Fifo (tube FIFO utilisé pour envoyer des commandes à WeeChat) -| irc/ | Extension IRC (Internet Relay Chat) -| logger/ | Extension Logger (enregistrer les messages affichés dans des fichiers) -| relay/ | Extension Relay (proxy IRC + relai pour interfaces distantes) -| script/ | Gestionnaire de scripts -| python/ | API script Python -| perl/ | API script Perl -| ruby/ | API script Ruby -| lua/ | API script Lua -| tcl/ | API script Tcl -| guile/ | API script Guile (scheme) -| trigger/ | Extension Trigger -| xfer/ | Extension Xfer (IRC DCC fichier/discussion) -| tests/ | Tests -| unit/ | Tests unitaires -| core/ | Tests unitaires pour les fonctions du cœur -| doc/ | Documentation -| po/ | Fichiers de traductions (gettext) -| debian/ | Empaquetage Debian +| Répertoire | Description +| src/ | Racine des sources +| core/ | Fonctions du cœur : point d'entrée, structures internes +| gui/ | Fonctions pour les tampons, fenêtres, ... (utilisées par toutes les interfaces) +| curses/ | Interface Curses +| plugins/ | API extension/script +| alias/ | Extension Alias +| aspell/ | Extension Aspell +| charset/ | Extension Charset +| exec/ | Extension Exec +| fifo/ | Extension Fifo (tube FIFO utilisé pour envoyer des commandes à WeeChat) +| irc/ | Extension IRC (Internet Relay Chat) +| logger/ | Extension Logger (enregistrer les messages affichés dans des fichiers) +| relay/ | Extension Relay (proxy IRC + relai pour interfaces distantes) +| script/ | Gestionnaire de scripts +| python/ | API script Python +| perl/ | API script Perl +| ruby/ | API script Ruby +| lua/ | API script Lua +| tcl/ | API script Tcl +| guile/ | API script Guile (scheme) +| javascript/ | API script Javascript +| trigger/ | Extension Trigger +| xfer/ | Extension Xfer (IRC DCC fichier/discussion) +| tests/ | Tests +| unit/ | Tests unitaires +| core/ | Tests unitaires pour les fonctions du cœur +| doc/ | Documentation +| po/ | Fichiers de traductions (gettext) +| debian/ | Empaquetage Debian |=== [[sources]] @@ -216,6 +217,10 @@ Le cœur de WeeChat est situé dans les répertoires suivants : | irc-sasl.c | Authentification SASL avec le serveur IRC | irc-server.c | Communication avec le serveur IRC | irc-upgrade.c | Sauvegarde/restauration des données IRC lors de la mise à jour de WeeChat +| javascript/ | Extension Javascript +| weechat-js.cpp | Fonctions principales pour Javascript (chargement/déchargement des scripts, exécution de code Javascript) +| weechat-js-api.cpp | Fonctions de l'API script Javascript +| weechat-js-v8.cpp | Fonctions Javascript v8 | logger/ | Extension Logger | logger.c | Fonctions principales pour Logger | logger-buffer.c | Gestion des listes de tampons pour Logger @@ -1051,7 +1056,7 @@ vers votre répertoire '/doc' : Créez alors cet alias pour construire les fichiers : ---- -/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /python load docgen.py; /wait 1ms /docgen +/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /javascript unload; /python load docgen.py; /wait 1ms /docgen ---- Et utilisez la commande `/doc` pour construire tous les fichiers, pour toutes diff --git a/doc/fr/weechat_faq.fr.asciidoc b/doc/fr/weechat_faq.fr.asciidoc index 778d004c6..efde5c874 100644 --- a/doc/fr/weechat_faq.fr.asciidoc +++ b/doc/fr/weechat_faq.fr.asciidoc @@ -759,8 +759,8 @@ Vous pouvez essayer les astuces suivantes pour consommer moins de mémoire : * utiliser la dernière version stable (elle est supposée avoir moins de fuites de mémoire que les versions plus anciennes) * ne pas charger les extensions si vous ne les utilisez pas, par exemple : - aspell, fifo, logger, perl, python, ruby, lua, tcl, guile, xfer (utilisé pour - les DCC) + aspell, fifo, logger, perl, python, ruby, lua, tcl, guile, javascript, + xfer (utilisé pour les DCC) * charger uniquement les scripts dont vous avez vraiment besoin * ne pas charger les certificats si SSL n'est *PAS* utilisé : affecter une chaîne vide pour l'option 'weechat.network.gnutls_ca_file' diff --git a/doc/fr/weechat_plugin_api.fr.asciidoc b/doc/fr/weechat_plugin_api.fr.asciidoc index b204c6fd1..fd9b6ac0d 100644 --- a/doc/fr/weechat_plugin_api.fr.asciidoc +++ b/doc/fr/weechat_plugin_api.fr.asciidoc @@ -8132,6 +8132,26 @@ Liste des signaux envoyés par WeeChat et les extensions : Un pseudo dans la liste de notifications est de retour (statut d'absence supprimé) +| javascript | javascript_script_loaded + + _(WeeChat ≥ 1.2)_ | + Chaîne : chemin vers le script | + Script javascript chargé + +| javascript | javascript_script_unloaded + + _(WeeChat ≥ 1.2)_ | + Chaîne : chemin vers le script | + Script javascript déchargé + +| javascript | javascript_script_installed + + _(WeeChat ≥ 1.2)_ | + Chaîne : liste de chemins vers scripts installés (séparés par des virgules) | + Script(s) javascript installé(s) + +| javascript | javascript_script_removed + + _(WeeChat ≥ 1.2)_ | + Chaîne : liste de scripts supprimés (séparés par des virgules) | + Script(s) javascript supprimé(s) + | logger | logger_start | Pointeur : tampon | Démarrage de l'enregistrement sur disque pour le tampon @@ -8713,6 +8733,8 @@ Cinq signaux peuvent être envoyés pour installer un script, selon le langage : * 'ruby_script_install' * 'lua_script_install' * 'tcl_script_install' +* 'guile_script_install' +* 'javascript_script_install' Le "callback" effectuera les actions suivantes lorsqu'il recevra le signal : @@ -8754,6 +8776,8 @@ langage : * 'ruby_script_remove' * 'lua_script_remove' * 'tcl_script_remove' +* 'guile_script_remove' +* 'javascript_script_remove' Pour chaque script dans la liste, le "callback" déchargera et supprimera le script. diff --git a/doc/fr/weechat_scripting.fr.asciidoc b/doc/fr/weechat_scripting.fr.asciidoc index 8831a0d5d..8b940551f 100644 --- a/doc/fr/weechat_scripting.fr.asciidoc +++ b/doc/fr/weechat_scripting.fr.asciidoc @@ -29,6 +29,7 @@ l'un des langages de script supportés : * lua * tcl * guile (scheme) +* javascript [NOTE] La majorité des exemples de cette documentation sont écrits en Python, mais @@ -84,6 +85,10 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ** config_new_option ** bar_new +==== Javascript + +* Les fonctions sont appelées par `weechat.xxx(arg1, arg2, ...);` + [[register_function]] === Fonction register @@ -165,6 +170,14 @@ weechat::print "" "Bonjour, du script tcl !" (weechat:print "" "Bonjour, du script scheme !") ---- +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test script", "", ""); +weechat.print("", "Bonjour, du script javascript !"); +---- + [[load_script]] === Chargement du script @@ -178,17 +191,19 @@ par exemple : /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- Chaque langage a également sa propre commande : ---- -/python load python/script.py -/perl load perl/script.pl -/ruby load ruby/script.rb -/lua load lua/script.lua -/tcl load tcl/script.tcl -/guile load guile/script.scm +/python load script.py +/perl load script.pl +/ruby load script.rb +/lua load script.lua +/tcl load script.tcl +/guile load script.scm +/javascript load script.js ---- Vous pouvez faire un lien dans le répertoire 'langage/autoload' pour charger @@ -353,6 +368,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == API script @@ -531,8 +558,8 @@ weechat.prnt(buffer, "message sur le canal #weechat") ---- [NOTE] -La fonction d'affichage est appelée `print` en Perl/Ruby/Lua/Tcl et `prnt` en -Python. +La fonction d'affichage est appelée `print` en +Perl/Ruby/Lua/Tcl/Guile/Javascript et `prnt` en Python. [[buffers_send_text]] ==== Envoyer du texte au tampon @@ -804,7 +831,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_cb", "") -# pour les autres langages, remplacez "python" par le langage ("perl", "ruby", "lua" ou "tcl") +# pour les autres langages, remplacez "python" par le langage (perl/ruby/lua/tcl/guile/javascript) ---- [[config_options_weechat]] diff --git a/doc/fr/weechat_user.fr.asciidoc b/doc/fr/weechat_user.fr.asciidoc index 4bec9cc34..faf7afd33 100644 --- a/doc/fr/weechat_user.fr.asciidoc +++ b/doc/fr/weechat_user.fr.asciidoc @@ -144,6 +144,9 @@ compiler WeeChat. | guile-2.0-dev | ≥ 2.0 | | Extension guile (scheme) +| libv8-dev | | | + Extension javascript + | asciidoc | ≥ 8.5.0 | | Construction de la page man et de la documentation @@ -250,6 +253,9 @@ Liste des options couramment utilisées : | ENABLE_IRC | `ON`, `OFF` | ON | Compiler <>. +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + Compiler <>. + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | Support des gros fichiers. @@ -286,7 +292,7 @@ Liste des options couramment utilisées : | ENABLE_SCRIPTS | `ON`, `OFF` | ON | Compiler <> (Python, Perl, Ruby, - Lua, Tcl, Guile). + Lua, Tcl, Guile, Javascript). | ENABLE_TCL | `ON`, `OFF` | ON | Compiler <>. @@ -1829,26 +1835,27 @@ Exemples pour charger, décharger et afficher les extensions : Les extensions par défaut sont : -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== -| Extension | Description -| alias | Définir des alias pour les commandes -| aspell | Vérification orthographique de la ligne de commande -| charset | Encodage/encodage avec jeu de caractère sur les tampons -| exec | Exécution de commandes externes dans WeeChat -| fifo | Tube FIFO pour envoyer des commandes à distance vers WeeChat -| irc | Discussion avec le protocole IRC -| logger | Enregistrement des tampons dans des fichiers -| relay | Relai de données via le réseau -| script | Gestionnaire de scripts -| python | Interface (API) pour scripts Python -| perl | Interface (API) pour scripts Perl -| ruby | Interface (API) pour scripts Ruby -| lua | Interface (API) pour scripts Lua -| tcl | Interface (API) pour scripts Tcl -| guile | Interface (API) pour scripts Guile (scheme) -| trigger | Remplacement de texte et exécution de commande sur des évènements de WeeChat ou des extensions -| xfer | Transfert de fichier et discussion directe +| Extension | Description +| alias | Définir des alias pour les commandes +| aspell | Vérification orthographique de la ligne de commande +| charset | Encodage/encodage avec jeu de caractère sur les tampons +| exec | Exécution de commandes externes dans WeeChat +| fifo | Tube FIFO pour envoyer des commandes à distance vers WeeChat +| irc | Discussion avec le protocole IRC +| logger | Enregistrement des tampons dans des fichiers +| relay | Relai de données via le réseau +| script | Gestionnaire de scripts +| python | Interface (API) pour scripts Python +| perl | Interface (API) pour scripts Perl +| ruby | Interface (API) pour scripts Ruby +| lua | Interface (API) pour scripts Lua +| tcl | Interface (API) pour scripts Tcl +| guile | Interface (API) pour scripts Guile (scheme) +| javascript | Interface (API) pour scripts Javascript +| trigger | Remplacement de texte et exécution de commande sur des évènements de WeeChat ou des extensions +| xfer | Transfert de fichier et discussion directe |=== Pour en apprendre plus sur le développement d'extension ou de script (via @@ -2951,8 +2958,8 @@ L'URI doit toujours se terminer par "/weechat" (pour les protocoles 'irc' et [[scripts_plugins]] === Extensions Scripts -WeeChat fournit 6 extensions pour scripts : Python, Perl, Ruby, Lua, Tcl et -Guile (scheme). +WeeChat fournit 7 extensions pour scripts : Python, Perl, Ruby, Lua, Tcl, +Guile (scheme) et Javascript. Ces extensions peuvent charger, exécuter et décharger des scripts pour ces langages. @@ -3016,6 +3023,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Commandes Javascript + +include::autogen/user/javascript_commands.asciidoc[] + [[trigger_plugin]] === Extension Trigger diff --git a/doc/it/autogen/plugin_api/completions.asciidoc b/doc/it/autogen/plugin_api/completions.asciidoc index 623f9182b..7782b6956 100644 --- a/doc/it/autogen/plugin_api/completions.asciidoc +++ b/doc/it/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | nick del canale IRC corrente +| javascript | javascript_script | elenco degli script + | lua | lua_script | elenco degli script | perl | perl_script | elenco degli script diff --git a/doc/it/autogen/plugin_api/hdata.asciidoc b/doc/it/autogen/plugin_api/hdata.asciidoc index 6f40652c9..f96094a05 100644 --- a/doc/it/autogen/plugin_api/hdata.asciidoc +++ b/doc/it/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** lists: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': callback di uno script +** plugin: javascript +** variables: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': elenco degli script +** plugin: javascript +** variables: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** lists: +*** 'last_script' +*** 'scripts' * 'lua_callback': callback di uno script ** plugin: lua ** variables: diff --git a/doc/it/autogen/plugin_api/infolists.asciidoc b/doc/it/autogen/plugin_api/infolists.asciidoc index 3d2ebd2af..82c3c1cd7 100644 --- a/doc/it/autogen/plugin_api/infolists.asciidoc +++ b/doc/it/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | elenco di server IRC | puntatore al server (opzionale) | server name (wildcard "*" is allowed) (optional) +| javascript | javascript_script | elenco degli script | puntatore allo script (opzionale) | script name (wildcard "*" is allowed) (optional) + | logger | logger_buffer | elenco dei buffer logger | puntatore al logger (opzionale) | - | lua | lua_script | elenco degli script | puntatore allo script (opzionale) | script name (wildcard "*" is allowed) (optional) diff --git a/doc/it/autogen/plugin_api/plugins_priority.asciidoc b/doc/it/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/it/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/it/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/it/autogen/user/javascript_commands.asciidoc b/doc/it/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..12fa76fdf --- /dev/null +++ b/doc/it/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* elenca/carica/scarica script:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q][] + + list: elenca i plugin caricati + listfull: elenca i plugin caricati (dettagliato) + load: carica un plugin + autoload: carica automaticamente i plugin nella directory utente o di sistema + reload: ricarica un plugin (se non specificato, scarica i plugin e li ricarica automaticamente) + unload: scarica uno o tutti i plugin +nome_file: (file) script da caricare + nome: il nome di uno script (usato nella chiamata alla funzione "register") + -q: modalità silenziosa: non mostra messaggi + +Senza argomento, questo comando elenca tutti i plugin caricati. +---- + diff --git a/doc/it/weechat_faq.it.asciidoc b/doc/it/weechat_faq.it.asciidoc index f6e1cfb8b..3697a1b05 100644 --- a/doc/it/weechat_faq.it.asciidoc +++ b/doc/it/weechat_faq.it.asciidoc @@ -772,7 +772,7 @@ Esistono diversi trucchi per ottimizzare l'uso della memoria: * utilizzare l'ultima versione stabile (si suppone che abbia meno falle di memoria rispetto le versioni precedenti) * non caricare alcuni plugin se non vengono utilizzati, ad esempio: aspell, fifo, - logger, perl, python, ruby, lua, tcl, guile, xfer (usato per DCC) + logger, perl, python, ruby, lua, tcl, guile, javascript, xfer (usato per DCC) * caricare solo gli script veramente necessari * non caricare i certificati se SSL *NON* viene usato: usare una stringa vuota nell'opzione 'weechat.network.gnutls_ca_file' diff --git a/doc/it/weechat_plugin_api.it.asciidoc b/doc/it/weechat_plugin_api.it.asciidoc index 52f81c09f..7bf302287 100644 --- a/doc/it/weechat_plugin_api.it.asciidoc +++ b/doc/it/weechat_plugin_api.it.asciidoc @@ -8165,6 +8165,30 @@ List of signals sent by WeeChat and plugins: String: nome server + "," + nick | Un nick nella lista notifiche è tornato (messaggio di assenza rimosso) +// TRANSLATION MISSING +| javascript | javascript_script_loaded + + _(WeeChat ≥ 1.2)_ | + String: path to script | + Javascript script loaded + +// TRANSLATION MISSING +| javascript | javascript_script_unloaded + + _(WeeChat ≥ 1.2)_ | + String: path to script | + Javascript script unloaded + +// TRANSLATION MISSING +| javascript | javascript_script_installed + + _(WeeChat ≥ 1.2)_ | + String: comma-separated list of paths to scripts installed | + Javascript script(s) installed + +// TRANSLATION MISSING +| javascript | javascript_script_removed + + _(WeeChat ≥ 1.2)_ | + String: comma-separated list of scripts removed | + Javascript script(s) removed + | logger | logger_start | Puntatore: buffer | Avvia il logging per il buffer @@ -8808,6 +8832,8 @@ del linguaggio: * 'ruby_script_install' * 'lua_script_install' * 'tcl_script_install' +* 'guile_script_install' +* 'javascript_script_install' La callback compirà le seguenti azioni alla ricezione del segnale: @@ -8849,6 +8875,8 @@ seconda del linguaggio: * 'ruby_script_remove' * 'lua_script_remove' * 'tcl_script_remove' +* 'guile_script_remove' +* 'javascript_script_remove' Per ogni script nella lista, la callback scaricherà e rimuoverà lo script. diff --git a/doc/it/weechat_scripting.it.asciidoc b/doc/it/weechat_scripting.it.asciidoc index 6f2b297aa..e058750c4 100644 --- a/doc/it/weechat_scripting.it.asciidoc +++ b/doc/it/weechat_scripting.it.asciidoc @@ -35,6 +35,7 @@ linguaggi di scripting supportati: * lua * tcl * guile (scheme) +* javascript [NOTE] Quasi tutti gli esempi in questo manuale sono scritti in Python, ma l'API @@ -90,6 +91,10 @@ Weechat.config_new_option(config, section, "name", "string", "description of opt ** config_new_option ** bar_new +==== Javascript + +* Le funzioni sono chiamate con `weechat.xxx(arg1, arg2, ...);` + [[register_function]] === Registrare una funzione @@ -170,6 +175,14 @@ weechat::print "" "Hello, from tcl script!" (weechat:print "" "Hello, from scheme script!") ---- +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test script", "", ""); +weechat.print("", "Hello, from javascript script!"); +---- + [[load_script]] === Caricare uno script @@ -182,17 +195,19 @@ Si raccomanda di usare il plugin "script" per caricare gli script, ad esempio: /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- Ogni linguaggio ha anche il suo comando specifico: ---- -/python load python/script.py -/perl load perl/script.pl -/ruby load ruby/script.rb -/lua load lua/script.lua -/tcl load tcl/script.tcl -/guile load guile/script.scm +/python load script.py +/perl load script.pl +/ruby load script.rb +/lua load script.lua +/tcl load script.tcl +/guile load script.scm +/javascript load script.js ---- È possibile creare un link nella directory 'linguaggio/autoload' per caricare @@ -357,6 +372,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == Script API @@ -536,7 +563,8 @@ weechat.prnt(buffer, "message on #weechat channel") ---- [NOTE] -La funzione print si chiama `print` in Perl/Ruby/Lua/Tcl e `prnt` in Python. +La funzione print si chiama `print` in Perl/Ruby/Lua/Tcl/Guile/Javascript e +`prnt` in Python. [[buffers_send_text]] ==== Invia testo al buffer @@ -808,7 +836,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_cb", "") -# for other languages, change "python" with your language ("perl", "ruby", "lua" or "tcl") +# for other languages, change "python" with your language (perl/ruby/lua/tcl/guile/javascript) ---- [[config_options_weechat]] diff --git a/doc/it/weechat_user.it.asciidoc b/doc/it/weechat_user.it.asciidoc index c44d2e6d0..9912a9ea1 100644 --- a/doc/it/weechat_user.it.asciidoc +++ b/doc/it/weechat_user.it.asciidoc @@ -156,6 +156,9 @@ compilare WeeChat. | guile-2.0-dev | ≥ 2.0 | | Plugin guile (scheme) +| libv8-dev | | | + Plugin Javascript + // TRANSLATION MISSING | asciidoc | ≥ 8.5.0 | | Build man page and documentation @@ -269,6 +272,9 @@ List of commonly used options: | ENABLE_IRC | `ON`, `OFF` | ON | Compile <>. +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + Compile <>. + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | Support of large files. @@ -305,7 +311,7 @@ List of commonly used options: | ENABLE_SCRIPTS | `ON`, `OFF` | ON | Compile <> (Python, Perl, Ruby, Lua, Tcl, - Guile). + Guile, Javascript). | ENABLE_TCL | `ON`, `OFF` | ON | Compile <>. @@ -1857,28 +1863,29 @@ Esempi per caricare, scaricare oppure elencare i plugin: I plugin predefiniti sono: -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== -| Plugin | Descrizione -| alias | Definisce gli alias per i comandi -| aspell | Controllo ortografico per la riga di comando -| charset | Set di caratteri per la codifica/decodifica nei buffer +| Plugin | Descrizione +| alias | Definisce gli alias per i comandi +| aspell | Controllo ortografico per la riga di comando +| charset | Set di caratteri per la codifica/decodifica nei buffer // TRANSLATION MISSING -| exec | Execution of external commands in WeeChat -| fifo | pipe FIFO utilizzata per inviare comandi da remoto su WeeChat -| irc | protocollo chat per IRC -| logger | Registra i buffer su file -| relay | Relay dei dati via rete -| script | Gestore script -| python | API per lo scripting in Python -| perl | API per lo scripting in Perl -| ruby | API per lo scripting in Ruby -| lua | API per lo scripting in Lua -| tcl | API per lo scripting in TCL -| guile | API per lo scripting in Guile (scheme) +| exec | Execution of external commands in WeeChat +| fifo | pipe FIFO utilizzata per inviare comandi da remoto su WeeChat +| irc | protocollo chat per IRC +| logger | Registra i buffer su file +| relay | Relay dei dati via rete +| script | Gestore script +| python | API per lo scripting in Python +| perl | API per lo scripting in Perl +| ruby | API per lo scripting in Ruby +| lua | API per lo scripting in Lua +| tcl | API per lo scripting in TCL +| guile | API per lo scripting in Guile (scheme) +| javascript | API per lo scripting in Javascript // TRANSLATION MISSING -| trigger | Text replacement and command execution on events triggered by WeeChat/plugins -| xfer | Trasferimento file e chat diretta +| trigger | Text replacement and command execution on events triggered by WeeChat/plugins +| xfer | Trasferimento file e chat diretta |=== Per saperne di più riguardo lo sviluppo di plugin o script (tramite le API), per @@ -3007,8 +3014,8 @@ The URI must always end with "/weechat" (for 'irc' and 'weechat' protocols). [[scripts_plugins]] === Plugin per gli script -WeeChat fornisce 6 plugin per lo scripting: Python, Perl, Ruby, Lua, Tcl, Guile -(scheme). +WeeChat fornisce 7 plugin per lo scripting: Python, Perl, Ruby, Lua, Tcl, Guile +(scheme), Javascript. Questi plugin possono caricare, eseguire e scaricare gli script per questi linguaggi. @@ -3076,6 +3083,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Comandi Javascript + +include::autogen/user/javascript_commands.asciidoc[] + // TRANSLATION MISSING [[trigger_plugin]] === Trigger plugin diff --git a/doc/ja/autogen/plugin_api/completions.asciidoc b/doc/ja/autogen/plugin_api/completions.asciidoc index 9873fe98a..295c29918 100644 --- a/doc/ja/autogen/plugin_api/completions.asciidoc +++ b/doc/ja/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | 現在の IRC チャンネルにいるニックネーム +| javascript | javascript_script | スクリプトのリスト + | lua | lua_script | スクリプトのリスト | perl | perl_script | スクリプトのリスト diff --git a/doc/ja/autogen/plugin_api/hdata.asciidoc b/doc/ja/autogen/plugin_api/hdata.asciidoc index c1d919b7b..73b5e3b73 100644 --- a/doc/ja/autogen/plugin_api/hdata.asciidoc +++ b/doc/ja/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** リスト: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': スクリプトのコールバック +** プラグイン: javascript +** 変数: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': スクリプトのリスト +** プラグイン: javascript +** 変数: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** リスト: +*** 'last_script' +*** 'scripts' * 'lua_callback': スクリプトのコールバック ** プラグイン: lua ** 変数: diff --git a/doc/ja/autogen/plugin_api/infolists.asciidoc b/doc/ja/autogen/plugin_api/infolists.asciidoc index 3c51f216b..7865e43cd 100644 --- a/doc/ja/autogen/plugin_api/infolists.asciidoc +++ b/doc/ja/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | IRC サーバのリスト | サーバポインタ (任意) | サーバ名 (ワイルドカード "*" を使うことができます) (任意) +| javascript | javascript_script | スクリプトのリスト | スクリプトポインタ (任意) | スクリプト名 (ワイルドカード "*" を使うことができます) (任意) + | logger | logger_buffer | logger バッファのリスト | logger ポインタ (任意) | - | lua | lua_script | スクリプトのリスト | スクリプトポインタ (任意) | スクリプト名 (ワイルドカード "*" を使うことができます) (任意) diff --git a/doc/ja/autogen/plugin_api/plugins_priority.asciidoc b/doc/ja/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/ja/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/ja/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/ja/autogen/user/javascript_commands.asciidoc b/doc/ja/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..e3448cb44 --- /dev/null +++ b/doc/ja/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* スクリプトをリストアップ/ロード/アンロード:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q] [] + + list: ロード済みスクリプトをリストアップ +listfull: ロード済みスクリプトをリストアップ (詳細) + load: スクリプトをロード +autoload: "autoload" ディレクトリに含まれる全てのスクリプトをロード + reload: スクリプトのリロード (名前を指定しなかった場合、全てのスクリプトをアンロードし、"autoload" ディレクトリに含まれる全てのスクリプトをロード) + unload: スクリプトのアンロード (名前を指定しなかった場合、全てのスクリプトをアンロード) +filename: ロードするスクリプト (ファイル) + name: スクリプト名 (名前は "register" 関数を呼び出すために使われる) + -q: 出力抑制モード: メッセージを表示しない + +引数無しの場合、全てのロード済みスクリプトをリストアップします。 +---- + diff --git a/doc/ja/weechat_dev.ja.asciidoc b/doc/ja/weechat_dev.ja.asciidoc index c857a8cf1..d8db62cc9 100644 --- a/doc/ja/weechat_dev.ja.asciidoc +++ b/doc/ja/weechat_dev.ja.asciidoc @@ -51,35 +51,36 @@ WeeChat の主要なリポジトリは 2 つあります: [width="100%",cols="1v,5",options="header"] |=== -| ディレクトリ | 説明 -| src/ | ソースコードのルートディレクトリ -| core/ | コア関数: エントリポイント、内部構造体 -| gui/ | バッファ、ウィンドウ、... を操作する関数 (全てのインターフェイスで使う) -| curses/ | curses インターフェイス -| plugins/ | プラグインとスクリプト向け API -| alias/ | alias プラグイン -| aspell/ | aspell プラグイン -| charset/ | charset プラグイン -| exec/ | exec プラグイン -| fifo/ | fifo プラグイン (WeeChat にコマンドを送信する FIFO パイプ) -| irc/ | IRC (Internet Relay Chat) プラグイン -| logger/ | logger プラグイン (表示されたメッセージをファイルに書き込む) -| relay/ | relay プラグイン (irc プロキシ + リモートインターフェイス用の中継) -| script/ | スクリプトマネージャ -| python/ | python スクリプト用 API -| perl/ | perl スクリプト用 API -| ruby/ | ruby スクリプト用 API -| lua/ | lua スクリプト用 API -| tcl/ | tcl スクリプト用 API -| guile/ | guile (scheme) スクリプト用 API -| trigger/ | trigger プラグイン -| xfer/ | xfer (IRC DCC ファイル/チャット) -| tests/ | テスト -| unit/ | 単体テスト -| core/ | コア関数の単体テスト -| doc/ | 文書 -| po/ | 翻訳ファイル (gettext) -| debian/ | Debian パッケージ用 +| ディレクトリ | 説明 +| src/ | ソースコードのルートディレクトリ +| core/ | コア関数: エントリポイント、内部構造体 +| gui/ | バッファ、ウィンドウ、... を操作する関数 (全てのインターフェイスで使う) +| curses/ | curses インターフェイス +| plugins/ | プラグインとスクリプト向け API +| alias/ | alias プラグイン +| aspell/ | aspell プラグイン +| charset/ | charset プラグイン +| exec/ | exec プラグイン +| fifo/ | fifo プラグイン (WeeChat にコマンドを送信する FIFO パイプ) +| irc/ | IRC (Internet Relay Chat) プラグイン +| logger/ | logger プラグイン (表示されたメッセージをファイルに書き込む) +| relay/ | relay プラグイン (irc プロキシ + リモートインターフェイス用の中継) +| script/ | スクリプトマネージャ +| python/ | python スクリプト用 API +| perl/ | perl スクリプト用 API +| ruby/ | ruby スクリプト用 API +| lua/ | lua スクリプト用 API +| tcl/ | tcl スクリプト用 API +| guile/ | guile (scheme) スクリプト用 API +| javascript/ | javascript スクリプト用 API +| trigger/ | trigger プラグイン +| xfer/ | xfer (IRC DCC ファイル/チャット) +| tests/ | テスト +| unit/ | 単体テスト +| core/ | コア関数の単体テスト +| doc/ | 文書 +| po/ | 翻訳ファイル (gettext) +| debian/ | Debian パッケージ用 |=== [[sources]] @@ -220,6 +221,11 @@ WeeChat "core" は以下のディレクトリに配置されています: | irc-sasl.c | IRC サーバに対する SASL 認証 | irc-server.c | IRC サーバとの入出力通信 | irc-upgrade.c | WeeChat をアップグレードする際の IRC データの保存および読み込み +| javascript/ | javascript プラグイン +| weechat-js.cpp | javascript の主要関数 (スクリプトのロード/アンロード、javascript コードの実行) +| weechat-js-api.cpp | javascript スクリプト作成 API 関数 +// TRANSLATION MISSING +| weechat-js-v8.cpp | javascript v8 functions | logger/ | logger プラグイン | logger.c | logger の主要関数 | logger-buffer.c | logger バッファリスト管理 @@ -1028,7 +1034,7 @@ $ msgcheck.py xx.po ファイルを生成するエイリアスを作ってください: ---- -/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /python load docgen.py; /wait 1ms /docgen +/alias doc /perl unload; /python unload; /ruby unload; /lua unload; /tcl unload; /guile unload; /javascript unload; /python load docgen.py; /wait 1ms /docgen ---- コマンド `/doc` を使って全ての (全てのプログラミング言語について) 自動生成するファイルを作成してください。 diff --git a/doc/ja/weechat_faq.ja.asciidoc b/doc/ja/weechat_faq.ja.asciidoc index 582ffc222..a35951fa8 100644 --- a/doc/ja/weechat_faq.ja.asciidoc +++ b/doc/ja/weechat_faq.ja.asciidoc @@ -730,7 +730,7 @@ OpenBSD では、プラグインファイル名の末尾が ".so.0.0" です (Li * 最新の安定版を使う (古いバージョンよりもメモリリークの可能性が減ると思われます) * 使わないプラグインのロードを禁止する、例えば: aspell、fifo、 - logger、perl、python、ruby、lua、tcl、guile、xfer (DCC で使用) + logger、perl、python、ruby、lua、tcl、guile、javascript、xfer (DCC で使用) * 本当に必要なスクリプトだけをロード * SSL を*使わない*なら、証明書を読み込まないでください: オプション 'weechat.network.gnutls_ca_file' に空文字列を設定してください。 diff --git a/doc/ja/weechat_plugin_api.ja.asciidoc b/doc/ja/weechat_plugin_api.ja.asciidoc index defe2bc69..23ec540aa 100644 --- a/doc/ja/weechat_plugin_api.ja.asciidoc +++ b/doc/ja/weechat_plugin_api.ja.asciidoc @@ -7984,6 +7984,26 @@ WeeChat とプラグインが送信するシグナルのリスト: String: サーバ名 + "," + ニックネーム | 通知リストに入っているニックネームが着席状態に (離席状態を解除) +| javascript | javascript_script_loaded + + _(WeeChat バージョン 1.2 以上で利用可)_ | + String: スクリプトへのパス | + Javascript スクリプトを読み込み + +| javascript | javascript_script_unloaded + + _(WeeChat バージョン 1.2 以上で利用可)_ | + String: スクリプトへのパス | + Javascript スクリプトを再読み込み + +| javascript | javascript_script_installed + + _(WeeChat バージョン 1.2 以上で利用可)_ | + String: インストールされたスクリプトへのパスのコンマ区切りリスト | + Javascript スクリプトをインストール + +| javascript | javascript_script_removed + + _(WeeChat バージョン 1.2 以上で利用可)_ | + String: 削除されたスクリプトへのパスのコンマ区切りリスト | + Javascript スクリプトを削除 + | logger | logger_start | Pointer: バッファ | バッファのログ保存を開始 @@ -8564,6 +8584,8 @@ weechat.hook_signal_send("logger_backlog", weechat.WEECHAT_HOOK_SIGNAL_POINTER, * 'ruby_script_install' * 'lua_script_install' * 'tcl_script_install' +* 'guile_script_install' +* 'javascript_script_install' シグナルを受け取ったらコールバックは以下のように働きます: @@ -8602,6 +8624,8 @@ weechat.hook_signal_send("python_script_install", WEECHAT_HOOK_SIGNAL_STRING, * 'ruby_script_remove' * 'lua_script_remove' * 'tcl_script_remove' +* 'guile_script_remove' +* 'javascript_script_remove' リスト文字列に含まれるそれぞれのスクリプトについて、コールバックはスクリプトを再読み込みして削除します。 diff --git a/doc/ja/weechat_scripting.ja.asciidoc b/doc/ja/weechat_scripting.ja.asciidoc index 97ef59a81..89120271f 100644 --- a/doc/ja/weechat_scripting.ja.asciidoc +++ b/doc/ja/weechat_scripting.ja.asciidoc @@ -33,6 +33,7 @@ WeeChat (Wee Enhanced Environment for Chat) はフリー、高速、軽量な * lua * tcl * guile (scheme) +* javascript [NOTE] この文書に含まれるほぼすべての例は Python @@ -168,6 +169,14 @@ weechat::print "" "Hello, from tcl script!" (weechat:print "" "Hello, from scheme script!") ---- +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test script", "", ""); +weechat.print("", "Hello, from javascript script!"); +---- + [[load_script]] === スクリプトのロード @@ -180,17 +189,19 @@ weechat::print "" "Hello, from tcl script!" /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- プログラミング言語ごとの固有コマンドを利用することもできます: ---- -/python load python/script.py -/perl load perl/script.pl -/ruby load ruby/script.rb -/lua load lua/script.lua -/tcl load tcl/script.tcl -/guile load guile/script.scm +/python load script.py +/perl load script.pl +/ruby load script.rb +/lua load script.lua +/tcl load script.tcl +/guile load script.scm +/javascript load script.js ---- WeeChat の開始時にスクリプトを自動ロードするには @@ -351,6 +362,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == スクリプト API @@ -528,7 +551,7 @@ weechat.prnt(buffer, "message on #weechat channel") ---- [NOTE] -Print 関数は Perl/Ruby/Lua/Tcl では `print` で、Python では `prnt` です。 +Print 関数は Perl/Ruby/Lua/Tcl/Guile/Javascript では `print` で、Python では `prnt` です。 [[buffers_send_text]] ==== バッファにテキストを送信 @@ -791,7 +814,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_cb", "") -# 他のスクリプト言語の場合は "python" を適当なもの ("perl"、"ruby"、"lua"、"tcl") に変更してください。 +# 他のスクリプト言語の場合は "python" を適当なもの (perl/ruby/lua/tcl/guile/javascript) に変更してください。 ---- [[config_options_weechat]] diff --git a/doc/ja/weechat_user.ja.asciidoc b/doc/ja/weechat_user.ja.asciidoc index 5ac8dce8a..e30260a97 100644 --- a/doc/ja/weechat_user.ja.asciidoc +++ b/doc/ja/weechat_user.ja.asciidoc @@ -143,6 +143,9 @@ OS X では、http://brew.sh/[Homebrew] を使ってください: | guile-2.0-dev | ≥ 2.0 | | guile (scheme) プラグイン +| libv8-dev | | | + javascript プラグイン + | asciidoc | ≥ 8.5.0 | | man ページと文書のビルド @@ -248,6 +251,9 @@ cmake に対するオプションを指定するには、以下のフォーマ | ENABLE_IRC | `ON`, `OFF` | ON | <>のコンパイル +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + <>のコンパイル。 + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | 巨大ファイルのサポート。 @@ -284,7 +290,7 @@ cmake に対するオプションを指定するには、以下のフォーマ | ENABLE_SCRIPTS | `ON`, `OFF` | ON | すべての<> - (Python、Perl、Ruby、Lua、Tcl、Guile) のコンパイル + (Python、Perl、Ruby、Lua、Tcl、Guile、Javascript) のコンパイル | ENABLE_TCL | `ON`, `OFF` | ON | <>のコンパイル @@ -1776,7 +1782,7 @@ GNU/Linux の場合、プラグインファイルは ".so" という拡張子を デフォルトプラグインのリスト: -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== | プラグイン | 説明 | alias | コマンドの別名を定義 @@ -1794,6 +1800,7 @@ GNU/Linux の場合、プラグインファイルは ".so" という拡張子を | lua | Lua スクリプト API | tcl | Tcl スクリプト API | guile | Guile (scheme) スクリプト API +| javascript | Javascript スクリプト API | trigger | WeeChat およびプラグインが発生させたイベントに対するテキスト置換とコマンド実行 | xfer | ファイル転送とダイレクトチャット |=== @@ -2860,8 +2867,8 @@ websocket = new WebSocket("ws://server.com:9000/weechat"); [[scripts_plugins]] === スクリプトプラグイン -WeeChat は 6 種類のスクリプトプラグインを備えています: Python、Perl、Ruby、Lua、Tcl、Guile -(scheme)。 +WeeChat は 7 種類のスクリプトプラグインを備えています: Python、Perl、Ruby、Lua、Tcl、Guile +(scheme)、Javascript。 これらのプラグインでそれぞれの言語で書かれたスクリプトのロード、実行、アンロードができます。 "スクリプト" と呼ばれるほかのプラグインはスクリプトマネージャで、任意の言語で書かれたスクリプトをロード @@ -2923,6 +2930,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Javascript コマンド + +include::autogen/user/javascript_commands.asciidoc[] + [[trigger_plugin]] === トリガプラグイン diff --git a/doc/pl/autogen/plugin_api/completions.asciidoc b/doc/pl/autogen/plugin_api/completions.asciidoc index 916098593..63116a5fb 100644 --- a/doc/pl/autogen/plugin_api/completions.asciidoc +++ b/doc/pl/autogen/plugin_api/completions.asciidoc @@ -46,6 +46,8 @@ | irc | nick | użytkownicy obecnego kanału IRC +| javascript | javascript_script | lista skryptów + | lua | lua_script | lista skryptów | perl | perl_script | lista skryptów diff --git a/doc/pl/autogen/plugin_api/hdata.asciidoc b/doc/pl/autogen/plugin_api/hdata.asciidoc index a23a0622e..75dfedc76 100644 --- a/doc/pl/autogen/plugin_api/hdata.asciidoc +++ b/doc/pl/autogen/plugin_api/hdata.asciidoc @@ -222,6 +222,40 @@ ** listy: *** 'irc_servers' *** 'last_irc_server' +* 'javascript_callback': callback skryptu +** wtyczka: javascript +** zmienne: +*** 'script' (pointer, hdata: "javascript_script") +*** 'function' (string) +*** 'data' (string) +*** 'config_file' (pointer, hdata: "config_file") +*** 'config_section' (pointer, hdata: "config_section") +*** 'config_option' (pointer, hdata: "config_option") +*** 'hook' (pointer) +*** 'buffer' (pointer, hdata: "buffer") +*** 'bar_item' (pointer, hdata: "bar_item") +*** 'upgrade_file' (pointer) +*** 'prev_callback' (pointer, hdata: "javascript_callback") +*** 'next_callback' (pointer, hdata: "javascript_callback") +* 'javascript_script': lista skryptów +** wtyczka: javascript +** zmienne: +*** 'filename' (string) +*** 'interpreter' (pointer) +*** 'name' (string) +*** 'author' (string) +*** 'version' (string) +*** 'license' (string) +*** 'description' (string) +*** 'shutdown_func' (string) +*** 'charset' (string) +*** 'callbacks' (pointer, hdata: "javascript_callback") +*** 'unloading' (integer) +*** 'prev_script' (pointer, hdata: "javascript_script") +*** 'next_script' (pointer, hdata: "javascript_script") +** listy: +*** 'last_script' +*** 'scripts' * 'lua_callback': callback skryptu ** wtyczka: lua ** zmienne: diff --git a/doc/pl/autogen/plugin_api/infolists.asciidoc b/doc/pl/autogen/plugin_api/infolists.asciidoc index a93d27f02..931eba0b4 100644 --- a/doc/pl/autogen/plugin_api/infolists.asciidoc +++ b/doc/pl/autogen/plugin_api/infolists.asciidoc @@ -18,6 +18,8 @@ | irc | irc_server | lista serwerów IRC | wskaźnik serwera (opcjonalny) | nazwa serwera (wildcard "*" jest dozwolony) (opcjonalne) +| javascript | javascript_script | lista skryptów | wskaźnik skryptu (opcjonalne) | nazwa skryptu (wildcard "*" jest dozwolony) (opcjonalne) + | logger | logger_buffer | lista logowanych buforów | wskaźnik logger (opcjonalny) | - | lua | lua_script | lista skryptów | wskaźnik skryptu (opcjonalne) | nazwa skryptu (wildcard "*" jest dozwolony) (opcjonalne) diff --git a/doc/pl/autogen/plugin_api/plugins_priority.asciidoc b/doc/pl/autogen/plugin_api/plugins_priority.asciidoc index d5a171b0b..8156259db 100644 --- a/doc/pl/autogen/plugin_api/plugins_priority.asciidoc +++ b/doc/pl/autogen/plugin_api/plugins_priority.asciidoc @@ -8,5 +8,5 @@ . xfer (6000) . irc (5000) . relay (4000) -. guile, lua, perl, python, ruby, tcl (3000) +. guile, javascript, lua, perl, python, ruby, tcl (3000) . script (2000) diff --git a/doc/pl/autogen/user/javascript_commands.asciidoc b/doc/pl/autogen/user/javascript_commands.asciidoc new file mode 100644 index 000000000..2e5aef8f3 --- /dev/null +++ b/doc/pl/autogen/user/javascript_commands.asciidoc @@ -0,0 +1,22 @@ +[[command_javascript_javascript]] +[command]*`javascript`* list/load/unload skrypt:: + +---- +/javascript list|listfull [] + load [-q] + autoload + reload|unload [-q] [] + + list: lista załadowanych wtyczek +listfull: lista załadowanych wtyczek (szczegółowa) + load: ładuje wtyczkę +autoload: automatycznie ładuje wtyczki w katalogu systemowym lub użytkownika + reload: przeładuje pojedynczą wtyczkę (jeśli nie podano nazwy, wyładuje wszystkie wtyczki, następnie automatycznie załaduje wtyczki) + unload: wyładowuje jedną albo wszystkie wtyczki +nazwa_pliku: skrypt (plik) do załadowania + nazwa: nazwa skryptu (nazwa użyta do wywołania funkcji "register") + -q: tryb cichy: nie wyświetla wiadomości + +Bez argumentów ta komenda wyświetli wszystkie załadowane wtyczki. +---- + diff --git a/doc/pl/weechat_faq.pl.asciidoc b/doc/pl/weechat_faq.pl.asciidoc index d499bb58a..952e44b02 100644 --- a/doc/pl/weechat_faq.pl.asciidoc +++ b/doc/pl/weechat_faq.pl.asciidoc @@ -738,7 +738,7 @@ W celu zmniejszenia używanej pamięci możesz zastosować się do poniższych r * używać najnowsze stabilnej wersji (powinna mieć mniej wycieków pamięci niż starsze wersje) * nie ładuj nieużywanych pluginów, np: aspell, fifo, logger, perl, python, - ruby, lua, tcl, guile, xfer (używana do DCC) + ruby, lua, tcl, guile, javascript, xfer (używana do DCC) * ładować tylko naprawdę używane skrypty * nie ładuj certyfikatów jeśli SSL *NIE* jest używany: ustaw pusty ciąg w opcji 'weechat.network.gnutls_ca_file' diff --git a/doc/pl/weechat_scripting.pl.asciidoc b/doc/pl/weechat_scripting.pl.asciidoc index 63ef78b2a..1e10db686 100644 --- a/doc/pl/weechat_scripting.pl.asciidoc +++ b/doc/pl/weechat_scripting.pl.asciidoc @@ -34,6 +34,7 @@ wspieranych języków skryptowych: * lua * tcl * guile (scheme) +* javascript [NOTE] Prawie wszystkie przykłady umieszczone w tym dokumencie są napisane w Pythonie, @@ -88,6 +89,10 @@ Weechat.config_new_option(config, section, "nazwa", "ciąg", "opis opcji", "", 0 ** config_new_option ** bar_new +==== Javascript + +* Funkcje są wywoływane za pomocą `weechat.xxx(arg1, arg2, ...);` + [[register_function]] === Funkcja rejestrująca @@ -168,6 +173,14 @@ weechat::print "" "Witaj ze skryptu tcl!" (weechat:print "" "Witaj ze skryptu scheme!") ---- +* javascript: + +[source,javascript] +---- +weechat.register("test_js", "FlashCode", "1.0", "GPL3", "Test script", "", ""); +weechat.print("", "Witaj ze skryptu javascript!"); +---- + [[load_script]] === Ładowanie skryptu @@ -180,17 +193,19 @@ Zaleca się używanie wtyczki "script" do ładowania skryptów, na przykład: /script load script.lua /script load script.tcl /script load script.scm +/script load script.js ---- Każdy język posiada również swoją własną komendę: ---- -/python load python/skrypt.py -/perl load perl/skrypt.pl -/ruby load ruby/skrypt.rb -/lua load lua/skrypt.lua -/tcl load tcl/skrypt.tcl -/guile load guile/skrypt.scm +/python load skrypt.py +/perl load skrypt.pl +/ruby load skrypt.rb +/lua load skrypt.lua +/tcl load skrypt.tcl +/guile load skrypt.scm +/javascript load skrypt.js ---- Możesz zrobić dowiązanie w katalogu 'język/autoload' jeśli chcesz automatycznie @@ -348,6 +363,18 @@ weechat::hook_timer 1000 0 1 timer_cb test (weechat:hook_timer 1000 0 1 "timer_cb" "test") ---- +* javascript: + +[source,javascript] +---- +function timer_cb(data, remaining_calls) { + weechat.print("", "timer! data=" + data); + return weechat.WEECHAT_RC_OK; +} + +weechat.hook_timer(1000, 0, 1, "timer_cb", "test"); +---- + [[script_api]] == API skryptów @@ -524,7 +551,8 @@ weechat.prnt(buffer, "wiadomość na kanale #weechat") ---- [NOTE] -Funkcja drukująca nazywa się `print` w Perl/Ruby/Lua/Tcl i `prnt` w Pythonie. +Funkcja drukująca nazywa się `print` w Perl/Ruby/Lua/Tcl/Guile/Javascript i +`prnt` w Pythonie. [[buffers_send_text]] ==== Wysyłanie tekstu do bufora @@ -787,7 +815,7 @@ def config_cb(data, option, value): # ... weechat.hook_config("plugins.var.python." + SCRIPT_NAME + ".*", "config_cb", "") -# dla innych języków, zmień "python" na swój język ("perl", "ruby", "lua" or "tcl") +# dla innych języków, zmień "python" na swój język (perl/ruby/lua/tcl/guile/javascript) ---- [[config_options_weechat]] diff --git a/doc/pl/weechat_user.pl.asciidoc b/doc/pl/weechat_user.pl.asciidoc index 1d6127b37..57882c9d5 100644 --- a/doc/pl/weechat_user.pl.asciidoc +++ b/doc/pl/weechat_user.pl.asciidoc @@ -146,6 +146,9 @@ WeeChat. | guile-2.0-dev | ≥ 2.0 | | Wtyczka guile (scheme) +| libv8-dev | | | + Wtyczka javascript + | asciidoc | ≥ 8.5.0 | | Tworzenie strony man i dokumentacji @@ -253,6 +256,9 @@ Lista popularnych opcji: | ENABLE_IRC | `ON`, `OFF` | ON | Kompilacja <>. +| ENABLE_JAVASCRIPT | `ON`, `OFF` | ON | + Kompilacja <>. + | ENABLE_LARGEFILE | `ON`, `OFF` | ON | Wsparcie dla dużych plików. @@ -289,7 +295,7 @@ Lista popularnych opcji: | ENABLE_SCRIPTS | `ON`, `OFF` | ON | Kompilacja <> (Python, Perl, Ruby, Lua, - Tcl, Guile). + Tcl, Guile, Javascript). | ENABLE_TCL | `ON`, `OFF` | ON | Kompilacja <>. @@ -1792,26 +1798,27 @@ Przykłady ładowania, wyładowywania i wyświetlania załadowanych wtyczek: Domyślne wtyczki: -[width="50%",cols="^1,5",options="header"] +[width="100%",cols="^1,5",options="header"] |=== -| Wtyczka | Opis -| alias | Definiuje aliasy dla komend -| aspell | Sprawdzanie pisowni w linii poleceń -| charset | Ustawianie kodowania dla buforów -| exec | Wykonuje zewnętrzną komendę z poziomu WeeChat -| fifo | Kolejka FIFO używana do zdalnego wysyłania poleceń dla WeeChat -| irc | Protokół IRC -| logger | Logowanie zawartości buforów do plików -| relay | Przekazuje dane przez sieć -| script | Zarządzanie skryptami -| python | Wsparcie dla skryptów napisanych w Pythonie -| perl | Wsparcie dla skryptów napisanych w Perlu -| ruby | Wsparcie dla skryptów napisanych w Ruby -| lua | Wsparcie dla skryptów napisanych w Lua -| tcl | Wsparcie dla skryptów napisanych w Tcl -| guile | Wsparcie dla skryptów napisanych w Guile (scheme) -| trigger | Zamiana tekstu i wykonywanie komend dla zdarzeń wywołanych przez WeeChat/wtyczki -| xfer | Przesyłanie plików i bezpośredni chat +| Wtyczka | Opis +| alias | Definiuje aliasy dla komend +| aspell | Sprawdzanie pisowni w linii poleceń +| charset | Ustawianie kodowania dla buforów +| exec | Wykonuje zewnętrzną komendę z poziomu WeeChat +| fifo | Kolejka FIFO używana do zdalnego wysyłania poleceń dla WeeChat +| irc | Protokół IRC +| logger | Logowanie zawartości buforów do plików +| relay | Przekazuje dane przez sieć +| script | Zarządzanie skryptami +| python | Wsparcie dla skryptów napisanych w Pythonie +| perl | Wsparcie dla skryptów napisanych w Perlu +| ruby | Wsparcie dla skryptów napisanych w Ruby +| lua | Wsparcie dla skryptów napisanych w Lua +| tcl | Wsparcie dla skryptów napisanych w Tcl +| guile | Wsparcie dla skryptów napisanych w Guile (scheme) +| javascript | Wsparcie dla skryptów napisanych w Javascript +| trigger | Zamiana tekstu i wykonywanie komend dla zdarzeń wywołanych przez WeeChat/wtyczki +| xfer | Przesyłanie plików i bezpośredni chat |=== Więcej informacji o wtyczkach i tworzeniu skryptów (przez API), można znaleźć w @@ -2891,8 +2898,8 @@ Adres URL musi się zawsze kończyć "/weechat" (dla protokołów 'irc' i 'weech [[scripts_plugins]] === Wtyczki skryptowe -WeeChat posiada 6 wtyczek skryptowych: Python, Perl, Ruby, Lua, Tcl i Guile -(scheme). +WeeChat posiada 7 wtyczek skryptowych: Python, Perl, Ruby, Lua, Tcl, Guile +(scheme) i Javascript. Wtyczki te potrafią ładować, wykonywać i wyładowywać skrypty w tych językach. Inna wtyczka nazwana "script" jest managerem skryptów i jest używana do @@ -2955,6 +2962,11 @@ include::autogen/user/tcl_commands.asciidoc[] include::autogen/user/guile_commands.asciidoc[] +[[javascript_commands]] +==== Komendy wtyczki javascript + +include::autogen/user/javascript_commands.asciidoc[] + [[trigger_plugin]] === Wtyczka trigger diff --git a/po/POTFILES.in b/po/POTFILES.in index c9681d5f4..bc1ec8291 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -180,6 +180,12 @@ ./src/plugins/irc/irc-sasl.h ./src/plugins/irc/irc-server.c ./src/plugins/irc/irc-server.h +./src/plugins/javascript/weechat-js-api.cpp +./src/plugins/javascript/weechat-js-api.h +./src/plugins/javascript/weechat-js-v8.cpp +./src/plugins/javascript/weechat-js-v8.h +./src/plugins/javascript/weechat-js.cpp +./src/plugins/javascript/weechat-js.h ./src/plugins/logger/logger-buffer.c ./src/plugins/logger/logger-buffer.h ./src/plugins/logger/logger.c diff --git a/po/srcfiles.cmake b/po/srcfiles.cmake index a7d10d667..06702a89c 100644 --- a/po/srcfiles.cmake +++ b/po/srcfiles.cmake @@ -181,6 +181,12 @@ SET(WEECHAT_SOURCES ./src/plugins/irc/irc-sasl.h ./src/plugins/irc/irc-server.c ./src/plugins/irc/irc-server.h +./src/plugins/javascript/weechat-js-api.cpp +./src/plugins/javascript/weechat-js-api.h +./src/plugins/javascript/weechat-js-v8.cpp +./src/plugins/javascript/weechat-js-v8.h +./src/plugins/javascript/weechat-js.cpp +./src/plugins/javascript/weechat-js.h ./src/plugins/logger/logger-buffer.c ./src/plugins/logger/logger-buffer.h ./src/plugins/logger/logger.c diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt index f08b3a283..ce7546859 100644 --- a/src/plugins/CMakeLists.txt +++ b/src/plugins/CMakeLists.txt @@ -141,6 +141,13 @@ if(ENABLE_SCRIPTS AND ENABLE_GUILE) endif() endif() +if(ENABLE_SCRIPTS AND ENABLE_JAVASCRIPT) + find_package(V8) + if(V8_FOUND) + add_subdirectory(javascript) + endif() +endif() + if(ENABLE_TRIGGER) add_subdirectory(trigger) endif() diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 8174590d5..4836aec07 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -99,6 +99,10 @@ if PLUGIN_GUILE guile_dir = guile endif +if PLUGIN_JAVASCRIPT +javascript_dir = javascript +endif + if PLUGIN_TRIGGER trigger_dir = trigger endif @@ -110,7 +114,7 @@ endif SUBDIRS = . $(alias_dir) $(aspell_dir) $(charset_dir) $(exec_dir) $(fifo_dir) \ $(irc_dir) $(logger_dir) $(relay_dir) $(script_dir) $(perl_dir) \ $(python_dir) $(ruby_dir) $(lua_dir) $(tcl_dir) $(guile_dir) \ - $(trigger_dir) $(xfer_dir) + $(javascript_dir) $(trigger_dir) $(xfer_dir) EXTRA_DIST = CMakeLists.txt diff --git a/src/plugins/javascript/CMakeLists.txt b/src/plugins/javascript/CMakeLists.txt new file mode 100644 index 000000000..91a56a340 --- /dev/null +++ b/src/plugins/javascript/CMakeLists.txt @@ -0,0 +1,33 @@ +# +# Copyright (C) 2015 Sébastien Helleu +# +# This file is part of WeeChat, the extensible chat client. +# +# WeeChat is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# WeeChat is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with WeeChat. If not, see . +# + +enable_language(CXX) + +add_library(javascript MODULE weechat-js.cpp weechat-js.h +weechat-js-v8.cpp weechat-js-v8.h +weechat-js-api.cpp weechat-js-api.h) + +set_target_properties(javascript PROPERTIES PREFIX "") + +if(V8_FOUND) + include_directories(${V8_INCLUDE_DIR}) + target_link_libraries(javascript ${V8_LIBRARY} weechat_plugins_scripts) +endif() + +install(TARGETS javascript LIBRARY DESTINATION ${LIBDIR}/plugins) diff --git a/src/plugins/javascript/Makefile.am b/src/plugins/javascript/Makefile.am new file mode 100644 index 000000000..5a81350f3 --- /dev/null +++ b/src/plugins/javascript/Makefile.am @@ -0,0 +1,35 @@ +# +# Copyright (C) 2015 Sébastien Helleu +# +# This file is part of WeeChat, the extensible chat client. +# +# WeeChat is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# WeeChat is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with WeeChat. If not, see . +# + +AM_CPPFLAGS = -DLOCALEDIR=\"$(datadir)/locale\" $(V8_CFLAGS) + +libdir = ${weechat_libdir}/plugins + +lib_LTLIBRARIES = javascript.la + +javascript_la_SOURCES = weechat-js.cpp \ + weechat-js.h \ + weechat-js-v8.cpp \ + weechat-js-v8.h \ + weechat-js-api.cpp \ + weechat-js-api.h +javascript_la_LDFLAGS = -module -no-undefined +javascript_la_LIBADD = ../lib_weechat_plugins_scripts.la $(V8_LFLAGS) + +EXTRA_DIST = CMakeLists.txt diff --git a/src/plugins/javascript/weechat-js-api.cpp b/src/plugins/javascript/weechat-js-api.cpp new file mode 100644 index 000000000..6ffe55673 --- /dev/null +++ b/src/plugins/javascript/weechat-js-api.cpp @@ -0,0 +1,4856 @@ +/* + * weechat-js-api.cpp - javascript API functions + * + * Copyright (C) 2013 Koka El Kiwi + * Copyright (C) 2015 Sébastien Helleu + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * WeeChat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with WeeChat. If not, see . + */ + +#undef _ + +#include +#include +#include + +extern "C" +{ +#include "../weechat-plugin.h" +#include "../plugin-script.h" +#include "../plugin-script-api.h" +#include "../plugin-script-callback.h" +} + +#include "weechat-js.h" +#include "weechat-js-v8.h" +#include "weechat-js-api.h" + +using namespace v8; + + +#define API_DEF_FUNC(__name) \ + weechat_obj->Set(String::New(#__name), \ + FunctionTemplate::New(weechat_js_api_##__name)); +#define API_DEF_CONST_INT(__name) \ + weechat_obj->Set(String::New(#__name), \ + Integer::New(__name)); +#define API_DEF_CONST_STR(__name) \ + weechat_obj->Set(String::New(#__name), \ + String::New(__name)); +#define API_FUNC(__name) \ + static Handle \ + weechat_js_api_##__name(const Arguments &args) +#define API_INIT_FUNC(__init, __name, __args_fmt, __ret) \ + std::string js_function_name(__name); \ + std::string js_args(__args_fmt); \ + int js_args_len = js_args.size(); \ + int num; \ + if (__init \ + && (!js_current_script || !js_current_script->name)) \ + { \ + WEECHAT_SCRIPT_MSG_NOT_INIT(JS_CURRENT_SCRIPT_NAME, \ + js_function_name.c_str()); \ + __ret; \ + } \ + if (args.Length() < js_args_len) \ + { \ + WEECHAT_SCRIPT_MSG_WRONG_ARGS(JS_CURRENT_SCRIPT_NAME, \ + js_function_name.c_str()); \ + __ret; \ + } \ + for (num = 0; num < js_args_len; num++) \ + { \ + if (((js_args[num] == 's') && (!args[num]->IsString())) \ + || ((js_args[num] == 'i') && (!args[num]->IsInt32())) \ + || ((js_args[num] == 'h') && (!args[num]->IsObject()))) \ + { \ + WEECHAT_SCRIPT_MSG_WRONG_ARGS(JS_CURRENT_SCRIPT_NAME, \ + js_function_name.c_str()); \ + __ret; \ + } \ + } +#define API_WRONG_ARGS(__ret) \ + { \ + WEECHAT_SCRIPT_MSG_WRONG_ARGS(JS_CURRENT_SCRIPT_NAME, \ + js_function_name.c_str()); \ + __ret; \ + } + +#define API_PTR2STR(__pointer) \ + plugin_script_ptr2str (__pointer) +#define API_STR2PTR(__string) \ + plugin_script_str2ptr (weechat_js_plugin, \ + JS_CURRENT_SCRIPT_NAME, \ + js_function_name.c_str(), __string) + +#define API_RETURN_OK return v8::True(); +#define API_RETURN_ERROR return v8::False(); +#define API_RETURN_EMPTY \ + return String::New(""); +#define API_RETURN_STRING(__string) \ + if (__string) \ + return String::New(__string); \ + return String::New("") +#define API_RETURN_STRING_FREE(__string) \ + if (__string) \ + { \ + Handle return_value = String::New(__string); \ + free ((void *)__string); \ + return return_value; \ + } \ + return String::New("") +#define API_RETURN_INT(__int) \ + return Integer::New(__int) +#define API_RETURN_LONG(__int) \ + return Integer::New(__int) + + +/* + * Registers a javascript script. + */ + +API_FUNC(register) +{ + API_INIT_FUNC(0, "register", "sssssss", API_RETURN_ERROR); + + if (js_registered_script) + { + /* script already registered */ + weechat_printf (NULL, + weechat_gettext ("%s%s: script \"%s\" already " + "registered (register ignored)"), + weechat_prefix ("error"), JS_PLUGIN_NAME, + js_registered_script->name); + API_RETURN_ERROR; + } + + js_current_script = NULL; + js_registered_script = NULL; + + String::Utf8Value name(args[0]); + String::Utf8Value author(args[1]); + String::Utf8Value version(args[2]); + String::Utf8Value license(args[3]); + String::Utf8Value description(args[4]); + String::Utf8Value shutdown_func(args[5]); + String::Utf8Value charset(args[6]); + + if (plugin_script_search (weechat_js_plugin, js_scripts, *name)) + { + /* another script already exists with same name */ + weechat_printf (NULL, + weechat_gettext ("%s%s: unable to register script " + "\"%s\" (another script already " + "exists with this name)"), + weechat_prefix ("error"), JS_PLUGIN_NAME, *name); + API_RETURN_ERROR; + } + + /* register script */ + js_current_script = plugin_script_add (weechat_js_plugin, + &js_scripts, &last_js_script, + (js_current_script_filename) ? + js_current_script_filename : "", + *name, *author, *version, + *license, *description, + *shutdown_func, *charset); + + if (js_current_script) + { + js_registered_script = js_current_script; + if ((weechat_js_plugin->debug >= 2) || !js_quiet) + { + weechat_printf (NULL, + weechat_gettext ("%s: registered script \"%s\", " + "version %s (%s)"), + JS_PLUGIN_NAME, *name, *version, *description); + } + js_current_script->interpreter = js_current_interpreter; + } + else + { + API_RETURN_ERROR; + } + + API_RETURN_OK; +} + +/* + * Wrappers for functions in scripting API. + * + * For more info about these functions, look at their implementation in WeeChat + * core. + */ + +API_FUNC(plugin_get_name) +{ + const char *result; + + API_INIT_FUNC(1, "plugin_get_name", "s", API_RETURN_EMPTY); + + String::Utf8Value plugin(args[0]); + + result = weechat_plugin_get_name ( + (struct t_weechat_plugin *)API_STR2PTR(*plugin)); + + API_RETURN_STRING(result); +} + +API_FUNC(charset_set) +{ + API_INIT_FUNC(1, "charset_set", "s", API_RETURN_ERROR); + + String::Utf8Value charset(args[0]); + + plugin_script_api_charset_set (js_current_script, *charset); + + API_RETURN_OK; +} + +API_FUNC(iconv_to_internal) +{ + char *result; + + API_INIT_FUNC(1, "iconv_to_internal", "ss", API_RETURN_EMPTY); + + String::Utf8Value charset(args[0]); + String::Utf8Value string(args[1]); + + result = weechat_iconv_to_internal (*charset, *string); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(iconv_from_internal) +{ + char *result; + + API_INIT_FUNC(1, "iconv_from_internal", "ss", API_RETURN_EMPTY); + + String::Utf8Value charset(args[0]); + String::Utf8Value string(args[1]); + + result = weechat_iconv_from_internal (*charset, *string); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(gettext) +{ + const char *result; + + API_INIT_FUNC(1, "gettext", "s", API_RETURN_EMPTY); + + String::Utf8Value string(args[0]); + + result = weechat_gettext (*string); + + API_RETURN_STRING(result); +} + +API_FUNC(ngettext) +{ + const char *result; + + API_INIT_FUNC(1, "ngettext", "ssi", API_RETURN_EMPTY); + + String::Utf8Value single(args[0]); + String::Utf8Value plural(args[1]); + int count = args[2]->IntegerValue(); + + result = weechat_ngettext (*single, *plural, count); + + API_RETURN_STRING(result); +} + +API_FUNC(strlen_screen) +{ + int value; + + API_INIT_FUNC(1, "strlen_screen", "s", API_RETURN_INT(0)); + + String::Utf8Value string(args[0]); + + value = weechat_strlen_screen (*string); + + API_RETURN_INT(value); +} + +API_FUNC(string_match) +{ + int value; + + API_INIT_FUNC(1, "string_match", "ssi", API_RETURN_INT(0)); + + String::Utf8Value string(args[0]); + String::Utf8Value mask(args[1]); + int case_sensitive = args[2]->IntegerValue(); + + value = weechat_string_match (*string, *mask, case_sensitive); + + API_RETURN_INT(value); +} + +API_FUNC(string_has_highlight) +{ + int value; + + API_INIT_FUNC(1, "string_has_highlight", "ss", API_RETURN_INT(0)); + + String::Utf8Value string(args[0]); + String::Utf8Value highlight_words(args[1]); + + value = weechat_string_has_highlight (*string, *highlight_words); + + API_RETURN_INT(value); +} + +API_FUNC(string_has_highlight_regex) +{ + int value; + + API_INIT_FUNC(1, "string_has_highlight_regex", "ss", API_RETURN_INT(0)); + + String::Utf8Value string(args[0]); + String::Utf8Value regex(args[1]); + + value = weechat_string_has_highlight_regex (*string, *regex); + + API_RETURN_INT(value); +} + +API_FUNC(string_mask_to_regex) +{ + const char *result; + + API_INIT_FUNC(1, "string_mask_to_regex", "s", API_RETURN_EMPTY); + + String::Utf8Value mask(args[0]); + + result = weechat_string_mask_to_regex (*mask); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(string_remove_color) +{ + char *result; + + API_INIT_FUNC(1, "string_remove_color", "ss", API_RETURN_EMPTY); + + String::Utf8Value string(args[0]); + String::Utf8Value replacement(args[1]); + + result = weechat_string_remove_color (*string, *replacement); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(string_is_command_char) +{ + int value; + + API_INIT_FUNC(1, "string_is_command_char", "s", API_RETURN_INT(0)); + + String::Utf8Value string(args[0]); + + value = weechat_string_is_command_char (*string); + + API_RETURN_INT(value); +} + +API_FUNC(string_input_for_buffer) +{ + const char *result; + + API_INIT_FUNC(1, "string_input_for_buffer", "s", API_RETURN_EMPTY); + + String::Utf8Value string(args[0]); + + result = weechat_string_input_for_buffer (*string); + + API_RETURN_STRING(result); +} + +API_FUNC(string_eval_expression) +{ + struct t_hashtable *pointers, *extra_vars, *options; + char *result; + + API_INIT_FUNC(1, "string_eval_expression", "shhh", API_RETURN_EMPTY); + + String::Utf8Value expr(args[0]); + pointers = weechat_js_object_to_hashtable ( + args[1]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_POINTER); + extra_vars = weechat_js_object_to_hashtable ( + args[2]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + options = weechat_js_object_to_hashtable ( + args[3]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + + result = weechat_string_eval_expression (*expr, pointers, extra_vars, + options); + + if (pointers) + weechat_hashtable_free (pointers); + if (extra_vars) + weechat_hashtable_free (extra_vars); + if (options) + weechat_hashtable_free (options); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(mkdir_home) +{ + int mode; + + API_INIT_FUNC(1, "mkdir_home", "si", API_RETURN_ERROR); + + String::Utf8Value directory(args[0]); + mode = args[1]->IntegerValue(); + + if (weechat_mkdir_home (*directory, mode)) + API_RETURN_OK; + + API_RETURN_ERROR; +} + +API_FUNC(mkdir) +{ + int mode; + + API_INIT_FUNC(1, "mkdir", "si", API_RETURN_ERROR); + + String::Utf8Value directory(args[0]); + mode = args[1]->IntegerValue(); + + if (weechat_mkdir (*directory, mode)) + API_RETURN_OK; + + API_RETURN_ERROR; +} + +API_FUNC(mkdir_parents) +{ + int mode; + + API_INIT_FUNC(1, "mkdir_parents", "si", API_RETURN_ERROR); + + String::Utf8Value directory(args[0]); + mode = args[1]->IntegerValue(); + + if (weechat_mkdir_parents (*directory, mode)) + API_RETURN_OK; + + API_RETURN_ERROR; +} + +API_FUNC(list_new) +{ + char *result; + + API_INIT_FUNC(1, "list_new", "", API_RETURN_EMPTY); + + result = API_PTR2STR(weechat_list_new ()); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_add) +{ + char *result; + + API_INIT_FUNC(1, "list_add", "ssss", API_RETURN_EMPTY); + + String::Utf8Value weelist(args[0]); + String::Utf8Value data(args[1]); + String::Utf8Value where(args[2]); + String::Utf8Value user_data(args[3]); + + result = API_PTR2STR( + weechat_list_add ((struct t_weelist *)API_STR2PTR(*weelist), + *data, + *where, + API_STR2PTR(*user_data))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_search) +{ + char *result; + + API_INIT_FUNC(1, "list_search", "ss", API_RETURN_EMPTY); + + String::Utf8Value weelist(args[0]); + String::Utf8Value data(args[1]); + + result = API_PTR2STR( + weechat_list_search ( + (struct t_weelist *)API_STR2PTR(*weelist), *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_search_pos) +{ + int pos; + + API_INIT_FUNC(1, "list_search_pos", "ss", API_RETURN_INT(-1)); + + String::Utf8Value weelist(args[0]); + String::Utf8Value data(args[1]); + + pos = weechat_list_search_pos ( + (struct t_weelist *)API_STR2PTR(*weelist), *data); + + API_RETURN_INT(pos); +} + +API_FUNC(list_casesearch) +{ + char *result; + + API_INIT_FUNC(1, "list_casesearch", "ss", API_RETURN_EMPTY); + + String::Utf8Value weelist(args[0]); + String::Utf8Value data(args[1]); + + result = API_PTR2STR( + weechat_list_casesearch ( + (struct t_weelist *)API_STR2PTR(*weelist), *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_casesearch_pos) +{ + int pos; + + API_INIT_FUNC(1, "list_casesearch_pos", "ss", API_RETURN_INT(-1)); + + String::Utf8Value weelist(args[0]); + String::Utf8Value data(args[1]); + + pos = weechat_list_casesearch_pos ( + (struct t_weelist *)API_STR2PTR(*weelist), *data); + + API_RETURN_INT(pos); +} + +API_FUNC(list_get) +{ + int position; + char *result; + + API_INIT_FUNC(1, "list_get", "si", API_RETURN_EMPTY); + + String::Utf8Value weelist(args[0]); + position = args[1]->IntegerValue(); + + result = API_PTR2STR( + weechat_list_get ((struct t_weelist *)API_STR2PTR(*weelist), + position)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_set) +{ + API_INIT_FUNC(1, "list_set", "ss", API_RETURN_ERROR); + + String::Utf8Value item(args[0]); + String::Utf8Value new_value(args[1]); + + weechat_list_set ((struct t_weelist_item *)API_STR2PTR(*item), *new_value); + + API_RETURN_OK; +} + +API_FUNC(list_next) +{ + char *result; + + API_INIT_FUNC(1, "list_next", "s", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + + result = API_PTR2STR( + weechat_list_next ((struct t_weelist_item *)API_STR2PTR(*item))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_prev) +{ + char *result; + + API_INIT_FUNC(1, "list_prev", "s", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + + result = API_PTR2STR( + weechat_list_prev ((struct t_weelist_item *)API_STR2PTR(*item))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(list_string) +{ + const char *result; + + API_INIT_FUNC(1, "list_string", "s", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + + result = weechat_list_string ( + (struct t_weelist_item *)API_STR2PTR(*item)); + + API_RETURN_STRING(result); +} + +API_FUNC(list_size) +{ + int size; + + API_INIT_FUNC(1, "list_size", "s", API_RETURN_INT(0)); + + String::Utf8Value weelist(args[0]); + + size = weechat_list_size ((struct t_weelist *)API_STR2PTR(*weelist)); + + API_RETURN_INT(size); +} + +API_FUNC(list_remove) +{ + API_INIT_FUNC(1, "list_remove", "ss", API_RETURN_ERROR); + + String::Utf8Value weelist(args[0]); + String::Utf8Value item(args[1]); + + weechat_list_remove ((struct t_weelist *)API_STR2PTR(*weelist), + (struct t_weelist_item *)API_STR2PTR(*item)); + + API_RETURN_OK; +} + +API_FUNC(list_remove_all) +{ + API_INIT_FUNC(1, "list_remove_all", "s", API_RETURN_ERROR); + + String::Utf8Value weelist(args[0]); + + weechat_list_remove_all ((struct t_weelist *)API_STR2PTR(*weelist)); + + API_RETURN_OK; +} + +API_FUNC(list_free) +{ + API_INIT_FUNC(1, "list_free", "s", API_RETURN_ERROR); + if (args.Length() < 1) + API_WRONG_ARGS(API_RETURN_ERROR); + + String::Utf8Value weelist(args[0]); + + weechat_list_free ((struct t_weelist *)API_STR2PTR(*weelist)); + + API_RETURN_OK; +} + +int +weechat_js_api_config_reload_cb (void *data, struct t_config_file *config_file) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_READ_FILE_NOT_FOUND; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_CONFIG_READ_FILE_NOT_FOUND; +} + +API_FUNC(config_new) +{ + char *result; + + API_INIT_FUNC(1, "config_new", "sss", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_config_new (weechat_js_plugin, + js_current_script, + *name, + &weechat_js_api_config_reload_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_config_read_cb (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, const char *value) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[5]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + func_argv[2] = API_PTR2STR(section); + func_argv[3] = (option_name) ? (char *)option_name : empty_arg; + func_argv[4] = (value) ? (char *)value : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sssss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_OPTION_SET_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[2]) + free (func_argv[2]); + + return ret; + } + + return WEECHAT_CONFIG_OPTION_SET_ERROR; +} + +int +weechat_js_api_config_section_write_cb (void *data, + struct t_config_file *config_file, + const char *section_name) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + func_argv[2] = (section_name) ? (char *)section_name : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_WRITE_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_CONFIG_WRITE_ERROR; +} + +int +weechat_js_api_config_section_write_default_cb (void *data, + struct t_config_file *config_file, + const char *section_name) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + func_argv[2] = (section_name) ? (char *)section_name : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_WRITE_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_CONFIG_WRITE_ERROR; +} + +int +weechat_js_api_config_section_create_option_cb (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + const char *option_name, + const char *value) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[5]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + func_argv[2] = API_PTR2STR(section); + func_argv[3] = (option_name) ? (char *)option_name : empty_arg; + func_argv[4] = (value) ? (char *)value : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sssss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_OPTION_SET_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[2]) + free (func_argv[2]); + + return ret; + } + + return WEECHAT_CONFIG_OPTION_SET_ERROR; +} + +int +weechat_js_api_config_section_delete_option_cb (void *data, + struct t_config_file *config_file, + struct t_config_section *section, + struct t_config_option *option) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[4]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(config_file); + func_argv[2] = API_PTR2STR(section); + func_argv[3] = API_PTR2STR(option); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssss", func_argv); + + if (!rc) + ret = WEECHAT_CONFIG_OPTION_UNSET_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[2]) + free (func_argv[2]); + if (func_argv[3]) + free (func_argv[3]); + + return ret; + } + + return WEECHAT_CONFIG_OPTION_UNSET_ERROR; +} + +API_FUNC(config_new_section) +{ + int user_can_add_options, user_can_delete_options; + char *result; + + API_INIT_FUNC(1, "config_new_section", "ssiissssssssss", API_RETURN_EMPTY); + + String::Utf8Value config_file(args[0]); + String::Utf8Value name(args[1]); + user_can_add_options = args[2]->IntegerValue(); + user_can_delete_options = args[3]->IntegerValue(); + String::Utf8Value function_read(args[4]); + String::Utf8Value data_read(args[5]); + String::Utf8Value function_write(args[6]); + String::Utf8Value data_write(args[7]); + String::Utf8Value function_write_default(args[8]); + String::Utf8Value data_write_default(args[9]); + String::Utf8Value function_create_option(args[10]); + String::Utf8Value data_create_option(args[11]); + String::Utf8Value function_delete_option(args[12]); + String::Utf8Value data_delete_option(args[13]); + + result = API_PTR2STR( + plugin_script_api_config_new_section ( + weechat_js_plugin, + js_current_script, + (struct t_config_file *)API_STR2PTR(*config_file), + *name, + user_can_add_options, + user_can_delete_options, + &weechat_js_api_config_read_cb, + *function_read, + *data_read, + &weechat_js_api_config_section_write_cb, + *function_write, + *data_write, + &weechat_js_api_config_section_write_default_cb, + *function_write_default, + *data_write_default, + &weechat_js_api_config_section_create_option_cb, + *function_create_option, + *data_create_option, + &weechat_js_api_config_section_delete_option_cb, + *function_delete_option, + *data_delete_option)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(config_search_section) +{ + char *result; + + API_INIT_FUNC(1, "config_search_section", "ss", API_RETURN_EMPTY); + + String::Utf8Value config_file(args[0]); + String::Utf8Value section_name(args[1]); + + result = API_PTR2STR( + weechat_config_search_section ( + (struct t_config_file *) API_STR2PTR(*config_file), + *section_name)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_config_option_check_value_cb (void *data, + struct t_config_option *option, + const char *value) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(option); + func_argv[2] = (value) ? (char *)value : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = 0; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return 0; +} + +void +weechat_js_api_config_option_change_cb (void *data, + struct t_config_option *option) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char empty_arg[1] = { '\0' }; + int *rc; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(option); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (func_argv[1]) + free (func_argv[1]); + + if (rc) + free (rc); + } +} + +void +weechat_js_api_config_option_delete_cb (void *data, + struct t_config_option *option) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char empty_arg[1] = { '\0' }; + int *rc; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(option); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (func_argv[1]) + free (func_argv[1]); + + if (rc) + free (rc); + } +} + +API_FUNC(config_new_option) +{ + int min, max, null_value_allowed; + char *result; + + API_INIT_FUNC(1, "config_new_option", "ssssssiississssss", API_RETURN_EMPTY); + + String::Utf8Value config_file(args[0]); + String::Utf8Value section(args[1]); + String::Utf8Value name(args[2]); + String::Utf8Value type(args[3]); + String::Utf8Value description(args[4]); + String::Utf8Value string_values(args[5]); + min = args[6]->IntegerValue(); + max = args[7]->IntegerValue(); + String::Utf8Value default_value(args[8]); + String::Utf8Value value(args[9]); + null_value_allowed = args[10]->IntegerValue(); + String::Utf8Value function_check_value(args[11]); + String::Utf8Value data_check_value(args[12]); + String::Utf8Value function_change(args[13]); + String::Utf8Value data_change(args[14]); + String::Utf8Value function_delete(args[15]); + String::Utf8Value data_delete(args[16]); + + result = API_PTR2STR( + plugin_script_api_config_new_option ( + weechat_js_plugin, + js_current_script, + (struct t_config_file *)API_STR2PTR(*config_file), + (struct t_config_section *)API_STR2PTR(*section), + *name, + *type, + *description, + *string_values, + min, + max, + *default_value, + *value, + null_value_allowed, + &weechat_js_api_config_option_check_value_cb, + *function_check_value, + *data_check_value, + &weechat_js_api_config_option_change_cb, + *function_change, + *data_change, + &weechat_js_api_config_option_delete_cb, + *function_delete, + *data_delete)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(config_search_option) +{ + char *result; + + API_INIT_FUNC(1, "config_search_option", "sss", API_RETURN_EMPTY); + + String::Utf8Value config_file(args[0]); + String::Utf8Value section(args[1]); + String::Utf8Value option_name(args[2]); + + result = API_PTR2STR( + weechat_config_search_option ( + (struct t_config_file *)API_STR2PTR(*config_file), + (struct t_config_section *)API_STR2PTR(*section), + *option_name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(config_string_to_boolean) +{ + int value; + + API_INIT_FUNC(1, "config_string_to_boolean", "s", API_RETURN_INT(0)); + + String::Utf8Value text(args[0]); + + value = weechat_config_string_to_boolean (*text); + + API_RETURN_INT(value); +} + +API_FUNC(config_option_reset) +{ + int run_callback, rc; + + API_INIT_FUNC(1, "config_option_reset", "si", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + run_callback = args[1]->IntegerValue(); + + rc = weechat_config_option_reset ( + (struct t_config_option *)API_STR2PTR(*option), run_callback); + + API_RETURN_INT(rc); +} + +API_FUNC(config_option_set) +{ + int run_callback, rc; + + API_INIT_FUNC(1, "config_option_set", "ssi", API_RETURN_INT(WEECHAT_CONFIG_OPTION_SET_ERROR)); + + String::Utf8Value option(args[0]); + String::Utf8Value value(args[1]); + run_callback = args[2]->IntegerValue(); + + rc = weechat_config_option_set ( + (struct t_config_option *)API_STR2PTR(*option), *value, run_callback); + + API_RETURN_INT(rc); +} + +API_FUNC(config_option_set_null) +{ + int run_callback, rc; + + API_INIT_FUNC(1, "config_option_set_null", "si", API_RETURN_INT(WEECHAT_CONFIG_OPTION_SET_ERROR)); + + String::Utf8Value option(args[0]); + run_callback = args[1]->IntegerValue(); + + rc = weechat_config_option_set_null ( + (struct t_config_option *)API_STR2PTR(*option), run_callback); + + API_RETURN_INT(rc); +} + +API_FUNC(config_option_unset) +{ + int rc; + + API_INIT_FUNC(1, "config_option_unset", "s", API_RETURN_INT(WEECHAT_CONFIG_OPTION_UNSET_ERROR)); + + String::Utf8Value option(args[0]); + + rc = weechat_config_option_unset ( + (struct t_config_option *) API_STR2PTR(*option)); + + API_RETURN_INT(rc); +} + +API_FUNC(config_option_rename) +{ + API_INIT_FUNC(1, "config_option_rename", "ss", API_RETURN_ERROR); + + String::Utf8Value option(args[0]); + String::Utf8Value new_name(args[1]); + + weechat_config_option_rename ( + (struct t_config_option *)API_STR2PTR(*option), *new_name); + + API_RETURN_OK; +} + +API_FUNC(config_option_is_null) +{ + int value; + + API_INIT_FUNC(1, "config_option_is_null", "s", API_RETURN_INT(1)); + + String::Utf8Value option(args[0]); + + value = weechat_config_option_is_null ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_option_default_is_null) +{ + int value; + + API_INIT_FUNC(1, "config_option_default_is_null", "s", API_RETURN_INT(1)); + + String::Utf8Value option(args[0]); + + value = weechat_config_option_default_is_null ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_boolean) +{ + int value; + + API_INIT_FUNC(1, "config_boolean", "s", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + + value = weechat_config_boolean ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_boolean_default) +{ + int value; + + API_INIT_FUNC(1, "config_boolean_default", "s", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + + value = weechat_config_boolean_default ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_integer) +{ + int value; + + API_INIT_FUNC(1, "config_integer", "s", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + + value = weechat_config_integer ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_integer_default) +{ + int value; + + API_INIT_FUNC(1, "config_integer_default", "s", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + + value = weechat_config_integer_default ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_INT(value); +} + +API_FUNC(config_string) +{ + const char *result; + + API_INIT_FUNC(1, "config_string", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = weechat_config_string ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_STRING(result); +} + +API_FUNC(config_string_default) +{ + const char *result; + + API_INIT_FUNC(1, "config_string_default", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = weechat_config_string_default ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_STRING(result); +} + +API_FUNC(config_color) +{ + const char *result; + + API_INIT_FUNC(1, "config_color", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = weechat_config_color ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_STRING(result); +} + +API_FUNC(config_color_default) +{ + const char *result; + + API_INIT_FUNC(1, "config_color_default", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = weechat_config_color_default ( + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_STRING(result); +} + +API_FUNC(config_write_option) +{ + API_INIT_FUNC(1, "config_write_option", "ss", API_RETURN_ERROR); + + String::Utf8Value config_file(args[0]); + String::Utf8Value option(args[1]); + + weechat_config_write_option ( + (struct t_config_file *)API_STR2PTR(*config_file), + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_OK; +} + +API_FUNC(config_write_line) +{ + API_INIT_FUNC(1, "config_write_line", "sss", API_RETURN_ERROR); + + String::Utf8Value config_file(args[0]); + String::Utf8Value option_name(args[1]); + String::Utf8Value value(args[2]); + + weechat_config_write_line ( + (struct t_config_file *)API_STR2PTR(*config_file), + *option_name, + "%s", + *value); + + API_RETURN_OK; +} + +API_FUNC(config_write) +{ + int rc; + + API_INIT_FUNC(1, "config_write", "s", API_RETURN_INT(WEECHAT_CONFIG_WRITE_ERROR)); + + String::Utf8Value config_file(args[0]); + + rc = weechat_config_write ( + (struct t_config_file *)API_STR2PTR(*config_file)); + + API_RETURN_INT(rc); +} + +API_FUNC(config_read) +{ + int rc; + + API_INIT_FUNC(1, "config_read", "s", API_RETURN_INT(-1)); + + String::Utf8Value config_file(args[0]); + + rc = weechat_config_read ( + (struct t_config_file *)API_STR2PTR(*config_file)); + + API_RETURN_INT(rc); +} + +API_FUNC(config_reload) +{ + int rc; + + API_INIT_FUNC(1, "config_reload", "s", API_RETURN_INT(-1)); + + String::Utf8Value config_file(args[0]); + + rc = weechat_config_reload ( + (struct t_config_file *)API_STR2PTR(*config_file)); + + API_RETURN_INT(rc); +} + +API_FUNC(config_option_free) +{ + API_INIT_FUNC(1, "config_option_free", "s", API_RETURN_ERROR); + + String::Utf8Value option(args[0]); + + plugin_script_api_config_option_free ( + weechat_js_plugin, + js_current_script, + (struct t_config_option *)API_STR2PTR(*option)); + + API_RETURN_OK; +} + +API_FUNC(config_section_free_options) +{ + API_INIT_FUNC(1, "config_section_free_options", "s", API_RETURN_ERROR); + + String::Utf8Value section(args[0]); + + plugin_script_api_config_section_free_options ( + weechat_js_plugin, + js_current_script, + (struct t_config_section *)API_STR2PTR(*section)); + + API_RETURN_OK; +} + +API_FUNC(config_section_free) +{ + API_INIT_FUNC(1, "config_section_free", "s", API_RETURN_ERROR); + + String::Utf8Value section(args[0]); + + plugin_script_api_config_section_free ( + weechat_js_plugin, + js_current_script, + (struct t_config_section *)API_STR2PTR(*section)); + + API_RETURN_OK; +} + +API_FUNC(config_free) +{ + API_INIT_FUNC(1, "config_free", "s", API_RETURN_ERROR); + + String::Utf8Value config_file(args[0]); + + plugin_script_api_config_free ( + weechat_js_plugin, + js_current_script, + (struct t_config_file *)API_STR2PTR(*config_file)); + + API_RETURN_OK; +} + +API_FUNC(config_get) +{ + char *result; + + API_INIT_FUNC(1, "config_get", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = API_PTR2STR(weechat_config_get (*option)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(config_get_plugin) +{ + const char *result; + + API_INIT_FUNC(1, "config_get_plugin", "s", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + + result = plugin_script_api_config_get_plugin (weechat_js_plugin, + js_current_script, + *option); + + API_RETURN_STRING(result); +} + +API_FUNC(config_is_set_plugin) +{ + int rc; + + API_INIT_FUNC(1, "config_is_set_plugin", "s", API_RETURN_INT(0)); + + String::Utf8Value option(args[0]); + + rc = plugin_script_api_config_is_set_plugin (weechat_js_plugin, + js_current_script, + *option); + + API_RETURN_INT(rc); +} + +API_FUNC(config_set_plugin) +{ + int rc; + + API_INIT_FUNC(1, "config_set_plugin", "ss", API_RETURN_INT(WEECHAT_CONFIG_OPTION_SET_ERROR)); + + String::Utf8Value option(args[0]); + String::Utf8Value value(args[1]); + + rc = plugin_script_api_config_set_plugin (weechat_js_plugin, + js_current_script, + *option, + *value); + + API_RETURN_INT(rc); +} + +API_FUNC(config_set_desc_plugin) +{ + API_INIT_FUNC(1, "config_set_desc_plugin", "ss", API_RETURN_ERROR); + + String::Utf8Value option(args[0]); + String::Utf8Value description(args[1]); + + plugin_script_api_config_set_desc_plugin (weechat_js_plugin, + js_current_script, + *option, + *description); + + API_RETURN_OK; +} + +API_FUNC(config_unset_plugin) +{ + int rc; + + API_INIT_FUNC(1, "config_unset_plugin", "s", API_RETURN_INT(WEECHAT_CONFIG_OPTION_UNSET_ERROR)); + + String::Utf8Value option(args[0]); + + rc = plugin_script_api_config_unset_plugin (weechat_js_plugin, + js_current_script, + *option); + + API_RETURN_INT(rc); +} + +API_FUNC(key_bind) +{ + struct t_hashtable *hashtable; + Handle obj; + int num_keys; + + API_INIT_FUNC(1, "key_bind", "sh", API_RETURN_INT(0)); + + String::Utf8Value context(args[0]); + hashtable = weechat_js_object_to_hashtable ( + args[1]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + + num_keys = weechat_key_bind (*context, hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + + API_RETURN_INT(num_keys); +} + +API_FUNC(key_unbind) +{ + int num_keys; + + API_INIT_FUNC(1, "key_unbind", "ss", API_RETURN_INT(0)); + + String::Utf8Value context(args[0]); + String::Utf8Value key(args[1]); + + num_keys = weechat_key_unbind (*context, *key); + + API_RETURN_INT(num_keys); +} + +API_FUNC(prefix) +{ + const char *result; + + API_INIT_FUNC(0, "prefix", "s", API_RETURN_EMPTY); + + String::Utf8Value prefix(args[0]); + + result = weechat_prefix (*prefix); + + API_RETURN_STRING(result); +} + +API_FUNC(color) +{ + const char *result; + + API_INIT_FUNC(0, "color", "s", API_RETURN_EMPTY); + + String::Utf8Value color(args[0]); + + result = weechat_color (*color); + + API_RETURN_STRING(result); +} + +API_FUNC(print) +{ + API_INIT_FUNC(0, "print", "ss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value message(args[1]); + + plugin_script_api_printf (weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + "%s", *message); + + API_RETURN_OK; +} + +API_FUNC(print_date_tags) +{ + int date; + + API_INIT_FUNC(1, "print_date_tags", "siss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + date = args[1]->IntegerValue(); + String::Utf8Value tags(args[2]); + String::Utf8Value message(args[3]); + + plugin_script_api_printf_date_tags ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + date, + *tags, + "%s", *message); + + API_RETURN_OK; +} + +API_FUNC(print_y) +{ + int y; + + API_INIT_FUNC(1, "print_y", "sis", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + y = args[1]->IntegerValue(); + String::Utf8Value message(args[2]); + + plugin_script_api_printf_y (weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + y, + "%s", *message); + + API_RETURN_OK; +} + +API_FUNC(log_print) +{ + API_INIT_FUNC(1, "log_print", "s", API_RETURN_ERROR); + + String::Utf8Value message(args[0]); + + plugin_script_api_log_printf (weechat_js_plugin, + js_current_script, + "%s", *message); + + API_RETURN_OK; +} + +int +weechat_js_api_hook_command_cb (void *data, struct t_gui_buffer *buffer, + int argc, char **argv, char **argv_eol) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + /* make C++ compiler happy */ + (void) argv; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(buffer); + func_argv[2] = (argc > 1) ? argv_eol[1] : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_command) +{ + char *result; + + API_INIT_FUNC(1, "hook_command", "sssssss", API_RETURN_EMPTY); + + String::Utf8Value command(args[0]); + String::Utf8Value description(args[1]); + String::Utf8Value arguments(args[2]); + String::Utf8Value args_description(args[3]); + String::Utf8Value completion(args[4]); + String::Utf8Value function(args[5]); + String::Utf8Value data(args[6]); + + result = API_PTR2STR( + plugin_script_api_hook_command (weechat_js_plugin, + js_current_script, + *command, + *description, + *arguments, + *args_description, + *completion, + &weechat_js_api_hook_command_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_command_run_cb (void *data, struct t_gui_buffer *buffer, + const char *command) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(buffer); + func_argv[2] = (command) ? (char *)command : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_command_run) +{ + char *result; + + API_INIT_FUNC(1, "hook_command_run", "sss", API_RETURN_EMPTY); + + String::Utf8Value command(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_command_run ( + weechat_js_plugin, + js_current_script, + *command, + &weechat_js_api_hook_command_run_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_timer_cb (void *data, int remaining_calls) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char str_remaining_calls[32], empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + snprintf (str_remaining_calls, sizeof (str_remaining_calls), + "%d", remaining_calls); + + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = str_remaining_calls; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_timer) +{ + int interval, align_second, max_calls; + char *result; + + API_INIT_FUNC(1, "hook_timer", "iiiss", API_RETURN_EMPTY); + + interval = args[0]->IntegerValue(); + align_second = args[1]->IntegerValue(); + max_calls = args[2]->IntegerValue(); + String::Utf8Value function(args[3]); + String::Utf8Value data(args[4]); + + result = API_PTR2STR( + plugin_script_api_hook_timer ( + weechat_js_plugin, + js_current_script, + interval, + align_second, + max_calls, + &weechat_js_api_hook_timer_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_fd_cb (void *data, int fd) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char str_fd[32], empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + snprintf (str_fd, sizeof (str_fd), "%d", fd); + + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = str_fd; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_fd) +{ + int fd, read, write, exception; + char *result; + + API_INIT_FUNC(1, "hook_fd", "iiiiss", API_RETURN_EMPTY); + + fd = args[0]->IntegerValue(); + read = args[1]->IntegerValue(); + write = args[2]->IntegerValue(); + exception = args[3]->IntegerValue(); + String::Utf8Value function(args[4]); + String::Utf8Value data(args[5]); + + result = API_PTR2STR( + plugin_script_api_hook_fd ( + weechat_js_plugin, + js_current_script, + fd, + read, + write, + exception, + &weechat_js_api_hook_fd_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_process_cb (void *data, + const char *command, int return_code, + const char *out, const char *err) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[5]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (command) ? (char *)command : empty_arg; + func_argv[2] = &return_code; + func_argv[3] = (out) ? (char *)out : empty_arg; + func_argv[4] = (err) ? (char *)err : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssiss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_process) +{ + int timeout; + char *result; + + API_INIT_FUNC(1, "hook_process", "siss", API_RETURN_EMPTY); + + String::Utf8Value command(args[0]); + timeout = args[1]->IntegerValue(); + String::Utf8Value function(args[2]); + String::Utf8Value data(args[3]); + + result = API_PTR2STR( + plugin_script_api_hook_process ( + weechat_js_plugin, + js_current_script, + *command, + timeout, + &weechat_js_api_hook_process_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_process_hashtable) +{ + struct t_hashtable *options; + int timeout; + char *result; + + API_INIT_FUNC(1, "hook_process_hashtable", "shiss", API_RETURN_EMPTY); + + String::Utf8Value command(args[0]); + options = weechat_js_object_to_hashtable ( + args[1]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + timeout = args[2]->IntegerValue(); + String::Utf8Value function(args[3]); + String::Utf8Value data(args[4]); + + result = API_PTR2STR( + plugin_script_api_hook_process_hashtable ( + weechat_js_plugin, + js_current_script, + *command, + options, + timeout, + &weechat_js_api_hook_process_cb, + *function, + *data)); + + if (options) + weechat_hashtable_free (options); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_connect_cb (void *data, int status, int gnutls_rc, + int sock, const char *error, + const char *ip_address) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[6]; + char str_status[32], str_gnutls_rc[32], str_sock[32]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + snprintf (str_status, sizeof (str_status), "%d", status); + snprintf (str_gnutls_rc, sizeof (str_gnutls_rc), "%d", gnutls_rc); + snprintf (str_sock, sizeof (str_sock), "%d", sock); + + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = str_status; + func_argv[2] = str_gnutls_rc; + func_argv[3] = str_sock; + func_argv[4] = (ip_address) ? (char *)ip_address : empty_arg; + func_argv[5] = (error) ? (char *)error : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssssss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_connect) +{ + int port, ipv6, retry; + char *result; + + API_INIT_FUNC(1, "hook_connect", "ssiiisss", API_RETURN_EMPTY); + + String::Utf8Value proxy(args[0]); + String::Utf8Value address(args[1]); + port = args[2]->IntegerValue(); + ipv6 = args[3]->IntegerValue(); + retry = args[4]->IntegerValue(); + String::Utf8Value local_hostname(args[5]); + String::Utf8Value function(args[6]); + String::Utf8Value data(args[7]); + + result = API_PTR2STR( + plugin_script_api_hook_connect ( + weechat_js_plugin, + js_current_script, + *proxy, + *address, + port, + ipv6, + retry, + NULL, /* gnutls session */ + NULL, /* gnutls callback */ + 0, /* gnutls DH key size */ + NULL, /* gnutls priorities */ + *local_hostname, + &weechat_js_api_hook_connect_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_print_cb (void *data, struct t_gui_buffer *buffer, + time_t date, + int tags_count, const char **tags, + int displayed, int highlight, + const char *prefix, const char *message) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[8]; + char empty_arg[1] = { '\0' }; + static char timebuffer[64]; + int *rc, ret; + + /* make C compiler happy */ + (void) tags_count; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + snprintf (timebuffer, sizeof (timebuffer), "%ld", (long int)date); + + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(buffer); + func_argv[2] = timebuffer; + func_argv[3] = weechat_string_build_with_split_string (tags, ","); + if (!func_argv[3]) + func_argv[3] = strdup (""); + func_argv[4] = &displayed; + func_argv[5] = &highlight; + func_argv[6] = (prefix) ? (char *)prefix : empty_arg; + func_argv[7] = (message) ? (char *)message : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssssiiss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[3]) + free (func_argv[3]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_print) +{ + int strip_colors; + char *result; + + API_INIT_FUNC(1, "hook_print", "sssiss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value tags(args[1]); + String::Utf8Value message(args[2]); + strip_colors = args[3]->IntegerValue(); + String::Utf8Value function(args[4]); + String::Utf8Value data(args[5]); + + result = API_PTR2STR( + plugin_script_api_hook_print ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *tags, + *message, + strip_colors, + &weechat_js_api_hook_print_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_signal_cb (void *data, const char *signal, + const char *type_data, void *signal_data) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + static char str_value[64]; + int *rc, ret, free_needed; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (signal) ? (char *)signal : empty_arg; + free_needed = 0; + if (strcmp (type_data, WEECHAT_HOOK_SIGNAL_STRING) == 0) + { + func_argv[2] = (signal_data) ? (char *)signal_data : empty_arg; + } + else if (strcmp (type_data, WEECHAT_HOOK_SIGNAL_INT) == 0) + { + str_value[0] = '\0'; + if (signal_data) + { + snprintf (str_value, sizeof (str_value), + "%d", *((int *)signal_data)); + } + func_argv[2] = str_value; + } + else if (strcmp (type_data, WEECHAT_HOOK_SIGNAL_POINTER) == 0) + { + func_argv[2] = API_PTR2STR(signal_data); + free_needed = 1; + } + else + func_argv[2] = empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (free_needed && func_argv[2]) + free (func_argv[2]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_signal) +{ + char *result; + + API_INIT_FUNC(1, "hook_signal", "sss", API_RETURN_EMPTY); + + String::Utf8Value signal(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_signal ( + weechat_js_plugin, + js_current_script, + *signal, + &weechat_js_api_hook_signal_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_signal_send) +{ + char *error; + int number, rc; + + API_INIT_FUNC(1, "hook_signal_send", "sss", API_RETURN_INT(WEECHAT_RC_ERROR)); + + String::Utf8Value signal(args[0]); + String::Utf8Value type_data(args[1]); + String::Utf8Value signal_data(args[2]); + + if (strcmp (*type_data, WEECHAT_HOOK_SIGNAL_STRING) == 0) + { + rc = weechat_hook_signal_send (*signal, *type_data, *signal_data); + API_RETURN_INT(rc); + } + else if (strcmp (*type_data, WEECHAT_HOOK_SIGNAL_INT) == 0) + { + error = NULL; + number = (int)strtol (*signal_data, &error, 10); + if (error && !error[0]) + rc = weechat_hook_signal_send (*signal, *type_data, &number); + else + rc = WEECHAT_RC_ERROR; + API_RETURN_INT(rc); + } + else if (strcmp (*type_data, WEECHAT_HOOK_SIGNAL_POINTER) == 0) + { + rc = weechat_hook_signal_send (*signal, *type_data, + API_STR2PTR(*signal_data)); + API_RETURN_INT(rc); + } + + API_RETURN_INT(WEECHAT_RC_ERROR); +} + +int +weechat_js_api_hook_hsignal_cb (void *data, const char *signal, + struct t_hashtable *hashtable) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (signal) ? (char *)signal : empty_arg; + func_argv[2] = hashtable; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssh", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_hsignal) +{ + char *result; + + API_INIT_FUNC(1, "hook_hsignal", "sss", API_RETURN_EMPTY); + + String::Utf8Value signal(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_hsignal ( + weechat_js_plugin, + js_current_script, + *signal, + &weechat_js_api_hook_hsignal_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_hsignal_send) +{ + struct t_hashtable *hashtable; + int rc; + + API_INIT_FUNC(1, "hook_hsignal_send", "sh", API_RETURN_INT(WEECHAT_RC_ERROR)); + + String::Utf8Value signal(args[0]); + hashtable = weechat_js_object_to_hashtable ( + args[1]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + + rc = weechat_hook_hsignal_send (*signal, hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + + API_RETURN_INT(rc); +} + +int +weechat_js_api_hook_config_cb (void *data, const char *option, + const char *value) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (option) ? (char *)option : empty_arg; + func_argv[2] = (value) ? (char *)value : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_config) +{ + char *result; + + API_INIT_FUNC(1, "hook_config", "sss", API_RETURN_EMPTY); + + String::Utf8Value option(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_config ( + weechat_js_plugin, + js_current_script, + *option, + &weechat_js_api_hook_config_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +int +weechat_js_api_hook_completion_cb (void *data, const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[4]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (completion_item) ? (char *)completion_item : empty_arg; + func_argv[2] = API_PTR2STR(buffer); + func_argv[3] = API_PTR2STR(completion); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[2]) + free (func_argv[2]); + if (func_argv[3]) + free (func_argv[3]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(hook_completion) +{ + char *result; + + API_INIT_FUNC(1, "hook_completion", "ssss", API_RETURN_EMPTY); + + String::Utf8Value completion(args[0]); + String::Utf8Value description(args[1]); + String::Utf8Value function(args[2]); + String::Utf8Value data(args[3]); + + result = API_PTR2STR( + plugin_script_api_hook_completion ( + weechat_js_plugin, + js_current_script, + *completion, + *description, + &weechat_js_api_hook_completion_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_completion_list_add) +{ + int nick_completion; + + API_INIT_FUNC(1, "hook_completion_list_add", "ssis", API_RETURN_ERROR); + + String::Utf8Value completion(args[0]); + String::Utf8Value word(args[1]); + nick_completion = args[2]->IntegerValue(); + String::Utf8Value where(args[3]); + + weechat_hook_completion_list_add ( + (struct t_gui_completion *)API_STR2PTR(*completion), + *word, + nick_completion, + *where); + + API_RETURN_OK; +} + +char * +weechat_js_api_hook_modifier_cb (void *data, const char *modifier, + const char *modifier_data, const char *string) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[4]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (modifier) ? (char *)modifier : empty_arg; + func_argv[2] = (modifier_data) ? (char *)modifier_data : empty_arg; + func_argv[3] = (string) ? (char *)string : empty_arg; + + return (char *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_STRING, + script_callback->function, + "ssss", func_argv); + } + + return NULL; +} + +API_FUNC(hook_modifier) +{ + char *result; + + API_INIT_FUNC(1, "hook_modifier", "sss", API_RETURN_EMPTY); + + String::Utf8Value modifier(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_modifier ( + weechat_js_plugin, + js_current_script, + *modifier, + &weechat_js_api_hook_modifier_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_modifier_exec) +{ + char *result; + + API_INIT_FUNC(1, "hook_modifier_exec", "sss", API_RETURN_EMPTY); + + String::Utf8Value modifier(args[0]); + String::Utf8Value modifier_data(args[1]); + String::Utf8Value string(args[2]); + + result = weechat_hook_modifier_exec (*modifier, *modifier_data, *string); + + API_RETURN_STRING_FREE(result); +} + +const char * +weechat_js_api_hook_info_cb (void *data, const char *info_name, + const char *arguments) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (info_name) ? (char *)info_name : empty_arg; + func_argv[2] = (arguments) ? (char *)arguments : empty_arg; + + return (const char *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_STRING, + script_callback->function, + "sss", func_argv); + } + + return NULL; +} + +API_FUNC(hook_info) +{ + char *result; + + API_INIT_FUNC(1, "hook_info", "sssss", API_RETURN_EMPTY); + + String::Utf8Value info_name(args[0]); + String::Utf8Value description(args[1]); + String::Utf8Value args_description(args[2]); + String::Utf8Value function(args[3]); + String::Utf8Value data(args[4]); + + result = API_PTR2STR( + plugin_script_api_hook_info ( + weechat_js_plugin, + js_current_script, + *info_name, + *description, + *args_description, + &weechat_js_api_hook_info_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +struct t_hashtable * +weechat_js_api_hook_info_hashtable_cb (void *data, const char *info_name, + struct t_hashtable *hashtable) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + struct t_hashtable *ret_hashtable; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (info_name) ? (char *)info_name : empty_arg; + func_argv[2] = hashtable; + + ret_hashtable = (struct t_hashtable *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "ssh", func_argv); + + return ret_hashtable; + } + + return NULL; +} + +API_FUNC(hook_info_hashtable) +{ + char *result; + + API_INIT_FUNC(1, "hook_info_hashtable", "ssssss", API_RETURN_EMPTY); + + String::Utf8Value info_name(args[0]); + String::Utf8Value description(args[1]); + String::Utf8Value args_description(args[2]); + String::Utf8Value output_description(args[3]); + String::Utf8Value function(args[4]); + String::Utf8Value data(args[5]); + + result = API_PTR2STR( + plugin_script_api_hook_info_hashtable ( + weechat_js_plugin, + js_current_script, + *info_name, + *description, + *args_description, + *output_description, + &weechat_js_api_hook_info_hashtable_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +struct t_infolist * +weechat_js_api_hook_infolist_cb (void *data, const char *infolist_name, + void *pointer, const char *arguments) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[4]; + char empty_arg[1] = { '\0' }; + struct t_infolist *result; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = (infolist_name) ? (char *)infolist_name : empty_arg; + func_argv[2] = API_PTR2STR(pointer); + func_argv[3] = (arguments) ? (char *)arguments : empty_arg; + + result = (struct t_infolist *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_STRING, + script_callback->function, + "ssss", func_argv); + + if (func_argv[2]) + free (func_argv[2]); + + return result; + } + + return NULL; +} + +API_FUNC(hook_infolist) +{ + char *result; + + API_INIT_FUNC(1, "hook_infolist", "ssssss", API_RETURN_EMPTY); + + String::Utf8Value infolist_name(args[0]); + String::Utf8Value description(args[1]); + String::Utf8Value pointer_description(args[2]); + String::Utf8Value args_description(args[3]); + String::Utf8Value function(args[4]); + String::Utf8Value data(args[5]); + + result = API_PTR2STR( + plugin_script_api_hook_infolist ( + weechat_js_plugin, + js_current_script, + *infolist_name, + *description, + *pointer_description, + *args_description, + &weechat_js_api_hook_infolist_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +struct t_hashtable * +weechat_js_api_hook_focus_cb (void *data, + struct t_hashtable *info) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char empty_arg[1] = { '\0' }; + struct t_hashtable *ret_hashtable; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = info; + + ret_hashtable = (struct t_hashtable *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_HASHTABLE, + script_callback->function, + "sh", func_argv); + + return ret_hashtable; + } + + return NULL; +} + +API_FUNC(hook_focus) +{ + char *result; + + API_INIT_FUNC(1, "hook_focus", "sss", API_RETURN_EMPTY); + + String::Utf8Value area(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_hook_focus ( + weechat_js_plugin, + js_current_script, + *area, + &weechat_js_api_hook_focus_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hook_set) +{ + API_INIT_FUNC(1, "hook_set", "sss", API_RETURN_ERROR); + + String::Utf8Value hook(args[0]); + String::Utf8Value property(args[1]); + String::Utf8Value value(args[2]); + + weechat_hook_set ((struct t_hook *)API_STR2PTR(*hook), *property, *value); + + API_RETURN_OK; +} + +API_FUNC(unhook) +{ + API_INIT_FUNC(1, "unhook", "s", API_RETURN_ERROR); + + String::Utf8Value hook(args[0]); + + plugin_script_api_unhook (weechat_js_plugin, + js_current_script, + (struct t_hook *)API_STR2PTR(*hook)); + + API_RETURN_OK; +} + +API_FUNC(unhook_all) +{ + API_INIT_FUNC(1, "unhook_all", "", API_RETURN_ERROR); + + String::Utf8Value hook(args[0]); + + plugin_script_api_unhook_all (weechat_js_plugin, js_current_script); + + API_RETURN_OK; +} + +int +weechat_js_api_buffer_input_data_cb (void *data, struct t_gui_buffer *buffer, + const char *input_data) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[3]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(buffer); + func_argv[2] = (input_data) ? (char *)input_data : empty_arg; + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "sss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +int +weechat_js_api_buffer_close_cb (void *data, struct t_gui_buffer *buffer) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[2]; + char empty_arg[1] = { '\0' }; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(buffer); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + + if (func_argv[1]) + free (func_argv[1]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(buffer_new) +{ + char *result; + + API_INIT_FUNC(1, "buffer_new", "sssss", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + String::Utf8Value function_input(args[1]); + String::Utf8Value data_input(args[2]); + String::Utf8Value function_close(args[3]); + String::Utf8Value data_close(args[4]); + + result = API_PTR2STR( + plugin_script_api_buffer_new ( + weechat_js_plugin, + js_current_script, + *name, + &weechat_js_api_buffer_input_data_cb, + *function_input, + *data_input, + &weechat_js_api_buffer_close_cb, + *function_close, + *data_close)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(buffer_search) +{ + char *result; + + API_INIT_FUNC(1, "buffer_search", "ss", API_RETURN_EMPTY); + + String::Utf8Value plugin(args[0]); + String::Utf8Value name(args[1]); + + result = API_PTR2STR(weechat_buffer_search (*plugin, *name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(buffer_search_main) +{ + char *result; + + API_INIT_FUNC(1, "buffer_search_main", "", API_RETURN_EMPTY); + + result = API_PTR2STR(weechat_buffer_search_main ()); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(current_buffer) +{ + char *result; + + API_INIT_FUNC(1, "current_buffer", "", API_RETURN_EMPTY); + + result = API_PTR2STR(weechat_current_buffer ()); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(buffer_clear) +{ + API_INIT_FUNC(1, "buffer_clear", "s", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + + weechat_buffer_clear ((struct t_gui_buffer *)API_STR2PTR(*buffer)); + + API_RETURN_OK; +} + +API_FUNC(buffer_close) +{ + API_INIT_FUNC(1, "buffer_close", "s", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + + plugin_script_api_buffer_close ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer)); + + API_RETURN_OK; +} + +API_FUNC(buffer_merge) +{ + API_INIT_FUNC(1, "buffer_merge", "ss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value target_buffer(args[1]); + + weechat_buffer_merge ((struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_buffer *)API_STR2PTR(*target_buffer)); + + API_RETURN_OK; +} + +API_FUNC(buffer_unmerge) +{ + int number; + + API_INIT_FUNC(1, "buffer_merge", "si", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + number = args[1]->IntegerValue(); + + weechat_buffer_unmerge ((struct t_gui_buffer *)API_STR2PTR(*buffer), + number); + + API_RETURN_OK; +} + +API_FUNC(buffer_get_integer) +{ + int value; + + API_INIT_FUNC(1, "buffer_get_integer", "ss", API_RETURN_INT(-1)); + + String::Utf8Value buffer(args[0]); + String::Utf8Value property(args[1]); + + value = weechat_buffer_get_integer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *property); + + API_RETURN_INT(value); +} + +API_FUNC(buffer_get_string) +{ + const char *result; + + API_INIT_FUNC(1, "buffer_get_string", "ss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value property(args[1]); + + result = weechat_buffer_get_string ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *property); + weechat_log_printf ("buffer: %s", *buffer); + weechat_log_printf ("property: %s", *property); + weechat_log_printf ("result: %lx", result); + + API_RETURN_STRING(result); +} + +API_FUNC(buffer_get_pointer) +{ + char *result; + + API_INIT_FUNC(1, "buffer_get_pointer", "ss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value property(args[1]); + + result = API_PTR2STR( + weechat_buffer_get_pointer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *property)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(buffer_set) +{ + API_INIT_FUNC(1, "buffer_set", "sss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value property(args[1]); + String::Utf8Value value(args[2]); + + weechat_buffer_set ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *property, + *value); + + API_RETURN_OK; +} + +API_FUNC(buffer_string_replace_local_var) +{ + char *result; + + API_INIT_FUNC(1, "buffer_string_replace_local_var", "ss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value string(args[1]); + + result = weechat_buffer_string_replace_local_var ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *string); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(buffer_match_list) +{ + int value; + + API_INIT_FUNC(1, "buffer_match_list", "ss", API_RETURN_INT(0)); + + String::Utf8Value buffer(args[0]); + String::Utf8Value string(args[1]); + + value = weechat_buffer_match_list ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *string); + + API_RETURN_INT(value); +} + +API_FUNC(current_window) +{ + char *result; + + API_INIT_FUNC(1, "current_window", "", API_RETURN_EMPTY); + + result = API_PTR2STR(weechat_current_window ()); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(window_search_with_buffer) +{ + char *result; + + API_INIT_FUNC(1, "window_search_with_buffer", "s", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + + result = API_PTR2STR( + weechat_window_search_with_buffer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(window_get_integer) +{ + int value; + + API_INIT_FUNC(1, "window_get_integer", "ss", API_RETURN_INT(-1)); + + String::Utf8Value window(args[0]); + String::Utf8Value property(args[1]); + + value = weechat_window_get_integer ( + (struct t_gui_window *)API_STR2PTR(*window), + *property); + + API_RETURN_INT(value); +} + +API_FUNC(window_get_string) +{ + const char *result; + + API_INIT_FUNC(1, "window_get_string", "ss", API_RETURN_EMPTY); + + String::Utf8Value window(args[0]); + String::Utf8Value property(args[1]); + + result = weechat_window_get_string ( + (struct t_gui_window *)API_STR2PTR(*window), + *property); + + API_RETURN_STRING(result); +} + +API_FUNC(window_get_pointer) +{ + char *result; + + API_INIT_FUNC(1, "window_get_pointer", "ss", API_RETURN_EMPTY); + + String::Utf8Value window(args[0]); + String::Utf8Value property(args[1]); + + result = API_PTR2STR( + weechat_window_get_pointer ( + (struct t_gui_window *)API_STR2PTR(*window), + *property)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(window_set_title) +{ + API_INIT_FUNC(1, "window_set_title", "s", API_RETURN_ERROR); + + String::Utf8Value title(args[0]); + + weechat_window_set_title (*title); + + API_RETURN_OK; +} + +API_FUNC(nicklist_add_group) +{ + int visible; + char *result; + + API_INIT_FUNC(1, "nicklist_add_group", "ssssi", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value parent_group(args[1]); + String::Utf8Value name(args[2]); + String::Utf8Value color(args[3]); + visible = args[4]->IntegerValue(); + + result = API_PTR2STR( + weechat_nicklist_add_group ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*parent_group), + *name, + *color, + visible)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_search_group) +{ + char *result; + + API_INIT_FUNC(1, "nicklist_search_group", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value from_group(args[1]); + String::Utf8Value name(args[2]); + + result = API_PTR2STR( + weechat_nicklist_search_group ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*from_group), + *name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_add_nick) +{ + int visible; + char *result; + + API_INIT_FUNC(1, "nicklist_add_nick", "ssssssi", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + String::Utf8Value name(args[2]); + String::Utf8Value color(args[3]); + String::Utf8Value prefix(args[4]); + String::Utf8Value prefix_color(args[5]); + visible = args[6]->IntegerValue(); + + result = API_PTR2STR( + weechat_nicklist_add_nick ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group), + *name, + *color, + *prefix, + *prefix_color, + visible)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_search_nick) +{ + char *result; + + API_INIT_FUNC(1, "nicklist_search_nick", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value from_group(args[1]); + String::Utf8Value name(args[2]); + + result = API_PTR2STR( + weechat_nicklist_search_nick ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*from_group), + *name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_remove_group) +{ + API_INIT_FUNC(1, "nicklist_remove_group", "ss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + + weechat_nicklist_remove_group ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group)); + + API_RETURN_OK; +} + +API_FUNC(nicklist_remove_nick) +{ + API_INIT_FUNC(1, "nicklist_remove_nick", "ss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value nick(args[1]); + + weechat_nicklist_remove_nick ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick *)API_STR2PTR(*nick)); + + API_RETURN_OK; +} + +API_FUNC(nicklist_remove_all) +{ + API_INIT_FUNC(1, "nicklist_remove_all", "s", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + + weechat_nicklist_remove_all ((struct t_gui_buffer *)API_STR2PTR(*buffer)); + + API_RETURN_OK; +} + +API_FUNC(nicklist_group_get_integer) +{ + int value; + + API_INIT_FUNC(1, "nicklist_group_get_integer", "sss", API_RETURN_INT(-1)); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + String::Utf8Value property(args[2]); + + value = weechat_nicklist_group_get_integer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group), + *property); + + API_RETURN_INT(value); +} + +API_FUNC(nicklist_group_get_string) +{ + const char *result; + + API_INIT_FUNC(1, "nicklist_group_get_string", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + String::Utf8Value property(args[2]); + + result = weechat_nicklist_group_get_string ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group), + *property); + + API_RETURN_STRING(result); +} + +API_FUNC(nicklist_group_get_pointer) +{ + char *result; + + API_INIT_FUNC(1, "nicklist_group_get_pointer", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + String::Utf8Value property(args[2]); + + result = API_PTR2STR( + weechat_nicklist_group_get_pointer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group), + *property)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_group_set) +{ + API_INIT_FUNC(1, "nicklist_group_set", "ssss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value group(args[1]); + String::Utf8Value property(args[2]); + String::Utf8Value value(args[3]); + + weechat_nicklist_group_set ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick_group *)API_STR2PTR(*group), + *property, + *value); + + API_RETURN_OK; +} + +API_FUNC(nicklist_nick_get_integer) +{ + int value; + + API_INIT_FUNC(1, "nicklist_nick_get_integer", "sss", API_RETURN_INT(-1)); + + String::Utf8Value buffer(args[0]); + String::Utf8Value nick(args[1]); + String::Utf8Value property(args[2]); + + value = weechat_nicklist_nick_get_integer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick *)API_STR2PTR(*nick), + *property); + + API_RETURN_INT(value); +} + +API_FUNC(nicklist_nick_get_string) +{ + const char *result; + + API_INIT_FUNC(1, "nicklist_nick_get_string", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value nick(args[1]); + String::Utf8Value property(args[2]); + + result = weechat_nicklist_nick_get_string ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick *)API_STR2PTR(*nick), + *property); + + API_RETURN_STRING(result); +} + +API_FUNC(nicklist_nick_get_pointer) +{ + char *result; + + API_INIT_FUNC(1, "nicklist_nick_get_pointer", "sss", API_RETURN_EMPTY); + + String::Utf8Value buffer(args[0]); + String::Utf8Value nick(args[1]); + String::Utf8Value property(args[2]); + + result = API_PTR2STR( + weechat_nicklist_nick_get_pointer ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick *)API_STR2PTR(*nick), + *property)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(nicklist_nick_set) +{ + API_INIT_FUNC(1, "nicklist_nick_set", "ssss", API_RETURN_ERROR); + + String::Utf8Value buffer(args[0]); + String::Utf8Value nick(args[1]); + String::Utf8Value property(args[2]); + String::Utf8Value value(args[3]); + + weechat_nicklist_nick_set ( + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (struct t_gui_nick *)API_STR2PTR(*nick), + *property, + *value); + + API_RETURN_OK; +} + +API_FUNC(bar_item_search) +{ + char *result; + + API_INIT_FUNC(1, "bar_item_search", "s", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + + result = API_PTR2STR(weechat_bar_item_search (*name)); + + API_RETURN_STRING_FREE(result); +} + +char * +weechat_js_api_bar_item_build_cb (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + struct t_gui_buffer *buffer, + struct t_hashtable *extra_info) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[5]; + char empty_arg[1] = { '\0' }, *ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + if (strncmp (script_callback->function, "(extra)", 7) == 0) + { + /* new callback: data, item, window, buffer, extra_info */ + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(item); + func_argv[2] = API_PTR2STR(window); + func_argv[3] = API_PTR2STR(buffer); + func_argv[4] = extra_info; + + ret = (char *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_STRING, + script_callback->function + 7, + "ssssh", func_argv); + + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[2]) + free (func_argv[2]); + if (func_argv[3]) + free (func_argv[3]); + } + else + { + /* old callback: data, item, window */ + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(item); + func_argv[2] = API_PTR2STR(window); + + ret = (char *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_STRING, + script_callback->function, + "sss", func_argv); + + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[2]) + free (func_argv[2]); + } + + return ret; + } + + return NULL; +} + +API_FUNC(bar_item_new) +{ + char *result; + + API_INIT_FUNC(1, "bar_item_new", "sss", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + result = API_PTR2STR( + plugin_script_api_bar_item_new ( + weechat_js_plugin, + js_current_script, + *name, + &weechat_js_api_bar_item_build_cb, + *function, + *data)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(bar_item_update) +{ + API_INIT_FUNC(1, "bar_item_update", "s", API_RETURN_ERROR); + + String::Utf8Value name(args[0]); + + weechat_bar_item_update (*name); + + API_RETURN_OK; +} + +API_FUNC(bar_item_remove) +{ + API_INIT_FUNC(1, "bar_item_remove", "s", API_RETURN_ERROR); + + String::Utf8Value item(args[0]); + + plugin_script_api_bar_item_remove ( + weechat_js_plugin, + js_current_script, + (struct t_gui_bar_item *)API_STR2PTR(*item)); + + API_RETURN_OK; +} + +API_FUNC(bar_search) +{ + char *result; + + API_INIT_FUNC(1, "bar_search", "s", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + + result = API_PTR2STR(weechat_bar_search (*name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(bar_new) +{ + char *result; + + API_INIT_FUNC(1, "bar_new", "sssssssssssssss", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + String::Utf8Value hidden(args[1]); + String::Utf8Value priority(args[2]); + String::Utf8Value type(args[3]); + String::Utf8Value conditions(args[4]); + String::Utf8Value position(args[5]); + String::Utf8Value filling_top_bottom(args[6]); + String::Utf8Value filling_left_right(args[7]); + String::Utf8Value size(args[8]); + String::Utf8Value size_max(args[9]); + String::Utf8Value color_fg(args[10]); + String::Utf8Value color_delim(args[11]); + String::Utf8Value color_bg(args[12]); + String::Utf8Value separator(args[13]); + String::Utf8Value items(args[14]); + + result = API_PTR2STR(weechat_bar_new (*name, + *hidden, + *priority, + *type, + *conditions, + *position, + *filling_top_bottom, + *filling_left_right, + *size, + *size_max, + *color_fg, + *color_delim, + *color_bg, + *separator, + *items)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(bar_set) +{ + int rc; + + API_INIT_FUNC(1, "bar_set", "sss", API_RETURN_INT(0)); + + String::Utf8Value bar(args[0]); + String::Utf8Value property(args[1]); + String::Utf8Value value(args[2]); + + rc = weechat_bar_set ( + (struct t_gui_bar *)API_STR2PTR(*bar), + *property, + *value); + + API_RETURN_INT(rc); +} + +API_FUNC(bar_update) +{ + API_INIT_FUNC(1, "bar_update", "s", API_RETURN_ERROR); + + String::Utf8Value name(args[0]); + + weechat_bar_update (*name); + + API_RETURN_OK; +} + +API_FUNC(bar_remove) +{ + API_INIT_FUNC(1, "bar_remove", "s", API_RETURN_ERROR); + + String::Utf8Value bar(args[0]); + + weechat_bar_remove ((struct t_gui_bar *)API_STR2PTR(*bar)); + + API_RETURN_OK; +} + +API_FUNC(command) +{ + int rc; + + API_INIT_FUNC(1, "command", "ss", API_RETURN_INT(WEECHAT_RC_ERROR)); + + String::Utf8Value buffer(args[0]); + String::Utf8Value command(args[1]); + + rc = plugin_script_api_command (weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + *command); + + API_RETURN_INT(rc); +} + +API_FUNC(info_get) +{ + const char *result; + + API_INIT_FUNC(1, "info_get", "ss", API_RETURN_EMPTY); + + String::Utf8Value info_name(args[0]); + String::Utf8Value arguments(args[1]); + + result = weechat_info_get (*info_name, *arguments); + + API_RETURN_STRING(result); +} + +API_FUNC(info_get_hashtable) +{ + struct t_hashtable *hashtable, *result_hashtable; + + API_INIT_FUNC(1, "info_get_hashtable", "sh", API_RETURN_EMPTY); + + String::Utf8Value info_name(args[0]); + hashtable = weechat_js_object_to_hashtable ( + args[1]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + + result_hashtable = weechat_info_get_hashtable (*info_name, hashtable); + Handle result_obj = weechat_js_hashtable_to_object ( + result_hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + if (result_hashtable) + weechat_hashtable_free (result_hashtable); + + return result_obj; +} + +API_FUNC(infolist_new) +{ + char *result; + + API_INIT_FUNC(1, "infolist_new", "", API_RETURN_EMPTY); + + result = API_PTR2STR(weechat_infolist_new ()); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_new_item) +{ + char *result; + + API_INIT_FUNC(1, "infolist_new_item", "s", API_RETURN_EMPTY); + + String::Utf8Value infolist(args[0]); + + result = API_PTR2STR( + weechat_infolist_new_item ( + (struct t_infolist *)API_STR2PTR(*infolist))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_new_var_integer) +{ + int value; + char *result; + + API_INIT_FUNC(1, "infolist_new_var_integer", "ssi", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + String::Utf8Value name(args[1]); + value = args[2]->IntegerValue(); + + result = API_PTR2STR( + weechat_infolist_new_var_integer ( + (struct t_infolist_item *)API_STR2PTR(*item), + *name, + value)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_new_var_string) +{ + char *result; + + API_INIT_FUNC(1, "infolist_new_var_string", "sss", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + String::Utf8Value name(args[1]); + String::Utf8Value value(args[2]); + + result = API_PTR2STR( + weechat_infolist_new_var_string ( + (struct t_infolist_item *)API_STR2PTR(*item), + *name, + *value)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_new_var_pointer) +{ + char *result; + + API_INIT_FUNC(1, "infolist_new_var_pointer", "sss", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + String::Utf8Value name(args[1]); + String::Utf8Value value(args[2]); + + result = API_PTR2STR( + weechat_infolist_new_var_pointer ( + (struct t_infolist_item *)API_STR2PTR(*item), + *name, + API_STR2PTR(*value))); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_new_var_time) +{ + int value; + char *result; + + API_INIT_FUNC(1, "infolist_new_var_time", "ssi", API_RETURN_EMPTY); + + String::Utf8Value item(args[0]); + String::Utf8Value name(args[1]); + value = args[2]->IntegerValue(); + + result = API_PTR2STR( + weechat_infolist_new_var_time ( + (struct t_infolist_item *)API_STR2PTR(*item), + *name, + value)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_get) +{ + char *result; + + API_INIT_FUNC(1, "infolist_get", "sss", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value arguments(args[2]); + + result = API_PTR2STR( + weechat_infolist_get ( + *name, + API_STR2PTR(*pointer), + *arguments)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_next) +{ + int value; + + API_INIT_FUNC(1, "infolist_next", "s", API_RETURN_INT(0)); + + String::Utf8Value infolist(args[0]); + + value = weechat_infolist_next ( + (struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_INT(value); +} + +API_FUNC(infolist_prev) +{ + int value; + + API_INIT_FUNC(1, "infolist_prev", "s", API_RETURN_INT(0)); + + String::Utf8Value infolist(args[0]); + + value = weechat_infolist_prev ( + (struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_INT(value); +} + +API_FUNC(infolist_reset_item_cursor) +{ + API_INIT_FUNC(1, "infolist_reset_item_cursor", "s", API_RETURN_ERROR); + + String::Utf8Value infolist(args[0]); + + weechat_infolist_reset_item_cursor ( + (struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_OK; +} + +API_FUNC(infolist_fields) +{ + const char *result; + + API_INIT_FUNC(1, "infolist_fields", "s", API_RETURN_EMPTY); + + String::Utf8Value infolist(args[0]); + + result = weechat_infolist_fields ( + (struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_STRING(result); +} + +API_FUNC(infolist_integer) +{ + int value; + + API_INIT_FUNC(1, "infolist_integer", "ss", API_RETURN_INT(0)); + + String::Utf8Value infolist(args[0]); + String::Utf8Value variable(args[1]); + + value = weechat_infolist_integer ( + (struct t_infolist *)API_STR2PTR(*infolist), + *variable); + + API_RETURN_INT(value); +} + +API_FUNC(infolist_string) +{ + const char *result; + + API_INIT_FUNC(1, "infolist_string", "ss", API_RETURN_EMPTY); + + String::Utf8Value infolist(args[0]); + String::Utf8Value variable(args[1]); + + result = weechat_infolist_string ( + (struct t_infolist *)API_STR2PTR(*infolist), + *variable); + + API_RETURN_STRING(result); +} + +API_FUNC(infolist_pointer) +{ + const char *result; + + API_INIT_FUNC(1, "infolist_pointer", "ss", API_RETURN_EMPTY); + + String::Utf8Value infolist(args[0]); + String::Utf8Value variable(args[1]); + + result = API_PTR2STR( + weechat_infolist_pointer ( + (struct t_infolist *)API_STR2PTR(*infolist), + *variable)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_time) +{ + char timebuffer[64], *result; + time_t time; + struct tm *date_tmp; + + API_INIT_FUNC(1, "infolist_time", "ss", API_RETURN_EMPTY); + + String::Utf8Value infolist(args[0]); + String::Utf8Value variable(args[1]); + + time = weechat_infolist_time ( + (struct t_infolist *)API_STR2PTR(*infolist), + *variable); + date_tmp = localtime (&time); + if (date_tmp) + strftime (timebuffer, sizeof (timebuffer), "%F %T", date_tmp); + result = strdup (timebuffer); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(infolist_free) +{ + API_INIT_FUNC(1, "infolist_free", "s", API_RETURN_ERROR); + + String::Utf8Value infolist(args[0]); + + weechat_infolist_free ((struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_OK; +} + +API_FUNC(hdata_get) +{ + char *result; + + API_INIT_FUNC(1, "hdata_get", "s", API_RETURN_EMPTY); + + String::Utf8Value name(args[0]); + + result = API_PTR2STR(weechat_hdata_get (*name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hdata_get_var_offset) +{ + int value; + + API_INIT_FUNC(1, "hdata_get_var_offset", "ss", API_RETURN_INT(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value name(args[1]); + + value = weechat_hdata_get_var_offset ( + (struct t_hdata *)API_STR2PTR(*hdata), + *name); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_get_var_type_string) +{ + const char *result; + + API_INIT_FUNC(1, "hdata_get_var_type_string", "ss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value name(args[1]); + + result = weechat_hdata_get_var_type_string ( + (struct t_hdata *)API_STR2PTR(*hdata), + *name); + + API_RETURN_STRING(result); +} + +API_FUNC(hdata_get_var_array_size) +{ + int value; + + API_INIT_FUNC(1, "hdata_get_var_array_size", "sss", API_RETURN_INT(-1)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + value = weechat_hdata_get_var_array_size ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_get_var_array_size_string) +{ + const char *result; + + API_INIT_FUNC(1, "hdata_get_var_array_size_string", "sss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + result = weechat_hdata_get_var_array_size_string ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_STRING(result); +} + +API_FUNC(hdata_get_var_hdata) +{ + const char *result; + + API_INIT_FUNC(1, "hdata_get_var_hdata", "ss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value name(args[1]); + + result = weechat_hdata_get_var_hdata ( + (struct t_hdata *)API_STR2PTR(*hdata), + *name); + + API_RETURN_STRING(result); +} + +API_FUNC(hdata_get_list) +{ + char *result; + + API_INIT_FUNC(1, "hdata_get_list", "s", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value name(args[1]); + + result = API_PTR2STR( + weechat_hdata_get_list ( + (struct t_hdata *)API_STR2PTR(*hdata), + *name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hdata_check_pointer) +{ + int value; + + API_INIT_FUNC(1, "hdata_check_pointer", "sss", API_RETURN_INT(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value list(args[1]); + String::Utf8Value pointer(args[2]); + + value = weechat_hdata_check_pointer ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*list), + API_STR2PTR(*pointer)); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_move) +{ + int count; + char *result; + + API_INIT_FUNC(1, "hdata_move", "ssi", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + count = args[2]->IntegerValue(); + + result = API_PTR2STR( + weechat_hdata_move ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + count)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hdata_search) +{ + int move; + char *result; + + API_INIT_FUNC(1, "hdata_search", "sssi", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value search(args[2]); + move = args[3]->IntegerValue(); + + result = API_PTR2STR( + weechat_hdata_search ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *search, + move)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hdata_char) +{ + int value; + + API_INIT_FUNC(1, "hdata_char", "sss", API_RETURN_INT(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + value = (int)weechat_hdata_char ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_integer) +{ + int value; + + API_INIT_FUNC(1, "hdata_integer", "sss", API_RETURN_INT(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + value = weechat_hdata_integer ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_long) +{ + long value; + + API_INIT_FUNC(1, "hdata_long", "sss", API_RETURN_LONG(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + value = weechat_hdata_long ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_LONG(value); +} + +API_FUNC(hdata_string) +{ + const char *result; + + API_INIT_FUNC(1, "hdata_string", "sss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + result = weechat_hdata_string ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_STRING(result); +} + +API_FUNC(hdata_pointer) +{ + char *result; + + API_INIT_FUNC(1, "hdata_pointer", "sss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + result = API_PTR2STR( + weechat_hdata_pointer ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(hdata_time) +{ + time_t time; + + API_INIT_FUNC(1, "hdata_time", "sss", API_RETURN_LONG(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + time = weechat_hdata_time ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name); + + API_RETURN_LONG(time); +} + +API_FUNC(hdata_hashtable) +{ + API_INIT_FUNC(1, "hdata_hashtable", "sss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + String::Utf8Value name(args[2]); + + Handle result_obj = weechat_js_hashtable_to_object ( + weechat_hdata_hashtable ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + *name)); + + return result_obj; +} + +API_FUNC(hdata_update) +{ + struct t_hashtable *hashtable; + int value; + + API_INIT_FUNC(1, "hdata_update", "ssh", API_RETURN_INT(0)); + + String::Utf8Value hdata(args[0]); + String::Utf8Value pointer(args[1]); + hashtable = weechat_js_object_to_hashtable ( + args[2]->ToObject(), + WEECHAT_SCRIPT_HASHTABLE_DEFAULT_SIZE, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING); + + value = weechat_hdata_update ( + (struct t_hdata *)API_STR2PTR(*hdata), + API_STR2PTR(*pointer), + hashtable); + + if (hashtable) + weechat_hashtable_free (hashtable); + + API_RETURN_INT(value); +} + +API_FUNC(hdata_get_string) +{ + const char *result; + + API_INIT_FUNC(1, "hdata_get_string", "ss", API_RETURN_EMPTY); + + String::Utf8Value hdata(args[0]); + String::Utf8Value property(args[1]); + + result = weechat_hdata_get_string ( + (struct t_hdata *)API_STR2PTR(*hdata), + *property); + + API_RETURN_STRING(result); +} + +API_FUNC(upgrade_new) +{ + int write; + char *result; + + API_INIT_FUNC(1, "upgrade_new", "si", API_RETURN_EMPTY); + + String::Utf8Value filename(args[0]); + write = args[1]->IntegerValue(); + + result = API_PTR2STR(weechat_upgrade_new (*filename, write)); + + API_RETURN_STRING_FREE(result); +} + +API_FUNC(upgrade_write_object) +{ + int object_id, rc; + + API_INIT_FUNC(1, "upgrade_write_object", "sis", API_RETURN_INT(0)); + + String::Utf8Value upgrade_file(args[0]); + object_id = args[1]->IntegerValue(); + String::Utf8Value infolist(args[2]); + + rc = weechat_upgrade_write_object ( + (struct t_upgrade_file *)API_STR2PTR(*upgrade_file), + object_id, + (struct t_infolist *)API_STR2PTR(*infolist)); + + API_RETURN_INT(rc); +} + +int +weechat_js_api_upgrade_read_cb (void *data, + struct t_upgrade_file *upgrade_file, + int object_id, + struct t_infolist *infolist) +{ + struct t_plugin_script_cb *script_callback; + void *func_argv[4]; + char empty_arg[1] = { '\0' }, str_object_id[32]; + int *rc, ret; + + script_callback = (struct t_plugin_script_cb *)data; + + if (script_callback && script_callback->function && script_callback->function[0]) + { + snprintf (str_object_id, sizeof (str_object_id), "%d", object_id); + + func_argv[0] = (script_callback->data) ? script_callback->data : empty_arg; + func_argv[1] = API_PTR2STR(upgrade_file); + func_argv[2] = str_object_id; + func_argv[3] = API_PTR2STR(infolist); + + rc = (int *)weechat_js_exec ( + (struct t_plugin_script *)script_callback->script, + WEECHAT_SCRIPT_EXEC_INT, + script_callback->function, + "ssss", func_argv); + + if (!rc) + ret = WEECHAT_RC_ERROR; + else + { + ret = *rc; + free (rc); + } + if (func_argv[1]) + free (func_argv[1]); + if (func_argv[3]) + free (func_argv[3]); + + return ret; + } + + return WEECHAT_RC_ERROR; +} + +API_FUNC(upgrade_read) +{ + int rc; + + API_INIT_FUNC(1, "upgrade_read", "sss", API_RETURN_INT(0)); + + String::Utf8Value upgrade_file(args[0]); + String::Utf8Value function(args[1]); + String::Utf8Value data(args[2]); + + rc = plugin_script_api_upgrade_read ( + weechat_js_plugin, + js_current_script, + (struct t_upgrade_file *)API_STR2PTR(*upgrade_file), + &weechat_js_api_upgrade_read_cb, + *function, + *data); + + API_RETURN_INT(rc); +} + +API_FUNC(upgrade_close) +{ + API_INIT_FUNC(1, "upgrade_close", "sss", API_RETURN_ERROR); + + String::Utf8Value upgrade_file(args[0]); + + weechat_upgrade_close ( + (struct t_upgrade_file *)API_STR2PTR(*upgrade_file)); + + API_RETURN_OK; +} + +void +WeechatJsV8::loadLibs() +{ + Local weechat_obj = ObjectTemplate::New(); + + /* constants */ + API_DEF_CONST_INT(WEECHAT_RC_OK); + API_DEF_CONST_INT(WEECHAT_RC_OK_EAT); + API_DEF_CONST_INT(WEECHAT_RC_ERROR); + + API_DEF_CONST_INT(WEECHAT_CONFIG_READ_OK); + API_DEF_CONST_INT(WEECHAT_CONFIG_READ_MEMORY_ERROR); + API_DEF_CONST_INT(WEECHAT_CONFIG_READ_FILE_NOT_FOUND); + API_DEF_CONST_INT(WEECHAT_CONFIG_WRITE_OK); + API_DEF_CONST_INT(WEECHAT_CONFIG_WRITE_ERROR); + API_DEF_CONST_INT(WEECHAT_CONFIG_WRITE_MEMORY_ERROR); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_SET_OK_CHANGED); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_SET_ERROR); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_SET_OPTION_NOT_FOUND); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_UNSET_OK_NO_RESET); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_UNSET_OK_RESET); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED); + API_DEF_CONST_INT(WEECHAT_CONFIG_OPTION_UNSET_ERROR); + + API_DEF_CONST_STR(WEECHAT_LIST_POS_SORT); + API_DEF_CONST_STR(WEECHAT_LIST_POS_BEGINNING); + API_DEF_CONST_STR(WEECHAT_LIST_POS_END); + + API_DEF_CONST_STR(WEECHAT_HOTLIST_LOW); + API_DEF_CONST_STR(WEECHAT_HOTLIST_MESSAGE); + API_DEF_CONST_STR(WEECHAT_HOTLIST_PRIVATE); + API_DEF_CONST_STR(WEECHAT_HOTLIST_HIGHLIGHT); + + API_DEF_CONST_INT(WEECHAT_HOOK_PROCESS_RUNNING); + API_DEF_CONST_INT(WEECHAT_HOOK_PROCESS_ERROR); + + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_OK); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_ADDRESS_NOT_FOUND); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_IP_ADDRESS_NOT_FOUND); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_CONNECTION_REFUSED); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_PROXY_ERROR); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_LOCAL_HOSTNAME_ERROR); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_GNUTLS_INIT_ERROR); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_GNUTLS_HANDSHAKE_ERROR); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_MEMORY_ERROR); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_TIMEOUT); + API_DEF_CONST_INT(WEECHAT_HOOK_CONNECT_SOCKET_ERROR); + + API_DEF_CONST_STR(WEECHAT_HOOK_SIGNAL_STRING); + API_DEF_CONST_STR(WEECHAT_HOOK_SIGNAL_INT); + API_DEF_CONST_STR(WEECHAT_HOOK_SIGNAL_POINTER); + + /* functions */ + API_DEF_FUNC(register); + API_DEF_FUNC(plugin_get_name); + API_DEF_FUNC(charset_set); + API_DEF_FUNC(iconv_to_internal); + API_DEF_FUNC(iconv_from_internal); + API_DEF_FUNC(gettext); + API_DEF_FUNC(ngettext); + API_DEF_FUNC(strlen_screen); + API_DEF_FUNC(string_match); + API_DEF_FUNC(string_has_highlight); + API_DEF_FUNC(string_has_highlight_regex); + API_DEF_FUNC(string_mask_to_regex); + API_DEF_FUNC(string_remove_color); + API_DEF_FUNC(string_is_command_char); + API_DEF_FUNC(string_input_for_buffer); + API_DEF_FUNC(string_eval_expression); + API_DEF_FUNC(mkdir_home); + API_DEF_FUNC(mkdir); + API_DEF_FUNC(mkdir_parents); + API_DEF_FUNC(list_new); + API_DEF_FUNC(list_add); + API_DEF_FUNC(list_search); + API_DEF_FUNC(list_search_pos); + API_DEF_FUNC(list_casesearch); + API_DEF_FUNC(list_casesearch_pos); + API_DEF_FUNC(list_get); + API_DEF_FUNC(list_set) + API_DEF_FUNC(list_next); + API_DEF_FUNC(list_prev); + API_DEF_FUNC(list_string); + API_DEF_FUNC(list_size); + API_DEF_FUNC(list_remove); + API_DEF_FUNC(list_remove_all); + API_DEF_FUNC(list_free); + API_DEF_FUNC(config_new); + API_DEF_FUNC(config_new_section); + API_DEF_FUNC(config_search_section); + API_DEF_FUNC(config_new_option); + API_DEF_FUNC(config_search_option); + API_DEF_FUNC(config_string_to_boolean); + API_DEF_FUNC(config_option_reset); + API_DEF_FUNC(config_option_set); + API_DEF_FUNC(config_option_set_null); + API_DEF_FUNC(config_option_unset); + API_DEF_FUNC(config_option_rename); + API_DEF_FUNC(config_option_is_null); + API_DEF_FUNC(config_option_default_is_null); + API_DEF_FUNC(config_boolean); + API_DEF_FUNC(config_boolean_default); + API_DEF_FUNC(config_integer); + API_DEF_FUNC(config_integer_default); + API_DEF_FUNC(config_string); + API_DEF_FUNC(config_string_default); + API_DEF_FUNC(config_color); + API_DEF_FUNC(config_color_default); + API_DEF_FUNC(config_write_option); + API_DEF_FUNC(config_write_line); + API_DEF_FUNC(config_write); + API_DEF_FUNC(config_read); + API_DEF_FUNC(config_reload); + API_DEF_FUNC(config_option_free); + API_DEF_FUNC(config_section_free_options); + API_DEF_FUNC(config_section_free); + API_DEF_FUNC(config_free); + API_DEF_FUNC(config_get); + API_DEF_FUNC(config_get_plugin); + API_DEF_FUNC(config_is_set_plugin); + API_DEF_FUNC(config_set_plugin); + API_DEF_FUNC(config_set_desc_plugin); + API_DEF_FUNC(config_unset_plugin); + API_DEF_FUNC(key_bind); + API_DEF_FUNC(key_unbind); + API_DEF_FUNC(prefix); + API_DEF_FUNC(color); + API_DEF_FUNC(print); + API_DEF_FUNC(print_date_tags); + API_DEF_FUNC(print_y); + API_DEF_FUNC(log_print); + API_DEF_FUNC(hook_command); + API_DEF_FUNC(hook_command_run); + API_DEF_FUNC(hook_timer); + API_DEF_FUNC(hook_fd); + API_DEF_FUNC(hook_process); + API_DEF_FUNC(hook_process_hashtable); + API_DEF_FUNC(hook_connect); + API_DEF_FUNC(hook_print); + API_DEF_FUNC(hook_signal); + API_DEF_FUNC(hook_signal_send); + API_DEF_FUNC(hook_hsignal); + API_DEF_FUNC(hook_hsignal_send); + API_DEF_FUNC(hook_config); + API_DEF_FUNC(hook_completion); + API_DEF_FUNC(hook_completion_list_add); + API_DEF_FUNC(hook_modifier); + API_DEF_FUNC(hook_modifier_exec); + API_DEF_FUNC(hook_info); + API_DEF_FUNC(hook_info_hashtable); + API_DEF_FUNC(hook_infolist); + API_DEF_FUNC(hook_focus); + API_DEF_FUNC(hook_set); + API_DEF_FUNC(unhook); + API_DEF_FUNC(unhook_all); + API_DEF_FUNC(buffer_new); + API_DEF_FUNC(buffer_search); + API_DEF_FUNC(buffer_search_main); + API_DEF_FUNC(current_buffer); + API_DEF_FUNC(buffer_clear); + API_DEF_FUNC(buffer_close); + API_DEF_FUNC(buffer_merge); + API_DEF_FUNC(buffer_unmerge); + API_DEF_FUNC(buffer_get_integer); + API_DEF_FUNC(buffer_get_string); + API_DEF_FUNC(buffer_get_pointer); + API_DEF_FUNC(buffer_set); + API_DEF_FUNC(buffer_string_replace_local_var); + API_DEF_FUNC(buffer_match_list); + API_DEF_FUNC(current_window); + API_DEF_FUNC(window_search_with_buffer); + API_DEF_FUNC(window_get_integer); + API_DEF_FUNC(window_get_string); + API_DEF_FUNC(window_get_pointer); + API_DEF_FUNC(window_set_title); + API_DEF_FUNC(nicklist_add_group); + API_DEF_FUNC(nicklist_search_group); + API_DEF_FUNC(nicklist_add_nick); + API_DEF_FUNC(nicklist_search_nick); + API_DEF_FUNC(nicklist_remove_group); + API_DEF_FUNC(nicklist_remove_nick); + API_DEF_FUNC(nicklist_remove_all); + API_DEF_FUNC(nicklist_group_get_integer); + API_DEF_FUNC(nicklist_group_get_string); + API_DEF_FUNC(nicklist_group_get_pointer); + API_DEF_FUNC(nicklist_group_set); + API_DEF_FUNC(nicklist_nick_get_integer); + API_DEF_FUNC(nicklist_nick_get_string); + API_DEF_FUNC(nicklist_nick_get_pointer); + API_DEF_FUNC(nicklist_nick_set); + API_DEF_FUNC(bar_item_search); + API_DEF_FUNC(bar_item_new); + API_DEF_FUNC(bar_item_update); + API_DEF_FUNC(bar_item_remove); + API_DEF_FUNC(bar_search); + API_DEF_FUNC(bar_new); + API_DEF_FUNC(bar_set); + API_DEF_FUNC(bar_update); + API_DEF_FUNC(bar_remove); + API_DEF_FUNC(command); + API_DEF_FUNC(info_get); + API_DEF_FUNC(info_get_hashtable); + API_DEF_FUNC(infolist_new); + API_DEF_FUNC(infolist_new_item); + API_DEF_FUNC(infolist_new_var_integer); + API_DEF_FUNC(infolist_new_var_string); + API_DEF_FUNC(infolist_new_var_pointer); + API_DEF_FUNC(infolist_new_var_time); + API_DEF_FUNC(infolist_get); + API_DEF_FUNC(infolist_next); + API_DEF_FUNC(infolist_prev); + API_DEF_FUNC(infolist_reset_item_cursor); + API_DEF_FUNC(infolist_fields); + API_DEF_FUNC(infolist_integer); + API_DEF_FUNC(infolist_string); + API_DEF_FUNC(infolist_pointer); + API_DEF_FUNC(infolist_time); + API_DEF_FUNC(infolist_free); + API_DEF_FUNC(hdata_get); + API_DEF_FUNC(hdata_get_var_offset); + API_DEF_FUNC(hdata_get_var_type_string); + API_DEF_FUNC(hdata_get_var_array_size); + API_DEF_FUNC(hdata_get_var_array_size_string); + API_DEF_FUNC(hdata_get_var_hdata); + API_DEF_FUNC(hdata_get_list); + API_DEF_FUNC(hdata_check_pointer); + API_DEF_FUNC(hdata_move); + API_DEF_FUNC(hdata_search); + API_DEF_FUNC(hdata_char); + API_DEF_FUNC(hdata_integer); + API_DEF_FUNC(hdata_long); + API_DEF_FUNC(hdata_string); + API_DEF_FUNC(hdata_pointer); + API_DEF_FUNC(hdata_time); + API_DEF_FUNC(hdata_hashtable); + API_DEF_FUNC(hdata_update); + API_DEF_FUNC(hdata_get_string); + API_DEF_FUNC(upgrade_new); + API_DEF_FUNC(upgrade_write_object); + API_DEF_FUNC(upgrade_read); + API_DEF_FUNC(upgrade_close); + + this->addGlobal ("weechat", weechat_obj); +} diff --git a/src/plugins/javascript/weechat-js-api.h b/src/plugins/javascript/weechat-js-api.h new file mode 100644 index 000000000..170554d68 --- /dev/null +++ b/src/plugins/javascript/weechat-js-api.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2013 Koka El Kiwi + * Copyright (C) 2015 Sébastien Helleu + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * WeeChat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with WeeChat. If not, see . + */ + +#ifndef WEECHAT_JS_API_H +#define WEECHAT_JS_API_H 1 + +extern int weechat_js_api_buffer_input_data_cb (void *data, + struct t_gui_buffer *buffer, + const char *input_data); +extern int weechat_js_api_buffer_close_cb (void *data, + struct t_gui_buffer *buffer); + +#endif /* WEECHAT_JS_API_H */ diff --git a/src/plugins/javascript/weechat-js-v8.cpp b/src/plugins/javascript/weechat-js-v8.cpp new file mode 100644 index 000000000..bb05488ba --- /dev/null +++ b/src/plugins/javascript/weechat-js-v8.cpp @@ -0,0 +1,174 @@ +/* + * weechat-js-v8.cpp - v8 javascript functions + * + * Copyright (C) 2013 Koka El Kiwi + * Copyright (C) 2015 Sébastien Helleu + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * WeeChat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with WeeChat. If not, see . + */ + +#undef _ +#include + +extern "C" +{ +#include "../weechat-plugin.h" +#include "../plugin-script.h" +} + +#include "weechat-js.h" +#include "weechat-js-v8.h" + +#define PRINT_EXCEPTION \ + Local exception = trycatch.Exception(); \ + String::Utf8Value str_exception(exception); \ + weechat_printf (NULL, \ + weechat_gettext ("%s%s: exception: %s"), \ + weechat_prefix ("error"), JS_PLUGIN_NAME, \ + *str_exception); + +using namespace v8; + + +/* + * Constructor. + */ + +WeechatJsV8::WeechatJsV8() +{ + this->global = ObjectTemplate::New(); +} + +/* + * Destructor. + */ + +WeechatJsV8::~WeechatJsV8() +{ + this->context.Dispose(); +} + +/* + * Loads a javascript script. + */ + +bool +WeechatJsV8::load(Handle source) +{ + this->source = source; + + return true; +} + +/* + * Loads a javascript script. + */ + +bool +WeechatJsV8::load(const char *source) +{ + Handle src = String::New(source); + + return this->load(src); +} + +/* + * Executes a javascript script. + */ + +bool +WeechatJsV8::execScript() +{ + v8::TryCatch trycatch; + + this->context = Context::New(NULL, this->global); + Context::Scope context_scope(this->context); + Handle