From 7dbc9183c3e4baeb43caf84028823acf0a0a2d1d Mon Sep 17 00:00:00 2001 From: Geo Date: Tue, 27 Aug 2024 12:24:53 -0400 Subject: [PATCH 01/33] Update version info in tcl-commands.doc --- doc/sphinx_source/using/tcl-commands.rst | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 2daf428df..22f8fdb4c 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -13,12 +13,9 @@ of the normal Tcl built-in commands are still there, of course, but you can also use these to manipulate features of the bot. They are listed according to category. -This list is accurate for Eggdrop v1.10.0. Scripts written for v1.3, v1.4, -1.6 and 1.8 series of Eggdrop should probably work with a few minor modifications -depending on the script. Scripts which were written for v0.9, v1.0, v1.1 -or v1.2 will probably not work without modification. Commands which have -been changed in this version of Eggdrop (or are just new commands) are -marked with vertical bars (|) on the left. +This list is accurate for Eggdrop v1.10.0. Most scripts written for the v1.3, v1.4, +1.6, 1.8, and 1.9 series of Eggdrop should probably work in their current form, with only a very few needing minor modifications. +Scripts which were written for v0.9, v1.0, v1.1 or v1.2 will probably not work without modification. Output Commands --------------- From f1b51466e91094d8f5e8ca74bfb78ebf84c0a5c6 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 8 Sep 2024 16:08:03 +0200 Subject: [PATCH 02/33] Typo fixes --- doc/sphinx_source/install/readme.rst | 2 +- eggdrop.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinx_source/install/readme.rst b/doc/sphinx_source/install/readme.rst index 573783de7..da013982d 100644 --- a/doc/sphinx_source/install/readme.rst +++ b/doc/sphinx_source/install/readme.rst @@ -94,7 +94,7 @@ System Pre-Requisites Before you can compile Eggdrop, Tcl must be installed on your system. Many systems have Tcl installed on them by default (you can check by trying the command "tclsh"; if you are given a '%' for a prompt, it is, and you can type 'exit' to exit the Tcl shell. However, Eggdrop also requires the Tcl development header files to be installed. They can often be installed via an OS package manager, usually called something similar to 'tcl-dev' for the package name. You can also download Tcl source from ``_. - Eggdrop also requires openssl (and its development headers) in order to enable SSL/TLS protection of network data. The header files are often called something similar to 'libssl-dev'. While not advised, this requirement can be removed by compilling using ``./configure --disable-tls``, but you will not be able to connect to TLS-protected IRC servers nor utilize secure botnet communication. + Eggdrop also requires openssl (and its development headers) in order to enable SSL/TLS protection of network data. The header files are often called something similar to 'libssl-dev'. While not advised, this requirement can be removed by compiling using ``./configure --disable-tls``, but you will not be able to connect to TLS-protected IRC servers nor utilize secure botnet communication. Minimum Requirements -------------------- diff --git a/eggdrop.conf b/eggdrop.conf index dae6a27b3..7a0ab79cb 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -292,7 +292,7 @@ set userfile-perm 0600 # listen +5555 all # # To bind the listening port to a specific IP instead of all available, insert -# a valid IP assigned to the host Eggdrop is running on infront of the port +# a valid IP assigned to the host Eggdrop is running on in front of the port # (this replaces the listen-addr setting used prior to Eggdrop v1.9) # # listen 1.2.3.4 3333 all From 1ba8410e14825474bcaf597b6ee1849da447aff6 Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 8 Sep 2024 10:10:48 -0400 Subject: [PATCH 03/33] Fix .channel formatting Found by: Geo Patch by: Geo Fixes: #1672 --- src/mod/irc.mod/cmdsirc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mod/irc.mod/cmdsirc.c b/src/mod/irc.mod/cmdsirc.c index c9bf58ab1..2571ba557 100644 --- a/src/mod/irc.mod/cmdsirc.c +++ b/src/mod/irc.mod/cmdsirc.c @@ -750,7 +750,6 @@ static void cmd_channel(struct userrec *u, int idx, char *par) strftime(s, 6, "%H:%M", localtime(&(m->joined))); } else strlcpy(s, " --- ", sizeof s); - egg_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost); u = get_user_from_member(m); if (u == NULL) strlcpy(handle, "*", sizeof handle); From d1168a1ca3ad46fd61bb445e04c131907e89e9fb Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 8 Sep 2024 14:19:22 +0000 Subject: [PATCH 04/33] Run autotools --- configure | 3 ++- src/mod/compress.mod/configure | 2 +- src/mod/dns.mod/configure | 2 +- src/mod/python.mod/configure | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 10d439b90..aa9fed99f 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 0ea3718f. +# From configure.ac 1ba8410. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for Eggdrop 1.10.0. # @@ -9062,6 +9062,7 @@ printf "%s\n" "$as_me: WARNING: --with-tcl argument should refer to directory co `ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks/Tcl.framework 2>/dev/null` \ `ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Network/Library/Frameworks/Tcl.framework 2>/dev/null` \ `ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tcl.framework 2>/dev/null` \ + `ls -d /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" diff --git a/src/mod/compress.mod/configure b/src/mod/compress.mod/configure index f639a7bbe..3da9aa2f2 100755 --- a/src/mod/compress.mod/configure +++ b/src/mod/compress.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 0ea3718f. +# From configure.ac 1ba8410. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for Eggdrop Compress Module 1.10.0. # diff --git a/src/mod/dns.mod/configure b/src/mod/dns.mod/configure index 667f8ae70..7024eff53 100755 --- a/src/mod/dns.mod/configure +++ b/src/mod/dns.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 0ea3718f. +# From configure.ac 1ba8410. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for Eggdrop DNS Module 1.10.0. # diff --git a/src/mod/python.mod/configure b/src/mod/python.mod/configure index ec08ac875..094c43970 100755 --- a/src/mod/python.mod/configure +++ b/src/mod/python.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac e9aead7. +# From configure.ac 1ba8410. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for Eggdrop Python Module 1.10.0. # From 76099f1940c163851814f2f82e06cc296b5b7440 Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 8 Sep 2024 13:31:15 -0400 Subject: [PATCH 05/33] fix broken doc links, small tweaks --- NEWS | 5 +++++ doc/sphinx_source/install/readme.rst | 4 ++-- doc/sphinx_source/install/upgrading.rst | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6cc03a177..adc7ec616 100644 --- a/NEWS +++ b/NEWS @@ -93,6 +93,11 @@ Eggdrop v1.10.0: created to hedge against frequent writes to disk, but is less relveant with today's technology. Eggdrop now writes logfiles to disk immediately. + - The old DNS module section was removed + - A Python module section was added, but does not load the python + module by default. + - The Autoscripts capability to load and manage some scripts from the + partyline is loaded by default Documentation changes: - Added documentation that covers values commonly used when writing diff --git a/doc/sphinx_source/install/readme.rst b/doc/sphinx_source/install/readme.rst index da013982d..44f744277 100644 --- a/doc/sphinx_source/install/readme.rst +++ b/doc/sphinx_source/install/readme.rst @@ -117,12 +117,12 @@ Some components of Eggdrop relies on a variety of third-party libraries, documen Quick Startup ------------- - Please see the `Install `_ file after you finish reading this file. + Please see the `Install `_ file after you finish reading this file. Upgrading --------- - The upgrade process for Eggdrop is very simple, simply download the new source code and repeat the compile process. You will want to read the NEWS for any new configuration file settings you want to add. Please see `Upgrading `_ for full details. + The upgrade process for Eggdrop is very simple, simply download the new source code and repeat the compile process. You will want to read the NEWS for any new configuration file settings you want to add. Please see `Upgrading `_ for full details. Command Line ------------ diff --git a/doc/sphinx_source/install/upgrading.rst b/doc/sphinx_source/install/upgrading.rst index 907482f83..49be23af9 100644 --- a/doc/sphinx_source/install/upgrading.rst +++ b/doc/sphinx_source/install/upgrading.rst @@ -1,7 +1,7 @@ Upgrading Eggdrop ================= - It is easy to upgrade Eggdrop to a new version! To have a full picture of the changes made since your last upgrade, we recommend reading the NEWS file. Upgrades from the 1.6 and 1.8 lines of Eggdrop should take place with little to no issues. The config file, user files, and channel files can all be reused. + It is easy to upgrade Eggdrop to a new version! To have a full picture of the changes made since your last upgrade, we recommend reading the NEWS file. Upgrades from the 1.8 and 1.9 lines of Eggdrop should take place with little to no issues. While the config file, user files, and channel files can all be reused, it is recommended to review the NEWS files for each release to identify new configuration settings that have been added. For support, feel free to visit us on Libera #eggdrop. From dfab69d28e214766cf23752d4572164312c80b14 Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 8 Sep 2024 13:35:59 -0400 Subject: [PATCH 06/33] Update docs for rc2 --- README | 2 +- UPGRADING | 8 +- doc/html/_static/basic.css | 2 +- doc/html/_static/doctools.js | 2 +- doc/html/_static/documentation_options.js | 2 +- doc/html/_static/language_data.js | 4 +- doc/html/_static/searchtools.js | 170 ++++++++++++++-------- doc/html/about/about.html | 12 +- doc/html/about/legal.html | 12 +- doc/html/index.html | 12 +- doc/html/install/install.html | 12 +- doc/html/install/readme.html | 18 +-- doc/html/install/upgrading.html | 14 +- doc/html/modules/included.html | 12 +- doc/html/modules/index.html | 12 +- doc/html/modules/internals.html | 12 +- doc/html/modules/mod/assoc.html | 12 +- doc/html/modules/mod/blowfish.html | 12 +- doc/html/modules/mod/channels.html | 12 +- doc/html/modules/mod/compress.html | 12 +- doc/html/modules/mod/console.html | 12 +- doc/html/modules/mod/ctcp.html | 12 +- doc/html/modules/mod/dns.html | 12 +- doc/html/modules/mod/filesys.html | 12 +- doc/html/modules/mod/ident.html | 12 +- doc/html/modules/mod/irc.html | 12 +- doc/html/modules/mod/notes.html | 12 +- doc/html/modules/mod/pbkdf2.html | 12 +- doc/html/modules/mod/python.html | 12 +- doc/html/modules/mod/seen.html | 12 +- doc/html/modules/mod/server.html | 12 +- doc/html/modules/mod/share.html | 12 +- doc/html/modules/mod/transfer.html | 12 +- doc/html/modules/mod/twitch.html | 12 +- doc/html/modules/mod/uptime.html | 12 +- doc/html/modules/mod/woobie.html | 12 +- doc/html/modules/writing.html | 12 +- doc/html/search.html | 22 ++- doc/html/searchindex.js | 2 +- doc/html/tutorials/firstscript.html | 12 +- doc/html/tutorials/firststeps.html | 12 +- doc/html/tutorials/module.html | 12 +- doc/html/tutorials/setup.html | 12 +- doc/html/tutorials/tlssetup.html | 12 +- doc/html/tutorials/userfilesharing.html | 12 +- doc/html/using/accounts.html | 12 +- doc/html/using/autoscripts.html | 12 +- doc/html/using/bans.html | 12 +- doc/html/using/botnet.html | 12 +- doc/html/using/core.html | 12 +- doc/html/using/features.html | 12 +- doc/html/using/ipv6.html | 12 +- doc/html/using/ircv3.html | 12 +- doc/html/using/partyline.html | 12 +- doc/html/using/patch.html | 12 +- doc/html/using/pbkdf2info.html | 12 +- doc/html/using/python.html | 12 +- doc/html/using/tcl-commands.html | 21 ++- doc/html/using/text-sub.html | 12 +- doc/html/using/tls.html | 12 +- doc/html/using/tricks.html | 12 +- doc/html/using/twitch-tcl-commands.html | 12 +- doc/html/using/twitchinfo.html | 12 +- doc/html/using/users.html | 12 +- doc/sphinx_source/conf.py | 2 +- doc/tcl-commands.doc | 12 +- 66 files changed, 473 insertions(+), 432 deletions(-) diff --git a/README b/README index fdd5c32ef..b7d376601 100644 --- a/README +++ b/README @@ -109,7 +109,7 @@ SYSTEM PRE-REQUISITES Eggdrop also requires openssl (and its development headers) in order to enable SSL/TLS protection of network data. The header files are often called something similar to 'libssl-dev'. While not advised, - this requirement can be removed by compilling using + this requirement can be removed by compiling using ./configure --disable-tls, but you will not be able to connect to TLS-protected IRC servers nor utilize secure botnet communication. diff --git a/UPGRADING b/UPGRADING index ef9464e16..d714aecfd 100644 --- a/UPGRADING +++ b/UPGRADING @@ -2,9 +2,11 @@ Upgrading Eggdrop It is easy to upgrade Eggdrop to a new version! To have a full picture of the changes made since your last upgrade, we recommend reading the - NEWS file. Upgrades from the 1.6 and 1.8 lines of Eggdrop should take - place with little to no issues. The config file, user files, and - channel files can all be reused. + NEWS file. Upgrades from the 1.8 and 1.9 lines of Eggdrop should take + place with little to no issues. While the config file, user files, and + channel files can all be reused, it is recommended to review the NEWS + files for each release to identify new configuration settings that + have been added. For support, feel free to visit us on Libera #eggdrop. diff --git a/doc/html/_static/basic.css b/doc/html/_static/basic.css index 6d4176051..bf515ee8a 100644 --- a/doc/html/_static/basic.css +++ b/doc/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/html/_static/doctools.js b/doc/html/_static/doctools.js index d06a71d75..4d67807d1 100644 --- a/doc/html/_static/doctools.js +++ b/doc/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js index 693055604..9ed430ffa 100644 --- a/doc/html/_static/documentation_options.js +++ b/doc/html/_static/documentation_options.js @@ -1,5 +1,5 @@ const DOCUMENTATION_OPTIONS = { - VERSION: '1.10.0rc1', + VERSION: '1.10.0rc2', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/doc/html/_static/language_data.js b/doc/html/_static/language_data.js index 250f5665f..367b8ed81 100644 --- a/doc/html/_static/language_data.js +++ b/doc/html/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -13,7 +13,7 @@ var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; -/* Non-minified version is copied as a separate JS file, is available */ +/* Non-minified version is copied as a separate JS file, if available */ /** * Porter Stemmer diff --git a/doc/html/_static/searchtools.js b/doc/html/_static/searchtools.js index 7918c3fab..b08d58c9b 100644 --- a/doc/html/_static/searchtools.js +++ b/doc/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => { .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) + Search.makeSearchSummary(data, searchTerms, anchor) ); // highlight search terms in the summary if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js @@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => { ); else Search.status.innerText = _( - `Search finished, found ${resultCount} page(s) matching the search query.` - ); + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); }; const _displayNextItem = ( results, @@ -137,6 +137,22 @@ const _displayNextItem = ( // search finished, update title and status message else _finishSearch(resultCount); }; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; /** * Default splitQuery function. Can be overridden in ``sphinx.search`` with a @@ -160,13 +176,26 @@ const Search = { _queued_query: null, _pulse_status: -1, - htmlToText: (htmlString) => { + htmlToText: (htmlString, anchor) => { const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent !== undefined) return docContent.textContent; + if (docContent) return docContent.textContent; + console.warn( - "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." ); return ""; }, @@ -239,16 +268,7 @@ const Search = { else Search.deferQuery(query); }, - /** - * execute search (requires search index to be loaded) - */ - query: (query) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - + _parseQuery: (query) => { // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -284,21 +304,38 @@ const Search = { // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); - // array of [docname, title, anchor, descr, score, filename] - let results = []; + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + _removeChildren(document.getElementById("search-progress")); - const queryLower = query.toLowerCase(); + const queryLower = query.toLowerCase().trim(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { for (const [file, id] of foundTitles) { - let score = Math.round(100 * queryLower.length / title.length) - results.push([ + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, id !== null ? "#" + id : "", null, - score, + score + boost, filenames[file], ]); } @@ -308,46 +345,47 @@ const Search = { // search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id] of foundEntries) { - let score = Math.round(100 * queryLower.length / entry.length) - results.push([ + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ docNames[file], titles[file], id ? "#" + id : "", null, score, filenames[file], - ]); + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } } } } // lookup as object objectTerms.forEach((term) => - results.push(...Search.performObjectSearch(term, objectTerms)) + normalResults.push(...Search.performObjectSearch(term, objectTerms)) ); // lookup as search terms in fulltext - results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); // let the scorer override scores with a custom scoring function - if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); - - // now sort the results by score (in opposite order of appearance, since the - // display function below uses pop() to retrieve items) and then - // alphabetically - results.sort((a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; - }); + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; // remove duplicate search results // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept @@ -361,7 +399,12 @@ const Search = { return acc; }, []); - results = results.reverse(); + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); // for debugging //Search.lastresults = results.slice(); // a copy @@ -466,14 +509,18 @@ const Search = { // add support for partial matches if (word.length > 2) { const escapedWord = _escapeRegExp(word); - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord) && !terms[word]) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord) && !titleTerms[word]) - arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); - }); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } } // no match but word was a required one @@ -496,9 +543,8 @@ const Search = { // create the mapping files.forEach((file) => { - if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - else fileMap.set(file, [word]); + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); }); }); @@ -549,8 +595,8 @@ const Search = { * search summary for a given text. keywords is a list * of stemmed words. */ - makeSearchSummary: (htmlText, keywords) => { - const text = Search.htmlToText(htmlText); + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); if (text === "") return null; const textLower = text.toLowerCase(); diff --git a/doc/html/about/about.html b/doc/html/about/about.html index e589e343e..d77af25c6 100644 --- a/doc/html/about/about.html +++ b/doc/html/about/about.html @@ -5,11 +5,11 @@ - About Eggdrop — Eggdrop 1.10.0rc1 documentation + About Eggdrop — Eggdrop 1.10.0rc2 documentation - - + + @@ -18,7 +18,7 @@
diff --git a/doc/html/about/legal.html b/doc/html/about/legal.html index d64811836..be3992f18 100644 --- a/doc/html/about/legal.html +++ b/doc/html/about/legal.html @@ -5,11 +5,11 @@ - Boring legal stuff — Eggdrop 1.10.0rc1 documentation + Boring legal stuff — Eggdrop 1.10.0rc2 documentation - - + + @@ -17,7 +17,7 @@
diff --git a/doc/html/index.html b/doc/html/index.html index e272b96bf..e10905e17 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -5,11 +5,11 @@ - Eggdrop, an open source IRC bot — Eggdrop 1.10.0rc1 documentation + Eggdrop, an open source IRC bot — Eggdrop 1.10.0rc2 documentation - - + + @@ -17,7 +17,7 @@
diff --git a/doc/html/install/install.html b/doc/html/install/install.html index f2d430e26..c554c5bc6 100644 --- a/doc/html/install/install.html +++ b/doc/html/install/install.html @@ -5,11 +5,11 @@ - Installing Eggdrop — Eggdrop 1.10.0rc1 documentation + Installing Eggdrop — Eggdrop 1.10.0rc2 documentation - - + + @@ -18,7 +18,7 @@ diff --git a/doc/html/modules/mod/console.html b/doc/html/modules/mod/console.html index 372522040..b12a429c7 100644 --- a/doc/html/modules/mod/console.html +++ b/doc/html/modules/mod/console.html @@ -175,7 +175,7 @@

Search

diff --git a/doc/html/modules/mod/ctcp.html b/doc/html/modules/mod/ctcp.html index 6b84ecc3f..980e05abf 100644 --- a/doc/html/modules/mod/ctcp.html +++ b/doc/html/modules/mod/ctcp.html @@ -187,7 +187,7 @@

Search

diff --git a/doc/html/modules/mod/dns.html b/doc/html/modules/mod/dns.html index 142697d1c..c96900c15 100644 --- a/doc/html/modules/mod/dns.html +++ b/doc/html/modules/mod/dns.html @@ -188,7 +188,7 @@

Search

diff --git a/doc/html/modules/mod/filesys.html b/doc/html/modules/mod/filesys.html index 993b742fe..1aecf28dd 100644 --- a/doc/html/modules/mod/filesys.html +++ b/doc/html/modules/mod/filesys.html @@ -385,7 +385,7 @@

.filesys module © Copyright 2024, Eggheads. - Last updated on Sep 08, 2024. + Last updated on Oct 13, 2024. Created using Sphinx 8.0.2. diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index 00155cc31..22a388d52 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -226,7 +226,7 @@

Search

diff --git a/doc/html/modules/mod/irc.html b/doc/html/modules/mod/irc.html index 21061f2f3..2e0c2a295 100644 --- a/doc/html/modules/mod/irc.html +++ b/doc/html/modules/mod/irc.html @@ -296,7 +296,7 @@

Search

diff --git a/doc/html/modules/mod/notes.html b/doc/html/modules/mod/notes.html index 132d22aeb..9d066f7ca 100644 --- a/doc/html/modules/mod/notes.html +++ b/doc/html/modules/mod/notes.html @@ -183,7 +183,7 @@

Search

diff --git a/doc/html/modules/mod/pbkdf2.html b/doc/html/modules/mod/pbkdf2.html index 10474ca71..070cdb426 100644 --- a/doc/html/modules/mod/pbkdf2.html +++ b/doc/html/modules/mod/pbkdf2.html @@ -182,7 +182,7 @@

Search

diff --git a/doc/html/modules/mod/python.html b/doc/html/modules/mod/python.html index 15ef49b7b..f20d9fb2b 100644 --- a/doc/html/modules/mod/python.html +++ b/doc/html/modules/mod/python.html @@ -192,7 +192,7 @@

pysource <path/to/file> © Copyright 2024, Eggheads. - Last updated on Sep 08, 2024. + Last updated on Oct 13, 2024. Created using Sphinx 8.0.2. diff --git a/doc/html/modules/mod/seen.html b/doc/html/modules/mod/seen.html index b4fa3b8be..195298cd3 100644 --- a/doc/html/modules/mod/seen.html +++ b/doc/html/modules/mod/seen.html @@ -162,7 +162,7 @@

Search

diff --git a/doc/html/modules/mod/server.html b/doc/html/modules/mod/server.html index d788f17a8..0d0ebd3fe 100644 --- a/doc/html/modules/mod/server.html +++ b/doc/html/modules/mod/server.html @@ -371,7 +371,7 @@

Search

diff --git a/doc/html/modules/mod/share.html b/doc/html/modules/mod/share.html index 8c2c94f74..1821367e9 100644 --- a/doc/html/modules/mod/share.html +++ b/doc/html/modules/mod/share.html @@ -192,7 +192,7 @@

Search

diff --git a/doc/html/modules/mod/transfer.html b/doc/html/modules/mod/transfer.html index 8d9609ba5..18de22488 100644 --- a/doc/html/modules/mod/transfer.html +++ b/doc/html/modules/mod/transfer.html @@ -181,7 +181,7 @@

Search

diff --git a/doc/html/modules/mod/twitch.html b/doc/html/modules/mod/twitch.html index cae00cac8..97115d071 100644 --- a/doc/html/modules/mod/twitch.html +++ b/doc/html/modules/mod/twitch.html @@ -196,7 +196,7 @@

Partyline commands © Copyright 2024, Eggheads. - Last updated on Sep 08, 2024. + Last updated on Oct 13, 2024. Created using Sphinx 8.0.2. diff --git a/doc/html/modules/mod/uptime.html b/doc/html/modules/mod/uptime.html index cf3f5bae6..37981cdcb 100644 --- a/doc/html/modules/mod/uptime.html +++ b/doc/html/modules/mod/uptime.html @@ -169,7 +169,7 @@

Search

diff --git a/doc/html/modules/mod/woobie.html b/doc/html/modules/mod/woobie.html index 0ec72e427..75cb7ca6b 100644 --- a/doc/html/modules/mod/woobie.html +++ b/doc/html/modules/mod/woobie.html @@ -161,7 +161,7 @@

Search

diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index ff40f4fed..721a0405f 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -426,7 +426,7 @@

What to do with a module? © Copyright 2024, Eggheads. - Last updated on Sep 08, 2024. + Last updated on Oct 13, 2024. Created using Sphinx 8.0.2. diff --git a/doc/html/search.html b/doc/html/search.html index 6718e6394..447d237b0 100644 --- a/doc/html/search.html +++ b/doc/html/search.html @@ -148,7 +148,7 @@

Search

diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js index 55f0bc3e7..906ac5dc1 100644 --- a/doc/html/searchindex.js +++ b/doc/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {".binds python": [[21, "binds-python"]], ".cancel [file] \u2026": [[16, "cancel-file-file"]], ".cd ": [[16, "cd-directory"]], ".cp ": [[16, "cp-source-dst"]], ".desc ": [[16, "desc-file-description"]], ".files": [[16, "files"]], ".filestats [clear]": [[16, "filestats-user-clear"]], ".filesys module": [[16, "id1"]], ".get [nickname]": [[16, "get-filename-nickname"]], ".hide [files] \u2026": [[16, "hide-file-files"]], ".ln ": [[16, "ln-bot-filepath-localfile"]], ".ls [filemask]": [[16, "ls-filemask"]], ".mkdir [flags [channel]]": [[16, "mkdir-dir-flags-channel"]], ".mv ": [[16, "mv-source-dest"]], ".optimize": [[16, "optimize"]], ".pending": [[16, "pending"]], ".pwd": [[16, "pwd"]], ".quit": [[16, "quit"]], ".rmdir ": [[16, "rmdir-dir"]], ".share [files] \u2026": [[16, "share-file-files"]], ".stats": [[16, "stats"]], ".unhide": [[16, "unhide"]], ".unshare [file] \u2026": [[16, "unshare-file-file"]], "About": [[42, "about"], [43, "about"], [50, "about"]], "About Eggdrop": [[0, null], [2, null]], "Account tracking in Eggdrop": [[36, null]], "Add a Host to a User": [[31, "add-a-host-to-a-user"]], "Add a User": [[31, "add-a-user"]], "Adding Bind Functionality": [[8, "adding-bind-functionality"]], "Adding a New Bind Type to the Bind Table": [[8, "adding-a-new-bind-type-to-the-bind-table"]], "Adding a Partyline Command": [[32, "adding-a-partyline-command"]], "Adding a Tcl Bind": [[32, "adding-a-tcl-bind"]], "Adding a Tcl Command": [[32, "adding-a-tcl-command"]], "Adding and linking bots": [[39, "adding-and-linking-bots"]], "Additional Information": [[34, "additional-information"]], "Additional functions": [[29, "additional-functions"]], "Advanced Settings": [[40, "advanced-settings"]], "Advanced Tips": [[51, null]], "Assign Permission Flags": [[31, "assign-permission-flags"]], "Assoc Module": [[9, null], [48, "assoc-module"]], "Authenticating with NickServ": [[31, "authenticating-with-nickserv"]], "Auto-starting Eggdrop": [[4, "auto-starting-eggdrop"]], "Automatically restarting an Eggdrop": [[31, "automatically-restarting-an-eggdrop"]], "Autoscripts File Structure": [[37, "autoscripts-file-structure"]], "Autoscripts usage": [[37, "autoscripts-usage"]], "Background": [[46, "background"]], "Bans, Invites, and Exempts": [[38, null]], "Basic Settings": [[40, "basic-settings"]], "Best-Effort Account Tracking": [[36, "best-effort-account-tracking"]], "Bind Flags": [[8, "bind-flags"]], "Bind Return Values": [[8, "bind-return-values"]], "Bind Types": [[48, "bind-types"], [52, "bind-types"]], "Binds": [[48, "binds"], [52, "binds"]], "Blowfish Module": [[10, null]], "Boring legal stuff": [[1, null]], "Bot Flags": [[39, "bot-flags"]], "Botnet": [[5, "botnet"], [50, "botnet"]], "Botnet Sharing and Linking": [[39, null]], "Botnet/Dcc/Telnet Settings": [[40, "botnet-dcc-telnet-settings"]], "C Binding": [[8, "c-binding"]], "C Handler": [[8, "c-handler"]], "CTCP CHAT/CHAT4/CHAT6": [[42, "ctcp-chat-chat4-chat6"]], "CTCP Module": [[14, null]], "Calling the Bind": [[32, "calling-the-bind"]], "Can I compile Eggdrop without dynamic modules? (Static compile)": [[7, "can-i-compile-eggdrop-without-dynamic-modules-static-compile"]], "Channel Commands": [[48, "channel-commands"]], "Channel Settings": [[11, "channel-settings"]], "Channels Module": [[11, null]], "Checking Account-tracking Status": [[36, "checking-account-tracking-status"]], "Command Line": [[4, "command-line"]], "Commands": [[52, "commands"]], "Common First Steps": [[31, null]], "Common first steps": [[31, "id1"]], "Compress Module": [[12, null], [48, "compress-module"]], "Config file changes": [[5, "config-file-changes"]], "Config file setup": [[16, "config-file-setup"]], "Configuration": [[33, "configuration"]], "Configuration File Preparation - Generating Keys": [[34, "configuration-file-preparation-generating-keys"]], "Configuration File Preparation - Listening with TLS": [[34, "configuration-file-preparation-listening-with-tls"]], "Configure Channel Settings": [[31, "configure-channel-settings"]], "Connecting to a TLS-enabled IRC server": [[34, "connecting-to-a-tls-enabled-irc-server"]], "Connecting to an Eggdrop listening with TLS": [[34, "connecting-to-an-eggdrop-listening-with-tls"]], "Console Module": [[13, null]], "Console Settings": [[40, "console-settings"]], "Control Procedures": [[48, "control-procedures"]], "Crontab Method (Old)": [[31, "crontab-method-old"]], "Cygwin Requirements (Windows)": [[3, "cygwin-requirements-windows"]], "DCC Commands": [[48, "dcc-commands"]], "DNS Module": [[15, null]], "Default Channel Values": [[11, "default-channel-values"]], "Defining bind arguments": [[32, "defining-bind-arguments"]], "Determining if a Server Supports Account Capabilities": [[36, "determining-if-a-server-supports-account-capabilities"]], "Development hints": [[37, "development-hints"]], "Disclaimer": [[53, "disclaimer"]], "Do I still need to \u2018loadmodule\u2019 modules?": [[7, "do-i-still-need-to-loadmodule-modules"]], "Docker": [[4, "docker"]], "Documentation": [[4, "documentation"], [5, "documentation"]], "Download locations": [[33, "download-locations"]], "Editing the config file": [[33, "editing-the-config-file"], [53, "editing-the-config-file"]], "Eggdrop Autoscripts": [[37, null]], "Eggdrop Bind Internals": [[8, null]], "Eggdrop Core Settings": [[40, null]], "Eggdrop Features": [[41, null]], "Eggdrop Module Information": [[7, null]], "Eggdrop Modules": [[2, null]], "Eggdrop Python Commands": [[47, "eggdrop-python-commands"]], "Eggdrop Tcl Commands": [[48, null]], "Eggdrop Twitch Tcl Commands": [[52, null]], "Eggdrop, an open source IRC bot": [[2, null]], "Enable/Disable Channel Settings": [[11, "enable-disable-channel-settings"]], "Enabling Eggdrop Account Tracking": [[36, "enabling-eggdrop-account-tracking"]], "Enabling TLS Security on Eggdrop": [[34, null]], "Enabling hybrid configuration": [[46, "enabling-hybrid-configuration"]], "Enabling solo configuration": [[46, "enabling-solo-configuration"]], "Encryption/Hashing": [[46, null]], "Errata": [[43, "errata"]], "Example bottrees": [[39, "example-bottrees"]], "Executable Path": [[40, "executable-path"]], "Explaining the Linking/Sharing Process": [[35, "explaining-the-linking-sharing-process"]], "FTP": [[4, "ftp"]], "File and Directory Settings": [[40, "file-and-directory-settings"]], "File placement": [[37, "file-placement"]], "Filesys Module": [[16, null], [48, "filesys-module"]], "Flag Masks": [[48, "flag-masks"]], "Flags": [[52, "flags"]], "General Workflow To Create a New Bind": [[8, "general-workflow-to-create-a-new-bind"]], "Getting the source": [[33, "getting-the-source"]], "Git Development Snapshot": [[4, "git-development-snapshot"]], "Global Variables": [[48, "global-variables"]], "Header section": [[47, "header-section"]], "History": [[33, "history"]], "How to Get Eggdrop": [[4, "how-to-get-eggdrop"]], "How to Upgrade": [[5, "how-to-upgrade"]], "How to Write an Eggdrop Module": [[29, null]], "How to get Eggdrop": [[2, "how-to-get-eggdrop"]], "How to install Eggdrop": [[2, "how-to-install-eggdrop"]], "How to install a module": [[7, "how-to-install-a-module"]], "How to share userfiles- the super-short version": [[35, "how-to-share-userfiles-the-super-short-version"]], "Hybrid Configuration": [[46, "hybrid-configuration"]], "IPv6 support": [[42, null]], "IRC": [[50, "irc"]], "IRC Module": [[18, null]], "IRCv3 support": [[43, null]], "Ident Module": [[17, null]], "Installation": [[2, "installation"], [33, "installation"], [42, "installation"], [50, "installation"]], "Installation Pre-requisites": [[2, "installation-pre-requisites"]], "Installing Eggdrop": [[2, null], [3, null]], "Join a Channel": [[31, "join-a-channel"]], "Keeping Logs": [[51, "keeping-logs"]], "Keys, certificates and authentication": [[50, "keys-certificates-and-authentication"]], "Limitations": [[26, "limitations"]], "Loading Python": [[21, "loading-python"], [47, "loading-python"]], "Log Files": [[40, "log-files"]], "Log on to the partyline": [[31, "log-on-to-the-partyline"]], "MODULE_close ()": [[29, "module-close"]], "MODULE_expmem": [[29, "module-expmem"]], "MODULE_report": [[29, "module-report"]], "MODULE_start": [[29, "module-start"]], "MODULE_table": [[29, "module-table"]], "Making bots share user records": [[39, "making-bots-share-user-records"]], "Manifest.json": [[37, "manifest-json"]], "Match Characters": [[48, "match-characters"]], "Minimum Requirements": [[4, "minimum-requirements"]], "Miscellaneous Commands": [[48, "miscellaneous-commands"]], "Modifying Default Strings": [[51, "modifying-default-strings"]], "Modularizing Your Config File": [[51, "modularizing-your-config-file"]], "Module Header": [[32, "module-header"]], "Module requirements": [[29, "module-requirements"]], "Modules": [[3, "modules"], [5, "modules"], [40, "modules"]], "Modules included with Eggdrop": [[6, null]], "Must-read changes for Eggdrop v1.10": [[5, "must-read-changes-for-eggdrop-v1-10"]], "No show?": [[33, "no-show"]], "Notes Module": [[19, null], [48, "notes-module"]], "Notice": [[4, "notice"]], "Obtaining Help": [[4, "obtaining-help"]], "On the Hub Bot": [[35, "on-the-hub-bot"]], "On the Leaf Bot": [[35, "on-the-leaf-bot"]], "Output Commands": [[48, "output-commands"]], "PBKDF2 Module": [[20, null], [48, "pbkdf2-module"]], "Partyline Commands": [[21, "partyline-commands"]], "Partyline commands": [[26, "partyline-commands"]], "Partyline usage": [[16, "partyline-usage"]], "Patching Eggdrop": [[45, null]], "Pre-requisites": [[34, "pre-requisites"]], "Prerequisites": [[33, "prerequisites"]], "Protecting Botnet Communications": [[34, "protecting-botnet-communications"]], "Python Module": [[21, null]], "Quick Startup": [[3, "quick-startup"], [4, "quick-startup"]], "README": [[4, null]], "Registering with Twitch": [[53, "registering-with-twitch"]], "Removing a bind": [[48, "removing-a-bind"]], "Renaming commands": [[51, "renaming-commands"]], "Required Code": [[32, "required-code"]], "Required Server Capabilities": [[36, "required-server-capabilities"]], "Return Values": [[48, "return-values"]], "SSL Settings": [[40, "ssl-settings"]], "SSL/TLS Settings": [[50, "ssl-tls-settings"]], "Scripts": [[5, "scripts"], [40, "scripts"], [50, "scripts"]], "Secure (TLS) Links": [[39, "secure-tls-links"]], "Secure DCC": [[50, "secure-dcc"]], "Seen Module": [[22, null]], "Self-logging": [[51, "self-logging"]], "Server Module": [[23, null]], "Setting Up Eggdrop": [[33, null]], "Setting up SASL authentication": [[31, "setting-up-sasl-authentication"]], "Settings": [[42, "settings"]], "Share Module": [[24, null]], "Sharing Userfiles": [[35, null]], "Solo configuration": [[46, "solo-configuration"]], "Some things you can do with Eggdrop": [[2, "some-things-you-can-do-with-eggdrop"]], "Stackable Binds: HT_STACKABLE": [[8, "stackable-binds-ht-stackable"]], "Stackable binds": [[48, "stackable-binds"]], "Starting the Eggdrop": [[33, "starting-the-eggdrop"]], "Submitting a patch via GitHub": [[45, "submitting-a-patch-via-github"]], "Summary": [[8, "summary"]], "Supported CAP capabilities": [[43, "supported-cap-capabilities"]], "System Pre-Requisites": [[4, "system-pre-requisites"]], "System Requirements": [[21, "system-requirements"], [47, "system-requirements"]], "Systemd Method (Newer Systems)": [[31, "systemd-method-newer-systems"]], "TCP Connections": [[48, "tcp-connections"]], "TLS support": [[50, null]], "Tcl API": [[26, "tcl-api"]], "Tcl Commands": [[5, "tcl-commands"], [21, "tcl-commands"], [37, "tcl-commands"]], "Tcl File": [[37, "tcl-file"]], "Tcl Interface": [[46, "tcl-interface"]], "Terms": [[39, "terms"]], "Textfile Substitutions": [[49, null]], "The Party Line": [[44, null]], "The super-short version": [[33, "the-super-short-version"]], "Transfer Module": [[25, null]], "Triggering any Bind": [[8, "triggering-any-bind"]], "Tutorials": [[2, null]], "Twitch": [[53, null]], "Twitch IRC limitations": [[53, "twitch-irc-limitations"]], "Twitch Module": [[26, null]], "Twitch web UI functions": [[53, "twitch-web-ui-functions"]], "Upgrading": [[4, "upgrading"]], "Upgrading Eggdrop": [[5, null]], "Uptime Module": [[27, null]], "Usage": [[42, "usage"], [43, "usage"], [46, "usage"], [50, "usage"]], "User Record Manipulation Commands": [[48, "user-record-manipulation-commands"]], "Users and Flags": [[54, null]], "Using Accounts with Tcl Scripts": [[36, "using-accounts-with-tcl-scripts"]], "Using Eggdrop": [[2, null]], "Using botflags": [[39, "using-botflags"]], "Using certificates to authenticate Eggdrops": [[39, "using-certificates-to-authenticate-eggdrops"]], "Using the Bind in Tcl": [[8, "using-the-bind-in-tcl"]], "Using the Python Module": [[47, null]], "Value-based Channel Settings": [[11, "value-based-channel-settings"]], "Variables in Your Config": [[51, "variables-in-your-config"]], "WHOX": [[36, "whox"]], "What are modules?": [[7, "what-are-modules"]], "What is Eggdrop?": [[4, "what-is-eggdrop"]], "What is a botnet?": [[39, "what-is-a-botnet"]], "What to do with a module?": [[29, "what-to-do-with-a-module"]], "Where to find more help": [[2, "where-to-find-more-help"]], "Woobie Module": [[28, null]], "Writing a Basic Eggdrop Module": [[32, null]], "Writing a module for use with Eggdrop": [[47, "writing-a-module-for-use-with-eggdrop"]], "Writing an Eggdrop Python script": [[47, "writing-an-eggdrop-python-script"]], "Writing an Eggdrop Script": [[30, null]], "account-notify": [[36, "account-notify"]], "account-tag": [[36, "account-tag"]], "account2nicks [channel]": [[48, "account2nicks-account-channel"]], "accounttracking": [[48, "accounttracking"]], "addbot
[botport [userport]]": [[48, "addbot-handle-address-botport-userport"]], "addchanrec ": [[48, "addchanrec-handle-channel"]], "adduser [hostmask]": [[48, "adduser-handle-hostmask"]], "and": [[48, "and"]], "assoc [name]": [[48, "assoc-chan-name"]], "backup": [[48, "backup"]], "banlist [channel]": [[48, "banlist-channel"]], "bind ": [[47, "bind-arguments"]], "bind [proc-name]": [[48, "bind-type-flags-keyword-mask-proc-name"]], "binds [type/mask]": [[48, "binds-type-mask"]], "boot [reason]": [[48, "boot-user-bot-reason"]], "botattr [changes [channel]]": [[48, "botattr-handle-changes-channel"]], "botishalfop [channel]": [[48, "botishalfop-channel"]], "botisop [channel]": [[48, "botisop-channel"]], "botisvoice [channel]": [[48, "botisvoice-channel"]], "botlist": [[48, "botlist"]], "botname": [[48, "botname"]], "botnick": [[48, "botnick"]], "botonchan [channel]": [[48, "botonchan-channel"]], "bots": [[48, "bots"]], "callevent ": [[48, "callevent-event"]], "cap [arg]": [[48, "cap-ls-values-req-enabled-raw-arg"]], "chanbans ": [[48, "chanbans-channel"]], "chandname2name ": [[48, "chandname2name-channel-dname"]], "chanexempts ": [[48, "chanexempts-channel"]], "chaninvites ": [[48, "chaninvites-channel"]], "chanlist [flags][<&|>chanflags]": [[48, "chanlist-channel-flags-chanflags"]], "channame2dname ": [[48, "channame2dname-channel-name"]], "channel add [option-list]": [[48, "channel-add-name-option-list"]], "channel get [setting]": [[48, "channel-get-name-setting"]], "channel info ": [[48, "channel-info-name"]], "channel remove ": [[48, "channel-remove-name"]], "channel set ": [[48, "channel-set-name-options"]], "channels": [[48, "channels"]], "chansettype ": [[48, "chansettype-setting"]], "chattr [changes [channel]]": [[48, "chattr-handle-changes-channel"]], "chhandle ": [[48, "chhandle-old-handle-new-handle"]], "clean