# HG changeset patch # User David Demelier # Date 1562595357 -7200 # Node ID 00a4720c4874ca2a80a81b7a997c1824611b70c0 # Parent dc6b42d7b97a5a0c3d9e9629d2d831c106ae34a5 doc: rewrite documentation in manual pages, closes #1674 Get rid of markdown documentation and the custom generator tools, instead use raw manual pages. diff -r dc6b42d7b97a -r 00a4720c4874 CHANGES.md --- a/CHANGES.md Tue Jul 09 15:04:04 2019 +0200 +++ b/CHANGES.md Mon Jul 08 16:15:57 2019 +0200 @@ -46,6 +46,10 @@ (#594), (#595), (#681), (#697), - The libircclient has been replaced by a simple homemade library (#581). +misc: + +- The documentation is in pure manual pages now (#1674). + plugins: - Introduce brand new joke plugin (#609), diff -r dc6b42d7b97a -r 00a4720c4874 CMakeLists.txt --- a/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -44,6 +44,7 @@ # libirccd-daemon - The irccd bot library. # irccd - The irccd executable. # irccdctl - The irccdctl utility. +# man - Manual pages. # plugins - Official irccd plugins. # systemd - Unit file for systemd. # tests - The unit tests. @@ -74,7 +75,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CFG} ${CMAKE_BINARY_DIR}/bin/${cfg}) endforeach () -include(cmake/function/IrccdBuildHtml.cmake) include(cmake/function/IrccdDefineExecutable.cmake) include(cmake/function/IrccdDefineLibrary.cmake) include(cmake/function/IrccdDefineMan.cmake) @@ -106,6 +106,7 @@ add_subdirectory(irccd-test) add_subdirectory(systemd) add_subdirectory(plugins) +add_subdirectory(man) if (IRCCD_WITH_TESTS) include(CTest) @@ -114,18 +115,18 @@ add_subdirectory(cmake/export) -message("Compiling with the following flags:") +message("Building with the following flags:") message(" General flags: ${CMAKE_CXX_FLAGS}") message(" Debug flags: ${CMAKE_CXX_FLAGS_DEBUG}") message(" Release flags: ${CMAKE_CXX_FLAGS_RELEASE}") message("") -message("Compiling irccd with following options:") +message("Building irccd with following options:") message(" Libedit: ${IRCCD_WITH_LIBEDIT_MSG}") message(" OpenSSL: ${IRCCD_WITH_SSL_MSG}") message(" Javascript: ${IRCCD_WITH_JS_MSG}") message(" Tests: ${IRCCD_WITH_TESTS_MSG}") -message(" User docs: ${IRCCD_WITH_HTML_MSG}") +message(" Man pages: ${IRCCD_WITH_MAN_MSG}") message(" Doxygen: ${IRCCD_WITH_DOXYGEN_MSG}") message(" Package: ${IRCCD_PACKAGE_MSG}") message(" Systemd: ${IRCCD_WITH_SYSTEMD_MSG}") diff -r dc6b42d7b97a -r 00a4720c4874 INSTALL.md --- a/INSTALL.md Tue Jul 09 15:04:04 2019 +0200 +++ b/INSTALL.md Mon Jul 08 16:15:57 2019 +0200 @@ -6,17 +6,17 @@ Requirements ------------ - - GCC 5.1 or Clang 3.4, - - [Boost](http://boost.org), - - [CMake](http://www.cmake.org). +- GCC 7.0 or Clang 6.0, +- [Boost](http://boost.org), +- [CMake](http://www.cmake.org). Optional: - - [OpenSSL](http://openssl.org), Used for SSL connections to IRC servers, - recommended, - - [Pandoc](http://pandoc.org), Used for documentation process, - - [Doxygen](http://www.stack.nl/~dimitri/doxygen), For the documentation about - irccd internals. +- [OpenSSL](http://openssl.org), Used for SSL connections to IRC servers, + recommended, +- [UriParser](), Required for the links plugin, +- [Doxygen](http://www.stack.nl/~dimitri/doxygen), For the documentation about + irccd internals. Basic installation ------------------ diff -r dc6b42d7b97a -r 00a4720c4874 MIGRATING.md --- a/MIGRATING.md Tue Jul 09 15:04:04 2019 +0200 +++ b/MIGRATING.md Mon Jul 08 16:15:57 2019 +0200 @@ -56,7 +56,7 @@ ----------- - The default plugins path has been changed from **share/irccd/plugins** to - **lib64/irccd**. + **lib(arch)/irccd**. Javascript API -------------- diff -r dc6b42d7b97a -r 00a4720c4874 cmake/IrccdOptions.cmake --- a/cmake/IrccdOptions.cmake Tue Jul 09 15:04:04 2019 +0200 +++ b/cmake/IrccdOptions.cmake Mon Jul 08 16:15:57 2019 +0200 @@ -19,9 +19,7 @@ # # Options that controls the build: # -# IRCCD_WITH_DOCS Enable building of all documentation (default: on) # IRCCD_WITH_DOXYGEN Enable internal irccd documentation (default: on) -# IRCCD_WITH_HTML Enable HTML documentation # IRCCD_WITH_JS Enable JavaScript (default: on) # IRCCD_WITH_LIBEDIT Enable libedit support (default: on) # IRCCD_WITH_MAN Install manpages (default: on, off for Windows) @@ -48,9 +46,7 @@ set(DEFAULT_PKGCONFIG "No") endif () -option(IRCCD_WITH_DOCS "Enable building of all documentation" On) option(IRCCD_WITH_DOXYGEN "Enable doxygen" Off) -option(IRCCD_WITH_HTML "Enable building of HTML documentation" On) option(IRCCD_WITH_JS "Enable embedded Duktape" On) option(IRCCD_WITH_LIBEDIT "Enable libedit support" On) option(IRCCD_WITH_MAN "Install man pages" ${DEFAULT_MAN}) @@ -84,7 +80,6 @@ find_package(Doxygen) find_package(OpenSSL) -find_package(marker) find_package(Editline) if (IRCCD_WITH_LIBEDIT) @@ -120,6 +115,13 @@ set(IRCCD_WITH_DOXYGEN_MSG "No (disabled by user)") endif () +if (IRCCD_WITH_MAN) + set(IRCCD_HAVE_MAN On) + set(IRCCD_WITH_MAN_MSG "Yes") +else () + set(IRCCD_WITH_MAN_MSG "No (disabled by user)") +endif () + # # Determine if allowed to package. # ------------------------------------------------------------------- diff -r dc6b42d7b97a -r 00a4720c4874 cmake/function/IrccdBuildHtml.cmake --- a/cmake/function/IrccdBuildHtml.cmake Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -# -# IrccdBuildHtml.cmake -- CMake build system for irccd -# -# Copyright (c) 2013-2019 David Demelier -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -# -# irccd_build_html -# ---------------- -# -# irccd_build_html( -# SOURCE the source markdown file -# TEMPLATE specify template file -# OUTPUT_DIR the output directory (relative to base doc dir) -# OUTPUT_VAR (Optional) store the output file in the output variable -# COMPONENT (Optional) install the output as the given component -# ) -# -# Create a rule to build the markdown file specified by SOURCE parameter. -# -# The SOURCE file will be written in -# ${CMAKE_BINARY_DIR}/html/${OUTPUT}/.html where basename is the file -# name taken from SOURCE with extension replaced with html. -# -# This macro does not create a target, just the output rule and the output file -# can be retrieved using the OUTPUT_VAR variable. -# -# If component is set, a CPack component is created for that output file and -# will be grouped together. -# -# Example: -# -# irccd_build_html( -# SOURCE onMessage.md -# TEMPLATE template.html -# COMPONENT documentation -# OUTPUT_DIR event -# OUTPUT_VAR myvar -# ) -# -# add_custom_target(mytarget DEPENDS ${myvar}) -# -# It's perfectly safe to call this macro multiple times with the same COMPONENT. -# - -option(IRCCD_WITH_HTML "Enable building of HTML documentation" On) - -find_package(marker QUIET) - -if (IRCCD_WITH_HTML) - if (marker_FOUND) - set(IRCCD_HAVE_HTML On) - set(IRCCD_WITH_HTML_MSG "Yes") - else () - set(IRCCD_WITH_HTML_MSG "No (marker not found)") - endif () -else () - set(IRCCD_WITH_HTML_MSG "No (disabled by user)") -endif () - -macro(irccd_build_html) - if (IRCCD_HAVE_HTML) - set(options "") - set(oneValueArgs "COMPONENT;OUTPUT_DIR;OUTPUT_VAR;SOURCE;TEMPLATE") - set(multiValueArgs "VARIABLES") - - cmake_parse_arguments(HTML "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if (NOT HTML_SOURCE) - message(FATAL_ERROR "Missing SOURCE parameter") - endif () - if (NOT HTML_TEMPLATE) - message(FATAL_ERROR "Missing TEMPLATE parameter") - endif () - if (IS_ABSOLUTE ${HTML_OUTPUT_DIR}) - message(FATAL_ERROR "OUTPUT_DIR variable must not be absolute") - endif () - - # - # Get the basename, use string REGEX REPLACE because - # get_filename_component will remove all extensions while we only want - # to remove md. (e.g. irccd.conf.md becomes irccd.conf). - # - get_filename_component(filename ${HTML_SOURCE} NAME) - string(REGEX REPLACE "^(.*)\\.md$" "\\1" filename ${filename}) - - # Compute baseurl. - file( - RELATIVE_PATH - baseurl - ${CMAKE_BINARY_DIR}/html/${HTML_OUTPUT_DIR} - ${CMAKE_BINARY_DIR}/html - ) - - if (baseurl STREQUAL "") - set(baseurl "./") - endif () - if (NOT HTML_OUTPUT_DIR OR HTML_OUTPUT_DIR STREQUAL "") - set(HTML_OUTPUT_DIR ".") - endif () - - # Filname path to output directory and files. - set(outputdir ${CMAKE_BINARY_DIR}/html/${HTML_OUTPUT_DIR}) - set(output ${outputdir}/${filename}.html) - - # Build arguments. - if (HTML_TEMPLATE) - set(args -t ${HTML_TEMPLATE} -v baseurl="${baseurl}") - endif () - - add_custom_command( - OUTPUT ${output} - COMMAND - ${CMAKE_COMMAND} -E make_directory ${outputdir} - COMMAND - $ ${args} ${HTML_VARIABLES} - $ ${output} ${HTML_SOURCE} - DEPENDS - ${HTML_SOURCE} - ${HTML_TEMPLATE} - ) - - # Install the documentation file as component if provided. - if (HTML_COMPONENT) - install( - FILES ${output} - COMPONENT ${HTML_COMPONENT} - DESTINATION ${CMAKE_INSTALL_DOCDIR}/${HTML_OUTPUT_DIR} - ) - endif () - - if (HTML_OUTPUT_VAR) - set(${HTML_OUTPUT_VAR} ${output}) - endif () - endif () -endmacro () diff -r dc6b42d7b97a -r 00a4720c4874 cmake/function/IrccdDefineMan.cmake --- a/cmake/function/IrccdDefineMan.cmake Tue Jul 09 15:04:04 2019 +0200 +++ b/cmake/function/IrccdDefineMan.cmake Mon Jul 08 16:15:57 2019 +0200 @@ -20,20 +20,44 @@ # irccd_define_man # ---------------- # -# irccd_define_man(file, man) -# -# Parameters: -# file The file name to build -# man The man section +# irccd_define_man( +# INPUT file path to the input man page +# SECTION section (e.g. man1 man3) +# OUTPUT (Optional) file name to rename +# ) # # This function configure the manual and install it if IRCCD_WITH_MAN is set. # -function(irccd_define_man file man) +function(irccd_define_man) + set(options "") + set(oneValueArgs "INPUT;OUTPUT;SECTION") + set(multiValueArgs "") + + cmake_parse_arguments(MAN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT MAN_INPUT) + message(FATAL_ERROR "Argument INPUT required") + endif () + if (NOT MAN_SECTION) + message(FATAL_ERROR "Argument SECTION required") + endif () + + if (NOT MAN_OUTPUT) + get_filename_component(output ${MAN_INPUT} NAME) + else () + set(output ${MAN_OUTPUT}) + endif () + if (IRCCD_WITH_MAN) - set(input ${doc_SOURCE_DIR}/man/${file}.in) - set(output ${CMAKE_CURRENT_BINARY_DIR}/${file}) - configure_file(${input} ${output} @ONLY) - install(FILES ${output} DESTINATION ${CMAKE_INSTALL_MANDIR}/${man}) + configure_file( + ${MAN_INPUT} + ${CMAKE_BINARY_DIR}/man/${output} + @ONLY + ) + install( + FILES ${CMAKE_BINARY_DIR}/man/${output} + DESTINATION ${CMAKE_INSTALL_MANDIR}/${MAN_SECTION} + ) endif () endfunction() diff -r dc6b42d7b97a -r 00a4720c4874 cmake/function/IrccdDefinePlugin.cmake --- a/cmake/function/IrccdDefinePlugin.cmake Tue Jul 09 15:04:04 2019 +0200 +++ b/cmake/function/IrccdDefinePlugin.cmake Mon Jul 08 16:15:57 2019 +0200 @@ -25,7 +25,7 @@ # irccd_define_plugin( # NAME canonical plugin name # TYPE JS -# DOCS documentation files in markdown +# MAN manual page # SCRIPT absolute path to the Javascript file (ending with .js) # ) # @@ -34,7 +34,7 @@ # irccd_define_plugin( # NAME canonical plugin name # TYPE NATIVE -# DOCS documentation files in markdown +# MAN manual page # SOURCES c++ source files # INCLUDES additional includes # LIBRARIES additional libraries @@ -50,8 +50,8 @@ # must be given as SCRIPT parameter. For native plugins, any source files can # be given as SOURCES parameter. # -# Additional documentation can be built in markdown and installed along the -# plugin using DOCS parameter. +# Additional documentation in manual page format can be specified with the MAN +# parameter. # # A CMake option is also created in the form OPTION_ where PLG is the # uppercase NAME value. @@ -81,7 +81,7 @@ plugin-${PLG_NAME} ALL DEPENDS ${PLG_OUTPUT_DOC} - SOURCES ${PLG_SCRIPT} ${PLG_DOCS} + SOURCES ${PLG_SCRIPT} ${PLG_MAN} ) endfunction() @@ -90,7 +90,7 @@ message(FATAL_ERROR "Missing SOURCES parameter") endif () - add_library(plugin-${PLG_NAME} MODULE ${PLG_SOURCES} ${PLG_OUTPUT_DOC} ${PLG_DOCS}) + add_library(plugin-${PLG_NAME} MODULE ${PLG_SOURCES} ${PLG_OUTPUT_DOC} ${PLG_MAN}) target_link_libraries(plugin-${PLG_NAME} libirccd-daemon ${PLG_LIBRARIES}) target_include_directories(plugin-${PLG_NAME} PRIVATE ${PLG_INCLUDES}) @@ -122,8 +122,8 @@ function(irccd_define_plugin) set(options "") - set(oneValueArgs NAME DOCS TYPE SCRIPT) - set(multiValueArgs SOURCES INCLUDES LIBRARIES) + set(oneValueArgs "NAME;MAN;TYPE;SCRIPT") + set(multiValueArgs "SOURCES;INCLUDES;LIBRARIES") cmake_parse_arguments(PLG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -142,13 +142,13 @@ setg(IRCCD_WITH_PLUGIN_${PLG_UPPER_NAME}_MSG "Yes") # Optional documentation. - if (PLG_DOCS) - irccd_build_html( - SOURCE ${PLG_DOCS} - COMPONENT ${PLG_NAME} - OUTPUT_DIR plugin/${PLG_NAME} - OUTPUT_VAR PLG_OUTPUT_DOC - TEMPLATE ${html_SOURCE_DIR}/template.html + if (PLG_MAN) + get_filename_component(man ${PLG_MAN} NAME) + + irccd_define_man( + INPUT ${PLG_MAN} + OUTPUT irccd-plugin-${man} + SECTION man7 ) endif () diff -r dc6b42d7b97a -r 00a4720c4874 cmake/packages/FindPandoc.cmake --- a/cmake/packages/FindPandoc.cmake Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,229 +0,0 @@ -# FindPandoc -# ---------- -# -# Find Pandoc executable, this modules defines: -# -# Pandoc_EXECUTABLE, where to find pandoc's executable -# Pandoc_FOUND, if it is found -# Pandoc_VERSION, the version -# -# This module also defines the following macros: -# -# pandoc( -# SOURCES file1 [file2 ...] -# OUTPUT output -# [FROM format] -# [TO format] -# [TARGET target] -# [DEPENDS dependency ...] -# [ALL] -# [TOC] -# [STANDALONE] -# [MAKE_DIRECTORY] -# [TEMPLATE file] -# [FILTER filter] -# [HEADER header ...] -# [FOOTER footer ...] -# [BODY body ...] -# [VARIABLE var ...] -# [METADATA meta ...] -# [ARGS argument ...] -# [WORKING_DIRECTORY directory] -# ) -# -# The sources files are listed in the parameter SOURCES, all files are passed -# in the same order they are passed to that variable. -# -# The OUTPUT file is set with OUTPUT. It is generated only if one of the file -# has changed. -# -# The FROM (-f) and TO (-t) arguments specify respectively the source and -# destinations formats. -# -# If the parameter TARGET is set, then a target named `target` will be added -# with the OUTPUT file as the dependency but not listed as sources files. -# But the SOURCES files will be added as the target sources in the IDE. -# -# Optional dependencies can be added to the output command (not the target) with -# the DEPENDS parameter. -# -# If ALL is set and TARGET is also set, the target will be added to the ALL_BUILD. -# -# If TOC (--toc) is specified, a table of content will be automatically created. -# -# If STANDALONE (-s) is set, the compilation will assume that it is standalone -# and adds the necessary of the output format. -# -# Optional MAKE_DIRECTORY can be set to create the output directory before -# pandoc processes the file (recommended). -# -# The TEMPLATE parameter can be used to specify the formate template file. -# -# You can set a filter with the parameter FILTER. The filter will be added to -# the output dependencies so you can safely use CMake's targets. -# -# The HEADER (-H), FOOTER (-A) and BODY (-B) are copied verbatim before, just -# after and after the body respectively. They can be set more than once. -# -# You can pass variables (-V) and metadata (-M) to the parameters VARIABLE -# and METADATA, be sure to pass the same syntax as pandoc. (e.g VARIABLE foo=1) -# -# ARGS is an optional list of additional arguments to pass to pandoc. -# -# The parameter WORKING_DIRECTORY can be set to change the directory when pandoc -# is invoked. -# - -find_program( - Pandoc_EXECUTABLE - NAMES pandoc - DOC "Pandoc executable" -) - -include(FindPackageHandleStandardArgs) -include(CMakeParseArguments) - -# Extract the version -if (Pandoc_EXECUTABLE) - execute_process( - COMMAND pandoc --version - OUTPUT_VARIABLE _pandoc_version_tmp - ) - - string(REGEX REPLACE "^pandoc ([0-9]*\\.[0-9]*\\.[0-9]*).*$" "\\1" Pandoc_VERSION ${_pandoc_version_tmp}) -endif () - -find_package_handle_standard_args( - Pandoc - FOUND_VAR Pandoc_FOUND - VERSION_VAR Pandoc_VERSION - REQUIRED_VARS Pandoc_EXECUTABLE -) - -if (Pandoc_FOUND) - function(pandoc) - set(options MAKE_DIRECTORY STANDALONE TOC) - set(oneValueArgs FILTER FROM TARGET TEMPLATE TO OUTPUT WORKING_DIRECTORY) - set(multiValueArgs ARGS FOOTER HEADER METADATA SOURCES VARIABLE DEPENDS) - - # - # The following variables will be set in that scope: - # _pandoc_arguments List of all arguments that will passed to pandoc invocation. - # _pandoc_depends List of all dependencies attached to the add_custom_command. - # _pandoc_mkdir The mkdir command if MAKE_DIRECTORY is set - # _pandoc_output_base The base output directory - # - cmake_parse_arguments(PANDOC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # - # Output and sources are mandatory - # - if (NOT PANDOC_OUTPUT) - message(FATAL_ERROR "Please define OUTPUT") - elseif (NOT PANDOC_SOURCES) - message(FATAL_ERROR "Please defines SOURCES") - endif () - - # - # Handle the filter with care. - # - # 1. If it is a target, depend on it and use a generator - # expression to get its full path on the disk. - # 2. If it is not a target, just use the user provided path. - # - if (PANDOC_FILTER) - # If it is a target, add a dependency so that it is built - if (TARGET ${PANDOC_FILTER}) - list(APPEND _pandoc_arguments --filter "$") - list(APPEND _pandoc_depends ${PANDOC_FILTER}) - else () - list(APPEND _pandoc_arguments --filter ${PANDOC_FILTER}) - endif () - endif () - - if (PANDOC_TOC) - list(APPEND _pandoc_arguments --toc) - endif () - if (PANDOC_STANDALONE) - list(APPEND _pandoc_arguments -s) - endif () - if (PANDOC_FROM) - list(APPEND _pandoc_arguments -f ${PANDOC_FROM}) - endif () - if (PANDOC_TO) - list(APPEND _pandoc_arguments -t ${PANDOC_TO}) - endif () - if (PANDOC_TEMPLATE) - list(APPEND _pandoc_arguments --template ${PANDOC_TEMPLATE}) - list(APPEND _pandoc_depends ${PANDOC_TEMPLATE}) - endif () - - # Header, footers and body - foreach (h ${PANDOC_HEADER}) - list(APPEND _pandoc_arguments -H ${h}) - list(APPEND _pandoc_depends ${h}) - endforeach () - foreach (b ${PANDOC_BODY}) - list(APPEND _pandoc_arguments -B ${b}) - list(APPEND _pandoc_depends ${b}) - endforeach () - foreach (f ${PANDOC_FOOTER}) - list(APPEND _pandoc_arguments -A ${f}) - list(APPEND _pandoc_depends ${f}) - endforeach () - - # Variables and metadata - foreach (var ${PANDOC_VARIABLE}) - list(APPEND _pandoc_arguments -V ${var}) - endforeach () - foreach (meta ${PANDOC_METADATA}) - list(APPEND _pandoc_arguments -M ${meta}) - endforeach () - - # Optional list of arguments - foreach (arg ${PANDOC_ARGS}) - list(APPEND _pandoc_arguments ${arg}) - endforeach () - - # Output and sources - list(APPEND _pandoc_arguments -o ${PANDOC_OUTPUT}) - - # - # The following variables are set within the loop: - # - # _pandoc_input The absolute path to the input file. - # _pandoc_output_base The base output directory. - # - foreach (s ${PANDOC_SOURCES}) - get_filename_component(_pandoc_input ${s} ABSOLUTE) - get_filename_component(_pandoc_output_base ${PANDOC_OUTPUT} DIRECTORY) - list(APPEND _pandoc_depends ${_pandoc_input}) - list(APPEND _pandoc_arguments ${_pandoc_input}) - endforeach () - - # Create the output directory if requested - if (PANDOC_MAKE_DIRECTORY) - set(_pandoc_mkdir ${CMAKE_COMMAND} -E make_directory ${_pandoc_output_base}) - endif () - - add_custom_command( - OUTPUT ${PANDOC_OUTPUT} - COMMAND ${_pandoc_mkdir} - COMMAND ${Pandoc_EXECUTABLE} ${_pandoc_arguments} - DEPENDS ${_pandoc_depends} ${PANDOC_DEPENDS} - WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY} - VERBATIM - ) - - if (PANDOC_TARGET) - add_custom_target( - ${PANDOC_TARGET} ${PANDOC_ALL} - SOURCES ${_pandoc_depends} - DEPENDS ${PANDOC_OUTPUT} - WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY} - ) - endif () - endfunction() -endif () - -mark_as_advanced(Pandoc_EXECUTABLE) diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/CMakeLists.txt --- a/doc/html/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -# -# CMakeLists.txt -- CMake build system for irccd -# -# Copyright (c) 2013-2019 David Demelier -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -project(html) - -set(IRCCD_WITH_HTML_TEMPLATE ${html_SOURCE_DIR}/template.html - CACHE STRING "HTML marker template") - -set( - HTML_JS_SOURCES - js/event/onCommand.md - js/event/onConnect.md - js/event/onDisconnect.md - js/event/onInvite.md - js/event/onJoin.md - js/event/onKick.md - js/event/onLoad.md - js/event/onMe.md - js/event/onMessage.md - js/event/onMode.md - js/event/onNames.md - js/event/onNick.md - js/event/onNotice.md - js/event/onPart.md - js/event/onReload.md - js/event/onTopic.md - js/event/onUnload.md - js/event/onWhois.md - js/index.md - js/module/Irccd.Directory/index.md - js/module/Irccd.Directory/Irccd.Directory.find.md - js/module/Irccd.Directory/Irccd.Directory.mkdir.md - js/module/Irccd.Directory/Irccd.Directory.prototype.constructor.md - js/module/Irccd.Directory/Irccd.Directory.prototype.find.md - js/module/Irccd.Directory/Irccd.Directory.prototype.remove.md - js/module/Irccd.Directory/Irccd.Directory.remove.md - js/module/Irccd.ElapsedTimer/index.md - js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.constructor.md - js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.elapsed.md - js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.pause.md - js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.reset.md - js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.restart.md - js/module/Irccd.File/index.md - js/module/Irccd.File/Irccd.File.basename.md - js/module/Irccd.File/Irccd.File.dirname.md - js/module/Irccd.File/Irccd.File.exists.md - js/module/Irccd.File/Irccd.File.prototype.basename.md - js/module/Irccd.File/Irccd.File.prototype.close.md - js/module/Irccd.File/Irccd.File.prototype.constructor.md - js/module/Irccd.File/Irccd.File.prototype.dirname.md - js/module/Irccd.File/Irccd.File.prototype.lines.md - js/module/Irccd.File/Irccd.File.prototype.readline.md - js/module/Irccd.File/Irccd.File.prototype.read.md - js/module/Irccd.File/Irccd.File.prototype.remove.md - js/module/Irccd.File/Irccd.File.prototype.seek.md - js/module/Irccd.File/Irccd.File.prototype.stat.md - js/module/Irccd.File/Irccd.File.prototype.tell.md - js/module/Irccd.File/Irccd.File.prototype.write.md - js/module/Irccd.File/Irccd.File.remove.md - js/module/Irccd.File/Irccd.File.stat.md - js/module/Irccd/index.md - js/module/Irccd.Logger/index.md - js/module/Irccd.Logger/Irccd.Logger.debug.md - js/module/Irccd.Logger/Irccd.Logger.info.md - js/module/Irccd.Logger/Irccd.Logger.warning.md - js/module/Irccd.Plugin/index.md - js/module/Irccd.Plugin/Irccd.Plugin.info.md - js/module/Irccd.Plugin/Irccd.Plugin.list.md - js/module/Irccd.Plugin/Irccd.Plugin.load.md - js/module/Irccd.Plugin/Irccd.Plugin.reload.md - js/module/Irccd.Plugin/Irccd.Plugin.unload.md - js/module/Irccd.Server/index.md - js/module/Irccd.Server/Irccd.Server.add.md - js/module/Irccd.Server/Irccd.Server.find.md - js/module/Irccd.Server/Irccd.Server.list.md - js/module/Irccd.Server/Irccd.Server.prototype.constructor.md - js/module/Irccd.Server/Irccd.Server.prototype.info.md - js/module/Irccd.Server/Irccd.Server.prototype.invite.md - js/module/Irccd.Server/Irccd.Server.prototype.isSelf.md - js/module/Irccd.Server/Irccd.Server.prototype.join.md - js/module/Irccd.Server/Irccd.Server.prototype.kick.md - js/module/Irccd.Server/Irccd.Server.prototype.me.md - js/module/Irccd.Server/Irccd.Server.prototype.message.md - js/module/Irccd.Server/Irccd.Server.prototype.mode.md - js/module/Irccd.Server/Irccd.Server.prototype.names.md - js/module/Irccd.Server/Irccd.Server.prototype.nick.md - js/module/Irccd.Server/Irccd.Server.prototype.notice.md - js/module/Irccd.Server/Irccd.Server.prototype.part.md - js/module/Irccd.Server/Irccd.Server.prototype.topic.md - js/module/Irccd.Server/Irccd.Server.prototype.toString.md - js/module/Irccd.Server/Irccd.Server.prototype.whois.md - js/module/Irccd.Server/Irccd.Server.remove.md - js/module/Irccd.System/index.md - js/module/Irccd.System/Irccd.System.env.md - js/module/Irccd.System/Irccd.System.exec.md - js/module/Irccd.System/Irccd.System.home.md - js/module/Irccd.System/Irccd.System.name.md - js/module/Irccd.System/Irccd.System.popen.md - js/module/Irccd.System/Irccd.System.sleep.md - js/module/Irccd.System/Irccd.System.ticks.md - js/module/Irccd.System/Irccd.System.uptime.md - js/module/Irccd.System/Irccd.System.usleep.md - js/module/Irccd.System/Irccd.System.version.md - js/module/Irccd.Timer/index.md - js/module/Irccd.Timer/Irccd.Timer.prototype.constructor.md - js/module/Irccd.Timer/Irccd.Timer.prototype.start.md - js/module/Irccd.Timer/Irccd.Timer.prototype.stop.md - js/module/Irccd.Unicode/index.md - js/module/Irccd.Unicode/Irccd.Unicode.isDigit.md - js/module/Irccd.Unicode/Irccd.Unicode.isLetter.md - js/module/Irccd.Unicode/Irccd.Unicode.isLower.md - js/module/Irccd.Unicode/Irccd.Unicode.isSpace.md - js/module/Irccd.Unicode/Irccd.Unicode.isTitle.md - js/module/Irccd.Unicode/Irccd.Unicode.isUpper.md - js/module/Irccd.Util/index.md - js/module/Irccd.Util/Irccd.Util.cut.md - js/module/Irccd.Util/Irccd.Util.format.md - js/module/Irccd.Util/Irccd.Util.splithost.md - js/module/Irccd.Util/Irccd.Util.splituser.md -) - -set( - HTML_SOURCES - build.md - irccd.conf.md - irccdctl.conf.md - irccdctl.md - irccd.md - irccd-test.md -) - -foreach (file ${HTML_SOURCES} ${HTML_JS_SOURCES}) - get_filename_component(directory ${file} DIRECTORY) - - if (${file} IN_LIST HTML_SOURCES) - set(template ${html_SOURCE_DIR}/template.html) - else () - set(template ${html_SOURCE_DIR}/template-js.html) - endif () - - irccd_build_html( - SOURCE ${doc_SOURCE_DIR}/src/${file} - OUTPUT_DIR ${directory} - TEMPLATE ${template} - OUTPUT_VAR output - COMPONENT html - ) - - list(APPEND SOURCES ${doc_SOURCE_DIR}/src/${file}) - list(APPEND OUTPUTS ${output}) -endforeach () - -set( - CSS - ${html_SOURCE_DIR}/css/github-gist.css - ${html_SOURCE_DIR}/css/bulma.min.css -) - -set( - JS - ${html_SOURCE_DIR}/js/highlight.min.js -) - -add_custom_target( - doc-html ALL - COMMAND - ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/html - COMMAND - ${CMAKE_COMMAND} -E copy ${CSS} ${JS} ${CMAKE_BINARY_DIR}/html - SOURCES - ${OUTPUTS} - ${SOURCES} - ${html_SOURCE_DIR}/template.html -) - -set_target_properties(doc-html PROPERTIES FOLDER "doc") - -# Install resources files. -install( - FILES ${CSS} ${JS} - COMPONENT html - DESTINATION ${CMAKE_INSTALL_DOCDIR} -) - -setg(CPACK_COMPONENT_HTML_DISPLAY_NAME "Documentation") -setg(CPACK_COMPONENT_HTML_DESCRIPTION "User guide and JavaScript API.") -setg(CPACK_COMPONENT_HTML_GROUP "HTML Documentation") diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/css/bulma.min.css --- a/doc/html/css/bulma.min.css Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -/*! bulma.io v0.7.2 | MIT License | github.com/jgthms/bulma */@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.breadcrumb,.button,.delete,.file,.is-unselectable,.modal-close,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:center;transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.highlight:not(:last-child),.level:not(:last-child),.list:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 img,.image.is-1by1 img,.image.is-1by2 img,.image.is-1by3 img,.image.is-2by1 img,.image.is-2by3 img,.image.is-3by1 img,.image.is-3by2 img,.image.is-3by4 img,.image.is-3by5 img,.image.is-4by3 img,.image.is-4by5 img,.image.is-5by3 img,.image.is-5by4 img,.image.is-9by16 img,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select select[disabled],.textarea[disabled]{cursor:not-allowed}/*! minireset.css v0.0.3 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}audio,img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0;text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1rem;font-weight:400;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#ff3860;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{text-align:left;vertical-align:top}table th{color:#363636}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-clipped{overflow:hidden!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1087px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1088px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1280px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1472px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1087px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1088px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1280px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1472px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1087px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1088px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1280px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1472px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1087px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1088px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1280px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1472px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1087px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1088px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1280px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1472px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-link{color:#3273dc!important}a.has-text-link:focus,a.has-text-link:hover{color:#205bbc!important}.has-background-link{background-color:#3273dc!important}.has-text-info{color:#209cee!important}a.has-text-info:focus,a.has-text-info:hover{color:#0f81cc!important}.has-background-info{background-color:#209cee!important}.has-text-success{color:#23d160!important}a.has-text-success:focus,a.has-text-success:hover{color:#1ca64c!important}.has-background-success{background-color:#23d160!important}.has-text-warning{color:#ffdd57!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd324!important}.has-background-warning{background-color:#ffdd57!important}.has-text-danger{color:#ff3860!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ff0537!important}.has-background-danger{background-color:#ff3860!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1087px){.is-block-touch{display:block!important}}@media screen and (min-width:1088px){.is-block-desktop{display:block!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1280px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1472px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1087px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1088px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1280px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1472px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1087px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1088px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1280px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1472px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1087px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1088px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1280px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1472px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1087px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1088px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1280px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1472px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}.is-sr-only{border:none!important;clip:rect(0,0,0,0)!important;height:.01em!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:.01em!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1087px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1088px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1280px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1472px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1087px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1088px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1280px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1472px){.is-invisible-fullhd{visibility:hidden!important}}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #3273dc}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #3273dc}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.375em - 1px);margin-right:.1875em}.button .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:calc(-.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.375em - 1px);margin-right:calc(-.375em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#3273dc;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled]{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled]{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:#363636}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:#363636}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover{background-color:#292929}.button.is-light.is-inverted[disabled]{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled]{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled]{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined[disabled]{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#3273dc;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#276cda;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#2366d1;border-color:transparent;color:#fff}.button.is-link[disabled]{background-color:#3273dc;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#3273dc}.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#3273dc}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#3273dc;color:#3273dc}.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#3273dc;border-color:#3273dc;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #3273dc #3273dc!important}.button.is-link.is-outlined[disabled]{background-color:transparent;border-color:#3273dc;box-shadow:none;color:#3273dc}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#3273dc}.button.is-link.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#1496ed;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#118fe4;border-color:transparent;color:#fff}.button.is-info[disabled]{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee!important}.button.is-info.is-outlined[disabled]{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#23d160;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#22c65b;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#20bc56;border-color:transparent;color:#fff}.button.is-success[disabled]{background-color:#23d160;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#23d160}.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#23d160}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#23d160;color:#23d160}.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#23d160;border-color:#23d160;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #23d160 #23d160!important}.button.is-success.is-outlined[disabled]{background-color:transparent;border-color:#23d160;box-shadow:none;color:#23d160}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#23d160}.button.is-success.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled]{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled]{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-outlined[disabled]{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-danger{background-color:#ff3860;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#ff2b56;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ff1f4b;border-color:transparent;color:#fff}.button.is-danger[disabled]{background-color:#ff3860;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#ff3860}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#ff3860;color:#ff3860}.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#ff3860;border-color:#ff3860;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #ff3860 #ff3860!important}.button.is-danger.is-outlined[disabled]{background-color:transparent;border-color:#ff3860;box-shadow:none;color:#ff3860}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small{border-radius:2px;font-size:.75rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled]{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1}.buttons.is-centered{justify-content:center}.buttons.is-right{justify-content:flex-end}.container{margin:0 auto;position:relative}@media screen and (min-width:1088px){.container{max-width:960px;width:960px}.container.is-fluid{margin-left:64px;margin-right:64px;max-width:none;width:auto}}@media screen and (max-width:1279px){.container.is-widescreen{max-width:1152px;width:auto}}@media screen and (max-width:1471px){.container.is-fullhd{max-width:1344px;width:auto}}@media screen and (min-width:1280px){.container{max-width:1152px;width:1152px}}@media screen and (min-width:1472px){.container{max-width:1344px;width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636;text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content.is-small{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.input,.textarea{background-color:#fff;border-color:#dbdbdb;color:#363636;box-shadow:inset 0 1px 2px rgba(10,10,10,.1);max-width:100%;width:100%}.input::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input.is-hovered,.input:hover,.textarea.is-hovered,.textarea:hover{border-color:#b5b5b5}.input.is-active,.input.is-focused,.input:active,.input:focus,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input[disabled],.textarea[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input[readonly],.textarea[readonly]{box-shadow:none}.input.is-white,.textarea.is-white{border-color:#fff}.input.is-white.is-active,.input.is-white.is-focused,.input.is-white:active,.input.is-white:focus,.textarea.is-white.is-active,.textarea.is-white.is-focused,.textarea.is-white:active,.textarea.is-white:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.input.is-black,.textarea.is-black{border-color:#0a0a0a}.input.is-black.is-active,.input.is-black.is-focused,.input.is-black:active,.input.is-black:focus,.textarea.is-black.is-active,.textarea.is-black.is-focused,.textarea.is-black:active,.textarea.is-black:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.input.is-light,.textarea.is-light{border-color:#f5f5f5}.input.is-light.is-active,.input.is-light.is-focused,.input.is-light:active,.input.is-light:focus,.textarea.is-light.is-active,.textarea.is-light.is-focused,.textarea.is-light:active,.textarea.is-light:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.input.is-dark,.textarea.is-dark{border-color:#363636}.input.is-dark.is-active,.input.is-dark.is-focused,.input.is-dark:active,.input.is-dark:focus,.textarea.is-dark.is-active,.textarea.is-dark.is-focused,.textarea.is-dark:active,.textarea.is-dark:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.input.is-primary,.textarea.is-primary{border-color:#00d1b2}.input.is-primary.is-active,.input.is-primary.is-focused,.input.is-primary:active,.input.is-primary:focus,.textarea.is-primary.is-active,.textarea.is-primary.is-focused,.textarea.is-primary:active,.textarea.is-primary:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.input.is-link,.textarea.is-link{border-color:#3273dc}.input.is-link.is-active,.input.is-link.is-focused,.input.is-link:active,.input.is-link:focus,.textarea.is-link.is-active,.textarea.is-link.is-focused,.textarea.is-link:active,.textarea.is-link:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input.is-info,.textarea.is-info{border-color:#209cee}.input.is-info.is-active,.input.is-info.is-focused,.input.is-info:active,.input.is-info:focus,.textarea.is-info.is-active,.textarea.is-info.is-focused,.textarea.is-info:active,.textarea.is-info:focus{box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.input.is-success,.textarea.is-success{border-color:#23d160}.input.is-success.is-active,.input.is-success.is-focused,.input.is-success:active,.input.is-success:focus,.textarea.is-success.is-active,.textarea.is-success.is-focused,.textarea.is-success:active,.textarea.is-success:focus{box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.input.is-warning,.textarea.is-warning{border-color:#ffdd57}.input.is-warning.is-active,.input.is-warning.is-focused,.input.is-warning:active,.input.is-warning:focus,.textarea.is-warning.is-active,.textarea.is-warning.is-focused,.textarea.is-warning:active,.textarea.is-warning:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.input.is-danger,.textarea.is-danger{border-color:#ff3860}.input.is-danger.is-active,.input.is-danger.is-focused,.input.is-danger:active,.input.is-danger:focus,.textarea.is-danger.is-active,.textarea.is-danger.is-focused,.textarea.is-danger:active,.textarea.is-danger:focus{box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.input.is-small,.textarea.is-small{border-radius:2px;font-size:.75rem}.input.is-medium,.textarea.is-medium{font-size:1.25rem}.input.is-large,.textarea.is-large{font-size:1.5rem}.input.is-fullwidth,.textarea.is-fullwidth{display:block;width:100%}.input.is-inline,.textarea.is-inline{display:inline;width:auto}.input.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox[disabled],.radio[disabled]{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#3273dc;right:1.125em;z-index:4}.select.is-rounded select{border-radius:290486px;padding-left:1em}.select select{background-color:#fff;border-color:#dbdbdb;color:#363636;cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-moz-placeholder{color:rgba(54,54,54,.3)}.select select::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.select select:-moz-placeholder{color:rgba(54,54,54,.3)}.select select:-ms-input-placeholder{color:rgba(54,54,54,.3)}.select select.is-hovered,.select select:hover{border-color:#b5b5b5}.select select.is-active,.select select.is-focused,.select select:active,.select select:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select select[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.select select[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.select select::-ms-expand{display:none}.select select[disabled]:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#3273dc}.select.is-link select{border-color:#3273dc}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#2366d1}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#118fe4}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.select.is-success:not(:hover)::after{border-color:#23d160}.select.is-success select{border-color:#23d160}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#20bc56}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd83d}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.select.is-danger:not(:hover)::after{border-color:#ff3860}.select.is-danger select{border-color:#ff3860}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ff1f4b}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;-webkit-transform:none;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:#363636}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#f5f5f5}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#3273dc;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#276cda;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(50,115,220,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#2366d1;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#1496ed;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(32,156,238,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#118fe4;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#23d160;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#22c65b;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(35,209,96,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#20bc56;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,221,87,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#ff3860;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#ff2b56;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,56,96,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ff1f4b;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:0;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#3273dc}.help.is-info{color:#209cee}.help.is-success{color:#23d160}.help.is-warning{color:#ffdd57}.help.is-danger{color:#ff3860}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child .button,.field.has-addons .control:first-child .input,.field.has-addons .control:first-child .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child .button,.field.has-addons .control:last-child .input,.field.has-addons .control:last-child .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]).is-hovered,.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .input:not([disabled]).is-hovered,.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]).is-hovered,.field.has-addons .control .select select:not([disabled]):hover{z-index:2}.field.has-addons .control .button:not([disabled]).is-active,.field.has-addons .control .button:not([disabled]).is-focused,.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .input:not([disabled]).is-active,.field.has-addons .control .input:not([disabled]).is-focused,.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control .select select:not([disabled]).is-active,.field.has-addons .control .select select:not([disabled]).is-focused,.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select:not([disabled]):focus{z-index:3}.field.has-addons .control .button:not([disabled]).is-active:hover,.field.has-addons .control .button:not([disabled]).is-focused:hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .input:not([disabled]).is-active:hover,.field.has-addons .control .input:not([disabled]).is-focused:hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control .select select:not([disabled]).is-active:hover,.field.has-addons .control .select select:not([disabled]).is-focused:hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select:not([disabled]):focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{clear:both;font-size:1rem;position:relative;text-align:left}.control.has-icon .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icon .input:focus+.icon{color:#7a7a7a}.control.has-icon .input.is-small+.icon{font-size:.75rem}.control.has-icon .input.is-medium+.icon{font-size:1.25rem}.control.has-icon .input.is-large+.icon{font-size:1.5rem}.control.has-icon:not(.has-icon-right) .icon{left:0}.control.has-icon:not(.has-icon-right) .input{padding-left:2.25em}.control.has-icon.has-icon-right .icon{right:0}.control.has-icon.has-icon-right .input{padding-right:2.25em}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#7a7a7a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:290486px}.image.is-16by9 img,.image.is-1by1 img,.image.is-1by2 img,.image.is-1by3 img,.image.is-2by1 img,.image.is-2by3 img,.image.is-3by1 img,.image.is-3by2 img,.image.is-3by4 img,.image.is-3by5 img,.image.is-4by3 img,.image.is-4by5 img,.image.is-5by3 img,.image.is-5by4 img,.image.is-9by16 img,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{position:absolute;right:.5rem;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark{background-color:#363636;color:#f5f5f5}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-link{background-color:#3273dc;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#23d160;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.notification.is-danger{background-color:#ff3860;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-link::-webkit-progress-value{background-color:#3273dc}.progress.is-link::-moz-progress-bar{background-color:#3273dc}.progress.is-link::-ms-fill{background-color:#3273dc}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-success::-webkit-progress-value{background-color:#23d160}.progress.is-success::-moz-progress-bar{background-color:#23d160}.progress.is-success::-ms-fill{background-color:#23d160}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-danger::-webkit-progress-value{background-color:#ff3860}.progress.is-danger::-moz-progress-bar{background-color:#ff3860}.progress.is-danger::-ms-fill{background-color:#ff3860}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#3273dc;border-color:#3273dc;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#23d160;border-color:#23d160;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#ff3860;border-color:#ff3860;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#363636;text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:#363636}.tag:not(body).is-dark{background-color:#363636;color:#f5f5f5}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-link{background-color:#3273dc;color:#fff}.tag:not(body).is-info{background-color:#209cee;color:#fff}.tag:not(body).is-success{background-color:#23d160;color:#fff}.tag:not(body).is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.tag:not(body).is-danger{background-color:#ff3860;color:#fff}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:290486px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#3273dc;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;max-width:100%;position:relative}.card-header{background-color:transparent;align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:transparent;padding:1.5rem}.card-footer{background-color:transparent;border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:.75rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#3273dc;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.list{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1)}.list-item{display:block;padding:.5em 1em}.list-item:not(a){color:#4a4a4a}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:not(:last-child){border-bottom:1px solid #dbdbdb}.list-item.is-active{background-color:#3273dc;color:#fff}a.list-item{background-color:#f5f5f5;cursor:pointer}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width:768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#3273dc;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary{background-color:#f5fffd}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#021310}.message.is-link{background-color:#f6f9fe}.message.is-link .message-header{background-color:#3273dc;color:#fff}.message.is-link .message-body{border-color:#3273dc;color:#22509a}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537e}.message.is-success{background-color:#f6fef9}.message.is-success .message-header{background-color:#23d160;color:#fff}.message.is-success .message-body{border-color:#23d160;color:#0e301a}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3b3108}.message.is-danger{background-color:#fff5f7}.message.is-danger .message-header{background-color:#ff3860;color:#fff}.message.is-danger .message-body{border-color:#ff3860;color:#cd0930}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px),print{.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:10px}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width:1088px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:#363636}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-burger{color:#363636}@media screen and (min-width:1088px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:#363636}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-burger{color:#f5f5f5}@media screen and (min-width:1088px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#3273dc;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#3273dc;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#23d160;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#23d160;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,.7)}@media screen and (min-width:1088px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#ff3860;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width:1088px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#ff3860;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;-webkit-transform-origin:center;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,-webkit-transform;transition-property:background-color,opacity,transform;transition-property:background-color,opacity,transform,-webkit-transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){-webkit-transform:translateY(5px) rotate(45deg);transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:translateY(-5px) rotate(-45deg);transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:hover{background-color:#fafafa;color:#3273dc}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#3273dc}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#3273dc;border-bottom-style:solid;border-bottom-width:3px;color:#3273dc;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#3273dc;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1087px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1088px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{-webkit-transform:rotate(135deg) translate(.25em,-.25em);transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;-webkit-transform:translateY(0);transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));-webkit-transform:translateY(-5px);transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-.75rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:hover),a.navbar-item.is-active:not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;padding-left:.5em;padding-right:.5em;justify-content:center;margin:.25rem;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#3273dc}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#3273dc;border-color:#3273dc;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-block,.panel-heading,.panel-tabs{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-block:first-child,.panel-heading:first-child,.panel-tabs:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#363636;font-size:1.25em;font-weight:300;line-height:1.25;padding:.5em .75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#3273dc}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#3273dc;color:#363636}.panel-block.is-active .panel-icon{color:#3273dc}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#3273dc;color:#3273dc}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#3273dc;border-color:#3273dc;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1087px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1088px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1280px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1472px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1088px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}@media screen and (max-width:768px){.columns.is-variable.is-0-mobile{--columnGap:0rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-0-tablet{--columnGap:0rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-0-tablet-only{--columnGap:0rem}}@media screen and (max-width:1087px){.columns.is-variable.is-0-touch{--columnGap:0rem}}@media screen and (min-width:1088px){.columns.is-variable.is-0-desktop{--columnGap:0rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-0-desktop-only{--columnGap:0rem}}@media screen and (min-width:1280px){.columns.is-variable.is-0-widescreen{--columnGap:0rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-0-widescreen-only{--columnGap:0rem}}@media screen and (min-width:1472px){.columns.is-variable.is-0-fullhd{--columnGap:0rem}}.columns.is-variable.is-1{--columnGap:0.25rem}@media screen and (max-width:768px){.columns.is-variable.is-1-mobile{--columnGap:0.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-1-tablet{--columnGap:0.25rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-1-tablet-only{--columnGap:0.25rem}}@media screen and (max-width:1087px){.columns.is-variable.is-1-touch{--columnGap:0.25rem}}@media screen and (min-width:1088px){.columns.is-variable.is-1-desktop{--columnGap:0.25rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-1-desktop-only{--columnGap:0.25rem}}@media screen and (min-width:1280px){.columns.is-variable.is-1-widescreen{--columnGap:0.25rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-1-widescreen-only{--columnGap:0.25rem}}@media screen and (min-width:1472px){.columns.is-variable.is-1-fullhd{--columnGap:0.25rem}}.columns.is-variable.is-2{--columnGap:0.5rem}@media screen and (max-width:768px){.columns.is-variable.is-2-mobile{--columnGap:0.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-2-tablet{--columnGap:0.5rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-2-tablet-only{--columnGap:0.5rem}}@media screen and (max-width:1087px){.columns.is-variable.is-2-touch{--columnGap:0.5rem}}@media screen and (min-width:1088px){.columns.is-variable.is-2-desktop{--columnGap:0.5rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-2-desktop-only{--columnGap:0.5rem}}@media screen and (min-width:1280px){.columns.is-variable.is-2-widescreen{--columnGap:0.5rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-2-widescreen-only{--columnGap:0.5rem}}@media screen and (min-width:1472px){.columns.is-variable.is-2-fullhd{--columnGap:0.5rem}}.columns.is-variable.is-3{--columnGap:0.75rem}@media screen and (max-width:768px){.columns.is-variable.is-3-mobile{--columnGap:0.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-3-tablet{--columnGap:0.75rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-3-tablet-only{--columnGap:0.75rem}}@media screen and (max-width:1087px){.columns.is-variable.is-3-touch{--columnGap:0.75rem}}@media screen and (min-width:1088px){.columns.is-variable.is-3-desktop{--columnGap:0.75rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-3-desktop-only{--columnGap:0.75rem}}@media screen and (min-width:1280px){.columns.is-variable.is-3-widescreen{--columnGap:0.75rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-3-widescreen-only{--columnGap:0.75rem}}@media screen and (min-width:1472px){.columns.is-variable.is-3-fullhd{--columnGap:0.75rem}}.columns.is-variable.is-4{--columnGap:1rem}@media screen and (max-width:768px){.columns.is-variable.is-4-mobile{--columnGap:1rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-4-tablet{--columnGap:1rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-4-tablet-only{--columnGap:1rem}}@media screen and (max-width:1087px){.columns.is-variable.is-4-touch{--columnGap:1rem}}@media screen and (min-width:1088px){.columns.is-variable.is-4-desktop{--columnGap:1rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-4-desktop-only{--columnGap:1rem}}@media screen and (min-width:1280px){.columns.is-variable.is-4-widescreen{--columnGap:1rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-4-widescreen-only{--columnGap:1rem}}@media screen and (min-width:1472px){.columns.is-variable.is-4-fullhd{--columnGap:1rem}}.columns.is-variable.is-5{--columnGap:1.25rem}@media screen and (max-width:768px){.columns.is-variable.is-5-mobile{--columnGap:1.25rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-5-tablet{--columnGap:1.25rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-5-tablet-only{--columnGap:1.25rem}}@media screen and (max-width:1087px){.columns.is-variable.is-5-touch{--columnGap:1.25rem}}@media screen and (min-width:1088px){.columns.is-variable.is-5-desktop{--columnGap:1.25rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-5-desktop-only{--columnGap:1.25rem}}@media screen and (min-width:1280px){.columns.is-variable.is-5-widescreen{--columnGap:1.25rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-5-widescreen-only{--columnGap:1.25rem}}@media screen and (min-width:1472px){.columns.is-variable.is-5-fullhd{--columnGap:1.25rem}}.columns.is-variable.is-6{--columnGap:1.5rem}@media screen and (max-width:768px){.columns.is-variable.is-6-mobile{--columnGap:1.5rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-6-tablet{--columnGap:1.5rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-6-tablet-only{--columnGap:1.5rem}}@media screen and (max-width:1087px){.columns.is-variable.is-6-touch{--columnGap:1.5rem}}@media screen and (min-width:1088px){.columns.is-variable.is-6-desktop{--columnGap:1.5rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-6-desktop-only{--columnGap:1.5rem}}@media screen and (min-width:1280px){.columns.is-variable.is-6-widescreen{--columnGap:1.5rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-6-widescreen-only{--columnGap:1.5rem}}@media screen and (min-width:1472px){.columns.is-variable.is-6-fullhd{--columnGap:1.5rem}}.columns.is-variable.is-7{--columnGap:1.75rem}@media screen and (max-width:768px){.columns.is-variable.is-7-mobile{--columnGap:1.75rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-7-tablet{--columnGap:1.75rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-7-tablet-only{--columnGap:1.75rem}}@media screen and (max-width:1087px){.columns.is-variable.is-7-touch{--columnGap:1.75rem}}@media screen and (min-width:1088px){.columns.is-variable.is-7-desktop{--columnGap:1.75rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-7-desktop-only{--columnGap:1.75rem}}@media screen and (min-width:1280px){.columns.is-variable.is-7-widescreen{--columnGap:1.75rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-7-widescreen-only{--columnGap:1.75rem}}@media screen and (min-width:1472px){.columns.is-variable.is-7-fullhd{--columnGap:1.75rem}}.columns.is-variable.is-8{--columnGap:2rem}@media screen and (max-width:768px){.columns.is-variable.is-8-mobile{--columnGap:2rem}}@media screen and (min-width:769px),print{.columns.is-variable.is-8-tablet{--columnGap:2rem}}@media screen and (min-width:769px) and (max-width:1087px){.columns.is-variable.is-8-tablet-only{--columnGap:2rem}}@media screen and (max-width:1087px){.columns.is-variable.is-8-touch{--columnGap:2rem}}@media screen and (min-width:1088px){.columns.is-variable.is-8-desktop{--columnGap:2rem}}@media screen and (min-width:1088px) and (max-width:1279px){.columns.is-variable.is-8-desktop-only{--columnGap:2rem}}@media screen and (min-width:1280px){.columns.is-variable.is-8-widescreen{--columnGap:2rem}}@media screen and (min-width:1280px) and (max-width:1471px){.columns.is-variable.is-8-widescreen-only{--columnGap:2rem}}@media screen and (min-width:1472px){.columns.is-variable.is-8-fullhd{--columnGap:2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1087px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width:1087px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#f5f5f5}.hero.is-dark .subtitle{color:rgba(245,245,245,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#f5f5f5}@media screen and (max-width:1087px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(245,245,245,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a{color:#f5f5f5;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#3273dc;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-link .navbar-menu{background-color:#3273dc}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#2366d1;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3273dc}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#118fe4;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}}.hero.is-success{background-color:#23d160;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-success .navbar-menu{background-color:#23d160}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#20bc56;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#23d160}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1087px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}}.hero.is-danger{background-color:#ff3860;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-danger .navbar-menu{background-color:#ff3860}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ff3860}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}}.hero.is-small .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width:1088px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/css/github-gist.css --- a/doc/html/css/github-gist.css Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -/** - * GitHub Gist Theme - * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro - */ - -.hljs { - display: block; - background: white; - padding: 0.5em; - color: #333333; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #a71d5d; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/index.md --- a/doc/html/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ ---- -header: "Irccd documentation" -guide: true ---- - -Welcome to the irccd documentation. - -# Building - -Everything you need to build irccd. - - - [Build from sources](build/build-from-sources.html) - - [Build options](build/build-options.html) - -# Configuring & running - -## General topics - -Read the following sections to understand the configuration file format and in -which directories they are located. - - - [Paths](irccd/paths.html) - - [Configuration file syntax](misc/configuration-syntax.html) - -## Irccd - -Configure and run `irccd` daemon. - - - [Configure irccd](irccd/configuring.html) - - [Irccd command line usage](irccd/usage.html) - -## Irccdctl - -Everything about the `irccdctl` utility. - - - [Configure irccdctl](irccdctl/configuring.html) - - [Irccdctl command line usage](irccdctl/usage.html) - - [List of irccdctl commands](irccdctl/command/index.html) - -# Plugins - -Documentation about official irccd plugins. - - - [ask](plugin/ask.html) - - [auth](plugin/auth.html) - - [hangman](plugin/hangman.html) - - [history](plugin/history.html) - - [logger](plugin/logger.html) - - [plugin](plugin/plugin.html) - - [roulette](plugin/roulette.html) - - [tictactoe](plugin/tictactoe.html) - -# Development - -Development of plugins and other development documentation. - - - [Javascript plugin introduction](dev/plugin-javascript-introduction.html) - - [Network protocol](dev/socket-protocol.html) - - [Network commands](dev/socket-commands.html) - -# Plugin API - -The official Javascript API. - - - [Javascript API](api/index.html) - -# Miscellaneous - -Miscellaneous documentation. - - - [Common patterns and formatting](misc/common-patterns-and-formatting.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/js/highlight.min.js --- a/doc/html/js/highlight.min.js Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -/*! highlight.js v9.13.1 | BSD3 License | git.io/hljslicense */ -!function(e){var t="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):t&&(t.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return t.hljs}))}(function(e){function t(e){return e.replace(/&/g,"&").replace(//g,">")}function r(e){return e.nodeName.toLowerCase()}function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}function n(e){return M.test(e)}function i(e){var t,r,a,i,s=e.className+" ";if(s+=e.parentNode?e.parentNode.className:"",r=B.exec(s))return w(r[1])?r[1]:"no-highlight";for(s=s.split(/\s+/),t=0,a=s.length;a>t;t++)if(i=s[t],n(i)||w(i))return i}function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t in e)r[t]=e[t];return a.forEach(function(e){for(t in e)r[t]=e[t]}),r}function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?n+=i.nodeValue.length:1===i.nodeType&&(t.push({event:"start",offset:n,node:i}),n=a(i,n),r(i).match(/br|hr|img|input/)||t.push({event:"stop",offset:n,node:i}));return n}(e,0),t}function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset"}function c(e){u+=""}function o(e){("start"===e.event?s:c)(e.node)}for(var l=0,u="",d=[];e.length||a.length;){var b=i();if(u+=t(n.substring(l,b[0].offset)),l=b[0].offset,b===e){d.reverse().forEach(c);do o(b.splice(0,1)[0]),b=i();while(b===e&&b.length&&b[0].offset===l);d.reverse().forEach(s)}else"start"===b[0].event?d.push(b[0].node):d.pop(),o(b.splice(0,1)[0])}return u+t(n.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function u(e){function t(e){return e&&e.source||e}function r(r,a){return new RegExp(t(r),"m"+(e.cI?"i":"")+(a?"g":""))}function a(n,i){if(!n.compiled){if(n.compiled=!0,n.k=n.k||n.bK,n.k){var s={},c=function(t,r){e.cI&&(r=r.toLowerCase()),r.split(" ").forEach(function(e){var r=e.split("|");s[r[0]]=[t,r[1]?Number(r[1]):1]})};"string"==typeof n.k?c("keyword",n.k):x(n.k).forEach(function(e){c(e,n.k[e])}),n.k=s}n.lR=r(n.l||/\w+/,!0),i&&(n.bK&&(n.b="\\b("+n.bK.split(" ").join("|")+")\\b"),n.b||(n.b=/\B|\b/),n.bR=r(n.b),n.endSameAsBegin&&(n.e=n.b),n.e||n.eW||(n.e=/\B|\b/),n.e&&(n.eR=r(n.e)),n.tE=t(n.e)||"",n.eW&&i.tE&&(n.tE+=(n.e?"|":"")+i.tE)),n.i&&(n.iR=r(n.i)),null==n.r&&(n.r=1),n.c||(n.c=[]),n.c=Array.prototype.concat.apply([],n.c.map(function(e){return l("self"===e?n:e)})),n.c.forEach(function(e){a(e,n)}),n.starts&&a(n.starts,i);var o=n.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([n.tE,n.i]).map(t).filter(Boolean);n.t=o.length?r(o.join("|"),!0):{exec:function(){return null}}}}a(e)}function d(e,r,n,i){function s(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function c(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++)if(a(t.c[r].bR,e))return t.c[r].endSameAsBegin&&(t.c[r].eR=s(t.c[r].bR.exec(e)[0])),t.c[r]}function o(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?o(e.parent,t):void 0}function l(e,t){return!n&&a(t.iR,e)}function p(e,t){var r=y.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(r)&&e.k[r]}function m(e,t,r,a){var n=a?"":S.classPrefix,i='',i+t+s}function f(){var e,r,a,n;if(!k.k)return t(M);for(n="",r=0,k.lR.lastIndex=0,a=k.lR.exec(M);a;)n+=t(M.substring(r,a.index)),e=p(k,a),e?(B+=e[1],n+=m(e[0],t(a[0]))):n+=t(a[0]),r=k.lR.lastIndex,a=k.lR.exec(M);return n+t(M.substr(r))}function g(){var e="string"==typeof k.sL;if(e&&!E[k.sL])return t(M);var r=e?d(k.sL,M,!0,x[k.sL]):b(M,k.sL.length?k.sL:void 0);return k.r>0&&(B+=r.r),e&&(x[k.sL]=r.top),m(r.language,r.value,!1,!0)}function _(){C+=null!=k.sL?g():f(),M=""}function h(e){C+=e.cN?m(e.cN,"",!0):"",k=Object.create(e,{parent:{value:k}})}function v(e,t){if(M+=e,null==t)return _(),0;var r=c(t,k);if(r)return r.skip?M+=t:(r.eB&&(M+=t),_(),r.rB||r.eB||(M=t)),h(r,t),r.rB?0:t.length;var a=o(k,t);if(a){var n=k;n.skip?M+=t:(n.rE||n.eE||(M+=t),_(),n.eE&&(M=t));do k.cN&&(C+=R),k.skip||k.sL||(B+=k.r),k=k.parent;while(k!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.eR=a.eR),h(a.starts,"")),n.rE?0:t.length}if(l(t,k))throw new Error('Illegal lexeme "'+t+'" for mode "'+(k.cN||"")+'"');return M+=t,t.length||1}var y=w(e);if(!y)throw new Error('Unknown language: "'+e+'"');u(y);var N,k=i||y,x={},C="";for(N=k;N!==y;N=N.parent)N.cN&&(C=m(N.cN,"",!0)+C);var M="",B=0;try{for(var L,A,$=0;;){if(k.t.lastIndex=$,L=k.t.exec(r),!L)break;A=v(r.substring($,L.index),L[0]),$=L.index+A}for(v(r.substr($)),N=k;N.parent;N=N.parent)N.cN&&(C+=R);return{r:B,value:C,language:e,top:k}}catch(I){if(I.message&&-1!==I.message.indexOf("Illegal"))return{r:0,value:t(r)};throw I}}function b(e,r){r=r||S.languages||x(E);var a={r:0,value:t(e)},n=a;return r.filter(w).filter(N).forEach(function(t){var r=d(t,e,!1);r.language=t,r.r>n.r&&(n=r),r.r>a.r&&(n=a,a=r)}),n.language&&(a.second_best=n),a}function p(e){return S.tabReplace||S.useBR?e.replace(L,function(e,t){return S.useBR&&"\n"===e?"
":S.tabReplace?t.replace(/\t/g,S.tabReplace):""}):e}function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\bhljs\b/)||n.push("hljs"),-1===e.indexOf(a)&&n.push(a),n.join(" ").trim()}function f(e){var t,r,a,s,l,u=i(e);n(u)||(S.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e,l=t.textContent,a=u?d(u,l,!0):b(l),r=c(t),r.length&&(s=document.createElementNS("http://www.w3.org/1999/xhtml","div"),s.innerHTML=a.value,a.value=o(r,c(s),l)),a.value=p(a.value),e.innerHTML=a.value,e.className=m(e.className,u,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function g(e){S=s(S,e)}function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll("pre code");k.forEach.call(e,f)}}function h(){addEventListener("DOMContentLoaded",_,!1),addEventListener("load",_,!1)}function v(t,r){var a=E[t]=r(e);a.aliases&&a.aliases.forEach(function(e){C[e]=t})}function y(){return x(E)}function w(e){return e=(e||"").toLowerCase(),E[e]||E[C[e]]}function N(e){var t=w(e);return t&&!t.disableAutodetect}var k=[],x=Object.keys,E={},C={},M=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,L=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,R="
",S={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=d,e.highlightAuto=b,e.fixMarkup=p,e.highlightBlock=f,e.configure=g,e.initHighlighting=_,e.initHighlightingOnLoad=h,e.registerLanguage=v,e.listLanguages=y,e.getLanguage=w,e.autoDetection=N,e.inherit=s,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(t,r,a){var n=e.inherit({cN:"comment",b:t,e:r,c:[]},a||{});return n.c.push(e.PWM),n.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),n},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e.registerLanguage("apache",function(e){var t={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",t]},t,e.QSM]}}],i:/\S/}}),e.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,r,a,t]}}),e.registerLanguage("coffeescript",function(e){var t={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},r="[A-Za-z$_][0-9A-Za-z$_]*",a={cN:"subst",b:/#\{/,e:/}/,k:t},n=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,a]},{b:/"/,e:/"/,c:[e.BE,a]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[a,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+r},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];a.c=n;var i=e.inherit(e.TM,{b:r}),s="(\\(.*\\))?\\s*\\B[-=]>",c={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(n)}]};return{aliases:["coffee","cson","iced"],k:t,i:/\/\*/,c:n.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+r+"\\s*=\\s*"+s,e:"[-=]>",rB:!0,c:[i,c]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:s,e:"[-=]>",rB:!0,c:[c]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:r+":",e:":",rB:!0,rE:!0,r:0}])}}),e.registerLanguage("cpp",function(e){var t={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U|L)?"',e:'"',i:"\\n",c:[e.BE]},{b:'(u8?|U|L)?R"\\(',e:'\\)"'},{b:"'\\\\?.",e:"'",i:"."}]},a={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},n={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},e.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},e.CLCM,e.CBCM]},i=e.IR+"\\s*\\(",s={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},c=[t,e.CLCM,e.CBCM,a,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:s,i:"",k:s,c:["self",t]},{b:e.IR+"::",k:s},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:s,c:c.concat([{b:/\(/,e:/\)/,k:s,c:c.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+e.IR+"[\\*&\\s]+)+"+i,rB:!0,e:/[{;=]/,eE:!0,k:s,i:/[^\w\s\*&]/,c:[{b:i,rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:s,r:0,c:[e.CLCM,e.CBCM,r,a,t,{b:/\(/,e:/\)/,k:s,r:0,c:["self",e.CLCM,e.CBCM,r,a,t]}]},e.CLCM,e.CBCM,n]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},e.TM]}]),exports:{preprocessor:n,strings:r,k:s}}}),e.registerLanguage("cs",function(e){var t={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},a={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},n=e.inherit(a,{i:/\n/}),i={cN:"subst",b:"{",e:"}",k:t},s=e.inherit(i,{i:/\n/}),c={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,s]},o={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},i]},l=e.inherit(o,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},s]});i.c=[o,c,a,e.ASM,e.QSM,r,e.CBCM],s.c=[l,c,n,e.ASM,e.QSM,r,e.inherit(e.CBCM,{i:/\n/})];var u={v:[o,c,a,e.ASM,e.QSM]},d=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:t,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},u,r,{bK:"class interface",e:/[{;=]/,i:/[^\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+d+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/\s*[{;=]/,eE:!0,k:t,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,r:0,c:[u,r,e.CBCM]},e.CLCM,e.CBCM]}]}}),e.registerLanguage("css",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",r={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:t,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,r]}]}}),e.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}}),e.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}}),e.registerLanguage("ini",function(e){var t={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},t,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}}),e.registerLanguage("java",function(e){var t="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=t+"(<"+t+"(\\s*,\\s*"+t+")*>)?",a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",n="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",i={cN:"number",b:n,r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+r+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},i,{cN:"meta",b:"@[A-Za-z]+"}]}}),e.registerLanguage("javascript",function(e){var t="[A-Za-z$_][0-9A-Za-z$_]*",r={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:r,c:[]},i={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,i,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:r,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,i,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:t+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:t,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+t+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:t},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}),e.registerLanguage("json",function(e){var t={literal:"true false null"},r=[e.QSM,e.CNM],a={e:",",eW:!0,eE:!0,c:r,k:t},n={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(a,{b:/:/})],i:"\\S"},i={b:"\\[",e:"\\]",c:[e.inherit(a)],i:"\\S"};return r.splice(r.length,0,n,i),{c:r,k:t,i:"\\S"}}),e.registerLanguage("makefile",function(e){var t={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},e.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[r],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[r],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},r]}]}}),e.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}}),e.registerLanguage("nginx",function(e){var t={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},r={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,t],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[t]},{cN:"regexp",c:[e.BE,t],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},t]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:r}],r:0}],i:"[^\\s\\}]"}}),e.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},r={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},a=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:r,l:a,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:a,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}}),e.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},a={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],s=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),a,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=s,a.c=s,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s}}),e.registerLanguage("php",function(e){var t={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},r={cN:"meta",b:/<\?(php)?|\?>/},a={cN:"string",c:[e.BE,r],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["php","php3","php4","php5","php6","php7"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[r]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},r,{cN:"keyword",b:/\$this\b/},t,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",t,e.CBCM,a,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},a,n]}}),e.registerLanguage("properties",function(e){var t="[ \\t\\f]*",r="[ \\t\\f]+",a="("+t+"[:=]"+t+"|"+r+")",n="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",i="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={e:a,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[e.C("^\\s*[!#]","$"),{b:n+a,rB:!0,c:[{cN:"attr",b:n,endsParent:!0,r:0}],starts:s},{b:i+a,rB:!0,r:0,c:[{cN:"meta",b:i,endsParent:!0,r:0}],starts:s},{cN:"attr",r:0,b:i+t+"$"}]}}),e.registerLanguage("python",function(e){ -var t={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},r={cN:"meta",b:/^(>>>|\.\.\.) /},a={cN:"subst",b:/\{/,e:/\}/,k:t,i:/#/},n={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[e.BE,r],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,r,a]},{b:/(fr|rf|f)"""/,e:/"""/,c:[e.BE,r,a]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a]},{b:/(fr|rf|f)"/,e:/"/,c:[e.BE,a]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},s={cN:"params",b:/\(/,e:/\)/,c:["self",r,i,n]};return a.c=[n,i,r],{aliases:["py","gyp"],k:t,i:/(<\/|->|\?)|=>/,c:[r,i,n,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,s,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}),e.registerLanguage("ruby",function(e){var t="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},a={cN:"doctag",b:"@[A-Za-z]+"},n={b:"#<",e:">"},i=[e.C("#","$",{c:[a]}),e.C("^\\=begin","^\\=end",{c:[a],r:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:r},c={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},o={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},l=[c,n,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(i)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:t}),o].concat(i)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[c,{b:t}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[n,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(i),r:0}].concat(i);s.c=l,o.c=l;var u="[>?]>",d="[\\w#]+\\(\\w+\\):\\d+:\\d+>",b="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",p=[{b:/^\s*=>/,starts:{e:"$",c:l}},{cN:"meta",b:"^("+u+"|"+d+"|"+b+")",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:i.concat(p).concat(l)}}),e.registerLanguage("shell",function(e){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}}),e.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment with",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}}),e}); \ No newline at end of file diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/template-js.html --- a/doc/html/template-js.html Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ - - - - - - %{title} - - - - - - -
- - -
-

- %{title} -

- %{body} -
-
- - - - - diff -r dc6b42d7b97a -r 00a4720c4874 doc/html/template.html --- a/doc/html/template.html Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ - - - - - - %{title} - - - - - - -
-
-

- %{title} -

- %{body} -
-
- - - - - diff -r dc6b42d7b97a -r 00a4720c4874 doc/man/CMakeLists.txt --- a/doc/man/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -# -# CMakeLists.txt -- CMake build system for irccd -# -# Copyright (c) 2013-2019 David Demelier -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -project(man) - -# irccd(1) -irccd_define_man( - ${doc_SOURCE_DIR}/src/irccd.md - ${man_BINARY_DIR}/irccd.1 - ${man_SOURCE_DIR}/template-irccd.1 - "man1" -) - -# irccdctl(1) -irccd_define_man( - ${doc_SOURCE_DIR}/src/irccdctl.md - ${man_BINARY_DIR}/irccdctl.1 - ${man_SOURCE_DIR}/template-irccdctl.1 - "man1" -) - -# irccd.templates(7) -irccd_define_man( - ${doc_SOURCE_DIR}/src/templates.md - ${man_BINARY_DIR}/irccd.templates.7 - ${man_SOURCE_DIR}/template-irccd.templates.7 - "man7" -) - -# irccd.ipc(3) -irccd_define_man( - ${doc_SOURCE_DIR}/src/ipc.md - ${man_BINARY_DIR}/irccd.ipc.3 - ${man_SOURCE_DIR}/template-irccd.ipc.3 - "man3" -) - -add_custom_target( - docs-man - SOURCES - ${man_BINARY_DIR}/irccd.1 - ${man_BINARY_DIR}/irccd.ipc.3 - ${man_BINARY_DIR}/irccd.templates.7 - ${man_BINARY_DIR}/irccdctl.1 - ${man_SOURCE_DIR}/template-irccd.1 - ${man_SOURCE_DIR}/template-irccd.ipc.3 - ${man_SOURCE_DIR}/template-irccd.templates.7 - ${man_SOURCE_DIR}/template-irccdctl.1 -) - -add_dependencies(docs docs-man) diff -r dc6b42d7b97a -r 00a4720c4874 doc/man/template-irccd.1 --- a/doc/man/template-irccd.1 Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -.Dd #{IRCCD_MAN_DATE} -.Dt irccd 1 -.Os -.Sh NAME -.Nm irccd -.Nd extensible IRC bot -.Sh SYNOPSIS -.Nm -.Sh DESCRIPTION -#{body} -.Sh SEE ALSO -.Xr irccdctl 1 -.Sh HISTORY -.Nm -was written by David Demelier diff -r dc6b42d7b97a -r 00a4720c4874 doc/man/template-irccd.format.7 --- a/doc/man/template-irccd.format.7 Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -.Dd #{IRCCD_MAN_DATE} -.Dt irccd.format 7 -.Os -.Sh NAME -.Nm irccd.format -.Nd extensible templates -.Sh SYNOPSIS -.Nm -.Sh DESCRIPTION -#{body} -.Sh SEE ALSO -.Xr irccd 1 -.Sh HISTORY -.Nm -was written by David Demelier diff -r dc6b42d7b97a -r 00a4720c4874 doc/man/template-irccd.ipc.3 --- a/doc/man/template-irccd.ipc.3 Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -.Dd #{IRCCD_MAN_DATE} -.Dt irccd.ipc 3 -.Os -.Sh NAME -.Nm irccd.ipc -.Nd irccd IPC protocol -.Sh SYNOPSIS -.Nm -.Sh DESCRIPTION -#{body} -.Sh SEE ALSO -.Xr irccd 1 -.Sh HISTORY -.Nm -was written by David Demelier diff -r dc6b42d7b97a -r 00a4720c4874 doc/man/template-irccdctl.1 --- a/doc/man/template-irccdctl.1 Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -.Dd #{IRCCD_MAN_DATE} -.Dt irccd 1 -.Os -.Sh NAME -.Nm irccd -.Nd extensible IRC bot -.Sh SYNOPSIS -.Nm -.Sh DESCRIPTION -#{body} -.Sh SEE ALSO -.Xr irccdctl 1 -.Sh HISTORY -.Nm -was written by David Demelier diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/build.md --- a/doc/src/build.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -You should use the irccd version provided by your package manger if possible. If -irccd is not available, you can build it from sources. - -# Requirements - -To build from sources, you need the following installed on your system: - -- Compiler C++17 support, -- [Boost](http://boost.org), -- [CMake](http://www.cmake.org), -- [OpenSSL](https://www.openssl.org) (Optional) for connecting with SSL, -- [libedit](https://thrysoee.dk/editline) (Optional) for auto-completion, -- [doxygen](http://www.doxygen.org) (Optional) for C++ documentation. - -# Running the build - -When you're ready, extract the **irccd-x.y.z.tar.gz** where **x.y.z** is the -current version. Go to that directory, then type the following commands: - - $ mkdir _build_ - $ cd _build_ - $ cmake .. - $ make - $ sudo make install - -This is the quick way of compiling and installing. It's also possible to set -some options to customize the build. See below. - -# Customizing the build - -You can configure some features when compiling irccd. - -## Disabling JavaScript - -You can disable JavaScript support. - - $ cmake .. -DIRCCD_WITH_JS=Off - -## Disabling SSL - -You can disable OpenSSL support, it is automatically unset if OpenSSL is not -found. - -Warning: this is not recommended. - - $ cmake .. -DIRCCD_WITH_SSL=Off - -## Disabling libedit - -If for some reasons, you don't want auto-completion in `irccd-test`, you can -disable it. - - $ cmake .. -DIRCCD_WITH_LIBEDIT=Off - -## Disabling HTML documentation - -By default if Pandoc is available, the HTML documentation is built, you can -disable it. - - $ cmake .. -DIRCCD_WITH_HTML=Off - -## Disable doxygen documentation - -Doxygen documentation is built for C++ API. It is disabled if doxygen was not -found. - - $ cmake .. -DIRCCD_WITH_DOXYGEN=Off - -## Disabling man pages - -You can disable installation of manuals. - - $ cmake .. -DIRCCD_WITH_MAN=Off - -## Installation path - -Sometimes, you may need to install irccd over other place, for that, you can -specify the prefix where to install files. - -On Unix systems, it's usually **/usr/local** and **C:/Program Files/Irccd** on -Windows. - -To change this, use the following: - - $ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/some/directory - -You can also control the installation of individual directories through the -[GNUInstallDirs][] CMake module. - -Example: - - $ cmake .. -DCMAKE_INSTALL_DOCDIR=doc/irccd - -GNUInstallDirs: https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/format.md --- a/doc/src/format.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +0,0 @@ -Plugins can be configured using a powerful template syntax, this allows editing -the plugin messages to override them. - -The syntax is `?{}` where `?` is replaced by one of the token defined below. -Braces are mandatory and cannot be ommited. To write a literal template -construct, prepend the token twice. - -The following templates are available: - -- `%`, date and time (see Time section), -- `#{name}`, name will be substituted from the keywords (see Keywords section), -- `${name}`, name will be substituted from the environment variable (see - Environment variables), -- `@{attributes}`, the attributes will be substituted to IRC colors (see - Attributes). - -# Time - -When you can use patterns, the date and time may be used just like `strftime(3)` -so for the hours and minutes, you can use **%H:%M**. - -# Environment variables - -If supported, you can use environment variables like **${HOME}**. Please note -that braces are mandatory. - -# IRC attributes - -The attribute format is composed of three parts, foreground, background and -modifiers, each separated by a comma. - -note: attributes and colors are not supported by all IRC clients. - -warning: do not use colors and attributes outside IRC (e.g. for storing text in - files) because escape codes are only valid in IRC context. - -## Available colors - -- white, -- black, -- blue, -- green, -- red, -- brown, -- purple, -- orange, -- yellow, -- lightgreen, -- cyan, -- lightcyan, -- lightblue, -- pink, -- grey, -- lightgrey. - -## Available attributes - -- bold, -- italic, -- strike, -- reset, -- underline, -- underline2, -- reverse. - -# Shell attributes - -Like IRC attributes, it's possible to specify colors and attributes in some -places such as logger configuration. - -Warning: colors are not supported on all platforms. - -## Available colors - -- black, -- red, -- green, -- orange, -- blue, -- purple, -- cyan, -- white, -- default. - -## Available attributes - -- bold, -- dim, -- underline, -- blink, -- reverse, -- hidden. - -# Keywords - -Keywords are arbitrary names that are replaced depending on the context. They -are usually available to configure plugins. - -## Predefined keywords - -Here's the list of keywords that a lot of plugins uses: - -- #{channel}, the channel name, -- #{command}, the command to invoke the plugin, e.g. `!ask`, -- #{message}, a message (depending on context), -- #{origin}, the full user, e.g. `markand!~mkd@localhost`, -- #{nickname}, the short nickname, -- #{plugin}, the plugin name, -- #{server}, the current server name, -- #{topic}, the topic, -- #{target}, a target, e.g. a person who gets kicked. - -warning: these keywords can be overriden by plugins. - -# Examples - -Valid constructs: - -- `\#{target}, welcome`: if target is set to "irccd", becomes "irccd, welcome", -- `@{red}#{target}`: if target is specified, it is written in red. - -Invalid or literals constructs: - -- `\#{target}`: will output "#{target}", -- `##`: will output "##", -- `#target`: will output "#target", -- `#{target`: will throw an error. - -Colors & attributes: - -- `@{red,blue}`: will write text red on blue background, -- `@{default,yellow}`: will write default color text on yellow background, -- `@{white,black,bold,underline}`: will write white text on black in both bold - and underline. - -Using the logger plugin: - -For instance, using the **logger** plugin, it's possible to customize the -pattern to use when someone joins a channel like that: - - #{origin} joined #{channel} - -The keyword **#{origin}** will be substituted to the nickname and **#{channel}** -to the channel name. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/ipc.md --- a/doc/src/ipc.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,407 +0,0 @@ -This guide will help you controlling irccd via sockets. - -Currently, irccd supports internet and unix sockets, you need at least one -transport defined in your **irccd.conf**. - -# Syntax - -Irccd use JSON as protocol for sending and receiving data. A message must ends -with `\\r\\n\\r\\n` to be complete, thus it's possible to write JSON messages in -multiple lines. - -For example, this buffer will be parsed as two different messages. - -```json -{ - "param1": "value1" -} - -{ - "param1": "value1" -} - -``` - -warning: please note that the `\\r\\n\\r\\n` characters are the escape characters of - line feed and new line, not the concatenation of `\\` and `r`. - -## Responses - -All commands emit a response with the following properties: - -- command: (string) the result of the issued command, -- error: (int) the error error code, not defined on success. - -Example: - -Success message. - -```json -{ - "command": "server-message", -} -``` - -Command returned an error. - -```json -{ - "command": "server-message", - "status": "error", - "error": "4001" -} -``` - -# List of all commands - -The following commands are available. Please note that a lot of commands require -a server as the first argument, it’s one of defined in the **irccd.conf** file -in the server section. - -## server-connect - -Connect to a server. - -Properties: - -- command: (string) "server-connect", -- name: (string) the server unique id, -- hostname: (string) the host address, -- port: (int) the port number (Optional, default: 6667), -- ssl: (bool) use SSL (Optional, default: false), -- nickname: (string) the nickname to use (Optional, default: irccd), -- username: (string) the user name to use (Optional, default: irccd), -- realname: (string) the real name to use - (Optional, default: IRC Client Daemon), -- ctcpVersion: (string) the CTCP Version to answer - (Optional, default: the irccd's version), -- commandChar: (string) the command character to use to invoke commands - (Optional, default: !), -- reconnectTries: (int) the number of reconnection to try - (Optional, default: -1), -- reconnectTimeout: (int) the number of seconds to wait before retrying to - connect (Optional, default: 30). - -Example: - -```json -{ - "command": "server-connect", - "name": "myserver", - "host": "localhost", - "nickname": "edouard" -} -``` - -## server-disconnect - -Disconnect from a server. - -If server is not specified, irccd disconnects all servers. - -Properties: - -- command: (string) "server-disconnect", -- server: (string) the server unique id (Optional, default: none). - -Example: - -```json -{ - "command": "server-disconnect", - "server": "myserver" -} -``` - -## server-info - -Get server information. - -Properties: - -- command: (string) "server-info", -- server: (string) the server unique id. - -Example: - -```json -{ - "command": "server-info", - "server": "myserver" -} -``` - -## Responses - -- name: (string) the server unique id, -- hostname: (string) the server hostname, -- port: (int) the port, -- ipv4: (bool) true if using IPv6, -- ipv6: (bool) true if using IPv6, -- ssl: (bool) true if connection is using SSL, -- sslVerify: (bool) true if SSL was verified, -- channels: (string list) list of channels. -- nickname: (string) the current nickname in use, -- username: (string) the username in use, -- realname: (string) the realname in use. - -## server-invite - -Invite the specified target on the channel. - -Properties: - -- command: (string) "server-invite", -- server: (string) the server unique id, -- target: (string) the nickname to invite, -- channel: (string) the channel. - -Example: - -```json -{ - "command": "server-invite", - "server": "myserver", - "target": "edouard", - "channel": "#staff" -} -``` - -## server-join - -Join the specified channel, the password is optional. - -Properties: - -- command: (string) "server-join", -- server: (string) the server unique id, -- channel: (string) the channel to join, -- password: (string) the password (Optional, default: none). - -Example: - -```json -{ - "command": "server-join", - "server": "myserver", - "channel": "#games" -} -``` - -## server-kick - -Kick the specified target from the channel, the reason is optional. - -Properties: - -- command: (string) "server-kick", -- server: (string) the server unique id, -- target: (string) the target nickname, -- channel: (string) the channel, -- reason: (string) the reason (Optional, default: none). - -Example: - -```json -{ - "command": "server-kick", - "server": "myserver", - "target": "edouard", - "channel": "#staff", - "reason": "please be nice" -} -``` - -## server-list - -Get the list of all connected servers. - -Properties: - -- command: (string) "server-list". - -Example: - -```json -{ - "command": "server-list" -} -``` - -## Responses - -- The following properties: - - list: (string list) the list of all server unique ids. - -## server-me - -Send an action emote. - -Properties: - -- command: (string) "server-me", -- server: (string) the server unique id, -- target: (string) the target or channel, -- message: (string) the message. - -Example: - -```json -{ - "command": "server-me", - "server": "myserver", - "channel": "#staff", - "message": "like that" -} -``` - -## server-message - -Send a message to the specified target or channel. - -Properties: - -- command: (string) "server-message", -- server: (string) the server unique id, -- target: (string) the target or channel, -- message: (string) the message. - -Example: - -```json -{ - "command": "server-message", - "server": "myserver", - "target": "#staff", - "message": "this channel is nice" -} -``` - -## server-mode - -Set the irccd's user mode. - -Properties: - -- command: (string) "server-mode", -- server: (string) the server unique id, -- mode: (string) the mode. - -Example: - -```json -{ - "command": "server-mode", - "server": "myserver", - "mode": "mode" -} -``` - -## server-nick - -Change irccd's nickname. - -Properties: - -- command: (string) "server-nick", -- server: (string) the server unique id, -- nickname: (string) the new nickname. - -Example: - -```json -{ - "command": "server-nick", - "server": "myserver", - "nickname": "edouard" -} -``` - -## server-notice - -Send a private notice to the specified target. - -Properties: - -- command: (string) "server-notice", -- server: (string) the server unique id, -- target: (string) the target, -- message: (string) the notice message. - -Example: - -```json -{ - "command": "server-notice", - "server": "myserver", - "target": "edouard", - "message": "hello dude" -} -``` - -## server-part - -Leave the specified channel, the reason is optional. - -Not all IRC servers support giving a reason to leave a channel, do not specify -it if this is a concern. - -Properties: - -- command: (string) "server-part", -- server: (string) the unique server id, -- channel: (string) the channel to leave, -- reason: (string) the reason (Optional, default: none). - -Example: - -```json -{ - "command": "server-part", - "server": "myserver", - "channel": "#staff", - "reason": "the reason" -} -``` - -## server-reconnect - -Force reconnection of one or all servers. - -If server is not specified, all servers will try to reconnect. - -Properties: - -- command: (string) "server-reconnect", -- server: (string) the server unique id (Optional, default: none). - -Example: - -```json -{ - "command": "server-reconnect", - "server": "myserver" -} -``` - -## server-topic - -Change the topic of the specified channel. - -Properties: - -- command: (string) "server-topic", -- server: (string) the unique server id, -- channel: (string) the channel, -- topic: (string) the new topic. - -Example: - -```json -{ - "command": "server-topic", - "server": "myserver", - "channel": "#staff", - "topic": "the new topic" -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/irccd-test.md --- a/doc/src/irccd-test.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -The `irccd-test` program is a simple utility to test plugins on the command -line. - -It opens a prompt that waits for user input, each line consist of a specific -plugin event. These are mostly the same as the Javascript API offers. - -If compiled with [libedit][] library, the prompt offers basic completion for the -plugin events. - -When a event requires a server, a fake debugging server is created if it does -not exists already. That fake server simply prints every command on the command -line instead of sending them through IRC. - -# Synopsis - - $ irccd-test [options] plugin-identifier - $ irccd-test [options] /path/to/plugin - -# Options - -The following options are available: - -- -c, --config file: specify the configuration file. - -# Commands - -List of available commands: - -- onCommand server origin channel message -- onConnect server -- onInvite server origin channel target -- onJoin server origin channel -- onKick server origin channel reason -- onLoad -- onMe server origin channel message -- onMessage server origin channel message -- onMode server origin channel mode limit user mask -- onNames server channel nick1 nick2 nickN -- onNick server origin nickname -- onNotice server origin channel nickname -- onPart server origin channel reason -- onReload -- onTopic server origin channel topic -- onUnload -- onWhois server nick user host realname chan1 chan2 chanN - -# Example - -Example by testing the **ask** plugin. - - $ irccd-test ask - > onCommand local #test jean will I be rich? - local: connect - local: message jean #test, No - > onCommand local #test jean are you sure? - local: message jean #test, Yes - -As you can see in this example, the first onCommand generates two server -commands, the first connect attempt is being made because irccd-test creates a -new fake server on the fly as **local** was not existing yet. You can ignore -this. - -Then, the server sent a message on the **#test** channel and said **No**. The -second onCommand event did not generate a connect event because the local server -was already present. It said on the same server **No** though. - -[libedit]: http://thrysoee.dk/editline diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/irccd.conf.md --- a/doc/src/irccd.conf.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,377 +0,0 @@ -Both `irccd` and `irccdctl` use configuration file in a extended [INI][ini] -format. - -# General syntax - -The file syntax has following rules: - -1. Each option is stored in a section, -2. Some sections may be redefined multiple times, -3. Empty option must have quotes (e.g. `option = ""`). - -# The @include and @tryinclude statements - -Irccd adds an extension to this format by adding an `@include` keyword which -let you splitting your configuration file. - -note: this `@include` statement must be at the beginning of the file and must be - surrounded by quotes if the file name has spaces. - -You can use both relative or absolute paths. If relative paths are used, they -are relative to the current file being parsed. - -The alternative `@tryinclude` keyword is similar but does not fails if the -requested file is not found. - -## Example - -```ini -@include "rules.conf" -@include "servers.conf" - -[mysection] -myoption = "1" -``` - -# The list construct - -When requested, an option can have multiples values in a list. The syntax uses -parentheses and values are separated by commas. - -If the list have only one value, you can just use a simple string. - -## Examples - -```ini -[rule] -servers = ( "server1", "server2" ) -``` - -```ini -[rule] -servers = "only-one-server" -``` - -Note: spaces are completely optional. - -# Identifiers - -Some sections require an identifier (specified as id) as parameter. They must be -unique, not empty and can only contain characters, numbers, '-' and '_'. - -Example: - -- abc -- server-tz2 - -# The logs section - -This section can let you configure how irccd should log the messages. - -The available options: - -- verbose: (bool) be verbose (Optional, default: false), -- type: (string) which kind of logging, console, file or syslog - (Optional, default: console). - -The options for **file** type: - -- path-logs: (string) path to the normal messages, -- path-errors: (string) path to the error messages. - -note: syslog is not available on all platforms. - -## Example - -```ini -[logs] -type = file -verbose = true -path-logs = "/var/log/irccd/log.txt" -path-errors = "/var/log/irccd/errors.txt" -``` - -# The format section - -The format section let you change the irccd's output. It uses the templates -system. - -Only one keyword is defined, `message` which contains the message that irccd -wants to output. - -note: colors and attributes are not supported on Windows. - -The available options: - -- debug: (string) template to use to format debug messages - (Optional, default: none), -- info: (string) template to use to format information messages - (Optional, default: none), -- warning: (string) template to use to format warnings - (Optional, default: none). - -## Example - -```ini -[format] -debug = "%H:%M debug: #{message}" -info = "%H:%M info: #{message}" -warning = "%H:%M warning: #{message}" -``` - -# The server section - -This section is used to connect to one or more server. - -The available options: - -- name: (id) the unique id, -- hostname: (string) the server address, -- port: (int) the server port (Optional, default: 6667), -- password: (string) an optional password - (Optional, default: none), -- join-invite: (bool) join channels upon invitation - (Optional, default: false), -- channels: (list) list of channels to auto join - (Optional, default: empty), -- command-char: (string) the prefix for invoking special commands - (Optional, default: !), -- ssl: (bool) enable or disable SSL (Optional, default: false), - (Optional, default: true), -- auto-reconnect: (bool) enable reconnection after failure - (Optional, default: true), -- auto-reconnect-delay: (int) number of seconds to wait before retrying - (Optional, default: 30), -- ping-timeout (int) number of seconds before ping timeout - (Optional, default: 300). -- nickname: (string) the nickname - (Optional, default: system username if available or irccd), -- realname: (string) the realname - (Optional, default: IRC Client Daemon), -- username: (string) the username name - (Optional, default: system username if available or irccd), -- ctcp-version: (string) what version to respond to CTCP VERSION - (Optional, default: IRC Client Daemon). - -note: if a channel requires a password, add it after a colon - (e.g. "#channel:password"). - -## Example - -```ini -[server] -name = "local" -hostname = "localhost" -port = 6667 -channels = ( "#staff", "#club:secret" ) -``` - -# The paths section - -The paths section defines common paths used as defaults for all plugins. - -Any option in this section can be defined altough the following are used as -common convention used in all plugins: - -- cache: (string) path for data files written by the plugin, -- data: (string) path for data files provided by the user, -- config: (string) path for additional configuration from the user. - -For each of these paths, **plugin/name** is appended with the appropriate -plugin name when loaded. - -The section is redefinable per plugin basis using the `[paths.]` syntax. - -## Example - -```ini -# -# Common for all plugins. -# -# Example with ask plugin: -# -# cache -> /var/cache/irccd/plugin/ask -# config -> /usr/local/etc/irccd/plugin/ask -# data -> /var/data/irccd/plugin/ask -# -[paths] -cache = "/var/cache/irccd" -config = "/usr/local/etc/irccd" -data = "/var/data/irccd" - -# -# Explicit override for plugin hangman. -# -[paths.hangman] -config = "/etc/hangman" -``` - -# The plugins section - -This section is used to load plugins. - -Just add any key you like to load a plugin. If the value is not specified, the -plugin is searched through the standard directories, otherwise, provide the full -path (including the .js extension). - -warning: remember to add an empty string for searching plugins. - -## Example - -```ini -[plugins] -history = "" -myplugin = /tmp/myplugin.js -``` - -The `history` plugin will be searched while `myplugin` will be load from -**/tmp/myplugin.js**. - -# The transport section - -This section defines transports, you may use sockets to do a basic IPC system -within irccd. - -With transports, you can may ask `irccd` to send a message, a notice or even -kicking someone from a channel. Irccd will also notify all clients connected to -this transport on IRC events. - -There are two type of listeners availables: - -1. Internet sockets, IPv4 and IPv6, -2. Unix sockets, based on files (not available on Windows). - -If SSL support was built in, both internet and unix sockets can be set to use -encrypted connections. - -The available options: - -- type: (string) type of listener "ip" or "unix". -- password: (string) an authentication password (Optional, default: none). -- ssl: (bool) enable SSL (Optional, default: false), -- key: (string) path to private key file (Required if ssl is true) -- certificate: (string) path to certificate (Required if ssl is true) - -The options for **ip** type: - -- port: (int) port number, -- address: (string) address to bind or "\*" for any - (Optional, default: \*), -- ipv4: (bool) bind on IPv4 (Optional, default true), -- ipv6: (bool) bind on IPv6 (Optional, default true), - -The options for **unix** type: - -- path: (string) the file path to the socket. - -## Example of internet transports - -```ini -[transport] -type = "ip" -address = "*" -port = 9999 -``` - -This will let you controlling irccd on port 9999 with both IPv4 and IPv6 -families. - -warning: consider using internet sockets with care, especially if you are - running your bot on a server with multiple users. If your bot has - operator rights and you bind on any address, almost every users - can do a kick or a ban. - -## Example of unix transports - -```ini -[transport] -type = "unix" -path = "/tmp/irccd.sock" -``` - -This will let you controlling irccd on path **/tmp/irccd.sock**, the file is -automatically deleted when irccd starts, but not when it stops. - -# The rule section - -The rule section is one of the most powerful within irccd configuration. It let -you enable or disable plugins and IRC events for specific criterias. For -instance, you may want to disable a plugin only for a specific channel on a -specific server. And because rules are evaluated in the order they are defined, -you can override rules. - -The available options: - -- servers, (list) a list of servers that will match the rule - (Optional, default: empty), -- channels, (list) a list of channel (Optional, default: empty), -- origins, (list) a list of nicknames to check (Optional, default: empty), -- plugins, (list) which plugins (Optional, default: empty), -- events, (list) which events (e.g onCommand, onMessage, ...) - (Optional, default: empty), -- action, (string) set to **accept** or **drop**. - -warning: don't make sensitive rules on **origins** option, irccd does not have - any kind of nickname authentication. Thus, it may be very easy for - someone to use a temporary nickname. - -## Basic rules example - -This first rule disable the plugin reboot on **all** servers and channels. - -```ini -[rule] -plugins = "reboot" -action = drop -``` - -This rule enable the reboot plugin again on the server **localhost**, -channel **#staff**. - -```ini -[rule] -servers = "localhost" -channels = "#staff" -plugins = "reboot" -action = accept -``` - -# Full example of configuration file - -```ini -# Add a transport that bind only to IPv6. -[transport] -type = ip -ipv4 = false -ipv6 = true -family = ipv6 -port = 12000 - -# A transport that binds to both IPv4 and IPv6. -[transport] -type = ip -port = 15000 - -# A server. -[server] -name = "foo" -host = "irc.foo.org" -port = "6667" -nickname = "superbot" -realname = "SuperBot v1.0" -username = "sp" - -# An other server. -[server] -name = "wanadoo" -host = "chat.wanadoo.fr" -port = "6667" - -# Load some plugins. -[plugins] -ask = "" # Search ask -myplugin = /path/to/myplugin.js # Use absolute path -``` - -[ini]: https://en.wikipedia.org/wiki/INI_file - diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/irccd.md --- a/doc/src/irccd.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -The `irccd` program is an IRC bot which connects to one or more severs and -dispatches events to plugins. - -# Synopsis - - $ irccd [options...] - -# Options - -The following options are available: - -- -c, --config file: specify the configuration file, -- -v, --verbose: be verbose, -- --version: show the version. - -# Paths - -Irccd uses different types of paths depending on the context. - -- Configuration -- Plugins - -Paths prefixed by (W) means they are only used on Windows, others prefixed by -(U) means they are used on Unix systems - -# Configuration - -The following directories are searched in the specified order for configuration -files. For example, the files `irccd.conf` and `irccdctl.conf` will be searched -there. - -- \(W) %APPDATA%/irccd/config -- \(U) ${XDG\_CONFIG\_HOME}/irccd -- \(U) ${HOME}/.config/irccd (if XDG\_CONFIG\_HOME is not set) -- CMAKE\_INSTALL\_SYSCONFDIR/irccd - -Examples: - -- /home/john/.config/irccd/irccd.conf -- /usr/local/etc/irccd.conf -- C:/Program Files/irccd/etc/irccd/irccd.conf -- C:/Users/john/AppData/irccd/config - -# Plugins - -These directories are searched in the following order to load plugins when they -are not specified by full paths. - -- current working directory -- \(W) %APPDATA%/irccd/share/plugins -- \(U) ${XDG\_DATA\_HOME}/irccd/plugins -- \(U) ${HOME}/.local/share/irccd/plugins (if XDG\_DATA\_HOME is not set) -- CMAKE\_INSTALL\_LIBDIR/irccd (both native and Javascript) - -Examples: - -- /home/john/.local/share/irccd/plugins/ask.js -- /usr/local/lib/irccd/plugins/ask.js -- C:/Users/john/AppData/irccd/share/plugins/ask.js -- C:/Program Files/irccd/lib/irccd/plugins/ask.js diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/irccdctl.conf.md --- a/doc/src/irccdctl.conf.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -The `irccdctl` utility use the same configuration file syntax and paths, see the -manual of irccd.conf file for more information. - -# The general section - -This section defines the global irccdctl parameters. - -The available options: - -- verbose: (bool) enable verbose message (Optional, default: false). - -## Example - -```ini -[general] -verbose = true -``` - -# The connect section - -The section socket permit irccdctl to connect to a specific irccd transport, -only one must be defined. Just like transports you can connect to Unix or -internet sockets. - -The available options: - -- type: (string) connection type: "ip" or "unix". -- password: (string) an authentication password (Optional, default: none). - -The options for **ip** type: - -- hostname: (string) host to connect, -- port: (int) port number, -- ipv4: (bool) try to connect with ipv4 (Optional: default true), -- ipv6: (bool) try to connect with ipv6 (Optional: default true). - -The options for **unix** type: - -- path: (string) The file path to the socket. - -## Example for internet transports - -```ini -[connect] -type = "internet" -host = "localhost" -port = "9999" -``` - -## Example for unix transports - -```ini -[connect] -type = "unix" -path = "/tmp/irccd.sock" -``` - -# The alias section - -The alias section can be used to define custom user commands. - -To define an alias, just add a new section named `[alias.name]` where name is -your desired alias name. - -Then, add any option you like to execute commands you want. The option name is -ignored and serves as auto-documentation only. - -Example: - -```ini -[alias.present] -say-hello = ( "server-message", "localhost", "#staff", "hello world!" ) -warning = ( "server-me", "localhost", "#staff", "is a bot") -``` - -This example defines an alias `present` that will: - -1. Send a message on the channel #staff in the server localhost -2. Send an action emote on the same channel - -To use this alias, call `irccdctl present`. - -## Placeholders - -Sometimes, you want to pass parameters to your alias. The placeholder syntax -allows you to define where your command line arguments will be replaced before -being sent to irccd. - -The syntax uses `%n` where **n** is an integer starting from 0. - -As you have seen in the `present` alias example above, the channel and server -are hardcoded so the user is not able to use this alias for different channels. -Let's update this alias with placeholders to make it more generic. - -Example: - -```ini -[alias.present] -say-hello = ( "server-message", "%0", "%1", "hello world!" ) -warning = ( "server-me", "%0", "%1", "is a bot") -``` - -Now, the `present` alias will except two arguments from the command line when -the user invokes `irccdctl present`. Thus if you want to use this alias on the -**#staff@localhost**, you call the alias using -`irccdctl present localhost #staff` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/irccdctl.md --- a/doc/src/irccdctl.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,399 +0,0 @@ -The `irccdctl` utility let you control a running `irccd` instance. - -# Syntax - -The general syntax for running an irccdctl command is: - - irccdctl commandname arg1 arg2 arg3 ... argn - -# Commands - -## plugin-config - -Get or set a plugin configuration variable. - -If both variable and value are provided, sets the plugin configuration to the -respective variable name and value. - -If only variable is specified, shows its current value. Otherwise, list all -variables and their values. - -Usage: - - $ irccdctl plugin-config plugin [variable] [value] - -Example: - - $ irccdctl plugin-config ask - -## plugin-info - -Get plugin information. - -Usage: - - $ irccdctl plugin-info name - -Example: - - $ irccdctl plugin-info ask - -## plugin-list - -Get the list of all loaded plugins. - -Usage: - - $ irccdctl plugin-list - -## plugin-load - -Load a plugin into the irccd instance. - -Usage: - - $ irccdctl plugin-load plugin - -Example: - -$ irccdctl load ask - -## plugin-reload - -Reload a plugin by calling the appropriate onReload event, the plugin is not -unloaded and must be already loaded. - -Usage: - - $ irccdctl plugin-reload name - -Example: - - $ irccdctl plugin-reload logger - -## plugin-unload - -Unload a loaded plugin from the irccd instance. - -Usage: - - $ irccdctl plugin-unload name - -Example: - - $ irccdctl plugin-unload logger - -## rule-add - -Add a new rule to irccd. - -If no index is specified, the rule is added to the end. - -Usage: - - $ irccdctl rule-add [options] accept|drop - -Available options: - -- -c, --add-channel channel: match a channel -- -e, --add-event event: match an event -- -i, --index index: rule position -- -p, --add-plugin plugin: match a plugin -- -s, --add-server server: match a server - -Example: - - $ irccdctl rule-add -p hangman drop - $ irccdctl rule-add -s localhost -c #games -p hangman accept - -## rule-edit - -Edit an existing rule in irccd. - -All options can be specified multiple times. - -Available options: - -- -a, --action action: set action (drop or accept) -- -c, --add-channel channel: match a channel -- -C, --remove-channel channel: remove a channel -- -e, --add-event event: match an event -- -E, --remove-event event: remove an event -- -p, --add-plugin plugin: match a plugin -- -P, --remove-plugin plugin: remove a plugin -- -s, --add-server server: match a server -- -S, --remove-server server: remove a server - -Usage: - - usage: irccdctl rule-edit [options] index - -Example: - - $ irccdctl rule-edit -p hangman 0 - $ irccdctl rule-edit -S localhost -c #games -p hangman 1 - -## rule-info - -Show a rule. - -Usage: - - $ irccdctl rule-info index - -Example: - - $ irccdctl rule-info 0 - $ irccdctl rule-info 1 - -## rule-list - -List all rules. - -Usage: - - $ irccdctl rule-list - -## rule-move - -Move a rule from the given source at the specified destination index. - -The rule will replace the existing one at the given destination moving -down every other rules. If destination is greater or equal the number of rules, -the rule is moved to the end. - -Usage: - - irccdctl rule-move source destination - -Example: - - irccdctl rule-move 0 5 - irccdctl rule-move 4 3 - -## rule-remove - -Remove an existing rule. - -Usage: - - $ irccdctl rule-remove index - -Example: - - $ irccdctl rule-remove 0 - $ irccdctl rule-remove 1 - -## server-connect - -Connect to a new IRC server. - -Usage: - - $ irccdctl server-connect [options] name host port - -Available options: - -- -c, --command character: specify the command char -- -n, --nickname name: specify a nickname -- -r, --realname name: specify a real name -- -S, --ssl-verify: verify SSL -- -s, --ssl: connect using SSL -- -u, --username name: specify a user name - -Example: - - $ irccdctl server-connect -n jean example irc.example.org - $ irccdctl server-connect --ssl example irc.example.org 6697 - -## server-disconnect - -Disconnect from a server. - -If server is not specified, irccd disconnects all servers. - -Usage: - - $ irccdctl server-disconnect [server] - -Example: - - $ irccdctl server-disconnect - $ irccdctl server-disconnect localhost - -## server-invite - -Invite the specified target on the channel. - -Usage: - - $ irccdctl server-invite server nickname channel - -Example: - - $ irccdctl server-invite freenode xorg62 #staff - -## server-join - -Join the specified channel, the password is optional. - -Usage: - - $ irccdctl server-join server channel [password] - -Example: - - $ irccdctl server-join freenode #test - $ irccdctl server-join freenode #private-club secret - -## server-kick - -Kick the specified target from the channel, the reason is optional. - -Usage: - - $ irccdctl server-kick server target channel [reason] - -Example: - - $ irccdctl kick freenode jean #staff "Stop flooding" - -## server-list - -Get the list of all connected servers. - -Usage: - - $ irccdctl server-list - -## server-me - -Send an action emote. - -Usage: - - $ irccdctl server-me server target message - -Example: - - $ irccdctl server-me freenode #staff "going back soon" - -## server-message - -Send a message to the specified target or channel. - -Usage: - - $ irccdctl server-message server target message - -Example: - - $ irccdctl server-message freenode #staff "Hello from irccd" - -## server-mode - -Set channel or irccd's user mode. - -Usage: - - $ server-mode server channel mode [limit] [user] [mask] - -Example: - - $ irccdctl server-mode local irccd +i # set user mode to +i - $ irccdctl server-mode local #staff +o jean # enable operator for jean - -## server-nick - -Change irccd's nickname. - -Usage: - - $ irccdctl server-nick server nickname - -Example: - - $ irccdctl server-nick freenode david - -## server-notice - -Send a private notice to the specified target. - -Usage: - - $ irccdctl server-notice server target message - -Example: - - $ irccdctl server-notice freenode jean "I know you are here." - -## server-part - -Leave the specified channel, the reason is optional. - -Warning: not all IRC servers support giving a reason to leave a channel, do - not specify it if this is a concern. - -Usage: - - $ irccdctl server-part server channel [reason] - -Example: - - $ irccdctl server-part freenode #staff - $ irccdctl server-part freenode #botwar "too noisy" - -## server-reconnect - -Force reconnection of one or all servers. - -If server is not specified, all servers will try to reconnect. - -Usage: - - $ irccdctl server-reconnect [server] - -Example: - - $ irccdctl server-reconnect - $ irccdctl server-reconnect wanadoo - -## server-topic - -Change the topic of the specified channel. - -Usage: - - $ irccdctl server-topic server channel topic - -Example: - - $ irccdctl server-topic freenode #wmfs "This is the best channel" - -## watch - -Start watching irccd events. - -You can use different output formats, native is human readable format, json is -pretty formatted json. - -Usage: - - $ irccdctl watch [-f|--format native|json] - -Example: - - $ irccdctl watch - $ irccdctl watch -f json - -# Notes - -Some shells may discard arguments if they begins with a hash. For instance, -`bash` will not understand the following command: - - $ irccdctl server-join localhost #staff - -Instead, enclose the arguments with quotes - - $ irccdctl server-join localhost "#staff" - diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onCommand.md --- a/doc/src/js/event/onCommand.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# Event onCommand - -Special commands are not real IRC events. They are called from channel messages -with a specific syntax using a delimiter and the plugin name. - -For instance, with default irccd parameters, saying on a channel `!ask foo` will -call the special command of the plugin named **ask**. - -# Synopsis - -```javascript -function onCommand(server, origin, channel, message) -``` - -# Arguments - -- server: the current server, -- origin: who invoked the command, -- channel: the channel where the message comes from, -- message: the real message, without the ! part. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onConnect.md --- a/doc/src/js/event/onConnect.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Event onConnect - -This callback is called when the irccd instance successfully connect to a -server. - -# Synopsis - -```javascript -function onConnect(server) -``` - -# Arguments - -- server: the current server. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onDisconnect.md --- a/doc/src/js/event/onDisconnect.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Event onDisconnect - -This callback is called when a server has been disconnected by any way. - -# Synopsis - -```javascript -function onDisonnect(server) -``` - -# Arguments - -- server: the current server. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onInvite.md --- a/doc/src/js/event/onInvite.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event onInvite - -This event is called when someone is inviting you to a channel. - -# Synopsis - -```javascript -function onInvite(server, origin, channel) -``` - -# Arguments - -- server: the current server, -- origin: who invited you, -- channel: on which channel you are invited to. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onJoin.md --- a/doc/src/js/event/onJoin.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event: onJoin - -User join events, this function is called when someone joins a channel. - -# Synopsis - -```javascript -function onJoin(server, origin, channel) -``` - -# Arguments - -- server: the current server, -- origin: the person who joined the channel, -- channel: the channel the user has joined. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onKick.md --- a/doc/src/js/event/onKick.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Event onKick - -This event is triggered when someone has been kicked from a channel. - -# Synopsis - -```javascript -function onKick(server, origin, channel, target, reason) -``` - -# Arguments - -- server: the current server, -- origin: who kicked the person, -- channel: the channel, -- target: the kicked person, -- reason: an optional reason. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onLoad.md --- a/doc/src/js/event/onLoad.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -# Event onLoad - -This function is called when irccd instance load a plugin. If this function -throws an error, the script is not loaded. - -# Synopsis - -```javascript -function onLoad() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onMe.md --- a/doc/src/js/event/onMe.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# Event onMe - -Action emote. - -# Synopsis - -```javascript -function onMe(server, origin, channel, message) -``` - -# Arguments - -- server: the current server, -- origin: the person who said something, -- channel: the channel, -- message: the message sent. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onMessage.md --- a/doc/src/js/event/onMessage.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# Event onMessage - -This event is triggered when someone said something on a specific channel. - -# Synopsis - -```javascript -function onMessage(server, origin, channel, message) -``` - -# Arguments - -- server: the current server, -- origin: the person who said something, -- channel: the channel, -- message: the message sent. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onMode.md --- a/doc/src/js/event/onMode.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event onMode - -This event is triggered when the server changed a channel mode or your mode. - -# Synopsis - -```javascript -function onMode(server, origin, channel, mode, limit, user, mask) -``` - -# Arguments - -- server: the current server, -- origin: the person who changed the mode, -- mode: the new mode. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onNames.md --- a/doc/src/js/event/onNames.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event onNames - -This event is triggered when a list of names has come. - -# Synopsis - -```javascript -function onNames(server, channel, list) -``` - -# Arguments - -- server: he current server, -- channel: which channel, -- list: a sequence with all users. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onNick.md --- a/doc/src/js/event/onNick.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event onNick - -This event is triggered when someone changed its nickname. - -# Synopsis - -```javascript -function onNick(server, origin, nickname) -``` - -# Arguments - -- server: the current server, -- origin: the old nickname, -- nickname: the new nickname. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onNotice.md --- a/doc/src/js/event/onNotice.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Event onNotice - -This event is triggered when someone sent a notice to you. - -# Synopsis - -```javascript -function onNotice(server, origin, notice) -``` - -# Arguments - -- server: the current server, -- origin: the one who sent the notice, -- message: the notice message. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onPart.md --- a/doc/src/js/event/onPart.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# Event onPart - -This event is triggered when someone has left a specific channel. - -# Synopsis - -```javascript -function onPart(server, origin, channel, reason) -``` - -# Arguments - -- server: the current server, -- origin: the person who left the channel, -- channel: the channel, -- reason: an optional reason. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onReload.md --- a/doc/src/js/event/onReload.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Event onReload - -Request to reload the plugin. - -# Synopsis - -```javascript -function onReload() -``` - -This function is called when irccd instance reload a plugin. Thus, there are no -IRC events that call this function. - -This function does nothing in the irccd internals, it just calls a function that -you can use to reload some data. It does not delete anything. - -If you want to fully unload a plugin, use `irccdctl plugin-unload` then -`irccdctl plugin-load`. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onTopic.md --- a/doc/src/js/event/onTopic.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# Event onTopic - -This event is triggered when someone changed the channel's topic. - -# Synopsis - -```javascript -function onTopic(server, origin, channel, topic) -``` - -# Arguments - -- server: the current server, -- origin: the person who changed the topic, -- channel: the channel, -- topic: the new topic (may be empty). diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onUnload.md --- a/doc/src/js/event/onUnload.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Event onUnload - -This event is triggered when the plugin is about to be unloaded. - -# Synopsis - -```javascript -function onUnload() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/event/onWhois.md --- a/doc/src/js/event/onWhois.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# Event onWhois - -This event is triggered when irccd gets information about a user. - -# Synopsis - -```javascript -function onWhois(server, info) -``` - -# Arguments - -- server: the current server, -- info: the whois information. - -The info is an object with the following properties: - -- nickname: the user nickname, -- user: the user name, -- host: the hostname, -- realname: the real name used, -- channels: an optional list of channels joined. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/index.md --- a/doc/src/js/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -# Welcome to the irccd JavaScript API documentation - -Select a target on the left. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.find.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.find.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -# Function Irccd.Directory.find - -Find an entry by a pattern or a regular expression. - -# Synopsis - -```javascript -Irccd.Directory.find(path, pattern, recursive) -``` - -# Arguments - -- path: the base path, -- pattern: the regular expression or file name, -- recursive: set to true to search recursively (Optional, default: false). - -# Returns - -The path to the file or undefined if not found. - -# Throws - -Any exception on error. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.mkdir.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.mkdir.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# Function Irccd.Directory.mkdir - -Create a directory specified by path. It will create needed subdirectories just -like you have invoked `mkdir -p`. - -# Synopsis - -```javascript -Irccd.Directory.mkdir(path, mode = 0700) -``` - -# Arguments - -- path: the path to the directory, -- mode: the mode, not available on all platforms. - -# Throws - -Any exception on error. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.constructor.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.constructor.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -# Function Irccd.Directory (constructor) - -Open a directory. - -When constructed successfully, the object has the following properties: - -- path: (string) the path to the directory, -- entries: (array) an array for each entry containing: - - name: (string) the base file name, - - type: (int) the type of file (`Irccd.Directory.Type*`). - -# Synopsis - -```javascript -Irccd.Directory(path, flags) -``` - -# Arguments - -- **path**: the path to the directory, -- **flags**: the OR'ed flags: `Irccd.Directory.Dot`, `Irccd.Directory.DotDot` - (Optional, default: none). - -# Throws - -Any exception on error. - -# Example - -```javascript -try { - var d = new Irccd.Directory("/usr/share/games"); - - for (var i = 0; i < d.count; ++i) - if (d.entries[i].type == Irccd.Directory.TypeFile) - // use d.entries[i].name which is a file. -} catch (e) { - // Use the error -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.find.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.find.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -# Method Irccd.Directory.prototype.find - -Synonym of [find][] but the path is taken from the directory object. - -# Synopsis - -```javascript -Directory.prototype.find(pattern, recursive) -``` - -# Arguments - -- pattern: the regular expression or file name, -- recursive: set to true to search recursively (Optional, default: false). - -# Returns - -The path to the file or undefined if not found. - -# Throws - -Any exception on error. - -[find]: #{baseurl}api/module/Irccd.Directory/function/find.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.remove.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.prototype.remove.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# Method Irccd.Directory.prototype.remove - -Synonym of [remove][] but the path is taken from the directory object. - -# Synopsis - -```javascript -Directory.prototype.remove(recursive) -``` - -# Arguments - -- recursive: recursively or not (Optional, default: false). - -# Throws - -Any exception on error. - -[remove]: #{baseurl}api/module/Irccd.Directory/function/remove.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/Irccd.Directory.remove.md --- a/doc/src/js/module/Irccd.Directory/Irccd.Directory.remove.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Directory.remove - -Remove the directory optionally recursively. - -# Synopsis - -```javascript -Irccd.Directory.remove(path, recursive) -``` - -# Arguments - -- path: the path to the directory, -- recursive: recursively or not (Optional, default: false). - -# Throws - -Any exception on error. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Directory/index.md --- a/doc/src/js/module/Irccd.Directory/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -# Module Irccd.Directory - -This module can be used to iterate, find, remove or create directories. - -Use this module with care. - -# Constants - -The following properties are defined: - -- Dot: (int) list "." directory, -- DotDot: (int) list ".." directory, -- TypeUnknown: (int) unknown type file, -- TypeDir: (int) entry is a directory, -- TypeFile: (int) entry is a file, -- TypeLink: (int) entry is a link. - -# Functions - -- [find](Irccd.Directory.find.html) -- [mkdir](Irccd.Directory.mkdir.html) -- [remove](Irccd.Directory.remove.html) - -# Methods - -- [(constructor)](Irccd.Directory.prototype.constructor.html) -- [find](Irccd.Directory.prototype.find.html) -- [remove](Irccd.Directory.prototype.remove.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.constructor.md --- a/doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.constructor.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -# Function Irccd.ElapsedTimer (constructor) - -Construct a new ElapsedTimer object. - -The timer is constructed and started. - -# Synopsis - -```javascript -Irccd.ElapsedTimer() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.elapsed.md --- a/doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.elapsed.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Method Irccd.ElapsedTimer.prototype.elapsed - -Get the number of elapsed milliseconds. - -# Synopsis - -```javascript -ElapsedTimer.prototype.elapsed() -``` - -# Returns - -The elapsed time in milliseconds. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.pause.md --- a/doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.pause.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.ElapsedTimer.prototype.pause - -Pause the timer, without resetting the current elapsed time stored. - -# Synopsis - -```javascript -ElapsedTimer.prototype.pause() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.reset.md --- a/doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.reset.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.ElapsedTimer.prototype.reset - -Reset the elapsed time to 0, the status is not modified. - -# Synopsis - -```javascript -ElapsedTimer.prototype.reset() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.restart.md --- a/doc/src/js/module/Irccd.ElapsedTimer/Irccd.ElapsedTimer.prototype.restart.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.ElapsedTimer.prototype.restart - -Restart the timer without resetting the current elapsed time. - -# Synopsis - -```javascript -ElapsedTimer.prototype.restart() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.ElapsedTimer/index.md --- a/doc/src/js/module/Irccd.ElapsedTimer/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -# Module Irccd.ElapsedTimer - -This class let you measure the elapsed time. - -# Methods - -- [(constructor)](Irccd.ElapsedTimer.prototype.constructor.html) -- [elapsed](Irccd.ElapsedTimer.prototype.elapsed.html) -- [pause](Irccd.ElapsedTimer.prototype.pause.html) -- [reset](Irccd.ElapsedTimer.prototype.reset.html) -- [restart](Irccd.ElapsedTimer.prototype.restart.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.basename.md --- a/doc/src/js/module/Irccd.File/Irccd.File.basename.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.File.basename - -Return the file basename as specified in `basename(3)` C function. - -# Synopsis - -```javascript -base = Irccd.File.basename(path) -``` - -# Arguments - -- path: the path to the file. - -# Returns - -The base name. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.dirname.md --- a/doc/src/js/module/Irccd.File/Irccd.File.dirname.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.File.dirname - -Return the file directory name as specified in `dirname(3)` C function. - -# Synopsis - -```javascript -path = Irccd.File.dirname(path) -``` - -# Arguments - -- path: the path to the file. - -# Returns - -The directory name. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.exists.md --- a/doc/src/js/module/Irccd.File/Irccd.File.exists.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -# Function Irccd.File.exists - -Check if the file exists. - -# Synopsis - -```javascript -ret = Irccd.File.exists(path) -``` - -# Arguments - -- path: the path to the file. - -# Returns - -True if exists. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.basename.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.basename.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Method Irccd.File.prototype.basename - -Synonym of [basename][] but with the path from the file. - -# Synopsis - -```javascript -File.prototype.basename() -``` - -# Returns - -The base name. - -[basename]: #{baseurl}api/module/Irccd.File/function/basename.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.close.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.close.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.File.prototype.close - -Force close of the file, automatically called when object is collected. - -# Synopsis - -```javascript -File.prototype.close() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.constructor.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.constructor.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -# Function Irccd.File (constructor) - -Open a file specified by path with the specified mode. - -# Synopsis - -```javascript -Irccd.File(path, mode) -``` - -# Arguments - -- path: the path to the file, -- mode: the mode string. - -The mode is the same as the `fopen(3)`, see the documentation of -[std::fopen(3)][fopen] for more information about the mode string. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. - -[fopen]: http://en.cppreference.com/w/cpp/io/c/fopen diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.dirname.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.dirname.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Method Irccd.File.prototype.dirname - -Synonym of [dirname][] but with the path from the file. - -# Synopsis - -```javascript -File.prototype.dirname() -``` - -# Returns - -The directory name. - -[dirname]: #{baseurl}api/module/Irccd.File/function/dirname.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.lines.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.lines.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Method Irccd.File.prototype.lines - -Read all lines and return an array. - -# Synopsis - -```javascript -File.prototype.lines() -``` - -# Returns - -An array with all lines. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.read.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.read.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -# Method Irccd.File.prototype.read - -Read the specified amount of characters or the whole file. - -# Synopsis - -```javascript -File.prototype.read(amount) -``` - -# Arguments - -- amount: the amount of characters or -1 to read all (Optional, default: -1). - -# Returns - -The string. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.readline.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.readline.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# Method Irccd.File.prototype.readline - -Read the next line available. - -Warning: this method is slow and its usage is discouraged on large files. - -# Synopsis - -```javascript -File.prototype.readline() -``` - -# Returns - -The next line or undefined if eof. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.remove.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.remove.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Method Irccd.File.prototype.remove - -Synonym of File.remove(path) but with the path from the file. - -# Synopsis - -```javascript -File.prototype.remove() -``` - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.seek.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.seek.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -# Method Irccd.File.prototype.seek - -# Summary - -Sets the position in the file. - -# Synopsis - -```javascript -File.prototype.seek(type, amount) -``` - -# Arguments - -- type: the type of setting (`Irccd.File.SeekSet`, `Irccd.File.SeekCur`, - `Irccd.File.SeekSet`), -- amount: the new offset. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.stat.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.stat.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -# Method Irccd.File.prototype.stat - -Synonym of [stat][] but with the path from the file. - -Warning: this method is optional and may not be available on your system. - -# Synopsis - -```javascript -File.prototype.stat() -``` - -# Returns - -The stat information. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. - -[stat]: #{baseurl}api/module/Irccd.File/function/stat.html diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.tell.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.tell.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Method Irccd.File.prototype.tell - -Get the actual position in the file. - -# Synopsis - -```javascript -pos = File.prototype.tell() -``` - -# Returns - -The position. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.prototype.write.md --- a/doc/src/js/module/Irccd.File/Irccd.File.prototype.write.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -# Method Irccd.File.prototype.write - -Write some characters to the file. - -# Synopsis - -```javascript -File.prototype.write(data) -``` - -# Arguments - -- data: the character to write. - -# Returns - -The number of bytes written. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.remove.md --- a/doc/src/js/module/Irccd.File/Irccd.File.remove.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.File.remove - -Remove the file at the specified path. - -# Synopsis - -```javascript -Irccd.File.remove(path) -``` - -# Arguments - -- path: the path to the file. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/Irccd.File.stat.md --- a/doc/src/js/module/Irccd.File/Irccd.File.stat.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -# Function Irccd.File.stat - -Get file information at the specified path. - -The returned object may have the following properties if they are available on -your system: - -- atime: (int) the last access time, -- blksize: (int) the block size, -- blocks: (int) the number of blocks, -- ctime: (int) the creation time, -- dev: (int) the device, -- gid: (int) the group, -- ino: (int) the inode, -- mode: (int) the mode, -- mtime: (int) the modification time, -- nlink: (int) the number of hard links, -- rdev: (int), -- size: (int) the file size, -- uid: (int) the user. - -warning: this function is optional and may not be available on your system. - -# Synopsis - -```javascript -info = Irccd.File.stat(path) -``` - -# Arguments - -- path: the path to the file. - -# Returns - -The stat information. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.File/index.md --- a/doc/src/js/module/Irccd.File/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -# Module Irccd.File - -This class and functions are available for opening and writing files on the -disk. - -For convenience, some functions are available as free-functions and some as -object methods. - -# Constants - -The following properties are defined: - -- SeekCur: (int) seek from the current file position, -- SeekEnd: (int) seek from end of the file, -- SeekSet: (int) seek from beginning of the file. - -# Functions - -- [basename](Irccd.File.basename.html) -- [dirname](Irccd.File.dirname.html) -- [exists](Irccd.File.exists.html) -- [remove](Irccd.File.remove.html) -- [stat](Irccd.File.stat.html) (Optional) - -# Methods - -- [(constructor)](Irccd.File.prototype.constructor.html) -- [basename](Irccd.File.prototype.basename.html) -- [close](Irccd.File.prototype.close.html) -- [dirname](Irccd.File.prototype.dirname.html) -- [lines](Irccd.File.prototype.lines.html) -- [read](Irccd.File.prototype.read.html) -- [readline](Irccd.File.prototype.readline.html) -- [remove](Irccd.File.prototype.remove.html) -- [seek](Irccd.File.prototype.seek.html) -- [stat](Irccd.File.prototype.stat.html) (Optional) -- [tell](Irccd.File.prototype.tell.html) -- [write](Irccd.File.prototype.write.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Logger/Irccd.Logger.debug.md --- a/doc/src/js/module/Irccd.Logger/Irccd.Logger.debug.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Logger.debug - -Adds a debug message, this is only appended to the journal if irccd was compiled -in Debug mode. - -# Synopsis - -```javascript -Irccd.Logger.debug(message) -``` - -# Arguments - -- message: the message. - -# Remarks - -This function targets irccd developers, the end user should not use it. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Logger/Irccd.Logger.info.md --- a/doc/src/js/module/Irccd.Logger/Irccd.Logger.info.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Function Irccd.Logger.info - -Log something. The message is logged only if irccd is running with verbose -messages enabled. - -# Synopsis - -```javascript -Irccd.Logger.info(message) -``` - -# Arguments - -- message: the message. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Logger/Irccd.Logger.warning.md --- a/doc/src/js/module/Irccd.Logger/Irccd.Logger.warning.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.Logger.warning - -Log a warning. The message will always be logged. - -# Synopsis - -```javascript -Irccd.Logger.warning(message) -``` - -# Arguments - -- message: the message. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Logger/index.md --- a/doc/src/js/module/Irccd.Logger/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -# Module Irccd.Logger - -This module must be used to log something. It will add messages to the logging -system configured in the irccd.conf file. - -For instance, if user has chosen to log into syslog, this module will log at -syslog too. - -Any plugin can log messages, the message will be prepended by the plugin name to -be easily identifiable. - -# Functions - -- [debug](Irccd.Logger.debug.html) -- [info](Irccd.Logger.info.html) -- [warning](Irccd.Logger.warning.html) - -# Example - -```javascript -function onLoad() -{ - Irccd.Logger.info("This is an example"); -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/Irccd.Plugin.info.md --- a/doc/src/js/module/Irccd.Plugin/Irccd.Plugin.info.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -# Function Irccd.Plugin.info - -Get information about a plugin. - -# Synopsis - -```javascript -Irccd.Plugin.info(name) -``` - -# Arguments - -- name: the plugin identifier, if not specified the current plugin is - selected. - -# Returns - -The plugin information or undefined if the plugin was not found. - -The returned object as the following properties: - -- name: (string) the plugin identifier, -- author: (string) the author, -- license: (string) the license, -- summary: (string) a short description, -- version: (string) the version diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/Irccd.Plugin.list.md --- a/doc/src/js/module/Irccd.Plugin/Irccd.Plugin.list.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.Plugin.list - -Get the list of plugins, the array returned contains all plugin names. - -# Synopsis - -```javascript -Irccd.Plugin.list() -``` - -# Returns - -The list of all plugin names. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/Irccd.Plugin.load.md --- a/doc/src/js/module/Irccd.Plugin/Irccd.Plugin.load.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# Function Irccd.Plugin.load - -Load a plugin by name. This function will search through the standard -directories. - -# Synopsis - -```javascript -Irccd.Plugin.load(name) -``` - -# Arguments - -- name: the plugin identifier. - -# Throws - -- Error on errors, -- ReferenceError if the plugin was not found. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/Irccd.Plugin.reload.md --- a/doc/src/js/module/Irccd.Plugin/Irccd.Plugin.reload.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Plugin.reload - -Reload a plugin by name. - -# Synopsis - -```javascript -Irccd.Plugin.reload(name) -``` - -# Arguments - -- name: the plugin identifier. - -# Throws - -- Error on errors, -- ReferenceError if the plugin was not found. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/Irccd.Plugin.unload.md --- a/doc/src/js/module/Irccd.Plugin/Irccd.Plugin.unload.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Plugin.unload - -Unload a plugin by name. - -# Synopsis - -```javascript -Irccd.Plugin.unload(name) -``` - -# Arguments - -- name: the plugin identifier. - -# Throws - -- Error on errors, -- ReferenceError if the plugin was not found. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Plugin/index.md --- a/doc/src/js/module/Irccd.Plugin/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -# Module Irccd.Plugin - -This module let you manage plugins. - -# Objects - -The following properties are defined as read in the configuration file: - -- config: the `[plugin.]` section, -- paths: the `[paths.]` section, -- format: the `[format.]` section. - -# Functions - -- [info](Irccd.Plugin.info.html) -- [list](Irccd.Plugin.list.html) -- [load](Irccd.Plugin.load.html) -- [reload](Irccd.Plugin.reload.html) -- [unload](Irccd.Plugin.unload.html) - -# Example - -Assuming the configuration file is defined as following: - -```ini -[plugin.xyz] -foo = true -baz = "hello" - -[paths.xyz] -config = "/etc/xyz" -``` - -The `Irccd.Plugin.config` will have the following properties: - -- foo: (string) set to "true", -- baz: (string) set to "hello". - -The `Irccd.Plugin.paths` will have the following properties: - -- cache: (string) set to the default cache directory, -- config: (string) set to "/etc/xyz", -- data: (string) set to the default data directory. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.add.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.add.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.Server.add - -Add a new server to the irccd instance. - -# Synopsis - -```javascript -Irccd.Server.add(server) -``` - -# Arguments - -- server: the server object to add. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.find.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.find.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Server.find - -Find a server by name. - -# Synopsis - -```javascript -server = Irccd.Server.find(name) -``` - -# Arguments - -- name: the server name. - -# Returns - -The server object or undefined if not found. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.list.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.list.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -# Function Irccd.Server.list - -List all servers in a map. - -# Synopsis - -```javascript -table = Irccd.Server.list() -``` - -# Returns - -The table of all servers. - -# Example - -```javascript -var table = Irccd.Server.list(); - -for (var name in table) { - var server = table[name]; - - // Use server. -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.constructor.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.constructor.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -# Function Irccd.Server (constructor) - -Construct a new server - -# Synopsis - -```javascript -Irccd.Server(properties) -``` - -# Arguments - -- properties: object information. - -The properties argument may have the following properties: - -- name: the name, -- hostname: the host, -- ipv4: enable ipv4 (Optional: default true) -- ipv6: enable ipv6, (Optional: default true) -- port: the port number, (Optional: default 6667) -- password: the password, (Optional: default none) -- channels: array of channels (Optiona: default empty) -- ssl: true to use ssl, (Optional: default false) -- nickname: "nickname", (Optional, default: irccd) -- username: "user name", (Optional, default: irccd) -- realname: "real name", (Optional, default: IRC Client Daemon) -- commandChar: "!", (Optional, the command char, default: "!") - -warning: at least ipv4 and ipv6 must be set (which is the default). - -# Example - -```javascript -var s = new Irccd.Server({ - name: "localhost", - hostname: "localhost", - nickname: "kevin", - ssl: true, -}); -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.info.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.info.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -# Method Irccd.Server.prototype.info - -Get server information. - -# Synopsis - -```javascript -info = Server.prototype.info() -``` - -# Returns - -The server information. - -The returned object has the following fields: - -- name: (string) the server unique name, -- hostname: (string) the host name, -- port: (int) the port number, -- ssl: (bool) true if using ssl, -- channels: (string list) an array of all channels, -- realname: (string) the current real name, -- username: (string) the user name, -- nickname: (string) the current nickname. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.invite.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.invite.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.invite - -Invite the specified target on the channel. - -# Synopsis - -```javascript -Server.prototype.invite(target, channel) -``` - -# Arguments - -- target: the target to invite, -- channel: the channel. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.isSelf.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.isSelf.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Method Irccd.Server.prototype.isSelf - -Check if the nickname targets the bot. - -# Synopsis - -```javascript -res = Server.prototype.isSelf(nickname) -``` - -# Returns - -True if nickname is same as the bot. - -# Arguments - -- nickname: the nickname to check. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.join.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.join.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.join - -Join the specified channel, the password is optional. - -# Synopsis - -```javascript -Server.prototype.join(channel, password) -``` - -# Arguments - -- channel: the channel to join, -- password: an optional password. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.kick.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.kick.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Method Irccd.Server.prototype.kick - -Kick the specified target from the channel, the reason is optional. - -# Synopsis - -```javascript -Server.prototype.kick(nickname, channel, reason) -``` - -# Arguments - -- nickname: the person to kick, -- channel: from which channel, -- reason: an optional reason. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.me.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.me.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.me - -Send an action emote. - -# Synopsis - -```javascript -Server.prototype.me(target, message) -``` - -# Arguments - -- target: a nick or a channel, -- message: the message to send. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.message.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.message.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.message - -Send a message to the specified target or channel. - -# Synopsis - -```javascript -Server.prototype.message(target, message) -``` - -# Arguments - -- target: the target, -- message: the message to send. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.mode.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.mode.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Method Irccd.Server.prototype.mode - -Set the irccd's user mode. - -# Synopsis - -```javascript -Server.prototype.mode(mode) -``` - -# Arguments - -- mode: the new mode. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.names.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.names.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Method Irccd.Server.prototype.names - -# Summary - -Get the list of names. This function will generate the onNames event. - -# Synopsis - -```javascript -Server.prototype.names(channel) -``` - -# Arguments - -- channel: the channel name. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.nick.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.nick.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Method Irccd.Server.prototype.nick - -Change irccd's nickname. - -# Synopsis - -```javascript -Server.prototype.nick(nickname) -``` - -# Arguments - -- nickname: the new nickname. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.notice.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.notice.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.notice - -Send a private notice to the specified target. - -# Synopsis - -```javascript -Server.prototype.notice(nickname, message) -``` - -# Arguments - -- nickname: the target nickname, -- message: the notice message. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.part.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.part.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Method Irccd.Server.prototype.part - -Leave the specified channel, the reason is optional. - -Note: not all IRC servers support giving a reason to leave a channel, do not - specify it if this is a concern. - -# Synopsis - -```javascript -Server.prototype.part(channel, reason) -``` - -# Arguments - -- channel: the channel to leave, -- reason: an optional reason. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.toString.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.toString.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -# Method Irccd.Server.prototype.toString - -Convert object as a string. - -Because each server has a unique identifier, this method allows adding a server -a property key. - -# Synopsis - -```javascript -Server.prototype.toString() -``` - -# Returns - -The server identifier. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.topic.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.topic.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.topic - -Change the topic of the specified channel. - -# Synopsis - -```javascript -Server.prototype.topic(channel, topic) -``` - -# Arguments - -- channel: the channel, -- topic: the new topic. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.prototype.whois.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.prototype.whois.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Method Irccd.Server.prototype.whois - -Get whois information from a user. The function will generate -[onWhois](@baseurl@api/event/onWhois.html) event. - -# Synopsis - -```javascript -Server.prototype.whois(target) -``` - -# Arguments - -- target: the target. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/Irccd.Server.remove.md --- a/doc/src/js/module/Irccd.Server/Irccd.Server.remove.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Server.remove - -Remove a server from the irccd instance and disconnect it. - -# Synopsis - -```javascript -Irccd.Server.remove(name) -``` - -# Arguments - -- name: the server name. - -# Remarks - -Since the server object has `toString` method, you can just pass a server object -as well. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Server/index.md --- a/doc/src/js/module/Irccd.Server/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -# Module Irccd.Server - -This module is the object that you received in almost all IRC event -(e.g. `onConnect`). You can use its methods to do your required actions on the -server. - -# Functions - -- [add](Irccd.Server.add.html) -- [find](Irccd.Server.find.html) -- [list](Irccd.Server.list.html) -- [remove](Irccd.Server.remove.html) - -# Methods - -- [(constructor)](Irccd.Server.prototype.constructor.html) -- [info](Irccd.Server.prototype.info.html) -- [invite](Irccd.Server.prototype.invite.html) -- [join](Irccd.Server.prototype.join.html) -- [kick](Irccd.Server.prototype.kick.html) -- [me](Irccd.Server.prototype.me.html) -- [message](Irccd.Server.prototype.message.html) -- [mode](Irccd.Server.prototype.mode.html) -- [names](Irccd.Server.prototype.names.html) -- [nick](Irccd.Server.prototype.nick.html) -- [notice](Irccd.Server.prototype.notice.html) -- [part](Irccd.Server.prototype.part.html) -- [topic](Irccd.Server.prototype.topic.html) -- [toString](Irccd.Server.prototype.toString.html) -- [whois](Irccd.Server.prototype.whois.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.env.md --- a/doc/src/js/module/Irccd.System/Irccd.System.env.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.System.env - -Get a environment variable. - -# Synopsis - -```javascript -home = Irccd.System.env(name) -``` - -# Arguments - -- name: the environment variable name. - -# Returns - -The variable or an empty string. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.exec.md --- a/doc/src/js/module/Irccd.System/Irccd.System.exec.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -# Function Irccd.System.exec - -# Summary - -Execute a system command. - -# Synopsis - -```javascript -Irccd.System.exec(cmd) -``` - -# Arguments - -- cmd: the command to execute. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.home.md --- a/doc/src/js/module/Irccd.System/Irccd.System.home.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Function Irccd.System.home - -Get the home directory. This function should be used with care, plugin should -not use user's home to store files. - -# Synopsis - -```javascript -home = Irccd.System.home() -``` - -# Returns - -The user home directory. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.name.md --- a/doc/src/js/module/Irccd.System/Irccd.System.name.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# Function Irccd.System.name - -Get the operating system name. Returns one of: - -- Linux -- Windows -- FreeBSD -- DragonFlyBSD -- OpenBSD -- NetBSD -- macOS -- Android -- Aix -- Haiku -- iOS -- Solaris -- Unknown - -# Synopsis - -```javascript -name = Irccd.System.name() -``` - -# Returns - -The operating system name. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.popen.md --- a/doc/src/js/module/Irccd.System/Irccd.System.popen.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -# Function Irccd.System.popen - -Wrapper for `popen(3)` if the function is available. - -**Note**: this function is optional and may not be available on your system. - -# Synopsis - -```javascript -Irccd.System.popen(cmd, mode) /* optional */ -``` - -# Arguments - -- cmd: the command to execute, -- mode: the mode (e.g. `r`). - -# Returns - -An [Irccd.File](#{baseurl}api/module/Irccd.File/index.html) object. - -# Throws - -An [Irccd.SystemError](#{baseurl}api/module/Irccd/index.html#types) on failures. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.sleep.md --- a/doc/src/js/module/Irccd.System/Irccd.System.sleep.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.System.sleep - -Sleep for seconds. Suspend the execution thread. - -# Synopsis - -```javascript -Irccd.System.sleep(sec) -``` - -# Arguments - -- sec: the number of seconds. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.ticks.md --- a/doc/src/js/module/Irccd.System/Irccd.System.ticks.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Function Irccd.System.ticks - -Get the time spent from start. Get how many milliseconds spent since the irccd -startup. - -# Synopsis - -```javascript -msec = Irccd.System.ticks() -``` - -# Returns - -The number of milliseconds. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.uptime.md --- a/doc/src/js/module/Irccd.System/Irccd.System.uptime.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Function Irccd.System.uptime - -Get the system uptime. This function returns the number of seconds elapsed since -the system boot up. - -# Synopsis - -```javascript -Irccd.System.uptime() -``` - -# Returns - -The number of seconds. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.usleep.md --- a/doc/src/js/module/Irccd.System/Irccd.System.usleep.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.System.usleep - -Sleep for milliseconds. Suspend the execution thread. - -# Synopsis - -```javascript -Irccd.System.usleep(msec) -``` - -# Arguments - -- msec: the number of milliseconds. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/Irccd.System.version.md --- a/doc/src/js/module/Irccd.System/Irccd.System.version.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -# Function Irccd.System.version - -Get the operating system version. This function is completely system dependent. - -# Synopsis - -```javascript -version = Irccd.System.version() -``` - -# Returns - -The version as a string. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.System/index.md --- a/doc/src/js/module/Irccd.System/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# Module Irccd.System - -System inspection. - -# Usage - -Use this module if you want to inspect the system independently. - -# Functions - -- [env](Irccd.System.env.html) -- [exec](Irccd.System.exec.html) -- [home](Irccd.System.home.html) -- [name](Irccd.System.name.html) -- [popen](Irccd.System.popen.html) (Optional) -- [sleep](Irccd.System.sleep.html) -- [ticks](Irccd.System.ticks.html) -- [uptime](Irccd.System.uptime.html) -- [usleep](Irccd.System.usleep.html) -- [version](Irccd.System.version.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.constructor.md --- a/doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.constructor.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# Function Irccd.Timer (constructor) - -Create a new timer object. - -# Synopsis - -```javascript -Irccd.Timer(type, delay, callback) -``` - -# Arguments - -- type: type of timer (`Irccd.Timer.Repeat` or `Irccd.Timer.Single`), -- delay: the interval in milliseconds, -- callback: the function to call. - -# Example - -```javascript -// Execute an action every 1 second. - -var t = new Irccd.Timer(Irccd.Timer.Repeat, 1000, function () { - // Do your action. -}); - -t.start(); -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.start.md --- a/doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.start.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.Timer.prototype.start - -Start the timer. - -# Synopsis - -```javascript -Timer.prototype.start() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.stop.md --- a/doc/src/js/module/Irccd.Timer/Irccd.Timer.prototype.stop.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -# Method Irccd.Timer.prototype.stop - -Stop the timer. - -# Synopsis - -```javascript -Timer.prototype.stop() -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Timer/index.md --- a/doc/src/js/module/Irccd.Timer/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Module Irccd.Timer - -# Usage - -Create repetitive or one-shot timers. - -# Constants - -The following properties are defined: - -- Single: (int) the timer is single-shot, -- Repeat: (int) the timer is looping. - -# Methods - -- [(constructor)](Irccd.Timer.prototype.constructor.html) -- [start](Irccd.Timer.prototype.start.html) -- [stop](Irccd.Timer.prototype.stop.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isDigit.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isDigit.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isDigit - -Check if the unicode character is a digit. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isDigit(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if digit. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isLetter.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isLetter.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isLetter - -Check if the unicode character is a letter. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isLetter(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if letter. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isLower.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isLower.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isLower - -Check if the unicode character is lower case. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isLower(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if lower case. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isSpace.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isSpace.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isSpace - -Check if the unicode character is a space. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isSpace(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if space. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isTitle.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isTitle.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isTitle - -Check if the unicode character is title case. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isTitle(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if title case. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isUpper.md --- a/doc/src/js/module/Irccd.Unicode/Irccd.Unicode.isUpper.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -# Function Irccd.Unicode.isUpper - -Check if the unicode character is upper case. - -# Synopsis - -```javascript -ret = Irccd.Unicode.isUpper(code) -``` - -# Arguments - -- code: the code point. - -# Returns - -True if upper case. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Unicode/index.md --- a/doc/src/js/module/Irccd.Unicode/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -# Module Irccd.Unicode - -# Usage - -Check for character categories. - -# Functions - -- [isDigit](Irccd.Unicode.isDigit.html) -- [isLetter](Irccd.Unicode.isLetter.html) -- [isLower](Irccd.Unicode.isLower.html) -- [isSpace](Irccd.Unicode.isSpace.html) -- [isTitle](Irccd.Unicode.isTitle.html) -- [isUpper](Irccd.Unicode.isUpper.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Util/Irccd.Util.cut.md --- a/doc/src/js/module/Irccd.Util/Irccd.Util.cut.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -# Function Irccd.Util.cut - -Cut a piece of data into several lines. - -The argument data is a string or a list of strings. In any case, all strings -are first splitted by spaces and trimmed. This ensure that useless -whitespaces are discarded. - -The argument maxc controls the maximum of characters allowed per line, it can -be a positive integer. If undefined is given, a default of 72 is used. - -The argument maxl controls the maximum of lines allowed. It can be a positive -integer or undefined for an infinite list. - -If maxl is used as a limit and the data can not fit within the bounds, -undefined is returned. - -An empty list may be returned if empty strings were found. - -# Synopsis - -```javascript -lines = Irccd.Util.cut(data, maxc, maxl) -``` - -# Arguments - -- data: a string or an array of strings, -- maxc: max number of colums (Optional, default: 72), -- maxl: max number of lines (Optional, default: undefined). - -# Returns - -A list of strings ready to be sent or undefined if the data is too big. - -# Throws - -- RangeError if maxl or maxc are negative numbers, -- RangeError if one word length was bigger than maxc, -- TypeError if data is not a string or a list of strings. - diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Util/Irccd.Util.format.md --- a/doc/src/js/module/Irccd.Util/Irccd.Util.format.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -# Function Irccd.Util.format - -Format a string according to the template system. - -# Synopsis - -```javascript -str = Irccd.Util.format(input, params) -``` - -# Arguments - -- input: the text to update, -- params: the parameters. - -# Returns - -The converted text. - -# Example - -Replaces the keyword `message` and formats it bold and red. - -```javascript -function onMessage(server, channel, origin, message) -{ - var s = Irccd.Util.format("@{red,default,bold}#{message}@{}", { message: message }) -} -``` - -## Security - -Be very careful when you use this function with untrusted input. - -warning: Do never pass untrusted content (e.g. user message) as input parameter. - -For example, the following code is terribly dangerous: - -```javascript -function onMessage(server, channel, origin, message) -{ - // DANGEROUS, DON'T DO THIS. - server.message(channel, Irccd.Util.format("@{red}" + message + "@{}"); -} -``` - -If a user sends a message like `${HOME}`, it will prints the user home -directory, which is a high security issue if you have environment variables with -passwords. - -Instead, always use a literal string using a replacement with the user input: - -```javascript -function onMessage(server, channel, origin, message) -{ - // CORRECT. - server.message(channel, Irccd.Util.format("@{red}#{message}@{}", { - message: message - }); -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Util/Irccd.Util.splithost.md --- a/doc/src/js/module/Irccd.Util/Irccd.Util.splithost.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Util.splithost - -Extract the host from a user, for instance with **foo!~foo@localhost**, -**localhost** will be returned. - -# Synopsis - -```javascript -hostname = Irccd.Util.splithost(user) -``` - -# Arguments - -- user: the user to split. - -# Returns - -The hostname. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Util/Irccd.Util.splituser.md --- a/doc/src/js/module/Irccd.Util/Irccd.Util.splituser.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -# Function Irccd.Util.splituser - -Extract the nickname, for instance with **foo!~foo@localhost**, **foo** will be -returned. - -# Synopsis - -```javascript -nick = Irccd.Util.splituser(user) -``` - -# Arguments - -- user: the user to split. - -# Returns - -The nickname. diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd.Util/index.md --- a/doc/src/js/module/Irccd.Util/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -# Module Irccd.Util - -# Usage - -Various utilities. - -# Functions - -- [cut](Irccd.Util.cut.html) -- [format](Irccd.Util.format.html) -- [splituser](Irccd.Util.splituser.html) -- [splithost](Irccd.Util.splithost.html) diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/module/Irccd/index.md --- a/doc/src/js/module/Irccd/index.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -# Module Irccd - -Contains general irccd variables and functions. - -# Constants - -The following properties are defined: - -- version: (object) - - major: (int) the major irccd version, - - minor: (int) the minor irccd version, - - patch: (int) the patch irccd version. - -# Types - -- SystemError: (function) an exception inheriting `Error` thrown by some - functions. - -# Example - -```javascript -var Logger = Irccd.Logger; - -function onLoad() -{ - Logger.info("Major: " + Irccd.version.major); - Logger.info("Minor: " + Irccd.version.minor); - Logger.info("Patch: " + Irccd.version.patch); -} -``` diff -r dc6b42d7b97a -r 00a4720c4874 doc/src/js/topics/getting-started.md --- a/doc/src/js/topics/getting-started.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,172 +0,0 @@ -% introduction to Javascript plugins -% David Demelier -% 2017-12-08 - -Irccd can be extended with JavaScript plugins. This chapter will tell you how -plugins work within irccd and how to create your first plugin. - -This chapter covers also some things to do and to avoid in plugins. - -# Why JavaScript? - -You may wonder why JavaScript was chosen in irccd. Originally, irccd used Lua as -the scripting language but for many reasons, it has been replaced with -Javascript. - -However, many aspects between Lua and JavaScript are similar: - - - Both languages are extremly small with very light API, - - It is easy to sandbox the interpreter for security reasons, - - It is very easy to implement your own API from C++ code. - -The current JavaScript interpreter is powered by [Duktape][duktape]. - -# Paths - -Irccd will find plugins in many paths depending on the configuration or the -operating system. - -## Unix paths - - 1. `${XDG_DATA_HOME}/irccd/plugins` - 2. `${HOME}/.local/share/irccd/plugins` - 3. `/usr/local/share/irccd/plugins` - -## Windows paths - - 1. `C:\\Users\\YourUser\\irccd\\plugins` - 2. `Path\\To\\Irccd\\Directory\\share\\plugins` - -# Plugin metadata - -While it's not mandatory, please set the following variables in a global `info` -object: - - - **author**: (string) your name, usually mail address, - - **license**: (string) an arbitrary license name, - - **summary**: (string) a short comment about your plugin, - - **version**: (string) the plugin version. - -Example: - -```javascript -info = { - author: "David Demelier ", - license: "ISC", - summary: "A FPS game for IRC", - version: "0.0.0.0.0.0.1" -}; -``` - -# Plugin creation - -Now, we will write a simple plugin that repeat every sentences said on a -channel, it's quite easy but you should not use it on a real channel or you'll -probably get kicked. - -We will create our new plugin under the home user plugin path. If you're running -on Unix systems it is usually **${XDG_CONFIG_HOME}/.local/share/irccd/plugins**. - -So let start by creating a plugin named **repeater.js**. On my system the file -will live as **/home/markand/.local/share/irccd/plugins/repeater.js**. - -# First event - -## Registering the callback - -Remember, plugins are made through the event driven mechanism, so we must define -a function that will be called when a user said something on the channel. The -function defined on channel message is called [onMessage][]. - -It has the following signature: - -```javascript -function onMessage(server, origin, channel, message) -``` - -The parameters are defined as following: - - - **server**, on which server the message happened - - **origin**, who emit the message (full nickname with host) - - **channel**, on which channel - - **message**, and the message content - -## Send the response - -Now that we have the message, the channel and the server, we can send the copy -of the message. For this, you must take care of the server parameter. The server -is one of defined in the server section from the configuration file. - -There are several methods available for the object, they are defined in the -[Irccd.Server][server-api] documentation. - -But the on we are interested in is [Server.prototype.message][server-message]. -This function takes two parameters, the target which can be a nickname or a -hannel and the message. - -So the only thing to do is the following: - -```javascript -function onMessage(server, origin, channel, message) -{ - server.message(channel, message) -} -``` - -That's it! - -You've just made a brand new plugin, of course it's not a very powerful one but -at least you understood the way it works. With the powerful API provided you -will be able to create a bunch of plugins that can fits your needs, such as -a content provider, a moderator, a calculator and so on. - -# Do and do not - -There are things which should be avoided if possible. - -## Error and load - -Since irccd 1.1, one should not write code outside Javascript supported events -functions. Internally, irccd store the plugin information the complete read. If -a plugin has an syntax error or a bad API call, irccd looks for the plugin -metadata information and since it is not currently stored, it generate the -"unitialized state" error. - -## Handling error - -There are two ways of handling error. - -### Your plugin can't continue running - -If you need a file, specific resource so your plugin. - -If you call the error function while you are in the `onLoad` callback, the -plugin is not added to the registry. However, if the function is called in any -other event, the plugin remains in the list. - -### Your plugin has errors but can run - -If for instance, the plugin has errors but can still run for any reason. One -should use the `Irccd.Logger` API. The function in this API will write a message -in the irccd output. - -**Example** - -```javascript -function onCommand() -{ - if (something_is_wrong) - Irccd.Logger.warning("error condition") -} -``` - -This will output to the irccd log something like: - -```nohighlight -plugin foo: error condition -``` - -[duktape]: http://duktape.org -[onMessage]: @baseurl@api/event/onMessage.html -[server-api]: @baseurl@api/module/Irccd.Server/index.html -[server-message]: @baseurl@api/module/Irccd.Server/Irccd.Server.prototype.message.html diff -r dc6b42d7b97a -r 00a4720c4874 man/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,36 @@ +# +# CMakeLists.txt -- CMake build system for irccd +# +# Copyright (c) 2013-2019 David Demelier +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +project(man) + +set( + MANPAGES + irccd-api.7 + irccd-ipc.7 + irccd-templates.7 + irccd-test.1 + irccd.1 + irccd.conf.5 + irccdctl.1 + irccdctl.conf.5 +) + +foreach (m ${MANPAGES}) + string(REGEX REPLACE ".*\\.([0-9])$" "\\1" section ${m}) + irccd_define_man(INPUT ${m} SECTION man${section}) +endforeach () diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd-api.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd-api.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,2444 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-API 7 +.Os +.\" NAME +.Sh NAME +.Nm irccd-api +.Nd irccd Javascript API +.\" DESCRIPTION +.Sh DESCRIPTION +This documentation shows the API reference for the official irccd Javascript +API. +.Pp +Any function that is indicated as +.Em optional +in square brackets means it may not exist on your platform. A quick check in +Javascript will let you test its presence. +.\" EVENTS +.Sh EVENTS +The following is a list of events that Javascript plugins support. All functions +are completely optional and may be omitted. If you want to support a function +just implement it as global Javascript function. +.\" onCommand +.Ss onCommand +Special commands are not real IRC events. They are called from channel messages +with a specific syntax using a delimiter and the plugin name. +.Pp +For instance, with default irccd parameters, saying on a channel +.Ar "!ask foo" +will call the special command of the plugin named +.Nm ask . +.Pp +Synopsis +.Bd -literal -offset Ds +function onCommand(server, origin, channel, message) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +Who invoked the command. +.It Fa channel No (string) +The channel where the message comes from. +.It Fa message No (string) +The real message, without the ! part. +.El +.\" onConnect +.Ss onConnect +This callback is called when the irccd instance successfully connect to a +server. +.Pp +Synopsis +.Bd -literal -offset Ds +function onConnect(server) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.El +.\" onDisconnect +.Ss onDisconnect +This callback is called when a server has been disconnected by any way. +.Pp +Synopsis +.Bd -literal -offset Ds +function onDisonnect(server) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.El +.\" onInvite +.Ss onInvite +This event is called when someone is inviting you to a channel. +.Pp +Synopsis +.Bd -literal -offset Ds +function onInvite(server, origin, channel) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +Who invited you. +.It Fa channel No (string) +On which channel you are invited to. +.El +.\" onJoin +.Ss onJoin +User join events, this function is called when someone joins a channel. +.Pp +Synopsis +.Bd -literal -offset Ds +function onJoin(server, origin, channel) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who joined the channel. +.It Fa channel No (string) +The channel the user has joined. +.El +.\" onKick +.Ss onKick +This event is triggered when someone has been kicked from a channel. +.Pp +Synopsis +.Bd -literal -offset Ds +function onKick(server, origin, channel, target, reason) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +Who kicked the person. +.It Fa channel No (string) +The channel. +.It Fa target No (string) +The kicked person. +.It Fa reason No (string) +An optional reason. +.El +.\" onLoad +.Ss onLoad +This function is called when irccd instance load a plugin. If this function +throws an error, the script is not loaded. +.Pp +Synopsis +.Bd -literal -offset Ds +function onLoad() +.Ed +.\" onMe +.Ss onMe +Action emote. +.Pp +Synopsis +.Bd -literal -offset Ds +function onMe(server, origin, channel, message) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who said something. +.It Fa channel No (string) +The channel. +.It Fa message No (string) +The message sent. +.El +.\" onMessage +.Ss onMessage +This event is triggered when someone said something on a specific channel. +.Pp +Synopsis +.Bd -literal -offset Ds +function onMessage(server, origin, channel, message) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who said something. +.It Fa channel No (string) +The channel. +.It Fa message No (string) +The message sent. +.El +.\" onMode +.Ss onMode +This event is triggered when the server changed a channel mode or your mode. +.Pp +Synopsis +.Bd -literal -offset Ds +function onMode(server, origin, channel, mode, limit, user, mask) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who changed the mode. +.It Fa mode No (string) +The new mode. +.El +.\" onNames +.Ss onNames +This event is triggered when a list of names has come. +.Pp +Synopsis +.Bd -literal -offset Ds +function onNames(server, channel, list) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa channel No (string) +Which channel. +.It Fa list No (string) +A sequence with all users. +.El +.\" onNick +.Ss onNick +This event is triggered when someone changed its nickname. +.Pp +Synopsis +.Bd -literal -offset Ds +function onNick(server, origin, nickname) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The old nickname. +.It Fa nickname No (string) +The new nickname. +.El +.\" onNotice +.Ss onNotice +This event is triggered when someone sent a notice to you. +.Pp +Synopsis +.Bd -literal -offset Ds +function onNotice(server, origin, notice) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The one who sent the notice. +.It Fa message No (string) +The notice message. +.El +.\" onPart +.Ss onPart +This event is triggered when someone has left a specific channel. +.Pp +Synopsis +.Bd -literal -offset Ds +function onPart(server, origin, channel, reason) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who left the channel. +.It Fa channel No (string) +The channel. +.It Fa reason No (string) +An optional reason. +.El +.\" onReload +.Ss onReload +Request to reload the plugin. +.Pp +This function does nothing in the irccd internals, it just calls a function that +you can use to reload some data. +.Pp +Synopsis +.Bd -literal -offset Ds +function onReload() +.Ed +.\" onTopic +.Ss onTopic +This event is triggered when someone changed the channel's topic. +.Pp +Synopsis +.Bd -literal -offset Ds +function onTopic(server, origin, channel, topic) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa origin No (string) +The person who changed the topic. +.It Fa channel No (string) +The channel. +.It Fa topic No (string) +The new topic (may be empty). +.El +.\" onUnload +.Ss onUnload +This event is triggered when the plugin is about to be unloaded. +.Pp +Synopsis +.Bd -literal -offset Ds +function onUnload() +.Ed +.\" onWhois +.Ss onWhois +This event is triggered when irccd gets information about a user. +.Pp +Synopsis +.Bd -literal -offset Ds +function onWhois(server, info) +.Ed +.Pp +Arguments +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The current server. +.It Fa info No (Object) +The whois information. +.El +.Pp +The +.Fa info +is an object with the following properties: +.Bl -tag -width 20n -compact -offset Ds +.It Fa nickname No (string) +The user nickname. +.It Fa user No (string) +The user name. +.It Fa host No (string) +The hostname. +.It Fa realname No (string) +The real name used. +.It Fa channels No (array) +An optional list of channels joined. +.El +.\" MODULES +.Sh MODULES +The following modules are part of the official Javascript API. They are all +accessible as global function, variables and objects. +.Pp +All modules are categorized into pseudo namespaces that are placed into the +global +.Va Irccd +object. (e.g. +.Va Irccd.Directory , Irccd.File ) . +.\" {{{ Module: Irccd +.Ss Irccd +Top level irccd Javascript module. +.Pp +Contains general irccd variables and functions. +.Pp +.\" {{{ Constants +The following constants properties are defined: +.Pp +.Bl -tag -width 22n -compact -offset Ds +.It Va version No (object) +See below. +.It Va version.major No (int) +The major irccd version. +.It Va version.minor No (int) +The minor irccd version. +.It Va version.patch No (int) +The patch irccd version. +.El +.Pp +.\" }}} !Constants +.\" {{{ Types +The following objects are defined: +.Bl -tag -width 22n -compact -offset Ds +.It Va SystemError No (function) +An exception inheriting Error thrown by some filesystem functions. +.El +.\" }}} !Types +.\" }}} !Module: Irccd +.\" {{{ Module: Irccd.Chrono +.Ss Irccd.Chrono +This class let you measure the elapsed time. +.\" {{{ Methods +.\" {{{ Irccd.Chrono [constructor] +.Pp +Irccd.Chrono [constructor] +.Bd -ragged -offset indent +Construct a new Chrono object. The timer is automatically started on +construction. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.ElapsedTimer() +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Chrono.prototype.elapsed +.Pp +Irccd.Chrono.prototype.elapsed +.Bd -ragged -offset indent +Get the number of elapsed milliseconds. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Chrono.prototype.elapsed() +.Ed +.Pp +Returns +.Pp +The elapsed time in milliseconds. +.Ed +.\" }}} +.\" {{{ Irccd.Chrono.prototype.pause +.Pp +Irccd.Chrono.prototype.pause +.Bd -ragged -offset indent +Pause the timer, without resetting the current elapsed time stored. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Chrono.prototype.pause() +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Chrono.prototype.resume +.Pp +Irccd.Chrono.prototype.resume +.Bd -ragged -offset indent +Continue accumulating additional time. Has no effect if the timer is already +running. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Chrono.prototype.restart() +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Chrono.prototype.start +.Pp +Irccd.Chrono.prototype.start +.Bd -ragged -offset indent +Starts or restarts accumulating time. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Chrono.prototype.start() +.Ed +.Ed +.\" }}} +.\" }}} +.\" }}} !Module: Irccd.Chrono +.\" {{{ Module: Irccd.Directory +.Ss Irccd.Directory +This module can be used to iterate, find, remove or create directories. +.Pp +Use this module with care. +.Pp +.\" {{{ Constants +The following constants properties are defined: +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va Dot No (int) +list "." directory. +.It Va DotDot No (int) +list ".." directory. +.It Va TypeUnknown No (int) +unknown type file. +.It Va TypeDir No (int) +entry is a directory. +.It Va TypeFile No (int) +entry is a file. +.It Va TypeLink No (int) +entry is a link. +.El +.\" }}} !Constants +.\" {{{ Functions +.\" {{{ Irccd.Directory.find +.Pp +Irccd.Directory.find +.Bd -ragged -offset indent +.Pp +Find an entry by a pattern or a regular expression. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory.find(path, pattern, recursive) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The base path. +.It Fa pattern No (mixed) +The regular expression or file name as string. +.It Fa recursive No (bool) +Set to true to search recursively (Optional, default: false). +.El +.Pp +Returns +.Pp +The path to the file or undefined if not found. +.Ed +.\" }}} +.\" {{{ Irccd.Directory.mkdir +.Pp +Irccd.Directory.mkdir +.Bd -ragged -offset indent +Create a directory specified by path. It will create needed subdirectories just +like you have invoked mkdir -p. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory.mkdir(path, mode = 0700) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the directory. +.It Fa mode No (string) +The mode, not available on all platforms. +.El +.Pp +Throws +.Pp +Any exception on error. +.Ed +.\" }}} +.\" {{{ Irccd.Directory.remove +.Pp +Irccd.Directory.remove +.Bd -ragged -offset indent +Remove the directory optionally recursively. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory.remove(path, recursive) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the directory. +.It Fa recursive No (bool) +Recursively or not (Optional, default: false). +.El +.Pp +Throws +.Pp +Any exception on error. +.Ed +.\" }}} +.\" }}} !Functions +.\" {{{ Methods +.\" {{{ Irccd.Directory [constructor] +.Pp +Irccd.Directory [constructor] +.Bd -ragged -offset indent +Open a directory. +.Pp +When constructed successfully, the object has the following properties: +.Pp +.Bl -tag -width 20n -offset indent -compact +.It Va path No (string) +the path to the directory. +.It Va entries No (array) +an array for each entry containing. See below +.El +.Pp +For each entry found, the array entries contains as many objects with the +following properties: +.Pp +.Bl -tag -width 14n -offset indent-two -compact +.It Va name No (string) +the base file name. +.It Va type No (int) +the type of file (Irccd.Directory.Type*). +.El +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory(path, flags) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the directory. +.It Va flags No (int) +The OR'ed flags: +.Va Irccd.Directory.Dot , Irccd.Directory.DotDot +(Optional, default: none). +.El +.Pp +Throws +.Pp +Any exception on error. +.Ed +.\" }}} +.\" {{{ Irccd.Directory.prototype.find +.Pp +Irccd.Directory.prototype.find +.Bd -ragged -offset indent +Synonym of find static function but the path is taken from the directory object. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory.prototype.find(pattern, recursive) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa pattern No (mixed) +The regular expression or file name. +.It Fa recursive No (bool) +Set to true to search recursively (Optional, default: false). +.El +.Pp +Throws +.Pp +Any exception on error. +.Pp +Returns +.Pp +The path to the file or undefined if not found. +.Ed +.\" }}} +.\" {{{ Irccd.Directory.prototype.remove +.Pp +Irccd.Directory.prototype.remove +.Bd -ragged -offset indent +Synonym of remove static function but the path is taken from the directory +object. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Directory.prototype.remove(recursive) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa recursive No (bool) +Recursively or not (Optional, default: false). +.El +.Pp +Throws +.Pp +Any exception on error. +.Ed +.\" }}} +.\" }}} !Methods +.\" }}} !Module: Irccd.Directory +.\" {{{ Module: Irccd.File +.Ss Irccd.File +This module is available for opening and writing files on the disk. +.Pp +For convenience, some functions are available as free-functions and some as +object methods. +.\" {{{ Constants +The following constants properties are defined: +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va SeekCur No (int) +Seek from the current file position. +.It Va SeekEnd No (int) +Seek from end of the file. +.It Va SeekSet No (int) +Seek from beginning of the file. +.El +.\" }}} !Constants +.\" {{{ Functions +.\" {{{ Irccd.File.basename +.Pp +Irccd.File.basename +.Bd -ragged -offset indent +Return the file basename as specified in basename C function. +.Pp +Synopsis +.Bd -literal -offset Ds +base = Irccd.File.basename(path) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.El +.Pp +Returns +.Pp +The base name. +.Ed +.\" }}} +.\" {{{ Irccd.File.dirname +.Pp +Irccd.File.dirname +.Bd -ragged -offset indent +Return the file directory name as specified in dirname C function. +.Pp +Synopsis +.Bd -literal -offset Ds +path = Irccd.File.dirname(path) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.El +.Pp +Returns +.Pp +The directory name. +.Ed +.\" }}} +.\" {{{ Irccd.File.exists +.Pp +Irccd.File.exists +.Bd -ragged -offset indent +Check if the file exists. +.Pp +Warning: using this function is usually discouraged as it may introduce a +possible race condition. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.File.exists(path) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +True if exists. +.Ed +.\" }}} +.\" {{{ Irccd.File.remove +.Pp +Irccd.File.remove +.Bd -ragged -offset indent +Remove the file at the specified path. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File.remove(path) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Ed +.\" }}} +.\" {{{ Irccd.File.stat +.Pp +Irccd.File.stat [optional] +.Bd -ragged -offset indent +Get file information at the specified path. +.Pp +Synopsis +.Bd -literal -offset Ds +info = Irccd.File.stat(path) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +An object with the following properties. Not all properties are available and +you must check its presence before using it. +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va atime No (int) +The last access time. +.It Va blksize No (int) +The block size. +.It Va blocks No (int) +The number of blocks. +.It Va ctime No (int) +The creation time. +.It Va dev No (int) +The device. +.It Va gid No (int) +The group numeric id. +.It Va ino No (int) +The inode. +.It Va mode No (int) +The mode. +.It Va mtime No (int) +The modification time. +.It Va nlink No (int) +The number of hard links. +.It Va rdev No (int) +No description available. +.It Va size No (int) +The file size. +.It Va uid No (int) +The user numeric id. +.El +.Ed +.\" }}} +.\" }}} !Functions +.\" {{{ Methods +.\" {{{ Irccd.File [constructor] +.Pp +Irccd.File [constructor] +.Bd -ragged -offset indent +Open a file specified by path with the specified mode. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File(path, mode) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa path No (string) +The path to the file. +.It Fa mode No (string) +The mode string. +.El +.Pp +The +.Fa mode +is the same as if called by fopen, see the documentation of +.Xr fopen 3 +for more information about modes. +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.basename +.Pp +Irccd.File.prototype.basename +.Bd -ragged -offset indent +Synonym of Irccd.File.basename static function but with the path taken from the +object itself. +.Pp +Synopsis +.Bd -literal -offset Ds +path = Irccd.File.prototype.basename() +.Ed +.Pp +Returns +.Pp +The base name. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.close +.Pp +Irccd.File.prototype.close +.Bd -ragged -offset indent +Force close of the file, automatically called when object is collected. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File.prototype.close() +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.dirname +.Pp +Irccd.File.prototype.dirname +.Bd -ragged -offset indent +Synonym of Irccd.File.dirname static function but with the path taken from the +object itself. +.Pp +Synopsis +.Bd -literal -offset Ds +path = Irccd.File.prototype.dirname() +.Ed +.Pp +Returns +.Pp +The directory name. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.lines +.Pp +Irccd.File.prototype.lines +.Bd -ragged -offset indent +Read all lines and return an array. +.Pp +Synopsis +.Bd -literal -offset Ds +list = Irccd.File.prototype.lines() +.Ed +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +An array with all lines. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.read +.Pp +Irccd.File.prototype.read +.Bd -ragged -offset indent +Read the specified amount of characters or the whole file. +.Pp +Synopsis +.Bd -literal -offset Ds +str = Irccd.File.prototype.read(amount) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa amount No (int) +The amount of characters or -1 to read all (Optional, default: -1). +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +The string. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.readline +.Pp +Irccd.File.prototype.readline +.Bd -ragged -offset indent +Read the next line available. +.Pp +Warning: this method is slow and its usage is discouraged on large files. +Consider using Irccd.File.prototype.lines function if you want to read a file +line per line. +.Pp +Synopsis +.Bd -literal -offset Ds +line = Irccd.File.prototype.readline() +.Ed +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +The next line or undefined if EOF. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.remove +.Pp +Irccd.File.prototype.remove +.Bd -ragged -offset indent +Synonym of Irccd.File.remove static function but with the path taken from the +object itself. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File.prototype.remove() +.Ed +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.seek +.Pp +Irccd.File.prototype.seek +.Bd -ragged -offset indent +Sets the position in the file. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File.prototype.seek(type, amount) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa type No (int) +The type of setting +.Fa ( Irccd.File.SeekSet , Irccd.File.SeekCur , Irccd.File.SeekSet ) . +.It Fa amount No (int) +The new offset. +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.stat +.Pp +Irccd.File.prototype.stat [optional] +.Bd -ragged -offset indent +Synonym of Irccd.File.stat static function but with the path taken from the +object itself. +.Pp +Synopsis +.Bd -literal -offset Ds +info = Irccd.File.prototype.stat() +.Ed +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +The information object. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.tell +.Pp +Irccd.File.prototype.tell +.Bd -ragged -offset indent +Get the actual position in the file. +.Pp +Synopsis +.Bd -literal -offset Ds +pos = Irccd.File.prototype.tell() +.Ed +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +The position. +.Ed +.\" }}} +.\" {{{ Irccd.File.prototype.write +.Pp +Irccd.File.prototype.write +.Bd -ragged -offset indent +Write some characters to the file. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.File.prototype.write(data) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa data No (string) +The character to write. +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +The number of bytes written. +.Ed +.\" }}} +.\" }}} !Methods +.\" }}} !Module: Irccd.File +.\" {{{ Module: Irccd.Logger +.Ss Irccd.Logger +This module must be used to log something. It will add messages to the logging +system configured in the irccd.conf file. +.Pp +For instance, if user has chosen to log into syslog, this module will log at +syslog too. +.Pp +Any plugin can log messages, the message will be prepended by the plugin name to +be easily identifiable. +.\" {{{ Functions +.\" {{{ Irccd.Logger.debug +.Pp +Irccd.Logger.debug +.Bd -ragged -offset indent +Adds a debug message, this is only appended to the journal if irccd was compiled +in Debug mode. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Logger.debug(message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa message No (string) +The message. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Logger.info +.Pp +Irccd.Logger.info +.Bd -ragged -offset indent +Log something. The message is logged only if irccd is running with verbose +messages enabled. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Logger.info(message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa message No (string) +The message. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Logger.warning +.Pp +Irccd.Logger.warning +.Bd -ragged -offset indent +Log a warning. The message will always be logged. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Logger.warning(message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa message No (string) +The message. +.El +.Ed +.\" }}} +.\" }}} !Functions +.\" }}} !Module: Irccd.Logger +.\" {{{ Module: Irccd.Plugin +.Ss Irccd.Plugin +This module let you manage plugins. +.Pp +.\" {{{ Constants +The following constants properties are defined and contain each key-value pairs +from the user configuration file. +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va config No (Object) +Contains the +.Va [plugin.] +section. +.It Va paths No (Object) +Contains the +.Va [paths.] +section. +.It Va templates No (Object) +Contains the +.Va [format.] +section. +.El +.\" }}} !Constants +.\" {{{ Functions +.\" {{{ Irccd.Plugin.info +.Pp +Irccd.Plugin.info +.Bd -ragged -offset indent +Get information about a plugin. +.Pp +Synopsis +.Bd -literal -offset Ds +info = Irccd.Plugin.info(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The plugin identifier, if not specified the current plugin is selected. +.El +.Pp +Returns +.Pp +The plugin information or undefined if the plugin was not found. The object has +the following properties: +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va name No (string) +The plugin identifier. +.It Va author No (string) +The author. +.It Va license No (string) +The license. +.It Va summary No (string) +A short description. +.It Va version No (string) +The version. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Plugin.list +.Pp +Irccd.Plugin.list +.Bd -ragged -offset indent +Get the list of plugins, the array returned contains all plugin names as +strings. +.Pp +Synopsis +.Bd -literal -offset Ds +list = Irccd.Plugin.list() +.Ed +.Pp +Returns +.Pp +The list of all plugin names. +.Ed +.\" }}} +.\" {{{ Irccd.Plugin.load +.Pp +Irccd.Plugin.load +.Bd -ragged -offset indent +Load a plugin by name. This function will search through the standard +directories. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Plugin.load(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The plugin identifier. +.El +.Pp +Throws +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va Error +On errors. +.It Va ReferenceError +If the plugin was not found. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Plugin.reload +.Pp +Irccd.Plugin.reload +.Bd -ragged -offset indent +Reload a plugin by name. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Plugin.reload(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The plugin identifier. +.El +.Pp +Throws +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va Error +On errors. +.It Va ReferenceError +If the plugin was not found. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Plugin.unload +.Pp +Irccd.Plugin.unload +.Bd -ragged -offset indent +Unload a plugin by name and remove it. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Plugin.unload(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The plugin identifier. +.El +.Pp +Throws +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va Error +On errors. +.It Va ReferenceError +If the plugin was not found. +.El +.Ed +.\" }}} +.\" }}} !Functions +.\" }}} !Module: Irccd.Plugin +.\" {{{ Module: Irccd.Server +.Ss Irccd.Server +This module is the object that you received in almost all IRC event +(e.g. onConnect). You can use its methods to do your required actions on the +server. +.\" {{{ Functions +.\" {{{ Irccd.Server.add +.Pp +Irccd.Server.add +.Bd -ragged -offset indent +Add a new server to the irccd instance. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.add(server) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa server No (Server) +The server object to add. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.find +.Pp +Irccd.Server.find +.Bd -ragged -offset indent +Find a server by name. +.Pp +Synopsis +.Bd -literal -offset Ds +server = Irccd.Server.find(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The server name. +.El +.Pp +Returns +.Pp +The server object or undefined if not found. +.Ed +.\" }}} +.\" {{{ Irccd.Server.list +.Pp +Irccd.Server.list +.Bd -ragged -offset indent +List all servers in a map. +.Pp +Synopsis +.Bd -literal -offset Ds +table = Irccd.Server.list() +.Ed +.Pp +Returns +.Pp +The table of all servers as key-value pairs where key is the server identifier +and value the object itself. +.Ed +.\" }}} +.\" {{{ Irccd.Server.remove +.Pp +Irccd.Server.remove +.Bd -ragged -offset indent +Remove a server from the irccd instance and disconnect it. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.remove(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The server name. +.El +.Ed +.\" }}} +.\" }}} !Functions +.\" {{{ Methods +.\" {{{ Irccd.Server [constructor] +.Pp +Irccd.Server [constructor] +.Bd -ragged -offset indent +Construct a new server. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server(info) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa info No (object) +Object information. +.El +.Pp +The +.Fa info +argument may have the following properties: +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The unique identifier name. +.It Fa hostname No (string) +The host or IP address. +.It Fa ipv4 No (bool) +Enable ipv4 (Optional, default: true). +.It Fa ipv6 No (bool) +Enable ipv6, (Optional, default: true). +.It Fa port No (int) +The port number, (Optional, default: 6667). +.It Fa password No (string) +The password, (Optional, default: undefined). +.It Fa channels No (array) +Array of channels (Optional, default: empty). +.It Fa ssl No (bool) +True to use ssl, (Optional, default: false). +.It Fa nickname No (string) +Nickname, (Optional, default: irccd). +.It Fa username No (string) +User name, (Optional, default: irccd). +.It Fa realname No (string) +Real name, (Optional, default: IRC Client Daemon). +.It Fa commandChar No (string) +Plugin prefix character, (Optional, default: "!"). +.El +.Pp +Warning: at least ipv4 and ipv6 must be set (which is the default). +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.info +.Pp +Irccd.Server.prototype.info +.Bd -ragged -offset indent +Get server information. +.Pp +Synopsis +.Bd -literal -offset Ds +info = Irccd.Server.prototype.info() +.Ed +.Pp +Returns +.Pp +The server information. The object have the following properties: +.Bl -tag -width 20n -compact -offset Ds +.It Va name No (string) +The server unique name. +.It Va hostname No (string) +The host name. +.It Va port No (int) +The port number. +.It Va ssl No (bool) +True if using ssl. +.It Va channels No (array) +An array of all channels. +.It Va realname No (string) +The current real name. +.It Va username No (string) +The user name. +.It Va nickname No (string) +The current nickname. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.invite +.Pp +Irccd.Server.prototype.invite +.Bd -ragged -offset indent +Invite the specified target on the channel. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.invite(target, channel) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa target No (string) +The target to invite. +.It Fa channel No (string) +The channel. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.isSelf +.Pp +Irccd.Server.prototype.isSelf +.Bd -ragged -offset indent +Check if the nickname targets the bot. +.Pp +Synopsis +.Bd -literal -offset Ds +res = Server.prototype.isSelf(nickname) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa nickname No (string) +The nickname to check. +.El +.Pp +Returns +.Pp +True if nickname is same as the bot. +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.join +.Pp +Irccd.Server.prototype.join +.Bd -ragged -offset indent +Join the specified channel, the password is optional. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.join(channel, password) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa channel No (string) +The channel to join. +.It Fa password No (string) +An optional password. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.kick +.Pp +Irccd.Server.prototype.kick +.Bd -ragged -offset indent +Kick the specified target from the channel, the reason is optional. +.Pp +Synopsis +.Bd -literal -offset Ds +Server.prototype.kick(nickname, channel, reason) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa nickname No (string) +The person to kick. +.It Fa channel No (string) +From which channel. +.It Fa reason No (string) +A reason (Optional, default: undefined). +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.me +.Pp +Irccd.Server.prototype.me +.Bd -ragged -offset indent +Send an action emote. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.me(target, message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa target No (string) +A nick or a channel. +.It Fa message No (string) +The message to send. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.message +.Pp +Irccd.Server.prototype.message +.Bd -ragged -offset indent +Send a message to the specified target or channel. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.message(target, message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa target No (string) +The target. +.It Fa message No (string) +The message to send. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.mode +.Pp +Irccd.Server.prototype.mode +.Bd -ragged -offset indent +Change irccd's user mode or a channel mode. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.mode(channel, mode, limit, user, mode) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa channel No (string) +A channel or your nicknam. +.It Fa mode No (string) +The new mode. +.It Fa limit No (string) +An optional limit. +.It Fa user No (string) +An optional use. +.It Fa mask No (string) +An optional mas. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.names +.Pp +Irccd.Server.prototype.names +.Bd -ragged -offset indent +Get the list of names. This function will generate the onNames event. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.names(channel) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa channel No (string) +The channel name. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.nick +.Pp +Irccd.Server.prototype.nick +.Bd -ragged -offset indent +Change irccd's nickname. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.nick(nickname) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa nickname No (string) +The new nickname. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.notice +.Pp +Irccd.Server.prototype.notice +.Bd -ragged -offset indent +Send a private notice to the specified target. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.notice(nickname, message) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa nickname No (string) +The target nickname. +.It Fa message No (string) +The notice message. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.part +.Pp +Irccd.Server.prototype.part +.Bd -ragged -offset indent +Leave the specified channel, the reason is optional. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.part(channel, reason) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa channel No (string) +The channel to leave. +.It Fa reason No (string) +A reason (Optional, default: undefined). +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.toString +.Pp +Irccd.Server.prototype.toString +.Bd -ragged -offset indent +Convert object as a string. +.Pp +Because each server has a unique identifier, this method allows adding a server +a property key. +.Pp +Synopsis +.Bd -literal -offset Ds +id = Irccd.Server.prototype.toString() +.Ed +.Pp +Returns +.Pp +The server identifier. +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.topic +.Pp +Irccd.Server.prototype.topic +.Bd -ragged -offset indent +Change the topic of the specified channel. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.topic(channel, topic) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa channel No (string) +The channel. +.It Fa topic No (string) +The new topic. +.El +.Ed +.\" }}} +.\" {{{ Irccd.Server.prototype.whois +.Pp +Irccd.Server.prototype.whois +.Bd -ragged -offset indent +Get whois information from a user. The function will generate onWhois event. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Server.prototype.whois(target) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa target No (string) +The target. +.El +.Ed +.\" }}} +.\" }}} !Methods +.\" }}} !Module: Irccd.Server +.\" {{{ Module: Irccd.System +.Ss Irccd.System +System inspection. +.Pp +Use this module if you want to inspect the system independently. +.\" {{{ Functions +.\" {{{ Irccd.System.env +.Pp +Irccd.System.env +.Bd -ragged -offset indent +Get a environment variable. +.Pp +Synopsis +.Bd -literal -offset Ds +value = Irccd.System.env(name) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa name No (string) +The environment variable name. +.El +.Pp +Returns +.Pp +The variable or an empty string. +.Ed +.\" }}} +.\" {{{ Irccd.System.exec +.Pp +Irccd.System.exec +.Bd -ragged -offset indent +Execute a system command. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.System.exec(cmd) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa cmd No (string) +The command to execute. +.El +.Ed +.\" }}} +.\" {{{ Irccd.System.home +.Pp +Irccd.System.home +.Bd -ragged -offset indent +Get the home directory. This function should be used with care, plugin should +not use user's home to store files. +.Pp +Synopsis +.Bd -literal -offset Ds +home = Irccd.System.home() +.Ed +.Pp +Returns +.Pp +The user home directory. +.Ed +.\" }}} +.\" {{{ Irccd.System.name +.Pp +Irccd.System.name +.Bd -ragged -offset indent +Get the operating system name. Returns one of: +.Pp +.Bl -bullet -compact +.It +Linux +.It +Windows +.It +FreeBSD +.It +DragonFlyBSD +.It +OpenBSD +.It +NetBSD +.It +macOS +.It +Android +.It +Aix +.It +Haiku +.It +iOS +.It +Solaris +.It +Unknown +.El +.Pp +Synopsis +.Bd -literal -offset Ds +name = Irccd.System.name() +.Ed +.Pp +Returns +.Pp +The operating system name. +.Ed +.\" }}} +.\" {{{ Irccd.System.popen [optional] +.Pp +Irccd.System.popen [optional] +.Bd -ragged -offset indent +Wrapper for +.Xr popen 3 +if the function is available. +.Pp +Synopsis +.Bd -literal -offset Ds +handle = Irccd.System.popen(cmd, mode) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa cmd No (string) +The command to execute. +.It Fa mode No (string) +The mode (e.g. r). +.El +.Pp +Throws +.Pp +Irccd.SystemError on failure. +.Pp +Returns +.Pp +An Irccd.File object. +.Ed +.\" }}} +.\" {{{ Irccd.System.sleep +.Pp +Irccd.System.sleep +.Bd -ragged -offset indent +Sleep for seconds. Suspend the execution thread. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.System.sleep(sec) +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.System.ticks +.Pp +Irccd.System.ticks +.Bd -ragged -offset indent +Get the time spent from start. Get how many milliseconds spent since the irccd +startup. +.Pp +Synopsis +.Bd -literal -offset Ds +msec = Irccd.System.ticks() +.Ed +.Pp +Returns +.Pp +The number of milliseconds. +.Ed +.\" }}} +.\" {{{ Irccd.System.uptime +.Pp +Irccd.System.uptime +.Bd -ragged -offset indent +Get the system uptime. This function returns the number of seconds elapsed since +the system boot up. +.Pp +Synopsis +.Bd -literal -offset Ds +secs = Irccd.System.uptime() +.Ed +.Pp +Returns +.Pp +The number of seconds. +.Ed +.\" }}} +.\" {{{ Irccd.System.usleep +.Pp +Irccd.System.usleep +.Bd -ragged -offset indent +Sleep for milliseconds. Suspend the execution thread. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.System.usleep(msec) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa msec No (int) +The number of milliseconds. +.El +.Ed +.\" }}} +.\" {{{ Irccd.System.version +.Pp +Irccd.System.version +.Bd -ragged -offset indent +Get the operating system version. Result of this function is system dependant. +.Pp +Synopsis +.Bd -literal -offset Ds +version = Irccd.System.version() +.Ed +.Pp +Returns +.Pp +The version as a string. +.Ed +.\" }}} +.\" }}} !Functions +.\" }}} !Module: Irccd.System +.\" {{{ Module: Irccd.Timer +.Ss Irccd.Timer +Create repetitive or one-shot timers. +.Pp +.\" {{{ Constants +The following constants properties are defined: +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va Single No (int) +The timer is single-shot. +.It Va Repeat No (int) +The timer is looping. +.El +.\" }}} +.\" {{{ Methods +.\" {{{ Irccd.Timer [constructor] +.Pp +Irccd.Timer [constructor] +.Bd -ragged -offset indent +Create a new timer object but do not start it immediately. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Timer(type, delay, callback) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa type No (int) +Type of timer ( +.Fa Irccd.Timer.Repeat +or +.Fa Irccd.Timer.Single ) . +.It Fa delay No (int) +The interval in milliseconds. +.It Fa callback No (function) +The function to call. +.El +.Pp +Example: +.Bd -literal -offset Ds +var t = new Irccd.Timer(Irccd.Timer.Repeat, 1000, function () { + // Do your action, this will be called every 1 second. +}); +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Timer.prototype.start +.Pp +Irccd.Timer.prototype.start +.Bd -ragged -offset indent +Start the timer. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Timer.prototype.start() +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Timer.prototype.stop +.Pp +Irccd.Timer.prototype.stop +.Bd -ragged -offset indent +Stop the timer. +.Pp +Synopsis +.Bd -literal -offset Ds +Irccd.Timer.prototype.stop() +.Ed +.Ed +.\" }}} +.\" }}} !Methods +.\" }}} !Module: Irccd.Timer +.\" {{{ Module: Irccd.Unicode +.Ss Irccd.Unicode +Check for character categories. +.\" {{{ Functions +.\" {{{ Irccd.Unicode.isDigit +.Pp +Irccd.Unicode.isDigit +.Bd -ragged -offset indent +Check if the unicode character is a digit. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isDigit(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if digit. +.Ed +.\" }}} +.\" {{{ Irccd.Unicode.isLetter +.Pp +Irccd.Unicode.isLetter +.Bd -ragged -offset indent +Check if the unicode character is a letter. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isLetter(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if letter. +.Ed +.\" }}} +.\" {{{ Irccd.Unicode.isLower +.Pp +Irccd.Unicode.isLower +.Bd -ragged -offset indent +Check if the unicode character is lower case. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isLower(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if lower case. +.Ed +.\" }}} !Functions +.\" {{{ Irccd.Unicode.isSpace +.Pp +Irccd.Unicode.isSpace +.Bd -ragged -offset indent +Check if the unicode character is a space. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isSpace(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if space. +.Ed +.\" }}} +.\" {{{ Irccd.Unicode.isTitle +.Pp +Irccd.Unicode.isTitle +.Bd -ragged -offset indent +Check if the unicode character is title case. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isTitle(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if title case. +.Ed +.\" }}} +.\" {{{ Irccd.Unicode.isUppwer +.Pp +Irccd.Unicode.isUpper +.Bd -ragged -offset indent +Check if the unicode character is upper case. +.Pp +Synopsis +.Bd -literal -offset Ds +ret = Irccd.Unicode.isUpper(code) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa code No (string) +The code point. +.El +.Pp +Returns +.Pp +True if upper case. +.Ed +.\" }}} +.\" }}} !Functions +.\" }}} !Module: Irccd.Unicode +.\" {{{ Module: Irccd.Util +.Ss Irccd.Util +Various utilities. +.\" {{{ Functions +.\" {{{ Irccd.Util.cut +.Pp +Irccd.Util.cut +.Bd -ragged -offset indent +Cut a piece of data into several lines. +.Pp +The argument +.Fa data +is a string or a list of strings. In any case, all strings are first splitted by +spaces and trimmed. This ensure that useless whitespaces are discarded. +.Pp +The argument +.Fa maxc +controls the maximum of characters allowed per line, it can be a positive +integer. If undefined is given, a default of 72 is used. +.Pp +The argument +.Fa maxl +controls the maximum of lines allowed. It can be a positive integer or undefined +for an infinite list. +.Pp +If +.Fa maxl +is used as a limit and the data can not fit within the bounds, +undefined is returned. +.Pp +An empty list may be returned if empty strings were found. +.Pp +Synopsis +.Bd -literal -offset Ds +lines = Irccd.Util.cut(data, maxc, maxl) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa data No (mixed) +A string or an array of strings. +.It Fa maxc No (int) +Max number of colums (Optional, default: 72). +.It Fa maxl No (int) +Max number of lines (Optional, default: undefined). +.El +.Pp +Throws +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Va RangeError +If maxl or maxc are negative numbers. +.It Va RangeError +If one word length was bigger than maxc. +.It Va TypeError +If data is not a string or a list of strings. +.El +.Pp +Returns +.Pp +A list of strings ready to be sent or undefined if the data is too big. +.Ed +.\" }}} +.\" {{{ Irccd.Util.format +.Pp +Irccd.Util.format +.Bd -ragged -offset indent +Format a string according to the template system. +.Pp +See the documentation about the template format in +.Xr irccd-templates 7 . +.Pp +Synopsis +.Bd -literal -offset Ds +str = Irccd.Util.format(input, params) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa input No (string) +The text to update. +.It Fa params No (Object) +The parameters. For each keyword you want to replace in the +.Ar input , +add a new entry into the object. Note: the special +.Va date +object key is reserved and must be set to a timestamp if desired. +.El +.Pp +Returns +.Pp +The converted text. +.Pp +Remarks +.Pp +Be very careful when you use this function with untrusted input. Do never pass +untrusted content (e.g. user message) as input parameter. +.Pp +For example, the following code is unsafe: +.Bd -literal -offset Ds +function onMessage(server, channel, origin, message) +{ + // DON'T DO THIS. + server.message(channel, Irccd.Util.format("@{red}" + message + "@{}"); +} +.Ed +.Pp +If a user sends a message like ${HOME}, it will prints the user home directory, +which is a high security issue if you have environment variables with passwords. +.Pp +Instead, always use a literal string using a replacement with the user input: +.Bd -literal -offset Ds +function onMessage(server, channel, origin, message) +{ + // CORRECT. + server.message(channel, Irccd.Util.format("@{red}#{message}@{}", { + message: message + }); +} +.Ed +.Ed +.\" }}} +.\" {{{ Irccd.Util.splithost +.Pp +Irccd.Util.splithost +.Bd -ragged -offset indent +Extract the host from a user, for instance with foo!~foo@localhost, +.Em localhost +will be returned. +.Pp +Synopsis +.Bd -literal -offset Ds +hostname = Irccd.Util.splithost(user) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa user No (string) +The user to split. +.El +.Pp +Returns +.Pp +The host +.Ed +.\" }}} +.\" {{{ Irccd.Util.splituser +.Pp +Irccd.Util.splituser +.Bd -ragged -offset indent +Extract the name from a user, for instance with foo!~bar@localhost, +.Em foo +will be returned. +.Pp +Synopsis +.Bd -literal -offset Ds +nick = Irccd.Util.splituser(user) +.Ed +.Pp +Arguments +.Pp +.Bl -tag -width 20n -compact -offset Ds +.It Fa user No (string) +The user to split. +.El +.Pp +Returns +.Pp +The nickname. +.Ed +.\" }}} +.\" }}} !Functions +.\" }}} !Module: Irccd.Util +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd-ipc.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd-ipc.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,601 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-API 7 +.Os +.\" NAME +.Sh NAME +.Nm irccd-api +.Nd irccd network protocol +.\" DESCRIPTION +.Sh DESCRIPTION +This guide will help you controlling irccd via sockets. +.Pp +For this to work, you need to define at least one transport in your +.Pa irccd.conf +file, for more information see +.Xr irccd.conf 5 . +.Pp +Most of the commands are similar to +.Nm irccdctl +and mapped to the same network command. For more detailed information about each +command, take a look at +.Xr irccdctl 1 +before. +.\" SYNTAX +.Sh SYNTAX +Irccd use JSON as protocol for sending and receiving data. A message must ends +with +.Em \er\en\er\en +to be complete, thus it's possible to write JSON messages in multiple lines. +.Pp +For example, this buffer will be parsed as two different messages. +.Bd -literal -offset Ds +{ + "param1": "value1" +} + +{ + "param1": "value1" +} +.Ed +.Pp +Warning: please note that the \er\en\er\en characters are the escape characters +of line feed and new line, not the concatenation of \e and r. +.\" RESPONSES +.Sh RESPONSES +All commands emit a response with the following properties: +.Pp +.Bl -tag -width 24n -offset Ds +.It Va command No (string) +the result of the issued command. +.It Va error No (int) +the error error code, not defined on success. +.It Va errorCategory No (string) +the error category (example: server, plugin). +.It Va errorMessage No (string) +the arbitrary error message. +.El +.Pp +Example with a successful message: +.Bd -literal -offset Ds +{ + "command": "server-message", +} +.Ed +.Pp +Example with an error: +.Bd -literal -offset Ds +{ + "command": "server-message", + "error": 1, + "errorCagegory": "server", + "errorMessage": "server not found" +} +.Ed +.Sh COMMANDS +.\" COMMANDS +The following commands are available. +.Bl -tag -width xxxxxxxx-yyyyyyyyy +.\" plugin-config +.It Cm plugin-config +Set or get values to a plugin. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-config . +.It Va plugin No (string) +plugin identifier. +.It Va variable No (string) +the variable (Optional, default: undefined). +.It Va value No (string) +the value (Optional, default: undefined) +.El +.Pp +The following properties are available in a successful response when getting a +value: +.Pp +.Bl -tag -width 20n +.It Va variables No (list) +All values or unique variable. +.El +.\" plugin-info +.It Cm plugin-info +Retrieve plugin information. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-info . +.It Va plugin No (string) +plugin identifier. +.El +.Pp +The following properties are available in a successful response: +.Bl -tag -width 20n +.It Va author No (string) +author name. +.It Va license No (string) +plugin license. +.It Va summary No (string) +plugin description. +.It Va version No (string) +arbitrary version. +.El +.\" plugin-list +.It Cm plugin-list +Get the list of all loaded plugins. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-list . +.El +.Pp +The following properties are available in a successful response: +.Bl -tag -width 20n +.It Va list No (list) +a list of plugin names. +.El +.\" plugin-load +.It Cm plugin-load +Load a plugin by searching it. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-load . +.It Va plugin No (identifier) +the plugin identifier. +.El +.\" plugin-reload +.It Cm plugin-reload +Reload a plugin. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-reload . +.It Va plugin No (identifier) +the plugin identifier. +.El +.\" plugin-unload +.It Cm plugin-unload +Unload a plugin. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em plugin-unload . +.It Va plugin No (identifier) +the plugin identifier. +.El +.\" rule-add +.It Cm rule-add +Add a new rule. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-add . +.It Va channels No (list) +a list of channels to match (Optional, default: undefined). +.It Va events No (list) +a list of events to match (Optional, default: undefined). +.It Va origins No (list) +a list of origins to match (Optional, default: undefined). +.It Va plugins No (list) +a list of plugins to match (Optional, default: undefined). +.It Va servers No (list) +a list of servers to match (Optional, default: undefined). +.It Va action No (string) +must be accept or drop. +.It Va index No (unsigned) +rule index (Optional, default: undefined). +.El +.\" rule-edit +.It Cm rule-edit +Edit a rule in place. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-edit . +.It Va add-channels No (list) +a list of channels to match (Optional, default: undefined). +.It Va add-events No (list) +a list of events to match (Optional, default: undefined). +.It Va add-origins No (list) +a list of origins to match (Optional, default: undefined). +.It Va add-plugins No (list) +a list of plugins to match (Optional, default: undefined). +.It Va add-servers No (list) +a list of servers to match (Optional, default: undefined). +.It Va remove-channels No (list) +a list of channels to unmatch (Optional, default: undefined). +.It Va remove-events No (list) +a list of events to unmatch (Optional, default: undefined). +.It Va remove-origins No (list) +a list of origins to unmatch (Optional, default: undefined). +.It Va remove-plugins No (list) +a list of plugins to unmatch (Optional, default: undefined). +.It Va remove-servers No (list) +a list of servers to unmatch (Optional, default: undefined). +.It Va action No (string) +can be accept or drop (Optional, default: undefined). +.It Va index No (unsigned) +rule index. +.El +.\" rule-info +.It Cm rule-info +Show information about a rule. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-info . +.It Va index No (unsigned) +rule index. +.El +.Pp +The following properties are available in a successful response: +.Bl -tag -width 20n +.It Va servers No (list) +a list of servers matched. +.It Va channels No (list) +a list of channels matched. +.It Va origins No (list) +a list of origins matched. +.It Va plugins No (list) +a list of plugins matched. +.It Va events No (list) +a list of events matched. +.It Va action No (string) +rule action, accept or drop. +.El +.\" rule-list +.It Cm rule-list +Get a list of rules. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-list . +.El +.Pp +The following properties are available in a successful response: +.Bl -tag -width 20n +.It Va list (list) +a list of object that contain the same information as +.Cm rule-info +command was invoked. +.El +.\" rule-move +.It Cm rule-move +Move a rule. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-move . +.It Va from No (int) +the source index. +.It Va to No (int) +the destination index. +.El +.\" rule-remove +.It Cm rule-remove +Remove a rule. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em rule-remove . +.It Va index No (int) +rule index. +.El +.\" server-connect +.It Cm server-connect +Connect to a server. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Em server-connect . +.It Va name No (string) +the server unique id. +.It Va hostname No (string) +the host address. +.It Va port No (int) +the port number (Optional, default: 6667). +.It Va ssl No (bool) +use SSL (Optional, default: false). +.It Va nickname No (string) +the nickname to use (Optional, default: irccd). +.It Va username No (string) +the user name to use (Optional, default: irccd). +.It Va realname No (string) +the real name to use. (Optional, default: IRC Client Daemon). +.It Va ctcpVersion No (string) +the CTCP Version to answer. (Optional, default: the irccd's version), +.It Va commandChar No (string) +the command character to use to invoke command. (Optional, default: !). +.El +.\" server-disconnect +.It Cm server-disconnect +Disconnect from a server. +.Pp +If server is not specified, irccd disconnects all servers. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-disconnect . +.It Va server No (string) +the server unique id (Optional, default: none). +.El +.\" server-info +.It Cm server-info +Get server information. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-info . +.It Va server No (string) +the server unique id. +.El +.Pp +The following properties are available in a successful response: +.Bl -tag -width 20n +.It Va name No (string) +the server unique id. +.It Va hostname No (string) +the server hostname. +.It Va port No (int) +the port. +.It Va ipv4 No (bool) +true if using IPv6. +.It Va ipv6 No (bool) +true if using IPv6. +.It Va ssl No (bool) +true if connection is using SSL. +.It Va channels No (list) +list of channels. +.It Va nickname No (string) +the current nickname in use. +.It Va username No (string) +the username in use. +.It Va realname No (string) +the realname in use. +.El +.\" server-invite +.It Cm server-invite +Invite the specified target on the channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-invite . +.It Va server No (string) +the server unique id. +.It Va target No (string) +the nickname to invite. +.It Va channel No (string) +the channel. +.El +.\" server-join +.It Cm server-join +Join the specified channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-join . +.It Va server No (string) +the server unique id. +.It Va channel No (string) +the channel to join. +.It Va password No (string) +the password (Optional, default: none). +.El +.\" server-kick +.It Cm server-kick +Kick the specified target from the channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-kick . +.It Va server No (string) +the server unique id. +.It Va target No (string) +the target nickname. +.It Va channel No (string) +the channel. +.It Va reason No (string) +the reason (Optional, default: none). +.El +.\" server-list +.It Cm server-list +Get the list of all connected servers. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-list . +.El +.Pp +The following properties are available in a successful response: +.Pp +.Bl -tag -width 20n +.It Va list No (list) +the list of all server unique ids as integers. +.El +.\" server-me +.It Cm server-me +Send an action emote. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-me . +.It Va server No (string) +the server unique id. +.It Va target No (string) +the target or channel. +.It Va message No (string) +the message. +.El +.\" server-message +.It Cm server-message +Send a message to the specified target or channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-message . +.It Va server No (string) +the server unique id. +.It Va target No (string) +the target or channel. +.It Va message No (string) +the message. +.El +.\" server-mode +.It Cm server-mode +Change channel or bot mode. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-mode . +.It Va server No (string) +the server unique id. +.It Va channel No (string) +the channel or irccd's nickname +.It Va mode No (string) +the mode. +.It Va limit No (string) +a optional limit. +.It Va user No (string) +a optional user. +.It Va mask No (string) +a optional mask. +.El +.\" server-nick +.It Cm server-nick +Change irccd's nickname. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-nick . +.It Va server No (string) +the server unique id. +.It Va nickname No (string) +the new nickname. +.El +.\" server-notice +.It Cm server-notice +Send a private notice to the specified target. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-notice . +.It Va server No (string) +the server unique id. +.It Va target No (string) +the target. +.It Va message No (string) +the notice message. +.El +.\" server-part +.It Cm server-part +Leave the specified channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-part . +.It Va server No (string) +the unique server id. +.It Va channel No (string) +the channel to leave. +.It Va reason No (string) +the reason (Optional, default: none). +.El +.\" server-reconnect +.It Cm server-reconnect +Force reconnection of one or all servers. +.Pp +If server is not specified, all servers will try to reconnect. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-reconnect . +.It Va server No (string) +the server unique id (Optional, default: none). +.El +.\" server-topic +.It Cm server-topic +Change the topic of the specified channel. +.Pp +Available properties: +.Bl -tag -width 20n +.It Va command No (string) +must be +.Ar server-topic . +.It Va server No (string) +the unique server id. +.It Va channel No (string) +the channel. +.It Va topic No (string) +the new topic. +.El +.El +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd-templates.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd-templates.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,230 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-TEMPLATES 7 +.Os +.\" NAME +.Sh NAME +.Nm irccd-templates +.Nd irccd formatting and common patterns +.\" DESCRIPTION +.Sh DESCRIPTION +Plugins can be configured using a powerful template syntax, this allows editing +the plugin messages to override them. +.Pp +The syntax is +.Ar \&?{} +where +.Ar \&? +is replaced by one of the token defined below. Braces are mandatory and cannot +be ommited. To write a literal template construct, prepend the token twice. +.Pp +The following templates are available: +.Bl -tag -width 14n +.It Ar % +date and time (see Time section). +.It Ar #{name} +name will be substituted from the keywords (see Keywords section). +.It Ar ${name} +name will be substituted from the environment variable (see Environment +variables). +.It Ar @{attributes} +the attributes will be substituted to IRC colors (see Attributes). +.El +.\" TIME +.Sh TIME +The date and time format may be used just like +.Xr strftime 3 +so for the hours and minutes, you can write %H:%M. +.\" ENVIRONMENT VARIABLES +.Sh ENVIRONMENT VARIABLES +If supported, you can use environment variables like ${HOME}. Please note +that braces are mandatory. +.\" IRC ATTRIBUTES +.Sh IRC ATTRIBUTES +The attribute format is composed of three parts, foreground, background and +modifiers, each separated by a comma. +.Pp +Note: attributes and colors are not supported by all IRC clients. +.Pp +Warning: do not use colors and attributes outside IRC (e.g. for storing text in +files) because escape codes are only valid in IRC context. +.Ss Available colors +.Bl -bullet -compact +.It +white +.It +black +.It +blue +.It +green +.It +red +.It +brown +.It +purple +.It +orange +.It +yellow +.It +lightgreen +.It +cyan +.It +lightcyan +.It +lightblue +.It +pink +.It +grey +.It +lightgrey +.El +.Ss Available attributes +.Bl -bullet -compact +.It +bold +.It +italic +.It +strike +.It +reset +.It +underline +.It +underline2 +.It +reverse +.El +.\" SHELL ATTRIBUTES +.Sh SHELL ATTRIBUTES +Like IRC attributes, it's possible to specify colors and attributes in some +places such as logger configuration. +.Pp +Warning: colors are not supported on all platforms. +.Ss Available colors +.Bl -bullet -compact +.It +black +.It +red +.It +green +.It +orange +.It +blue +.It +purple +.It +cyan +.It +white +.It +default +.El +.Ss Available attributes +.Bl -bullet -compact +.It +bold +.It +dim +.It +underline +.It +blink +.It +reverse +.It +hidden +.El +.\" KEYWORDS +.Sh KEYWORDS +Keywords are arbitrary names that are replaced depending on the context. They +are usually available to configure plugins. +.Ss Predefined keywords +Here's the list of keywords that a lot of plugins uses: +.Bl -tag -width 12n +.It Va #{channel} +the channel name, +.It Va #{command} +the command to invoke the plugin, e.g. `!ask`, +.It Va #{message} +a message (depending on context), +.It Va #{origin} +the full user, e.g. `markand!~mkd@localhost`, +.It Va #{nickname} +the short nickname, +.It Va #{plugin} +the plugin name, +.It Va #{server} +the current server name, +.It Va #{topic} +the topic, +.It Va #{target} +a target, e.g. a person who gets kicked. +.El +.Pp +Warning: these keywords can be overriden by plugins. +.\" EXAMPLES +.Sh EXAMPLES +Valid constructs: +.Bl -tag -width 20n -offset Ds +.It #{target}, welcome +if target is set to "irccd", becomes "irccd, welcome". +.It @{red}#{target} +if target is specified, it is written in red. +.El +.Pp +Invalid or literals constructs: +.Bl -tag -width 20n -offset Ds +.It #{target} +will output "#{target}". +.It ## +will output "##". +.It #target +will output "#target". +.It #{target +will cause an error. +.El +.Pp +Colors & attributes: +.Bl -tag -width 20n -offset Ds +.It @{red,blue} +will write text red on blue background, +.It @{default,yellow} +will write default color text on yellow background, +.It @{white,black,bold,underline} +will write white text on black in both bold and underline. +.El +.Pp +For instance, using the logger plugin, it's possible to customize the pattern to +use when someone joins a channel like that: +.Bd -literal -offset Ds +#{origin} joined #{channel} +.Ed +.Pp +The keyword #{origin} will be substituted to the nickname and #{channel} to the +channel name. +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd.conf 5 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd-test.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd-test.1 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,118 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-TEST 1 +.Os +.\" NAME +.Sh NAME +.Nm irccd-test +.Nd irccd plugin tester +.\" SYNOPSIS +.Sh SYNOPSIS +.Nm irccd-test +.Op Fl c Ar config +.Ar id|path +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm irccd-test +program is a simple utility to test plugins on the command line. +.Pp +You can test a global plugin by just specifying plugin's +.Ar id +or using a full filesystem +.Ar path . +.Pp +It opens a prompt that waits for user input, each line consist of a specific +plugin event. These are mostly the same as the Javascript API offers. +.Pp +If compiled with libedit library, the prompt offers basic completion for the +plugin events. +.Pp +When a event requires a server, a fake debugging server is created if it does +not exists already. That fake server simply prints every command on the command +line instead of sending them through IRC. +.\" COMMANDS +.Sh COMMANDS +The following commands are allowed as input: +.Bl -bullet -compact +.It +.Cm onCommand +.Ar server origin channel message +.It +.Cm onConnect +.Ar server +.It +.Cm onInvite +.Ar server origin channel target +.It +.Cm onJoin +.Ar server origin channel +.It +.Cm onKick +.Ar server origin channel reason +.It +.Cm onLoad +.It +.Cm onMe +.Ar server origin channel message +.It +.Cm onMessage +.Ar server origin channel message +.It +.Cm onMode +.Ar server origin channel mode limit user mask +.It +.Cm onNames +.Ar server channel nick1 nick2 nickN +.It +.Cm onNick +.Ar server origin nickname +.It +.Cm onNotice +.Ar server origin channel nickname +.It +.Cm onPart +.Ar server origin channel reason +.It +.Cm onReload +.It +.Cm onTopic +.Ar server origin channel topic +.It +.Cm onUnload +.It +.Cm onWhois +.Ar server nick user host realname chan1 chan2 chanN +.El +.\" EXAMPLES +.Sh EXAMPLES +Example with a local plugin: +.Bd -literal +$ irccd-test test.js +> onLoad +> onMessage localhost francis #general Bonjour +.Ed +.Pp +Example with a global plugin: +.Bd -literal +$ irccd-test hangman +> onLoad +> onCommand localhost francis #general +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd.1 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,233 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD 1 +.Os +.\" NAME +.Sh NAME +.Nm irccd +.Nd IRC Client Daemon +.\" SYNOPSIS +.Sh SYNOPSIS +.Nm irccd +.Op Fl c Ar file +.Op Fl v +.Nm irccd +.Ar version +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +program is an IRC bot which connects to one or more severs and +dispatches events to plugins. +.Pp +The following options are available: +.Bl -tag -width indent-xxx +.It Fl c Ar file +specify the configuration file. +.It Fl v +be verbose. +.El +.\" PLUGINS +.Sh PLUGINS +The +.Nm +program can runs plugins once IRC events are received. For example, if someone +sends you a private message plugins will be invoked with that event. Both native +plugins written in C++ and Javascript are supported (if enabled at compile +time). +.Pp +The following IRC events are supported: +.Bl -tag -width 12n +.\" onCommand +.It onCommand +This is a special event that does not exist in IRC context. It calls the plugin +special invocation command using +.Ar "!name arguments..." +syntax. The exclamation mark is configured by default to be the command +character prefix, then if the adjacent name is known to be a loaded plugin it is +invoked with the additional arguments. +.Pp +Example: to call the +.Nm hangman +plugin, one may use !hangman to start a game. +.Pp +See also +.Xr irccd.conf 5 +on how to change the command character prefix under a +.Va [server] +section. +.\" onConnect +.It onConnect +When a server successfully connects to an IRC server. +.\" onDisconnect +.It onDisconnect +When a server disconnected from an IRC server both in case of failures or +explicit user disconnection. +.\" onInvite +.It onInvite +Event called when the bot itself has been invited to a channel. +.\" onJoin +.It onJoin +When someone joins a channel. +.\" onKick +.It onKick +When someone has been kicked from a channel, irccd may be included. +.\" onLoad +.It onLoad +This is a special event that does not exist in IRC context. It is invoked when +the plugin is initialized. +.\" onMessage +.It onMessage +Upon private message. +.\" onMe +.It onMe +On action emote, also most known as +.Ar /me +command. +.\" onMode +.It onMode +When a user or channel mode change. +.\" onNames +.It onNames +When a list of nicknames has been received. +.\" onNick +.It onNick +On nick change, irccd may be included. +.\" onNotice +.It onNotice +On private notice. +.\" onPart +.It onPart +When someone leaves a channel. +.\" onReload +.It onReload +This is a special event that does not exist in IRC context. It is invoked when +the user asks to reload a plugin. +.\" onTopic +.It onTopic +When a channel topic has been changed. +.\" onUnload +.It onUnload +This is a special event that does not exist in IRC context. It is invoked when +the user asks to unload a plugin and before exiting. +.\" onWhois +.It onWhois +When a whois information has been received. +.El +.Pp +The following plugins are provided with irccd: +.Pp +.Bl -bullet -compact +.It +ask +.It +auth +.It +hangman +.It +history +.It +joke +.It +links +.It +logger +.It +plugin +.It +roulette +.It +tictactoe +.El +.Pp +See additional documentation in their own manual page in the form +.Xr irccd-plugin-name 7 +where name is the actual plugin name. +.\" TRANSPORTS +.Sh TRANSPORTS +The daemon can be controlled at runtime using the dedicated +.Nm irccdctl +tool or using sockets. +.Pp +Both TCP/IP and UNIX sockets are supported and SSL layer may be enabled over it +for a secure connection. If authentication is desired, it can be enabled too. +.Pp +See also the +.Va [transport] +section in the +.Xr irccd.conf 5 +manual page. +.\" RULES +.Sh RULES +.Nm +supports a feature called rules which allows you to define a fine-grained set of +rules allowed for specific plugins. For instance, you may want to disable some +IRC events for some plugins depending on your set of parameters. This is useful +for plugins that generates huge traffic. +.Pp +Rule events are matched using the same name as plugin events described in the +section above. For example, to disable a private message event you must use the +.Ar onCommand +value. +.Pp +See also the +.Va [rule] +section in the +.Xr irccd.conf 5 +manual page. +.\" DIRECTORIES +.Sh DIRECTORIES +.Nm +uses different types of paths depending on the context. +.Pp +Paths prefixed by (W) means they are only used on Windows, others prefixed by +(U) means they are used on UNIX systems +.Pp +.Ss Configuration +The following directories are searched in the specified order for configuration +files. For example, the files +.Pa irccd.conf +and +.Pa irccdctl.conf +will be searched there. +.Bl -bullet +.It +(W) %APPDATA%/irccd/config +.It +(U) ${XDG_CONFIG_HOME}/irccd +.It +(U) ${HOME}/.config/irccd (if XDG_CONFIG_HOME is not set) +.El +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd-api 7 , +.Xr irccd-templates 7 , +.Xr irccd-ipc 7 , +.Xr irccd-plugin-ask 7 , +.Xr irccd-plugin-auth 7 , +.Xr irccd-plugin-hangman 7 , +.Xr irccd-plugin-history 7 , +.Xr irccd-plugin-joke 7 , +.Xr irccd-plugin-links 7 , +.Xr irccd-plugin-logger 7 , +.Xr irccd-plugin-plugin 7 , +.Xr irccd-plugin-roulette 7 , +.Xr irccd-plugin-tictactoe 7 , +.Xr irccd-test 1 , +.Xr irccd.conf 5 , +.Xr irccdctl 1 , +.Xr irccdctl.conf 5 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccd.conf.5 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccd.conf.5 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,345 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD.CONF 5 +.Os +.\" NAME +.Sh NAME +.Nm irccd +.Nd irccd configuration file +.\" DESCRIPTION +.Sh DESCRIPTION +Both +.Nm irccd +and +.Nm irccdctl +use configuration file in a extended INI format. This section will briefly +explain the additional extensions to the INI format. +.Pp +The file syntax has following rules: +.Bl -enum +.It +Each option is stored in a section, +.It +Some sections may be redefined multiple times, +.It +Empty option must have quotes (e.g. option = ""). +.El +.Ss The @include and @tryinclude statements +Irccd adds an extension to this format by adding an +.\" @include and @tryinclude +.Ar @include keyword which +let you splitting your configuration file. +.Pp +Note: this @include statement must be at the beginning of the file and must be + surrounded by quotes if the file name has spaces. +.Pp +You can use both relative or absolute paths. If relative paths are used, they +are relative to the current file being parsed. +.Pp +The alternative +.Ar @tryinclude +keyword is similar but does not fails if the requested file is not found. +.Pp +Example of includes: +.Bd -literal -offset Ds +@include "rules.conf" +@include "servers.conf" + +[mysection] +myoption = "1" +.Ed +.\" lists +.Ss The list construct +When requested, an option can have multiples values in a list. The syntax uses +parentheses and values are separated by commas. +.Pp +If the list have only one value, you can just use a simple string. +.Pp +Example of lists: +.Bd -literal -offset Ds +[rule] +servers = ( "server1", "server2" ) + +[rule] +servers = "only-one-server" +.Ed +.Pp +Note: spaces are completely optional. +.\" identifiers +.Ss Identifiers +Some sections require an identifier (specified as id) as parameter. They must be +unique, not empty and can only contain characters, numbers, '-' and '_'. +.Pp +Example: both +.Ar abc +and +.Ar server-tz2 +are valid. +.\" CONFIGURATION SECTIONS +.Sh CONFIGURATION SECTIONS +Configuration are always stored in dedicated section in the form +.Ar [name] +where name is one of the section defined below and are case-sensitive. +.\" [logs] +.Ss logs +This section can let you configure how irccd should log the messages. +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va verbose No (bool) +be verbose (Optional, default: false). +.It Va type No (string) +which kind of logging, console, file or syslog (Optional, default: console). +.Pp +The additional options for +.Ar file +type: +.Bl -tag -width indent-xxxxxxxxxxxxx +.It Va path-logs No (string) +path to the normal messages. +.It Va path-errors No (string) +path to the error messages. +.El +.Pp +Note: syslog is not available on all platforms. +.El +.\" [format] +.Ss format +The format section let you change the irccd's output. It uses the templates +system (see +.Xr irccd-format 7 +for more information about templates) +.Pp +Only one keyword is defined, message which contains the message that irccd +wants to output. +.Pp +Note: colors and attributes are not supported on Windows. +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va debug No (string) +template to use to format debug messages (Optional, default: none). +.It Va info No (string) +template to use to format information messages (Optional, default: none). +.It Va warning No (string) +template to use to format warnings (Optional, default: none). +.El +.\" [server] +.Ss server +This section is used to connect to one or more server. +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va name No (identifier) +the unique id. +.It Va hostname No (string) +the server address or IP. +.It Va port No (int) +the server port (Optional, default: 6667). +.It Va password No (string) +an optional server password (Optional, default: none). +.It Va join-invite No (bool) +automatically join channels upon invitation (Optional, default: false). +.It Va channels No (list) +list of channels to auto join (Optional, default: empty). +.Pp +Note: if a channel requires a password, add it after a colon + (e.g. #channel:password). +.It Va command-char No (string) +the prefix for invoking special commands (Optional, default: !). +.It Va ssl No (bool) +enable or disable SSL (Optional, default: false). +.It Va auto-reconnect No (bool) +enable reconnection after failure (Optional, default: true). +.It Va auto-reconnect-delay No (int) +number of seconds to wait before retrying (Optional, default: 30). +.It Va ping-timeout No (int) +number of seconds before ping timeout (Optional, default: 300). +.It Va nickname No (string) +the nickname (Optional, default: irccd). +.It Va realname No (string) +the realname (Optional, default: IRC Client Daemon). +.It Va username No (string) +the username name (Optional, default: irccd). +.It Va ctcp-version No (string) +what version to respond to CTCP VERSION (Optional, default: IRC Client Daemon). +.El +.\" [paths] +.Ss paths +The paths section defines common paths used as defaults for all plugins. +.Pp +Any option in this section can be defined altough the following are used as +common convention used in all plugins: +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va cache No (string) +path for data files written by the plugin. +.It Va data No (string) +path for data files provided by the user. +.It Va config No (string) +path for additional configuration from the user. +.El +.Pp +For each of these paths, plugin/name is appended with the appropriate plugin +name when used. +.Pp +The section is redefinable per plugin basis using the +.Va [paths.] +syntax. +.Ss plugins +This section is used to load plugins. +.Pp +Just add any key you like to load a plugin. If the value is not specified, the +plugin is searched through the standard directories, otherwise, provide the full +path (including the .js extension). +.Pp +Warning: remember to add an empty string for searching plugins. +.\" [transport] +.Ss transport +This section defines transports that are used to communicate through clients +connected to irccd and to perform requests to irccd. +.Pp +With transports, you can may ask irccd to send a message, a notice or even +kicking someone from a channel. Irccd will also notify all clients connected to +this transport on IRC events. +.Pp +There are two type of listeners availables: +.Bl -bullet +.It +Internet sockets, IPv4 and IPv6, +.It +Unix sockets, based on files (not available on Windows). +.El +.Pp +If SSL support was built in, both internet and unix sockets can be set to use +encrypted connections. +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va type No (string) +type of listener "ip" or "unix". +.It Va password No (string) +an authentication password (Optional, default: none). +.It Va ssl No (bool) +enable SSL (Optional, default: false), +.It Va key No (string) +path to private key file (Required if ssl is true) +.It Va certificate No (string) +path to certificate (Required if ssl is true) +.Pp +The additional options for ip type: +.Bl -tag -width indent-xxxxxxxxx +.It Va port No (int) +port number. +.It Va address No (string) +address to bind or * for any (Optional, default: *). +.It Va ipv4 No (bool) +bind on IPv4 (Optional, default true). +.It Va ipv6 No (bool) +bind on IPv6 (Optional, default true). +.El +.Pp +The additional options for unix type: +.Bl -tag -width indent-xxxxxxxxx +.It Va path No (string) +the file path to the socket. +.El +.El +.Pp +Warning: consider using internet sockets with care, especially if you are + running your bot on a server with multiple users. If your bot has + operator rights and you bind on any address, almost every users + can do a kick or a ban. +.\" [rule] +.Ss rule +The rule section is one of the most powerful within irccd configuration. It let +you enable or disable plugins and IRC events for specific criterias. For +instance, you may want to disable a plugin only for a specific channel on a +specific server. And because rules are evaluated in the order they are defined, +you can override rules. +.Pp +Available options: +.Bl -tag -offset Ds -width indent-xxxxxxxxxxxxxxxxxxx +.It Va servers No (list) +a list of servers that will match the rule (Optional, default: empty). +.It Va channels No (list) +a list of channel (Optional, default: empty). +.It Va origins No (list) +a list of nicknames to check (Optional, default: empty). +.It Va plugins No (list) +which plugins (Optional, default: empty), +.It Va events No (list) +which events like onCommand, onMessage (Optional, default: empty). +.It Va action No (string) +set to accept or drop. +.El +.Pp +Warning: don't make sensitive rules on origins option, irccd does not have any + kind of nickname authentication. Thus, it may be very easy for someone + to use a temporary nickname. +.Sh EXAMPLE +Full example of configuration file +.Bd -literal +# Add a transport that bind only to IPv6. +[transport] +type = ip +ipv4 = false +ipv6 = true +family = ipv6 +port = 12000 + +# A transport that binds to both IPv4 and IPv6. +[transport] +type = ip +port = 15000 + +# A server. +[server] +name = "foo" +host = "irc.foo.org" +port = "6667" +nickname = "superbot" +realname = "SuperBot v1.0" +username = "sp" + +# An other server. +[server] +name = "wanadoo" +host = "chat.wanadoo.fr" +port = "6667" + +# Load some plugins. +[plugins] +ask = "" # Search ask +myplugin = /path/to/myplugin.js # Use absolute path + +# This first rule disable the plugin reboot on all servers and channels. +[rule] +plugins = "reboot" +action = drop + +# This rule enable the reboot plugin again on the server localhost, +# channel #staff. +[rule] +servers = "localhost" +channels = "#staff" +plugins = "reboot" +action = accept +.Ed +.Sh SEE ALSO +.Xr irccd 1 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccdctl.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccdctl.1 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,438 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD 1 +.Os +.\" NAME +.Sh NAME +.Nm irccdctl +.Nd irccd controller agent +.\" SYNOPSIS +.Sh SYNOPSIS +.Nm +.\" plugin-config +.Cm plugin-config +.Ar id +.Op Ar variable +.Op Ar value +.\" plugin-info +.Nm +.Cm plugin-info +.Ar id +.\" plugin-list +.Nm +.Cm plugin-list +.\" plugin-load +.Nm +.Cm plugin-load +.Ar name +.\" plugin-reload +.Nm +.Cm plugin-reload +.Ar plugin +.\" plugin-unload +.Cm plugin-unload +.Ar plugin +.\" rule-add +.Nm +.Cm rule-add +.Op Fl c Ar channel +.Op Fl e Ar event +.Op Fl i Ar index +.Op Fl o Ar origin +.Op Fl s Ar server +.Ar accept|drop +.\" rule-edit +.Nm +.Cm rule-edit +.Op Fl a Ar accept|drop +.Op Fl c|C Ar channel +.Op Fl e|E Ar event +.Op Fl o|O Ar origin +.Op Fl s|S Ar server +.Ar index +.\" rule-info +.Nm +.Cm rule-info +.Ar index +.\" rule-list +.Nm +.Cm rule-list +.\" rule-move +.Nm +.Cm rule-move +.Ar from +.Ar to +.\" rule-remove +.Nm +.Cm rule-remove +.Ar index +.\" server-connect +.Nm +.Cm server-connect +.Op Fl 46s +.Op Fl n Ar nickname +.Op Fl r Ar realname +.Op Fl u Ar username +.Ar id +.Ar hostname +.Op Ar port +.\" server-disconnect +.Nm +.Cm server-disconnect +.Op Ar server +.\" server-info +.Nm +.Cm server-info +.Ar server +.\" server-invite +.Nm +.Cm server-invite +.Ar server +.Ar target +.Ar channel +.\" server-join +.Nm +.Cm server-join +.Ar server +.Ar channel +.Op Ar password +.\" server-kick +.Nm +.Cm server-kick +.Ar server +.Ar target +.Ar channel +.Op Ar reason +.\" server-list +.Nm +.Cm server-list +.\" server-me +.Nm +.Cm server-me +.Ar server +.Ar target +.Ar message +.\" server-message +.Nm +.Cm server-message +.Ar server +.Ar target +.Ar message +.\" server-mode +.Nm +.Cm server-mode +.Ar server +.Ar target +.Ar mode +.Op Ar limit +.Op Ar user +.Op Ar mask +.\" server-nick +.Nm +.Cm server-nick +.Ar server +.Ar nickname +.\" server-notice +.Nm +.Cm server-notice +.Ar server +.Ar target +.Ar message +.\" server-part +.Nm +.Cm server-part +.Ar server +.Ar channel +.Op Ar reason +.\" server-reconnect +.Nm +.Cm server-reconnect +.Op Ar server +.\" server-topic +.Nm +.Cm server-topic +.Ar server +.Ar channel +.Ar topic +.\" watch +.Nm +.Cm watch +.Op Fl f Ar native|json +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm irccdctl +is the official utility that let you control a running irccd instance. It uses +JSON messages over TCP/IP or UNIX sockets with optional SSL layer to send +requests. For more information see +.Xr irccd-ipc 7 . +.Pp +The general syntax for running an irccdctl command is: +.Bd -literal -offset Ds +irccdctl command options arg1 arg2 arg3 ... argn +.Ed +.\" COMMANDS +.Sh COMMANDS +.Bl -tag -width xxxxxxxx-yyyyyyyyy +.\" plugin-config +.It Cm plugin-config +Manipulate a configuration variable for the plugin specified by +.Ar id . +.Pp +If both +.Ar variable +and +.Ar value +are provided, sets the plugin configuration to the +respective variable name and value. +.Pp +If only +.Ar variable +is specified, shows its current value. Otherwise, list all variables and their +values. +.\" plugin-info +.It Cm plugin-info +Get plugin information specified by +.Ar id . +.\" plugin-list +.It Cm plugin-list +Get the list of all loaded plugins. +.It Cm plugin-load +Load a plugin into the irccd instance. +.Pp +Note: since irccdctl can be used remotely, the argument +.Ar name +will always be evaluated as plugin name and not as a filesystem path. Therefore, +the plugin will be searched through the irccd directories. +.\" plugin-reload +.It Cm plugin-reload +Reload a plugin specified by +.Ar id +by calling the appropriate onReload event, the plugin is not unloaded and must +be already loaded. +.\" plugin-unload +.It Cm plugin-unload +Unload the plugin +.Ar id +from the irccd instance. +.\" rule-add +.It Cm rule-add +Add a new rule to irccd. +.Pp +If no index is specified, the rule is added to the end. +.Pp +Available options: +.Bl -tag -width 12n +.It Fl c Ar channel +match a channel. +.It Fl e Ar event +match an event. +.It Fl i Ar index +rule position. +.It Fl o Ar origin +match an origin. +.It Fl p Ar plugin +match a plugin. +.It Fl s Ar server +match a server. +.El +.Pp +Note: all options (except +.Fl i ) +may be specified multiple times. +.\" rule-edit +.It Cm rule-edit +Edit an existing rule in irccd. +.Pp +Available options: +.Bl -tag -width 14n +.It Fl a Ar accept|drop +set action. +.It Fl c|C Ar channel +match or unmatch a channel respectively. +.It Fl e|E Ar event +match or unmatch an event respectively. +.It Fl o|O Ar origin +match or unmatch an origin respectively. +.It Fl p|P Ar plugin +match or unmatch a plugin respectively. +.It Fl s|S Ar server +match or unmatch a server respectively. +.El +.Pp +Note: all options (except +.Fl a ) +may be specified multiple times. +.\" rule-info +.It Cm rule-info +Show information about the rule specified by +.Ar index . +.\" rule-list +.It Cm rule-list +List all rules. +.\" rule-move +.It Cm rule-move +Move a rule from the index +.Ar from +at the index specified by +.Ar to . +.Pp +The rule will replace the existing one at the given destination moving +down every other rules. If destination is greater or equal the number of rules, +the rule is moved to the end. +.\" rule-remove +.It Cm rule-remove +Remove the existing rule at the given +.Ar index . +.\" server-connect +.It Cm server-connect +Add and connect to a new IRC server. Server with identifier +.Ar id +must not be already present. The argument +.Ar hostname +can be a hostname or IP address. If the +.Ar port +number is not specified, the default value of 6667 is used instead. +.Pp +Available options: +.Bl -tag -width 12n +.It Fl c Ar character +specify the command character prefix. +.It Fl n Ar nickname +specify a nickname. +.It Fl r Ar realname +specify a real name. +.It Fl u Ar username +specify a user name. +.El +.\" server-disconnect +.It Cm server-disconnect +Disconnect and remove +.Ar server +from the irccd registry. If +.Ar server +is not specified, disconnect and remove all servers +.\" server-info +.It Cm server-info +Get information about +.Ar server . +.\" server-invite +.It Cm server-invite +Invite the specified +.Ar target +on the +.Ar channel . +.\" server-join +.It Cm server-join +Join the specified +.Ar channel , +the +.Ar password +is optional. +.\" server-kick +.It Cm server-kick +Kick the specified +.Ar target +from the +.Ar channel , +the +.Ar reason +is optional. +.\" server-list +.It Cm server-list +Get the list of all registered servers. +.\" server-me +.It Cm server-me +Send an action emote to the +.Ar target +with the given +.Ar message . +.\" server-message +.It Cm server-message +Send a +.Ar message +to the specified +.Ar target . +.\" server-mode +.It Cm server-mode +Set +.Ar target +or irccd's user mode. +.Pp +When +.Ar target +is the bot's nickname, the command change its mode. Otherwise it applies to a +channel and modes are treated differently. +.Pp +The arguments +.Ar limit , user , mask +are usually only used with channel modes. +.\" server-nick +.It Cm server-nick +Change irccd's +.Ar nickname . +.\" server-notice +.It Cm server-notice +Send a private notice to the specified +.Ar target . +.\" server-part +.It Cm server-part +Leave the specified +.Ar channel , +the +.Ar reason +is optional. +.Pp +Warning: while rare, not all IRC servers support giving a reason to leave a +channel, do not specify it if you require portability. +.\" server-reconnect +.It Cm server-reconnect +Force reconnection of all servers unless +.Ar server +is specified. +.\" server-topic +.It Cm server-topic +Set the +.Ar channel +new +.Ar topic . +.\" watch +Start watching irccd events. This command will indefinitely wait for new events +to arrive from irccd. +.Pp +Available options: +.Bl -tag -width 14n +.It Fl f Ar native|json +use JSON or native (human readable) format. +.El +.El +.\" BUGS +.Sh BUGS +Some shells may discard arguments if they begins with a hash. For instance, +bash will not understand the following command: +.Bd -literal -offset Ds +irccdctl server-join localhost #staff +.Ed +.Pp +Instead, enclose the arguments with quotes +.Bd -literal -offset Ds +irccdctl server-join localhost "#staff" +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccdctl.conf 5 diff -r dc6b42d7b97a -r 00a4720c4874 man/irccdctl.conf.5 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/irccdctl.conf.5 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,168 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCDCTL.CONF 5 +.Os +.\" NAME +.Sh NAME +.Nm irccdctll +.Nd irccdctl configuration file +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm irccdctl +utility use the same configuration file syntax and paths, see the manual of +irccd.conf file for more information. +.\" CONFIGURATION SECTIONS +.Sh CONFIGURATION SECTIONS +Configuration are always stored in dedicated section in the form +.Ar [name] +where name is one of the section defined below and are case-sensitive. +.\" [general] +.Ss general +This section defines the global irccdctl parameters. +.Pp +Available options: +.Bl -tag -offset Ds -width 18n +.It Va verbose No (bool) +enable verbose message (Optional, default: false). +.El +.\" [connect] +.Ss connect +The section socket permit irccdctl to connect to a specific irccd transport, +only one must be defined. Just like transports you can connect to Unix or +internet sockets. +.Pp +Available options: +.Bl -tag -offset Ds -width 18n +.It Va type No (string) +connection type, must be set to +.Ar ip +or +.Ar unix . +.It Va password No (string) +an authentication password (Optional, default: none). +.Pp +The additional options for +.Ar ip +type: +.Bl -tag -width 18n +.It Va hostname No (string) +host to connect. +.It Va port No (int) +port number. +.It Va ipv4 No (bool) +try to connect with ipv4 (Optional: default true). +.It Va ipv6 No (bool) +try to connect with ipv6 (Optional: default true). +.El +.Pp +The additional options for +.Ar unix +type: +.Bl -tag -width 18n +.It Va path No (string) +The file path to the socket. +.El +.El +.\" [alias] +.Ss alias +The alias section can be used to define custom user commands. +.Pp +To define an alias, just add a new section named +.Va [alias.name] +where name is your desired alias name. +.Pp +Then, add any option you like to execute commands you want. The option name is +ignored and serves as auto-documentation only. +.Pp +Example: +.Bd -literal -offset Ds +[alias.present] +say-hello = ( "server-message", "localhost", "#staff", "hello world!" ) +warning = ( "server-me", "localhost", "#staff", "is a bot") +.Ed +.Pp +This example defines an alias `present` that will: +.Bl -enum +.It +Send a message on the channel #staff in the server localhost +.It +Send an action emote on the same channel +.El +.Pp +To use this alias, call +.Nm irccdctl +.Cm present . +.Pp +Sometimes, you want to pass parameters to your alias. The placeholder syntax +allows you to define where your command line arguments will be replaced before +being sent to irccd. +.Pp +The syntax uses +.Ar %n +where +.Ar n +is an integer starting from 0. +.Pp +As you have seen in the present alias example above, the channel and server +are hardcoded so the user is not able to use this alias for different channels. +Let's update this alias with placeholders to make it more generic. +.Pp +Example: +.Bd -literal -offset Ds +[alias.present] +say-hello = ( "server-message", "%0", "%1", "hello world!" ) +warning = ( "server-me", "%0", "%1", "is a bot") +.Ed +.Pp +Now, the +.Cm present +alias will except two arguments from the command line when the user invokes +irccdctl as following: +.Bd -literal -offset Ds +irccdctl present +.Ed +.Pp +Thus if you want to use this alias on the #staff@localhost, you call the alias +using: +.Bd -literal -offset Ds +irccdctl present localhost "#staff" +.Ed +.\" EXAMPLES +.Sh EXAMPLES +Example for internet transports. +.Bd -literal +[connect] +type = "internet" +host = "localhost" +port = "9999" +.Ed +Example for unix transports. +.Bd -literal +[connect] +type = "unix" +path = "/tmp/irccd.sock" + +# inspired by irssi /cycle +[alias.cycle] +leave = ( "server-part", "%0", "%1" ) +join = ( "server-join", "%0", "%1" ) +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccdctl 1 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/ask/CMakeLists.txt --- a/plugins/ask/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/ask/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME ask TYPE JS SCRIPT ${plugin-ask_SOURCE_DIR}/ask.js - DOCS ${plugin-ask_SOURCE_DIR}/ask.md + MAN ${plugin-ask_SOURCE_DIR}/ask.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/ask/ask.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/ask/ask.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,77 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-ASK 7 +.Os +.\" NAME +.Sh NAME +.Nm ask +.Nd irccd ask plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The plugin +.Nm +is funny script that helps you in your life. It will tell you if you will be +rich, famous and so on. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +ask = "" +.Ed +.\" USAGE +.Sh USAGE +The plugin +.Nm +reacts to special command, you just need to do !ask the question and it will +give you a response. +.Pp +Example: +.Bd -literal +markand: !ask will I be rich? +irccd: markand, No. +.Ed +.\" FILE +.Sh FILE +By default, +.Nm ask +will only answer yes or no. It's possible to add any answers you want in the +file +.Pa answers.conf +located in the ask configuration directory. +.Pp +Just add one line per answer like this (e.g. +.Pa ~/.config/irccd/plugin/ask/answers.conf ) . +.Bd -literal -offset Ds +Stop dreaming, +Definitely sure! +Maybe +.Ed +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.ask] +section: +.Bl -tag -width 14n +.It Va file No (string) +the path to the database file (Optional, default: answers.conf in configuration +directory). +.El diff -r dc6b42d7b97a -r 00a4720c4874 plugins/ask/ask.md --- a/plugins/ask/ask.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -# Ask plugin - -The plugin **ask** is funny script that helps you in your life. It will tells -you if you will be rich, famous and so on. - -# Installation - -The plugin **ask** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -ask = "" -``` - -## Usage - -The plugin **ask** reacts to special command, you just need to do -`!ask the question` and it will give you a response. - -## Example - -```nohighlight -markand: !ask will I be rich? -irccd: markand, No. -``` - -## File - -By default, **ask** will only answer yes or no. It's possible to add any answers -you want in the file **answers.conf** located in the ask configuration -directory. - -Just add one line per answer like this (e.g. ~/.config/irccd/plugin/ask/answers.conf). - -```nohighlight -Stop dreaming, -Definitely sure! -Maybe -``` - -## Configuration - -The following options are available under the `[plugin.ask]` section: - -- file: (string) the path to the database file (Optional, default: answers.conf - in configuration directory). diff -r dc6b42d7b97a -r 00a4720c4874 plugins/auth/CMakeLists.txt --- a/plugins/auth/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/auth/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME auth TYPE JS SCRIPT ${plugin-auth_SOURCE_DIR}/auth.js - DOCS ${plugin-auth_SOURCE_DIR}/auth.md + MAN ${plugin-auth_SOURCE_DIR}/auth.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/auth/auth.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/auth/auth.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,81 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-AUTH 7 +.Os +.\" NAME +.Sh NAME +.Nm auth +.Nd irccd auth plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The plugin +.Nm +provides generic authentication to the most popular services. +.Pp +For the moment, +.Nm auth +supports the following backends: +.Bl -tag -width 12n -offset Ds +.It nickserv +the NickServ service, using /msg NickServ identify user pass +.It quakenet +the quakenet.org service, using /msg Q@CServe.quakenet.org AUTH user pass +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +auth = "" +.Ed +.\" USAGE +.Sh USAGE +You must configure the file to enable authentication. +.\" CONFIGURATION +.Sh CONFIGURATION +In your irccd.conf file, add the +.Va [plugin.auth] +section and fill with the following parameters: +.Bl -tag -width 24n +.It Va server.type No (string) +must be +.Em nickserv +or +.Em quakenet . +.It Va server.password No (string) +the password. +.It Va server.username No (string) +the username to use. Required for quakenet, optional for nickserv. +.El +.Pp +Note: you must replace server with one defined in a +.Va [server] +section. +.Pp +Example of configuration: +.Bd -literal -offset Ds +[plugin.auth] +freenode.type = "nickserv" +freenode.password = "mysecretpassword" +freenode.username = "jeanfrancois" + +wanadoo.type = "nickserv" +wanadoo.password = "wanadoo is dead" +.Ed diff -r dc6b42d7b97a -r 00a4720c4874 plugins/auth/auth.md --- a/plugins/auth/auth.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -# Auth plugin - -The plugin **auth** provides generic authentication to the most popular -services. - -For the moment, **auth** supports the following backends: - -- **nickserv**: the NickServ service, `/msg NickServ identify user pass` -- **quakenet**: the quakenet.org service, `/msg Q@CServe.quakenet.org AUTH user pass` - -## Installation - -The plugin **auth** is distributed with irccd. To enable it add the following to -your `plugins` section: - -```ini -[plugins] -auth = "" -``` - -## Usage - -You must configure the file to enable authentication. - -## Configuration - -In your **irccd.conf** file, add the `[plugin.auth]` section and fill with the -following parameters: - -- server.type: (string), must be **nickserv** or **quakenet**, -- server.password: (string), the password, -- server.username: (string), the username to use. Required for **quakenet**, - optional for **nickserv**. - -You must replace **server** with one defined in a `[server]` section. - -Example: - -```ini -[plugin.auth] -freenode.type = "nickserv" -freenode.password = "mysecretpassword" -freenode.username = "jeanfrancois" - -wanadoo.type = "nickserv" -wanadoo.password = "wanadoo is dead" -``` diff -r dc6b42d7b97a -r 00a4720c4874 plugins/hangman/CMakeLists.txt --- a/plugins/hangman/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/hangman/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME hangman TYPE JS SCRIPT ${plugin-hangman_SOURCE_DIR}/hangman.js - DOCS ${plugin-hangman_SOURCE_DIR}/hangman.md + MAN ${plugin-hangman_SOURCE_DIR}/hangman.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/hangman/hangman.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/hangman/hangman.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,149 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-HANGMAN 7 +.Os +.\" NAME +.Sh NAME +.Nm hangman +.Nd irccd hangman plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin lets you play the hangman game on IRC. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +hangman = "" +.Ed +.\" USAGE +.Sh USAGE +The +.Nm +plugin starts when a user execute its special command with no arguments. +.Bd -literal -offset Ds +markand: !hangman +irccd: markand, the game is started, the word to find is: _ _ _ _ _ _ _ _ _ _ _ +.Ed +.Pp +If a game is already running, the same command shows the current word. +.Bd -literal -offset Ds +markand: !hangman +irccd: markand, the game is already running and the word is: s _ _, +.Ed +.Pp +There are two ways for proposing a response to the game. You can either just ask +for a letter or for a whole word. +.Ss By letter +When asking a letter, the message must be one letter. +.Bd -literal -offset Ds +markand: c +irccd: markand, nice! the word is now c _ _ _ _ +jean: k +irccd: jean, there is no 'k'. +.Ed +.Ss By full word +When asking by a word, just put one word as command argument. Note that in +contrast to the letter proposal we have used command invocation rather than +normal message to avoid possible propositions by mistake. +.Bd -literal -offset Ds +markand: !hangman couch +irccd: markand, this is not the word. +jean: !hangman candy +irccd: jean, congratulations, the word is candy. +.Ed +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.hangman] +section: +.Bl -tag -width 20n -offset Ds +.It Va file No (string) +The path to the database file. +.Pp +The file must contains one word per line, it must be saved as UTF-8 and words +must only contains UTF-8 characters, any other entry will be ignored. +.Pp +Example: +.Bd -literal -offset Ds +sky +irccd +FreeBSD +door +cat +.Ed +.It Va collaborative No (bool) +Set to true to enable collaborative mode, a player can't propose two +consecutives proposals (Optional, default: true). +.El +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.hangman] +section: +.Bl -tag -width 22n -offset Ds +.It Va asked +When a letter has been already asked but present in the word. Keywords: +.Em letter . +.It Va dead +When the man was hung. Keywords: +.Em word . +.It Va found +When a correct letter has been placed. Keywords: +.Em word . +.It Va running +When a game is requested but it's already running. Keywords: +.Em word . +.It Va start +When the game starts. Keywords: +.Em word . +.It Va win +When the game succeeded. Keywords: +.Em word . +.It Va wrong-word +When a word proposal is wrong. Keywords: +.Em word . +.It Va wrong-letter +When a letter proposal is wrong. Keywords: +.Em letter . +.El +.Pp +All templates support the following standard keywords: +.Em channel , command , nickname , origin , plugin , server . +.\" EXAMPLES +.Sh EXAMPLES +Example of configuration file: +.Bd -literal +[plugin.hangman] +file = "/var/srv/db/words.txt" + +[templates.hangman] +win = "nice job, the word was #{word}!" +wrong-letter = "please try again, there is no #{letter}" +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/hangman/hangman.md --- a/plugins/hangman/hangman.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -# Hangman plugin - -Hangman is a plugin to play the hangman game. - -## Installation - -The plugin **hangman** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -hangman = "" -``` - -## Usage - -The **hangman** plugin starts when a user execute its special command with no -arguments. - -```nohighlight -markand: !hangman -irccd: markand, the game is started, the word to find is: _ _ _ _ _ _ _ _ _ _ _ -``` - -If a game is already running, the same command shows the current word. - -```nohighlight -markand: !hangman -irccd: markand, the game is already running and the word is: s _ _, -``` - -### Proposal - -There are two ways for proposing a response to the game. You can either just ask -for a letter or for a whole word. - -#### By letter - -When asking a letter, the message must be one letter. - -```nohighlight -markand: c -irccd: markand, nice! the word is now c _ _ _ _ -jean: k -irccd: jean, there is no 'k'. -``` - -#### By full word - -When asking by a word, just put one word as command argument. - -```nohighlight -markand: !hangman couch -irccd: markand, this is not the word. -jean: !hangman candy -irccd: jean, congratulations, the word is candy. -``` - -## Configuration - -The following options are available under the `[plugin.hangman]` section: - -- file: (string) the path to the database file. -- collaborative: (bool) set to true to enable collaborative mode, a player can't - propose two consecutives proposals (Optional, default: true), - -## Formats - -The **hangman** plugin supports the following formats in `[format.hangman]` -section: - -- asked: (string) when a letter has been already asked but present in the word (Optional), -- dead: (string) when the man was hung (Optional), -- found: (string) when a correct letter has been placed (Optional), -- running: (string) when a game is requested but it's already running (Optional), -- start: (string) when the game starts (Optional), -- win: (string) when the game succeeded (Optional), -- wrong-word: (string) when a word proposal is wrong (Optional), -- wrong-letter: (string) when a letter proposal is wrong (Optional). - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|-------------------------|----------------------------------------------------|---------------------------------| -| (any) | channel, command, nickname, origin, plugin, server | all formats | -| **asked** | letter | the letter proposal | -| **dead** | word | the word to find | -| **found** | word | the hidden word | -| **start** | word | the hidden word | -| **running** | word | the hidden word | -| **win** | word | the word to find | -| **wrong-word** | word | the invalid word proposal | -| **wrong-letter** | letter | the letter proposal | - -Example: - -```ini -[plugin.hangman] -file = "/var/srv/db/words.txt" - -[format.hangman] -win = "nice job, the word was #{word}!" -wrong-letter = "please try again, there is no #{letter}" -``` - -## Database file - -The database file must contains one word per line, it must be saved as UTF-8 -and words must only contains UTF-8 characters, any other entry will be ignored. - -```nohighlight -sky -irccd -FreeBSD -door -cat -``` diff -r dc6b42d7b97a -r 00a4720c4874 plugins/history/CMakeLists.txt --- a/plugins/history/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/history/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME history TYPE JS SCRIPT ${plugin-history_SOURCE_DIR}/history.js - DOCS ${plugin-history_SOURCE_DIR}/history.md + MAN ${plugin-history_SOURCE_DIR}/history.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/history/history.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/history/history.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,114 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-HISTORY 7 +.Os +.\" NAME +.Sh NAME +.Nm history +.Nd irccd history plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin is used to check when someone has been seen for the last time on a +channel. For that purpose, irccd needs to be on that channel forever if +possible. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +history = "" +.Ed +.\" USAGE +.Sh USAGE +The plugin +.Nm history +only reacts to the special command. It understands +.Ar seen +and +.Ar said +sub commands. +.Pp +.Bl -bullet -compact +.It +The sub command +.Ar seen +tells you when the user has been seen for the last time. +.It +The sub command +.Ar said +tells you what the user has said for the last time. +.El +.Pp +Example +.Bd -literal -offset Ds +markand: !history seen jean +irccd: markand, the last time I've seen jean was on 18/01/1989 at 20:55 +markand: !history said jean +irccd: markand, the last thing that jean said was: hello world +.Ed +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.history] +section: +.Bl -tag -width 14n -offset Ds +.It Va file No (string) +path to the JSON file for saving information (Optional. default to cache +directory). +.El +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.history] +section: +.Bl -tag -width 14n -offset Ds +.It Va error +Template when an internal error occured. Keywords: +.It Va seen +Template for showing last seen. Keywords: +.Em target , (date) . +.It Va said +Template for showing the last message. Keywords: +.Em message , target , (date) . +.It Va unknown +Template when the user has never been seen. Keywords: +.Em target . +.It Va usage +Template to show the plugin usage. +.El +.Pp +All templates support the following standard keywords: +.Em channel , command , nickname , origin , plugin , server . +.\" EXAMPLES +.Sh EXAMPLES +Example of configuration file: +.Bd -literal +[templates.history] +seen = "#{target} has been seen on #{channel} the last time on: %d/%m/%Y %H:%M" +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/history/history.md --- a/plugins/history/history.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -# History plugin - -The plugin **history** is used to check when someone has been seen for the last -time on a channel. For that purpose, irccd needs to be on that channel forever -if possible. - -## Installation - -The plugin **history** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -history = "" -``` - -## Usage - -The plugin **history** only reacts to the special command. It understands `seen` -and `said` sub commands. - -- The sub command `seen` tells you when the user has been seen for the last time. -- The sub command `said` tells you what the user has said for the last time. - -Example: - -```nohighlight -markand: !history seen jean -irccd: markand, the last time I've seen jean was on 18/01/1989 at 20:55 -markand: !history said jean -irccd: markand, the last thing that jean said was: hello world -``` - -## Configuration - -The following options are available under the `[plugin.history]` section: - -- file: (string) path to the JSON file for saving information (Optional, - default to cache directory). - -### Keywords supported - -The following keywords are supported: - -| Parameter | Keywords | -|-----------|-----------------| -| **file** | channel, server | - -## Formats - -The **history** plugin supports the following formats in `[format.history]` -section: - -- error: (string) format when an internal error occured, -- seen: (string) format for showing last seen, -- said: (string) format for showing the last message, -- unknown: (string) format when the user has never been seen, -- usage: (string) format to show the plugin usage. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|-------------|----------------------------------------------------|------------------------------| -| (any) | channel, command, nickname, origin, plugin, server | | -| **seen** | target, (date) | target is the specified nick | -| **said** | message, target, (date) | | -| **unknown** | target | | - -Example: - -```ini -[format.history] -seen = "#{target} has been seen on #{channel} the last time on: %d/%m/%Y %H:%M" -``` diff -r dc6b42d7b97a -r 00a4720c4874 plugins/joke/CMakeLists.txt --- a/plugins/joke/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/joke/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME joke TYPE JS SCRIPT ${plugin-joke_SOURCE_DIR}/joke.js - DOCS ${plugin-joke_SOURCE_DIR}/joke.md + MAN ${plugin-joke_SOURCE_DIR}/joke.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/joke/joke.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/joke/joke.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,103 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-JOKE 7 +.Os +.\" NAME +.Sh NAME +.Nm joke +.Nd irccd joke plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin is a convenient command to display jokes in a random order without +displaying always the same. +.Pp +It loads jokes per channel/server pair and display a unique joke each time it is +invoked. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +joke = "" +.Ed +.\" USAGE +.Sh USAGE +The +.Nm +plugin requires a database of jokes file, it consists of a plain JSON file of +array of array of strings. +.Pp +Example of jokes.json file: +.Bd -literal -offset Ds +[ + [ + "Tip to generate a good random password:", + "Ask a Windows user to quit vim." + ], + [ + "Have you tried turning it off and on again?" + ] +] +.Ed +.Pp +This file contains two jokes, the first one will be printed on two lines while +the second only has one. +.Pp +Then, invoke the plugin: +.Bd -literal -offset Ds +markand: !joke +irccd: Have you tried turning it off and on again? +markand: !joke +irccd: Tip to generate a good random password: +irccd: Ask a Windows user to quit vim. +.Ed +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.joke] +section: +.Bl -tag -width 14n -offset Ds +.It Va file No (string) +path to the JSON jokes files (Optional: defaults to data directory/jokes.json). +Keywords: +.Em channel , server +.Pp +Warning: if you use keywords in the **file** parameter, you won't have a default +joke database anymore. +.El +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.joke] +section: +.Bl -tag -width 14n -offset Ds +.It Va error +Template when an internal error occured. Keywords: +.Em channel , nickname , origin , server . +.El +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/joke/joke.md --- a/plugins/joke/joke.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -# Joke plugin - -The plugin **joke** is a convenient command to display jokes in a random order -without displaying always the same. - -It loads jokes per channel/server pair and display a unique joke each time it is -invoked. - -## Installation - -The plugin **joke** is distributed with irccd. To enable it add the following to -your `plugins` section: - -```ini -[plugins] -joke = "" -``` - -## Usage - -The plugin **joke** requires a database of jokes file, it consists of a plain -JSON file of array of array of strings. - -Example of **jokes.json** file: - -```javascript -[ - [ - "Tip to generate a good random password:", - "Ask a Windows user to quit vim." - ], - [ - "Have you tried turning it off and on again?" - ] -] -``` - -This file contains two jokes, the first one will be printed on two lines while -the second only has one. - -Then, invoke the plugin: - -```nohighlight -markand: !joke -irccd: Have you tried turning it off and on again? -markand: !joke -irccd: Tip to generate a good random password: -irccd: Ask a Windows user to quit vim. -``` - -## Configuration - -The following options are available under the `[plugin.history]` section: - -- **file**: (string) path to the JSON jokes files (Optional: defaults to data - directory/jokes.json) - -### Keywords supported - -The following keywords are supported: - -| Parameter | Keywords | -|-----------|-----------------| -| **file** | channel, server | - -Warning: if you use keywords in the **file** parameter, you won't have a default - joke database anymore. - -## Formats - -The **joke** plugin supports the following formats in `[format.joke]` section: - -- error: (string) format when an internal error occured. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | -|-----------|-----------------------------------| -| **error** | channel, nickname, origin, server | diff -r dc6b42d7b97a -r 00a4720c4874 plugins/links/CMakeLists.txt --- a/plugins/links/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/links/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -26,6 +26,7 @@ irccd_define_plugin( NAME links TYPE NATIVE + MAN ${plugin-links_SOURCE_DIR}/links.7 SOURCES ${plugin-links_SOURCE_DIR}/links.cpp ${plugin-links_SOURCE_DIR}/links.hpp diff -r dc6b42d7b97a -r 00a4720c4874 plugins/links/links.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/links/links.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,83 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-LINKS 7 +.Os +.\" NAME +.Sh NAME +.Nm links +.Nd irccd links plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +is used to analyze links sent on channels. It will load the web page and extract +its title on the same channel. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +links = "" +.Ed +.\" USAGE +.Sh USAGE +The plugin will automatically fetch web page titles on message that contains +either http://something or https://something. +.Pp +Example of possible output: +.Bd -literal -offset Ds +markand: http://example.org +irccd: Example Domain +.Ed +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.links] +section: +.Bl -tag -width 14n -offset Ds +.It Va timeout No (int) +Timeout in seconds before dropping a request (default: 30). +.El +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.links] +section: +.Bl -tag -width 14n -offset Ds +.It Va info +Message to be written when title has been retrieved successfully. Keywords: +.Em channel , nickname , origin , server , title . +.El +.\" BUGS +.Sh BUGS +As HTML pages are not always correct and not openable with a XML parser, +.Nm +actually searches for a tag using a regular expression. While +this is not ideal, it usually works in most situations. +.Pp +Only a few set of HTML entity characters are converted to the human readable +format. +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/links/links.md --- a/plugins/links/links.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -# Links plugin - -The plugin **links** is use to analyze links sent on channels. It will load the -web page and extract its title on the same channel. - -## Installation - -The plugin **links** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -links = "" -``` - -## Usage - -The plugin will automatically fetch web page titles on message that contains -either *http://something* or *https://something*. - -Example of possible output: - -```nohighlight -markand: http://example.org -irccd: Example Domain -``` - -## Configuration - -The following options are available under the `[plugin.links]` section: - -- timeout: (int) timeout in seconds before dropping a request (default: 30). - -## Formats - -The **links** plugin supports the following formats in `[format.links]` section: - -- info: message written when title was parsed correctly - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|--------|------------------------------------------|-----------------------| -| info | channel, nickname, origin, server, title | title is webpage link | diff -r dc6b42d7b97a -r 00a4720c4874 plugins/logger/CMakeLists.txt --- a/plugins/logger/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/logger/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME logger TYPE JS SCRIPT ${plugin-logger_SOURCE_DIR}/logger.js - DOCS ${plugin-logger_SOURCE_DIR}/logger.md + MAN ${plugin-logger_SOURCE_DIR}/logger.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/logger/logger.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/logger/logger.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,120 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-LOGGER 7 +.Os +.\" NAME +.Sh NAME +.Nm logger +.Nd irccd logger plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin may be used to log everything you want. It supports the following events: +.Bl -bullet -compact +.It +onJoin. +.It +onKick. +.It +onMe. +.It +onMessage. +.It +onMode. +.It +onNotice. +.It +onPart. +.It +onTopic. +.El +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +logger = "" +.Ed +.\" USAGE +.Sh USAGE +The +.Nm +plugin has no direct commands. +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.logger] +section: +.Bl -tag -width 14n -offset Ds +.It Va path No (string) +The path to the file where to store logs. Keywords: +.Em channel , server , (date) . +.El +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.logger] +section: +.Bl -tag -width 14n -offset Ds +.It Va join +Format when someone joins a channel. +.It Va kick +Format when someone has been kicked. Keywords: +.Em reason , target . +.It Va me +Format for emote actions. Keywords: +.Em message . +.It Va message +Format for channel messages. Keywords: +.Em message . +.It Va mode +Format for user mode change. Keywords: +.Em mode , limit , user , mask . +.It Va notice +Format on private notices. Keywords: +.Em message . +.It Va part +Format when someone leaves a channel. Keywords: +.Em reason . +.It Va topic +Format when a topic is changed. Keywords: +.Em topic . +.El +.Pp +All templates support the following standard keywords: +.Em channel , nickname , origin , server . +.\" EXAMPLES +.Sh EXAMPLES +Example of configuration file: +.Bd -literal +[plugin.logger] +path = "/var/log/irccd/#{server}/%y/%m/%d/#{channel}.txt" + +[format.logger] +join = "user #{nickname} joined #{channel}" +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/logger/logger.md --- a/plugins/logger/logger.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -# Logger plugin - -The plugin **logger** may be used to log everything you want. It supports the -following events: - -- onJoin, -- onKick, -- onMe, -- onMessage, -- onMode, -- onNotice, -- onPart, -- onTopic. - -## Installation - -The plugin **logger** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -logger = "" -``` - -## Usage - -There is nothing to do, except configuring it. - -## Configuration - -The following options are available under the `[plugin.logger]` section: - -- path: (string) the path to the file where to store logs, - -## Formats - -The **logger** plugin supports the following formats in `[format.logger]` -section: - -- join: (string) format when someone joins a channel, -- kick: (string) format when someone has been kicked, -- me: (string) format for emote actions, -- message: (string) format for channel messages, -- mode: (string) format for user mode change, -- notice: (string) format on private notices, -- part: (string) format when someone leaves a channel, -- topic: (string) format when a topic is changed. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|-------------|-----------------------------------|-----------------------------| -| (any) | channel, nickname, origin, server | channel may be a nickname | -| **kick** | reason, target | | -| **me** | message | message is the emote action | -| **message** | message | | -| **mode** | mode, limit, user, mask | the mode and its arguments | -| **notice** | message | the notice message | -| **part** | reason | | -| **topic** | topic | | - -Example: - -```ini -[plugin.logger] -path = "/var/log/irccd/#{server}/%y/%m/%d/#{channel}.txt" - -[format.logger] -join = "user #{nickname} joined #{channel}" -``` diff -r dc6b42d7b97a -r 00a4720c4874 plugins/plugin/CMakeLists.txt --- a/plugins/plugin/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/plugin/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME plugin TYPE JS SCRIPT ${plugin-plugin_SOURCE_DIR}/plugin.js - DOCS ${plugin-plugin_SOURCE_DIR}/plugin.md + MAN ${plugin-plugin_SOURCE_DIR}/plugin.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/plugin/plugin.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/plugin/plugin.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,98 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-PLUGIN 7 +.Os +.\" NAME +.Sh NAME +.Nm plugin +.Nd irccd plugin plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin let you inspect loaded plugins. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +plugin = "" +.Ed +.\" USAGE +.Sh USAGE +The +.Nm +plugin only reacts to the special command. It understands +.Ar info +and +.Ar list +sub commands. +.Pp +.Bl -bullet -compact +.It +The sub command +.Ar info +shows information about a plugin. +.It +The sub command +.Ar list +shows loaded plugins (see configuration for limits). +.El +.Pp +Both commands work in a channel or as private message with irccd. +.\" CONFIGURATION +.Sh CONFIGURATION +The following options are available under the +.Va [plugin.plugin] +section: +.Bl -tag -width 22n -offset Ds +.It Va max-list-lines No (int) +max number of lines allowed for the +.Ar list +sub command (Optional, default: 3). +.It Va max-list-columns No (int) +max number of columns allowed per lines (Optional, default: 80). +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.plugin] +section: +.Bl -tag -width 14n -offset Ds +.It Va usage +Message to show on invalid usage. +.It Va info +Plugin information message to show. Keywords: +.Em author , license , name , summary , version . +.It Va not-found +Message to show if a plugin does not exist. Keywords: +.Em name . +.It Va too-long +Message to show if the list of plugin is too long. +.El +.Pp +All templates support the following standard keywords: +.Em channel , command , nickname , origin , plugin , server. +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/plugin/plugin.md --- a/plugins/plugin/plugin.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -# Plugin plugin - -The plugin **plugin** let you inspect loaded plugins. - -## Installation - -The plugin **plugin** is distributed with irccd. To enable it add the following -to your **plugins** section: - -```ini -[plugins] -plugin = "" -``` - -## Usage - -The plugin **plugin** only reacts to the special command. It understands `info` -and `list` sub commands. - -- The sub command `info` shows information about a plugin, -- The sub command `list` shows loaded plugins (see configuration for limits). - -Both commands work in a channel or as private message with irccd. - -## Configuration - -The following options are available under the `[plugin.plugin]` section: - -- **max-list-lines**: (int) max number of lines allowed for the `list` sub - command (Optional, default: 3), -- **max-list-columns**: (int) max number of columns allowed per lines - (Optional, default: 80). - -## Formats - -The **plugin** plugin supports the following formats in `[format.plugin]` -section: - -- usage: (string) message to show on invalid usage, -- info: (string) plugin information message to show, -- not-found: (string) message to show if a plugin does not exist, -- too-long: (string) message to show if the list of plugin is too long. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|---------------|----------------------------------------------------|------------------------| -| (any) | channel, command, nickname, origin, plugin, server | | -| **info** | author, license, name, summary, version | the plugin information | -| **not-found** | name | the plugin name | diff -r dc6b42d7b97a -r 00a4720c4874 plugins/roulette/CMakeLists.txt --- a/plugins/roulette/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/roulette/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME roulette TYPE JS SCRIPT ${plugin-roulette_SOURCE_DIR}/roulette.js - DOCS ${plugin-roulette_SOURCE_DIR}/roulette.md + MAN ${plugin-roulette_SOURCE_DIR}/roulette.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/roulette/roulette.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/roulette/roulette.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,85 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-ROULETTE 7 +.Os +.\" NAME +.Sh NAME +.Nm roulette +.Nd irccd roulette plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin is a funny script that let you do a russian roulette game but without any +injuries. +.Pp +Note: the bot will perform a kick command if the user is being shot so you must +be sure to have channel operator mode set on irccd. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +roulette = "" +.Ed +.\" USAGE +.Sh USAGE +The +.Nm +plugin simply reacts to the special command. +.Bd -literal -offset Ds +markand: !roulette +irccd: markand, you're lucky this time +markand: !roulette +irccd: markand, you're lucky this time +markand: !roulette +markand was kicked by irccd [markand, HEADSHOT] +.Ed +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.hangman] +section: +.Bl -tag -width 8n -offset Ds +.It Va lucky +The text to show on luck. Keywords: +.Em count +(the number of turns left in the cylinder). +.It Va shot +The text to show on shot. +.El +.Pp +All templates support the following standard keywords: +.Em channel , command , nickname , origin , plugin , server . +.\" EXAMPLES +.Sh EXAMPLES +Example of configuration file: +.Bd -literal +[format.roulette] +lucky = "#{nickname} you're gonna get shot" +shot = "BIM" +.Ed +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/roulette/roulette.md --- a/plugins/roulette/roulette.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -# Roulette plugin - -The plugin **roulette** is a funny script that let you do a russian roulette -game but without any injuries. - -## Installation - -The plugin **roulette** is distributed with irccd. To enable it add the -following to your `plugins` section: - -```ini -[plugins] -roulette = "" -``` - -## Usage - -The plugin **roulette** just reacts to the special command. - -Example: - -```nohighlight -markand: !roulette -irccd: markand, you're lucky this time -markand: !roulette -irccd: markand, you're lucky this time -markand: !roulette -markand was kicked by irccd [markand, HEADSHOT] -``` - -## Formats - -The **roulette** plugin supports the following formats in `[format.roulette]` -section: - -- lucky: (string) the text to show on luck, -- shot: (string) the text to show on shot. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|-----------|----------------------------------------------------|-----------------------------------| -| (any) | channel, command, nickname, origin, plugin, server | all formats | -| **lucky** | count | the number of cylinder count left | - -Example: - -```ini -[format.roulette] -lucky = "#{nickname} you're gonna get shot" -shot = "BIM" -``` diff -r dc6b42d7b97a -r 00a4720c4874 plugins/tictactoe/CMakeLists.txt --- a/plugins/tictactoe/CMakeLists.txt Tue Jul 09 15:04:04 2019 +0200 +++ b/plugins/tictactoe/CMakeLists.txt Mon Jul 08 16:15:57 2019 +0200 @@ -22,5 +22,5 @@ NAME tictactoe TYPE JS SCRIPT ${plugin-tictactoe_SOURCE_DIR}/tictactoe.js - DOCS ${plugin-tictactoe_SOURCE_DIR}/tictactoe.md + MAN ${plugin-tictactoe_SOURCE_DIR}/tictactoe.7 ) diff -r dc6b42d7b97a -r 00a4720c4874 plugins/tictactoe/tictactoe.7 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/tictactoe/tictactoe.7 Mon Jul 08 16:15:57 2019 +0200 @@ -0,0 +1,127 @@ +.\" +.\" Copyright (c) 2013-2019 David Demelier +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd @IRCCD_MAN_DATE@ +.Dt IRCCD-PLUGIN-TICTACTOE 7 +.Os +.\" NAME +.Sh NAME +.Nm tictactoe +.Nd irccd tictactoe plugin +.\" DESCRIPTION +.Sh DESCRIPTION +The +.Nm +plugin let you play tictactoe over IRC. +.Pp +Warning: this plugin is extremely verbose, don't enable it blindly. +.\" INSTALLATION +.Sh INSTALLATION +The plugin +.Nm +is distributed with irccd. To enable it add the following to your plugins +section: +.Pp +.Bd -literal +[plugins] +tictactoe = "" +.Ed +.\" USAGE +.Sh USAGE +Use the special command with the target opponent nickname. Then each player send +a message in the form +.Ar "x y" +where x targets the column and y the row. +.Pp +To verify target opponent, this plugins first requests the names on the channel +to ensures a valid player. +.Pp +If one of the players leaves the channel (either by kick or part) the game is +aborted silently. +.Pp +Example when starting a game: +.Bd -literal -offset Ds +markand: !tictactoe francis +irccd: a b c +irccd: 1 . . . +irccd: 2 . . . +irccd: 3 . . . +irccd: markand, it's your turn +.Ed +.Pp +And then, placing tokens: +.Bd -literal -offset Ds +20:27 < markand> a 1 +20:27 < irccd> a b c +20:27 < irccd> 1 x . . +20:27 < irccd> 2 . . . +20:27 < irccd> 3 . . . +20:27 < irccd> francis, it's your turn +20:27 <@francis> c 1 +20:27 < irccd> a b c +20:27 < irccd> 1 x . o +20:27 < irccd> 2 . . . +20:27 < irccd> 3 . . . +20:27 < irccd> markand, it's your turn +20:27 < markand> a 2 +20:27 < irccd> a b c +20:27 < irccd> 1 x . o +20:27 < irccd> 2 x . . +20:27 < irccd> 3 . . . +20:27 < irccd> francis, it's your turn +20:27 <@francis> c 3 +20:27 < irccd> a b c +20:27 < irccd> 1 x . o +20:27 < irccd> 2 x . . +20:27 < irccd> 3 . . o +20:27 < irccd> markand, it's your turn +20:27 < markand> a 3 +20:27 < irccd> a b c +20:27 < irccd> 1 x . o +20:27 < irccd> 2 x . . +20:27 < irccd> 3 x . o +20:27 < irccd> francis, it's your turn +20:27 < irccd> markand, congratulations, you won! +.Ed +.\" TEMPLATES +.Sh TEMPLATES +The +.Nm +plugin supports the following templates in +.Va [templates.tictactoe] +section: +.Bl -tag -width 8n -offset Ds +.It Va draw +When the game ended with no winner. +.It Va invalid +The opponent does not exist or is not valid. Keywords: +.Em origin . +.It Va running +The game is already running. Keywords: +.Em origin . +.It Va turn +Message sent when current player change. +.It Va used +The cell requested is already used. +.It Va win +Game ended with a winner. +.El +.Pp +All templates support the following standard keywords: +.Em channel , command , nickname , plugin , server . +.\" SEE ALSO +.Sh SEE ALSO +.Xr irccd 1 , +.Xr irccd-templates 7 diff -r dc6b42d7b97a -r 00a4720c4874 plugins/tictactoe/tictactoe.md --- a/plugins/tictactoe/tictactoe.md Tue Jul 09 15:04:04 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -# Tictactoe plugin - -This plugin let you play tictactoe over IRC. - -Warning: this plugin is verbose. - -## Installation - -The plugin **tictactoe** is distributed with irccd. To enable it add the following -to your `plugins` section: - -```ini -[plugins] -tictactoe = "" -``` - -## Usage - -Execute **tictactoe** plugin with the target opponent nickname. Then each player -send a message in the form **x y** where x targets the column and y the row. - -To verify target opponent, this plugins first requests the names on the channel -to ensures a valid player. - -If one of the players leaves the channel (either by kick or part) the game is -aborted. - -```nohighlight -markand: !tictactoe francis -irccd: a b c -irccd: 1 . . . -irccd: 2 . . . -irccd: 3 . . . -irccd: markand, it's your turn -``` - -And then, placing tokens. - -```nohighlight -20:27 < markand> a 1 -20:27 < irccd> a b c -20:27 < irccd> 1 x . . -20:27 < irccd> 2 . . . -20:27 < irccd> 3 . . . -20:27 < irccd> francis, it's your turn -20:27 <@francis> c 1 -20:27 < irccd> a b c -20:27 < irccd> 1 x . o -20:27 < irccd> 2 . . . -20:27 < irccd> 3 . . . -20:27 < irccd> markand, it's your turn -20:27 < markand> a 2 -20:27 < irccd> a b c -20:27 < irccd> 1 x . o -20:27 < irccd> 2 x . . -20:27 < irccd> 3 . . . -20:27 < irccd> francis, it's your turn -20:27 <@francis> c 3 -20:27 < irccd> a b c -20:27 < irccd> 1 x . o -20:27 < irccd> 2 x . . -20:27 < irccd> 3 . . o -20:27 < irccd> markand, it's your turn -20:27 < markand> a 3 -20:27 < irccd> a b c -20:27 < irccd> 1 x . o -20:27 < irccd> 2 x . . -20:27 < irccd> 3 x . o -20:27 < irccd> francis, it's your turn -20:27 < irccd> markand, congratulations, you won! -``` - -## Formats - -The **tictactoe** plugin supports the following formats in `[format.tictactoe]` -section: - -- draw: when the game ended with no winner, -- invalid: the opponent does not exist or is not valid, -- running: the game is already running, -- turn: message sent when current player change, -- used: the cell requested is already used, -- win: game ended with a winner. - -### Keywords supported - -The following keywords are supported: - -| Format | Keywords | Notes | -|---------|--------------------------------------------|-------------| -| (any) | channel, command, nickname, plugin, server | all formats | -| invalid | origin | | -| running | origin | |