From c45924c92ef84a700f832bcf80079c03eda06d78 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:05:54 +0100 Subject: [PATCH 01/20] Call threaddata() once before loop Patch by: michaelortmann --- src/net.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/net.c b/src/net.c index b5dbd04e9..167d55803 100644 --- a/src/net.c +++ b/src/net.c @@ -483,6 +483,7 @@ static int proxy_connect(int sock, sockname_t *addr) sockname_t name; char host[121], s[256]; int i, port, proxy; + struct threaddata *td = threaddata(); if (!firewall[0]) return -2; @@ -505,7 +506,7 @@ static int proxy_connect(int sock, sockname_t *addr) if (connect(sock, &name.addr.sa, name.addrlen) < 0 && errno != EINPROGRESS) return -1; if (proxy == PROXY_SOCKS) { - for (i = 0; i < threaddata()->MAXSOCKS; i++) + for (i = 0; i < td->MAXSOCKS; i++) if (!(socklist[i].flags & SOCK_UNUSED) && socklist[i].sock == sock) socklist[i].flags |= SOCK_PROXYWAIT; /* drummer */ memcpy(host, &addr->addr.s4.sin_addr.s_addr, 4); @@ -547,6 +548,7 @@ int open_telnet_raw(int sock, sockname_t *addr) fd_set sockset; struct timeval tv; int i, j, rc, res; + struct threaddata *td = threaddata(); for (i = 0; i < dcc_total; i++) if (dcc[i].sock == sock) { /* Got idx from sock ? */ @@ -563,7 +565,7 @@ int open_telnet_raw(int sock, sockname_t *addr) if (bind(sock, &name.addr.sa, name.addrlen) < 0) { return -1; } - for (j = 0; j < threaddata()->MAXSOCKS; j++) { + for (j = 0; j < td->MAXSOCKS; j++) { if (!(socklist[j].flags & SOCK_UNUSED) && (socklist[j].sock == sock)) socklist[j].flags = (socklist[j].flags & ~SOCK_VIRTUAL) | SOCK_CONNECT; } @@ -1103,8 +1105,9 @@ int sockgets(char *s, int *len) char xx[RECVLINEMAX], *p, *px, *p2; int ret, i, data = 0; size_t len2; + struct threaddata *td = threaddata(); - for (i = 0; i < threaddata()->MAXSOCKS; i++) { + for (i = 0; i < td->MAXSOCKS; i++) { /* Check for stored-up data waiting to be processed */ if (!(socklist[i].flags & (SOCK_UNUSED | SOCK_TCL | SOCK_BUFFER)) && (socklist[i].handler.sock.inbuf != NULL)) { @@ -1168,7 +1171,7 @@ int sockgets(char *s, int *len) } /* No pent-up data of any worth -- down to business */ *len = 0; - ret = sockread(xx, len, socklist, threaddata()->MAXSOCKS, 0); + ret = sockread(xx, len, socklist, td->MAXSOCKS, 0); if (ret < 0) { s[0] = 0; return ret; @@ -1290,6 +1293,7 @@ void tputs(int z, char *s, unsigned int len) int i, x, idx; char *p; static int inhere = 0; + struct threaddata *td = threaddata(); if (z < 0) /* um... HELLO?! sanity check please! */ return; @@ -1299,7 +1303,7 @@ void tputs(int z, char *s, unsigned int len) return; } - for (i = 0; i < threaddata()->MAXSOCKS; i++) { + for (i = 0; i < td->MAXSOCKS; i++) { if (!(socklist[i].flags & SOCK_UNUSED) && (socklist[i].sock == z)) { for (idx = 0; idx < dcc_total; idx++) { if ((dcc[idx].sock == z) && dcc[idx].type && dcc[idx].type->name) { @@ -1382,13 +1386,14 @@ void dequeue_sockets() fd_set wfds; struct timeval tv; int maxfd = -1; + struct threaddata *td = threaddata(); /* ^-- start poptix test code, this should avoid writes to sockets not ready to be written to. */ FD_ZERO(&wfds); tv.tv_sec = 0; tv.tv_usec = 0; /* we only want to see if it's ready for writing, no need to actually wait.. */ - for (i = 0; i < threaddata()->MAXSOCKS; i++) + for (i = 0; i < td->MAXSOCKS; i++) if (!(socklist[i].flags & (SOCK_UNUSED | SOCK_TCL)) && (socklist[i].handler.sock.outbuf != NULL)) { if (socklist[i].sock > maxfd) @@ -1407,7 +1412,7 @@ void dequeue_sockets() if (x <= 0) return; - for (i = 0; i < threaddata()->MAXSOCKS; i++) { + for (i = 0; i < td->MAXSOCKS; i++) { if (!(socklist[i].flags & (SOCK_UNUSED | SOCK_TCL)) && (socklist[i].handler.sock.outbuf != NULL) && (FD_ISSET(socklist[i].sock, &wfds))) { #ifdef CYGWIN_HACKS @@ -1497,9 +1502,10 @@ void tell_netdebug(int idx) { int i; char s[80]; + struct threaddata *td = threaddata(); dprintf(idx, "Open sockets:"); - for (i = 0; i < threaddata()->MAXSOCKS; i++) { + for (i = 0; i < td->MAXSOCKS; i++) { if (!(socklist[i].flags & SOCK_UNUSED)) { sprintf(s, " %d", socklist[i].sock); if (socklist[i].flags & SOCK_BINARY) @@ -1625,11 +1631,12 @@ int hostsanitycheck_dcc(char *nick, char *from, sockname_t *ip, char *dnsname, int sock_has_data(int type, int sock) { int ret = 0, i; + struct threaddata *td = threaddata(); - for (i = 0; i < threaddata()->MAXSOCKS; i++) + for (i = 0; i < td->MAXSOCKS; i++) if (!(socklist[i].flags & SOCK_UNUSED) && socklist[i].sock == sock) break; - if (i < threaddata()->MAXSOCKS) { + if (i < td->MAXSOCKS) { switch (type) { case SOCK_DATA_OUTGOING: ret = (socklist[i].handler.sock.outbuf != NULL); @@ -1657,9 +1664,10 @@ int flush_inbuf(int idx) { int i, len; char *inbuf; + struct threaddata *td = threaddata(); Assert((idx >= 0) && (idx < dcc_total)); - for (i = 0; i < threaddata()->MAXSOCKS; i++) { + for (i = 0; i < td->MAXSOCKS; i++) { if ((dcc[idx].sock == socklist[i].sock) && !(socklist[i].flags & SOCK_UNUSED)) { len = socklist[i].handler.sock.inbuflen; From 0643f57bf0b225ae07f1e3b042834c2a782b4bcf Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:06:53 +0100 Subject: [PATCH 02/20] Call time() only once Call time() only once during mainloop() and core_secondly() --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 6ac8ec908..1527406bb 100644 --- a/src/main.c +++ b/src/main.c @@ -631,7 +631,7 @@ static void core_secondly() tell_mem_status_dcc(DP_STDOUT); } } - nowmins = time(NULL) / 60; + nowmins = now / 60; if (nowmins > lastmin) { memcpy(&nowtm, localtime(&now), sizeof(struct tm)); i = 0; From c603b00117b605f4a0c403425476796f6cb316a7 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:08:43 +0100 Subject: [PATCH 03/20] Add homepage to configure.ac --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8fe1a8fd4..61c67d4e4 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl configure.ac: this file is processed by autoconf to produce ./configure. AC_PREREQ([2.71]) -AC_INIT([Eggdrop],[1.9.5],[bugs@eggheads.org]) +AC_INIT([Eggdrop],[1.9.5],[bugs@eggheads.org],[eggdrop],[https://www.eggheads.org]) AC_COPYRIGHT([Copyright (C) 1999 - 2023 Eggheads Development Team]) AC_LANG([C]) AC_REVISION([m4_esyscmd([misc/getcommit])]) From 43358bdad3cc4bdd243ea70befe1d295dae57a44 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:22:20 +0100 Subject: [PATCH 04/20] Cleanup stringify --- src/main.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main.h b/src/main.h index 75faf4625..3cba18fd3 100644 --- a/src/main.h +++ b/src/main.h @@ -127,11 +127,7 @@ extern struct dcc_table DCC_CHAT, DCC_BOT, DCC_LOST, DCC_SCRIPT, DCC_BOT_NEW, /* Default recommended flags for this user, use | as splitter */ #define EGG_BG_CONMASK LOG_MISC /* "o" */ -/* Stringify macros */ -#define EGG_MACRO_STR(x) EGG_STR(x) -#define EGG_STR(x) #x - -#define EGG_AC_ARGS EGG_MACRO_STR(EGG_AC_ARGS_RAW) +#define EGG_AC_ARGS STRINGIFY(EGG_AC_ARGS_RAW) #define ARRAY_SIZE(x) (sizeof (x) / sizeof *(x)) From 82ca2a8707cb736451c602774372795d082ed9b7 Mon Sep 17 00:00:00 2001 From: Geo Date: Sat, 30 Dec 2023 16:41:04 -0500 Subject: [PATCH 05/20] Various small doc updates * Update chanlist description * Update blowfish modinfo * Update PBKDF2 description * Update included.rst * Update modinfo --- doc/sphinx_source/modules/included.rst | 2 +- doc/sphinx_source/using/tcl-commands.rst | 2 +- src/mod/blowfish.mod/modinfo | 12 ++++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/sphinx_source/modules/included.rst b/doc/sphinx_source/modules/included.rst index 1862459c7..e6b322915 100644 --- a/doc/sphinx_source/modules/included.rst +++ b/doc/sphinx_source/modules/included.rst @@ -73,7 +73,7 @@ Modules included with Eggdrop later retrieval. :ref:`pbkdf2` - This modules updates Eggdrop to use PBKDF2 for hashing purposes, such as for userfile passwords. It was specifically designed to work with the blowfish module to make the transition from blowfish to pbkdf2 password hashing as easy as possible. If you are transitioning a userfile from 1.8 or earlier, you should load this AND the blowfish module. By doing so, Eggdrop will seamlessly update the old blowfish hashes to the new PBKDF2 hashes once a user logs in for the first time, and allow you to (eventually) remove the blowfish module altogether. For new bots, you should load this module by itself and not use the blowfish module. The blowfish module is still required for encrypting/decrypting strings. Eggdrop will not start without an encryption module loaded. + This modules updates Eggdrop to use PBKDF2 for hashing purposes, such as for userfile passwords. It was specifically designed to work with the blowfish module to make the transition from blowfish to pbkdf2 password hashing as easy as possible. If you are transitioning a userfile from 1.8 or earlier, you should load this AND the blowfish module. By doing so, Eggdrop will seamlessly update the old blowfish hashes to the new PBKDF2 hashes once a user logs in for the first time, and allow you to (eventually) remove the blowfish module altogether. For new bots, you should load this module by itself and not use the blowfish module. The blowfish module is still required if you use Tcl to encrypt/decrypt strings in Tcl (ie, some scripts). Eggdrop will not start without a password-hashing module loaded. :ref:`seen` This module provides very basic seen commands via msg, on channel diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 995bc6aa5..746f42a31 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -1338,7 +1338,7 @@ onchansplit [channel] chanlist [flags][<&|>chanflags] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Description: flags are any global flags; the '&' or '\|' denotes to look for channel specific flags, where '&' will return users having ALL chanflags and '|' returns users having ANY of the chanflags (See `Flag Masks`_ for additional information). + Description: lists all users on a channel Eggdrop has joined. flags are any global flags; the '&' or '\|' denotes to look for channel specific flags, where '&' will return users having ALL chanflags and '|' returns users having ANY of the chanflags (See `Flag Masks`_ for additional information). Returns: Searching for flags optionally preceded with a '+' will return a list of nicknames that have all the flags listed. Searching for flags preceded with a '-' will return a list of nicknames that do not have have any of the flags (differently said, '-' will hide users that have all flags listed). If no flags are given, all of the nicknames on the channel are returned. diff --git a/src/mod/blowfish.mod/modinfo b/src/mod/blowfish.mod/modinfo index 48f684b66..38680580d 100644 --- a/src/mod/blowfish.mod/modinfo +++ b/src/mod/blowfish.mod/modinfo @@ -1,5 +1,9 @@ -DESC:The blowfish module provides encryption support for eggdrop. You always -DESC:need to load an encryption module to run eggdrop. Currently, blowfish -DESC:is the only encryption module, so you don't have much choice. +DESC:The blowfish module provides encryption and hashing support for eggdrop. +DESC:Eggdrop requires a module that provides hashing in order to protect +DESC:passwords. While the PBKDF2 module is the current recommended module for +DESC:password hashing, you should still run this module if you want to use +DESC:functions such as the Tcl 'encrypt' command. DESC: -DESC:ENABLE this module. +DESC:Enable this module if you are transitioning from userfiles previously +DESC:created with the blowfish module, or are using Tcl scripts that use +DESC:the encrypt function. From eb4ec420672c1c7542c32775417525a5414ee1c1 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 30 Dec 2023 23:37:31 +0100 Subject: [PATCH 06/20] Add log for TLS DH ephemeral key info --- src/tls.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/tls.c b/src/tls.c index 615a1d2ac..d9500b799 100644 --- a/src/tls.c +++ b/src/tls.c @@ -739,7 +739,8 @@ static void ssl_info(const SSL *ssl, int where, int ret) const #endif SSL_CIPHER *cipher; - int secret, processed; + int secret, processed, i; + EVP_PKEY *key; if (!(data = (ssl_appdata *) SSL_get_app_data(ssl))) return; @@ -770,15 +771,23 @@ static void ssl_info(const SSL *ssl, int where, int ret) /* Display cipher information */ cipher = SSL_get_current_cipher(ssl); processed = SSL_CIPHER_get_bits(cipher, &secret); - putlog(LOG_DEBUG, "*", "TLS: cipher used: %s %s; %d bits (%d secret)", - SSL_CIPHER_get_name(cipher), SSL_get_version(ssl), - processed, secret); + putlog(LOG_DEBUG, "*", "TLS: cipher used: %s, %d of %d secret bits used for cipher, %s", + SSL_CIPHER_get_name(cipher), processed, secret, SSL_get_version(ssl)); /* secret are the actually secret bits. If processed and secret differ, the rest of the bits are fixed, i.e. for limited export ciphers */ /* More verbose information, for debugging only */ SSL_CIPHER_description(cipher, buf, sizeof buf); + i = strlen(buf); + if ((i > 0) && (buf[i - 1]) == '\n') + buf[i - 1] = 0; debug1("TLS: cipher details: %s", buf); + + if (SSL_get_server_tmp_key((SSL *) ssl, &key)) { + putlog(LOG_DEBUG, "*", "TLS: diffie–hellman ephemeral key used: %s, bits %d", + OBJ_nid2sn(EVP_PKEY_id(key)), EVP_PKEY_bits(key)); + EVP_PKEY_free(key); + } } else if (where & SSL_CB_ALERT) { if (strcmp(SSL_alert_type_string(ret), "W") || strcmp(SSL_alert_desc_string(ret), "CN")) { From 22eace0fbe01fc54a3ae5b9877138683e2a45f19 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 31 Dec 2023 02:10:17 +0100 Subject: [PATCH 07/20] Add grammar to channel status Found by: jackal Patch by: jackal Fix log output for channel ("1 channels" -> "1 channel") --- src/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 1527406bb..6d221a7f8 100644 --- a/src/main.c +++ b/src/main.c @@ -1001,7 +1001,7 @@ static void init_random(void) { int main(int arg_c, char **arg_v) { - int i, xx; + int i, j, xx; char s[25]; FILE *f; struct sigaction sv; @@ -1136,8 +1136,9 @@ int main(int arg_c, char **arg_v) i = 0; for (chan = chanset; chan; chan = chan->next) i++; - putlog(LOG_MISC, "*", "=== %s: %d channels, %d users.", - botnetnick, i, count_users(userlist)); + j = count_users(userlist); + putlog(LOG_MISC, "*", "=== %s: %d channel%s, %d user%s.", + botnetnick, i, (i == 1) ? "" : "s", j, (j == 1) ? "" : "s"); if ((cliflags & CLI_N) && (cliflags & CLI_T)) { printf("\n"); printf("NOTE: The -n flag is no longer used, it is as effective as Han\n"); From 7c5dc0c9f44506047b2beae2fcfcded6d6318727 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 31 Dec 2023 02:11:30 +0100 Subject: [PATCH 08/20] Typo fixes --- doc/Changes1.1 | 6 +++--- doc/Changes1.3 | 2 +- doc/Changes1.4 | 14 +++++++------- doc/sphinx_source/tutorials/setup.rst | 2 +- doc/sphinx_source/using/tcl-commands.rst | 4 ++-- src/mod/twitch.mod/twitch.c | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/Changes1.1 b/doc/Changes1.1 index 2a191d4fe..0fbf77083 100644 --- a/doc/Changes1.1 +++ b/doc/Changes1.1 @@ -735,7 +735,7 @@ Eggdrop Changes (since version 1.0) - Added SILENCE define for ircdu's silence command Patch by: Wild - - Changed channel defalts to +DYNAMICBANS instead of +ENFORCBANS (my test + - Changed channel defaults to +DYNAMICBANS instead of +ENFORCBANS (my test bot kept dumping 200+ bans to channels that i added, even when it wasn't opped :/ ) Patch by: Wild @@ -938,7 +938,7 @@ Eggdrop Changes (since version 1.0) Patch by: Beldin - Fixed the showinfo on join, so that nasty '@' wouldnt show up, also, a - globaly locked info line will override a channel one, unless the channel + globally locked info line will override a channel one, unless the channel one is locked too (comments???) Patch by: Beldin @@ -1095,7 +1095,7 @@ Eggdrop Changes (since version 1.0) Patch by: Beldin - Fixed the showinfo on join, so that nasty '@' wouldnt show up, also, a - globaly locked info line will override a channel one, unless the channel + globally locked info line will override a channel one, unless the channel one is locked too (comments???) Patch by: Beldin diff --git a/doc/Changes1.3 b/doc/Changes1.3 index 7124d921d..a96006cd4 100644 --- a/doc/Changes1.3 +++ b/doc/Changes1.3 @@ -1753,7 +1753,7 @@ Eggdrop Changes (since version 1.3.0) 1.3.11 (February 25, 1998): - newsplit() doesn't need to set what's 0 to 0 (this is what was really - causeing the no-args botnet crash, only join actually didn't handle no + causing the no-args botnet crash, only join actually didn't handle no args correctly) Found by: easton / Patch by: Beldin diff --git a/doc/Changes1.4 b/doc/Changes1.4 index 52ad2a920..a2ae1375e 100644 --- a/doc/Changes1.4 +++ b/doc/Changes1.4 @@ -562,7 +562,7 @@ Eggdrop Changes (since version 1.4.0) Patch by: drummer - Bot now doesn't return "Can't link there" anymore if the first botlink - attempt failes + attempt fails Found by: Dude / Patch by: Fabian - Crash in gotnotice for invalid channels as notice target @@ -587,7 +587,7 @@ Eggdrop Changes (since version 1.4.0) - Not sending ISON during irc login now Patch by: Fabian - - Added several sanity checks to avoid crashs in obscure situations, e.g. + - Added several sanity checks to avoid crashes in obscure situations, e.g. -1 channel members Found by: arthur2 / Patch by: Fabian @@ -647,7 +647,7 @@ Eggdrop Changes (since version 1.4.0) Patch by: Tothwolf - Major rewrite of configure.in and all the Makefiles, including better - Tcl detection and support for more Tcl versons. better support for IRIX, + Tcl detection and support for more Tcl versions. better support for IRIX, OSF, Lynx, and Cygwin (however support for Cygwin is unsupported) Patch by: Tothwolf @@ -1005,7 +1005,7 @@ Eggdrop Changes (since version 1.4.0) - Fixed .chat to accept the proper channel range (0-99999) Patch by: rtc - - Several putlogs had superflous newlines + - Several putlogs had superfluous newlines Patch by: rtc - Fixed memleak in fstat_unpack @@ -1096,7 +1096,7 @@ Eggdrop Changes (since version 1.4.0) - Race in tmp-dir test Found by: poptix / Patch by: Fabian - - Tiny compability fix in misc.c for osf + - Tiny compatibility fix in misc.c for osf Found by: SuperS / Patch by: Fabian - New .stick handling @@ -1212,7 +1212,7 @@ Eggdrop Changes (since version 1.4.0) - memberlistflag-fixes Patch by: Eule - - Mutliple modes were sent by bot. missing SENTDEOP/OP/DEVOICE/VOICE/KICK + - Multiple modes were sent by bot. missing SENTDEOP/OP/DEVOICE/VOICE/KICK flags in irc.mod. Found by: TheUnknown / Patch by: arthur2 @@ -1258,7 +1258,7 @@ Eggdrop Changes (since version 1.4.0) cleartext passwords while linking :)))) Patch by: Cybah - - Removed all occurences of movefile + - Removed all occurrences of movefile Patch by: Fabian - Only reading notes file on join when really needed diff --git a/doc/sphinx_source/tutorials/setup.rst b/doc/sphinx_source/tutorials/setup.rst index dac600327..641503cae 100644 --- a/doc/sphinx_source/tutorials/setup.rst +++ b/doc/sphinx_source/tutorials/setup.rst @@ -20,7 +20,7 @@ The super-short version You can read the `Installation`_ section for a more detailed explanation of these steps. 1. Download the `latest stable Eggdrop release `_ to your shell via FTP, or simply type ``wget geteggdrop.com -O eggdrop-1.9.5.tar.gz`` -2. From the commadline of your shell, type ``tar zxvf eggdrop-1.9.5.tar.gz`` +2. From the commandline of your shell, type ``tar zxvf eggdrop-1.9.5.tar.gz`` 3. Type ``cd eggdrop-1.9.5`` 4. Type ``./configure`` 5. Type ``make config`` diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 746f42a31..9d0f53df1 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -1105,7 +1105,7 @@ monitor [nickname] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Description: interacts with the list of nicknames Eggdrop has asked the IRC server to track. valid sub-commands are add, delete, list, online, offline, status, and clear. The 'add' command sends 'nickname' to the server to track. The 'delete' command removes 'nickname' from being tracked by the server (or returns an error if the nickname is not present). The 'list' command returns a list of all nicknames the IRC server is tracking on behalf of Eggdrop. The 'online' command returns a string of tracked nicknames that are currently online. The 'offline' command returns a list of tracked nicknames that are currently offline. - Returns: The 'add' sub-command returns a '1' if the nick was succssfully added, a '0' if the nick is already in the monitor list, and a '2' if the nick could not be added. The 'delete' sub-command returns a '1' if the nick is removed, or an error if the nick is not found. The 'status' sub-command returns a '1' if 'nickname' is online or a 0 if 'nickname' is offline. The 'clear' command removes all nicknames from the list the server is monitoring. + Returns: The 'add' sub-command returns a '1' if the nick was successfully added, a '0' if the nick is already in the monitor list, and a '2' if the nick could not be added. The 'delete' sub-command returns a '1' if the nick is removed, or an error if the nick is not found. The 'status' sub-command returns a '1' if 'nickname' is online or a 0 if 'nickname' is offline. The 'clear' command removes all nicknames from the list the server is monitoring. Module: irc @@ -1113,7 +1113,7 @@ monitor [nickname] accounttracking ^^^^^^^^^^^^^^^ - Description: checks to see if the three required functionalities to enable proper account tracking are available (and enabled) to Eggdrop. This checks if the extended-join and account-notify IRCv3 capabilities are currently enabled, and checks if the server supports WHOX (based on the type of server selected in the config file, or the use-354 variable being set to 1 when seleceting an "Other" server). + Description: checks to see if the three required functionalities to enable proper account tracking are available (and enabled) to Eggdrop. This checks if the extended-join and account-notify IRCv3 capabilities are currently enabled, and checks if the server supports WHOX (based on the type of server selected in the config file, or the use-354 variable being set to 1 when selecting an "Other" server). Returns: a '1' if all three functionalities are present, a '0' if one or more are missing. diff --git a/src/mod/twitch.mod/twitch.c b/src/mod/twitch.mod/twitch.c index 4c8db4f71..c6a90aac2 100644 --- a/src/mod/twitch.mod/twitch.c +++ b/src/mod/twitch.mod/twitch.c @@ -541,7 +541,7 @@ static int gotusernotice(char *from, char *msg, Tcl_Obj *tags) { putlog(LOG_SERV, "*", "* TWITCH: %s sent a mystery gift", login); } else if (!strcmp(msgid, "giftpaidupgrade")) { GET_MSGTAG_VALUE_STR(tags, "msg-param-recipient-user-name", value, "USERNOTICE:GIFTPAIDUPGRADE"); - putlog(LOG_SERV, "*", "* TWITCH: %s gifted a subsription upgrade to %s", login, value); + putlog(LOG_SERV, "*", "* TWITCH: %s gifted a subscription upgrade to %s", login, value); } else if (!strcmp(msgid, "rewardgift")) { putlog(LOG_SERV, "*", "* TWITCH: %s sent a reward gift", login); } else if (!strcmp(msgid, "anongiftpaidupgrade")) { From 8256ee20b58d8484152d789e1007f920078f420e Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 31 Dec 2023 19:59:16 +0100 Subject: [PATCH 09/20] Enhance restricted port error msgs Patch by: michaelortmann Translation by: @PeGaSuS-Coder, roughnecks Move user/bot-only error messages to language file add stealth-telnet logic to no-access message --- language/core.danish.lang | 2 ++ language/core.english.lang | 2 ++ language/core.finnish.lang | 2 ++ language/core.french.lang | 2 ++ language/core.german.lang | 4 +++- language/core.italian.lang | 2 ++ language/core.portuguese.lang | 2 ++ src/dcc.c | 17 +++++++++++++---- src/lang.h | 2 ++ 9 files changed, 30 insertions(+), 5 deletions(-) diff --git a/language/core.danish.lang b/language/core.danish.lang index ffac6077e..56333b8aa 100644 --- a/language/core.danish.lang +++ b/language/core.danish.lang @@ -430,3 +430,5 @@ Telnet botten og skriv 'NEW' som dit nick.\n 0xe33,Mistede telnet forbindelse fra %s mens der blev tjekket for dubletter 0xe34,TIMEOUT ident forbindelse 0xe35,Please remove the #comment from your listen setting and try again +0xe36,This port is for bots only +0xe37,This port is for users only (no bots) diff --git a/language/core.english.lang b/language/core.english.lang index 1d6cd5bdb..b4e455c2a 100644 --- a/language/core.english.lang +++ b/language/core.english.lang @@ -430,3 +430,5 @@ Telnet to the bot and enter 'NEW' as your handle. 0xe33,Lost telnet connection from %s while checking for duplicate 0xe34,TIMEOUT ident connection 0xe35,Please remove the #comment from your listen setting and try again +0xe36,This port is for bots only +0xe37,This port is for users only (no bots) diff --git a/language/core.finnish.lang b/language/core.finnish.lang index f9cf8f691..83319105d 100644 --- a/language/core.finnish.lang +++ b/language/core.finnish.lang @@ -430,3 +430,5 @@ Telnettaa botille ja sy 0xe33,Telnet yhteys hukattu %s sillaikaa kun tarkistettiin tuplausta 0xe34,Kadotettu ident yhteys 0xe35,Please remove the #comment from your listen setting and try again +0xe36,This port is for bots only +0xe37,This port is for users only (no bots) diff --git a/language/core.french.lang b/language/core.french.lang index 607408beb..c25088f34 100644 --- a/language/core.french.lang +++ b/language/core.french.lang @@ -430,3 +430,5 @@ Faites un Telnet sur le bot et entrez 'NEW' comme surnom. 0xe33,Connexion telnet de %s perdue pendant la vrification des doublons 0xe34,Timeout ident connection 0xe35,Please remove the #comment from your listen setting and try again +0xe36,Ce port est rserv aux bots +0xe37,Ce port est rserv aux utilisateurs (pas de bots) diff --git a/language/core.german.lang b/language/core.german.lang index f33e80462..67af27e20 100644 --- a/language/core.german.lang +++ b/language/core.german.lang @@ -278,7 +278,7 @@ Baue eine Telnetverbindung zu dem Bot auf und gib 'NEW' als Deinen Nickname ein. 0x90b,Missbrauch eines Desync 0x90c,Flood -0xa00,keine ignorierten User +0xa00,keine ignorierten Benutzer 0xa01,Im Moment werden ignoriert 0xa02,Ignoriere nicht mehr @@ -438,3 +438,5 @@ Baue eine Telnetverbindung zu dem Bot auf und gib 'NEW' als Deinen Nickname ein. 0xe33,Telnet-Verbindung von %s waerend Kontrolle auf Duplikat verloren 0xe34,Zeitueberschreitung bei der Ident-Verbindung 0xe35,Bitte entferne den #Kommentar im listen-Befehl und versuche es erneut +0xe36,Dieser Port ist nur fuer Bots +0xe37,Dieser Port ist nur fuer Benutzer (keine Bots) diff --git a/language/core.italian.lang b/language/core.italian.lang index cad3222ba..6c3f3fb49 100644 --- a/language/core.italian.lang +++ b/language/core.italian.lang @@ -434,3 +434,5 @@ Connetti in telnet il bot e scrivi 'NEW' come tuo soprannome. 0xe33,Connessione telnet persa da %s mentre controllo se è un duplicato 0xe34,Connessione ident fuori tempo 0xe35,Per favore togli il #commento dalle tue impostazione di ascolto e riprova +0xe36,Questa porta è solo per bot +0xe37,Questa porta è solo per utenti (non bot) diff --git a/language/core.portuguese.lang b/language/core.portuguese.lang index f1347d663..e1dd8958a 100644 --- a/language/core.portuguese.lang +++ b/language/core.portuguese.lang @@ -430,3 +430,5 @@ Entre em ligação telnet com o bot e digite 'NEW' como o seu nick. 0xe33,Perdida ligação telnet de %s aquando verificação de duplicados 0xe34,Timeout em ligação de identificação 0xe35,Por favor, remova o #comentário na configuração de listen e tente novamente +0xe36,Esta porta é apenas para bots +0xe37,Esta porta é apenas para utilizadores (sem bots) diff --git a/src/dcc.c b/src/dcc.c index 88fc73c92..931c37d63 100644 --- a/src/dcc.c +++ b/src/dcc.c @@ -1601,8 +1601,16 @@ static void dcc_telnet_id(int idx, char *buf, int atr) #endif /* Make sure users-only/bots-only connects are honored */ if ((dcc[idx].status & STAT_BOTONLY) && !glob_bot(fr)) { - dprintf(idx, "This telnet port is for bots only.\n"); - putlog(LOG_BOTS, "*", DCC_NONBOT, dcc[idx].host); + if (dcc[idx].user) { + dprintf(idx, "%s\n", DCC_NONBOT2); + putlog(LOG_BOTS, "*", DCC_NONBOT, dcc[idx].host); + } + else { + if (!stealth_telnets) { + dprintf(idx, "You don't have access.\n"); + } + putlog(LOG_MISC, "*", DCC_INVHANDLE, dcc[idx].host, buf); + } killsock(dcc[idx].sock); lostdcc(idx); return; @@ -1610,7 +1618,7 @@ static void dcc_telnet_id(int idx, char *buf, int atr) if ((dcc[idx].status & STAT_USRONLY) && glob_bot(fr)) { /* change here temp to use bot output */ dcc[idx].type = &DCC_BOT_NEW; - dprintf(idx, "error Only users may connect at this port.\n"); + dprintf(idx, "%s\n", DCC_NONUSER2); dcc[idx].type = old; putlog(LOG_BOTS, "*", DCC_NONUSER, dcc[idx].host); killsock(dcc[idx].sock); @@ -1635,7 +1643,8 @@ static void dcc_telnet_id(int idx, char *buf, int atr) ok = 1; if (!ok) { - dprintf(idx, "You don't have access.\n"); + if (!stealth_telnets) + dprintf(idx, "You don't have access.\n"); putlog(LOG_MISC, "*", DCC_INVHANDLE, dcc[idx].host, buf); killsock(dcc[idx].sock); lostdcc(idx); diff --git a/src/lang.h b/src/lang.h index 2609e6651..a130819b3 100644 --- a/src/lang.h +++ b/src/lang.h @@ -490,5 +490,7 @@ #define DCC_LOSTDUP get_language(0xe33) #define DCC_TIMEOUTIDENT get_language(0xe34) #define DCC_BADLISTEN get_language(0xe35) +#define DCC_NONBOT2 get_language(0xe36) +#define DCC_NONUSER2 get_language(0xe37) #endif /* _EGG_LANG_H */ From b774e92c13e54b922e53552136121dbbaadc69b9 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 1 Jan 2024 18:53:18 -0500 Subject: [PATCH 10/20] Replace hard-coded docs version with variable Patch by: Geo Fixes: #1516 --- doc/html/tutorials/setup.html | 70 +++++++++++++-------------- doc/sphinx_source/conf.py | 13 ++++- doc/sphinx_source/modules/index.rst | 2 +- doc/sphinx_source/tutorials/setup.rst | 45 ++++++++--------- doc/sphinx_source/using/text-sub.rst | 44 ++++++++--------- 5 files changed, 93 insertions(+), 81 deletions(-) diff --git a/doc/html/tutorials/setup.html b/doc/html/tutorials/setup.html index 128c388a9..9ea9ffed5 100644 --- a/doc/html/tutorials/setup.html +++ b/doc/html/tutorials/setup.html @@ -1,17 +1,16 @@ - - + - + Setting Up Eggdrop — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -105,10 +104,10 @@

Search

-

Setting Up Eggdrop

+

Setting Up Eggdrop

This guide was based off perhaps the most helpful Eggdrop website ever written, egghelp.org by slennox. As happens with life, slennox has moved on and no longer updates it, but the information here is still incredibly useful. We have updated his setup page here and hope it will continue to prove useful to our users

-

Prerequisites

+

Prerequisites

Make sure Tcl AND it’s dev packages are installed on your system. On Debian-based systems, this is done with:

sudo apt-get install tcl tcl-dev
 
@@ -119,12 +118,13 @@

Prerequisites -

The super-short version

+

The super-short version

You can read the Installation section for a more detailed explanation of these steps.

    -
  1. Download the latest stable Eggdrop release to your shell via FTP, or simply type wget geteggdrop.com -O eggdrop-1.9.5.tar.gz

  2. -
  3. From the commadline of your shell, type tar zxvf eggdrop-1.9.5.tar.gz

  4. -
  5. Type cd eggdrop-1.9.5

  6. +
  7. Download the current version of Eggdrop to your shell via FTP, or simply type: wget geteggdrop.com -O eggdrop-1.9.5.tar.gz

  8. +
  9. Next, from the commandline of the shell, ensure you are in the same directory that you downloaded the tar file into

  10. +
  11. Type: tar zxvf eggdrop-1.9.5.tar.gz

  12. +
  13. Type: cd eggdrop-1.9.5

  14. Type ./configure

  15. Type make config

  16. Type make

  17. @@ -135,42 +135,42 @@

    The super-short version

-

Getting the source

+

Getting the source

-

History

+

History

The current supported version of Eggdrop is the 1.9.x tree. The 1.8 and 1.6 series, while still popular, are no longer supported by the developers.

-

The most current version of Eggdrop, and the one appropriate for most users, is the current 1.9 series. It added many features such as SASL support, multi-ip listening, and a new password hashing module. It is the most complete, feature-rich, and functional version of Eggdrop. If you’re just starting out with Eggdrop, you should use 1.9.5

-

Prior to that, the 1.8 series added several major features, to include IPv6 support and SSL/TLS connections. 1.6.21, which is now over 10 years old, was the last release of the 1.6 series and is still used by users who have become comfortable with that version and may have spent much time applying their own modifications to make it work the way they want, and therefore don’t wish to move to a newer version. The majority of Tcl scripts out there were written for 1.6 bots, but those scripts usually work on 1.8 and 1.9 bots as well.

+

The most current version of Eggdrop, and the one appropriate for most users, is the current 1.9 series. It added many features such as SASL support, multi-ip listening, and a new password hashing module. It is the most complete, feature-rich, and functional version of Eggdrop. If you’re just starting out with Eggdrop, you should use 1.9.5.

+

Prior to that, the 1.8 series added several major features, to include IPv6 support and SSL/TLS connections. 1.6.21, which is now over 10 years old, was the last release of the 1.6 series. Because Eggdrop remained at the 1.6.21 patchlevel for several years it is still often run by users who have become comfortable with that version and don’t wish to move to a newer version- however, it is getting harder and harder to continue running 1.6 bots on modern Linux systems. Tcl scripts written for bots as far back as the 1.6 series generally work on all later versions of Eggdrop as well, so if you haven’t already- upgrade!

The 1.9 Eggdrop tree is currently under active development and the most recent changes are available in daily snapshots for users to download for testing. While the development snapshot will contain the most current, up-to-date features of Eggdrop, it is not yet considered stable and users stand a higher chance of encountering bugs during use. If you do use it and find a bug, it is highly encouraged to report it via the Eggheads GitHub issues page.

-

Download locations

-

The developers distribute Eggdrop via two main methods: FTP, and GitHub. For FTP, it is packaged in tarball format (with the .tar.gz filename extension), with the version number in the filename. The Eggdrop 1.9.5 source, for example, would be named eggdrop-1.9.5.tar.gz.

-

The Eggheads FTP is a repository for the current version of Eggdrop, as well as the most current development snapshot and previous stable releases.

-

Eggdrop also maintains a GitHub page where you can download the development snapshot or a stable version, via either git commandline or by downloading a tarball. To download via git, type git clone https://github.com/eggheads/eggdrop.git, then cd eggdrop. This gives you the development version. To switch to the most recent stable version, type git checkout stable/1.9. You can then skip to step 4 in the Installation section below.

+

Download locations

+

The developers distribute Eggdrop via two main methods: FTP, and GitHub. For FTP, it is packaged in tarball format (with the .tar.gz filename extension), with the version number in the filename. The Eggdrop 1.9.5 source, for example, would be named eggdrop-1.9.5.tar.gz.

+

The Eggheads FTP is a repository for the current version of Eggdrop, as well as the most current development snapshot and previous stable releases.

+

Eggdrop also maintains a GitHub page where you can download the development snapshot or a stable version, via either git commandline or by downloading a tarball. To download via git, type git clone https://github.com/eggheads/eggdrop.git, then cd eggdrop. This gives you the development version. To switch to the most recent stable version, type git checkout stable/1.9. You can then skip to step 4 in the Installation section below.

-

Installation

+

Installation

Installing Eggdrop is a relatively simple process provided your shell has the required tools for successful compilation. On most commercial shell accounts which allow Eggdrop bots you won’t have any problems with installation, but on some private boxes or a shell on your ISP you may experience errors during compilation.

-

Below is a step by step guide to the installation process. These instructions apply to 1.9 bots. It assumes you will be installing eggdrop-1.9.5.tar.gz, so just change the numbers if you are installing another version.

+

Below is a step by step guide to the installation process. These instructions apply to 1.9 bots. It assumes you will be installing eggdrop-1.9.5.tar.gz, so just change the numbers if you are installing another version.

    -
  1. Put the Eggdrop source on your shell using one of the specified download locations, either by downloading the eggdrop-1.9.5.tar.gz file to your system then uploading it to the shell via FTP, or downloading it directly to the shell via the shell’s FTP client, git, wget, or curl. You don’t need to put the .tar.gz file in its own directory (it’ll be done automatically in the next step).

  2. -
  3. SSH to the shell (if you haven’t already), and type tar zxvf eggdrop-1.9.5.tar.gz (if this doesn’t work, try gunzip eggdrop-1.9.5.tar.gz then tar xvf eggdrop-1.9.5.tar). This will extract the Eggdrop source into its installation directory, named ‘eggdrop-1.9.5’.

  4. -
  5. Type cd eggdrop-1.9.5 switch to the directory the Eggdrop source was extracted to.

  6. +
  7. Put the Eggdrop source on your shell using one of the specified download locations, either by downloading the current version of Eggdrop to your local system and then uploading it to the shell via FTP, or downloading it directly to the shell via the shell’s FTP client, git, wget, or curl. You don’t need to put the .tar.gz file in its own directory (it’ll be done automatically in the next step).

  8. +
  9. SSH to the shell (if you haven’t already), and type tar zxvf eggdrop-1.9.5.tar.gz (if this doesn’t work, try gunzip eggdrop-1.9.5.tar.gz then tar xvf eggdrop-1.9.5.tar). This will extract the Eggdrop source into its installation directory, named eggdrop-1.9.5.

  10. +
  11. Type cd eggdrop-1.9.5 switch to the directory the Eggdrop source was extracted to.

  12. Type ./configure (that’s a period followed by a slash followed by the word ‘configure’). This makes sure the shell has all the right tools for compiling Eggdrop, and helps Eggdrop figure out how to compile on the shell.

  13. When configure is done, type make config. This sets up which modules are to be compiled. For a more efficient installation, you can use make iconfig to select the modules to compile, but if you’re not sure just use make config.

  14. Type make. This compiles the Eggdrop. The process takes a brief moment on fast systems, longer on slow systems.

  15. Type make install DEST=~/botdir. This will install Eggdrop into a directory named ‘botdir’ in your home directory. You can change ‘botdir’ to anything you like. Note that in some cases you may need to specify the full path, e.g. make install DEST=/home/cooldude/botdir, using the ~ character in make install won’t always work. You can get the full path by typing pwd.

  16. -
  17. You can safely delete the installation directory named ‘eggdrop-1.9.5’ (to do this, type cd ~ then rm -rf eggdrop-1.9.5) that was created previously, although some people may find it handy to keep that directory for performing additional or future installations of the same version without recompiling.

  18. +
  19. You can safely delete the installation directory named eggdrop-1.9.5 (to do this, type cd ~ then rm -rf eggdrop-1.9.5) that was created previously, although some people may find it handy to keep that directory for performing additional or future installations of the same version without recompiling.

That’s it! Eggdrop is now installed into its own directory on the shell. It’s time to edit the configuration files to make Eggdrop work the way you want it to.

-

Configuration

+

Configuration

You will need to edit the configuration file before you can start up your Eggdrop. You can find the example configuration file in the directory you extracted the Eggdrop source to, under the name ‘eggdrop.conf’. If you downloaded Eggdrop to your system, you can unzip the tarball (.tar.gz) file to its own directory using 7-Zip or a similar program, and view the example config file, botchk file, and all the documentation files locally. You can use Notepad to edit these files, although it’s sometimes desirable to use an editor that supports the Unix file format such as EditPlus. To edit the file once it is on your shell, a program such as ‘nano’ or ‘vim’ is recommended.

-

Editing the config file

+

Editing the config file

Eggdrop comes with two versions of the configuration file- eggdrop.conf and eggdrop-basic.conf. While it is recommended that users edit a copy of eggdrop.conf to take advantage of all the features Eggdrop has to offer, using eggdrop-basic.conf to start will be a quicker path for some. Still, it is recommended that you come back to the full config file at some point to see what you are missing.

It is first recommended to rename the sample config to something other than “eggdrop.conf”. Giving it the name of the bot’s nick (e.g. NiceBot.conf) is quite common. In the config file, you set up the IRC servers you want the bot to use and set Eggdrop’s options to suit your needs. Eggdrop has many options to configure, and editing the configuration file can take some time. I recommend you go over the entire config file to ensure the bot will be configured properly for your needs. All of the options in the config file have written explanations - be sure to read them carefully. Some of them can be a little bit vague, though.

To comment out a line (prevent the bot from reading that line), you can add a ‘#’ in front of a line. When you come to a line that you need to edit, one popular option is to comment out the original and add your new line right below it. This preserves the original line as an example. For example:

@@ -250,12 +250,12 @@

Editing the config file

-

Starting the Eggdrop

+

Starting the Eggdrop

Phew! Now that you’ve compiled, installed, and configured Eggdrop, it’s time to start it up. Switch to the directory to which you installed the bot, cross your fingers, and type ./eggdrop -m <config> (where <config> is the name you gave to the config file). Eggdrop should start up, and the bot should appear on IRC within a few minutes. The -m option creates a new userfile for your bot, and is only needed the first time you start your Eggdrop. In future, you will only need to type ./eggdrop <config> to start the bot. Make sure you take the time to read what it tells you when you start it up!

Once your bot is on IRC, it’s important that you promptly introduce yourself to the bot. Msg it the ‘hello’ command you specified in the config file, e.g. /msg <botnick> hello. This will make you the bot’s owner. Once that’s done, you need to set a password using /msg <botnick> pass <password>. You can then DCC chat to the bot.

Now that your Eggdrop is on IRC and you’ve introduced yourself as owner, it’s time to learn how to use your Eggdrop!

-

No show?

+

No show?

If your bot didn’t appear on IRC, you should log in to the shell and view the bot’s logfile (the default in the config file is “logs/eggdrop.log”). Note that logfile entries are not written to disk immediately unless quick-logs is enabled, so you may have to wait a few minutes before the logfile appears, or contains messages that indicate why your bot isn’t showing up.

Additionally, you can kill the bot via the command line (kill pid, the pid is shown to you when you started the bot or can be viewed by running ps x) and then restart it with the -mnt flag, which will launch you directly into the partyline, to assist with troubleshooting. Note that if you use the -nt flag, the bot will not persist and you will kill it once you quit the partyline.

If you’re still unsure what the problem is, try asking in #eggdrop on Libera, and be sure to include any relevant information from the logfile. Good luck!

@@ -289,9 +289,9 @@

No show?

diff --git a/doc/sphinx_source/conf.py b/doc/sphinx_source/conf.py index 50c12967f..f5bbaa7f5 100644 --- a/doc/sphinx_source/conf.py +++ b/doc/sphinx_source/conf.py @@ -28,7 +28,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = ['sphinx_substitution_extensions'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -54,6 +54,8 @@ version = '1.9.5' # The full version, including alpha/beta/rc tags. release = '1.9.5' +# Just X.Y, for use in doc links (Geo) +maj_version = ".".join(version.split(".")[:2]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -256,3 +258,12 @@ # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False + +rst_prolog = """ +.. role:: raw-html(raw) + :format: html + +.. |dlink| replace:: :raw-html:`the current version of Eggdrop` +.. |majversion| replace:: %s +.. |fullversion| replace:: %s +""" % (maj_version, version, maj_version, version) diff --git a/doc/sphinx_source/modules/index.rst b/doc/sphinx_source/modules/index.rst index 7b11606a7..a5a4a6523 100644 --- a/doc/sphinx_source/modules/index.rst +++ b/doc/sphinx_source/modules/index.rst @@ -19,7 +19,7 @@ Please note that these are only basic instructions for compiling and installing 2. Place the new module in its own directory (in the format of (modulename).mod) in src/mod. - 3. Run ./configure (from eggdrop1.9.x/). + 3. Run ./configure (from eggdrop-|version|/). 4. Type 'make config' or 'make iconfig'. diff --git a/doc/sphinx_source/tutorials/setup.rst b/doc/sphinx_source/tutorials/setup.rst index 641503cae..364287924 100644 --- a/doc/sphinx_source/tutorials/setup.rst +++ b/doc/sphinx_source/tutorials/setup.rst @@ -19,16 +19,17 @@ The super-short version You can read the `Installation`_ section for a more detailed explanation of these steps. -1. Download the `latest stable Eggdrop release `_ to your shell via FTP, or simply type ``wget geteggdrop.com -O eggdrop-1.9.5.tar.gz`` -2. From the commandline of your shell, type ``tar zxvf eggdrop-1.9.5.tar.gz`` -3. Type ``cd eggdrop-1.9.5`` -4. Type ``./configure`` -5. Type ``make config`` -6. Type ``make`` -7. Type ``make install`` -8. Type ``cd ~/eggdrop`` -9. For a quick start, edit the eggdrop-basic.conf file. To take advantage of all Eggdrop's features, we recommend using eggdrop.conf instead. It is also a good idea to rename the file to something easy to remember and specific to your bot, like botnick.conf. -10. Type ./eggdrop -m +#. Download |dlink| to your shell via FTP, or simply type: :substitution-code:`wget geteggdrop.com -O eggdrop-|fullversion|.tar.gz` +#. Next, from the commandline of the shell, ensure you are in the same directory that you downloaded the tar file into +#. Type: :substitution-code:`tar zxvf eggdrop-|fullversion|.tar.gz` +#. Type: :substitution-code:`cd eggdrop-|fullversion|` +#. Type ``./configure`` +#. Type ``make config`` +#. Type ``make`` +#. Type ``make install`` +#. Type ``cd ~/eggdrop`` +#. For a quick start, edit the eggdrop-basic.conf file. To take advantage of all Eggdrop's features, we recommend using eggdrop.conf instead. It is also a good idea to rename the file to something easy to remember and specific to your bot, like botnick.conf. +#. Type ./eggdrop -m Getting the source ------------------ @@ -36,35 +37,35 @@ Getting the source History ~~~~~~~ -The current supported version of Eggdrop is the 1.9.x tree. The 1.8 and 1.6 series, while still popular, are no longer supported by the developers. +The current supported version of Eggdrop is the |majversion|.x tree. Only the current major version (|majversion|.x) is supported; earlier major versions are not. -The most current version of Eggdrop, and the one appropriate for most users, is the current 1.9 series. It added many features such as SASL support, multi-ip listening, and a new password hashing module. It is the most complete, feature-rich, and functional version of Eggdrop. If you're just starting out with Eggdrop, you should use 1.9.5 +The most current version of Eggdrop, and the one appropriate for most users, is the current |majversion| series. It added many features such as SASL support, multi-ip listening, and a new password hashing module. It is the most complete, feature-rich, and functional version of Eggdrop. If you're just starting out with Eggdrop, you should use |version|. -Prior to that, the 1.8 series added several major features, to include IPv6 support and SSL/TLS connections. 1.6.21, which is now over 10 years old, was the last release of the 1.6 series and is still used by users who have become comfortable with that version and may have spent much time applying their own modifications to make it work the way they want, and therefore don't wish to move to a newer version. The majority of Tcl scripts out there were written for 1.6 bots, but those scripts usually work on 1.8 and 1.9 bots as well. +Prior to that, the 1.8 series added several major features, to include IPv6 support and SSL/TLS connections. 1.6.21, which is now over 10 years old, was the last release of the 1.6 series. Because Eggdrop remained at the 1.6.21 patchlevel for several years it is still often run by users who have become comfortable with that version and don't wish to move to a newer version- however, it is getting harder and harder to continue running 1.6 bots on modern Linux systems. Tcl scripts written for bots as far back as the 1.6 series generally work on all later versions of Eggdrop as well, so if you haven't already- upgrade! -The 1.9 Eggdrop tree is currently under active development and the most recent changes are available in daily snapshots for users to download for testing. While the development snapshot will contain the most current, up-to-date features of Eggdrop, it is not yet considered stable and users stand a higher chance of encountering bugs during use. If you do use it and find a bug, it is highly encouraged to report it via the `Eggheads GitHub issues page. `_ +The |majversion| Eggdrop tree is currently under active development and the most recent changes are available in daily snapshots for users to download for testing. While the development snapshot will contain the most current, up-to-date features of Eggdrop, it is not yet considered stable and users stand a higher chance of encountering bugs during use. If you do use it and find a bug, it is highly encouraged to report it via the `Eggheads GitHub issues page. `_ Download locations ~~~~~~~~~~~~~~~~~~ -The developers distribute Eggdrop via two main methods: FTP, and GitHub. For FTP, it is packaged in tarball format (with the .tar.gz filename extension), with the version number in the filename. The Eggdrop 1.9.5 source, for example, would be named eggdrop-1.9.5.tar.gz. +The developers distribute Eggdrop via two main methods: FTP, and GitHub. For FTP, it is packaged in tarball format (with the .tar.gz filename extension), with the version number in the filename. The Eggdrop |version| source, for example, would be named :substitution-code:`eggdrop-|fullversion|.tar.gz`. -`The Eggheads FTP `_ is a repository for the `current `_ version of Eggdrop, as well as the most current development snapshot and previous stable releases. +`The Eggheads FTP `_ is a repository for |dlink|, as well as the most current development snapshot and previous stable releases. -Eggdrop also maintains a `GitHub page `_ where you can download the development snapshot or a stable version, via either git commandline or by downloading a tarball. To download via git, type ``git clone https://github.com/eggheads/eggdrop.git``, then ``cd eggdrop``. This gives you the development version. To switch to the most recent stable version, type ``git checkout stable/1.9``. You can then skip to step 4 in the Installation section below. +Eggdrop also maintains a `GitHub page `_ where you can download the development snapshot or a stable version, via either git commandline or by downloading a tarball. To download via git, type ``git clone https://github.com/eggheads/eggdrop.git``, then ``cd eggdrop``. This gives you the development version. To switch to the most recent stable version, type :substitution-code:`git checkout stable/|majversion|`. You can then skip to step 4 in the Installation section below. Installation ------------ Installing Eggdrop is a relatively simple process provided your shell has the required tools for successful compilation. On most commercial shell accounts which allow Eggdrop bots you won't have any problems with installation, but on some private boxes or a shell on your ISP you may experience errors during compilation. -Below is a step by step guide to the installation process. These instructions apply to 1.9 bots. It assumes you will be installing eggdrop-1.9.5.tar.gz, so just change the numbers if you are installing another version. +Below is a step by step guide to the installation process. These instructions apply to |majversion| bots. It assumes you will be installing :substitution-code:`eggdrop-|fullversion|.tar.gz`, so just change the numbers if you are installing another version. -1. Put the Eggdrop source on your shell using one of the specified download locations, either by downloading the `eggdrop-1.9.5.tar.gz `_ file to your system then uploading it to the shell via FTP, or downloading it directly to the shell via the shell's FTP client, git, wget, or curl. You don't need to put the .tar.gz file in its own directory (it'll be done automatically in the next step). +1. Put the Eggdrop source on your shell using one of the specified download locations, either by downloading |dlink| to your local system and then uploading it to the shell via FTP, or downloading it directly to the shell via the shell's FTP client, git, wget, or curl. You don't need to put the .tar.gz file in its own directory (it'll be done automatically in the next step). -2. SSH to the shell (if you haven't already), and type ``tar zxvf eggdrop-1.9.5.tar.gz`` (if this doesn't work, try ``gunzip eggdrop-1.9.5.tar.gz`` then ``tar xvf eggdrop-1.9.5.tar``). This will extract the Eggdrop source into its installation directory, named 'eggdrop-1.9.5'. +2. SSH to the shell (if you haven't already), and type :substitution-code:`tar zxvf eggdrop-|fullversion|.tar.gz` (if this doesn't work, try :substitution-code:`gunzip eggdrop-|fullversion|.tar.gz` then :substitution-code:`tar xvf eggdrop-|fullversion|.tar`). This will extract the Eggdrop source into its installation directory, named :substitution-code:`eggdrop-|fullversion|`. -3. Type cd eggdrop-1.9.5 switch to the directory the Eggdrop source was extracted to. +3. Type :substitution-code:`cd eggdrop-|fullversion|` switch to the directory the Eggdrop source was extracted to. 4. Type ``./configure`` (that's a period followed by a slash followed by the word 'configure'). This makes sure the shell has all the right tools for compiling Eggdrop, and helps Eggdrop figure out how to compile on the shell. @@ -74,7 +75,7 @@ Below is a step by step guide to the installation process. These instructions ap 7. Type ``make install DEST=~/botdir``. This will install Eggdrop into a directory named 'botdir' in your home directory. You can change 'botdir' to anything you like. Note that in some cases you may need to specify the full path, e.g. ``make install DEST=/home/cooldude/botdir``, using the ~ character in make install won't always work. You can get the full path by typing ``pwd``. -8. You can safely delete the installation directory named 'eggdrop-1.9.5' (to do this, type ``cd ~`` then ``rm -rf eggdrop-1.9.5``) that was created previously, although some people may find it handy to keep that directory for performing additional or future installations of the same version without recompiling. +8. You can safely delete the installation directory named :substitution-code:`eggdrop-|fullversion|` (to do this, type ``cd ~`` then :substitution-code:`rm -rf eggdrop-|fullversion|`) that was created previously, although some people may find it handy to keep that directory for performing additional or future installations of the same version without recompiling. That's it! Eggdrop is now installed into its own directory on the shell. It's time to edit the configuration files to make Eggdrop work the way you want it to. diff --git a/doc/sphinx_source/using/text-sub.rst b/doc/sphinx_source/using/text-sub.rst index 7d39297d5..dc81af3ee 100644 --- a/doc/sphinx_source/using/text-sub.rst +++ b/doc/sphinx_source/using/text-sub.rst @@ -22,28 +22,28 @@ text: These variables will be interpreted by Eggdrop and replaced by their respective values: -+------+---------------------------------------------------------+ -| %B | bot's nickname (i.e. "LamestBot") | -+------+---------------------------------------------------------+ -| %V | current Eggdrop version (i.e. "eggdrop v1.9.5") | -+------+---------------------------------------------------------+ -| %E | long form of %V (i.e. "Eggdrop v1.9.5 (C) 1997 Robey | -| | Pointer (C) 2010 Eggheads Development Team") | -+------+---------------------------------------------------------+ -| %C | channels the bot is on (i.e. "#lamest, #botnetcentral") | -+------+---------------------------------------------------------+ -| %A | whatever is set in the config file by 'set admin' | -+------+---------------------------------------------------------+ -| %n | whatever is set in the config file by 'set network' | -+------+---------------------------------------------------------+ -| %T | the current time (i.e. "15:00") | -+------+---------------------------------------------------------+ -| %N | the current user's nickname (i.e. "Robey") | -+------+---------------------------------------------------------+ -| %U | the current operating system the bot is running on | -+------+---------------------------------------------------------+ -| %% | a percent sign ("%") | -+------+---------------------------------------------------------+ ++------+----------------------------------------------------------+ +| %B | bot's nickname (i.e. "LamestBot") | ++------+----------------------------------------------------------+ +| %V | current Eggdrop version (i.e. "eggdrop v\ |version|") | ++------+----------------------------------------------------------+ +| %E | long form of %V (i.e. "Eggdrop v\ |version| (C) 1997 | +| | Robey Pointer (C) 2010 Eggheads Development Team") | ++------+----------------------------------------------------------+ +| %C | channels the bot is on (i.e. "#lamest, #botnetcentral") | ++------+----------------------------------------------------------+ +| %A | whatever is set in the config file by 'set admin' | ++------+----------------------------------------------------------+ +| %n | whatever is set in the config file by 'set network' | ++------+----------------------------------------------------------+ +| %T | the current time (i.e. "15:00") | ++------+----------------------------------------------------------+ +| %N | the current user's nickname (i.e. "Robey") | ++------+----------------------------------------------------------+ +| %U | the current operating system the bot is running on | ++------+----------------------------------------------------------+ +| %% | a percent sign ("%") | ++------+----------------------------------------------------------+ You can also encode messages which can only be read by people with certain flags: From 6bc6560bc21063dc38b1fc5fa206facd3803d8ca Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Tue, 2 Jan 2024 23:09:59 +0100 Subject: [PATCH 11/20] Fix hangs on some SSL connections Found by: pym67, @PeGaSuS-Coder Patch by: michaelortmann Fixes: #1496 This PR fixes Eggdrop hanging on some socket connections by upping the read buffer size for SSL_read() and read() to 16K, the maximum according to SSL spec and to openssls internal buffer size. It may also help resolve some hanging userfile transfers. --- src/Makefile.in | 3 +-- src/eggdrop.h | 1 + src/main.c | 2 +- src/net.c | 26 ++++++++++++-------------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/Makefile.in b/src/Makefile.in index 6fbce846f..b6254d13c 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -174,8 +174,7 @@ modules.o: modules.c main.h ../config.h ../eggint.h ../lush.h lang.h \ net.o: net.c main.h ../config.h ../eggint.h ../lush.h lang.h eggdrop.h \ compat/in6.h flags.h proto.h misc_file.h cmdt.h tclegg.h tclhash.h \ chan.h users.h compat/compat.h compat/base64.h compat/inet_aton.h \ - ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ - mod/server.mod/server.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h rfc1459.o: rfc1459.c main.h ../config.h ../eggint.h ../lush.h lang.h \ eggdrop.h compat/in6.h flags.h proto.h misc_file.h cmdt.h tclegg.h \ tclhash.h chan.h users.h compat/compat.h compat/base64.h \ diff --git a/src/eggdrop.h b/src/eggdrop.h index c6b50917a..bf901c008 100644 --- a/src/eggdrop.h +++ b/src/eggdrop.h @@ -60,6 +60,7 @@ #define UHOSTMAX 291 + NICKMAX /* 32 (ident) + 3 (\0, !, @) + NICKMAX */ #define DIRMAX 512 /* paranoia */ #define LOGLINEMAX 9000 /* for misc.c/putlog() */ +#define READMAX 16384 /* for read() and SSL_read() */ /* Invalid characters */ #define BADHANDCHARS "-,+*=:!.@#;$%&" diff --git a/src/main.c b/src/main.c index 6d221a7f8..e7fb8f79a 100644 --- a/src/main.c +++ b/src/main.c @@ -787,7 +787,7 @@ static void mainloop(int toplevel) { static int cleanup = 5; int xx, i, eggbusy = 1; - char buf[8702]; + char buf[READMAX + 2]; /* Lets move some of this here, reducing the number of actual * calls to periodic_timers diff --git a/src/net.c b/src/net.c index 167d55803..5eba848d0 100644 --- a/src/net.c +++ b/src/net.c @@ -42,7 +42,6 @@ # include #endif #include -#include "mod/server.mod/server.h" #ifdef TLS # include @@ -894,7 +893,7 @@ int sockread(char *s, int *len, sock_list *slist, int slistmax, int tclonly) struct timeval t; fd_set fdr, fdw, fde; int i, x, maxfd_r, maxfd_w, maxfd_e; - int grab = 511, tclsock = -1, events = 0; + int grab = READMAX, tclsock = -1, events = 0; struct threaddata *td = threaddata(); int maxfd; #ifdef EGG_TDNS @@ -938,8 +937,7 @@ int sockread(char *s, int *len, sock_list *slist, int slistmax, int tclonly) if (!tclonly && ((!(slist[i].flags & (SOCK_UNUSED | SOCK_TCL))) && ((FD_ISSET(slist[i].sock, &fdr)) || #ifdef TLS - (slist[i].ssl && (SSL_pending(slist[i].ssl) || - !SSL_is_init_finished(slist[i].ssl))) || + (slist[i].ssl && !SSL_is_init_finished(slist[i].ssl)) || #endif ((slist[i].sock == STDOUT) && (!backgrd) && (FD_ISSET(STDIN, &fdr)))))) { @@ -1102,7 +1100,7 @@ int sockread(char *s, int *len, sock_list *slist, int slistmax, int tclonly) int sockgets(char *s, int *len) { - char xx[RECVLINEMAX], *p, *px, *p2; + char xx[READMAX + 2], *p, *px, *p2; int ret, i, data = 0; size_t len2; struct threaddata *td = threaddata(); @@ -1129,7 +1127,7 @@ int sockgets(char *s, int *len) p++; *p2 = 0; - strlcpy(s, socklist[i].handler.sock.inbuf, RECVLINEMAX-1); + strlcpy(s, socklist[i].handler.sock.inbuf, READMAX + 1); if (*p) { len2 = strlen(p) + 1; px = nmalloc(len2); @@ -1145,15 +1143,15 @@ int sockgets(char *s, int *len) } } else { /* Handling buffered binary data (must have been SOCK_BUFFER before). */ - if (socklist[i].handler.sock.inbuflen <= RECVLINEMAX-2) { + if (socklist[i].handler.sock.inbuflen <= READMAX) { *len = socklist[i].handler.sock.inbuflen; memcpy(s, socklist[i].handler.sock.inbuf, socklist[i].handler.sock.inbuflen); nfree(socklist[i].handler.sock.inbuf); socklist[i].handler.sock.inbuf = NULL; socklist[i].handler.sock.inbuflen = 0; } else { - /* Split up into chunks of RECVLINEMAX-2 bytes. */ - *len = RECVLINEMAX-2; + /* Split up into chunks of READMAX bytes. */ + *len = READMAX; memcpy(s, socklist[i].handler.sock.inbuf, *len); memcpy(socklist[i].handler.sock.inbuf, socklist[i].handler.sock.inbuf + *len, *len); socklist[i].handler.sock.inbuflen -= *len; @@ -1218,17 +1216,17 @@ int sockgets(char *s, int *len) strcpy(socklist[ret].handler.sock.inbuf, p); strcat(socklist[ret].handler.sock.inbuf, xx); nfree(p); - if (strlen(socklist[ret].handler.sock.inbuf) < RECVLINEMAX) { + if (strlen(socklist[ret].handler.sock.inbuf) < READMAX + 2) { strcpy(xx, socklist[ret].handler.sock.inbuf); nfree(socklist[ret].handler.sock.inbuf); socklist[ret].handler.sock.inbuf = NULL; socklist[ret].handler.sock.inbuflen = 0; } else { p = socklist[ret].handler.sock.inbuf; - socklist[ret].handler.sock.inbuflen = strlen(p) - RECVLINEMAX-2; + socklist[ret].handler.sock.inbuflen = strlen(p) - READMAX; socklist[ret].handler.sock.inbuf = nmalloc(socklist[ret].handler.sock.inbuflen + 1); - strcpy(socklist[ret].handler.sock.inbuf, p + RECVLINEMAX-2); - *(p + RECVLINEMAX-2) = 0; + strcpy(socklist[ret].handler.sock.inbuf, p + READMAX); + *(p + READMAX) = 0; strcpy(xx, p); nfree(p); /* (leave the rest to be post-pended later) */ @@ -1249,7 +1247,7 @@ int sockgets(char *s, int *len) /* if (!s[0]) strcpy(s," "); */ if (!data) { s[0] = 0; - if (strlen(xx) >= RECVLINEMAX-2) { + if (strlen(xx) >= READMAX) { /* String is too long, so just insert fake \n */ strcpy(s, xx); xx[0] = 0; From a41e1bac3441b3de883575d61c95f09a7d9a1f0c Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Thu, 4 Jan 2024 00:28:43 +0100 Subject: [PATCH 12/20] Properly queue/log QUIT message Patch by: michaelortmann Messages from eggdrop to irc server are logged when raw-log is set. depending on the queue the message was put in, it gets logged like for example [m->] or [s->] The Quit message was sent to server directly without using those queues and thus was not logged. --- src/mod/server.mod/server.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mod/server.mod/server.c b/src/mod/server.mod/server.c index aea437f66..a206b6810 100644 --- a/src/mod/server.mod/server.c +++ b/src/mod/server.mod/server.c @@ -2094,9 +2094,13 @@ static void server_postrehash() static void server_die() { + char msg[MSGMAX]; cycle_time = 100; if (server_online) { - dprintf(-serv, "QUIT :%s\n", quit_msg[0] ? quit_msg : ""); + snprintf(msg, sizeof msg, "QUIT :%s", quit_msg); + dprintf(-serv, "%s\n", msg); + if (raw_log) + putlog(LOG_SRVOUT, "*", "[->] %s", msg); sleep(3); /* Give the server time to understand */ } nuke_server(NULL); From f9a49e1298aea437917fb08dd4d91a45a0b87a72 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Fri, 5 Jan 2024 12:42:38 +0100 Subject: [PATCH 13/20] Allow overwriting misc/runautotools version check --- misc/runautotools | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/misc/runautotools b/misc/runautotools index 32200d8ef..48e9b93d5 100755 --- a/misc/runautotools +++ b/misc/runautotools @@ -28,7 +28,7 @@ REQUIRED_AUTOCONF_VERSION=2.71 show_usage() { echo "Usage: `basename $0` [-h|-v]" echo " -h, --help - Print this help and exit." - echo " -v, --verbose - Use verbose mode when running autoconf." + echo " -f, --force - Skip the autoconf version check (do not commit generated files with this)." exit 0 } @@ -41,10 +41,15 @@ if test "x${1}" = "x-h" || test "x${1}" = "x--help"; then show_usage fi +FORCE=0 +if test "x${1}" = "x-f" || test "x${1}" = "x--force"; then + FORCE=1 +fi + # All developers should use the same autotools version to avoid unnecessary back/forth changes in configure scripts echo "Checking autotools version..." AUTOCONFVERSION=$(autoconf --version | head -n 1 | awk '{print $NF}') -if test "x$AUTOCONFVERSION" != "x$REQUIRED_AUTOCONF_VERSION"; then +if test $FORCE -eq 0 && test "x$AUTOCONFVERSION" != "x$REQUIRED_AUTOCONF_VERSION"; then echo "Refusing to run autotools with mismatching version, required is $REQUIRED_AUTOCONF_VERSION, you have $AUTOCONFVERSION. Adjust requirement in misc/runautotools if this is intentional" exit 1 fi From 2c41e37c2de3aea8a332d382d3ffc971d053e0b3 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 7 Jan 2024 20:42:50 +0100 Subject: [PATCH 14/20] Remove copy-to-tmp option Found by: Geo Patch by: michaelortmann Fixes: #1503 This PR removes the copy-to-tmp from the config and hard-codes the previous '1' functionality, requiring the file to be coped to a tmpfile before being sent. For eggdrop 2.0 remaining bits of copy-to-tmp should be removed from module API --- doc/sphinx_source/modules/mod/transfer.rst | 9 +------ doc/sphinx_source/using/tcl-commands.rst | 5 ++-- eggdrop.conf | 6 ----- src/dccutil.c | 4 +-- src/mod/filesys.mod/filesys.c | 1 + src/mod/share.mod/share.c | 9 +++---- src/mod/transfer.mod/help/set/transfer.help | 7 ----- src/mod/transfer.mod/help/transfer.help | 4 +-- src/mod/transfer.mod/transfer.c | 30 ++++++++++----------- src/modules.c | 4 ++- src/tcl.c | 2 -- src/users.c | 6 +++-- 12 files changed, 33 insertions(+), 54 deletions(-) diff --git a/doc/sphinx_source/modules/mod/transfer.rst b/doc/sphinx_source/modules/mod/transfer.rst index d914c64c6..1d804c229 100644 --- a/doc/sphinx_source/modules/mod/transfer.rst +++ b/doc/sphinx_source/modules/mod/transfer.rst @@ -1,4 +1,4 @@ -Last revised: January 1, 2002 +Last revised: November 29, 2023 .. _transfer: @@ -27,13 +27,6 @@ There are also some variables you can set in your config file: but admits that may be too small. 1024 is standard these days. Set this to 0 to use turbo-dcc (recommended). - set copy-to-tmp 1 - Enable this setting if you want to copy files to a temporary location - before sending or receiving them. This might be useful for file - stability, but if your directories are NFS mounted, it's a pain. - Setting this to 1 is not advised for big files or if you're low on - disk space. - set xfer-timeout 30 Set here the time (in seconds) to wait before an inactive transfer times out. diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 9d0f53df1..34a318b53 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -1,7 +1,7 @@ .. highlight:: text Eggdrop Tcl Commands -Last revised: January 24, 2021 +Last revised: January 6, 2024 ==================== Eggdrop Tcl Commands @@ -2011,8 +2011,7 @@ dccsend | 4 | the file was queued for later transfer, which means that person has | | | too many file transfers going right now | +-------+---------------------------------------------------------------------+ - | 5 | copy-to-tmp is enabled and the file already exists in the temp | - | | directory | + | 5 | the file could not be opened or temporary file could not be created | +-------+---------------------------------------------------------------------+ Module: transfer diff --git a/eggdrop.conf b/eggdrop.conf index 1b8de6651..fedb6d919 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -1445,12 +1445,6 @@ set max-dloads 3 # 0 is turbo-dcc (recommended). set dcc-block 0 -# Enable this setting if you want to copy files to a temporary location before -# sending or receiving them. This might be useful for file stability, but if -# your directories are NFS mounted, it's a pain. Setting this to 1 is not -# advised for big files or if you're low on disk space. -set copy-to-tmp 1 - # Set here the time (in seconds) to wait before an inactive transfer times out. set xfer-timeout 30 diff --git a/src/dccutil.c b/src/dccutil.c index b3a80e2cb..ece4d895d 100644 --- a/src/dccutil.c +++ b/src/dccutil.c @@ -33,7 +33,7 @@ #include "tandem.h" extern struct dcc_t *dcc; -extern int dcc_total, dcc_flood_thr, backgrd, copy_to_tmp, max_socks; +extern int dcc_total, dcc_flood_thr, backgrd, max_socks; extern char botnetnick[], version[]; extern time_t now; extern sock_list *socklist; @@ -318,7 +318,7 @@ void killtransfer(int n) fclose(dcc[n].u.xfer->f); dcc[n].u.xfer->f = NULL; } - if (dcc[n].u.xfer->filename && copy_to_tmp) { + if (dcc[n].u.xfer->filename) { for (i = 0; i < dcc_total; i++) { if ((i != n) && (dcc[i].type->flags & DCT_FILETRAN) && (dcc[i].u.xfer->filename) && diff --git a/src/mod/filesys.mod/filesys.c b/src/mod/filesys.mod/filesys.c index 5b40ffebd..f5ef33533 100644 --- a/src/mod/filesys.mod/filesys.c +++ b/src/mod/filesys.mod/filesys.c @@ -791,6 +791,7 @@ static void filesys_dcc_send_hostresolved(int i) /* Put uploads in a temp file first */ dcc[i].u.xfer->f = tmpfile(); if (dcc[i].u.xfer->f == NULL) { + debug1("filesys: filesys_dcc_send_hostresolved(): tmpfile(): error: %s", strerror(errno)); dprintf(DP_HELP, "NOTICE %s :Can't create file `%s' (temp dir error)\n", dcc[i].nick, dcc[i].u.xfer->origname); diff --git a/src/mod/share.mod/share.c b/src/mod/share.mod/share.c index 40452536a..9e7bc519a 100644 --- a/src/mod/share.mod/share.c +++ b/src/mod/share.mod/share.c @@ -24,6 +24,7 @@ #define MODULE_NAME "share" #define MAKING_SHARE +#include #include "src/mod/module.h" #include @@ -1242,12 +1243,10 @@ static void share_ufsend(int idx, char *par) putlog(LOG_MISC, "*", "NO MORE DCC CONNECTIONS -- can't grab userfile"); dprintf(idx, "s e I can't open a DCC to you; I'm full.\n"); zapfbot(idx); - } else if (copy_to_tmp && !(f = tmpfile())) { + } else if (!(f = tmpfile())) { + debug1("share: share_ufsend(): tmpfile(): error: %s", strerror(errno)); putlog(LOG_MISC, "*", "CAN'T WRITE TEMPORARY USERFILE DOWNLOAD FILE!"); zapfbot(idx); - } else if (!copy_to_tmp && !(f = fopen(s, "wb"))) { - putlog(LOG_MISC, "*", "CAN'T WRITE USERFILE DOWNLOAD FILE!"); - zapfbot(idx); } else { /* Ignore longip and use botaddr, arg kept for backward compat for pre 1.8.3 */ newsplit(&par); @@ -2353,7 +2352,7 @@ char *share_start(Function *global_funcs) global = global_funcs; - module_register(MODULE_NAME, share_table, 2, 4); + module_register(MODULE_NAME, share_table, 2, 5); if (!module_depend(MODULE_NAME, "eggdrop", 108, 0)) { module_undepend(MODULE_NAME); return "This module requires Eggdrop 1.8.0 or later."; diff --git a/src/mod/transfer.mod/help/set/transfer.help b/src/mod/transfer.mod/help/set/transfer.help index 1a5b01505..959b4d448 100644 --- a/src/mod/transfer.mod/help/set/transfer.help +++ b/src/mod/transfer.mod/help/set/transfer.help @@ -16,13 +16,6 @@ mode, the bot will dump transfers as fast as possible, only stopping to count acks after it's finished. This can dramatically improve the speed of file transfers, and is recommended. -%{help=set copy-to-tmp}%{+n} -### %bset copy-to-tmp%b <0/1> - Enable this setting if you want to copy files to a temporary location - before sending or receiving them. This might be useful for file - stability, but if your directories are NFS mounted, it's a pain. - Setting this to 1 is not advised for big files or if you're low on - disk space. %{help=set xfer-timeout}%{+n} ### %bset xfer-timeout%b <#> This is the number of seconds to wait before a dcc send or get is diff --git a/src/mod/transfer.mod/help/transfer.help b/src/mod/transfer.mod/help/transfer.help index bc64802ac..2af240cf3 100644 --- a/src/mod/transfer.mod/help/transfer.help +++ b/src/mod/transfer.mod/help/transfer.help @@ -4,6 +4,6 @@ support for userfile sharing. Config file variables for configuring the transfer module: - %bxfer-timeout copy-to-tmp dcc-block%b - %bmax-dloads sharefail-unlink%b + %bxfer-timeout dcc-block max-dloads%b + %bsharefail-unlink%b (Use %b'.help set '%b for more info) diff --git a/src/mod/transfer.mod/transfer.c b/src/mod/transfer.mod/transfer.c index 1c7c39342..0171b6fbc 100644 --- a/src/mod/transfer.mod/transfer.c +++ b/src/mod/transfer.mod/transfer.c @@ -291,7 +291,7 @@ static void eof_dcc_send(int idx) + strlen(dcc[idx].u.xfer->origname) + 1); sprintf(nfn, "%s%s", dcc[idx].u.xfer->dir, dcc[idx].u.xfer->origname); - if (copy_to_tmp && (l = fcopyfile(dcc[idx].u.xfer->f, nfn))) { + if ((l = fcopyfile(dcc[idx].u.xfer->f, nfn))) { putlog(LOG_MISC | LOG_FILES, "*", TRANSFER_FAILED_MOVE, nfn); } /* Only close now in case it was a tmpfile, as it's deleted upon close */ @@ -302,8 +302,8 @@ static void eof_dcc_send(int idx) u = get_user_by_host(s); hand = u ? u->handle : "*"; - /* Add to file database if not tmpfile or if copyfile succeeded */ - if (!copy_to_tmp || !l) { + /* Add to file database if copyfile succeeded */ + if (!l) { module_entry *fs = module_find("filesys", 0, 0); if (fs != NULL) { @@ -961,8 +961,10 @@ static int raw_dcc_resend_send(char *filename, char *nick, char *from, zz = -1; f = fopen(filename, "r"); - if (!f) + if (!f) { + debug2("transfer: raw_dcc_resend_send(): fopen(%s): error: %s", filename, strerror(errno)); return DCCSEND_BADFN; + } fseeko(f, 0, SEEK_END); dccfilesize = ftello(f); fclose(f); @@ -988,19 +990,15 @@ static int raw_dcc_resend_send(char *filename, char *nick, char *from, else nfn++; - if (copy_to_tmp) { - f = tmpfile(); - if (!f) - return DCCSEND_BADFN; - if (copyfilef(filename, f)) { - fclose(f); - return DCCSEND_FCOPY; - } - } else - f = fopen(filename, "r"); - - if (!f) + f = tmpfile(); + if (!f) { + debug1("transfer: raw_dcc_resend_send(): tmpfile(): error: %s", strerror(errno)); return DCCSEND_BADFN; + } + if (copyfilef(filename, f)) { + fclose(f); + return DCCSEND_FCOPY; + } if ((i = new_dcc(&DCC_GET_PENDING, sizeof(struct xfer_info))) == -1) { fclose(f); diff --git a/src/modules.c b/src/modules.c index 29045cd1c..932794df8 100644 --- a/src/modules.c +++ b/src/modules.c @@ -82,9 +82,11 @@ extern int parties, noshare, dcc_total, egg_numver, userfile_perm, ignore_time, must_be_owner, raw_log, max_dcc, make_userfile, default_flags, require_p, share_greet, use_invites, use_exempts, password_timeout, force_expire, protect_readonly, reserved_port_min, reserved_port_max, - copy_to_tmp, quiet_reject; + quiet_reject; extern volatile sig_atomic_t do_restart; +int copy_to_tmp = 1; /* TODO: remove from module API for eggdrop 2.0 */ + #ifdef IPV6 extern int pref_af; #endif diff --git a/src/tcl.c b/src/tcl.c index bbd12fcbc..6557645d5 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -86,7 +86,6 @@ int remote_boots = 2; int allow_dk_cmds = 1; int must_be_owner = 1; int quiet_reject = 1; -int copy_to_tmp = 1; int max_socks = 100; int quick_logs = 0; int par_telnet_flood = 1; @@ -498,7 +497,6 @@ static tcl_ints def_tcl_ints[] = { {"force-expire", &force_expire, 0}, {"dupwait-timeout", &dupwait_timeout, 0}, {"userfile-perm", &userfile_perm, 0}, - {"copy-to-tmp", ©_to_tmp, 0}, {"quiet-reject", &quiet_reject, 0}, {"cidr-support", &cidr_support, 0}, {"remove-pass", &remove_pass, 0}, diff --git a/src/users.c b/src/users.c index e99f6f9c2..2e8f5ff5c 100644 --- a/src/users.c +++ b/src/users.c @@ -35,6 +35,7 @@ #include "modules.h" #include "tandem.h" +#include #include #include @@ -698,9 +699,10 @@ int readuserfile(char *file, struct userrec **ret) global_invites = NULL; } lasthand[0] = 0; - f = fopen(file, "r"); - if (f == NULL) + if (!(f = fopen(file, "r"))) { + debug2("users: fopen(%s): %s", file, strerror(errno)); return 0; + } noshare = noxtra = 1; /* read opening comment */ s = buf; From bf2c80b848029c4a327f3b750f93a93b81c86b96 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:12:11 +0100 Subject: [PATCH 15/20] Enhance crash reporting Patch by: michaelortmann --- src/eggdrop.h | 8 ----- src/main.c | 81 +++++++++--------------------------------------- src/mod/module.h | 12 ++----- src/modules.c | 12 ++----- src/net.c | 3 -- src/proto.h | 2 -- src/tclhash.c | 27 +++++----------- 7 files changed, 26 insertions(+), 119 deletions(-) diff --git a/src/eggdrop.h b/src/eggdrop.h index bf901c008..964a63c28 100644 --- a/src/eggdrop.h +++ b/src/eggdrop.h @@ -240,14 +240,6 @@ #define nrealloc(x,y) n_realloc((x),(y),__FILE__,__LINE__) #define nfree(x) n_free((x),__FILE__,__LINE__) -#ifdef DEBUG_CONTEXT -# define Context eggContext(__FILE__, __LINE__, NULL) -# define ContextNote(note) eggContextNote(__FILE__, __LINE__, NULL, note) -#else -# define Context do {} while (0) -# define ContextNote(note) do {} while (0) -#endif - #ifdef DEBUG_ASSERT # define Assert(expr) do { \ if (!(expr)) \ diff --git a/src/main.c b/src/main.c index e7fb8f79a..3d9cac074 100644 --- a/src/main.c +++ b/src/main.c @@ -30,7 +30,7 @@ */ /* We need config.h for CYGWIN_HACKS, but windows.h must be included before - * eggdrop headers, because the malloc/free/Context macros break the inclusion. + * eggdrop headers, because the malloc/free macros break the inclusion. * The SSL undefs are a workaround for bug #2182 in openssl with msys/mingw. */ #include @@ -166,11 +166,7 @@ unsigned long itraffic_unknown = 0; unsigned long itraffic_unknown_today = 0; #ifdef DEBUG_CONTEXT -/* Context storage for fatal crashes */ -char cx_file[16][32]; -char cx_note[16][256]; -int cx_line[16]; -int cx_ptr = 0; +extern char last_bind_called[]; #endif #ifdef TLS @@ -255,31 +251,25 @@ static void write_debug() { int x; char s[25]; - int y; if (nested_debug) { /* Yoicks, if we have this there's serious trouble! * All of these are pretty reliable, so we'll try these. - * - * NOTE: don't try and display context-notes in here, it's - * _not_ safe */ x = creat("DEBUG.DEBUG", 0644); if (x >= 0) { setsock(x, SOCK_NONSOCK); strlcpy(s, ctime(&now), sizeof s); - dprintf(-x, "Debug (%s) written %s\n", ver, s); - dprintf(-x, "Please report problem to https://github.com/eggheads/eggdrop/issues\n"); + dprintf(-x, "Debug (%s) written %s\n" + "Please report problem to https://github.com/eggheads/eggdrop/issues\n" + "Check doc/BUG-REPORT on how to do so.", ver, s); #ifdef EGG_PATCH dprintf(-x, "Patch level: %s\n", EGG_PATCH); #else dprintf(-x, "Patch level: %s\n", "stable"); #endif - dprintf(-x, "Context: "); - cx_ptr = cx_ptr & 15; - for (y = ((cx_ptr + 1) & 15); y != cx_ptr; y = ((y + 1) & 15)) - dprintf(-x, "%s/%d,\n ", cx_file[y], cx_line[y]); - dprintf(-x, "%s/%d\n\n", cx_file[y], cx_line[y]); + if (*last_bind_called) + dprintf(-x, "Last bind (may not be related): %s\n", last_bind_called); killsock(x); close(x); } @@ -288,10 +278,10 @@ static void write_debug() * have caused the fault last time. */ } else nested_debug = 1; - putlog(LOG_MISC, "*", "* Last context: %s/%d [%s]", cx_file[cx_ptr], - cx_line[cx_ptr], cx_note[cx_ptr][0] ? cx_note[cx_ptr] : ""); - putlog(LOG_MISC, "*", "* Please REPORT this BUG!"); + putlog(LOG_MISC, "*", "* Please report problem to https://github.com/eggheads/eggdrop/issues"); putlog(LOG_MISC, "*", "* Check doc/BUG-REPORT on how to do so."); + if (*last_bind_called) + putlog(LOG_MISC, "*", "* Last bind (may not be related): %s", last_bind_called); x = creat("DEBUG", 0644); setsock(x, SOCK_NONSOCK); if (x < 0) { @@ -347,14 +337,7 @@ static void write_debug() #ifdef STRIPFLAGS dprintf(-x, "Strip flags: %s\n", STRIPFLAGS); #endif - - dprintf(-x, "Context: "); - cx_ptr = cx_ptr & 15; - for (y = ((cx_ptr + 1) & 15); y != cx_ptr; y = ((y + 1) & 15)) - dprintf(-x, "%s/%d, [%s]\n ", cx_file[y], cx_line[y], - (cx_note[y][0]) ? cx_note[y] : ""); - dprintf(-x, "%s/%d [%s]\n\n", cx_file[cx_ptr], cx_line[cx_ptr], - (cx_note[cx_ptr][0]) ? cx_note[cx_ptr] : ""); + dprintf(-x, "Last bind (may not be related): %s\n", last_bind_called); tell_dcc(-x); dprintf(-x, "\n"); debug_mem_to_dcc(-x); @@ -439,40 +422,12 @@ static void got_ill(int z) { check_tcl_signal("sigill"); #ifdef DEBUG_CONTEXT - putlog(LOG_MISC, "*", "* Context: %s/%d [%s]", cx_file[cx_ptr], - cx_line[cx_ptr], (cx_note[cx_ptr][0]) ? cx_note[cx_ptr] : ""); + putlog(LOG_MISC, "*", "* Please REPORT this BUG!"); + putlog(LOG_MISC, "*", "* Check doc/BUG-REPORT on how to do so."); + putlog(LOG_MISC, "*", "* Last bind (may not be related): %s", last_bind_called); #endif } -#ifdef DEBUG_CONTEXT -/* Called from the Context macro. - */ -void eggContext(const char *file, int line, const char *module) -{ - eggContextNote(file, line, module, NULL); -} - -/* Called from the ContextNote macro. - */ -void eggContextNote(const char *file, int line, const char *module, - const char *note) -{ - char *p; - - p = strrchr(file, '/'); - cx_ptr = ((cx_ptr + 1) & 15); - if (!module) - strlcpy(cx_file[cx_ptr], p ? p + 1 : file, sizeof cx_file[cx_ptr]); - else - snprintf(cx_file[cx_ptr], sizeof cx_file[cx_ptr], "%s:%s", module, p ? p + 1 : file); - cx_line[cx_ptr] = line; - if (!note) - cx_note[cx_ptr][0] = 0; - else - strlcpy(cx_note[cx_ptr], note, sizeof cx_note[cx_ptr]); -} -#endif /* DEBUG_CONTEXT */ - #ifdef DEBUG_ASSERT /* Called from the Assert macro. */ @@ -604,8 +559,6 @@ static time_t then; static struct tm nowtm; /* Called once a second. - * - * Note: Try to not put any Context lines in here (guppy 21Mar2000). */ static void core_secondly() { @@ -1026,12 +979,6 @@ int main(int arg_c, char **arg_v) setrlimit(RLIMIT_CORE, &cdlim); #endif -#ifdef DEBUG_CONTEXT - /* Initialise context list */ - for (i = 0; i < 16; i++) - Context; -#endif - argc = arg_c; argv = arg_v; diff --git a/src/mod/module.h b/src/mod/module.h index f39b86c8c..ca7f4081e 100644 --- a/src/mod/module.h +++ b/src/mod/module.h @@ -90,11 +90,7 @@ typedef void (*chanout_butfunc)(int, int, const char *, ...) ATTRIBUTE_FORMAT(pr /* 0 - 3 */ #define nmalloc(x) (((void *(*)())global[0])((x),MODULE_NAME,__FILE__,__LINE__)) #define nfree(x) (global[1]((x),MODULE_NAME,__FILE__,__LINE__)) -#ifdef DEBUG_CONTEXT -# define Context (global[2](__FILE__, __LINE__, MODULE_NAME)) -#else -# define Context do {} while (0) -#endif +#define Context do {} while (0) /* For backward compatibility only */ #define module_rename ((int (*)(char *, char *))global[3]) /* 4 - 7 */ #define module_register ((int (*)(char *, Function *, int, int))global[4]) @@ -396,11 +392,7 @@ typedef void (*chanout_butfunc)(int, int, const char *, ...) ATTRIBUTE_FORMAT(pr #define nrealloc(x,y) (((void *(*)())global[230])((x),(y),MODULE_NAME,__FILE__,__LINE__)) #define xtra_set ((int(*)(struct userrec *,struct user_entry *, void *))global[231]) /* 232 - 235 */ -#ifdef DEBUG_CONTEXT -# define ContextNote(note) (global[232](__FILE__, __LINE__, MODULE_NAME, note)) -#else -# define ContextNote(note) do {} while (0) -#endif +#define ContextNote(note) do {} while (0) /* For backward compatibility only */ #ifdef DEBUG_ASSERT # define Assert(expr) do { \ if (!(expr)) \ diff --git a/src/modules.c b/src/modules.c index 932794df8..b8368944f 100644 --- a/src/modules.c +++ b/src/modules.c @@ -186,11 +186,7 @@ Function global_table[] = { /* 0 - 3 */ (Function) mod_malloc, (Function) mod_free, -#ifdef DEBUG_CONTEXT - (Function) eggContext, -#else - (Function) 0, -#endif + (Function) 0, /* was eggContext() */ (Function) module_rename, /* 4 - 7 */ (Function) module_register, @@ -495,11 +491,7 @@ Function global_table[] = { (Function) mod_realloc, (Function) xtra_set, /* 232 - 235 */ -#ifdef DEBUG_CONTEXT - (Function) eggContextNote, -#else - (Function) 0, -#endif + (Function) 0, /* was eggContextNote() */ #ifdef DEBUG_ASSERT (Function) eggAssert, #else diff --git a/src/net.c b/src/net.c index 5eba848d0..85f353d7e 100644 --- a/src/net.c +++ b/src/net.c @@ -1097,7 +1097,6 @@ int sockread(char *s, int *len, sock_list *slist, int slistmax, int tclonly) * dcc functions. Simply ignore it. * Returns -5 if tcl sockets are busy but not eggdrop sockets. */ - int sockgets(char *s, int *len) { char xx[READMAX + 2], *p, *px, *p2; @@ -1283,8 +1282,6 @@ int sockgets(char *s, int *len) } /* Dump something to a socket - * - * NOTE: Do NOT put Contexts in here if you want DEBUG to be meaningful!! */ void tputs(int z, char *s, unsigned int len) { diff --git a/src/proto.h b/src/proto.h index 7b1eb1257..9183dfa32 100644 --- a/src/proto.h +++ b/src/proto.h @@ -188,8 +188,6 @@ int exist_lang_section(char *); /* main.c */ void fatal(const char *, int); int expected_memory(void); -void eggContext(const char *, int, const char *); -void eggContextNote(const char *, int, const char *, const char *); void eggAssert(const char *, int, const char *); void backup_userfile(void); int expmem_modules(int); diff --git a/src/tclhash.c b/src/tclhash.c index 4b7160383..1028471a6 100644 --- a/src/tclhash.c +++ b/src/tclhash.c @@ -58,6 +58,10 @@ static int builtin_chat STDVAR; static int builtin_dcc STDVAR; static int builtin_log STDVAR; +#ifdef DEBUG_CONTEXT +char last_bind_called[512] = ""; +#endif + /* Allocate and initialise a chunk of memory. */ static void *n_malloc_null(int size, const char *file, int line) @@ -215,7 +219,6 @@ static cd_tcl_cmd cd_cmd_table[] = { void init_bind(void) { bind_table_list = NULL; - Context; add_cd_tcl_cmds(cd_cmd_table); H_unld = add_bind_table("unld", HT_STACKABLE, builtin_char); H_time = add_bind_table("time", HT_STACKABLE, builtin_5int); @@ -243,7 +246,6 @@ void init_bind(void) H_tls = add_bind_table("tls", HT_STACKABLE, builtin_idx); #endif add_builtins(H_dcc, C_dcc); - Context; } void kill_bind(void) @@ -726,35 +728,22 @@ static int trigger_bind(const char *proc, const char *param, char *mask) int x; struct rusage ru1, ru2; int r = 0; -#ifdef DEBUG_CONTEXT - #define FORMAT "Tcl proc: %s, param: %s" - char *buf; - /* We now try to debug the Tcl_VarEval() call below by remembering both - * the called proc name and it's parameters. This should render us a bit - * less helpless when we see context dumps. - */ - Context; - /* reuse x */ - x = snprintf(NULL, 0, FORMAT, proc ? proc : "", param ? param : ""); - buf = nmalloc(x + 1); - sprintf(buf, FORMAT, proc ? proc : "", param ? param : ""); - ContextNote(buf); - nfree(buf); -#endif /* DEBUG_CONTEXT */ /* Set the lastbind variable before evaluating the proc so that the name * of the command that triggered the bind will be available to the proc. * This feature is used by scripts such as userinfo.tcl */ - Tcl_SetVar(interp, "lastbind", (char *) mask, TCL_GLOBAL_ONLY); + Tcl_SetVar(interp, "lastbind", mask, TCL_GLOBAL_ONLY); if(proc && proc[0] != '*') { /* proc[0] != '*' excludes internal binds */ +#ifdef DEBUG_CONTEXT + snprintf(last_bind_called, sizeof last_bind_called, proc); +#endif debug1("triggering bind %s", proc); r = getrusage(RUSAGE_SELF, &ru1); } x = Tcl_VarEval(interp, proc, param, NULL); - Context; if (proc && proc[0] != '*' && !r) { if (!getrusage(RUSAGE_SELF, &ru2)) { debug3("triggered bind %s, user %.3fms sys %.3fms", proc, From 4146828150c3ccf2a3d35c646afb2a33fb5d9b13 Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 14 Jan 2024 15:15:56 -0500 Subject: [PATCH 16/20] Add Python intpreter to Eggdrop Patch by: Geo, thommey PYTHON! - Adds the .python partyline command to run a python command, similar to .tcl - Adds the pysource Tcl command to load a python file, similar to the source Tcl command - Imports the existing Tcl API (run via the eggdrop.tcl module) --- .gitignore | 1 + Makefile.in | 3 +- aclocal.m4 | 3 + configure | 48 + configure.ac | 4 + doc/sphinx_source/modules/mod/python.rst | 149 + doc/sphinx_source/using/tcl-commands.rst | 3 + m4/python.m4 | 53 + src/main.c | 2 + src/mod/Makefile.in | 14 +- src/mod/module.h | 6 +- src/mod/python.mod/Makefile.in | 46 + src/mod/python.mod/configure | 3232 ++++++++++++++++++++++ src/mod/python.mod/configure.ac | 78 + src/mod/python.mod/pycmds.c | 435 +++ src/mod/python.mod/pymod.h | 4 + src/mod/python.mod/python.c | 163 ++ src/mod/python.mod/python.h | 4 + src/mod/python.mod/scripts/bestfriend.py | 30 + src/mod/python.mod/scripts/greet.py | 23 + src/mod/python.mod/scripts/imdb.py | 26 + src/mod/python.mod/scripts/listtls.py | 30 + src/mod/python.mod/scripts/urlTitle.py | 27 + src/mod/python.mod/tclpython.c | 89 + src/modules.c | 7 +- src/tclhash.c | 46 +- src/tclhash.h | 5 +- 27 files changed, 4506 insertions(+), 25 deletions(-) create mode 100644 doc/sphinx_source/modules/mod/python.rst create mode 100644 m4/python.m4 create mode 100644 src/mod/python.mod/Makefile.in create mode 100755 src/mod/python.mod/configure create mode 100644 src/mod/python.mod/configure.ac create mode 100644 src/mod/python.mod/pycmds.c create mode 100644 src/mod/python.mod/pymod.h create mode 100644 src/mod/python.mod/python.c create mode 100644 src/mod/python.mod/python.h create mode 100644 src/mod/python.mod/scripts/bestfriend.py create mode 100644 src/mod/python.mod/scripts/greet.py create mode 100644 src/mod/python.mod/scripts/imdb.py create mode 100644 src/mod/python.mod/scripts/listtls.py create mode 100644 src/mod/python.mod/scripts/urlTitle.py create mode 100644 src/mod/python.mod/tclpython.c diff --git a/.gitignore b/.gitignore index 52806ce03..37ee0f2d9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ config.cache eggdrop EGGMOD.stamp mod.xlibs +__pycache__ diff --git a/Makefile.in b/Makefile.in index 733e3e613..93de77211 100644 --- a/Makefile.in +++ b/Makefile.in @@ -490,6 +490,7 @@ install-doc: install-start cd doc/ && $(MAKE_INSTALL) install install-scripts: install-start - +@cd scripts/ && $(MAKE_INSTALL) install + +@cd scripts/ && $(MAKE_INSTALL) install; \ + cd ../src/mod && $(MAKE_INSTALL) install-scripts #safety hash diff --git a/aclocal.m4 b/aclocal.m4 index 76c93ec25..ee4ad28b7 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -20,6 +20,9 @@ dnl dnl Load tcl macros builtin(include,m4/tcl.m4) +dnl Load python macros +builtin(include,m4/python.m4) + dnl Load gnu autoconf archive macros builtin(include,m4/ax_create_stdint_h.m4) builtin(include,m4/ax_lib_socket_nsl.m4) diff --git a/configure b/configure index 29ca7c103..0330a48b8 100755 --- a/configure +++ b/configure @@ -659,6 +659,8 @@ EGG_CROSS_COMPILING MOD_UPDIR DEST EGGVERSION +egg_with_python_config +egg_enable_python SSL_LIBS SSL_INCLUDES DEBCFLGS @@ -801,6 +803,8 @@ enable_tls with_sslinc with_ssllib enable_tdns +enable_python +with_python_config ' ac_precious_vars='build_alias host_alias @@ -1458,6 +1462,9 @@ Optional Features and Packages: --with-sslinc=PATH Path to OpenSSL headers --with-ssllib=PATH Path to OpenSSL libraries --disable-tdns disable threaded DNS core + --enable-python enable Python support (autodetect) + --disable-python disable Python support + --with-python-config=PATH Path to python-config Some influential environment variables: CC C compiler command @@ -10603,6 +10610,47 @@ printf "%s\n" "#define EGG_TDNS 1" >>confdefs.h fi +# Check for Python + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the Python module" >&5 +$as_echo_n "checking whether to compile the Python module... " >&6; } + # Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; egg_enable_python="$enableval" +fi + + # Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; egg_enable_python="$enableval" +else + egg_enable_python="autodetect" +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $egg_enable_python" >&5 +$as_echo "$egg_enable_python" >&6; } + + + + +# Check whether --with-python-config was given. +if test "${with_python_config+set}" = set; then : + withval=$with_python_config; + if test "x$enable_python" != "xno"; then + if test -d "$withval" || test -x "$withval"; then + egg_with_python_config="$withval" + else + egg_with_python_config="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid path to python-config. $withval is not a directory and not an executable." >&5 +$as_echo "$as_me: WARNING: Invalid path to python-config. $withval is not a directory and not an executable." >&2;} + fi + fi + +fi + + + + # Substitute Makefile variables. diff --git a/configure.ac b/configure.ac index 61c67d4e4..7329c813f 100644 --- a/configure.ac +++ b/configure.ac @@ -164,6 +164,10 @@ EGG_TLS_DETECT # Threaded DNS core EGG_TDNS_ENABLE +# Check for Python +EGG_PYTHON_ENABLE +EGG_PYTHON_WITHCONFIG + # Substitute Makefile variables. EGG_SUBST_EGGVERSION diff --git a/doc/sphinx_source/modules/mod/python.rst b/doc/sphinx_source/modules/mod/python.rst new file mode 100644 index 000000000..1a26a291c --- /dev/null +++ b/doc/sphinx_source/modules/mod/python.rst @@ -0,0 +1,149 @@ +Last revised: November 03, 2023 + +.. _python: + +============ +Python Module +============ + +This module adds a Python interpreter to Eggdrop, allowing you to run Python scripts. + +-------------- +Loading Python +-------------- + +Put this line into your Eggdrop configuration file to load the python module:: + + loadmodule python + +To load a python script from your config file, place the .py file in the scripts/ folder and add the following line to your config:: + + pysource scripts/myscript.py + +------------------ +Partyline Commands +------------------ + +^^^^^^^^^^^^^^^^^^^ +python +^^^^^^^^^^^^^^^^^^^ + +You can run a python command from the partyline with the .python command, such as:: + + .python 1 + 1 + Python: 2 + .python from eggdrop.tcl import putmsg; putmsg('#chan', 'Hello world!') + Python: None + +^^^^^^^^^^^^^ +.binds python +^^^^^^^^^^^^^ + +The python module extends the core ``.binds`` partyline command by adding a ``python`` mask. This command will list all binds for python scripts. + +------------ +Tcl Commands +------------ + +^^^^^^^^^^^^^^^^^^^^^^^ +pysource +^^^^^^^^^^^^^^^^^^^^^^^ + +The ``pysource`` command is analgous to the Tcl ``source`` command, except that it loads a Python script into Eggdrop instead of a Tcl script. + +----------------------- +Eggdrop Python Commands +----------------------- + +The Python module is built to use the existing core Tcl commands integrated into Eggdrop via the ``eggdrop.tcl`` module. To call an existing Tcl command from Python, you can either load the entire catalog by running ``import eggdrop.tcl``, or be more specific by ``from eggdrop.tcl import putserv, putlog, chanlist``, etc. + +Arguments to the Tcl functions are automatically converted as follows: + +* ``None`` is converted to an empty Tcl object (the empty string, ``""``) +* ``List`` and ``Tuple`` is converted to a ``Tcl list`` +* ``Dict`` is converted to a ``Tcl dictionary`` +* Everything else is converted to a string using the str() method + +Return values from Tcl functions must be manually converted: + +* ``""`` the empty string is automatically converted to None +* everything else is returned as string +* ``Tcl list`` as string can be converted to a Python ``List`` using ``parse_tcl_list`` +* ``Tcl dictionary`` as string can be converted to a Python ``Dict`` using ``parse_tcl_list`` + +Additionally, a few extra python commands have been created for use without these conversions: + +^^^^^^^^^^^^^^^^ +bind +^^^^^^^^^^^^^^^^ + +The python version of the bind command is used to create a bind that triggers a python function. The python bind takes the same arguments as the Tcl binds, for more information on bind argument syntax please see tcl_binds_. The eggdrop.tcl.bind command should not be used as it will attempt to call a Tcl proc. + +^^^^^^^^^^^^^^^^^^^^^^^ +parse_tcl_list +^^^^^^^^^^^^^^^^^^^^^^^ + +When a python script calls a Tcl command that returns a list via the eggdrop.tcl module, the return value will be a Tcl-formatted list- also simply known as a string. The ``parse_tcl_list`` command will convert the Tcl-formatted list into a Python list, which can then freely be used within the Python script. + +^^^^^^^^^^^^^^^^^^^^^^^ +parse_tcl_dict +^^^^^^^^^^^^^^^^^^^^^^^ + +When a python script calls a Tcl command that returns a dict via the eggdrop.tcl module, the return value will be a Tcl-formatted dict- also simply known as a string. The ``parse_tcl_dict`` command will c +onvert the Tcl-formatted dict into a Python list, which can then freely be used within the Python script. + +---------------- +Config variables +---------------- + +There are also some variables you can set in your config file: + + set allow-resync 0 + When two bots get disconnected, this setting allows them to create a + resync buffer which saves all changes done to the userfile during + the disconnect. When they reconnect, they will not have to transfer + the complete user file, but, instead, just send the resync buffer. + +-------------------------------- +Writing an Eggdrop Python script +-------------------------------- + +This is how to write a python script for Eggdrop. + +You can view examples of Python scripts in the exampleScripts folder included with this module. + +.. glossary:: + bestfriend.py + This example script demonstrates how to use the parse_tcl_list() python command to convert a list returned by a Tcl command into a list that is usable by Python. + greet.py + This is a very basic script that demonstrates how a Python script with binds can be run by Eggdrop. + imdb.py + This script shows how to use an existing third-party module to extend a Python script, in this case retrieving information from imdb.com. + listtls.py + This script demonstrates how to use parse-tcl_list() and parse_tcl_dict() to convert a list of dicts provided by Tcl into something that is usuable by Python. + urltitle.py + This script shows how to use an existing third-party module to extend a Python script, in this case using an http parser to collect title information from a provided web page. + + +^^^^^^^^^^^^^^ +Header section +^^^^^^^^^^^^^^ + +An Eggdrop python script requires you to import X Y and Z, in this format. + +^^^^^^^^^^^^ +Code Section +^^^^^^^^^^^^ + +Normal python code works here. To run a command from the Eggdrop Tcl library, use this format. + +Use this format all over. + +------------------------------------- +Writing a module for use with Eggdrop +------------------------------------- + +This is how you import a module for use with an egg python script. + + +Copyright (C) 2000 - 2023 Eggheads Development Team diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 34a318b53..e7a7c86e4 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -2227,6 +2227,8 @@ unbind binds [type/mask] ^^^^^^^^^^^^^^^^^ + Description: By default, lists Tcl binds registered with the Eggdrop. You can specify 'all' to view all binds, 'tcl' to view Tcl binds, and 'python' to view Python binds. Alternately, you can specify a bind type (pub, msg, etc) to view all binds that match that type of bind, or a mask that is matched against the command associated with the bind. + Returns: a list of Tcl binds, each item in the list is a sublist of five elements: { } @@ -2897,6 +2899,7 @@ Removing a bind To remove a bind, use the 'unbind' command. For example, to remove the bind for the "stop" msg command, use 'unbind msg - stop msg:stop'. +.. _tcl_binds: ^^^^^^^^^^ Flag Masks diff --git a/m4/python.m4 b/m4/python.m4 new file mode 100644 index 000000000..84dc338ba --- /dev/null +++ b/m4/python.m4 @@ -0,0 +1,53 @@ +dnl python.m4 -- Autoconf macros to compile python.mod +dnl +dnl Copyright (c) 2022 - 2022 Eggheads Development Team +dnl +dnl This program is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU General Public License +dnl as published by the Free Software Foundation; either version 2 +dnl of the License, or (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +dnl + +dnl EGG_PYTHON_ENABLE +dnl +AC_DEFUN([EGG_PYTHON_ENABLE], +[ + AC_MSG_CHECKING([whether to compile the Python module]) + AC_ARG_ENABLE(python, + [ --enable-python enable Python support (autodetect)], + [egg_enable_python="$enableval"]) + AC_ARG_ENABLE(python, + [ --disable-python disable Python support], [egg_enable_python="$enableval"], + [egg_enable_python="autodetect"]) + + AC_MSG_RESULT([$egg_enable_python]) + AC_SUBST(egg_enable_python) +]) + + +dnl EGG_PYTHON_WITHCONFIG +dnl +AC_DEFUN(EGG_PYTHON_WITHCONFIG, +[ + AC_ARG_WITH(python-config, [ --with-python-config=PATH Path to python-config], [ + if test "x$enable_python" != "xno"; then + if test -d "$withval" || test -x "$withval"; then + egg_with_python_config="$withval" + else + egg_with_python_config="no" + AC_MSG_WARN([Invalid path to python-config. $withval is not a directory and not an executable.]) + fi + fi + ]) + AC_SUBST(egg_with_python_config) +]) + diff --git a/src/main.c b/src/main.c index 3d9cac074..b4324f7ac 100644 --- a/src/main.c +++ b/src/main.c @@ -95,6 +95,7 @@ extern sigjmp_buf alarmret; time_t now; static int argc; static char **argv; +char *argv0; /* * Please use the PATCH macro instead of directly altering the version @@ -981,6 +982,7 @@ int main(int arg_c, char **arg_v) argc = arg_c; argv = arg_v; + argv0 = argv[0]; /* Version info! */ #ifdef EGG_PATCH diff --git a/src/mod/Makefile.in b/src/mod/Makefile.in index ca742f69a..4ba69f467 100644 --- a/src/mod/Makefile.in +++ b/src/mod/Makefile.in @@ -117,7 +117,7 @@ distclean: fi; \ done -install: install-help install-language +install: install-help install-language install-scripts install-help: @echo "Copying module help files." && \ @@ -169,4 +169,16 @@ install-language: fi; \ done; +install-scripts: + @for i in $(mods); do \ + if test ! "x`echo $(srcdir)/$$i/scripts/*`" = "x$(srcdir)/$$i/scripts/*"; then \ + echo "Installing example $$i scripts"; \ + for s in $(srcdir)/$$i/scripts/*; do \ + if test ! -f "$(DEST)/scripts/`basename "$$s"`"; then \ + $(INSTALL_DATA) $$s $(DEST)/scripts/; \ + fi; \ + done; \ + fi; \ + done; + #safety hash diff --git a/src/mod/module.h b/src/mod/module.h index ca7f4081e..594182a9f 100644 --- a/src/mod/module.h +++ b/src/mod/module.h @@ -520,8 +520,10 @@ typedef void (*chanout_butfunc)(int, int, const char *, ...) ATTRIBUTE_FORMAT(pr #define get_user_by_account ((struct userrec * (*)(char *))global[317]) #define delaccount_by_handle ((int(*)(char *,char *))global[318]) #define check_tcl_event_arg ((void (*) (const char *,const char *))global[319]) -/*320 - 323 */ - +/* 320 - 323 */ +#define bind_bind_entry ((int(*)(tcl_bind_list_t *, const char *, const char *, const char *))global[320]) +#define unbind_bind_entry ((int(*)(tcl_bind_list_t *, const char *, const char *, const char *))global[321]) +#define argv0 ((char *)global[322]) diff --git a/src/mod/python.mod/Makefile.in b/src/mod/python.mod/Makefile.in new file mode 100644 index 000000000..6b6c4ad5d --- /dev/null +++ b/src/mod/python.mod/Makefile.in @@ -0,0 +1,46 @@ +# Makefile for src/mod/python.mod/ + +srcdir = . +PYTHON_CFLAGS = @PYTHON_CFLAGS@ +PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ + +doofus: + @echo "" && \ + echo "Let's try this from the right directory..." && \ + echo "" && \ + cd ../../../ && $(MAKE) + +static: ../python.o + +modules: ../../../python.$(MOD_EXT) + +../python.o: + $(CC) $(PYTHON_CFLAGS) $(CFLAGS) $(CPPFLAGS) -DMAKING_MODS -c $(srcdir)/python.c && mv -f python.o ../ + +../../../python.$(MOD_EXT): ../python.o + $(LD) $(PYTHON_CFLAGS) $(CFLAGS) -o ../../../python.$(MOD_EXT) ../python.o $(PYTHON_LDFLAGS) $(XLIBS) $(MODULE_XLIBS) && $(STRIP) ../../../python.$(MOD_EXT) + +depend: + $(CC) $(CFLAGS) -MM $(srcdir)/python.c -MT ../python.o > .depend + +clean: + @rm -f .depend *.o *.$(MOD_EXT) *~ + +distclean: clean + @rm -f Makefile config.cache config.log config.status + @rm -rf autom4te.cache + +#safety hash +../python.o: .././python.mod/python.c ../../../src/mod/module.h \ + ../../../src/main.h ../../../config.h ../../../eggint.h ../../../lush.h \ + ../../../src/lang.h ../../../src/eggdrop.h ../../../src/compat/in6.h \ + ../../../src/flags.h ../../../src/cmdt.h ../../../src/tclegg.h \ + ../../../src/tclhash.h ../../../src/chan.h ../../../src/users.h \ + ../../../src/compat/compat.h ../../../src/compat/base64.h \ + ../../../src/compat/inet_aton.h ../../../src/compat/snprintf.h \ + ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ + ../../../src/mod/modvals.h ../../../src/tandem.h \ + ../../../src/mod/irc.mod/irc.h ../../../src/mod/server.mod/server.h \ + ../../../src/mod/python.mod/python.h \ + ../../../src/mod/python.mod/tclpython.c \ + ../../../src/mod/python.mod/pycmds.c diff --git a/src/mod/python.mod/configure b/src/mod/python.mod/configure new file mode 100755 index 000000000..40bd0c84a --- /dev/null +++ b/src/mod/python.mod/configure @@ -0,0 +1,3232 @@ +#! /bin/sh +# From configure.ac 9fdf80a3. +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for Eggdrop Python Module 1.9.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +# +# Copyright (C) 1999 - 2022 Eggheads Development Team +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and bugs@eggheads.org +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Eggdrop Python Module' +PACKAGE_TARNAME='eggdrop-python-module' +PACKAGE_VERSION='1.9.3' +PACKAGE_STRING='Eggdrop Python Module 1.9.3' +PACKAGE_BUGREPORT='bugs@eggheads.org' +PACKAGE_URL='' + +ac_unique_file="python.c" +ac_subst_vars='LTLIBOBJS +LIBOBJS +PYTHON_LDFLAGS +PYTHON_CFLAGS +PYTHON_CONFIG_ARGS +python_config_bin +egg_with_python_config +egg_enable_python +FGREP +GREP +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_python +with_python_config +' + ac_precious_vars='build_alias +host_alias +target_alias' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Eggdrop Python Module 1.9.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root + [DATAROOTDIR/doc/eggdrop-python-module] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Eggdrop Python Module 1.9.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-python enable Python support (autodetect) + --disable-python disable Python support + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-python-config=PATH Path to python-config + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Eggdrop Python Module configure 1.9.3 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. + +Copyright (C) 1999 - 2022 Eggheads Development Team +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Eggdrop Python Module $as_me 1.9.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +ac_aux_dir= +for ac_dir in ../../../misc "$srcdir"/../../../misc; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../misc \"$srcdir\"/../../../misc" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile the Python module" >&5 +$as_echo_n "checking whether to compile the Python module... " >&6; } + # Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; egg_enable_python="$enableval" +fi + + # Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; egg_enable_python="$enableval" +else + egg_enable_python="autodetect" +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $egg_enable_python" >&5 +$as_echo "$egg_enable_python" >&6; } + + + + +# Check whether --with-python-config was given. +if test "${with_python_config+set}" = set; then : + withval=$with_python_config; + if test "x$enable_python" != "xno"; then + if test -d "$withval" || test -x "$withval"; then + egg_with_python_config="$withval" + else + egg_with_python_config="no" + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid path to python-config. $withval is not a directory and not an executable." >&5 +$as_echo "$as_me: WARNING: Invalid path to python-config. $withval is not a directory and not an executable." >&2;} + fi + fi + +fi + + + + +python_avail="false" + +if test "x$egg_enable_python" != "xno"; then + if test "x$egg_with_python_config" = "x"; then + for ac_prog in python3-config python-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_python_config_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $python_config_bin in + [\\/]* | ?:[\\/]*) + ac_cv_path_python_config_bin="$python_config_bin" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_python_config_bin="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +python_config_bin=$ac_cv_path_python_config_bin +if test -n "$python_config_bin"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $python_config_bin" >&5 +$as_echo "$python_config_bin" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$python_config_bin" && break +done + + else + if test -d "$egg_with_python_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Checking for python-config binaries in $egg_with_python_config" >&5 +$as_echo "$as_me: Checking for python-config binaries in $egg_with_python_config" >&6;} + for ac_prog in python3-config python-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_python_config_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $python_config_bin in + [\\/]* | ?:[\\/]*) + ac_cv_path_python_config_bin="$python_config_bin" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $egg_with_python_config +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_python_config_bin="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +python_config_bin=$ac_cv_path_python_config_bin +if test -n "$python_config_bin"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $python_config_bin" >&5 +$as_echo "$python_config_bin" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$python_config_bin" && break +done + + else + if test -x "$egg_with_python_config"; then + python_config_bin="$egg_with_python_config" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Specified --with-python-config=$egg_with_python_config does not exist." >&5 +$as_echo "$as_me: WARNING: Specified --with-python-config=$egg_with_python_config does not exist." >&2;} + fi + fi + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: Python module disabled." >&5 +$as_echo "$as_me: Python module disabled." >&6;} +fi + +if test "x$python_config_bin" != "x"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether python-config supports --embed" >&5 +$as_echo_n "checking whether python-config supports --embed... " >&6; } + if $python_config_bin --help | $FGREP -q -- --embed; then : + + PYTHON_CONFIG_ARGS="--embed" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + + PYTHON_CONFIG_ARGS="" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python C flags" >&5 +$as_echo_n "checking for python C flags... " >&6; } + PYTHON_CFLAGS=`$python_config_bin $PYTHON_CONFIG_ARGS --cflags` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CFLAGS" >&5 +$as_echo "$PYTHON_CFLAGS" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python LD flags" >&5 +$as_echo_n "checking for python LD flags... " >&6; } + PYTHON_LDFLAGS=`$python_config_bin $PYTHON_CONFIG_ARGS --ldflags` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LDFLAGS" >&5 +$as_echo "$PYTHON_LDFLAGS" >&6; } + + python_avail="true" +fi + +# Disable the module +if test "x$python_avail" = "xfalse"; then + if test "x$egg_enable_python" != "xno"; then + cat >&2 <confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Eggdrop Python Module $as_me 1.9.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Eggdrop Python Module config.status 1.9.3 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi diff --git a/src/mod/python.mod/configure.ac b/src/mod/python.mod/configure.ac new file mode 100644 index 000000000..b52a686b3 --- /dev/null +++ b/src/mod/python.mod/configure.ac @@ -0,0 +1,78 @@ +dnl configure.ac: this file is processed by autoconf to produce ./configure. + +AC_PREREQ(2.69) + +sinclude(../eggmod.m4) +builtin(include,../../../m4/python.m4) + +AC_INIT([Eggdrop Python Module],[1.9.3],[bugs@eggheads.org]) + +AC_CONFIG_SRCDIR(python.c) +AC_CONFIG_AUX_DIR(../../../misc) + +AC_COPYRIGHT([Copyright (C) 1999 - 2022 Eggheads Development Team]) +AC_REVISION([m4_esyscmd([../../../misc/getcommit])]) + +AC_PROG_FGREP +EGG_PYTHON_ENABLE +EGG_PYTHON_WITHCONFIG + +python_avail="false" + +if test "x$egg_enable_python" != "xno"; then + if test "x$egg_with_python_config" = "x"; then + AC_PATH_PROGS([python_config_bin], [python3-config python-config]) + else + if test -d "$egg_with_python_config"; then + AC_MSG_NOTICE([Checking for python-config binaries in $egg_with_python_config]) + AC_PATH_PROGS([python_config_bin], [python3-config python-config], [], [$egg_with_python_config]) + else + if test -x "$egg_with_python_config"; then + python_config_bin="$egg_with_python_config" + else + AC_MSG_WARN([Specified --with-python-config=$egg_with_python_config does not exist.]) + fi + fi + fi +else + AC_MSG_NOTICE([Python module disabled.]) +fi + +if test "x$python_config_bin" != "x"; then + AC_MSG_CHECKING([whether python-config supports --embed]) + AS_IF([$python_config_bin --help | $FGREP -q -- --embed], [ + AC_SUBST([PYTHON_CONFIG_ARGS], "--embed") + AC_MSG_RESULT([yes]) + ], [ + AC_SUBST([PYTHON_CONFIG_ARGS], "") + AC_MSG_RESULT([no]) + ]) + + AC_MSG_CHECKING([for python C flags]) + PYTHON_CFLAGS=`$python_config_bin $PYTHON_CONFIG_ARGS --cflags` + AC_MSG_RESULT([$PYTHON_CFLAGS]) + AC_SUBST(PYTHON_CFLAGS) + + AC_MSG_CHECKING([for python LD flags]) + PYTHON_LDFLAGS=`$python_config_bin $PYTHON_CONFIG_ARGS --ldflags` + AC_MSG_RESULT([$PYTHON_LDFLAGS]) + AC_SUBST(PYTHON_LDFLAGS) + python_avail="true" +fi + +# Disable the module +if test "x$python_avail" = "xfalse"; then + if test "x$egg_enable_python" != "xno"; then + cat >&2 < +#include +#include +#include "src/mod/module.h" + +struct py_bind { + tcl_bind_list_t *bindtable; + char tclcmdname[512]; + PyObject *callback; + struct py_bind *next; +}; + +typedef struct { + PyObject_HEAD + char tclcmdname[512]; +} TclFunc; + +static PyTypeObject TclFuncType; +static int eval_idx = -1; + +static struct py_bind *py_bindlist; + +static PyObject *EggdropError; //create static Python Exception object + +static Tcl_Obj *py_to_tcl_obj(PyObject *o); // generic conversion function + +static PyObject *py_displayhook(PyObject *self, PyObject *o) { + PyObject *pstr; + + if (o) { + pstr = PyObject_Repr(o); + if (pstr) { + dprintf(eval_idx, "Python: %s\n", PyUnicode_AsUTF8(pstr)); + Py_DECREF(pstr); + } + } + Py_RETURN_NONE; +} + +static void cmd_python(struct userrec *u, int idx, char *par) { + PyObject *pobj, *ptype, *pvalue, *ptraceback; + PyObject *pystr, *module_name, *pymodule, *pyfunc, *pyval, *item; + Py_ssize_t n; + int i; + + PyErr_Clear(); + + // Expression output redirection via sys.displayhook + eval_idx = idx; + pobj = PyRun_String(par, Py_single_input, pglobals, pglobals); + + if (pobj) { + // always None + Py_DECREF(pobj); + } else if (PyErr_Occurred()) { + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + pystr = PyObject_Str(pvalue); + // Get "pretty" error result + dprintf(eval_idx, "Python Error: %s\n", PyUnicode_AsUTF8(pystr)); + module_name = PyUnicode_FromString("traceback"); + pymodule = PyImport_Import(module_name); + Py_DECREF(module_name); + // format backtrace and print + pyfunc = PyObject_GetAttrString(pymodule, "format_exception"); + if (pyfunc && PyCallable_Check(pyfunc)) { + pyval = PyObject_CallFunctionObjArgs(pyfunc, ptype, pvalue, ptraceback, NULL); + // Check if traceback is a list and handle as such + if (pyval && PyList_Check(pyval)) { + n = PyList_Size(pyval); + for (i = 0; i < n; i++) { + item = PyList_GetItem(pyval, i); + pystr = PyObject_Str(item); + dprintf(idx, "%s", PyUnicode_AsUTF8(pystr)); + } + } else { + pystr = PyObject_Str(pyval); + dprintf(idx, "%s", PyUnicode_AsUTF8(pystr)); + } + Py_XDECREF(pyval); + } + } + return; +} + +static PyObject *make_ircuser_dict(memberlist *m) { + PyObject *result = PyDict_New(); + PyDict_SetItemString(result, "nick", PyUnicode_FromString(m->nick)); + PyDict_SetItemString(result, "host", PyUnicode_FromString(m->userhost)); + if (m->joined) { + PyObject *tmp = PyTuple_New(1); + PyTuple_SET_ITEM(tmp, 0, PyFloat_FromDouble((double)m->joined)); + PyDict_SetItemString(result, "joined", PyDateTime_FromTimestamp(tmp)); + } + if (m->last) { + PyObject *tmp = PyTuple_New(1); + PyTuple_SET_ITEM(tmp, 0, PyFloat_FromDouble((double)m->last)); + PyDict_SetItemString(result, "lastseen", PyDateTime_FromTimestamp(tmp)); + } + PyDict_SetItemString(result, "account", m->account[0] ? PyUnicode_FromString(m->account) : Py_None); + return result; +} + +static PyObject *py_findircuser(PyObject *self, PyObject *args) { + char *nick, *chan = NULL; + + if (!PyArg_ParseTuple(args, "s|s", &nick, &chan)) { + PyErr_SetString(EggdropError, "wrong number of args"); + return NULL; + } + for (struct chanset_t *ch = chan ? findchan_by_dname(chan) : chanset; ch; ch = chan ? NULL : ch->next) { + memberlist *m = ismember(ch, nick); + if (m) { + return make_ircuser_dict(m); + } + } + Py_RETURN_NONE; +} + +static int tcl_call_python(ClientData cd, Tcl_Interp *irp, int objc, Tcl_Obj *const objv[]) +{ + PyObject *args = PyTuple_New(objc > 1 ? objc - 1: 0); + struct py_bind *bindinfo = cd; + + // objc[0] is procname + for (int i = 1; i < objc; i++) { + PyTuple_SET_ITEM(args, i - 1, Py_BuildValue("s", Tcl_GetStringFromObj(objv[i], NULL))); + } + if (!PyObject_Call(bindinfo->callback, args, NULL)) { + PyErr_Print(); + Tcl_SetResult(irp, "Error calling python code", NULL); + return TCL_ERROR; + } + return TCL_OK; +} + +static PyObject *py_parse_tcl_list(PyObject *self, PyObject *args) { + int max; + const char *str; + Tcl_Obj *strobj; + PyObject *result; + + if (!PyArg_ParseTuple(args, "s", &str)) { + PyErr_SetString(PyExc_TypeError, "Argument is not a unicode string"); + return NULL; + } + strobj = Tcl_NewStringObj(str, -1); + Tcl_IncrRefCount(strobj); + if (Tcl_ListObjLength(tclinterp, strobj, &max) != TCL_OK) { + Tcl_DecrRefCount(strobj); + PyErr_SetString(EggdropError, "Supplied string is not a Tcl list"); + } + result = PyList_New(max); + for (int i = 0; i < max; i++) { + Tcl_Obj *tclobj; + const char *tclstr; + int tclstrlen; + + Tcl_ListObjIndex(tclinterp, strobj, i, &tclobj); + tclstr = Tcl_GetStringFromObj(tclobj, &tclstrlen); + PyList_SetItem(result, i, PyUnicode_DecodeUTF8(tclstr, tclstrlen, NULL)); + } + Tcl_DecrRefCount(strobj); + return result; +} + +static PyObject *py_parse_tcl_dict(PyObject *self, PyObject *args) { + int done; + const char *str; + Tcl_Obj *strobj, *key, *value; + Tcl_DictSearch search; + PyObject *result; + + if (!PyArg_ParseTuple(args, "s", &str)) { + PyErr_SetString(PyExc_TypeError, "Argument is not a unicode string"); + return NULL; + } + strobj = Tcl_NewStringObj(str, -1); + if (Tcl_DictObjFirst(tclinterp, strobj, &search, &key, &value, &done) != TCL_OK) { + PyErr_SetString(EggdropError, "Supplied string is not a Tcl dictionary"); + } + result = PyDict_New(); + while (!done) { + int len; + const char *valstr = Tcl_GetStringFromObj(value, &len); + PyObject *pyval = PyUnicode_DecodeUTF8(valstr, len, NULL); + PyDict_SetItemString(result, Tcl_GetString(key), pyval); + Tcl_DictObjNext(&search, &key, &value, &done); + } + Tcl_DictObjDone(&search); + return result; +} + +static PyObject *py_bind(PyObject *self, PyObject *args) { + PyObject *callback; + char *bindtype, *mask, *flags; + struct py_bind *bindinfo; + tcl_bind_list_t *tl; + + // type flags mask callback + if (!PyArg_ParseTuple(args, "sssO", &bindtype, &flags, &mask, &callback) || !callback) { + PyErr_SetString(EggdropError, "wrong arguments"); + return NULL; + } + if (!(tl = find_bind_table(bindtype))) { + PyErr_SetString(EggdropError, "unknown bind type"); + return NULL; + } + if (callback == Py_None) { + PyErr_SetString(EggdropError, "callback is None"); + return NULL; + } + if (!PyCallable_Check(callback)) { + PyErr_SetString(EggdropError, "callback is not callable"); + return NULL; + } + Py_IncRef(callback); + + bindinfo = nmalloc(sizeof *bindinfo); + bindinfo->bindtable = tl; + bindinfo->callback = callback; + bindinfo->next = py_bindlist; + snprintf(bindinfo->tclcmdname, sizeof bindinfo->tclcmdname, "*python:%s:%s:%" PRIxPTR, bindtype, mask, (uintptr_t)callback); + py_bindlist = bindinfo; + // TODO: deleteproc + Tcl_CreateObjCommand(tclinterp, bindinfo->tclcmdname, tcl_call_python, bindinfo, NULL); + // TODO: flags? + bind_bind_entry(tl, flags, mask, bindinfo->tclcmdname); + Py_RETURN_NONE; +} + +static Tcl_Obj *py_list_to_tcl_obj(PyObject *o) { + int max = PyList_GET_SIZE(o); + Tcl_Obj *result = Tcl_NewListObj(0, NULL); + + for (int i = 0; i < max; i++) { + Tcl_ListObjAppendElement(tclinterp, result, py_to_tcl_obj(PyList_GET_ITEM(o, i))); + } + return result; +} + +static Tcl_Obj *py_tuple_to_tcl_obj(PyObject *o) { + int max = PyTuple_GET_SIZE(o); + Tcl_Obj *result = Tcl_NewListObj(0, NULL); + + for (int i = 0; i < max; i++) { + Tcl_ListObjAppendElement(tclinterp, result, py_to_tcl_obj(PyTuple_GET_ITEM(o, i))); + } + return result; +} + +static Tcl_Obj *py_dict_to_tcl_obj(PyObject *o) { + int max; + Tcl_Obj *result = Tcl_NewDictObj(); + + /* operate on list of (key, value) tuples instead */ + o = PyDict_Items(o); + max = PyList_GET_SIZE(o); + for (int i = 0; i < max; i++) { + PyObject *key = PyTuple_GET_ITEM(PyList_GET_ITEM(o, i), 0); + PyObject *val = PyTuple_GET_ITEM(PyList_GET_ITEM(o, i), 1); + Tcl_Obj *keyobj = py_to_tcl_obj(key); + Tcl_Obj *valobj = py_to_tcl_obj(val); + Tcl_DictObjPut(tclinterp, result, keyobj, valobj); + } + return result; +} + +static Tcl_Obj *py_str_to_tcl_obj(PyObject *o) { + Tcl_Obj *ret; + PyObject *strobj = PyObject_Str(o); + + if (strobj) { + ret = Tcl_NewStringObj(PyUnicode_AsUTF8(strobj), -1); + Py_DECREF(strobj); + } else { + ret = Tcl_NewObj(); + } + return ret; +} + +static Tcl_Obj *py_to_tcl_obj(PyObject *o) { + if (PyList_Check(o)) { + return py_list_to_tcl_obj(o); + } else if (PyDict_Check(o)) { + return py_dict_to_tcl_obj(o); + } else if (PyTuple_Check(o)) { + return py_tuple_to_tcl_obj(o); + } else if (o == Py_None) { + return Tcl_NewObj(); + } else { + return py_str_to_tcl_obj(o); + } +} + +static PyObject *python_call_tcl(PyObject *self, PyObject *args, PyObject *kwargs) { + TclFunc *tf = (TclFunc *)self; + Py_ssize_t argc = PyTuple_Size(args); + Tcl_DString ds; + const char *result; + int retcode; + + Tcl_DStringInit(&ds); + Tcl_DStringAppendElement(&ds, tf->tclcmdname); + for (int i = 0; i < argc; i++) { + PyObject *o = PyTuple_GetItem(args, i); + Tcl_DStringAppendElement(&ds, Tcl_GetString(py_to_tcl_obj(o))); + } + retcode = Tcl_Eval(tclinterp, Tcl_DStringValue(&ds)); + + if (retcode != TCL_OK) { + PyErr_Format(EggdropError, "Tcl error: %s", Tcl_GetStringResult(tclinterp)); + return NULL; + } + result = Tcl_GetStringResult(tclinterp); + //putlog(LOG_MISC, "*", "Python called '%s' -> '%s'", Tcl_DStringValue(&ds), result); + + if (!*result) { + // Empty string means okay + Py_RETURN_NONE; + } + + return PyUnicode_DecodeUTF8(result, strlen(result), NULL); +} + +static PyObject *py_findtclfunc(PyObject *self, PyObject *args) { + char *cmdname; + TclFunc *result; + + if (!PyArg_ParseTuple(args, "s", &cmdname)) { + PyErr_SetString(EggdropError, "wrong arguments"); + return NULL; + } + // TODO: filter a bit better what is available to Python, specify return types ("list of string"), etc. + if (!(Tcl_FindCommand(tclinterp, cmdname, NULL, TCL_GLOBAL_ONLY))) { + PyErr_SetString(PyExc_AttributeError, cmdname); + return NULL; + } + result = PyObject_New(TclFunc, &TclFuncType); + strcpy(result->tclcmdname, cmdname); + return (PyObject *)result; +} + +static PyMethodDef MyPyMethods[] = { + {"bind", py_bind, METH_VARARGS, "register an eggdrop python bind"}, + {"findircuser", py_findircuser, METH_VARARGS, "find an IRC user by nickname and optional channel"}, + {"parse_tcl_list", py_parse_tcl_list, METH_VARARGS, "convert a Tcl list string to a Python list"}, + {"parse_tcl_dict", py_parse_tcl_dict, METH_VARARGS, "convert a Tcl dict string to a Python dict"}, + {"__displayhook__", py_displayhook, METH_O, "display hook for python expressions"}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyMethodDef EggTclMethods[] = { + // TODO: __dict__ with all valid Tcl commands? + {"__getattr__", py_findtclfunc, METH_VARARGS, "fallback to call Tcl functions transparently"}, + {NULL, NULL, 0, NULL} +}; + +static cmd_t mydcc[] = { + /* command flags function tcl-name */ + {"python", "", (IntFunc) cmd_python, NULL}, + {NULL, NULL, NULL, NULL} /* Mark end. */ +}; + +static struct PyModuleDef eggdrop = { + PyModuleDef_HEAD_INIT, + "eggdrop", /* name of module */ + 0, /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + MyPyMethods +}; + +static struct PyModuleDef eggdrop_tcl = { PyModuleDef_HEAD_INIT, "eggdrop.tcl", NULL, -1, EggTclMethods }; + +static PyTypeObject TclFuncType = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "eggdrop.TclFunc", + .tp_doc = "Tcl function that is callable from Python.", + .tp_basicsize = sizeof(TclFunc), + .tp_itemsize = 0, + .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_new = PyType_GenericNew, + .tp_call = python_call_tcl, +}; + +PyMODINIT_FUNC PyInit_eggdrop(void) { + PyObject *pymodobj, *eggtclmodobj, *pymoddict; + + pymodobj = PyModule_Create(&eggdrop); + if (pymodobj == NULL) + return NULL; + + EggdropError = PyErr_NewException("eggdrop.error", NULL, NULL); + Py_INCREF(EggdropError); + if (PyModule_AddObject(pymodobj, "error", EggdropError) < 0) { + Py_DECREF(EggdropError); + Py_CLEAR(EggdropError); + Py_DECREF(pymodobj); + return NULL; + } + eggtclmodobj = PyModule_Create(&eggdrop_tcl); + PyModule_AddObject(pymodobj, "tcl", eggtclmodobj); + + pymoddict = PyModule_GetDict(pymodobj); + PyDict_SetItemString(pymoddict, "tcl", eggtclmodobj); + + pymoddict = PyImport_GetModuleDict(); + PyDict_SetItemString(pymoddict, "eggdrop.tcl", eggtclmodobj); + + PyType_Ready(&TclFuncType); + + return pymodobj; +} diff --git a/src/mod/python.mod/pymod.h b/src/mod/python.mod/pymod.h new file mode 100644 index 000000000..5d3ae0fd5 --- /dev/null +++ b/src/mod/python.mod/pymod.h @@ -0,0 +1,4 @@ +#define APIDEF_METHOD(symbol) static PyObject * api_##symbol(PyObject *self, PyObject *args) +#define APIDEF_KWMETHOD(symbol) static PyObject * api_##symbol(PyObject *self, PyObject *args, PyObject *kw) + +#undef putserv diff --git a/src/mod/python.mod/python.c b/src/mod/python.mod/python.c new file mode 100644 index 000000000..4cb3b70d4 --- /dev/null +++ b/src/mod/python.mod/python.c @@ -0,0 +1,163 @@ +/* + * python.c -- python interpreter handling for python.mod + */ + +/* + * Copyright (C) 2020 - 2021 Eggheads Development Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define MODULE_NAME "python" +#define MAKING_PYTHON +#define PY_SSIZE_T_CLEAN /* Not required for 3.13+ but here for back compat */ + +#define ARRAYCOUNT(x) (sizeof (x) / sizeof *(x)) + +#include "src/mod/module.h" +// HACK, but stable API +#undef interp +#define tclinterp (*(Tcl_Interp **)(global[128])) +#undef days +#include +#include +#include +#include "src/mod/irc.mod/irc.h" +#include "src/mod/server.mod/server.h" +#include "src/mod/python.mod/python.h" + +//static PyObject *pymodobj; +static PyObject *pirp, *pglobals; + +#undef global +static Function *global = NULL, *irc_funcs = NULL; +#include "src/mod/python.mod/pycmds.c" +#include "src/mod/python.mod/tclpython.c" + +EXPORT_SCOPE char *python_start(Function *global_funcs); + +static int python_expmem() +{ + return 0; // TODO +} + +// TODO: Do we really have to exit eggdrop on module load failure? +static void init_python() { + PyObject *pmodule; + PyStatus status; + PyConfig config; + + if (PY_VERSION_HEX < 0x0308) { + putlog(LOG_MISC, "*", "Python: Python version %d is lower than 3.8, not loading Python module", PY_VERSION_HEX); + return; + } + PyConfig_InitIsolatedConfig(&config); + config.install_signal_handlers = 0; + config.parse_argv = 0; + status = PyConfig_SetBytesString(&config, &config.program_name, argv0); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + putlog(LOG_MISC, "*", "Python: Fatal error: Could not set program base path"); + Py_ExitStatusException(status); + } + if (PyImport_AppendInittab("eggdrop", &PyInit_eggdrop) == -1) { + putlog(LOG_MISC, "*", "Python: Error: could not extend in-built modules table"); + exit(1); + } + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + PyConfig_Clear(&config); + putlog(LOG_MISC, "*", "Python: Fatal error: Could not initialize config"); + fatal(1); + } + PyConfig_Clear(&config); + PyDateTime_IMPORT; + pmodule = PyImport_ImportModule("eggdrop"); + if (!pmodule) { + PyErr_Print(); + putlog(LOG_MISC, "*", "Error: could not import module 'eggdrop'"); + fatal(1); + } + + pirp = PyImport_AddModule("__main__"); + pglobals = PyModule_GetDict(pirp); + + PyRun_SimpleString("import sys"); + // TODO: Relies on pwd() staying eggdrop main dir + PyRun_SimpleString("sys.path.append(\".\")"); + PyRun_SimpleString("import eggdrop"); + PyRun_SimpleString("sys.displayhook = eggdrop.__displayhook__"); + + return; +} + +static void kill_python() { + if (Py_FinalizeEx() < 0) { + exit(120); + } + return; +} + +static void python_report(int idx, int details) +{ + // TODO +} + +static char *python_close() +{ + Context; + kill_python(); + rem_builtins(H_dcc, mydcc); + rem_tcl_commands(my_tcl_cmds); + module_undepend(MODULE_NAME); + return NULL; +} + +static Function python_table[] = { + (Function) python_start, + (Function) python_close, + (Function) python_expmem, + (Function) python_report +}; + +char *python_start(Function *global_funcs) +{ + /* Assign the core function table. After this point you use all normal + * functions defined in src/mod/modules.h + */ + global = global_funcs; + + Context; + /* Register the module. */ + module_register(MODULE_NAME, python_table, 0, 1); + + if (!module_depend(MODULE_NAME, "eggdrop", 109, 0)) { + module_undepend(MODULE_NAME); + return "This module requires Eggdrop 1.9.0 or later."; + } + // TODO: Is this dependency necessary? It auto-loads irc.mod, that might be undesired + if (!(irc_funcs = module_depend(MODULE_NAME, "irc", 1, 5))) { + module_undepend(MODULE_NAME); + return "This module requires irc module 1.5 or later."; + } + // irc.mod depends on server.mod and channels.mod, so those were implicitely loaded + + init_python(); + + /* Add command table to bind list */ + add_builtins(H_dcc, mydcc); + add_tcl_commands(my_tcl_cmds); + return NULL; +} \ No newline at end of file diff --git a/src/mod/python.mod/python.h b/src/mod/python.mod/python.h new file mode 100644 index 000000000..a3c20f36a --- /dev/null +++ b/src/mod/python.mod/python.h @@ -0,0 +1,4 @@ +#define PY_SSIZE_T_CLEAN +#include +#define PY_OK 0 +#undef putserv diff --git a/src/mod/python.mod/scripts/bestfriend.py b/src/mod/python.mod/scripts/bestfriend.py new file mode 100644 index 000000000..2e61b7718 --- /dev/null +++ b/src/mod/python.mod/scripts/bestfriend.py @@ -0,0 +1,30 @@ +# GOAL: Demonstrate how to convert a list provided by a Tcl command into a Python list + +# Load bind from eggdrop, not eggdrop.tcl. Loading it from eggdrop.tcl would cause +# the bind to call a Tcl proc, not the python method. +from eggdrop import bind, parse_tcl_list + +# Load any Tcl commands you want to use from the eggdrop.tcl module. +from eggdrop.tcl import putmsg, putlog, chanlist + +# And now, a totally normal python module +import random + +# This is a proc that calls the putmsg Tcl command. Note that, slightly different than Tcl, +# each argument is separated by a comma instead of just a space +# +# This function is trivial and silly, but shows how Python can properly accept and type a Tcl list +def pickAFriend(nick, user, hand, chan, text, **kwargs): + users = chanlist(chan) + # Here we use a new python function called 'parse_tcl_list' to convert the Tcl list provided by chanlist + # into a python list. Without this, you just have a long space-separated string + userlist = parse_tcl_list(users) + putlog(f"This is a python list of the users: {userlist}") + bestFriend = random.choice(userlist) + putmsg(chan, f"The first user I found was {userlist[0]}") + putmsg(chan, f"But {bestFriend} is my new best friend!") + +# Call binds at the end of the script, not the top- the methods must be defined! +bind("pub", "*", "!friend", pickAFriend) + +print('Loaded bestfriend.py') diff --git a/src/mod/python.mod/scripts/greet.py b/src/mod/python.mod/scripts/greet.py new file mode 100644 index 000000000..9400f8d30 --- /dev/null +++ b/src/mod/python.mod/scripts/greet.py @@ -0,0 +1,23 @@ +# GOAL: Demonstrate how to use a Python bind to call a Python function + +# Load bind from eggdrop, not eggdrop.tcl. Loading it from eggdrop.tcl would cause +# the bind to call a Tcl proc, not the python function. +from eggdrop import bind + +# Load any Tcl commands you want to use from the eggdrop.tcl module. +from eggdrop.tcl import putmsg + +# This is a proc that calls the putmsg Tcl command. Note that, slightly different than Tcl, +# each argument is separated by a comma instead of just a space +def joinGreetUser(nick, host, handle, channel, **kwargs): + putmsg(channel, f"Hello {nick}, welcome to {channel}") + +def joinGreetOp(nick, host, handle, channel, **kwargs): + putmsg(channel, f"{nick} is an operator on this channel!") + +# Call binds at the end of the script, not the top- the functions must be defined! +bind("join", "*", "*", joinGreetUser) +# Again, arguments are separated with a comma. This bind requires the 'o' flag to be triggered. +bind("join", "o", "*", joinGreetOp) + +print('Loaded greet.py') diff --git a/src/mod/python.mod/scripts/imdb.py b/src/mod/python.mod/scripts/imdb.py new file mode 100644 index 000000000..d052377c3 --- /dev/null +++ b/src/mod/python.mod/scripts/imdb.py @@ -0,0 +1,26 @@ +# GOAL: Demonstrate how to use a third-party python module + +# Load bind from eggdrop, not eggdrop.tcl. Loading it from eggdrop.tcl would cause +# the bind to call a Tcl proc, not the python function. +from eggdrop import bind + +# Load any Tcl commands you want to use. +from eggdrop.tcl import putmsg, putlog + +# Load a python module as usual. +from imdb import Cinemagoer + +# Just a totally normal Python function, nothing special here! Note the Tcl command +# 'putlog' is called +def pubGetMovie(nick, user, hand, chan, text, **kwargs): + imdb = Cinemagoer() + putlog("IMDB: Searching for "+text) + results = imdb.search_movie(text) + movie = imdb.get_movie(results[0].movieID) + putmsg(chan, f"Movie: {movie['title']} ({movie['year']}): {movie['plot outline']}") + +# Call binds at the end of the script, not the top- the functions must be defined! +bind("pub", "*", "!movie", pubGetMovie) + +# Should we talk about print vs putlog? +print('Loaded imdb.py') diff --git a/src/mod/python.mod/scripts/listtls.py b/src/mod/python.mod/scripts/listtls.py new file mode 100644 index 000000000..1f802e904 --- /dev/null +++ b/src/mod/python.mod/scripts/listtls.py @@ -0,0 +1,30 @@ +# GOAL: Demonstrate how to convert Tcl dicts nested in a Tcl list to a Python list of Python dicts + +# Load bind from eggdrop, not eggdrop.tcl. Loading it from eggdrop.tcl would cause +# the bind to call a Tcl proc, not the python method. +from eggdrop import bind, parse_tcl_list, parse_tcl_dict + +# Load any Tcl commands you want to use from the eggdrop.tcl module. +from eggdrop.tcl import putmsg, putlog, socklist + +# This is a proc that calls the putmsg Tcl command. Note that, slightly different than Tcl, +# each argument is separated by a comma instead of just a space +# +# This function is trivial and silly, but shows how Python can properly accept and type a Tcl dict +def listInsecureSockets(nick, user, hand, chan, text, **kwargs): + sockets = socklist() + # socklist() will return us a Tcl-formatted list of dicts (aka, a string), so we have to first + # convert this to a Python list using parse_tcl_list(). + socketlist = parse_tcl_list(sockets) + # Now socklist contains a Python list of Tcl-formatted dicts (again, strings), so now we have + # to format each list item into a Python dict using parse_tcl_dict(). + for socket in socketlist: + socketdict = parse_tcl_dict(socket) + i = socketdict.get("idx") + status = socketdict.get("secure") + putmsg(chan, f"The TLS status of idx {i} is {status}") + +# Call binds at the end of the script, not the top- the methods must be defined! +bind("pub", "*", "!listtls", listInsecureSockets) + +print('Loaded listtls.py') diff --git a/src/mod/python.mod/scripts/urlTitle.py b/src/mod/python.mod/scripts/urlTitle.py new file mode 100644 index 000000000..60dc6ae00 --- /dev/null +++ b/src/mod/python.mod/scripts/urlTitle.py @@ -0,0 +1,27 @@ +# GOAL: Demonstrate how to use a third party python module + +# Load bind from eggdrop, not eggdrop.tcl. Loading it from eggdrop.tcl would cause +# the bind to call a Tcl proc, not the python function. +from eggdrop import bind + +# Load any Tcl commands you want to use from the eggdrop.tcl module. +from eggdrop.tcl import putmsg, putlog + +# Load a python module as usual. +from bs4 import BeautifulSoup +import requests + +# Just a totally normal Python function, nothing special here! Note the Tcl command +# 'putlog' is called +def pubGetTitle(nick, host, handle, channel, text, **kwargs): + try: + reqs = requests.get(text) + soup = BeautifulSoup(reqs.text, 'html.parser') + putmsg(channel, "The title of the webpage is: "+soup.find_all('title')[0].get_text()) + except Exception as e: + putmsg(channel, "Error: " + str(e)) + +# Call binds at the end of the script, not the top- the functions must be defined! +bind("pub", "*", "!title", pubGetTitle) + +print('Loaded example.py') diff --git a/src/mod/python.mod/tclpython.c b/src/mod/python.mod/tclpython.c new file mode 100644 index 000000000..88a89b2d7 --- /dev/null +++ b/src/mod/python.mod/tclpython.c @@ -0,0 +1,89 @@ +/* + * tclpython.c -- tcl functions for python.mod + */ +/* + * Copyright (C) 2000 - 2023 Eggheads Development Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +static int tcl_pysource STDVAR +{ + FILE *fp; + PyObject *pobj, *ptype, *pvalue, *ptraceback; + PyObject *pystr; + Py_ssize_t n; + const char *res = NULL; + int i; + + BADARGS(2, 2, " script"); + + if (!(fp = fopen(argv[1], "r"))) { + Tcl_AppendResult(irp, "Error: could not open file ", argv[1],": ", strerror(errno), NULL); + return TCL_ERROR; + } + PyErr_Clear(); + // Always PyNone or NULL on exception + pobj = PyRun_FileEx(fp, argv[1], Py_file_input, pglobals, pglobals, 1); + Py_XDECREF(pobj); + + if (PyErr_Occurred()) { + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + pystr = PyObject_Str(pvalue); + Tcl_AppendResult(irp, "Error loading python: ", PyUnicode_AsUTF8(pystr), NULL); + Py_DECREF(pystr); + // top level syntax errors do not have a traceback + if (ptraceback) { + PyObject *module_name, *pymodule, *pyfunc, *pyval, *item; + + module_name = PyUnicode_FromString("traceback"); + pymodule = PyImport_Import(module_name); + Py_DECREF(module_name); + // format backtrace and print + pyfunc = PyObject_GetAttrString(pymodule, "format_exception"); + + if (pyfunc && PyCallable_Check(pyfunc)) { + pyval = PyObject_CallFunctionObjArgs(pyfunc, ptype, pvalue, ptraceback, NULL); + + if (pyval && PyList_Check(pyval)) { + n = PyList_Size(pyval); + for (i = 0; i < n; i++) { + item = PyList_GetItem(pyval, i); + pystr = PyObject_Str(item); + res = PyUnicode_AsUTF8(pystr); + // strip \n + putlog(LOG_MISC, "*", "%.*s", (int)(strlen(res) - 1), res); + Py_DECREF(pystr); + } + } else { + putlog(LOG_MISC, "*", "Error fetching python traceback"); + } + Py_XDECREF(pyval); + } + Py_XDECREF(pyfunc); + Py_DECREF(pymodule); + } + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + return TCL_ERROR; + } + return TCL_OK; +} + +static tcl_cmds my_tcl_cmds[] = { + {"pysource", tcl_pysource}, + {NULL, NULL} +}; diff --git a/src/modules.c b/src/modules.c index b8368944f..d85a09742 100644 --- a/src/modules.c +++ b/src/modules.c @@ -100,6 +100,8 @@ extern time_t now, online_since; extern tand_t *tandbot; extern Tcl_Interp *interp; extern sock_list *socklist; +extern char argv0; + int xtra_kill(); int xtra_unpack(); @@ -620,8 +622,11 @@ Function global_table[] = { (Function) & USERENTRY_ACCOUNT, /* struct user_entry_type * */ (Function) get_user_by_account, (Function) delhost_by_handle, - (Function) check_tcl_event_arg + (Function) check_tcl_event_arg, /* 320 - 323 */ + (Function) bind_bind_entry, + (Function) unbind_bind_entry, + (Function) & argv0 }; void init_modules(void) diff --git a/src/tclhash.c b/src/tclhash.c index 1028471a6..7f905e816 100644 --- a/src/tclhash.c +++ b/src/tclhash.c @@ -349,7 +349,7 @@ static void dump_bind_tables(Tcl_Interp *irp) } } -static int unbind_bind_entry(tcl_bind_list_t *tl, const char *flags, +int unbind_bind_entry(tcl_bind_list_t *tl, const char *flags, const char *cmd, const char *proc) { tcl_bind_mask_t *tm; @@ -381,7 +381,7 @@ static int unbind_bind_entry(tcl_bind_list_t *tl, const char *flags, /* Add command (remove old one if necessary) */ -static int bind_bind_entry(tcl_bind_list_t *tl, const char *flags, +int bind_bind_entry(tcl_bind_list_t *tl, const char *flags, const char *cmd, const char *proc) { tcl_cmd_t *tc; @@ -1272,6 +1272,7 @@ void tell_binds(int idx, char *par) tcl_bind_list_t *tl, *tl_kind; tcl_bind_mask_t *tm; int fnd = 0, showall = 0, patmatc = 0, maxname = 0; + int ok = 0, showpy = 0, showtcl = 0; tcl_cmd_t *tc; char *name, *proc, *s, flg[100]; @@ -1292,7 +1293,13 @@ void tell_binds(int idx, char *par) if ((name && name[0] && !strcasecmp(name, "all")) || (s && s[0] && !strcasecmp(s, "all"))) showall = 1; - if (tl_kind == NULL && name && name[0] && strcasecmp(name, "all")) + if ((name && name[0] && !strcasecmp(name, "tcl")) || + (s && s[0] && !strcasecmp(s, "all"))) + showtcl = 1; + if ((name && name[0] && !strcasecmp(name, "python")) || + (s && s[0] && !strcasecmp(s, "all"))) + showpy = 1; + if (tl_kind == NULL && !showpy && !showtcl && name && name[0] && strcasecmp(name, "all")) patmatc = 1; for (tl = tl_kind ? tl_kind : bind_table_list; tl; @@ -1314,7 +1321,6 @@ void tell_binds(int idx, char *par) dprintf(idx, "%s", MISC_CMDBINDS); dprintf(idx, " %*s FLAGS COMMAND HITS BINDING (TCL)\n", maxname, "TYPE"); - for (tl = tl_kind ? tl_kind : bind_table_list; tl; tl = tl_kind ? 0 : tl->next) { if (tl->flags & HT_DELETED) @@ -1327,26 +1333,28 @@ void tell_binds(int idx, char *par) continue; proc = tc->func_name; build_flags(flg, &(tc->flags), NULL); - if (!strcmp(flg, "-|-")) { - flg[0] = '*'; - flg[1] = '\0'; - } - if (showall || proc[0] != '*') { - int ok = 0; - - if (patmatc == 1) { + ok = 0; + if (showall) { + ok = 1; + } else if (patmatc || showpy || showtcl) { + if ((patmatc == 1) && (proc[0] != '*')) { if (wild_match_per(name, tl->name) || wild_match_per(name, tm->mask) || - wild_match_per(name, tc->func_name)) + wild_match_per(name, tc->func_name)) { ok = 1; - } else + } + } else if (showpy && !(strncasecmp(tc->func_name, "*python:", strlen("*python:")))) { + ok = 1; + } else if (showtcl && (strncasecmp(tc->func_name, "*", strlen("*")))) { ok = 1; - - if (ok) { - dprintf(idx, " %*s %-8s %-20s %4d %s\n", maxname, tl->name, flg, - tm->mask, tc->hits, tc->func_name); - fnd = 1; } + } else if (proc[0] != '*') { + ok = 1; + } + if (ok) { + dprintf(idx, " %*s %-8s %-20s %4d %s\n", maxname, tl->name, flg, + tm->mask, tc->hits, tc->func_name); + fnd = 1; } } } diff --git a/src/tclhash.h b/src/tclhash.h index 669d3bd37..c7ebb50b3 100644 --- a/src/tclhash.h +++ b/src/tclhash.h @@ -79,7 +79,10 @@ tcl_bind_list_t *add_bind_table(const char *nme, int flg, IntFunc func); void del_bind_table(tcl_bind_list_t *tl_which); tcl_bind_list_t *find_bind_table(const char *nme); - +int bind_bind_entry(tcl_bind_list_t *tl, const char *flags, + const char *cmd, const char *proc); +int unbind_bind_entry(tcl_bind_list_t *tl, const char *flags, + const char *cmd, const char *proc); int check_tcl_bind(tcl_bind_list_t *, const char *, struct flag_record *, const char *, int); int check_tcl_dcc(const char *, int, const char *); From 383a1a695ecbbe37a5fd9ca4b61f3e56c8fe67ff Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 14 Jan 2024 16:07:59 -0500 Subject: [PATCH 17/20] Update docs --- README | 2 +- doc/AUTOSCRIPTS | 249 ++++++++ doc/FIRST-SCRIPT | 36 +- doc/USERS | 20 +- doc/core.settings | 8 +- doc/html/_static/basic.css | 22 + doc/html/_static/documentation_options.js | 3 +- doc/html/_static/pygments.css | 1 + doc/html/_static/searchtools.js | 26 +- doc/html/_static/sphinx_highlight.js | 16 +- doc/html/about/about.html | 24 +- doc/html/about/legal.html | 24 +- doc/html/index.html | 46 +- doc/html/install/install.html | 30 +- doc/html/install/readme.html | 54 +- doc/html/install/upgrading.html | 40 +- doc/html/modules/included.html | 73 ++- doc/html/modules/index.html | 34 +- doc/html/modules/internals.html | 40 +- doc/html/modules/mod/assoc.html | 25 +- doc/html/modules/mod/blowfish.html | 25 +- doc/html/modules/mod/channels.html | 86 ++- doc/html/modules/mod/compress.html | 25 +- doc/html/modules/mod/console.html | 25 +- doc/html/modules/mod/ctcp.html | 25 +- doc/html/modules/mod/dns.html | 25 +- doc/html/modules/mod/filesys.html | 75 +-- doc/html/modules/mod/ident.html | 25 +- doc/html/modules/mod/irc.html | 25 +- doc/html/modules/mod/notes.html | 25 +- doc/html/modules/mod/pbkdf2.html | 31 +- doc/html/modules/mod/python.html | 274 ++++++++ doc/html/modules/mod/seen.html | 31 +- doc/html/modules/mod/server.html | 25 +- doc/html/modules/mod/share.html | 25 +- doc/html/modules/mod/transfer.html | 33 +- doc/html/modules/mod/twitch.html | 31 +- doc/html/modules/mod/uptime.html | 25 +- doc/html/modules/mod/woobie.html | 25 +- doc/html/modules/writing.html | 40 +- doc/html/objects.inv | Bin 1395 -> 1556 bytes doc/html/search.html | 20 +- doc/html/searchindex.js | 2 +- doc/html/tutorials/firstscript.html | 32 +- doc/html/tutorials/firststeps.html | 48 +- doc/html/tutorials/module.html | 40 +- doc/html/tutorials/setup.html | 7 +- doc/html/tutorials/tlssetup.html | 38 +- doc/html/using/accounts.html | 44 +- doc/html/using/autoscripts.html | 177 +++--- doc/html/using/bans.html | 24 +- doc/html/using/botnet.html | 42 +- doc/html/using/core.html | 48 +- doc/html/using/features.html | 24 +- doc/html/using/ipv6.html | 34 +- doc/html/using/ircv3.html | 30 +- doc/html/using/partyline.html | 30 +- doc/html/using/patch.html | 26 +- doc/html/using/pbkdf2info.html | 38 +- doc/html/using/tcl-commands.html | 721 +++++++++------------- doc/html/using/text-sub.html | 28 +- doc/html/using/tls.html | 42 +- doc/html/using/tricks.html | 36 +- doc/html/using/twitch-tcl-commands.html | 46 +- doc/html/using/twitchinfo.html | 34 +- doc/html/using/users.html | 30 +- doc/modules/MODULES | 40 +- doc/modules/mod.channels | 125 ++-- doc/modules/mod.server | 4 +- doc/modules/mod.transfer | 10 +- doc/sphinx_source/docutils.conf | 2 + doc/sphinx_source/modules/included.rst | 4 + doc/sphinx_source/modules/mod/python.rst | 11 +- doc/sphinx_source/using/tcl-commands.rst | 2 + doc/tcl-commands.doc | 29 +- 75 files changed, 2033 insertions(+), 1509 deletions(-) create mode 100644 doc/AUTOSCRIPTS create mode 100644 doc/html/modules/mod/python.html create mode 100644 doc/sphinx_source/docutils.conf diff --git a/README b/README index 9696eee5d..2d74900ca 100644 --- a/README +++ b/README @@ -61,7 +61,7 @@ FTP The latest Eggdrop stable source code is always located at https://geteggdrop.com. You can also download the current stable, previous stable, and development snapshot via FTP at - ftp.eggheads.org/pub/Eggdrop/source + ftp://ftp.eggheads.org/pub/eggdrop/source Git Development Snapshot diff --git a/doc/AUTOSCRIPTS b/doc/AUTOSCRIPTS new file mode 100644 index 000000000..fb427f1d8 --- /dev/null +++ b/doc/AUTOSCRIPTS @@ -0,0 +1,249 @@ +Eggdrop Autoscripts + +Since it's inception, users have needed to load a Tcl script into +Eggdrop by downloading a Tcl file, editing the file to customize +settings, and then sourceing that file in the config file. In v1.10, the +Autoscripts system was added to make this process a little more +user-friendly. The autoscripts system helps by: + +- Centralizing commonly-used scripts in a single location +- Allowing scripts to be downloaded via the partyline +- Allowing script settings to be configured via the partyline +- Allowing user-written scripts to be managed by the autoscripts + system +- Providing a documented API to write autoscripts-compatible scripts + +AUTOSCRIPTS USAGE + +To view available autoscript commands, type .autoscript on the +partyline. This will open up a special Eggdrop console that doesn't +require you to prefix commands with a '.' . The following sub-commands +are available for use with script: + +remote + +This command will list scripts hosted on the Eggdrop website that are +available to be downloaded and installed on your Eggdrop. + +fetch - - + + + + + @@ -45,6 +44,7 @@

Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -99,7 +99,7 @@

    Search

    About Eggdrop Last revised: July 27, 2010

    -

    About Eggdrop

    +

    About Eggdrop

    Eggdrop was created around December 1993 to help stop the incessant wars on #gayteen. It spawned from another bot that was in the process of being @@ -174,9 +174,9 @@

    About Eggdrop

    diff --git a/doc/html/about/legal.html b/doc/html/about/legal.html index 118cf44cf..e1454e427 100644 --- a/doc/html/about/legal.html +++ b/doc/html/about/legal.html @@ -1,17 +1,16 @@ - - + - + Boring legal stuff — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -42,6 +41,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -94,7 +94,7 @@

    Search

    diff --git a/doc/html/index.html b/doc/html/index.html index 8237db1da..b0440a2b4 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -1,17 +1,16 @@ - - + - + Eggdrop, an open source IRC bot — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -42,6 +41,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -94,10 +94,10 @@

    Search

    -

    Eggdrop, an open source IRC bot

    +

    Eggdrop, an open source IRC bot

    Eggdrop is a free, open source software program built to assist in managing an IRC channel. It is the world’s oldest actively-maintained IRC bot and was designed to be easily used and expanded on via it’s ability to run Tcl scripts. Eggdrop can join IRC channels and perorm automated tasks such as protecting the channel from abuse, assisting users obtain their op/voice status, provide information and greetings, host games, etc.

    -

    Some things you can do with Eggdrop

    +

    Some things you can do with Eggdrop

    Eggdrop has a large number of features, such as:

    -

    How to install Eggdrop

    +

    How to install Eggdrop

    -

    Installation Pre-requisites

    +

    Installation Pre-requisites

    Eggdrop requires Tcl (and its development header files) to be present on the system it is compiled on. It is also strongly encouraged to install openssl (and its development header files) to enable TLS-protected network communication.

    -

    Installation

    +

    Installation

    A guide to quickly installing Eggdrop can be found here.

    -

    Where to find more help

    +

    Where to find more help

    The Eggheads development team can be found lurking on #eggdrop on the Libera network (irc.libera.chat).

    Installing Eggdrop

    @@ -175,6 +175,13 @@

    Where to find more help
  • The Party Line
  • +
  • Eggdrop Autoscripts +
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -403,4 +411,4 @@

    Where to find more help - + \ No newline at end of file diff --git a/doc/html/install/install.html b/doc/html/install/install.html index ced86fd5e..60a857582 100644 --- a/doc/html/install/install.html +++ b/doc/html/install/install.html @@ -1,17 +1,16 @@ - - + - + Installing Eggdrop — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -50,6 +49,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -102,14 +102,14 @@

    Search

    -

    Installing Eggdrop

    +

    Installing Eggdrop

    This is the quick install guide; if you have had little or no experience with UNIX or Eggdrop, READ THE README FILE NOW! This file is best for experienced users.

    For more information on compiling Eggdrop, see the Compile Guide in doc/COMPILE-GUIDE (and of course, the README FILE).

    -

    Quick Startup

    +

    Quick Startup

    Eggdrop uses the GNU autoconfigure scripts to make things easier.

    1. @@ -220,7 +220,7 @@

      Quick Startup -

      Cygwin Requirements (Windows)

      +

      Cygwin Requirements (Windows)

      Eggdrop requires the following packages to be added from the Cygwin installation tool prior to compiling:

      Interpreters: tcl, tcl-devel
      @@ -231,7 +231,7 @@ 

      Cygwin Requirements (Windows) -

      Modules

      +

      Modules

      Modules are small pieces of code that can either be compiled into the binary or can be compiled separately into a file. This allows for a much smaller binary.

      @@ -280,9 +280,9 @@

      Modules

      diff --git a/doc/html/install/readme.html b/doc/html/install/readme.html index b573d5f99..c36eb5238 100644 --- a/doc/html/install/readme.html +++ b/doc/html/install/readme.html @@ -1,27 +1,22 @@ - - + - + README — Eggdrop 1.9.5 documentation - - - - - - + + + + +
      +
    +
    +

    Channel Settings

    +

    There are two types of channel settings: value-based settings (where you configure a setting with a number or string), and enable/disable-based settings (where you turn a setting on or off). These settings can be configured via Tcl using the ‘channel set’ command:

    +
    +
    +
    channel set <chan> <setting>

    This command modifies a specific channel setting for a channel. There are many different options for channels which you can define. Some settings are enabled or disabled by a plus or minus in front of them, and others directly take text or integer values.

    -
    -

    Channel Settings

    -

    Value-based Channel Settings

    +

    Value-based Channel Settings

    +
    chanmode +/-<modes>

    This setting makes the bot enforce channel modes. It will always enforce +the +<modes> and remove the -<modes> modes.

    +
    idle-kick 0

    This setting will make the bot check every minute for idle users. Set this to 0 to disable idle check.

    @@ -171,10 +176,6 @@

    Value-based Channel Settings - - - -

    0

    turn off

    @@ -209,10 +210,6 @@

    Value-based Channel Settings - - - -

    0

    Deop the user.

    @@ -234,10 +231,6 @@

    Value-based Channel Settings - - - -

    0 *!user@host

    @@ -291,10 +284,6 @@

    Value-based Channel Settings - - - -

    aop-delay 0

    No delay is used.

    @@ -365,17 +354,12 @@

    Value-based Channel Settings -

    Enable/Disable Channel Settings

    +

    Enable/Disable Channel Settings

    +

    These settings should be preceded by a + or - to enable or disable the setting, respctively.

    -
    chanmode +/-<modes>

    This setting makes the bot enforce channel modes. It will always enforce -the +<modes> and remove the -<modes> modes.

    -
    -
    channel set <chan> +/-<setting>

    There are many different options for channels which you can define. -They can be enabled or disabled by a plus or minus in front of them.

    -
    enforcebans

    When a ban is set, kick people who are on the channel and match -the ban?

    +the ban

    dynamicbans

    Only activate bans on the channel when necessary? This keeps the channel’s ban list from getting excessively long. The bot still @@ -403,21 +387,21 @@

    Enable/Disable Channel Settings -

    Default Channel Values

    +

    Default Channel Values

    The following settings are used as default values when you .+chan #chan or .tcl @@ -550,9 +534,9 @@

    Default Channel Values

    diff --git a/doc/html/modules/mod/compress.html b/doc/html/modules/mod/compress.html index 59c3e79ae..88924232b 100644 --- a/doc/html/modules/mod/compress.html +++ b/doc/html/modules/mod/compress.html @@ -1,17 +1,16 @@ - - + - + Compress Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: May 27, 2004

    -

    Compress Module

    +

    Compress Module

    This module provides support for file compression. It can be used to compress files via Tcl or to transfer the userfile compressed during the share process, saving bandwidth.

    @@ -169,9 +170,9 @@

    Search

    diff --git a/doc/html/modules/mod/console.html b/doc/html/modules/mod/console.html index e7c98a632..f9d6a99ce 100644 --- a/doc/html/modules/mod/console.html +++ b/doc/html/modules/mod/console.html @@ -1,17 +1,16 @@ - - + - + Console Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: January 1, 2002

    -

    Console Module

    +

    Console Module

    This module provides storage of console settings when you exit the bot or type .store on the partyline.

    This module requires: none

    @@ -171,9 +172,9 @@

    Search

    diff --git a/doc/html/modules/mod/ctcp.html b/doc/html/modules/mod/ctcp.html index 577039b4d..49be32ecb 100644 --- a/doc/html/modules/mod/ctcp.html +++ b/doc/html/modules/mod/ctcp.html @@ -1,17 +1,16 @@ - - + - + CTCP Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: February 12, 2002

    -

    CTCP Module

    +

    CTCP Module

    This module provides the normal ctcp replies that you would expect. Without it loaded, CTCP CHAT will not work.

    This module requires: server

    @@ -183,9 +184,9 @@

    Search

    diff --git a/doc/html/modules/mod/dns.html b/doc/html/modules/mod/dns.html index 158605606..17d42f77b 100644 --- a/doc/html/modules/mod/dns.html +++ b/doc/html/modules/mod/dns.html @@ -1,17 +1,16 @@ - - + - + DNS Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: September 26, 2010

    -

    DNS Module

    +

    DNS Module

    This module provides asynchronous dns support. This will avoid long periods where the bot just hangs there, waiting for a hostname to resolve, which will often let it timeout on all other connections.

    @@ -184,9 +185,9 @@

    Search

    diff --git a/doc/html/modules/mod/filesys.html b/doc/html/modules/mod/filesys.html index b1e78eb08..397a41817 100644 --- a/doc/html/modules/mod/filesys.html +++ b/doc/html/modules/mod/filesys.html @@ -1,17 +1,16 @@ - - + - + Filesys Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,12 +120,12 @@

    Search

    Last revised: Dec 30, 2017

    -

    Filesys Module

    +

    Filesys Module

    This module provides an area within the bot where users can store and manage files. With this module, the bot is usable as a file server.

    This module requires: transfer

    -

    Config file setup

    +

    Config file setup

    Put this line into your Eggdrop configuration file to load the filesys module:

    loadmodule filesys
    @@ -159,9 +160,9 @@ 

    Config file setup -

    Partyline usage

    +

    Partyline usage

    -

    .files

    +

    .files

    Moves you into the file transfer sub-system, if it has been enabled on this bot. From there you can browse through the files online and use dcc file @@ -169,27 +170,27 @@

    .files

    -

    .cancel <file> [file] …

    +

    .cancel <file> [file] …

    Tells the bot to stop sending a file that is pending (either queued, waiting, or in the process of being transferred).

    -

    .cd <directory>

    +

    .cd <directory>

    Changes your current directory if possible. this works exactly like the unix command.

    -

    .cp <source> <dst>

    +

    .cp <source> <dst>

    Copies a file or group of files from one place to another.

    -

    .desc <file> <description>

    +

    .desc <file> <description>

    Changes the description for a file. if you are a master or file janitor, you can change the description for any file. @@ -201,20 +202,20 @@

    .desc <file> <description> -

    .filestats <user> [clear]

    +

    .filestats <user> [clear]

    Reports on the users upload & download statistics. Optional argument ‘clear’ clears a users upload and download statistics.

    -

    .stats

    +

    .stats

    Clears a users upload & download statistics.

    -

    .get <filename> [nickname]

    +

    .get <filename> [nickname]

    Sends you the file(s) requested, over IRC. you should get a DCC SEND notice on IRC, and have your client accept it. if @@ -231,14 +232,14 @@

    .get <filename> [nickname] -

    .hide <file> [files] …

    +

    .hide <file> [files] …

    Marks a file as hidden, so that normal users can’t see it. Only a master or file janitor using %b’lsa’%b can see hidden files.

    -

    .ln <bot:filepath> <localfile>

    +

    .ln <bot:filepath> <localfile>

    Creates a link to a file on another bot. The filepath has to be complete, like ‘/gifs/uglyman.gif’. If the bot is not @@ -249,7 +250,7 @@

    .ln <bot:filepath> <localfile> -

    .ls [filemask]

    +

    .ls [filemask]

    Displays the files in the current directory. Subdirectories are shown with “<DIR>” next to them, and other files will display @@ -260,7 +261,7 @@

    .ls [filemask] -

    .mkdir <dir> [flags [channel]]

    +

    .mkdir <dir> [flags [channel]]

    Creates a subdirectory from this one, with the given name. If flags are specified, then those flags are required to enter or @@ -270,14 +271,14 @@

    .mkdir <dir> [flags [channel]] -

    .mv <source> <dest>

    +

    .mv <source> <dest>

    Moves a file or group of files from one place to another (it can also be used to rename files).

    -

    .pending

    +

    .pending

    Gives you a listing of every file you’ve requested which is still waiting, queued, or in the process of transferring. @@ -287,31 +288,31 @@

    .pending -

    .pwd

    +

    .pwd

    Tells you what your current directory is.

    -

    .quit

    +

    .quit

    Exits the file system.

    -

    rm <file> [files] …

    +

    rm <file> [files] …

    Erase a file for good.

    -

    .rmdir <dir>

    +

    .rmdir <dir>

    Removes an existing directory, if there are no files in it.

    -

    .share <file> [files] …

    +

    .share <file> [files] …

    Marks a file as shared. This means that other bots can get the file remotely for users on their file systems. By default, @@ -319,7 +320,7 @@

    .share <file> [files] … -

    .optimize

    +

    .optimize

    Cleans up the current directory’s database. If you have a large directory with many files you may want to use this command if @@ -328,19 +329,19 @@

    .optimize -

    .unhide

    +

    .unhide

    Makes a file be not hidden any more.

    -

    .unshare <file> [file] …

    +

    .unshare <file> [file] …

    Removes the shared tag from a file.

    -

    .filesys module

    +

    .filesys module

    This module provides an area within the bot where users can store and manage files. With this module, the bot is usable as a file server.

    @@ -381,9 +382,9 @@

    .filesys module

    diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index 854645660..80ee7add4 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -1,17 +1,16 @@ - - + - + Ident Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: June 27, 2019

    -

    Ident Module

    +

    Ident Module

    This module adds Eggdrop support for the externally-provided oident service, or alternatively the ability for Eggdrop to act as its own ident daemon.

    @@ -222,9 +223,9 @@

    Search

    diff --git a/doc/html/modules/mod/irc.html b/doc/html/modules/mod/irc.html index 7900995d7..88cf758c3 100644 --- a/doc/html/modules/mod/irc.html +++ b/doc/html/modules/mod/irc.html @@ -1,17 +1,16 @@ - - + - + IRC Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: August 21, 2004

    -

    IRC Module

    +

    IRC Module

    This module controls the bots interaction on IRC. It allows the bot to join channels, etc. You have to load this if you want your bot to come on irc.

    @@ -292,9 +293,9 @@

    Search

    diff --git a/doc/html/modules/mod/notes.html b/doc/html/modules/mod/notes.html index 55227968f..efe43cd39 100644 --- a/doc/html/modules/mod/notes.html +++ b/doc/html/modules/mod/notes.html @@ -1,17 +1,16 @@ - - + - + Notes Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: January 1, 2002

    -

    Notes Module

    +

    Notes Module

    This module provides support for storing of notes for users from each other. Note sending between currently online users is supported in the core, this is only for storing the notes for later retrieval.

    @@ -179,9 +180,9 @@

    Search

    diff --git a/doc/html/modules/mod/pbkdf2.html b/doc/html/modules/mod/pbkdf2.html index 7ca50bc9d..4e7b21bb7 100644 --- a/doc/html/modules/mod/pbkdf2.html +++ b/doc/html/modules/mod/pbkdf2.html @@ -1,19 +1,18 @@ - - + - + PBKDF2 Module — Eggdrop 1.9.5 documentation - - - - - + + + + + - + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: October 28, 2020

    -

    PBKDF2 Module

    +

    PBKDF2 Module

    Eggdrop encrypts its userfile, so users can have secure passwords. Eggdrop will not start without an encryption module.

    @@ -168,7 +169,7 @@

    Search

    @@ -178,9 +179,9 @@

    Search

    diff --git a/doc/html/modules/mod/python.html b/doc/html/modules/mod/python.html new file mode 100644 index 000000000..7ed056faa --- /dev/null +++ b/doc/html/modules/mod/python.html @@ -0,0 +1,274 @@ + + + + + + + + Python Module — Eggdrop 1.9.5 documentation + + + + + + + + + + + +
    +
    + +
    + +
    +
    +
    + +

    Last revised: November 03, 2023

    +
    +

    Python Module

    +

    This module adds a Python interpreter to Eggdrop, allowing you to run Python scripts.

    +
    +

    Loading Python

    +

    Put this line into your Eggdrop configuration file to load the python module:

    +
    loadmodule python
    +
    +
    +

    To load a python script from your config file, place the .py file in the scripts/ folder and add the following line to your config:

    +
    pysource scripts/myscript.py
    +
    +
    +
    +
    +

    Partyline Commands

    +
    +

    python <expression>

    +

    You can run a python command from the partyline with the .python command, such as:

    +
    .python 1 + 1
    +Python: 2
    +.python from eggdrop.tcl import putmsg; putmsg('#chan', 'Hello world!')
    +Python: None
    +
    +
    +
    +
    +

    .binds python

    +

    The python module extends the core .binds partyline command by adding a python mask. This command will list all binds for python scripts.

    +
    +
    +
    +

    Tcl Commands

    +
    +

    pysource <path/to/file>

    +

    The pysource command is analgous to the Tcl source command, except that it loads a Python script into Eggdrop instead of a Tcl script.

    +
    +
    +
    +

    Eggdrop Python Commands

    +

    The Python module is built to use the existing core Tcl commands integrated into Eggdrop via the eggdrop.tcl module. To call an existing Tcl command from Python, you can either load the entire catalog by running import eggdrop.tcl, or be more specific by from eggdrop.tcl import putserv, putlog, chanlist, etc.

    +

    Arguments to the Tcl functions are automatically converted as follows:

    +
      +
    • None is converted to an empty Tcl object (the empty string, "")

    • +
    • List and Tuple is converted to a Tcl list

    • +
    • Dict is converted to a Tcl dictionary

    • +
    • Everything else is converted to a string using the str() method

    • +
    +

    Return values from Tcl functions must be manually converted:

    +
      +
    • "" the empty string is automatically converted to None

    • +
    • everything else is returned as string

    • +
    • Tcl list as string can be converted to a Python List using parse_tcl_list

    • +
    • Tcl dictionary as string can be converted to a Python Dict using parse_tcl_list

    • +
    +

    Additionally, a few extra python commands have been created for use without these conversions:

    +
    +

    bind <arguments>

    +

    The python version of the bind command is used to create a bind that triggers a python function. The python bind takes the same arguments as the Tcl binds, but here each argument is passed individually. For example, a bind that would look like bind pub * !foo myproc in Tcl is written as bind("pub", "*", "!foo", myproc). For more information on Eggsrop bind argument syntax please see Bind Types. The eggdrop.tcl.bind command should not be used as it will attempt to call a Tcl proc.

    +
    +
    +

    parse_tcl_list <string>

    +

    When a python script calls a Tcl command that returns a list via the eggdrop.tcl module, the return value will be a Tcl-formatted list- also simply known as a string. The parse_tcl_list command will convert the Tcl-formatted list into a Python list, which can then freely be used within the Python script.

    +
    +
    +

    parse_tcl_dict <string>

    +

    When a python script calls a Tcl command that returns a dict via the eggdrop.tcl module, the return value will be a Tcl-formatted dict- also simply known as a string. The parse_tcl_dict command will c +onvert the Tcl-formatted dict into a Python list, which can then freely be used within the Python script.

    +
    +
    +
    +

    Config variables

    +

    There are also some variables you can set in your config file:

    +
    +
    +
    set allow-resync 0

    When two bots get disconnected, this setting allows them to create a +resync buffer which saves all changes done to the userfile during +the disconnect. When they reconnect, they will not have to transfer +the complete user file, but, instead, just send the resync buffer.

    +
    +
    +
    +
    +
    +

    Writing an Eggdrop Python script

    +

    This is how to write a python script for Eggdrop.

    +

    You can view examples of Python scripts in the exampleScripts folder included with this module.

    +
    +
    bestfriend.py

    This example script demonstrates how to use the parse_tcl_list() python command to convert a list returned by a Tcl command into a list that is usable by Python.

    +
    +
    greet.py

    This is a very basic script that demonstrates how a Python script with binds can be run by Eggdrop.

    +
    +
    imdb.py

    This script shows how to use an existing third-party module to extend a Python script, in this case retrieving information from imdb.com.

    +
    +
    listtls.py

    This script demonstrates how to use parse-tcl_list() and parse_tcl_dict() to convert a list of dicts provided by Tcl into something that is usuable by Python.

    +
    +
    urltitle.py

    This script shows how to use an existing third-party module to extend a Python script, in this case using an http parser to collect title information from a provided web page.

    +
    +
    +
    +

    Header section

    +

    An Eggdrop python script requires you to import X Y and Z, in this format.

    +
    +
    +

    Code Section

    +

    Normal python code works here. To run a command from the Eggdrop Tcl library, use this format.

    +

    Use this format all over.

    +
    +
    +
    +

    Writing a module for use with Eggdrop

    +

    This is how you import a module for use with an egg python script.

    +

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/doc/html/modules/mod/seen.html b/doc/html/modules/mod/seen.html index da92f2fa2..b2ccae2aa 100644 --- a/doc/html/modules/mod/seen.html +++ b/doc/html/modules/mod/seen.html @@ -1,27 +1,26 @@ - - + - + Seen Module — Eggdrop 1.9.5 documentation - - - - - + + + + + - +
    -
    set copy-to-tmp 1

    Enable this setting if you want to copy files to a temporary location -before sending or receiving them. This might be useful for file -stability, but if your directories are NFS mounted, it’s a pain. -Setting this to 1 is not advised for big files or if you’re low on -disk space.

    -
    set xfer-timeout 30

    Set here the time (in seconds) to wait before an inactive transfer times out.

    @@ -183,9 +178,9 @@

    Search

    diff --git a/doc/html/modules/mod/twitch.html b/doc/html/modules/mod/twitch.html index c28643a25..216560543 100644 --- a/doc/html/modules/mod/twitch.html +++ b/doc/html/modules/mod/twitch.html @@ -1,17 +1,16 @@ - - + - + Twitch Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: April 20, 2020

    -

    Twitch Module

    +

    Twitch Module

    This module attempts to provide connectivity with the Twitch gaming platform. While Twitch provides an IRC gateway to connect with it’s streaming service, it does not claim to (and certainly does not) follow the IRC RFC in any meaningful way. The intent of this module is not to provide the full spectrum of management functions typically associated with Eggdrop; instead it focuses around the following key functions:

    • Logging of general and Twitch-specific events (raids, blocks, bit donations)

    • @@ -133,7 +134,7 @@

      Search

    and set net-type “Twitch” in your config file.

    -

    Limitations

    +

    Limitations

    There are a few things you should know about how Twitch provides service through the IRC gateway that affects how well Eggdrop can function: * Twitch does not broadcast JOINs or PARTs for channels over 1,000 users. This renders tracking users on a channel unreliable. * Twitch does not broadcast MODE changes for moderator status. This (mostly) renders tracking the status of users infeasible. (See Tcl below section for workaround) @@ -142,7 +143,7 @@

    Limitations -

    Tcl API

    +

    Tcl API

    That last section was a little bit of a downer, but don’t worry, we added a TON of functionality to the Tcl API. This module adds binds for the following Twitch events:

    diff --git a/doc/html/modules/mod/uptime.html b/doc/html/modules/mod/uptime.html index 971d5676d..b93153160 100644 --- a/doc/html/modules/mod/uptime.html +++ b/doc/html/modules/mod/uptime.html @@ -1,17 +1,16 @@ - - + - + Uptime Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: January 1, 2002

    -

    Uptime Module

    +

    Uptime Module

    This module reports uptime statistics to http://uptime.eggheads.org. Go look and see what your uptime is! It takes about 9 hours to show up, so if your bot isn’t listed, try again later.

    @@ -164,9 +165,9 @@

    Search

    diff --git a/doc/html/modules/mod/woobie.html b/doc/html/modules/mod/woobie.html index 53d098b1a..45607c452 100644 --- a/doc/html/modules/mod/woobie.html +++ b/doc/html/modules/mod/woobie.html @@ -1,17 +1,16 @@ - - + - + Woobie Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -84,6 +84,7 @@

    Table of Contents

  • IRC Module
  • Notes Module
  • PBKDF2 Module
  • +
  • Python Module
  • Seen Module
  • Server Module
  • Share Module
  • @@ -119,7 +120,7 @@

    Search

    Last revised: December 31, 2001

    -

    Woobie Module

    +

    Woobie Module

    This is for demonstrative purposes only. If you are looking for starting point in writing modules, woobie is the right thing.

    This module requires: none

    @@ -157,9 +158,9 @@

    Search

    diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index 7789198fa..61a994db3 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -1,17 +1,16 @@ - - + - + How to Write an Eggdrop Module — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -101,7 +101,7 @@

    Search

    -

    How to Write an Eggdrop Module

    +

    How to Write an Eggdrop Module

    Note: This is for a simple module of 1 source file.

      @@ -143,7 +143,7 @@

      Search

    -

    Module requirements

    +

    Module requirements

    In most modules, all functions/variables (except global and MODULE_start) should be static. This will drastically reduce the size of modules on decent systems.

    @@ -152,7 +152,7 @@

    Module requirements -

    MODULE_start

    +

    MODULE_start

    char *MODULE_start(Function *func_table)
     
     This function is called when the module is first loaded. There are
    @@ -189,7 +189,7 @@ 

    MODULE_start -

    MODULE_table

    +

    MODULE_table

    static Function *MODULE_table = {
            MODULE_start,
            MODULE_close,
    @@ -206,7 +206,7 @@ 

    MODULE_table -

    MODULE_close ()

    +

    MODULE_close ()

    static char *MODULE_close ()
     
     This is called when the module is unloaded. Apart from tidying any
    @@ -226,7 +226,7 @@ 

    MODULE_close () -

    MODULE_expmem

    +

    MODULE_expmem

    static int MODULE_expmem ()
     
     This should tally all memory you allocate/deallocate within the module
    @@ -236,7 +236,7 @@ 

    MODULE_expmem -

    MODULE_report

    +

    MODULE_report

    static void MODULE_report (int idx)
     
     This should provide a relatively short report of the module's status
    @@ -247,7 +247,7 @@ 

    MODULE_report -

    Additional functions

    +

    Additional functions

    void *nmalloc(int j);
     
     This allocates j bytes of memory.
    @@ -387,7 +387,7 @@ 

    Additional functions

    -

    What to do with a module?

    +

    What to do with a module?

    If you have written a module and feel that you wish to share it with the rest of the Eggdrop community, find us in #eggdrop on Libera. Make sure you @@ -423,9 +423,9 @@

    What to do with a module?

    diff --git a/doc/html/objects.inv b/doc/html/objects.inv index e31c384a3c6e9a8b95a981749c05e3ee6c600b15..f7c8aaf3d6de66398df425ff8a70e5e7ad0b4451 100644 GIT binary patch delta 1452 zcmV;d1ylO-3X}|xdViHzO>f&c5WV|X5NM8djqL(^SOf*~i3ZygLG7Z4q6jF8wuwlj zKvHr1?|1kmk`m=4mqzBB_e4^hH^bse^m>KOzewr&-&zo~{0reY{AsV-23^>Qo87LK zqFXq)p*!46S$5d5E`?-#heBY#-7c_F5Nt>du4rRut*HBks(%&yU0K+YKb)Zp8+&iz zMMag~N=AA8sXJN$O=UagcSpS!+zA+bd4`sYit+kUA3Lh@7xxNgx6-6p64ADp*UAx1 z{L;l=!Xw(4$3@kM!8r2}O55u23a3aFxbQv+{p)l?)2IVt<&t4e1`@B!9(qOG^q4aRNVXF0Suy22$Vc zB(9BIfj5AT`g4dKy&8rdsT;~Sy|jc6k+ck?(yHVM9|Care6W%J<26ia4cYnL@7H1t znXR>aoBy1lNH_-vs2lnPoo^ewQ(w?;?-73%@Vdeo?~cm=xJ`9)_oqEfm2uMaHLcT+ zGR9K6LVp9}!1R9D#K;+)& zn!M1I9DPnBbNq?lmz;f0DRcgb@0T2YRw=Cj6aOz*{k%}D1mij|cKun6P!Y0vFtYzS za;OYxT_}`*IeJ^ke5P`qZ_uD%BTE{4EN9QM z1-*ieD+p+bx!TT8Bj8SE6QWB>;E`n3G#u(xTx3C`?=)*?*W=JoHEm=;;~+%EW;Gn@ zG=F}%$dSfDGCiu?BgnD8iUZOD{em%S`jFh|7x9o6Yi&H{Q2DZho*eEXGdbQs%@26j z>za_a7F-{F&gvH^wVJ+YsI*Io4}TU(L4BptX4&BjZjxK&B_#dA*(kph#gdHf8*VJ* zg2f;3&cxCaZy7QW-jU{Dl6Nz_A@eLV&40a^Z)NI`afX@Z9PIz2xnjNXHfBa#_$_om z=pL&lwa9X{`2H+gVG84X)xCz>DRc}_C#2GfNY-Ulpcvq@#pgwG)YlfCsA}4&Q=$eR z3Uv#g{?-hmwHZ&u+``I24jWAjU1G(^I1wXBQQdcCJqv{crmfu1ZfN*o95liwRDS~M zdo_+L+k9`ntwELaFwY|rJjzDLEPu`DndVz&u9-Mxk(+oWaC5ipWuuvf?R#%a?@lWw zMD$!|pEyT+gXw-DIF#hc>;sES_wlfE?ueDdBAEBS7ZLC}73Kv2GwOR(c=`z5^bA(5 z%%!nLH!rkJ1cc^P7bNU>_V&-MTp2taU9L(e`VtQDGL+WQmlJP z3#$l7u5s%}J)L#W|4gZ7)Hh-e2JgF0NF6AWJpWzbnBk#&GZ7i9!%`pNP!|?DK)%TD zDVQ`2nO&j-ebgc(!@iuD$MnYPBW%%QaC<7S2Q1_rk;l$lu~uKP+Q$!++JEd+W@5s_ zW^agdDuVeB5leeNPwb)87N%l{eVb<^Os<(as1^s- z)C9}7meDh)oMzH+wFDCaA0-2Y*d7**GieZkp0|j;|9ea-(?lcf5kL4JOHX*EW&9ub GVIB!j!OfNc delta 1290 zcmV+l1@-!r4D$+*dVh^qO>f&c5WV|X5J->p8tnpmSQG{Fi3ZygL7k$9Vo}f(Z3~e} zfu!R2-|z67lt#{85^LVPCz2XI4(Ub?W<~8^qD}L6BNn*qcK~E?vg$Zr3Q; zFFf4w9qpzp7xt_xsamlkF>%;#7gTFVwxo`3cxPz`*$f@mD}VUEas#k=2MZBL*;XZoaJ}W!nONIztNyk$M;M1AWIuD;oY<^JCN($G!cz zXd5of{A(N>Uw?A%a>FaKeyF}eI@IZVLIsgM7evcJF;4EkUz3eAz}1F!-75UARVpYB z)jil+j$0t+DNdUM#}qu`1-{>2-aOnU($Mb|ZLA!^OQ5IzNV%g|L+Cg6p?dwWDO_aI zGLo=asWW>M!1N_xA;Wh#Py^e>7*!Jo4Z17Cx+QFh1Ai4wDwRz51lz0W_-FEI+tHo= zOn!w8`0oPVhZInMT1LPxjvqrPr8w4Bux@C0Q!efpE9sgf#<4Z~v>2H)s#vs%^A3QOqvqG%7otm?>tPb4r!1PD~ZE z&sn9?UVkU%iumZfP`25z$&M{`RwLSNWws-4og+uvEln5k*ExD=zhm>A_~)ERHrLu( zN1J|@9{iwkg8~=Q@YxAC(9^%UJVc=1JU82qa|#~y5|3B^+}wS{G&HyNk1JTr^Vc>D zWvdsi=J^(l3N91V*i$uIhYk!1E)NkfiVD4*AAd%~z06b0#+1O{*zAV)Xi)K)h{n*H z_AomikH(YBWg;3!DL3t`hDW`|PoFu`II7l+PR|kK*qRgT+fm#=5afZEdxILcCUW)pR)0`?c>VbVMmZ8HR>5eZ_>7!#z#SbGa z%YVNp`59g+ddDowK9@R9O~r1RWw}=+j&iFa2l}|o&0yfN0f!`5qtZq*)%KO~p$VbL zLOB%`vUc!9)$m@Q6Sa6cn-1{t?rfN>ZM+ck6T^i(HX0bYqPk_{`pqQG&Cug|4vNKL zoZOE-^*A}tboz`+L_>Qb=*IPpPhZ!d%6|qJ=ZQ#>WwX)XUo%^c{g##46b6HG3yT46 zZ8E;=q>RZynCeT_NNA1x6M@=d&vrU(o`KKbP=Tn}Xy}UI*L&ESFJLg*UN;(Y`^pc! z(NRDe!3`qe;_;U3a_oliRoIZPt*`?MB23l?NRHOs;Z8RMHj}{;LUMdqQioN`aaBMjB3pS%-^;DS?)D$w&1cjq%&%xgyWLJqN z`siRQ!of}L&+@JlGMrVn(61xxgvGLF>eSn&e)Wawef~h@HD@X_xdf%feq!DzEE1*o zt6Az{gUAFVtO7jQCXlR$jW#XpRDT#&66vsE#0K1M+IsPgYS}YJaq+NOninb<+>xHz zKE20n+~ph7pC*k~!Eb+TF&u(_oQ#znOCSz#N+CmW;n1A847=Cv?A>#5Y`cb0)#(3w zjeT$x2bUQz54fL!LT+kM-zwS~px2E}=vsak2g5|8>})Q=!!i)wXmtJqGz0J_aV39w AqW}N^ diff --git a/doc/html/search.html b/doc/html/search.html index 8eb843f1b..537f62159 100644 --- a/doc/html/search.html +++ b/doc/html/search.html @@ -1,17 +1,16 @@ - - + Search — Eggdrop 1.9.5 documentation - - + + - - - + + + @@ -44,6 +43,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -147,9 +147,9 @@

    Search

    diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js index c047bfa80..40c05d72c 100644 --- a/doc/html/searchindex.js +++ b/doc/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["about/about", "about/legal", "index", "install/install", "install/readme", "install/upgrading", "modules/included", "modules/index", "modules/internals", "modules/mod/assoc", "modules/mod/blowfish", "modules/mod/channels", "modules/mod/compress", "modules/mod/console", "modules/mod/ctcp", "modules/mod/dns", "modules/mod/filesys", "modules/mod/ident", "modules/mod/irc", "modules/mod/notes", "modules/mod/pbkdf2", "modules/mod/seen", "modules/mod/server", "modules/mod/share", "modules/mod/transfer", "modules/mod/twitch", "modules/mod/uptime", "modules/mod/woobie", "modules/writing", "tutorials/firstscript", "tutorials/firststeps", "tutorials/module", "tutorials/setup", "tutorials/tlssetup", "using/accounts", "using/bans", "using/botnet", "using/core", "using/features", "using/ipv6", "using/ircv3", "using/partyline", "using/patch", "using/pbkdf2info", "using/tcl-commands", "using/text-sub", "using/tls", "using/tricks", "using/twitch-tcl-commands", "using/twitchinfo", "using/users"], "filenames": ["about/about.rst", "about/legal.rst", "index.rst", "install/install.rst", "install/readme.rst", "install/upgrading.rst", "modules/included.rst", "modules/index.rst", "modules/internals.rst", "modules/mod/assoc.rst", "modules/mod/blowfish.rst", "modules/mod/channels.rst", "modules/mod/compress.rst", "modules/mod/console.rst", "modules/mod/ctcp.rst", "modules/mod/dns.rst", "modules/mod/filesys.rst", "modules/mod/ident.rst", "modules/mod/irc.rst", "modules/mod/notes.rst", "modules/mod/pbkdf2.rst", "modules/mod/seen.rst", "modules/mod/server.rst", "modules/mod/share.rst", "modules/mod/transfer.rst", "modules/mod/twitch.rst", "modules/mod/uptime.rst", "modules/mod/woobie.rst", "modules/writing.rst", "tutorials/firstscript.rst", "tutorials/firststeps.rst", "tutorials/module.rst", "tutorials/setup.rst", "tutorials/tlssetup.rst", "using/accounts.rst", "using/bans.rst", "using/botnet.rst", "using/core.rst", "using/features.rst", "using/ipv6.rst", "using/ircv3.rst", "using/partyline.rst", "using/patch.rst", "using/pbkdf2info.rst", "using/tcl-commands.rst", "using/text-sub.rst", "using/tls.rst", "using/tricks.rst", "using/twitch-tcl-commands.rst", "using/twitchinfo.rst", "using/users.rst"], "titles": ["About Eggdrop", "Boring legal stuff", "Eggdrop, an open source IRC bot", "Installing Eggdrop", "README", "Upgrading Eggdrop", "Modules included with Eggdrop", "Eggdrop Module Information", "Eggdrop Bind Internals", "Assoc Module", "Blowfish Module", "Channels Module", "Compress Module", "Console Module", "CTCP Module", "DNS Module", "Filesys Module", "Ident Module", "IRC Module", "Notes Module", "PBKDF2 Module", "Seen Module", "Server Module", "Share Module", "Transfer Module", "Twitch Module", "Uptime Module", "Woobie Module", "How to Write an Eggdrop Module", "Writing an Eggdrop Script", "Common First Steps", "Writing a Basic Eggdrop Module", "Setting Up Eggdrop", "Enabling TLS Security on Eggdrop", "Account tracking in Eggdrop", "Bans, Invites, and Exempts", "Botnet Sharing and Linking", "Eggdrop Core Settings", "Eggdrop Features", "IPv6 support", "IRCv3 support", "The Party Line", "Patching Eggdrop", "Encryption/Hashing", "Eggdrop Tcl Commands", "Textfile Substitutions", "TLS support", "Advanced Tips", "Eggdrop Twitch Tcl Commands", "Twitch", "Users and Flags"], "terms": {"last": [0, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 35, 37, 39, 40, 41, 44, 45, 46, 47, 48, 50], "revis": [0, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 35, 37, 39, 40, 41, 44, 45, 46, 47, 48, 50], "juli": 0, "27": [0, 12, 17, 23, 40], "2010": [0, 11, 15, 22, 37, 39, 40, 45, 46], "wa": [0, 2, 8, 20, 25, 29, 31, 32, 36, 40, 43, 44, 46, 48, 49], "creat": [0, 3, 4, 8, 16, 17, 23, 28, 29, 30, 31, 32, 35, 37, 42, 43, 44, 46, 47, 49], "around": [0, 4, 25, 33, 39, 44, 49], "decemb": [0, 27, 38, 41], "1993": [0, 38], "help": [0, 3, 8, 14, 22, 28, 29, 30, 31, 32, 35, 36, 37, 39, 41, 44, 45, 50], "stop": [0, 11, 16, 18, 28, 30, 44, 48], "incess": 0, "war": 0, "gayteen": 0, "It": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 16, 18, 22, 26, 28, 30, 32, 34, 36, 37, 38, 39, 41, 44, 48, 49], "spawn": 0, "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 16, 17, 18, 19, 20, 22, 23, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 41, 43, 45, 46, 47, 48, 49, 50], "anoth": [0, 8, 11, 16, 18, 19, 22, 23, 28, 32, 36, 37, 44, 45, 48], "bot": [0, 1, 3, 4, 5, 6, 7, 8, 11, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 30, 32, 33, 35, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 50], "process": [0, 3, 4, 5, 12, 16, 17, 24, 30, 32, 36, 43, 44, 46], "being": [0, 4, 11, 16, 18, 22, 33, 34, 38, 39, 44, 48], "written": [0, 28, 31, 32, 44, 49], "time": [0, 3, 4, 11, 15, 16, 17, 18, 20, 23, 24, 29, 30, 32, 33, 34, 35, 36, 37, 38, 40, 41, 43, 45, 46, 47, 49], "call": [0, 3, 4, 8, 28, 29, 30, 36, 37, 44, 48], "unrest": 0, "The": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 14, 15, 16, 17, 20, 22, 23, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 40, 43, 44, 46, 47, 48, 49, 50], "purpos": [0, 1, 6, 8, 26, 27, 31, 36, 37, 44], "answer": [0, 7, 14, 17, 22, 29], "request": [0, 4, 5, 7, 11, 14, 16, 18, 22, 32, 34, 35, 37, 39, 40, 42, 44, 46, 47, 49], "other": [0, 1, 4, 6, 8, 10, 11, 15, 16, 17, 18, 19, 20, 22, 23, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50], "first": [0, 2, 4, 5, 8, 16, 20, 22, 28, 29, 31, 32, 33, 36, 37, 43, 44, 46, 47, 48], "public": [0, 1, 4, 29, 30, 31, 33, 37, 44, 46, 47, 50], "releas": [0, 1, 32, 43, 44], "version": [0, 1, 2, 3, 4, 5, 8, 14, 18, 26, 28, 29, 31, 39, 40, 45, 46, 48], "0": [0, 4, 8, 11, 13, 14, 16, 17, 18, 19, 20, 22, 23, 24, 28, 29, 30, 31, 32, 36, 37, 39, 40, 41, 43, 44, 46, 47, 48], "6": [0, 5, 8, 11, 18, 30, 32, 37, 39, 44], "sinc": [0, 3, 5, 18, 32, 36, 37, 38, 39, 44, 46, 47], "ha": [0, 1, 2, 4, 5, 8, 11, 15, 16, 18, 22, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 44, 46, 48, 49, 50], "grown": 0, "what": [0, 1, 2, 5, 6, 8, 11, 16, 18, 22, 26, 29, 30, 31, 32, 37, 40, 41, 43, 44], "you": [0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "have": [0, 1, 3, 4, 5, 6, 8, 10, 11, 13, 16, 18, 19, 20, 22, 23, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 48, 49, 50], "befor": [0, 4, 8, 11, 15, 17, 18, 19, 22, 23, 24, 28, 30, 31, 32, 34, 36, 37, 44, 49], "i": [0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "world": [0, 2, 4, 33, 37], "": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 13, 16, 17, 18, 21, 22, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 43, 45, 46, 47, 48, 49, 50], "most": [0, 2, 4, 5, 17, 18, 22, 28, 29, 30, 32, 33, 37, 38, 41, 44, 48, 49], "popular": [0, 4, 5, 32, 37], "internet": [0, 4, 44, 46], "relai": [0, 4, 36, 37], "chat": [0, 2, 4, 6, 8, 14, 22, 30, 32, 36, 37, 38, 41, 44, 46, 48, 49], "irc": [0, 4, 6, 8, 16, 17, 22, 25, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 48, 50], "freeli": [0, 4], "distribut": [0, 1, 4, 31, 32], "under": [0, 4, 31, 32, 38, 44], "gnu": [0, 1, 3, 4, 8, 12, 31], "gener": [0, 1, 3, 4, 8, 20, 25, 29, 30, 31, 32, 40, 43, 44, 46, 49], "licens": [0, 1, 4, 31], "gpl": [0, 4, 31], "featur": [0, 2, 4, 7, 11, 18, 22, 23, 30, 32, 34, 37, 39, 40, 42, 44, 46, 49, 50], "rich": [0, 4, 32], "program": [0, 2, 4, 17, 30, 31, 32], "design": [0, 2, 4, 20, 40, 48], "easili": [0, 1, 2, 4, 29, 38, 44], "us": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 23, 24, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 41, 43, 44, 45, 46, 47, 48, 49, 50], "expand": [0, 2, 4], "upon": [0, 4, 48, 50], "both": [0, 4, 11, 22, 24, 33, 34, 36, 39, 43, 44, 46], "novic": [0, 4], "advanc": [0, 2, 4, 6, 21, 29, 38], "user": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 31, 32, 33, 34, 35, 37, 38, 39, 41, 42, 43, 45, 46, 47, 48, 49], "varieti": [0, 4], "hardwar": [0, 4], "softwar": [0, 1, 2, 4, 31], "platform": [0, 4, 25, 44, 49], "an": [0, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 17, 18, 20, 22, 24, 25, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49], "sit": [0, 4, 11, 37, 43], "channel": [0, 2, 4, 5, 6, 8, 9, 13, 18, 21, 22, 23, 25, 28, 29, 32, 34, 35, 36, 37, 38, 41, 45, 47, 49, 50], "perform": [0, 3, 4, 5, 8, 11, 31, 32, 44, 50], "autom": [0, 2, 4], "task": [0, 2, 4, 8, 36], "while": [0, 4, 5, 11, 17, 25, 32, 34, 35, 37, 41, 43, 44, 49], "look": [0, 4, 5, 6, 8, 11, 21, 26, 27, 29, 30, 31, 33, 34, 37, 38, 43, 44, 46, 49], "just": [0, 3, 4, 5, 6, 8, 15, 16, 18, 20, 23, 28, 30, 31, 32, 34, 36, 37, 41, 43, 44, 47, 48, 49], "like": [0, 1, 4, 6, 8, 10, 11, 14, 16, 18, 20, 28, 29, 30, 31, 32, 37, 38, 39, 41, 42, 43, 44, 46, 48, 49, 50], "normal": [0, 4, 6, 14, 15, 16, 17, 22, 28, 29, 33, 37, 44, 46, 47, 48, 49], "some": [0, 4, 5, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 28, 31, 32, 34, 35, 36, 37, 38, 39, 40, 44, 46, 47, 49, 50], "function": [0, 1, 2, 4, 6, 7, 8, 20, 25, 31, 32, 36, 37, 39, 43, 44, 47, 48], "includ": [0, 2, 3, 4, 7, 8, 18, 26, 28, 31, 32, 33, 35, 37, 38, 39, 43, 44, 46, 48, 49], "protect": [0, 2, 3, 4, 11, 20, 22, 30, 32, 35, 37, 43, 44, 46, 50], "abus": [0, 2, 4], "allow": [0, 3, 4, 5, 6, 7, 11, 12, 16, 17, 18, 19, 20, 22, 23, 24, 25, 28, 29, 30, 31, 32, 34, 36, 37, 38, 43, 44, 46, 47, 49], "privileg": [0, 4, 17, 50], "gain": [0, 4, 43, 50], "op": [0, 2, 4, 11, 18, 25, 34, 36, 38, 43, 44, 49, 50], "voic": [0, 2, 4, 11, 30, 44, 50], "statu": [0, 2, 4, 11, 25, 28, 31, 33, 37, 47, 48, 49], "log": [0, 2, 4, 11, 20, 25, 28, 31, 32, 34, 42, 43, 44, 49], "event": [0, 4, 25, 28, 31, 34, 36, 37, 48, 49], "provid": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 28, 30, 31, 32, 37, 39, 40, 42, 44, 46, 48, 49], "inform": [0, 2, 3, 4, 5, 6, 8, 11, 16, 26, 28, 29, 30, 31, 32, 34, 36, 37, 39, 40, 44, 46], "host": [0, 2, 4, 11, 17, 22, 25, 29, 35, 36, 37, 46, 48, 50], "game": [0, 2, 4, 25, 49], "etc": [0, 2, 4, 8, 11, 18, 25, 28, 32, 34, 36, 37, 38, 44, 47, 50], "One": [0, 4, 29, 34, 44], "make": [0, 2, 3, 4, 5, 6, 7, 11, 14, 16, 20, 22, 23, 25, 28, 29, 30, 32, 33, 37, 39, 40, 42, 44, 46, 47, 49], "stand": [0, 4, 32], "out": [0, 3, 4, 8, 24, 26, 29, 30, 31, 32, 36, 37, 41, 43, 44, 46], "modul": [0, 4, 8, 32, 34, 36, 38, 43, 49], "tcl": [0, 1, 2, 3, 4, 6, 11, 12, 22, 28, 29, 32, 35, 37, 38, 39, 46, 47, 49], "script": [0, 2, 3, 4, 7, 8, 11, 22, 30, 31, 32, 35, 38, 39, 44, 47, 48, 49, 50], "support": [0, 2, 3, 4, 5, 6, 9, 11, 12, 15, 17, 18, 19, 22, 23, 24, 30, 32, 33, 35, 37, 38, 44, 47, 49], "With": [0, 4, 6, 16, 31, 36, 37, 43, 44, 46], "can": [0, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50], "almost": [0, 4, 32, 35, 50], "ani": [0, 1, 2, 3, 4, 5, 7, 13, 16, 17, 18, 19, 22, 23, 25, 28, 29, 30, 31, 32, 35, 37, 38, 41, 43, 44, 46, 48, 49, 50], "want": [0, 3, 4, 6, 8, 11, 13, 15, 16, 18, 19, 22, 24, 28, 29, 30, 31, 32, 36, 37, 39, 44, 46, 47], "thei": [0, 3, 4, 5, 7, 8, 11, 13, 14, 18, 19, 22, 23, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 43, 44, 46, 48], "do": [0, 4, 8, 11, 13, 16, 17, 18, 20, 22, 26, 29, 30, 31, 32, 34, 36, 37, 38, 44, 45, 47, 48, 49], "anyth": [0, 4, 16, 29, 30, 31, 32, 36, 37, 41, 44, 48], "prevent": [0, 4, 11, 18, 19, 25, 30, 32, 36, 39, 44, 49], "flood": [0, 4, 11, 14, 19, 22, 36, 37, 38, 44, 50], "greet": [0, 2, 4, 11, 29, 34], "ban": [0, 2, 4, 11, 18, 25, 36, 37, 38, 49, 50], "advertis": [0, 4, 44], "also": [0, 2, 3, 4, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 28, 29, 30, 31, 32, 35, 36, 37, 38, 41, 43, 44, 45, 46, 47, 48, 49, 50], "link": [0, 2, 3, 4, 5, 6, 7, 16, 23, 24, 28, 31, 37, 38, 40, 43, 46, 47], "multipl": [0, 2, 4, 8, 17, 29, 31, 32, 36, 37, 38, 44, 48], "togeth": [0, 2, 4, 22, 29, 36, 37, 38, 40, 44], "form": [0, 4, 28, 29, 44, 45], "botnet": [0, 2, 3, 4, 6, 9, 11, 13, 16, 22, 26, 32, 38, 39, 41, 43, 44, 47, 50], "thi": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50], "each": [0, 4, 6, 11, 16, 19, 24, 29, 30, 32, 34, 36, 37, 38, 41, 44, 47, 48, 50], "secur": [0, 2, 4, 6, 10, 20, 30, 32, 37, 38, 43, 44], "control": [0, 2, 4, 18, 22, 29, 30, 36, 37, 38, 46, 49, 50], "effici": [0, 4, 32, 36, 37, 38], "even": [0, 4, 7, 16, 18, 28, 31, 32, 35, 36, 37, 38, 41, 44, 49], "across": [0, 4, 36, 40, 42, 44, 47], "network": [0, 2, 4, 18, 22, 37, 44, 45], "share": [0, 2, 4, 6, 11, 12, 24, 28, 37, 38, 44], "list": [0, 4, 6, 8, 11, 15, 16, 20, 22, 23, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 40, 41, 46, 48, 49], "exempt": [0, 1, 2, 4, 11, 18, 25, 36, 38, 49, 50], "invit": [0, 2, 4, 11, 18, 25, 36, 38, 40, 49], "ignor": [0, 4, 8, 14, 22, 23, 29, 36, 37, 38, 44, 48], "userfil": [0, 2, 4, 5, 6, 10, 11, 12, 20, 23, 24, 28, 30, 32, 36, 37, 43, 44, 47], "enabl": [0, 2, 4, 7, 11, 13, 16, 18, 22, 24, 28, 29, 30, 32, 36, 37, 38, 39, 40, 46, 47, 49], "same": [0, 3, 4, 5, 7, 8, 11, 12, 17, 18, 28, 29, 32, 34, 36, 37, 40, 43, 44, 45, 46, 47, 48], "access": [0, 4, 17, 22, 28, 29, 30, 32, 38, 41, 43, 44, 46, 48, 49, 50], "everi": [0, 3, 4, 11, 16, 18, 22, 24, 28, 29, 30, 34, 35, 37, 39, 43, 44, 50], "your": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 41, 42, 43, 44, 46, 49], "see": [0, 2, 3, 4, 5, 6, 8, 11, 16, 18, 22, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 41, 42, 43, 44, 45, 48], "doc": [0, 3, 4, 5, 6, 22, 29, 31, 33, 37, 41, 44, 48, 49], "set": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 28, 29, 33, 34, 35, 36, 38, 40, 41, 43, 45, 47, 48, 49, 50], "up": [0, 2, 3, 4, 5, 6, 16, 22, 26, 28, 29, 33, 34, 36, 37, 41, 43, 44, 49], "alwai": [0, 3, 4, 11, 32, 34, 35, 44], "improv": [0, 4], "adjust": [0, 4, 18], "becaus": [0, 4, 8, 17, 22, 28, 29, 37, 44, 47, 48, 49], "ar": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50], "bug": [0, 3, 4, 29, 32, 42], "fix": [0, 3, 4, 28, 37, 44], "ad": [0, 2, 3, 4, 5, 7, 8, 20, 22, 23, 25, 28, 29, 32, 34, 37, 38, 39, 40, 43, 44, 46, 48, 49], "demand": [0, 4], "them": [0, 1, 3, 4, 5, 7, 11, 13, 14, 15, 16, 18, 19, 22, 23, 24, 28, 29, 30, 32, 33, 36, 37, 38, 39, 40, 43, 44, 47, 49, 50], "actual": [0, 4, 8, 16, 28, 29, 33, 37, 41, 44], "sens": [0, 4], "In": [0, 4, 5, 8, 15, 28, 30, 31, 32, 33, 34, 36, 37, 44, 46, 49], "fact": [0, 4, 48], "exist": [0, 4, 8, 16, 22, 28, 31, 34, 43, 44, 48, 49, 50], "sever": [0, 4, 14, 28, 32, 33, 40, 44, 47], "year": [0, 4, 32, 37, 44], "v0": [0, 4, 44], "7": [0, 4, 11, 32, 39, 44], "9": [0, 2, 4, 6, 7, 8, 11, 12, 20, 22, 24, 26, 30, 32, 34, 36, 37, 40, 43, 44, 45, 46, 48], "final": [0, 4, 8, 29, 30, 32, 37, 43], "go": [0, 3, 4, 6, 16, 22, 26, 29, 30, 32, 33, 34, 44], "1": [0, 1, 3, 4, 5, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 40, 41, 43, 44, 46, 48, 49], "part": [0, 4, 8, 22, 25, 29, 31, 37, 38, 44, 46, 47, 49], "tree": [0, 4, 32], "A": [0, 2, 4, 5, 11, 17, 29, 30, 31, 34, 36, 37, 38, 40, 41, 44, 45, 46, 48, 50], "valiant": [0, 4], "effort": [0, 2, 4, 44], "been": [0, 1, 4, 5, 16, 18, 22, 28, 35, 37, 38, 44, 48], "made": [0, 1, 3, 4, 5, 11, 23, 31, 42, 44, 46, 49], "chase": [0, 4], "down": [0, 3, 4, 16, 36, 44], "destroi": [0, 4], "To": [0, 3, 4, 5, 7, 8, 29, 30, 31, 32, 33, 34, 37, 39, 41, 42, 44, 46, 47, 48], "need": [0, 3, 4, 8, 11, 15, 17, 18, 22, 28, 29, 30, 31, 32, 33, 34, 36, 37, 39, 43, 44, 46, 48, 49, 50], "sort": [0, 4, 35], "unix": [0, 3, 16, 17, 32, 38], "account": [0, 2, 4, 17, 19, 28, 30, 32, 38, 40, 42, 43, 49], "pretti": [0, 41], "good": [0, 16, 22, 25, 29, 32, 37, 44, 49, 50], "knowledg": 0, "how": [0, 3, 6, 8, 11, 14, 15, 16, 19, 22, 23, 25, 29, 30, 31, 32, 33, 35, 36, 37, 44, 46, 47, 48, 49], "compil": [0, 2, 3, 4, 28, 31, 32, 33, 37, 39, 44, 46], "read": [0, 2, 3, 4, 6, 7, 17, 28, 29, 30, 32, 33, 37, 44, 45, 49], "dcc": [0, 2, 4, 6, 8, 16, 21, 22, 24, 28, 30, 31, 32, 36, 38, 39, 41, 43, 47], "absolut": [0, 33, 44, 50], "minimum": [0, 11, 31, 44, 48], "5": [0, 4, 8, 11, 22, 23, 28, 29, 32, 37, 39, 44, 45], "mb": 0, "disk": [0, 24, 32, 37, 38, 44], "space": [0, 24, 37, 40, 44], "tarbal": [0, 32], "4": [0, 3, 4, 8, 11, 15, 22, 28, 29, 30, 31, 32, 33, 36, 37, 39, 44], "unpack": 0, "cannot": [0, 28, 32, 34, 43, 44, 50], "without": [0, 2, 4, 5, 6, 10, 11, 14, 20, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 43, 44, 46], "instal": [0, 4, 5, 29, 30, 33, 37], "shell": [0, 3, 4, 17, 30, 32, 37, 44], "copyright": [0, 1, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "c": [0, 1, 2, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "1999": [0, 3, 4, 7, 35, 36, 42, 44, 45, 47], "2022": [], "egghead": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "develop": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50], "team": [0, 1, 2, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "eggdrop": [1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 35, 39, 40, 43, 45, 46, 47, 49, 50], "robei": [1, 3, 4, 38, 45, 50], "pointer": [1, 3, 4, 8, 31, 38, 45], "As": [1, 16, 20, 29, 32, 33, 40, 44, 46, 49], "januari": [1, 9, 10, 13, 19, 21, 24, 26, 44], "1997": [1, 3, 4, 38, 45], "accord": [1, 44, 50], "There": [1, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 28, 29, 30, 31, 33, 34, 35, 37, 39, 43, 45, 46, 49, 50], "should": [1, 3, 4, 5, 8, 11, 13, 14, 15, 16, 18, 20, 22, 23, 25, 28, 29, 30, 31, 32, 36, 37, 39, 41, 43, 44, 46, 48, 49], "copi": [1, 2, 5, 7, 16, 24, 28, 31, 32, 44], "file": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 38, 39, 43, 45, 46, 50], "If": [1, 3, 4, 5, 6, 7, 8, 11, 13, 16, 17, 18, 20, 21, 22, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 46, 47, 48], "write": [1, 2, 6, 7, 27, 32, 37, 43, 44, 49], "free": [1, 2, 5, 28, 31], "foundat": [1, 31], "inc": [1, 31], "51": 1, "franklin": 1, "street": 1, "fifth": 1, "floor": 1, "boston": [1, 31], "ma": [1, 31], "02110": 1, "1301": 1, "usa": [1, 31], "3": [1, 8, 11, 14, 15, 16, 18, 22, 24, 30, 31, 32, 33, 34, 36, 37, 40, 44], "28": [1, 10, 20], "all": [1, 5, 6, 7, 8, 11, 14, 15, 16, 18, 20, 22, 23, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 46, 47, 48, 49, 50], "chang": [1, 2, 6, 8, 10, 11, 16, 18, 20, 22, 23, 25, 29, 31, 32, 33, 36, 37, 38, 40, 41, 42, 46, 48, 49], "sourc": [1, 3, 4, 5, 6, 7, 8, 28, 29, 31, 33, 37, 42, 44, 46, 47], "code": [1, 2, 3, 4, 7, 8, 28, 29, 44], "relat": [1, 6, 11, 29, 31, 39, 44], "still": [1, 4, 5, 11, 16, 23, 31, 32, 33, 34, 37, 38, 44, 49], "did": [1, 30, 43], "past": [1, 4, 28, 31, 37], "previou": [1, 3, 4, 5, 20, 32, 44, 49], "0m": 1, "were": [1, 17, 18, 32, 35, 36, 37, 39, 43, 44, 49], "differ": [1, 3, 4, 5, 11, 16, 22, 29, 31, 33, 34, 37, 43, 44, 47, 48], "scheme": 1, "mai": [1, 4, 5, 11, 12, 16, 17, 18, 24, 29, 32, 36, 37, 39, 40, 44, 47, 48, 49], "option": [1, 3, 4, 7, 11, 16, 17, 20, 22, 30, 31, 32, 37, 46, 49], "those": [1, 3, 7, 12, 16, 22, 28, 29, 30, 31, 32, 44, 47, 48, 49], "instead": [1, 4, 5, 11, 16, 17, 18, 23, 25, 32, 36, 37, 43, 44, 46, 47, 49, 50], "packag": [1, 3, 4, 32, 33], "bless": 1, "For": [1, 2, 3, 5, 7, 8, 16, 22, 30, 31, 32, 33, 36, 37, 39, 40, 41, 43, 44, 46, 47, 48, 49], "bear": 1, "date": [1, 4, 31, 32, 34, 37, 44], "later": [1, 3, 6, 8, 10, 19, 20, 26, 29, 31, 32, 37, 44, 46], "choic": [1, 22, 29], "must": [1, 2, 3, 4, 8, 11, 15, 17, 18, 22, 24, 28, 30, 31, 32, 33, 34, 36, 37, 43, 44, 46, 48], "match": [1, 2, 8, 11, 16, 18, 28, 29, 31, 35, 37, 43, 46, 48], "net": [1, 3, 18, 22, 25, 32, 34, 40], "blowfish": [1, 2, 5, 6, 20, 28, 37, 43, 44], "abov": [1, 4, 11, 18, 20, 28, 29, 30, 38, 44, 45], "restrict": [1, 16, 17, 22, 37, 44, 45, 49], "origin": [1, 8, 22, 32, 42, 44], "chri": 1, "fuller": 1, "place": [1, 3, 5, 7, 11, 16, 18, 29, 31, 32, 35, 37, 44, 46, 49], "him": 1, "domain": [1, 15, 36], "variou": [1, 8, 28, 32, 35, 37, 44], "well": [1, 8, 25, 29, 30, 31, 32, 33, 34, 37, 43, 44, 46, 49], "contain": [1, 3, 4, 5, 29, 32, 34, 36, 37, 39, 44, 46, 48], "could": [1, 8, 22, 29, 36, 37, 39, 42, 43, 44, 46, 49], "port": [1, 5, 15, 17, 22, 23, 30, 32, 33, 36, 37, 39, 46], "applic": [1, 37, 44], "john": 1, "ousterhout": 1, "wai": [1, 3, 17, 22, 25, 28, 29, 30, 32, 33, 34, 35, 36, 37, 41, 43, 44, 46, 49], "affili": [1, 49], "its": [1, 2, 4, 7, 11, 16, 17, 18, 20, 22, 23, 25, 29, 30, 31, 32, 34, 36, 37, 38, 42, 44, 47, 49], "own": [1, 7, 16, 17, 22, 23, 29, 30, 31, 32, 33, 40, 44, 46, 47, 49], "nots": 1, "warranti": [1, 31], "impli": [1, 28, 31], "whatev": [1, 3, 29, 37, 38, 44, 45], "risk": [1, 22], "matter": [1, 8, 15, 29, 30], "put": [1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 37, 44, 46], "built": [2, 17, 44, 47], "assist": [2, 32, 34, 46], "manag": [2, 4, 6, 16, 25, 33, 49], "oldest": [2, 44], "activ": [2, 11, 17, 31, 32, 34, 35, 41, 44, 46], "maintain": [2, 17, 32, 34, 47, 48], "via": [2, 3, 4, 6, 12, 17, 18, 21, 23, 28, 29, 30, 32, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 48, 49], "abil": [2, 7, 17, 33, 34, 36, 38, 44], "run": [2, 3, 4, 5, 7, 11, 17, 22, 28, 29, 30, 31, 32, 33, 34, 36, 37, 43, 45, 46, 48], "join": [2, 6, 8, 11, 13, 18, 19, 25, 29, 31, 32, 33, 35, 37, 38, 40, 41, 44, 48, 49, 50], "perorm": 2, "obtain": [2, 33, 46], "larg": [2, 16, 18, 22, 37], "number": [2, 11, 16, 18, 19, 20, 22, 24, 25, 28, 31, 32, 33, 36, 37, 43, 44, 46, 48, 49, 50], "integr": 2, "current": [2, 4, 6, 7, 8, 10, 16, 18, 19, 20, 25, 28, 30, 32, 34, 36, 37, 38, 41, 44, 45, 46, 48], "ircv3": [2, 34, 38, 44, 47], "capabl": [2, 37, 38, 44, 47, 49], "tl": [2, 3, 4, 5, 8, 30, 32, 37, 44], "ipv6": [2, 32, 37, 38, 44], "twitch": [2, 6, 38], "much": [2, 3, 8, 25, 28, 32, 41, 44], "project": [2, 42, 49], "http": [2, 4, 6, 21, 26, 32, 34, 40], "github": [2, 4, 32], "com": [2, 4, 5, 6, 21, 22, 29, 30, 32, 36, 37, 43, 44, 46], "egggdrop": 2, "clone": [2, 4, 11, 32], "git": [2, 3, 32, 42], "altern": [2, 4, 17, 22, 32, 33, 36, 37, 44, 46], "stabl": [2, 4, 32], "snapshot": [2, 32], "locat": [2, 4, 24, 29, 30, 33, 37, 46], "geteggdrop": [2, 4, 32], "addit": [2, 4, 5, 8, 17, 22, 32, 37, 44, 46, 48], "found": [2, 4, 8, 28, 37, 44, 48], "offici": [2, 4], "webpag": 2, "www": [2, 4, 6, 21], "org": [2, 4, 5, 6, 26, 29, 32, 33, 36, 37, 44], "requir": [2, 4, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 32, 37, 43, 46, 48], "header": [2, 4, 28, 29, 33, 46], "present": [2, 6, 29, 30, 34, 39, 44, 48, 49], "system": [2, 3, 7, 15, 16, 17, 28, 32, 37, 38, 39, 44, 45, 46], "strongli": [2, 4, 32], "encourag": [2, 32, 43], "openssl": [2, 3, 4, 20, 30, 32, 33, 37, 46], "commun": [2, 28, 36, 41, 42, 44], "guid": [2, 3, 29, 32, 33], "quickli": [2, 37], "here": [2, 4, 11, 14, 15, 16, 18, 19, 22, 24, 29, 30, 31, 32, 35, 36, 37, 44, 47, 48], "lurk": 2, "libera": [2, 4, 5, 22, 28, 29, 30, 32], "readm": [2, 3], "notic": [2, 14, 16, 29, 36, 37, 44, 49], "quick": [2, 28, 32, 37], "startup": [2, 8, 43, 44], "upgrad": [2, 43, 46], "command": [2, 3, 6, 8, 11, 13, 16, 17, 18, 21, 22, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 46, 49, 50], "line": [2, 3, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 43, 44, 46, 47, 48, 49], "auto": [2, 3, 36, 50], "start": [2, 3, 5, 6, 10, 17, 20, 22, 27, 29, 30, 36, 37, 40, 41, 43, 44, 45, 48, 49], "document": [2, 8, 17, 29, 32, 33, 36, 39, 40, 42, 46, 47], "cygwin": [2, 39], "window": [2, 30, 39], "v1": [2, 23, 24, 29, 44, 45, 46, 48], "core": [2, 3, 6, 7, 8, 18, 19, 22, 28, 29, 31, 44, 47], "execut": [2, 3, 7, 28, 29, 30, 34, 44], "path": [2, 3, 16, 17, 32, 33, 44, 46], "basic": [2, 4, 6, 7, 21, 29, 32], "consol": [2, 4, 6, 11, 28, 38, 41], "directori": [2, 3, 4, 6, 7, 24, 28, 30, 32, 33, 38, 42, 46, 47], "telnet": [2, 30, 32, 36, 38, 39, 41, 43, 44, 45, 46], "ssl": [2, 3, 4, 5, 22, 30, 32, 33, 36, 38, 44], "parti": [2, 5, 13, 32, 36, 37, 38, 44, 46, 50], "flag": [2, 5, 6, 8, 11, 14, 18, 23, 28, 29, 31, 32, 37, 38, 45], "term": [2, 29, 31, 33, 44], "exampl": [2, 3, 4, 5, 7, 8, 16, 17, 22, 28, 29, 30, 31, 32, 33, 37, 41, 44, 46, 47, 48, 49], "bottre": 2, "botflag": [2, 23], "record": [2, 23, 28, 31, 34, 38, 50], "certif": [2, 3, 22, 30, 33, 37, 44], "authent": [2, 34, 43, 44, 49], "usag": [2, 4, 6, 28, 37, 44], "ctcp": [2, 6, 11, 22, 30, 32, 37, 44, 46], "chat4": 2, "chat6": 2, "kei": [2, 3, 11, 18, 25, 29, 30, 37, 43, 48, 49], "cap": [2, 28, 34, 38, 49], "track": [2, 3, 16, 25, 28, 30, 44, 49], "server": [2, 5, 6, 7, 11, 14, 15, 16, 17, 18, 20, 25, 26, 28, 30, 31, 32, 37, 38, 39, 40, 46, 47, 48, 49], "check": [2, 4, 5, 8, 11, 22, 28, 29, 30, 31, 33, 37, 43, 44, 46, 48], "determin": [2, 3, 17, 28, 30, 32, 36, 39, 44, 46], "best": [2, 3, 6, 17, 32, 36, 44, 48], "encrypt": [2, 5, 6, 10, 20, 30, 33, 36, 38, 46], "hash": [2, 5, 20, 32], "background": [2, 4, 29], "interfac": [2, 25, 44, 49], "disclaim": [2, 44], "regist": [2, 8, 11, 30, 31], "edit": [2, 3, 8, 29, 31, 47], "config": [2, 3, 4, 6, 7, 11, 12, 13, 14, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 30, 33, 34, 35, 36, 37, 39, 43, 45, 46], "web": [2, 6, 25, 37, 48], "ui": [2, 48], "limit": [2, 6, 8, 11, 16, 18, 22, 36, 39], "tip": [2, 44], "renam": [2, 16, 28, 32, 37, 44], "keep": [2, 4, 11, 16, 22, 24, 32, 37, 49], "self": [2, 22, 33, 37, 46], "modifi": [2, 6, 15, 18, 29, 31, 34, 37, 44], "default": [2, 3, 4, 11, 12, 15, 16, 18, 22, 24, 30, 32, 33, 34, 35, 37, 43, 44, 46], "string": [2, 8, 18, 28, 29, 30, 37, 43, 48, 49], "modular": 2, "variabl": [2, 5, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 28, 29, 34, 37, 39, 45, 48], "textfil": 2, "substitut": [2, 37], "output": [2, 3, 28, 30, 31, 33, 43, 45, 47, 48], "manipul": [2, 37], "note": [2, 3, 6, 7, 8, 10, 11, 15, 18, 20, 22, 23, 28, 30, 31, 32, 34, 36, 37, 43, 46, 48, 49], "assoc": [2, 6], "compress": [2, 6, 30], "filesi": [2, 6, 37], "miscellan": 2, "global": [2, 8, 13, 17, 18, 22, 23, 28, 29, 31, 35, 36, 48, 50], "bind": [2, 17, 18, 22, 25, 28, 29, 34, 37, 47, 49], "procedur": [2, 23, 34, 48, 50], "tcp": [2, 17, 39], "connect": [2, 4, 5, 6, 15, 16, 17, 22, 25, 28, 30, 32, 36, 37, 39, 41, 46, 49, 50], "charact": [2, 11, 16, 22, 32, 36, 37, 39, 43], "patch": [2, 39, 44], "submit": [2, 44], "prerequisit": 2, "super": 2, "short": [2, 28, 30, 39, 46], "configur": [2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 37, 39, 42, 44, 46], "common": [2, 22, 32, 33, 36, 37, 40, 46, 50], "step": [2, 3, 5, 28, 32, 49], "partylin": [2, 4, 6, 8, 13, 32, 33, 34, 36, 37, 39, 43, 44, 46, 47, 48, 49, 50], "automat": [2, 3, 4, 5, 8, 13, 17, 22, 32, 34, 35, 36, 37, 38, 39, 43, 44, 46, 49, 50], "restart": [2, 3, 4, 5, 7, 29, 32, 37], "nickserv": [2, 46], "sasl": [2, 32, 38, 40], "export": [2, 8, 47], "dynam": [2, 3, 11, 30, 32, 35, 44], "static": [2, 3, 8, 11, 28, 30, 31, 44], "dn": [2, 6, 37, 44], "ident": [2, 6, 7, 18, 22, 30, 37, 39, 43, 44], "pbkdf2": [2, 5, 6, 43], "seen": [2, 6, 11, 34, 37, 44], "transfer": [2, 6, 7, 12, 16, 23, 32, 36, 37, 39, 44, 46, 50], "woobi": [2, 3, 6, 28, 31], "uptim": [2, 6], "intern": [2, 22, 34, 37, 44, 48], "tabl": [2, 28, 31, 40, 44], "creation": [2, 30, 34], "stackabl": 2, "ht_stackabl": [2, 31], "trigger": [2, 11, 22, 28, 29, 31, 34, 44, 48], "handler": 2, "summari": 2, "bore": [2, 4], "legal": [2, 4], "stuff": [2, 4, 28, 29, 32, 37, 44], "had": [3, 5, 8, 11, 36, 37, 44, 49], "littl": [3, 5, 16, 25, 32, 36, 47], "experi": [3, 16, 29, 32], "THE": 3, "now": [3, 5, 8, 16, 17, 18, 29, 30, 31, 32, 33, 36, 37, 39, 43, 44, 48, 50], "experienc": 3, "more": [3, 4, 5, 6, 8, 14, 16, 18, 21, 28, 29, 30, 31, 32, 33, 36, 37, 38, 40, 42, 43, 44, 46], "cours": [3, 8, 29, 36, 37, 44], "autoconfigur": 3, "thing": [3, 4, 6, 25, 27, 28, 29, 30, 36, 37, 44, 49], "easier": [3, 20], "type": [3, 4, 6, 7, 8, 11, 13, 18, 22, 25, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 46], "figur": [3, 32], "correctli": [3, 44], "try": [3, 4, 6, 7, 21, 22, 26, 28, 29, 30, 32, 34, 37, 48], "find": [3, 6, 15, 18, 21, 28, 29, 30, 32, 41, 42, 44, 49], "which": [3, 5, 6, 8, 11, 13, 15, 16, 17, 22, 23, 28, 29, 30, 31, 32, 34, 35, 36, 37, 39, 41, 43, 44, 45, 46, 47, 48, 50], "either": [3, 4, 8, 16, 17, 30, 31, 32, 33, 34, 35, 36, 37, 39, 44, 46, 48], "iconfig": [3, 7, 32], "everyth": [3, 8, 29, 44], "mod": [3, 6, 7, 21, 25, 28, 37, 44, 48], "choos": [3, 7, 30, 32, 37, 38, 49], "forc": [3, 11, 13, 16, 20, 23, 29, 37, 39, 44], "otherwis": [3, 4, 13, 16, 29, 34, 35, 36, 37, 39, 43, 44, 46, 48], "makefil": [3, 28], "better": [3, 4, 6, 21, 30, 32, 37], "possibl": [3, 11, 14, 16, 22, 30, 33, 36, 37, 39, 40, 41, 44, 46, 48], "debug": [3, 26, 28, 29, 37, 44, 46, 48], "sdebug": 3, "give": [3, 4, 11, 16, 22, 29, 32, 36, 37, 38, 41, 43, 44, 50], "detail": [3, 4, 6, 8, 28, 31, 32, 34, 44, 46, 48], "highli": [3, 22, 32], "unlik": [3, 38], "crash": [3, 4, 8, 44], "take": [3, 4, 5, 6, 16, 20, 22, 26, 29, 31, 32, 37, 43, 44, 46], "longer": [3, 5, 16, 18, 20, 28, 32, 33, 44], "enlarg": 3, "binari": [3, 33], "bit": [3, 16, 25, 29, 32, 33, 37, 44, 46, 49], "worth": 3, "somewher": [3, 37], "accomplish": 3, "enter": [3, 11, 16, 30, 33, 37, 41, 42, 43, 44, 46, 48], "home": [3, 16, 17, 30, 32, 46], "e": [3, 6, 8, 9, 10, 11, 18, 20, 28, 30, 32, 36, 37, 44, 45, 50], "dest": [3, 6, 32, 33, 37, 44, 46], "otherdir": 3, "full": [3, 4, 5, 8, 25, 32, 39, 44, 46, 48, 49], "8": [3, 5, 8, 11, 15, 20, 22, 31, 32, 36, 37, 39, 43, 44, 46], "intend": [3, 8, 35, 44], "traffic": [3, 37, 47], "between": [3, 6, 11, 16, 19, 22, 23, 31, 33, 34, 36, 37, 39, 44], "sslcert": [3, 33, 37, 46], "Or": [3, 33, 44], "non": [3, 11, 15, 17, 18, 22, 28, 30, 35, 36, 44, 46, 49], "interact": [3, 4, 6, 17, 18, 31, 37, 44, 46, 49], "sslsilent": [3, 46], "info": [3, 4, 11, 13, 18, 28, 32, 37], "follow": [3, 4, 5, 8, 11, 16, 18, 22, 25, 28, 31, 32, 33, 36, 37, 38, 40, 42, 43, 44, 45, 46, 47, 48, 49], "complet": [3, 4, 11, 16, 23, 32, 38, 44, 46, 50], "m": [3, 4, 11, 22, 32, 37, 39, 43, 44, 45, 47, 48, 50], "lamestbot": [3, 11, 19, 22, 32, 36, 37, 44, 45], "conf": [3, 7, 17, 30, 32, 40, 44, 46], "when": [3, 4, 6, 7, 10, 11, 13, 16, 17, 18, 22, 23, 28, 29, 30, 31, 32, 34, 35, 36, 37, 39, 41, 43, 44, 46, 48, 49], "futur": [3, 18, 30, 32, 43, 44], "drop": [3, 4, 37, 44], "chmod": [3, 37], "u": [3, 5, 8, 28, 29, 30, 31, 36, 37, 44, 45, 50], "x": [3, 5, 7, 8, 11, 14, 31, 32, 33, 37, 39, 44, 50], "my": [3, 5, 37, 39, 46, 50], "name": [3, 4, 6, 8, 9, 16, 22, 28, 29, 30, 31, 32, 33, 34, 37, 48], "abl": [3, 6, 11, 16, 18, 22, 32, 34, 37, 41, 43, 44], "prompt": [3, 4, 34], "work": [3, 5, 6, 8, 11, 14, 16, 20, 21, 23, 28, 29, 30, 31, 32, 35, 36, 37, 39, 40, 42, 43, 44, 46, 47, 48], "top": [3, 4, 29, 42, 44], "correct": [3, 8, 31, 33, 37, 43], "advis": [3, 22, 24], "crontab": [3, 4, 44], "so": [3, 4, 6, 7, 8, 10, 16, 17, 18, 20, 26, 29, 30, 31, 32, 34, 35, 37, 38, 39, 43, 44, 48], "machin": [3, 4, 17, 32, 37], "goe": [3, 11, 30, 35, 36, 41, 44, 46], "heaven": 3, "forbid": 3, "helper": 3, "systemd": [3, 4], "entri": [3, 4, 8, 30, 32, 37], "add": [3, 4, 5, 7, 8, 11, 17, 18, 25, 28, 29, 31, 32, 33, 34, 36, 37, 38, 43, 49], "job": [3, 4, 30, 46], "autobotchk": [3, 4, 30], "yourconfig": 3, "smile": 3, "tool": [3, 32], "prior": [3, 30, 32, 34, 43, 46], "interpret": [3, 31, 39, 44, 45], "devel": 3, "autoconf": 3, "gcc": 3, "util": 3, "diffutil": 3, "small": [3, 24, 36, 47], "piec": [3, 29, 31], "separ": [3, 7, 8, 22, 32, 36, 37, 38, 39, 40, 44, 47, 48], "smaller": 3, "download": [3, 4, 5, 7, 16, 24, 37, 38, 44], "src": [3, 7, 8, 18, 28], "extens": [3, 32, 34], "dure": [3, 12, 23, 28, 30, 32], "valid": [3, 11, 22, 28, 36, 37, 38, 44, 46], "compat": [3, 5, 40, 44, 48, 49], "rest": [3, 28, 31, 36, 37, 43, 44, 48], "wish": [3, 5, 7, 17, 18, 26, 28, 32, 35, 36, 37, 44, 48], "paragraph": 3, "2": [3, 8, 11, 14, 18, 22, 30, 31, 32, 33, 34, 36, 37, 39, 40, 43, 44, 46], "after": [3, 4, 8, 11, 17, 18, 22, 28, 29, 30, 34, 35, 37, 44, 46, 47, 49], "move": [3, 4, 16, 22, 32, 44, 49], "appropri": [3, 5, 32, 36, 37, 40, 42, 43], "onli": [3, 4, 5, 6, 7, 8, 11, 16, 17, 18, 19, 21, 22, 23, 26, 27, 29, 30, 32, 34, 35, 36, 37, 39, 41, 43, 44, 45, 46, 47, 48, 50], "portion": [3, 7, 11, 44], "end": [3, 28, 30, 31, 37, 43, 44, 45], "point": [3, 6, 8, 22, 27, 31, 32, 36, 37, 44], "hopefulli": [3, 44], "IT": [3, 4], "fun": [3, 49], "pleas": [4, 5, 6, 7, 10, 11, 17, 20, 22, 33, 37, 40, 44], "least": [4, 18, 28, 31, 32, 35, 37], "skim": 4, "ask": [4, 18, 30, 32, 41, 44, 46], "question": [4, 30], "ve": [4, 16, 32, 35, 36, 41], "never": [4, 5, 11, 37, 44], "successfulli": [4, 28, 44, 48], "sure": [4, 11, 28, 29, 32, 33, 36, 37, 44, 49], "select": [4, 32, 37, 38, 42, 44], "n": [4, 5, 11, 30, 31, 36, 37, 41, 44, 45, 50], "owner": [4, 8, 11, 32, 37, 41, 44, 50], "wise": [4, 37], "100": [4, 18, 48], "power": [4, 38], "TO": 4, "someon": [4, 11, 18, 29, 32, 33, 44, 48], "trust": [4, 37, 50], "about": [4, 6, 25, 26, 28, 29, 30, 31, 37, 44, 47, 49], "older": [4, 39, 44], "frequent": [4, 32], "where": [4, 6, 8, 11, 15, 16, 19, 22, 28, 29, 30, 32, 33, 34, 37, 38, 43, 44, 46, 48], "might": [4, 18, 24, 28, 37, 44, 46], "two": [4, 6, 18, 23, 29, 31, 32, 34, 35, 36, 37, 43, 44, 46, 47], "method": [4, 6, 10, 17, 18, 20, 25, 29, 32, 33, 43, 47, 49], "come": [4, 6, 18, 22, 30, 32, 42, 44], "imag": 4, "latest": [4, 5, 32], "pub": [4, 5, 22, 30, 31, 34, 44], "cv": 4, "base": [4, 32, 34, 37, 43, 44], "interest": 4, "veri": [4, 6, 17, 21, 22, 29, 37], "updat": [4, 5, 20, 28, 32, 34, 37, 38, 43, 44, 48], "pull": [4, 42, 43], "recent": [4, 32, 44, 46], "BE": 4, "warn": [4, 17, 29, 44], "branch": [4, 42], "consid": [4, 32, 34, 35, 37, 41, 44], "haha": 4, "signific": [4, 6], "repositori": [4, 32], "simpli": [4, 5, 30, 32, 33, 40, 44, 49], "tar": [4, 7, 32], "archiv": 4, "gz": [4, 32], "hub": [4, 23, 32, 36, 37, 43, 46], "_": [4, 34, 45], "mani": [4, 5, 11, 15, 16, 18, 22, 28, 30, 31, 32, 33, 36, 37, 44], "tclsh": 4, "given": [4, 8, 15, 16, 17, 32, 36, 44, 48], "exit": [4, 6, 13, 16, 22, 44], "howev": [4, 7, 14, 22, 30, 33, 34, 37, 43, 44, 46, 47], "often": [4, 6, 15, 30, 37, 48], "o": [4, 11, 14, 18, 25, 32, 33, 36, 37, 39, 44, 48, 49, 50], "usual": [4, 30, 31, 32, 33, 35, 39, 42, 43, 44, 46, 49], "someth": [4, 8, 29, 32, 42, 44, 49], "similar": [4, 11, 30, 31, 32, 37, 41, 42, 44, 47], "dev": [4, 32, 33], "tk": 4, "tcltk": 4, "html": [4, 39], "recommend": [4, 5, 11, 24, 28, 32, 43, 44, 47, 48], "order": [4, 15, 29, 31, 34, 37, 43, 44, 46, 48], "data": [4, 11, 23, 28, 33, 43, 44], "libssl": [4, 32, 33], "finish": [4, 8, 16, 32, 44], "simpl": [4, 28, 29, 30, 31, 32, 44], "new": [4, 5, 7, 20, 25, 29, 30, 31, 32, 34, 37, 38, 39, 40, 41, 42, 43, 46, 47, 49], "repeat": [4, 34, 44], "defin": [4, 6, 8, 11, 12, 14, 18, 22, 28, 29, 32, 34, 35, 36, 37, 40, 44, 50], "through": [4, 11, 16, 22, 25, 29, 33, 38, 39, 40, 41, 44, 49, 50], "sometim": [4, 22, 32], "mode": [4, 5, 11, 14, 18, 22, 25, 28, 30, 34, 35, 37, 38, 40, 49], "let": [4, 6, 8, 11, 15, 19, 28, 29, 32, 36, 37, 38, 44], "avail": [4, 8, 11, 16, 20, 26, 28, 30, 31, 32, 33, 37, 38, 39, 41, 44, 49], "t": [4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 18, 20, 22, 23, 25, 26, 28, 29, 30, 31, 32, 35, 36, 37, 41, 44, 45, 46, 47, 48, 50], "don": [4, 7, 11, 15, 16, 18, 22, 23, 25, 28, 29, 30, 31, 32, 36, 37, 41, 44, 46, 47], "termin": [4, 5, 8, 44], "session": [4, 39, 40], "troubleshoot": [4, 32], "issu": [4, 5, 17, 25, 32, 34, 37, 42, 44, 46, 48, 49], "show": [4, 6, 8, 11, 16, 26, 29, 36, 37, 44], "10": [4, 8, 11, 18, 30, 32, 36, 37, 44], "second": [4, 11, 14, 15, 18, 22, 24, 28, 29, 31, 37, 47], "screen": [4, 42, 45], "clear": [4, 6, 8, 42, 44, 46, 48, 49], "one": [4, 8, 11, 16, 17, 18, 22, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 41, 42, 43, 44, 46, 47], "person": [4, 29, 32, 37, 44], "introduc": [4, 32, 44], "himself": 4, "herself": 4, "ll": [4, 29, 30, 31, 32, 34, 37, 43, 44, 46], "h": [4, 8, 18, 28, 33, 36, 37, 44, 50], "quit": [4, 6, 22, 32, 37, 44], "v": [4, 8, 11, 18, 30, 37, 44, 45, 50], "peopl": [4, 11, 16, 17, 18, 19, 22, 23, 29, 32, 37, 38, 41, 44, 45, 50], "except": [4, 14, 22, 28, 37, 44, 46], "onc": [4, 11, 16, 18, 20, 22, 29, 30, 32, 36, 42, 44], "along": [4, 16, 31], "manual": [4, 30, 36, 37, 39, 44, 46, 48], "oper": [4, 14, 22, 29, 37, 39, 44, 45], "reason": [4, 28, 30, 32, 36, 37], "monitor": [4, 30, 35, 38, 40], "boot": [4, 8, 37], "b": [4, 11, 16, 18, 25, 29, 30, 36, 37, 42, 44, 45, 49, 50], "minut": [4, 11, 18, 24, 28, 30, 32, 35, 37], "attempt": [4, 5, 11, 17, 18, 22, 25, 33, 34, 35, 36, 37, 44, 46, 49], "geneer": 4, "setup": [4, 6, 7, 32, 37], "would": [4, 5, 14, 29, 30, 32, 33, 34, 36, 37, 44, 45, 46, 48, 49], "noemail": 4, "botchk": [4, 30, 32], "send": [4, 6, 12, 16, 18, 19, 22, 23, 24, 28, 29, 32, 34, 36, 39, 44, 47, 48], "email": [4, 30, 37, 44], "sai": [4, 11, 16, 29, 33, 36, 44], "we": [4, 5, 8, 18, 25, 28, 29, 30, 31, 32, 33, 36, 44, 49], "re": [4, 11, 17, 18, 22, 24, 29, 30, 32, 33, 34, 35, 37, 39, 41, 44, 49], "feel": [4, 5, 28, 42], "miss": [4, 32, 34, 44], "yet": [4, 22, 31, 32, 37, 44], "thank": 4, "discuss": [4, 42], "dalnet": [4, 18, 22], "efnet": [4, 18, 22], "egghelp": [4, 32], "ircnet": [4, 11, 18, 22], "quakenet": [4, 22], "undernet": [4, 18, 22, 44], "plan": [4, 29, 44], "familiar": [4, 29], "etiquett": 4, "capit": [4, 50], "letter": [4, 37, 50], "color": [4, 44], "bold": [4, 44, 45, 50], "excess": [4, 11, 22], "msg": [4, 6, 18, 21, 22, 30, 31, 32, 37, 38, 41, 43, 48], "permiss": [4, 37, 43], "than": [4, 8, 11, 14, 16, 18, 32, 33, 37, 43, 44, 46], "text": [4, 11, 22, 28, 30, 31, 37, 45, 46, 47, 48, 50], "state": [4, 44], "relev": [4, 28, 32], "error": [4, 22, 28, 32, 37, 44, 49], "messag": [4, 11, 22, 28, 29, 31, 32, 34, 37, 38, 40, 41, 43, 45, 47, 48], "easi": [5, 29, 32, 44, 46], "pictur": 5, "reus": [5, 44], "visit": [5, 49], "newer": [5, 32], "backup": [5, 28], "chan": [5, 8, 11, 18, 29, 30, 31, 32, 47], "save": [5, 6, 11, 12, 13, 23, 36, 37, 38, 43], "overwritten": [5, 37, 44], "hurt": 5, "another": 5, "next": [5, 8, 11, 16, 22, 28, 29, 31, 32, 33, 36, 37, 44], "view": [5, 7, 20, 30, 32, 38, 44, 48], "pai": [5, 34, 44], "particular": [5, 30, 31, 37], "attent": [5, 22, 34, 44], "section": [5, 8, 11, 18, 22, 25, 29, 31, 32, 36, 37, 44, 49], "Then": [5, 30, 32, 46], "previous": [5, 32, 44], "unzip": [5, 32], "untar": 5, "These": [5, 12, 18, 28, 32, 34, 35, 36, 37, 39, 45, 46, 48, 50], "NOT": [5, 29, 32, 34, 36, 37, 44, 48], "rather": [5, 44, 46], "killer": 5, "directli": [5, 6, 11, 17, 23, 31, 32, 44], "affect": [5, 11, 25, 37, 38, 39, 44, 49], "modif": [5, 32, 44], "migrat": 5, "suggest": [5, 28], "deprec": [5, 33, 44], "password": [5, 6, 10, 18, 20, 22, 23, 30, 32, 36, 37, 38, 41, 43, 46, 49], "favor": [5, 23], "big": [5, 24, 44, 47], "done": [5, 8, 23, 28, 30, 31, 32, 33, 36, 42, 43, 44, 49], "carelessli": 5, "potenti": [5, 17, 29, 44, 48], "render": [5, 25, 49], "store": [5, 6, 11, 13, 16, 19, 25, 26, 29, 32, 34, 36, 43, 44, 48, 49], "useless": [5, 25, 49], "properli": [5, 31, 32, 33, 36, 37], "switch": [5, 28, 32, 34, 37, 44, 46, 47], "syntax": [5, 8, 30, 37, 46, 50], "6667": [5, 22, 32, 44, 49], "3rd": [5, 8], "remov": [5, 11, 16, 20, 28, 30, 31, 32, 35, 38, 39, 43, 47, 48, 49], "ftp": [5, 32], "fulli": [5, 37, 44, 49], "explicitli": [5, 44, 46], "prefix": [5, 8, 18, 22, 29, 33, 36, 37, 41, 46, 48, 49], "advantag": [5, 32, 47], "chaddr": [5, 36], "lot": [5, 8, 18, 29, 32, 34], "backward": [5, 40], "reflect": [5, 44], "cancel": [6, 44], "cd": [6, 8, 28, 31, 32, 44], "cp": 6, "dst": 6, "desc": [6, 28], "descript": [6, 28, 29, 30, 37, 44, 48, 50], "filestat": 6, "stat": 6, "get": [6, 7, 8, 11, 22, 23, 24, 28, 29, 33, 34, 37, 41, 50], "filenam": [6, 11, 19, 32, 37, 46], "nicknam": [6, 8, 22, 29, 30, 32, 34, 37, 45, 47, 48, 50], "hide": [6, 39, 44], "ln": 6, "filepath": 6, "localfil": 6, "l": [6, 11, 18, 22, 30, 34, 36, 37, 50], "filemask": 6, "mkdir": 6, "dir": [6, 30], "mv": 6, "pend": [6, 11], "pwd": [6, 32], "rm": [6, 32], "rmdir": 6, "optim": [6, 8, 22], "unhid": 6, "unshar": [6, 50], "api": [6, 31], "md5": [6, 10], "anymor": [6, 10, 20, 37], "won": [6, 11, 23, 28, 29, 32, 35, 36, 37, 44, 46, 48], "specif": [6, 11, 15, 17, 18, 20, 22, 25, 31, 32, 36, 39, 40, 44, 46, 48, 49, 50], "therefor": [6, 18, 32, 37, 44], "amount": [6, 37], "bandwidth": [6, 12], "storag": [6, 13, 43], "repli": [6, 14, 15, 17, 18, 34, 37, 44], "d": [6, 11, 14, 16, 28, 30, 31, 32, 33, 36, 37, 42, 44, 47, 50], "expect": [6, 14, 37, 44], "load": [6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 36, 37, 43, 44, 49], "asynchron": [6, 15, 44], "avoid": [6, 8, 15, 30], "long": [6, 11, 15, 19, 22, 23, 35, 37, 44, 45, 48], "period": [6, 15, 32, 44], "hang": [6, 15], "wait": [6, 15, 16, 18, 22, 24, 32, 34, 37, 44], "hostnam": [6, 11, 15, 30, 37, 39], "resolv": [6, 15, 37, 44], "timeout": [6, 15, 22, 24, 37, 48], "area": [6, 16, 37, 44, 47, 50], "within": [6, 16, 28, 32, 33, 35, 37, 40, 44], "usabl": [6, 16, 37], "onlin": [6, 16, 19, 30, 34], "retriev": [6, 19], "userlist": [6, 18, 21, 23], "gseen": [6, 21], "g": [6, 8, 21, 28, 32, 36, 37, 44, 50], "quann": [6, 21], "kreativrauschen": [6, 21], "Not": [6, 22, 30, 40], "equival": [6, 22, 33], "old": [6, 20, 22, 32], "no_irc": [6, 22], "servic": [6, 11, 17, 25, 30, 34, 44, 46, 49], "implement": [6, 7, 8, 17, 33, 34, 37, 40, 42, 43, 44, 49], "tiwtch": 6, "report": [6, 16, 26, 28, 32, 47], "statist": [6, 16, 26], "contest": 6, "site": [6, 50], "hour": [6, 26, 28, 35, 37, 44], "isn": [6, 16, 22, 23, 26, 32, 35, 44], "again": [6, 16, 26, 28, 31, 35, 36, 37, 43, 44, 48], "sent": [6, 16, 18, 23, 26, 30, 34, 37, 40, 41, 44, 46, 48, 50], "demonstr": [6, 27, 44], "right": [6, 8, 16, 17, 27, 29, 32, 44], "jul": 7, "25": [7, 11, 22, 37, 48], "2016": 7, "independ": 7, "main": [7, 29, 32, 33, 34, 41], "desir": [7, 8, 28, 30, 31, 32, 43], "extra": [7, 37, 40], "overhead": 7, "bloat": 7, "enhanc": 7, "instruct": [7, 32, 43], "direct": [7, 33, 36, 42, 44], "un": [7, 18, 35, 37, 44], "format": [7, 22, 28, 30, 32, 33, 37, 43, 44, 45, 48], "modulenam": [7, 28], "eggdrop1": 7, "folder": 7, "suffix": [7, 37], "rehash": [7, 28, 29, 30, 37], "ye": [7, 29, 30, 33, 44], "detect": [7, 22, 33, 39, 44, 46], "yourself": [7, 30, 32, 42, 43, 46], "until": [7, 11, 16, 35, 37, 44], "henc": [7, 28, 44], "nearli": 7, "who": [8, 11, 16, 18, 22, 29, 32, 34, 37, 41, 44, 50], "understand": [8, 31, 37, 44], "alreadi": [8, 11, 22, 28, 29, 31, 32, 33, 34, 36, 37, 43, 44, 49], "suitabl": [8, 48], "illustr": 8, "handl": [8, 29, 30, 31, 35, 37, 43, 46, 48], "snippet": 8, "alter": [8, 16, 38, 44, 49], "breviti": 8, "simplic": 8, "initi": [8, 28, 29, 32, 39, 40, 44, 46], "symbol": [8, 33, 44], "extern": [8, 17, 30, 37], "p_tcl_bind_list": [8, 31], "h_dcc": 8, "param": 8, "const": [8, 28], "char": [8, 28, 31, 37, 44], "length": [8, 18, 22, 28, 43, 44, 46], "tclhash": 8, "int": [8, 28, 31], "intfunc": 8, "return": [8, 18, 28, 31, 34, 43, 48], "aka": [8, 37], "tcl_bind_list_t": 8, "add_bind_t": [8, 31], "builtin_dcc": 8, "doe": [8, 11, 25, 29, 30, 34, 35, 37, 40, 41, 44, 48, 49, 50], "explain": [8, 11, 36, 44], "happen": [8, 29, 32, 35, 37, 44], "arbitrari": [8, 44], "argument": [8, 16, 18, 29, 30, 39, 44, 48], "import": [8, 28, 29, 30, 32, 34, 37, 41, 44], "That": [8, 25, 29, 32, 36, 44, 50], "mean": [8, 16, 18, 22, 29, 30, 31, 34, 35, 36, 37, 38, 39, 43, 44, 46, 48], "mask": [8, 16, 22, 29, 31, 37, 48], "test": [8, 29, 32, 50], "proc1": 8, "proc2": 8, "overwrit": [8, 17, 32, 44], "proc": [8, 22, 28, 29, 48], "myproc": [8, 44], "arg": [8, 28, 31], "putlog": [8, 22, 28, 29, 31], "Of": [8, 36, 37], "far": [8, 16], "against": [8, 11, 16, 20, 22, 29, 31, 32, 43, 44, 48], "receiv": [8, 15, 16, 22, 24, 30, 31, 36, 44, 48], "accept": [8, 16, 23, 25, 31, 33, 36, 37, 44, 46, 49], "check_tcl_dcc": 8, "cmd": [8, 37, 44], "idx": [8, 28, 31], "struct": [8, 31], "flag_record": [8, 31], "fr": [8, 31], "fr_global": [8, 31], "fr_chan": [8, 31], "11": [8, 44], "get_user_flagrec": 8, "con_chan": 8, "egg_snprintf": 8, "sizeof": [8, 31], "ld": 8, "sock": [8, 28, 37], "tcl_setvar": [8, 31], "interp": [8, 31], "_dcc1": 8, "nick": [8, 11, 18, 22, 26, 29, 30, 31, 32, 37, 50], "_dcc2": 8, "_dcc3": 8, "check_tcl_bind": [8, 31], "match_parti": 8, "bind_use_attr": 8, "bind_has_builtin": 8, "snip": 8, "temporari": [8, 11, 24, 26, 35, 37], "pass": [8, 29, 30, 31, 32, 34, 39, 41, 43, 48], "callback": [8, 34], "socket": [8, 17, 28, 33, 44, 46], "id": [8, 44], "putdcc": 8, "respond": [8, 11, 32, 44], "back": [8, 22, 29, 32, 37, 39, 42, 43, 44, 47], "depend": [8, 28, 34, 35, 42, 44, 46, 50], "caller": 8, "pars": [8, 44], "atr": 8, "match_typ": 8, "matchtyp": 8, "result": [8, 22, 34, 35, 37, 39, 44], "bind_nomatch": 8, "tm": 8, "tm_last": 8, "check_bind_match": 8, "continu": [8, 32, 44], "tc": 8, "suffic": [8, 29], "check_bind_flag": 8, "hit": [8, 44], "tcl_eval": 8, "procnam": [8, 29, 44, 48], "grab": [8, 44], "trigger_bind": 8, "func_nam": [8, 28], "suppli": [8, 37], "case": [8, 15, 20, 22, 29, 31, 32, 34, 37, 44], "uniqu": [8, 37, 44, 48], "identifi": [8, 30, 37, 43, 44, 50], "unsur": [8, 32], "wildcard": [8, 11, 29, 30, 44, 48], "exact": [8, 44], "tclegg": 8, "describ": [8, 28, 29, 32, 33, 36, 37], "AND": [8, 20, 32, 44], "bind_stack": [8, 31], "add_builtin": [8, 28], "cmd_t": [8, 28, 31], "null": [8, 28, 31], "mycmd": 8, "tcl_name": 8, "void": [8, 28, 31], "cc": [8, 28], "p": [8, 11, 17, 30, 32, 36, 37, 44, 50], "1024": [8, 16, 17, 24, 31, 32], "cd_tcl_cmd": 8, "tclcmd": 8, "func": [8, 28], "bindtyp": 8, "funcnam": 8, "h_raw": 8, "324": 8, "got324": 8, "raw": [8, 34, 37, 46], "cmd_boot": 8, "cdata": 8, "add_cd_tcl_cmd": 8, "bind_bind_entri": 8, "context": [8, 28], "suppos": 8, "typic": [8, 16, 25, 37, 38, 41, 44, 49], "tcl_command": 8, "tcl_putdcc": 8, "clientdata": 8, "tcl_interp": 8, "irp": [8, 31], "argc": 8, "argv": [8, 31], "f": [8, 11, 31, 36, 37, 44, 45, 48, 50], "okai": [8, 37], "verifi": [8, 22, 30, 37, 46], "count": [8, 22], "badarg": [8, 31], "hand": [8, 29, 37, 44], "macro": [8, 28, 31], "saniti": 8, "checkvalid": [8, 31], "findidx": 8, "atoi": 8, "tcl_appendresult": [8, 31], "invalid": [8, 44], "tcl_error": [8, 31], "tcl_resetresult": 8, "tcl_ok": [8, 31], "oppos": [8, 44], "userrec": [8, 31], "know": [8, 18, 19, 22, 25, 28, 29, 34, 35, 36, 37, 44, 47, 49], "valu": [8, 11, 14, 15, 18, 22, 25, 28, 29, 37, 43, 45, 46, 48, 49], "els": [8, 29, 31, 41, 44], "par": [8, 31], "associ": [8, 25, 34, 44, 49], "gbuildin_dcc": 8, "annot": 8, "gdb": 8, "backtrac": 8, "thommei": 8, "0x55e8bd8a49b0": 8, "0x55e8be6a0010": 8, "614": 8, "0x55e8bd8aec90": 8, "8977024": 8, "flags_udef": 8, "chanrec": [8, 18, 44], "0x55e8bd8aeae0": 8, "0x55e8bd8a4a10": 8, "0x55e8bbf002d0": 8, "0x55e8bd59b1c0": 8, "0x55e8bd7e3e00": 8, "678": 8, "0x55e8be642fa0": 8, "0x55e8be9f6bd0": 8, "0x55e8be7d9020": 8, "0x0": 8, "usr": 8, "lib": 8, "x86_64": 8, "linux": [8, 39], "libtcl8": 8, "lastbind": 8, "0x55e8bd5efda0": 8, "0x55e8bbf4112b": 8, "0x55e8bd5efd40": 8, "742": 8, "0x55e8bd5eecb0": 8, "0x7ffcf3f9dac1": 8, "0x7ffcf3f9d100": 8, "80": 8, "942": 8, "brkt": 8, "0x7ffcf3f9dac6": 8, "974": 8, "udef_glob": 8, "udef_chan": 8, "dcc_chat": 8, "buf": [8, 18], "1068": 8, "2002": [9, 13, 14, 19, 21, 24, 26, 35, 41, 45, 50], "none": [9, 10, 11, 13, 15, 19, 20, 21, 22, 24, 27, 44], "loadmodul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 37, 43, 49], "2000": [9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 27, 37, 38, 43], "2003": [10, 23, 29], "octob": [11, 20, 22, 37], "chanfil": [11, 32, 47], "expir": [11, 18, 19, 22, 35, 37, 44, 46], "enforc": [11, 30, 34, 37], "chanmod": [11, 30], "mix": [11, 18], "endless": 11, "insert": [11, 45], "below": [11, 16, 17, 23, 25, 28, 29, 32, 37, 43, 44, 48], "idl": [11, 28, 44], "kick": [11, 18, 22, 34, 37, 44, 47, 50], "disabl": [11, 18, 22, 30, 37, 39, 44, 46], "stopnethack": [11, 50], "de": [11, 34, 44], "anyon": [11, 35, 44], "serverop": 11, "seven": [11, 44], "turn": [11, 17, 22, 37, 44], "off": [11, 17, 18, 22, 32, 36, 37, 41, 44], "isoptest": 11, "wasoptest": 11, "split": [11, 18, 39, 41, 44, 45], "isop": 11, "wasop": [11, 18, 50], "bitch": 11, "reveng": 11, "punish": [11, 44, 50], "bad": [11, 44, 50], "four": [11, 29, 34, 37, 39, 44, 45], "deop": [11, 44, 50], "k": [11, 18, 22, 37, 44, 50], "specifi": [11, 15, 16, 17, 19, 22, 23, 28, 30, 32, 35, 37, 38, 39, 43, 44, 46, 48], "19": [11, 44], "correspond": [11, 30, 35, 44], "replac": [11, 22, 28, 30, 37, 44, 45, 49], "20": [11, 16, 18, 25, 30, 37, 44], "29": [11, 44], "30": [11, 16, 18, 24, 30, 43, 44], "39": [11, 44], "120": [11, 22, 44], "60": [11, 16, 19, 22, 37, 44], "aop": 11, "delai": [11, 16, 18, 29], "maximum": [11, 15, 16, 18, 19, 22, 24, 31, 37, 43, 44, 46], "autoop": 11, "autohalfop": 11, "autovoic": [11, 50], "No": [11, 23, 30, 33, 44, 49], "y": [11, 14, 33, 37, 50], "random": [11, 22, 36, 44], "putserv": [11, 29, 30], "privmsg": [11, 29, 30, 44], "lamest": [11, 32, 36, 37, 45], "me": [11, 50], "co": 11, "lame": [11, 18, 36, 37, 44], "enclos": [11, 31, 39, 44, 48], "brace": 11, "shorter": 11, "getop": 11, "botnetop": 11, "unban": [11, 37, 44], "rais": [11, 22], "15": [11, 37, 43, 44, 45], "constitut": [11, 22, 37], "integ": [11, 44], "plu": [11, 22, 37, 44, 46], "minu": 11, "front": [11, 29, 32, 33, 44, 49], "enforceban": 11, "dynamicban": [11, 44], "necessari": [11, 33], "rememb": [11, 29, 30, 32], "userban": 11, "dynamicexempt": [11, 44], "remain": [11, 35, 44], "userexempt": 11, "dynamicinvit": [11, 44], "userinvit": 11, "soon": [11, 44], "insecur": 11, "halfop": [11, 44, 50], "protectop": 11, "protecthalfop": 11, "dehalfop": [11, 44, 50], "protectfriend": 11, "statuslog": 11, "total": [11, 28, 38, 44], "member": [11, 28, 34], "regular": [11, 44, 46], "sampl": [11, 31, 32, 49], "01": [11, 18, 44], "40": [11, 30], "istn": 11, "friend": [11, 50], "revengebot": 11, "secret": 11, "cycl": [11, 22, 37], "dontkickop": 11, "instanc": [11, 34], "attack": [11, 20, 43], "inact": [11, 24], "leav": [11, 22, 32, 37, 41, 44, 49], "lose": 11, "nodesynch": 11, "fight": 11, "chanserv": 11, "ircop": [11, 18], "perman": [11, 35, 37, 44], "explan": [11, 32, 33, 44, 48], "nt": [11, 32], "chanset": [11, 30, 36], "2004": [12, 18], "level": [12, 17, 30, 31, 34, 37, 50], "gzip": [12, 44], "autosav": 13, "doesn": [13, 15, 18, 31, 32, 41, 44, 47, 48], "displai": [13, 16, 18, 22, 30, 31, 32, 37, 44, 45, 48], "februari": 14, "12": [14, 44], "behavior": [14, 18, 35, 37, 39, 44], "ping": 14, "less": [14, 41, 44], "finger": [14, 32], "userinfo": [14, 44], "septemb": 15, "26": [15, 32, 46, 50], "troubl": [15, 37], "ones": [15, 23, 36, 39, 44], "rel": [15, 28, 32, 44], "standard": [15, 17, 18, 24, 28, 29, 40, 44, 46, 49, 50], "cach": [15, 44], "86400": 15, "respect": [15, 39, 44, 45], "ttl": 15, "upper": 15, "boundari": [15, 31], "negcach": 15, "600": [15, 18], "neg": [15, 37, 44], "nxdomain": 15, "lookup": [15, 37, 39, 44], "fail": [15, 24, 37, 44, 46], "maxsend": 15, "resend": [15, 44], "queri": [15, 17, 34, 39], "retrydelai": 15, "dec": [16, 44], "2017": 16, "mydir": 16, "root": [16, 17], "incom": [16, 37, 44], "upload": [16, 32, 38, 44, 47], "central": [16, 37], "filedb": [16, 44], "subdirectori": [16, 44], "databas": [16, 44], "max": [16, 18, 19, 22, 24, 37], "effect": [16, 35, 37, 44], "infinit": 16, "files": 16, "size": [16, 24, 28, 31, 37, 44], "kb": 16, "sub": [16, 44], "brows": 16, "tell": [16, 29, 30, 31, 32, 33, 34, 36, 37, 44, 49], "queu": [16, 22, 44], "exactli": [16, 18, 28, 29, 44], "group": [16, 17, 37, 40, 44], "master": [16, 30, 32, 35, 36, 37, 44, 45, 50], "janitor": [16, 50], "broken": [16, 29, 37, 44], "word": [16, 18, 30, 31, 32, 36, 44, 48, 49], "break": [16, 44], "comment": [16, 18, 26, 29, 32, 37, 43], "over": [16, 22, 25, 28, 29, 32, 37, 39, 44, 46, 47, 49], "client": [16, 17, 22, 25, 30, 32, 34, 37, 40, 44, 46, 49], "too": [16, 18, 22, 24, 28, 37, 44], "patient": 16, "simultan": [16, 24, 44], "remaind": [16, 48], "mark": [16, 31, 38, 44, 50], "hidden": [16, 32, 38], "lsa": 16, "gif": 16, "uglyman": 16, "nobodi": [16, 29], "local": [16, 29, 32, 37, 41, 42, 44, 46], "snowbot": 16, "ugli": 16, "shown": [16, 32, 37], "kilobyt": [16, 37], "progress": 16, "eras": [16, 44], "remot": [16, 36, 37, 44, 45], "By": [16, 18, 20, 22, 24, 30, 34, 36, 37, 44, 46, 49], "clean": 16, "slow": [16, 32, 37], "db": 16, "itself": [16, 28, 29, 30, 31, 37, 44], "though": [16, 22, 29, 32, 44, 46], "tag": [16, 38, 40, 48], "filesystem": [16, 44, 50], "june": 17, "2019": 17, "oident": 17, "act": [17, 28, 37, 38, 44, 46], "daemon": [17, 37], "tradition": 17, "113": 17, "usernam": [17, 30, 32, 37, 48, 49], "custom": [17, 22, 29, 30, 34, 38, 44, 46], "oidentd": 17, "nor": 17, "thu": [17, 29, 34, 39, 43, 44], "modern": [17, 43], "oss": 17, "sudo": [17, 32], "setcap": 17, "cap_net_bind_servic": 17, "ep": 17, "imperson": 17, "iptabl": 17, "rout": [17, 44], "destin": [17, 28], "nat": [17, 37, 39], "prerout": 17, "eth0": 17, "dport": 17, "j": [17, 28, 36, 37, 44, 50], "redirect": 17, "addition": [17, 32, 34, 44], "caus": [17, 31, 32, 36, 44, 47], "bound": [17, 37, 44], "netsplit": [17, 18, 37, 38, 44], "reboot": [17, 30], "conflict": 17, "suit": [17, 31, 32], "singl": [17, 18, 30, 44, 48], "environ": [17, 37, 38, 46], "spoof": 17, "open": [17, 30, 31, 37, 41, 42, 44, 46], "builtin": [17, 44], "identd": [17, 32], "shouldn": 17, "begin": [17, 29, 39, 44], "august": 18, "21": [18, 32], "bounc": 18, "reach": [18, 22, 31, 37], "45": 18, "left": [18, 31, 44], "unless": [18, 22, 29, 32, 35, 37, 44], "overridden": 18, "unabl": [18, 32, 36, 39, 44, 49], "learn": [18, 30, 31, 32, 37, 38, 44], "themselv": [18, 32, 36, 44, 47], "userflag": 18, "hello": [18, 22, 30, 32, 37, 38, 44], "afterward": [18, 37], "1500": 18, "180": 18, "200": [18, 41], "byte": [18, 22, 24, 28, 31, 44], "unbind": [18, 37, 47, 48], "myword": 18, "addhost": 18, "takeov": 18, "occur": [18, 29, 44], "due": [18, 22, 29, 37, 44, 48], "blindli": 18, "ing": [18, 25, 49], "guess": 18, "discourag": 18, "opchar": 18, "recogn": [18, 22, 30, 50], "fine": [18, 22, 37, 48], "unrealircd": [18, 44], "lazi": 18, "gone": [18, 44], "At": [18, 31, 36, 37, 41, 49], "moment": [18, 32, 33], "ircd": [18, 22, 44], "per": [18, 44, 48], "stack": [18, 39, 44], "guarante": [18, 34], "although": [18, 32, 37, 44], "higher": [18, 20, 23, 24, 32, 46], "modes_per_line_max": 18, "recompil": [18, 32], "lk": 18, "354": [18, 44], "ircu2": 18, "rfc": [18, 22, 25, 44, 49], "compliant": [18, 22, 44], "1459": 18, "routin": [18, 37, 44], "notefil": [19, 44], "privat": [19, 23, 29, 30, 32, 33, 37, 41, 44, 46], "50": [19, 30, 37], "life": [19, 32], "dai": [19, 24, 37, 44, 47], "fwd": 19, "forward": 19, "address": [19, 23, 26, 32, 36, 37, 39, 46], "notifi": [19, 22, 32, 37, 38, 40, 44], "hourli": [19, 28, 37], "onjoin": 19, "2020": [20, 25, 37, 46, 48], "transit": [20, 43, 44], "safe": [20, 30, 32, 33, 43, 49], "earlier": [20, 31], "seamlessli": 20, "eventu": 20, "altogeth": 20, "outsid": [20, 31, 33, 37], "rijndael": 20, "sha256": 20, "cryptograph": [20, 43, 44], "digest": [20, 44], "algorithm": [20, 43], "round": [20, 43], "1600": 20, "brute": 20, "freenod": 22, "rizon": 22, "sane": 22, "altnick": [22, 32], "stb": 22, "unavail": [22, 37], "hi": [22, 29, 32], "primari": [22, 37], "realnam": [22, 44], "real": [22, 28, 30, 44], "field": [22, 31, 34, 37, 44, 46], "evnt": [22, 44], "init": [22, 37, 44], "init_serv": 22, "botnick": [22, 29, 30, 32, 37], "putquick": 22, "w": [22, 37, 44, 45, 50], "immedi": [22, 31, 32, 34, 43, 44], "deprici": 22, "disconnect": [22, 23, 37, 44], "7000": [22, 32, 33, 44], "2001": [22, 26, 27, 32, 37, 41], "db8": [22, 32, 37], "618": [22, 32, 37], "5c0": [22, 32, 37], "263": [22, 32, 37], "6669": [22, 32], "6697": [22, 32, 44, 46], "whenev": [22, 28, 31, 34, 36, 44, 46], "sign": [22, 30, 33, 37, 44, 45, 46, 49], "jump": [22, 31, 36, 46], "rate": 22, "transmit": 22, "lower": 22, "known": [22, 30, 37, 43, 44], "512": [22, 24], "verif": [22, 37, 46], "assum": [22, 29, 32, 33, 34, 35, 37, 44], "peer": [22, 37, 46], "alt": [22, 37], "16": [22, 37, 43, 44], "32": [22, 37], "revok": [22, 37], "instantli": 22, "low": [22, 24], "respons": [22, 34, 44], "stone": 22, "di": 22, "hasn": 22, "serverror": 22, "queue": [22, 28], "300": [22, 37], "dump": [22, 37, 44], "chunk": 22, "probabl": [22, 30, 32, 33, 44], "quiet": [22, 37, 50], "reject": [22, 36, 37], "squelch": 22, "lowercas": 22, "mirc": [22, 44], "exclus": [22, 44], "pubm": [22, 44], "msgm": [22, 44], "doubl": 22, "penalti": 22, "calcul": 22, "measur": 22, "trace": 22, "accordingli": 22, "three": [22, 30, 31, 34, 35, 36, 37, 44], "summar": 22, "cpu": [22, 37, 44], "intens": 22, "r": [22, 30, 36, 37, 44, 50], "umod": 22, "understood": 22, "indic": [22, 28, 32, 44, 48], "len": 22, "novemb": [23, 40], "resync": 23, "buffer": 23, "reconnect": [23, 44], "900": 23, "hold": [23, 44], "flush": 23, "overrid": [23, 39, 46], "mnot": 23, "paranoid": [23, 37], "discard": [23, 44], "dload": 24, "block": [24, 25, 28, 32, 45, 49], "ircii": [24, 44], "admit": 24, "turbo": [24, 32], "tmp": [24, 44], "stabil": 24, "nf": 24, "mount": 24, "pain": [24, 32], "xfer": [24, 50], "sharefail": 24, "unlink": [24, 37], "abort": [24, 32, 44, 46], "retri": 24, "april": [25, 48], "gatewai": [25, 48, 49], "stream": [25, 49], "claim": [25, 49], "certainli": [25, 32, 49], "meaning": [25, 44, 49], "intent": [25, 49], "spectrum": [25, 49], "focus": [25, 49], "raid": [25, 49], "donat": [25, 49], "userst": [25, 49], "roomstat": [25, 49], "few": [25, 29, 31, 32, 33, 37, 44, 49], "broadcast": [25, 41, 44, 48, 49], "000": [25, 41, 49], "unreli": [25, 48, 49], "moder": [25, 30, 48, 49], "mostli": [25, 44, 49], "infeas": [25, 49], "workaround": [25, 34], "tradit": [25, 39, 47, 48, 49], "extend": [25, 38, 40, 44], "downer": 25, "worri": 25, "ton": 25, "clearchat": [25, 48], "clearmsg": [25, 48], "hosttarget": [25, 48], "whisper": [25, 48], "usernotic": [25, 48], "roomsstat": 25, "twcmd": [25, 49], "ip": [26, 30, 32, 33, 37, 39], "logfil": [26, 28, 32, 37, 47], "publicli": 26, "31": [27, 37, 41, 44], "occurr": 28, "ensur": [28, 30, 32, 36, 43, 44], "module_nam": [28, 31], "making_modulenam": 28, "examin": 28, "close": [28, 44], "stdio": 28, "stdlib": 28, "sy": 28, "drastic": [28, 44], "reduc": [28, 48], "decent": 28, "throughout": 28, "refer": [28, 29, 33, 37, 44], "liter": [28, 44], "func_tabl": 28, "module_regist": [28, 31], "major": [28, 31, 32, 44], "minor": [28, 31, 44], "module_depend": [28, 31], "success": [28, 32, 44], "stage": 28, "any_other_funct": 28, "you_want_to_export": 28, "unload": [28, 31, 44], "apart": [28, 37], "tidi": 28, "thorough": [28, 30, 33, 49], "trail": 28, "garbag": 28, "module_undepend": [28, 31], "talli": 28, "memori": [28, 31, 44], "alloc": [28, 44], "dealloc": 28, "nmalloc": 28, "nfree": 28, "fault": 28, "posit": [28, 37], "resourc": 28, "dprintf": [28, 31], "printf": 28, "dp_log": 28, "dp_stdout": 28, "stdout": 28, "dp_mode": 28, "dp_server": 28, "dp_help": 28, "module_entri": 28, "module_find": 28, "search": [28, 30, 44], "module_renam": 28, "old_module_nam": 28, "new_module_nam": 28, "frim": 28, "add_hook": 28, "hook_num": 28, "del_hook": 28, "hook": 28, "hook_secondli": 28, "hook_minut": 28, "hook_5minut": 28, "hook_hourli": 28, "hook_daili": 28, "hook_read_userfil": 28, "hook_userfil": 28, "hook_pre_rehash": 28, "hook_rehash": 28, "hook_idl": 28, "whole": 28, "hook_backup": 28, "hook_load": 28, "hook_di": 28, "die": [28, 30, 32], "module_unload": 28, "module_load": 28, "tri": [28, 37, 44], "add_tcl_command": 28, "tcl_cmd": [28, 31], "tab": 28, "rem_tcl_command": 28, "function_to_cal": 28, "add_tcl_int": 28, "tcl_int": 28, "rem_tcl_int": 28, "variable_nam": 28, "readonli": 28, "add_tcl_str": 28, "tcl_string": 28, "rem_tcl_str": 28, "str_dir": 28, "constantli": 28, "append": [28, 31, 44], "str_protect": 28, "p_tcl_hash_list": 28, "rem_builtin": 28, "displaynam": 28, "convers": [28, 41, 46], "taken": [28, 44], "auch": 28, "filt": [28, 44], "noth": [28, 37, 44, 49], "logmod": 28, "nice": 28, "mention": 28, "realli": [29, 31, 32, 37, 47], "idea": [29, 32, 42], "busi": 29, "annoi": 29, "intention": 29, "definit": [29, 32, 33, 43], "languag": [29, 37, 38, 47], "especi": 29, "librari": [29, 31, 43, 46], "bottom": 29, "greetscript": 29, "author": [29, 33, 37, 46], "geo": 29, "gree": 29, "pmsg": 29, "greetmsg": 29, "welcom": 29, "uhost": [29, 44], "whew": 29, "ok": 29, "importantli": [29, 31], "wrote": 29, "credit": [29, 44], "contact": [29, 37], "hard": [29, 37], "larger": [29, 43], "harder": 29, "why": [29, 32, 44], "And": [29, 31], "omin": 29, "dissect": 29, "action": [29, 30, 33, 37, 44], "react": [29, 34], "toward": 29, "refin": 29, "foo": [29, 30, 31, 44], "aol": [29, 43], "sum": 29, "hostmask": [29, 30, 35, 36, 38, 43], "told": 29, "declar": [29, 31, 44], "said": [29, 31, 36, 44], "magic": 29, "awesom": 29, "sexystuff": 29, "third": [29, 31, 36], "fourth": 29, "trick": [29, 47], "didn": [29, 32, 44], "talk": [29, 31, 33, 34, 38, 41], "bodi": 29, "true": 29, "deserv": 29, "insid": [29, 37], "challeng": [29, 30], "mayb": [29, 37], "fancyp": 29, "sound": 29, "hint": 29, "utim": 29, "dozen": 29, "defens": 29, "grain": 29, "salt": [29, 43], "further": [30, 44], "IN": 30, "OR": [30, 44], "putti": 30, "listen": [30, 32, 36, 37, 39, 46], "3183": 30, "whoi": [30, 37], "chattr": [30, 50], "grant": [30, 38, 46, 49], "numer": [30, 33, 44], "chaninfo": [30, 36], "involv": 30, "snt": 30, "histor": [30, 44], "reli": [30, 44], "ten": 30, "commonli": [30, 33, 37, 44], "humor": 30, "youreggdropconfignameher": 30, "review": [30, 33], "youreggdrop": 30, "editor": [30, 32], "thee": [30, 44], "systemctl": 30, "botnam": [30, 36], "reload": 30, "acknowledg": 30, "confus": [30, 44], "unfortun": 30, "consult": [30, 39, 40, 46], "uncom": [30, 33, 37, 43], "layer": [30, 33], "becom": [30, 32, 37, 44], "preval": 30, "elimin": 30, "cloak": 30, "ever": [30, 32, 37, 44, 46], "appear": [30, 32, 36, 37, 44, 48], "mechan": 30, "plain": [30, 37, 46], "plaintext": [30, 44, 46], "exchang": 30, "ecdsa": 30, "nist256p": 30, "keypair": [30, 33], "pair": [30, 33, 34, 44, 46, 48], "ecparam": 30, "genkei": 30, "prime256v1": 30, "pem": [30, 37], "fingerprint": [30, 36, 37, 46], "ec": 30, "noout": 30, "conv_form": 30, "grep": 30, "tail": 30, "tr": 30, "xxd": 30, "base64": 30, "On": [30, 32, 33, 35, 36], "pubkei": 30, "req": [30, 37, 46], "x509": [30, 37, 46], "node": [30, 46], "keyout": [30, 46], "crt": [30, 37, 46], "yoru": 30, "outform": 30, "der": 30, "sha1sum": 30, "cut": 30, "f1": 30, "privatekei": [30, 33, 36, 37, 46], "cert": [30, 36, 37, 46], "onto": 31, "wherea": [31, 44], "our": [31, 32, 36, 44], "redistribut": 31, "publish": [31, 37], "hope": [31, 32, 49], "merchant": 31, "fit": 31, "FOR": 31, "59": [31, 44], "templ": 31, "330": 31, "02111": 31, "1307": 31, "necessarili": [31, 44], "undef": 31, "server_func": 31, "export_scop": 31, "woobie_start": 31, "woobie_expmem": 31, "woobie_report": 31, "global_func": 31, "woobie_t": 31, "108": 31, "woobie_clos": 31, "dosen": [], "log_cmd": 31, "print": 31, "cmd_woobi": 31, "mywoobi": 31, "scope": [31, 33], "tutori": [31, 33], "echo": [31, 38, 40, 47], "tcl_echom": 31, "stdvar": 31, "strcmp": 31, "llama": [31, 36], "illeg": 31, "input": [31, 44], "paramt": [], "paramet": [31, 44], "exceed": [31, 37], "style": [31, 35, 44], "quset": 31, "mytcl": 31, "echom": 31, "newli": 31, "certain": [31, 35, 37, 38, 39, 44, 45, 48, 50], "condit": 31, "met": 31, "h_woob": 31, "woobie_2char": 31, "del_bind_t": 31, "woobie_3char": 31, "bar": [31, 44], "moo": [31, 44], "boilerpl": 31, "check_tcl_bindnam": 31, "check_tcl_woobi": 31, "userhost": [31, 48], "snprintf": 31, "_woob1": 31, "_woob2": 31, "match_mask": 31, "bind_exec_log": 31, "encount": [31, 32, 49], "perhap": 32, "websit": 32, "slennox": 32, "incredibli": [32, 44], "page": [32, 42], "prove": 32, "debian": [32, 33], "apt": [32, 33], "wget": 32, "commadlin": 32, "zxvf": 32, "seri": [32, 44, 46], "multi": 32, "comfort": 32, "spent": [32, 44], "appli": [32, 35, 37, 43, 50], "daili": [32, 44], "chanc": 32, "commandlin": 32, "checkout": [32, 42], "skip": [32, 44], "commerci": 32, "problem": [32, 37, 39], "box": [32, 37], "isp": 32, "curl": 32, "ssh": 32, "haven": 32, "gunzip": 32, "xvf": 32, "extract": [32, 44], "slash": [32, 41], "brief": 32, "fast": 32, "botdir": 32, "cooldud": 32, "delet": [32, 44, 47], "rf": 32, "handi": 32, "zip": 32, "notepad": 32, "editplu": 32, "nano": 32, "vim": 32, "offer": [32, 33, 34, 48, 49], "quicker": 32, "nicebot": 32, "entir": [32, 44, 48, 49], "carefulli": [32, 44], "vagu": 32, "preserv": 32, "llamabot": [32, 37], "login": [32, 37, 43, 48], "vhost4": [32, 37, 39], "vhost": [32, 37, 39], "ipv4": [32, 37, 39], "ie": [32, 43, 44, 46], "vhost6": [32, 37, 39], "5254": 32, "dead": 32, "b33f": 32, "1337": 32, "f270": 32, "captur": [32, 44, 47], "mcobx": 32, "jkp": 32, "donkei": 32, "hors": 32, "3333": [32, 36, 37], "65535": [32, 37], "49152": 32, "rang": [32, 37], "reserv": [32, 37, 41], "basi": 32, "stealth": [32, 37], "scan": 32, "newus": [32, 37], "mrlame": [32, 37], "mrslame": [32, 37], "addus": 32, "rejoin": [32, 44], "aren": [32, 37, 44, 47, 48], "preced": [32, 44, 46], "backslash": 32, "rule": 32, "prematur": 32, "phew": 32, "cross": 32, "gave": 32, "promptli": 32, "kill": [32, 44], "pid": [32, 37, 44], "mnt": 32, "launch": 32, "persist": 32, "luck": [32, 49], "walk": 33, "scenario": [33, 34, 36], "sidenot": 33, "despit": 33, "anachron": 33, "interchang": [33, 39], "transport": 33, "protocol": [33, 37, 40, 44, 46], "appreci": 33, "fork": [33, 42], "ubuntu": 33, "distro": 33, "denot": [33, 44], "pretendnet": 33, "suffici": 33, "z": [33, 50], "wizard": 33, "5555": [33, 36, 37], "hubbot": [33, 36], "perfect": 34, "status": 34, "accur": [34, 44, 48], "alert": [34, 49], "deauthent": 34, "spec": 34, "isupport": 34, "005": [34, 40, 44], "eggdroptest": [34, 48], "beerbot": 34, "tn": 34, "announc": 34, "issupport": 34, "isset": 34, "reliabl": [34, 44, 48], "significantli": [34, 48], "increas": [34, 37, 43], "accuraci": 34, "supplementari": 34, "attach": [34, 44, 48], "overal": 34, "situat": [34, 36], "cover": [34, 35, 36], "march": [35, 45, 50], "07": [35, 50], "clarifi": 35, "sticki": [35, 44], "unsticki": 35, "stick": 35, "attribut": [35, 36, 44, 50], "kept": [35, 37], "obvious": [35, 44], "unstick": 35, "whose": [35, 44], "whichev": 35, "consist": [36, 38, 41, 44], "leaf": [36, 37, 43, 46], "assign": [36, 37, 44], "aggress": 36, "passiv": 36, "physic": 36, "bota": 36, "botb": 36, "botc": 36, "sharebot": [36, 37, 44], "slave": 36, "botattr": 36, "isol": 36, "unlimit": 36, "4444": [36, 37], "thoroughli": 36, "special": [36, 44], "relink": 36, "scripter": 36, "prepar": 36, "lameshar": 36, "hp": [36, 37], "beldin": 36, "pipe": 36, "he": [36, 44], "unreach": 36, "auth": [36, 37, 46], "fprint": [36, 37, 46], "sha1": [36, 46], "0and": 36, "intead": [], "qualifi": 37, "admin": [37, 45], "lamer": 37, "someircnetwork": 37, "timezon": 37, "est": 37, "timestamp": [37, 44], "alphabet": 37, "european": 37, "utc": 37, "cet": 37, "offset": 37, "coordin": 37, "univers": 37, "gmt": [37, 44], "west": 37, "prime": 37, "meridian": 37, "east": 37, "23": [37, 44], "env": 37, "tz": 37, "everywher": [37, 39, 44], "99": [37, 41], "virtual": 37, "outgo": [37, 44, 47], "prefer": [37, 39, 46], "resolut": 37, "famili": 37, "addlang": [37, 44], "english": [37, 47], "egg_lang": 37, "danish": 37, "french": 37, "finnish": 37, "german": 37, "chatter": 37, "24": [37, 39, 44], "logfilenam": 37, "yesterdai": 37, "48": 37, "concurr": [37, 43], "infin": 37, "decreas": 37, "logsiz": 37, "550": 37, "fill": [37, 42, 46], "quota": 37, "ram": 37, "hole": 37, "care": [37, 44, 49], "logflag": 37, "misc": [37, 44], "wallop": [37, 44], "eight": [37, 44], "belong": 37, "mco": [37, 44], "jpk": 37, "min": 37, "sec": 37, "man": 37, "strftime": 37, "forev": 37, "digit": [37, 46], "month": [37, 44], "fresh": 37, "militari": 37, "03": [37, 44], "00": [37, 44, 45], "am": [37, 50], "midnight": 37, "04may2000": 37, "produc": [37, 44], "yyyymmdd": 37, "manpag": 37, "mkcoblx": 37, "pidfil": 37, "motd": [37, 45], "banner": [37, 45], "perm": 37, "0600": 37, "octal": 37, "remind": 37, "rw": 37, "0400": 37, "0200": 37, "0660": 37, "0440": 37, "0220": 37, "0666": 37, "0444": 37, "0222": 37, "kiddi": 37, "head": 37, "unimport": 37, "deal": [37, 44, 50], "maxim": 37, "1025": 37, "prepend": 37, "whether": [37, 39, 44], "prohibit": 37, "sanitycheck": 37, "bogu": 37, "ground": 37, "wouldn": 37, "anywai": 37, "thr": 37, "firewal": 37, "sun": 37, "barr": 37, "ebai": 37, "3666": 37, "behind": 37, "passthru": 37, "127": 37, "192": [37, 44], "168": [37, 44], "255": 37, "172": 37, "transpar": 37, "masquerad": 37, "portrang": 37, "url": [37, 44], "birthdai": 37, "userinfo1": 37, "moreov": 37, "simul": [37, 44], "ethic": 37, "dk": [37, 44], "dupwait": 37, "spread": 37, "lag": [37, 41], "cidr": [37, 44], "notat": 37, "genrsa": 37, "4096": [37, 46], "rsa": 37, "strong": 37, "enough": 37, "schat": [37, 46], "conveni": 37, "cipher": [37, 44, 46], "side": [37, 44, 46, 49], "365": 37, "depth": [37, 46], "chain": [37, 46], "shall": 37, "capath": [37, 46], "cafil": [37, 46], "ca": 37, "colon": [37, 39], "comma": [37, 41, 44], "silent": 37, "adh": 37, "anonym": 37, "dh": 37, "uid": [37, 46], "chfinger": 37, "slower": 37, "everydai": 37, "limbo": 37, "serv": 37, "alltool": 37, "robot": 38, "regularli": 38, "awai": [38, 40, 44], "chghost": [38, 40], "setnam": [38, 40], "whox": [38, 44], "unaccess": 38, "combin": [38, 44], "mar": 39, "2021": [39, 40, 44, 47], "establish": [39, 44, 46], "freebsd": 39, "netbsd": 39, "openbsd": 39, "mac": 39, "proper": [39, 44], "vista": 39, "xp": 39, "unoffici": 39, "wherev": 39, "squar": 39, "bracket": 39, "doubt": 39, "Their": 39, "began": 40, "rfc1459": [40, 44], "rfc2812": 40, "compris": 40, "decid": [40, 43], "emerg": 40, "optino": 40, "assumpt": 40, "explicit": 40, "302": [40, 44], "miniatur": 41, "watch": [41, 48], "999": 41, "wide": [41, 46], "anywher": [41, 44], "dot": 41, "apostroph": 41, "everyon": [41, 44], "contribut": 42, "think": [42, 50], "repo": 42, "click": [42, 49], "button": [42, 49], "descriptivebranchnam": 42, "confirm": [42, 44], "push": [42, 44], "yourusernam": 42, "yourbranchnam": 42, "templat": 42, "pour": 42, "cold": [42, 43], "bask": 42, "warm": 42, "karma": 42, "crytopgraphi": 43, "content": [43, 44, 48], "sensit": 43, "practic": [43, 44], "crypto": 43, "solut": 43, "deriv": 43, "revers": [43, 44], "seamless": 43, "enjoi": 43, "beverag": 43, "chpass": 43, "consider": 43, "ideal": [43, 49], "essenti": 43, "fanci": 43, "lobster": 43, "dinner": 43, "encpass2": 43, "pbk": 43, "exhaust": [44, 48], "categori": 44, "vertic": 44, "faster": 44, "bypass": 44, "caution": 44, "lieu": 44, "negoti": [44, 46], "dict": [44, 48], "mytag": 44, "baa": 44, "flat": 44, "servivc": 44, "botfl": 44, "botaddr": 44, "laston": 44, "xtra": 44, "visibl": 44, "counterpart": 44, "empti": [44, 48], "filearea": 44, "remotebotnam": 44, "globalflag": 44, "channelflag": 44, "subsequ": 44, "botaddress": 44, "ipaddress": 44, "ipv4address": 44, "ipv6address": 44, "behav": 44, "getinfo": 44, "unstuck": 44, "jupe": 44, "sublist": 44, "zero": 44, "differenti": 44, "abcdechannel": 44, "got": 44, "modechang": 44, "refresh": [44, 48], "fragil": 44, "notif": 44, "offlin": 44, "behalf": 44, "selecet": 44, "compon": 44, "duplic": 44, "element": 44, "bywho": 44, "ag": 44, "reset": 44, "reread": 44, "memberlist": 44, "lost": 44, "ntik": 44, "serverlist": 44, "ex": 44, "goober": 44, "ON": 44, "forget": 44, "reiniti": 44, "coupl": 44, "throw": 44, "99999": 44, "greater": 44, "equal": 44, "she": 44, "mpj": 44, "pj": 44, "moc": 44, "mp": 44, "configfil": 44, "omit": [44, 46], "boldfac": 44, "video": 44, "underlin": [44, 45], "ansi": 44, "ctrl": 44, "bell": 44, "ordinari": [44, 46], "ital": 44, "intercept": 44, "item": 44, "uplink": 44, "botnetnick": 44, "file_receiv": 44, "file_send": 44, "file_send_pend": 44, "readabl": 44, "lindex": 44, "six": 44, "blank": 44, "mandatori": 44, "permit": 44, "regardless": 44, "failur": [44, 48], "kind": 44, "succeed": 44, "pathnam": 44, "temp": 44, "resum": 44, "bitchx": 44, "five": 44, "jp": 44, "34": 44, "04": 44, "06": 44, "08": [44, 45], "interv": 44, "secondli": 44, "repres": [44, 48], "jan": [44, 46], "1970": 44, "convert": 44, "week": 44, "804600": 44, "vari": [44, 50], "posix": 44, "portabl": 44, "fri": 44, "aug": 44, "55": 44, "1973": 44, "rand_max": 44, "2147483647": 44, "underli": 44, "pseudo": 44, "relinquish": 44, "deliv": 44, "notebox": 44, "caught": 44, "encod": [44, 45], "ascii": 44, "64": 44, "ecb": 44, "cbc": 44, "pick": 44, "fatal": 44, "wasn": 44, "128": 44, "pre": [44, 46], "myownevent123": 44, "todai": 44, "couldn": 44, "17": 44, "insensit": 44, "simplifi": 44, "rfc_compliant": 44, "mem": 44, "exclud": 44, "cleartext": 44, "vali": 44, "valis0": 44, "crappi": 44, "math": 44, "ufl": 44, "edu": [44, 50], "eu": 44, "pl1": 44, "1010201": 44, "mnnrrpp": 44, "nn": 44, "rr": 44, "pp": 44, "437": 44, "expans": 44, "quot": [44, 48], "highest": 44, "prioriti": 44, "danger": 44, "logic": 44, "proce": 44, "easiest": 44, "build": 44, "ti": 44, "lastli": 44, "ov": 44, "mn": 44, "unknown": 44, "fil": 44, "phrase": 44, "spoken": 44, "notc": 44, "breach": 44, "notcproc": 44, "partproc": 44, "signoff": 44, "possibli": [44, 48], "twice": 44, "rawt": 44, "topc": 44, "kicker": 44, "newnick": 44, "typo": 44, "18": 44, "guppi": 44, "mode_proc": 44, "stai": 44, "mode_proc_fix": 44, "ctcr": 44, "embed": 44, "supplant": 44, "368": 44, "unexpect": 44, "chon": 44, "chof": 44, "recipi": 44, "rcvd": 44, "invok": 44, "dronepup": 44, "eden": 44, "wild": 44, "bcst": 44, "disc": 44, "splt": 44, "Be": 44, "awar": 44, "fals": 44, "alarm": 44, "fake": 44, "rejn": 44, "needop": 44, "needal": 44, "flud": 44, "wall": 44, "sender": 44, "chjn": 44, "chpt": 44, "0000": 44, "9999": 44, "schedul": 44, "var": 44, "pad": 44, "unld": 44, "nkch": 44, "oldhandl": 44, "newhandl": 44, "sighup": 44, "hup": 44, "sigterm": 44, "sigil": 44, "ill": 44, "sigquit": 44, "prerehash": 44, "prerestart": 44, "preinit": 44, "tout": 44, "stall": 44, "flexibl": [44, 46], "noqueu": 44, "cron": 44, "weekdai": 44, "evalu": 44, "express": 44, "delimit": 44, "whitespac": 44, "sundai": 44, "handshak": 44, "shutdownreason": 44, "shutdown": 44, "sigkil": 44, "ircawai": 44, "301": 44, "catch": 44, "invt": 44, "invite": 44, "dictionari": 44, "late": 44, "distinguish": 44, "unset": 44, "revert": 44, "statement": 44, "treat": [44, 49], "signal": 44, "verbos": 44, "affet": 44, "retain": 44, "driven": 44, "misnom": 44, "song": 44, "danc": 44, "eof": 44, "arriv": 44, "dispos": 44, "newidx": 44, "6687": 44, "escap": 44, "invers": 45, "flash": 45, "botnetcentr": 45, "percent": 45, "col": 45, "column": 45, "width": 45, "center": 45, "70": 45, "meet": 46, "autodetect": 46, "forcefulli": 46, "sslinc": 46, "ssllib": 46, "starttl": 46, "certifict": 46, "graphic": 46, "deliber": 46, "sdcc": 46, "kvirc": 46, "synchron": 46, "infrastructur": 46, "subject": 46, "s_client": 46, "sslport": 46, "issuer": 46, "jun": 47, "02": 47, "2500": 47, "high": 47, "therebi": [47, 49], "lang": 47, "techniqu": 47, "yourbot": 47, "myvar": 47, "held": 48, "natur": 48, "WILL": 48, "unintend": 48, "consequ": 48, "truncat": 48, "assur": 48, "replic": [48, 49], "vip": [48, 49], "subscrib": [48, 49], "badgui": 48, "comprehens": 48, "twith": 48, "gui": 48, "flagmask": 48, "ccht": 48, "histori": 48, "tmi": 48, "tv": [48, 49], "target": 48, "cmsg": 48, "msgid": 48, "htgt": 48, "viewer": 48, "similarli": 48, "arbitrarili": 48, "wspr": 48, "popul": 48, "wspm": 48, "rmst": 48, "emot": 48, "uncertainti": 48, "usst": 48, "usrntc": 48, "discontinu": 49, "technic": 49, "token": 49, "oauth": 49, "alphanumer": 49, "pretend": 49, "j9irk4vs28b0obz9easys4w2ystji3u": 49, "spoiler": 49, "sake": 49, "light": 49, "decis": 49, "notabl": 49, "topic": 49, "degrad": 49, "capac": 49, "face": 49, "hubcap": 50, "clemson": 50, "hate": 50, "milk": 50, "meaningless": 50, "titl": 50, "entitl": 50, "badg": 50, "q": 50, "mainten": 50, "washalfop": 50, "nethack": 50, "highlight": 50, "2023": [0, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50]}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"about": [0, 2, 39, 40, 46], "eggdrop": [0, 2, 3, 4, 5, 6, 7, 8, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 42, 44, 48], "bore": 1, "legal": 1, "stuff": 1, "an": [2, 28, 29, 30, 33], "open": 2, "sourc": [2, 16, 32], "irc": [2, 18, 33, 46, 49], "bot": [2, 16, 36, 44], "some": 2, "thing": 2, "you": 2, "can": [2, 7], "do": [2, 7, 28], "how": [2, 4, 5, 7, 28], "get": [2, 4, 16, 32, 44], "instal": [2, 3, 7, 32, 39, 46], "pre": [2, 4, 33], "requisit": [2, 4, 33], "where": 2, "find": 2, "more": 2, "help": [2, 4], "us": [2, 34, 36], "tutori": 2, "modul": [2, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 37, 44], "quick": [3, 4], "startup": [3, 4], "cygwin": 3, "requir": [3, 28, 31, 34, 44], "window": 3, "readm": 4, "notic": 4, "what": [4, 7, 28, 36], "i": [4, 7, 36], "ftp": 4, "git": 4, "develop": 4, "snapshot": 4, "docker": 4, "system": [4, 30], "upgrad": [4, 5], "command": [4, 5, 25, 31, 44, 47, 48], "line": [4, 41], "auto": 4, "start": [4, 32], "document": [4, 5], "obtain": 4, "must": 5, "read": 5, "chang": [5, 44], "v1": 5, "9": 5, "config": [5, 16, 32, 44, 47, 49], "file": [5, 16, 32, 33, 37, 44, 47, 49], "script": [5, 29, 34, 37, 46], "botnet": [5, 33, 36, 37, 46], "tcl": [5, 8, 25, 31, 34, 43, 44, 48], "includ": 6, "inform": [7, 33], "ar": 7, "compil": 7, "without": 7, "dynam": 7, "static": 7, "still": 7, "need": 7, "loadmodul": [7, 44], "bind": [8, 31, 44, 48], "intern": 8, "tabl": 8, "creation": 8, "stackabl": [8, 44], "ht_stackabl": 8, "trigger": 8, "ani": 8, "c": 8, "handler": 8, "summari": 8, "assoc": [9, 44], "blowfish": 10, "channel": [11, 16, 30, 44, 48], "compress": [12, 44], "consol": [13, 37, 44], "ctcp": [14, 39], "dn": 15, "filesi": [16, 44], "setup": 16, "partylin": [16, 25, 30, 31], "usag": [16, 39, 40, 43, 46], "cancel": 16, "cd": 16, "directori": [16, 37, 44], "cp": [16, 44], "dst": 16, "desc": [16, 44], "descript": 16, "filestat": 16, "user": [16, 30, 36, 44, 50], "clear": 16, "stat": 16, "filenam": [16, 44], "nicknam": [16, 44], "hide": 16, "ln": 16, "filepath": 16, "localfil": 16, "l": [16, 44], "filemask": 16, "mkdir": [16, 44], "dir": [16, 44], "flag": [16, 30, 36, 44, 48, 50], "mv": [16, 44], "dest": 16, "pend": 16, "pwd": 16, "quit": 16, "rm": 16, "rmdir": [16, 44], "share": [16, 23, 36], "optim": 16, "unhid": 16, "unshar": 16, "ident": 17, "note": [19, 44], "pbkdf2": 20, "seen": 21, "server": [22, 33, 34, 44], "transfer": 24, "twitch": [25, 48, 49], "limit": [25, 44, 49], "api": 25, "uptim": [26, 44], "woobi": 27, "write": [28, 29, 31], "module_start": 28, "module_t": 28, "module_clos": 28, "module_expmem": 28, "module_report": 28, "addit": [28, 33], "function": [28, 49], "common": 30, "first": 30, "step": 30, "log": [30, 37, 47], "join": [30, 34], "add": [30, 44], "host": [30, 44], "assign": 30, "permiss": 30, "configur": [30, 32, 33, 43], "set": [30, 32, 37, 39, 44, 46], "automat": 30, "restart": [30, 44], "crontab": 30, "method": 30, "old": [30, 44], "systemd": 30, "newer": 30, "authent": [30, 36, 46], "nickserv": 30, "up": [30, 32], "sasl": 30, "basic": [31, 37], "header": 31, "code": 31, "ad": [31, 36], "defin": 31, "argument": 31, "call": 31, "export": 31, "prerequisit": 32, "The": [32, 41], "super": 32, "short": 32, "version": [32, 44], "histori": 32, "download": 32, "locat": 32, "edit": [32, 49], "No": 32, "show": 32, "enabl": [33, 34, 43, 44], "tl": [33, 36, 46], "secur": [33, 36, 46], "connect": [33, 44], "protect": 33, "commun": 33, "prepar": 33, "gener": 33, "kei": [33, 44, 46], "listen": [33, 44], "account": [34, 44], "track": 34, "capabl": [34, 40], "extend": 34, "notifi": 34, "whox": 34, "check": 34, "statu": [34, 44], "determin": 34, "support": [34, 39, 40, 46], "best": 34, "effort": 34, "tag": [34, 44], "ban": [35, 44], "invit": [35, 44], "exempt": [35, 44], "link": [36, 44], "term": 36, "exampl": 36, "bottre": 36, "botflag": 36, "make": 36, "record": [36, 44], "certif": [36, 46], "core": 37, "execut": 37, "path": 37, "dcc": [37, 44, 46], "telnet": 37, "advanc": [37, 47], "ssl": [37, 46], "featur": 38, "ipv6": 39, "chat": 39, "chat4": 39, "chat6": 39, "ircv3": 40, "cap": [40, 44], "parti": 41, "patch": 42, "submit": 42, "via": [42, 44], "github": 42, "encrypt": [43, 44], "hash": 43, "background": 43, "hybrid": 43, "solo": 43, "interfac": 43, "output": 44, "putserv": 44, "text": 44, "option": 44, "puthelp": 44, "putquick": 44, "putnow": 44, "onelin": 44, "putkick": 44, "nick": [44, 48], "reason": 44, "putlog": 44, "putcmdlog": 44, "putxferlog": 44, "putloglev": 44, "": 44, "dumpfil": 44, "queuesiz": 44, "queue": 44, "clearqueu": 44, "valu": 44, "req": 44, "raw": 44, "arg": [44, 48], "tagmsg": 44, "target": 44, "ip": 44, "port": 44, "password": 44, "remov": 44, "list": 44, "manipul": 44, "countus": 44, "validus": 44, "handl": 44, "findus": 44, "userlist": 44, "passwdok": 44, "pass": 44, "getus": 44, "entri": 44, "type": [44, 48], "extra": 44, "info": 44, "setus": 44, "chhandl": 44, "new": 44, "chattr": 44, "botattr": 44, "matchattr": 44, "addus": 44, "hostmask": 44, "addbot": 44, "address": 44, "botport": 44, "userport": 44, "delus": 44, "delhost": 44, "addchanrec": 44, "delchanrec": 44, "haschanrec": 44, "getchaninfo": 44, "setchaninfo": 44, "newchanban": 44, "creator": 44, "comment": 44, "lifetim": 44, "newban": 44, "newchanexempt": 44, "newexempt": 44, "newchaninvit": 44, "newinvit": 44, "stickban": 44, "banmask": 44, "unstickban": 44, "stickexempt": 44, "exemptmask": 44, "unstickexempt": 44, "stickinvit": 44, "invitemask": 44, "unstickinvit": 44, "killchanban": 44, "killban": 44, "killchanexempt": 44, "killexempt": 44, "killchaninvit": 44, "killinvit": 44, "ischanjup": 44, "isban": 44, "ispermban": 44, "isexempt": 44, "ispermexempt": 44, "isinvit": 44, "isperminvit": 44, "isbansticki": 44, "isexemptsticki": 44, "isinvitesticki": 44, "matchban": 44, "matchexempt": 44, "matchinvit": 44, "banlist": 44, "exemptlist": 44, "invitelist": 44, "newignor": 44, "killignor": 44, "ignorelist": 44, "isignor": 44, "save": 44, "reload": 44, "backup": 44, "name": 44, "savechannel": 44, "loadchannel": 44, "channame2dnam": 44, "chandname2nam": 44, "dname": 44, "isbotnick": 44, "botisop": 44, "botishalfop": 44, "botisvoic": 44, "botonchan": 44, "isop": 44, "ishalfop": 44, "wasop": 44, "washalfop": 44, "isvoic": 44, "isidentifi": 44, "isawai": 44, "isircbot": 44, "onchan": 44, "monitor": 44, "accounttrack": 44, "getaccount": 44, "nick2hand": 44, "account2nick": 44, "hand2nick": 44, "handonchan": 44, "ischanban": 44, "ischanexempt": 44, "ischaninvit": 44, "chanban": 44, "chanexempt": 44, "chaninvit": 44, "resetban": 44, "resetexempt": 44, "resetinvit": 44, "resetchanidl": 44, "resetchanjoin": 44, "resetchan": 44, "refreshchan": 44, "getchanhost": 44, "getchanjoin": 44, "onchansplit": 44, "chanlist": 44, "chanflag": 44, "getchanidl": 44, "getchanmod": 44, "jump": 44, "pushmod": 44, "mode": 44, "flushmod": 44, "topic": 44, "validchan": 44, "isdynam": 44, "setudef": 44, "int": 44, "str": 44, "renudef": 44, "oldnam": 44, "newnam": 44, "deludef": 44, "getudef": 44, "chansettyp": 44, "isupport": 44, "isset": 44, "putdcc": 44, "idx": 44, "dccbroadcast": 44, "messag": 44, "dccputchan": 44, "boot": 44, "dccsimul": 44, "hand2idx": 44, "idx2hand": 44, "valididx": 44, "getchan": 44, "setchan": 44, "resetconsol": 44, "echo": 44, "strip": 44, "putbot": 44, "putallbot": 44, "killdcc": 44, "botlist": 44, "islink": 44, "dccuse": 44, "dcclist": 44, "socklist": 44, "whom": 44, "chan": [44, 48], "getdccidl": 44, "getdccawai": 44, "setdccawai": 44, "dccdumpfil": 44, "numberlist": 44, "erasenot": 44, "listnot": 44, "storenot": 44, "from": 44, "msg": 44, "killassoc": 44, "compressfil": 44, "level": 44, "src": 44, "uncompressfil": 44, "iscompress": 44, "setpwd": 44, "getpwd": 44, "getfil": 44, "getdir": 44, "dccsend": 44, "ircnick": 44, "filesend": 44, "fileresend": 44, "setdesc": 44, "getdesc": 44, "setown": 44, "getown": 44, "setlink": 44, "getlink": 44, "getfileq": 44, "getfilesendtim": 44, "destin": 44, "getflag": 44, "setflag": 44, "miscellan": 44, "keyword": 44, "mask": 44, "proc": 44, "unbind": 44, "logfil": 44, "maskhost": 44, "masktyp": 44, "timer": 44, "minut": 44, "count": 44, "timernam": 44, "utim": 44, "second": 44, "killtim": 44, "killutim": 44, "unixtim": 44, "durat": 44, "strftime": 44, "formatstr": 44, "time": 44, "ctime": 44, "myip": 44, "rand": 44, "control": 44, "sendnot": 44, "unlink": 44, "string": [44, 47], "decrypt": 44, "base64": 44, "encpass": 44, "die": 44, "unam": 44, "dnslookup": 44, "hostnam": 44, "arg1": 44, "arg2": 44, "argn": 44, "md5": 44, "callev": 44, "event": 44, "traffic": 44, "unloadmodul": 44, "loadhelp": 44, "helpfil": 44, "unloadhelp": 44, "reloadhelp": 44, "rehash": 44, "stripcod": 44, "matchaddr": 44, "matchcidr": 44, "block": 44, "prefix": 44, "matchstr": 44, "pattern": 44, "rfcequal": 44, "string1": 44, "string2": 44, "istl": 44, "starttl": 44, "tlsstatu": 44, "global": 44, "variabl": [44, 47], "botnick": 44, "botnam": 44, "serveraddress": 44, "numvers": 44, "onlin": 44, "lastbind": 44, "isjup": 44, "handlen": 44, "configurearg": 44, "languag": 44, "return": 44, "procedur": 44, "tcp": 44, "match": 44, "charact": 44, "textfil": 45, "substitut": 45, "tip": 47, "renam": 47, "keep": 47, "self": 47, "modifi": 47, "default": 47, "modular": 47, "your": 47, "twcmd": 48, "cmd": 48, "userst": 48, "roomstat": 48, "twitchmod": 48, "twitchvip": 48, "ismod": 48, "isvip": 48, "disclaim": 49, "regist": 49, "web": 49, "ui": 49}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"About Eggdrop": [[0, "about-eggdrop"], [2, null]], "Boring legal stuff": [[1, "boring-legal-stuff"]], "Eggdrop, an open source IRC bot": [[2, "eggdrop-an-open-source-irc-bot"]], "Some things you can do with Eggdrop": [[2, "some-things-you-can-do-with-eggdrop"]], "How to get Eggdrop": [[2, "how-to-get-eggdrop"]], "How to install Eggdrop": [[2, "how-to-install-eggdrop"]], "Installation Pre-requisites": [[2, "installation-pre-requisites"]], "Installation": [[2, "installation"], [32, "installation"], [39, "installation"], [46, "installation"]], "Where to find more help": [[2, "where-to-find-more-help"]], "Installing Eggdrop": [[2, null], [3, "installing-eggdrop"]], "Using Eggdrop": [[2, null]], "Tutorials": [[2, null]], "Eggdrop Modules": [[2, null]], "Quick Startup": [[3, "quick-startup"], [4, "quick-startup"]], "Cygwin Requirements (Windows)": [[3, "cygwin-requirements-windows"]], "Modules": [[3, "modules"], [5, "modules"], [37, "modules"]], "README": [[4, "readme"]], "Notice": [[4, "notice"]], "What is Eggdrop?": [[4, "what-is-eggdrop"]], "How to Get Eggdrop": [[4, "how-to-get-eggdrop"]], "FTP": [[4, "ftp"]], "Git Development Snapshot": [[4, "git-development-snapshot"]], "Docker": [[4, "docker"]], "System Pre-Requisites": [[4, "system-pre-requisites"]], "Upgrading": [[4, "upgrading"]], "Command Line": [[4, "command-line"]], "Auto-starting Eggdrop": [[4, "auto-starting-eggdrop"]], "Documentation": [[4, "documentation"], [5, "documentation"]], "Obtaining Help": [[4, "obtaining-help"]], "Upgrading Eggdrop": [[5, "upgrading-eggdrop"]], "How to Upgrade": [[5, "how-to-upgrade"]], "Must-read changes for Eggdrop v1.9": [[5, "must-read-changes-for-eggdrop-v1-9"]], "Config file changes": [[5, "config-file-changes"]], "Scripts": [[5, "scripts"], [37, "scripts"], [46, "scripts"]], "Botnet": [[5, "botnet"], [46, "botnet"]], "Tcl Commands": [[5, "tcl-commands"]], "Modules included with Eggdrop": [[6, "modules-included-with-eggdrop"]], "Eggdrop Module Information": [[7, "eggdrop-module-information"]], "What are modules?": [[7, "what-are-modules"]], "How to install a module": [[7, "how-to-install-a-module"]], "Can I compile Eggdrop without dynamic modules? (Static compile)": [[7, "can-i-compile-eggdrop-without-dynamic-modules-static-compile"]], "Do I still need to \u2018loadmodule\u2019 modules?": [[7, "do-i-still-need-to-loadmodule-modules"]], "Eggdrop Bind Internals": [[8, "eggdrop-bind-internals"]], "Bind Table Creation": [[8, "bind-table-creation"]], "Stackable Binds: HT_STACKABLE": [[8, "stackable-binds-ht-stackable"]], "Tcl Binding": [[8, "tcl-binding"]], "Triggering the Bind": [[8, "triggering-the-bind"]], "Triggering any Bind": [[8, "triggering-any-bind"]], "C Binding": [[8, "c-binding"]], "C Handler": [[8, "c-handler"]], "Summary": [[8, "summary"]], "Assoc Module": [[9, "assoc-module"], [44, "assoc-module"]], "Blowfish Module": [[10, "blowfish-module"]], "Channels Module": [[11, "channels-module"]], "Compress Module": [[12, "compress-module"], [44, "compress-module"]], "Console Module": [[13, "console-module"]], "CTCP Module": [[14, "ctcp-module"]], "DNS Module": [[15, "dns-module"]], "Filesys Module": [[16, "filesys-module"], [44, "filesys-module"]], "Config file setup": [[16, "config-file-setup"]], "Partyline usage": [[16, "partyline-usage"]], ".files": [[16, "files"]], ".cancel [file] \u2026": [[16, "cancel-file-file"]], ".cd ": [[16, "cd-directory"]], ".cp ": [[16, "cp-source-dst"]], ".desc ": [[16, "desc-file-description"]], ".filestats [clear]": [[16, "filestats-user-clear"]], ".stats": [[16, "stats"]], ".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"]], ".pending": [[16, "pending"]], ".pwd": [[16, "pwd"]], ".quit": [[16, "quit"]], "rm [files] \u2026": [[16, "rm-file-files"]], ".rmdir ": [[16, "rmdir-dir"]], ".share [files] \u2026": [[16, "share-file-files"]], ".optimize": [[16, "optimize"]], ".unhide": [[16, "unhide"]], ".unshare [file] \u2026": [[16, "unshare-file-file"]], ".filesys module": [[16, "id1"]], "Ident Module": [[17, "ident"]], "IRC Module": [[18, "irc-module"]], "Notes Module": [[19, "notes-module"], [44, "notes-module"]], "PBKDF2 Module": [[20, "pbkdf2-module"]], "Seen Module": [[21, "seen-module"]], "Server Module": [[22, "server-module"]], "Share Module": [[23, "share-module"]], "Transfer Module": [[24, "transfer-module"]], "Twitch Module": [[25, "twitch-module"]], "Limitations": [[25, "limitations"]], "Tcl API": [[25, "tcl-api"]], "Partyline commands": [[25, "partyline-commands"]], "Uptime Module": [[26, "uptime-module"]], "Woobie Module": [[27, "woobie-module"]], "How to Write an Eggdrop Module": [[28, "how-to-write-an-eggdrop-module"]], "Module requirements": [[28, "module-requirements"]], "MODULE_start": [[28, "module-start"]], "MODULE_table": [[28, "module-table"]], "MODULE_close ()": [[28, "module-close"]], "MODULE_expmem": [[28, "module-expmem"]], "MODULE_report": [[28, "module-report"]], "Additional functions": [[28, "additional-functions"]], "What to do with a module?": [[28, "what-to-do-with-a-module"]], "Writing an Eggdrop Script": [[29, "writing-an-eggdrop-script"]], "Common First Steps": [[30, "common-first-steps"]], "Log on to the partyline": [[30, "log-on-to-the-partyline"]], "Common first steps": [[30, "id1"]], "Join a Channel": [[30, "join-a-channel"]], "Add a User": [[30, "add-a-user"]], "Add a Host to a User": [[30, "add-a-host-to-a-user"]], "Assign Permission Flags": [[30, "assign-permission-flags"]], "Configure Channel Settings": [[30, "configure-channel-settings"]], "Automatically restarting an Eggdrop": [[30, "automatically-restarting-an-eggdrop"]], "Crontab Method (Old)": [[30, "crontab-method-old"]], "Systemd Method (Newer Systems)": [[30, "systemd-method-newer-systems"]], "Authenticating with NickServ": [[30, "authenticating-with-nickserv"]], "Setting up SASL authentication": [[30, "setting-up-sasl-authentication"]], "Writing a Basic Eggdrop Module": [[31, "writing-a-basic-eggdrop-module"]], "Module Header": [[31, "module-header"]], "Required Code": [[31, "required-code"]], "Adding a Partyline Command": [[31, "adding-a-partyline-command"]], "Adding a Tcl Command": [[31, "adding-a-tcl-command"]], "Adding a Tcl Bind": [[31, "adding-a-tcl-bind"]], "Defining bind arguments": [[31, "defining-bind-arguments"]], "Calling the Bind": [[31, "calling-the-bind"]], "Exporting the Bind": [[31, "exporting-the-bind"]], "Setting Up Eggdrop": [[32, "setting-up-eggdrop"]], "Prerequisites": [[32, "prerequisites"]], "The super-short version": [[32, "the-super-short-version"]], "Getting the source": [[32, "getting-the-source"]], "History": [[32, "history"]], "Download locations": [[32, "download-locations"]], "Configuration": [[32, "configuration"]], "Editing the config file": [[32, "editing-the-config-file"], [49, "editing-the-config-file"]], "Starting the Eggdrop": [[32, "starting-the-eggdrop"]], "No show?": [[32, "no-show"]], "Enabling TLS Security on Eggdrop": [[33, "enabling-tls-security-on-eggdrop"]], "Pre-requisites": [[33, "pre-requisites"]], "Connecting to a TLS-enabled IRC server": [[33, "connecting-to-a-tls-enabled-irc-server"]], "Protecting Botnet Communications": [[33, "protecting-botnet-communications"]], "Configuration File Preparation - Generating Keys": [[33, "configuration-file-preparation-generating-keys"]], "Configuration File Preparation - Listening with TLS": [[33, "configuration-file-preparation-listening-with-tls"]], "Connecting to an Eggdrop listening with TLS": [[33, "connecting-to-an-eggdrop-listening-with-tls"]], "Additional Information": [[33, "additional-information"]], "Account tracking in Eggdrop": [[34, "account-tracking-in-eggdrop"]], "Required Server Capabilities": [[34, "required-server-capabilities"]], "extended-join": [[34, "extended-join"]], "account-notify": [[34, "account-notify"]], "WHOX": [[34, "whox"]], "Enabling Eggdrop Account Tracking": [[34, "enabling-eggdrop-account-tracking"]], "Checking Account-tracking Status": [[34, "checking-account-tracking-status"]], "Determining if a Server Supports Account Capabilities": [[34, "determining-if-a-server-supports-account-capabilities"]], "Best-Effort Account Tracking": [[34, "best-effort-account-tracking"]], "account-tag": [[34, "account-tag"]], "Using Accounts with Tcl Scripts": [[34, "using-accounts-with-tcl-scripts"]], "Bans, Invites, and Exempts": [[35, "bans-invites-and-exempts"]], "Botnet Sharing and Linking": [[36, "botnet-sharing-and-linking"]], "What is a botnet?": [[36, "what-is-a-botnet"]], "Terms": [[36, "terms"]], "Example bottree": [[36, "example-bottree"]], "Bot Flags": [[36, "bot-flags"]], "Adding and linking bots": [[36, "adding-and-linking-bots"]], "Secure (TLS) Links": [[36, "secure-tls-links"]], "Using botflags": [[36, "using-botflags"]], "Making bots share user records": [[36, "making-bots-share-user-records"]], "Using certificates to authenticate Eggdrops": [[36, "using-certificates-to-authenticate-eggdrops"]], "Eggdrop Core Settings": [[37, "eggdrop-core-settings"]], "Executable Path": [[37, "executable-path"]], "Basic Settings": [[37, "basic-settings"]], "Log Files": [[37, "log-files"]], "Console Settings": [[37, "console-settings"]], "File and Directory Settings": [[37, "file-and-directory-settings"]], "Botnet/Dcc/Telnet Settings": [[37, "botnet-dcc-telnet-settings"]], "Advanced Settings": [[37, "advanced-settings"]], "SSL Settings": [[37, "ssl-settings"]], "Eggdrop Features": [[38, "eggdrop-features"]], "IPv6 support": [[39, "ipv6-support"]], "About": [[39, "about"], [40, "about"], [46, "about"]], "Usage": [[39, "usage"], [40, "usage"], [43, "usage"], [46, "usage"]], "CTCP CHAT/CHAT4/CHAT6": [[39, "ctcp-chat-chat4-chat6"]], "Settings": [[39, "settings"]], "IRCv3 support": [[40, "ircv3-support"]], "Supported CAP capabilities": [[40, "supported-cap-capabilities"]], "The Party Line": [[41, "the-party-line"]], "Patching Eggdrop": [[42, "patching-eggdrop"]], "Submitting a patch via GitHub": [[42, "submitting-a-patch-via-github"]], "Encryption/Hashing": [[43, "encryption-hashing"]], "Background": [[43, "background"]], "Hybrid Configuration": [[43, "hybrid-configuration"]], "Enabling hybrid configuration": [[43, "enabling-hybrid-configuration"]], "Solo configuration": [[43, "solo-configuration"]], "Enabling solo configuration": [[43, "enabling-solo-configuration"]], "Tcl Interface": [[43, "tcl-interface"]], "Eggdrop Tcl Commands": [[44, "eggdrop-tcl-commands"]], "Output Commands": [[44, "output-commands"]], "putserv [options]": [[44, "putserv-text-options"]], "puthelp [options]": [[44, "puthelp-text-options"]], "putquick [options]": [[44, "putquick-text-options"]], "putnow [-oneline]": [[44, "putnow-text-oneline"]], "putkick [reason]": [[44, "putkick-channel-nick-nick-reason"]], "putlog ": [[44, "putlog-text"]], "putcmdlog ": [[44, "putcmdlog-text"]], "putxferlog ": [[44, "putxferlog-text"]], "putloglev ": [[44, "putloglev-flag-s-channel-text"]], "dumpfile ": [[44, "dumpfile-nick-filename"]], "queuesize [queue]": [[44, "queuesize-queue"]], "clearqueue ": [[44, "clearqueue-queue"]], "cap [arg]": [[44, "cap-ls-values-req-enabled-raw-arg"]], "tagmsg ": [[44, "tagmsg-tags-target"]], "server add [[+]port [password]]": [[44, "server-add-ip-host-port-password"]], "server remove [[+]port]": [[44, "server-remove-ip-host-port"]], "server list": [[44, "server-list"]], "User Record Manipulation Commands": [[44, "user-record-manipulation-commands"]], "countusers": [[44, "countusers"]], "validuser ": [[44, "validuser-handle"]], "finduser [-account] ": [[44, "finduser-account-value"]], "userlist [flags]": [[44, "userlist-flags"]], "passwdok ": [[44, "passwdok-handle-pass"]], "getuser [entry-type] [extra info]": [[44, "getuser-handle-entry-type-extra-info"]], "setuser [extra info]": [[44, "setuser-handle-entry-type-extra-info"]], "chhandle ": [[44, "chhandle-old-handle-new-handle"]], "chattr [changes [channel]]": [[44, "chattr-handle-changes-channel"]], "botattr [changes [channel]]": [[44, "botattr-handle-changes-channel"]], "matchattr [channel]": [[44, "matchattr-handle-flags-channel"]], "adduser [hostmask]": [[44, "adduser-handle-hostmask"]], "addbot
    [botport [userport]]": [[44, "addbot-handle-address-botport-userport"]], "deluser ": [[44, "deluser-handle"]], "delhost ": [[44, "delhost-handle-hostmask"]], "addchanrec ": [[44, "addchanrec-handle-channel"]], "delchanrec ": [[44, "delchanrec-handle-channel"]], "haschanrec ": [[44, "haschanrec-handle-channel"]], "getchaninfo ": [[44, "getchaninfo-handle-channel"]], "setchaninfo ": [[44, "setchaninfo-handle-channel-info"]], "newchanban [lifetime] [options]": [[44, "newchanban-channel-ban-creator-comment-lifetime-options"]], "newban [lifetime] [options]": [[44, "newban-ban-creator-comment-lifetime-options"]], "newchanexempt [lifetime] [options]": [[44, "newchanexempt-channel-exempt-creator-comment-lifetime-options"]], "newexempt [lifetime] [options]": [[44, "newexempt-exempt-creator-comment-lifetime-options"]], "newchaninvite [lifetime] [options]": [[44, "newchaninvite-channel-invite-creator-comment-lifetime-options"]], "newinvite [lifetime] [options]": [[44, "newinvite-invite-creator-comment-lifetime-options"]], "stickban [channel]": [[44, "stickban-banmask-channel"]], "unstickban [channel]": [[44, "unstickban-banmask-channel"]], "stickexempt [channel]": [[44, "stickexempt-exemptmask-channel"]], "unstickexempt [channel]": [[44, "unstickexempt-exemptmask-channel"]], "stickinvite [channel]": [[44, "stickinvite-invitemask-channel"]], "unstickinvite [channel]": [[44, "unstickinvite-invitemask-channel"]], "killchanban ": [[44, "killchanban-channel-ban"]], "killban ": [[44, "killban-ban"]], "killchanexempt ": [[44, "killchanexempt-channel-exempt"]], "killexempt ": [[44, "killexempt-exempt"]], "killchaninvite ": [[44, "killchaninvite-channel-invite"]], "killinvite ": [[44, "killinvite-invite"]], "ischanjuped ": [[44, "ischanjuped-channel"]], "isban [channel [-channel]]": [[44, "isban-ban-channel-channel"]], "ispermban [channel [-channel]]": [[44, "ispermban-ban-channel-channel"]], "isexempt [channel [-channel]]": [[44, "isexempt-exempt-channel-channel"]], "ispermexempt [channel [-channel]]": [[44, "ispermexempt-exempt-channel-channel"]], "isinvite [channel [-channel]]": [[44, "isinvite-invite-channel-channel"]], "isperminvite [channel [-channel]]": [[44, "isperminvite-invite-channel-channel"]], "isbansticky [channel [-channel]]": [[44, "isbansticky-ban-channel-channel"]], "isexemptsticky [channel [-channel]]": [[44, "isexemptsticky-exempt-channel-channel"]], "isinvitesticky [channel [-channel]]": [[44, "isinvitesticky-invite-channel-channel"]], "matchban [channel]": [[44, "matchban-nick-user-host-channel"]], "matchexempt [channel]": [[44, "matchexempt-nick-user-host-channel"]], "matchinvite [channel]": [[44, "matchinvite-nick-user-host-channel"]], "banlist [channel]": [[44, "banlist-channel"]], "exemptlist [channel]": [[44, "exemptlist-channel"]], "invitelist [channel]": [[44, "invitelist-channel"]], "newignore [lifetime]": [[44, "newignore-hostmask-creator-comment-lifetime"]], "killignore ": [[44, "killignore-hostmask"]], "ignorelist": [[44, "ignorelist"]], "isignore ": [[44, "isignore-hostmask"]], "save": [[44, "save"]], "reload": [[44, "reload"]], "backup": [[44, "backup"]], "getting-users": [[44, "getting-users"]], "Channel Commands": [[44, "channel-commands"]], "channel add [option-list]": [[44, "channel-add-name-option-list"]], "channel set ": [[44, "channel-set-name-options"]], "channel info ": [[44, "channel-info-name"]], "channel get [setting]": [[44, "channel-get-name-setting"]], "channel remove ": [[44, "channel-remove-name"]], "savechannels": [[44, "savechannels"]], "loadchannels": [[44, "loadchannels"]], "channels": [[44, "channels"]], "channame2dname ": [[44, "channame2dname-channel-name"]], "chandname2name ": [[44, "chandname2name-channel-dname"]], "isbotnick ": [[44, "isbotnick-nick"]], "botisop [channel]": [[44, "botisop-channel"]], "botishalfop [channel]": [[44, "botishalfop-channel"]], "botisvoice [channel]": [[44, "botisvoice-channel"]], "botonchan [channel]": [[44, "botonchan-channel"]], "isop [channel]": [[44, "isop-nickname-channel"]], "ishalfop [channel]": [[44, "ishalfop-nickname-channel"]], "wasop ": [[44, "wasop-nickname-channel"]], "washalfop ": [[44, "washalfop-nickname-channel"]], "isvoice [channel]": [[44, "isvoice-nickname-channel"]], "isidentified [channel]": [[44, "isidentified-nickname-channel"]], "isaway [channel]": [[44, "isaway-nickname-channel"]], "isircbot [channel]": [[44, "isircbot-nickname-channel"]], "onchan [channel]": [[44, "onchan-nickname-channel"]], "monitor [nickname]": [[44, "monitor-command-nickname"]], "accounttracking": [[44, "accounttracking"]], "getaccount [channel]": [[44, "getaccount-nickname-channel"]], "nick2hand [channel]": [[44, "nick2hand-nickname-channel"]], "account2nicks [channel]": [[44, "account2nicks-handle-channel"]], "hand2nick [channel]": [[44, "hand2nick-handle-channel"]], "hand2nicks [channel]": [[44, "hand2nicks-handle-channel"]], "handonchan [channel]": [[44, "handonchan-handle-channel"]], "ischanban ": [[44, "ischanban-ban-channel"]], "ischanexempt ": [[44, "ischanexempt-exempt-channel"]], "ischaninvite ": [[44, "ischaninvite-invite-channel"]], "chanbans ": [[44, "chanbans-channel"]], "chanexempts ": [[44, "chanexempts-channel"]], "chaninvites ": [[44, "chaninvites-channel"]], "resetbans ": [[44, "resetbans-channel"]], "resetexempts ": [[44, "resetexempts-channel"]], "resetinvites ": [[44, "resetinvites-channel"]], "resetchanidle [nick] ": [[44, "resetchanidle-nick-channel"]], "resetchanjoin [nick] ": [[44, "resetchanjoin-nick-channel"]], "resetchan [flags]": [[44, "resetchan-channel-flags"]], "refreshchan [flags]": [[44, "refreshchan-channel-flags"]], "getchanhost [channel]": [[44, "getchanhost-nickname-channel"]], "getchanjoin ": [[44, "getchanjoin-nickname-channel"]], "onchansplit [channel]": [[44, "onchansplit-nick-channel"]], "chanlist [flags][<&|>chanflags]": [[44, "chanlist-channel-flags-chanflags"]], "getchanidle ": [[44, "getchanidle-nickname-channel"]], "getchanmode ": [[44, "getchanmode-channel"]], "jump [server [[+]port [password]]]": [[44, "jump-server-port-password"]], "pushmode [arg]": [[44, "pushmode-channel-mode-arg"]], "flushmode ": [[44, "flushmode-channel"]], "topic ": [[44, "topic-channel"]], "validchan ": [[44, "validchan-channel"]], "isdynamic ": [[44, "isdynamic-channel"]], "setudef ": [[44, "setudef-flag-int-str-name"]], "renudef ": [[44, "renudef-flag-int-str-oldname-newname"]], "deludef ": [[44, "deludef-flag-int-str-name"]], "getudefs [flag/int/str]": [[44, "getudefs-flag-int-str"]], "chansettype ": [[44, "chansettype-setting"]], "isupport get [key]": [[44, "isupport-get-key"]], "isupport isset ": [[44, "isupport-isset-key"]], "DCC Commands": [[44, "dcc-commands"]], "putdcc [-raw]": [[44, "putdcc-idx-text-raw"]], "dccbroadcast ": [[44, "dccbroadcast-message"]], "dccputchan ": [[44, "dccputchan-channel-message"]], "boot [reason]": [[44, "boot-user-bot-reason"]], "dccsimul ": [[44, "dccsimul-idx-text"]], "hand2idx ": [[44, "hand2idx-handle"]], "idx2hand ": [[44, "idx2hand-idx"]], "valididx ": [[44, "valididx-idx"]], "getchan ": [[44, "getchan-idx"]], "setchan ": [[44, "setchan-idx-channel"]], "console [channel] [console-modes]": [[44, "console-idx-channel-console-modes"]], "resetconsole ": [[44, "resetconsole-idx"]], "echo [status]": [[44, "echo-idx-status"]], "strip [+/-strip-flags]": [[44, "strip-idx-strip-flags"]], "putbot ": [[44, "putbot-bot-nick-message"]], "putallbots ": [[44, "putallbots-message"]], "killdcc ": [[44, "killdcc-idx"]], "bots": [[44, "bots"]], "botlist": [[44, "botlist"]], "islinked ": [[44, "islinked-bot"]], "dccused": [[44, "dccused"]], "dcclist [type]": [[44, "dcclist-type"]], "socklist [type]": [[44, "socklist-type"]], "whom ": [[44, "whom-chan"]], "getdccidle ": [[44, "getdccidle-idx"]], "getdccaway ": [[44, "getdccaway-idx"]], "setdccaway ": [[44, "setdccaway-idx-message"]], "connect <[+]port>": [[44, "connect-host-port"]], "listen [ip] [options [flag]]": [[44, "listen-ip-port-type-options-flag"]], "dccdumpfile ": [[44, "dccdumpfile-idx-filename"]], "notes [numberlist]": [[44, "notes-user-numberlist"]], "erasenotes ": [[44, "erasenotes-user-numberlist"]], "listnotes ": [[44, "listnotes-user-numberlist"]], "storenote ": [[44, "storenote-from-to-msg-idx"]], "assoc [name]": [[44, "assoc-chan-name"]], "killassoc ": [[44, "killassoc-chan"]], "compressfile [-level ] [target-file]": [[44, "compressfile-level-level-src-file-target-file"]], "and": [[44, "and"]], "uncompressfile [target-file]": [[44, "uncompressfile-src-file-target-file"]], "iscompressed ": [[44, "iscompressed-filename"]], "setpwd ": [[44, "setpwd-idx-dir"]], "getpwd ": [[44, "getpwd-idx"]], "getfiles ": [[44, "getfiles-dir"]], "getdirs ": [[44, "getdirs-dir"]], "dccsend ": [[44, "dccsend-filename-ircnick"]], "filesend [ircnick]": [[44, "filesend-idx-filename-ircnick"]], "fileresend [ircnick]": [[44, "fileresend-idx-filename-ircnick"]], "setdesc ": [[44, "setdesc-dir-file-desc"]], "getdesc ": [[44, "getdesc-dir-file"]], "setowner ": [[44, "setowner-dir-file-handle"]], "getowner ": [[44, "getowner-dir-file"]], "setlink ": [[44, "setlink-dir-file-link"]], "getlink ": [[44, "getlink-dir-file"]], "getfileq ": [[44, "getfileq-handle"]], "getfilesendtime ": [[44, "getfilesendtime-idx"]], "mkdir [ [channel]]": [[44, "mkdir-directory-required-flags-channel"]], "rmdir ": [[44, "rmdir-directory"]], "mv ": [[44, "mv-file-destination"]], "cp ": [[44, "cp-file-destination"]], "getflags ": [[44, "getflags-dir"]], "setflags [ [channel]]": [[44, "setflags-dir-flags-channel"]], "Miscellaneous Commands": [[44, "miscellaneous-commands"]], "bind [proc-name]": [[44, "bind-type-flags-keyword-mask-proc-name"]], "unbind ": [[44, "unbind-type-flags-keyword-mask-proc-name"]], "binds [type/mask]": [[44, "binds-type-mask"]], "logfile [ ]": [[44, "logfile-modes-channel-filename"]], "maskhost [masktype]": [[44, "maskhost-nick-user-host-masktype"]], "timer [count [timerName]]": [[44, "timer-minutes-tcl-command-count-timername"]], "utimer [count [timerName]]": [[44, "utimer-seconds-tcl-command-count-timername"]], "timers": [[44, "timers"]], "utimers": [[44, "utimers"]], "killtimer ": [[44, "killtimer-timername"]], "killutimer ": [[44, "killutimer-timername"]], "unixtime": [[44, "unixtime"]], "duration ": [[44, "duration-seconds"]], "strftime [time]": [[44, "strftime-formatstring-time"]], "ctime ": [[44, "ctime-unixtime"]], "myip": [[44, "myip"]], "rand ": [[44, "rand-limit"]], "control ": [[44, "control-idx-command"]], "sendnote ": [[44, "sendnote-from-to-bot-message"]], "link [via-bot] ": [[44, "link-via-bot-bot"]], "unlink [comment]": [[44, "unlink-bot-comment"]], "encrypt ": [[44, "encrypt-key-string"]], "decrypt ": [[44, "decrypt-key-encrypted-base64-string"]], "encpass ": [[44, "encpass-password"]], "die [reason]": [[44, "die-reason"]], "unames": [[44, "unames"]], "dnslookup [[arg1] [arg2] \u2026 [argN]]": [[44, "dnslookup-ip-address-hostname-proc-arg1-arg2-argn"]], "md5 ": [[44, "md5-string"]], "callevent ": [[44, "callevent-event"]], "traffic": [[44, "traffic"]], "modules": [[44, "modules"]], "loadmodule ": [[44, "loadmodule-module"]], "unloadmodule ": [[44, "unloadmodule-module"]], "loadhelp ": [[44, "loadhelp-helpfile-name"]], "unloadhelp ": [[44, "unloadhelp-helpfile-name"]], "reloadhelp": [[44, "reloadhelp"]], "restart": [[44, "restart"]], "rehash": [[44, "rehash"]], "stripcodes ": [[44, "stripcodes-strip-flags-string"]], "matchaddr
    ": [[44, "matchaddr-hostmask-address"]], "matchcidr
    ": [[44, "matchcidr-block-address-prefix"]], "matchstr ": [[44, "matchstr-pattern-string"]], "rfcequal ": [[44, "rfcequal-string1-string2"]], "status [type]": [[44, "status-type"]], "istls ": [[44, "istls-idx"]], "starttls ": [[44, "starttls-idx"]], "tlsstatus ": [[44, "tlsstatus-idx"]], "Global Variables": [[44, "global-variables"]], "botnick": [[44, "botnick"]], "botname": [[44, "botname"]], "server": [[44, "server"]], "serveraddress": [[44, "serveraddress"]], "version": [[44, "version"]], "numversion*": [[44, "numversion"]], "uptime": [[44, "uptime"]], "server-online": [[44, "server-online"]], "lastbind": [[44, "lastbind"]], "isjuped": [[44, "isjuped"]], "handlen": [[44, "handlen"]], "config": [[44, "config"]], "configureargs": [[44, "configureargs"]], "language": [[44, "language"]], "Binds": [[44, "binds"], [48, "binds"]], "Stackable binds": [[44, "stackable-binds"]], "Removing a bind": [[44, "removing-a-bind"]], "Flag Masks": [[44, "flag-masks"]], "Bind Types": [[44, "bind-types"], [48, "bind-types"]], "Return Values": [[44, "return-values"]], "Control Procedures": [[44, "control-procedures"]], "TCP Connections": [[44, "tcp-connections"]], "Match Characters": [[44, "match-characters"]], "Textfile Substitutions": [[45, "textfile-substitutions"]], "TLS support": [[46, "tls-support"]], "IRC": [[46, "irc"]], "Secure DCC": [[46, "secure-dcc"]], "Keys, certificates and authentication": [[46, "keys-certificates-and-authentication"]], "SSL/TLS Settings": [[46, "ssl-tls-settings"]], "Advanced Tips": [[47, "advanced-tips"]], "Renaming commands": [[47, "renaming-commands"]], "Keeping Logs": [[47, "keeping-logs"]], "Self-logging": [[47, "self-logging"]], "Modifying Default Strings": [[47, "modifying-default-strings"]], "Modularizing Your Config File": [[47, "modularizing-your-config-file"]], "Variables in Your Config": [[47, "variables-in-your-config"]], "Eggdrop Twitch Tcl Commands": [[48, "eggdrop-twitch-tcl-commands"]], "Commands": [[48, "commands"]], "twcmd [arg]": [[48, "twcmd-chan-cmd-arg"]], "userstate ": [[48, "userstate-channel"]], "roomstate ": [[48, "roomstate-channel"]], "twitchmods ": [[48, "twitchmods-channel"]], "twitchvips ": [[48, "twitchvips-channel"]], "ismod [channel]": [[48, "ismod-nick-channel"]], "isvip [channel]": [[48, "isvip-nick-channel"]], "Flags": [[48, "flags"]], "Twitch": [[49, "twitch"]], "Disclaimer": [[49, "disclaimer"]], "Registering with Twitch": [[49, "registering-with-twitch"]], "Twitch web UI functions": [[49, "twitch-web-ui-functions"]], "Twitch IRC limitations": [[49, "twitch-irc-limitations"]], "Users and Flags": [[50, "users-and-flags"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["about/about", "about/legal", "index", "install/install", "install/readme", "install/upgrading", "modules/included", "modules/index", "modules/internals", "modules/mod/assoc", "modules/mod/blowfish", "modules/mod/channels", "modules/mod/compress", "modules/mod/console", "modules/mod/ctcp", "modules/mod/dns", "modules/mod/filesys", "modules/mod/ident", "modules/mod/irc", "modules/mod/notes", "modules/mod/pbkdf2", "modules/mod/python", "modules/mod/seen", "modules/mod/server", "modules/mod/share", "modules/mod/transfer", "modules/mod/twitch", "modules/mod/uptime", "modules/mod/woobie", "modules/writing", "tutorials/firstscript", "tutorials/firststeps", "tutorials/module", "tutorials/setup", "tutorials/tlssetup", "using/accounts", "using/autoscripts", "using/bans", "using/botnet", "using/core", "using/features", "using/ipv6", "using/ircv3", "using/partyline", "using/patch", "using/pbkdf2info", "using/tcl-commands", "using/text-sub", "using/tls", "using/tricks", "using/twitch-tcl-commands", "using/twitchinfo", "using/users"], "filenames": ["about/about.rst", "about/legal.rst", "index.rst", "install/install.rst", "install/readme.rst", "install/upgrading.rst", "modules/included.rst", "modules/index.rst", "modules/internals.rst", "modules/mod/assoc.rst", "modules/mod/blowfish.rst", "modules/mod/channels.rst", "modules/mod/compress.rst", "modules/mod/console.rst", "modules/mod/ctcp.rst", "modules/mod/dns.rst", "modules/mod/filesys.rst", "modules/mod/ident.rst", "modules/mod/irc.rst", "modules/mod/notes.rst", "modules/mod/pbkdf2.rst", "modules/mod/python.rst", "modules/mod/seen.rst", "modules/mod/server.rst", "modules/mod/share.rst", "modules/mod/transfer.rst", "modules/mod/twitch.rst", "modules/mod/uptime.rst", "modules/mod/woobie.rst", "modules/writing.rst", "tutorials/firstscript.rst", "tutorials/firststeps.rst", "tutorials/module.rst", "tutorials/setup.rst", "tutorials/tlssetup.rst", "using/accounts.rst", "using/autoscripts.rst", "using/bans.rst", "using/botnet.rst", "using/core.rst", "using/features.rst", "using/ipv6.rst", "using/ircv3.rst", "using/partyline.rst", "using/patch.rst", "using/pbkdf2info.rst", "using/tcl-commands.rst", "using/text-sub.rst", "using/tls.rst", "using/tricks.rst", "using/twitch-tcl-commands.rst", "using/twitchinfo.rst", "using/users.rst"], "titles": ["About Eggdrop", "Boring legal stuff", "Eggdrop, an open source IRC bot", "Installing Eggdrop", "README", "Upgrading Eggdrop", "Modules included with Eggdrop", "Eggdrop Module Information", "Eggdrop Bind Internals", "Assoc Module", "Blowfish Module", "Channels Module", "Compress Module", "Console Module", "CTCP Module", "DNS Module", "Filesys Module", "Ident Module", "IRC Module", "Notes Module", "PBKDF2 Module", "Python Module", "Seen Module", "Server Module", "Share Module", "Transfer Module", "Twitch Module", "Uptime Module", "Woobie Module", "How to Write an Eggdrop Module", "Writing an Eggdrop Script", "Common First Steps", "Writing a Basic Eggdrop Module", "Setting Up Eggdrop", "Enabling TLS Security on Eggdrop", "Account tracking in Eggdrop", "Eggdrop Autoscripts", "Bans, Invites, and Exempts", "Botnet Sharing and Linking", "Eggdrop Core Settings", "Eggdrop Features", "IPv6 support", "IRCv3 support", "The Party Line", "Patching Eggdrop", "Encryption/Hashing", "Eggdrop Tcl Commands", "Textfile Substitutions", "TLS support", "Advanced Tips", "Eggdrop Twitch Tcl Commands", "Twitch", "Users and Flags"], "terms": {"current": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "version": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "9": [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "5": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "last": [0, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 33, 37, 39, 41, 42, 43, 46, 47, 48, 49, 50, 52], "revis": [0, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 37, 39, 41, 42, 43, 46, 47, 48, 49, 50, 52], "juli": 0, "27": [0, 12, 17, 24, 42], "2010": [0, 11, 15, 23, 39, 41, 42, 47, 48], "wa": [0, 2, 6, 8, 20, 26, 30, 32, 33, 36, 38, 42, 45, 46, 48, 50, 51], "creat": [0, 3, 4, 8, 16, 17, 21, 24, 29, 30, 31, 32, 33, 36, 37, 39, 44, 45, 46, 48, 49, 51], "around": [0, 4, 26, 34, 41, 46, 51], "decemb": [0, 28, 40, 43], "1993": [0, 40], "help": [0, 3, 8, 14, 23, 29, 30, 31, 32, 33, 36, 37, 38, 39, 41, 43, 46, 47, 52], "stop": [0, 11, 16, 18, 29, 31, 46, 50], "incess": 0, "war": 0, "gayteen": 0, "It": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 16, 18, 23, 27, 29, 31, 33, 35, 36, 38, 39, 40, 41, 43, 46, 50, 51], "spawn": 0, "from": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 16, 17, 18, 19, 20, 21, 23, 24, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 43, 45, 47, 48, 49, 50, 51, 52], "anoth": [0, 8, 11, 16, 18, 19, 23, 24, 29, 33, 36, 38, 39, 46, 47, 50], "bot": [0, 1, 3, 4, 5, 6, 7, 8, 11, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 33, 34, 37, 39, 40, 41, 42, 43, 45, 47, 48, 49, 50, 51, 52], "process": [0, 3, 4, 5, 12, 16, 17, 25, 31, 33, 36, 38, 45, 46, 48], "being": [0, 4, 11, 16, 18, 23, 34, 35, 36, 40, 41, 46, 50], "written": [0, 21, 29, 32, 33, 36, 46, 51], "time": [0, 3, 4, 6, 11, 15, 16, 17, 18, 20, 24, 25, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 45, 47, 48, 49, 51], "call": [0, 3, 4, 8, 21, 29, 30, 31, 36, 38, 39, 46, 50], "unrest": 0, "The": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 14, 15, 16, 17, 20, 21, 23, 24, 25, 26, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 42, 45, 46, 48, 49, 50, 51, 52], "purpos": [0, 1, 6, 8, 27, 28, 32, 38, 39, 46], "answer": [0, 7, 14, 17, 23, 30], "request": [0, 4, 5, 7, 11, 14, 16, 18, 23, 33, 35, 37, 39, 41, 42, 44, 46, 48, 49, 51], "other": [0, 1, 4, 6, 8, 10, 11, 15, 16, 17, 18, 19, 20, 23, 24, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52], "first": [0, 2, 4, 5, 6, 8, 16, 20, 23, 29, 30, 32, 33, 34, 38, 39, 45, 46, 48, 49, 50], "public": [0, 1, 4, 30, 31, 32, 34, 39, 46, 48, 49, 52], "releas": [0, 1, 33, 45, 46], "0": [0, 4, 8, 11, 13, 14, 16, 17, 18, 19, 20, 21, 23, 24, 25, 29, 30, 31, 32, 33, 36, 38, 39, 41, 42, 43, 45, 46, 48, 49, 50], "6": [0, 5, 8, 11, 18, 31, 33, 36, 39, 41, 46], "sinc": [0, 3, 5, 18, 33, 36, 38, 39, 40, 41, 46, 48, 49], "ha": [0, 1, 2, 4, 5, 6, 8, 11, 15, 16, 18, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45, 46, 48, 50, 51, 52], "grown": 0, "what": [0, 1, 2, 5, 6, 8, 11, 16, 18, 23, 27, 30, 31, 32, 33, 36, 39, 42, 43, 45, 46], "you": [0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "have": [0, 1, 3, 4, 5, 6, 8, 10, 11, 13, 16, 18, 19, 20, 21, 23, 24, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 48, 49, 50, 51, 52], "befor": [0, 4, 8, 11, 15, 17, 18, 19, 23, 24, 25, 29, 31, 32, 33, 35, 36, 38, 39, 46, 51], "i": [0, 1, 2, 3, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "world": [0, 2, 4, 21, 34, 39], "": [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 13, 16, 17, 18, 22, 23, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 41, 43, 45, 47, 48, 49, 50, 51, 52], "most": [0, 2, 4, 5, 17, 18, 23, 29, 30, 31, 33, 34, 39, 40, 43, 46, 50, 51], "popular": [0, 4, 5, 33, 39], "internet": [0, 4, 46, 48], "relai": [0, 4, 38, 39], "chat": [0, 2, 4, 6, 8, 14, 23, 31, 33, 38, 39, 40, 43, 46, 48, 50, 51], "irc": [0, 4, 6, 8, 16, 17, 23, 26, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 42, 43, 46, 47, 49, 50, 52], "freeli": [0, 4, 21], "distribut": [0, 1, 4, 32, 33], "under": [0, 4, 32, 33, 40, 46], "gnu": [0, 1, 3, 4, 8, 12, 32], "gener": [0, 1, 3, 4, 8, 20, 26, 30, 31, 32, 33, 42, 45, 46, 48, 51], "licens": [0, 1, 4, 32], "gpl": [0, 4, 32], "featur": [0, 2, 4, 7, 11, 18, 23, 24, 31, 33, 35, 39, 41, 42, 44, 46, 48, 51, 52], "rich": [0, 4, 33], "program": [0, 2, 4, 17, 31, 32, 33], "design": [0, 2, 4, 6, 20, 36, 42, 50], "easili": [0, 1, 2, 4, 30, 40, 46], "us": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 23, 24, 25, 29, 30, 31, 32, 33, 34, 36, 37, 39, 40, 41, 43, 45, 46, 47, 48, 49, 50, 51, 52], "expand": [0, 2, 4], "upon": [0, 4, 50, 52], "both": [0, 4, 11, 23, 25, 34, 35, 38, 41, 45, 46, 48], "novic": [0, 4], "advanc": [0, 2, 4, 6, 22, 30, 40], "user": [0, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 32, 33, 34, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51], "varieti": [0, 4], "hardwar": [0, 4], "softwar": [0, 1, 2, 4, 32], "platform": [0, 4, 26, 46, 51], "an": [0, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 17, 18, 20, 23, 25, 26, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51], "sit": [0, 4, 39, 45], "channel": [0, 2, 4, 5, 6, 8, 9, 13, 18, 22, 23, 24, 26, 29, 30, 33, 35, 36, 37, 38, 39, 40, 43, 47, 49, 51, 52], "perform": [0, 3, 4, 5, 8, 11, 32, 33, 46, 52], "autom": [0, 2, 4], "task": [0, 2, 4, 8, 38], "while": [0, 4, 5, 11, 17, 26, 33, 35, 36, 37, 39, 43, 45, 46, 51], "look": [0, 4, 5, 6, 8, 11, 21, 22, 27, 28, 30, 31, 32, 34, 35, 39, 40, 45, 46, 48, 51], "just": [0, 3, 4, 5, 6, 8, 15, 16, 18, 20, 21, 24, 29, 31, 32, 33, 35, 36, 38, 39, 43, 45, 46, 49, 50, 51], "like": [0, 1, 4, 8, 10, 11, 14, 16, 18, 20, 21, 29, 30, 31, 32, 33, 36, 39, 40, 41, 43, 44, 45, 46, 48, 50, 51, 52], "normal": [0, 4, 6, 14, 15, 16, 17, 21, 23, 29, 30, 34, 36, 39, 46, 48, 49, 50, 51], "some": [0, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 29, 32, 33, 35, 37, 38, 39, 40, 41, 42, 46, 48, 49, 51, 52], "function": [0, 1, 2, 4, 6, 7, 8, 20, 21, 26, 32, 33, 38, 39, 41, 45, 46, 49, 50], "includ": [0, 2, 3, 4, 7, 8, 18, 21, 27, 29, 32, 33, 34, 37, 39, 40, 41, 45, 46, 48, 50, 51], "protect": [0, 2, 3, 4, 11, 20, 23, 31, 33, 37, 39, 45, 46, 48, 52], "abus": [0, 2, 4], "allow": [0, 3, 4, 5, 6, 7, 11, 12, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 45, 46, 48, 49, 51], "privileg": [0, 4, 17, 52], "gain": [0, 4, 45, 52], "op": [0, 2, 4, 11, 18, 26, 35, 38, 40, 45, 46, 51, 52], "voic": [0, 2, 4, 11, 31, 46, 52], "statu": [0, 2, 4, 11, 26, 29, 32, 34, 39, 49, 50, 51], "log": [0, 2, 4, 6, 11, 20, 26, 29, 32, 33, 35, 44, 45, 46, 51], "event": [0, 4, 26, 29, 32, 35, 38, 39, 50, 51], "provid": [0, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 29, 31, 32, 33, 36, 39, 41, 42, 44, 46, 48, 50, 51], "inform": [0, 2, 3, 4, 5, 6, 8, 11, 16, 21, 27, 29, 30, 31, 32, 33, 35, 36, 38, 39, 41, 42, 46, 48], "host": [0, 2, 4, 11, 17, 23, 26, 30, 36, 37, 38, 39, 48, 50, 52], "game": [0, 2, 4, 26, 51], "etc": [0, 2, 4, 8, 11, 18, 21, 26, 29, 33, 35, 36, 38, 39, 40, 46, 49, 52], "One": [0, 4, 30, 35, 46], "make": [0, 2, 3, 4, 5, 6, 7, 11, 14, 16, 20, 23, 24, 26, 29, 30, 31, 33, 34, 36, 39, 41, 42, 44, 46, 48, 49, 51], "stand": [0, 4, 33], "out": [0, 3, 4, 8, 25, 27, 30, 31, 32, 33, 38, 39, 43, 45, 46, 48], "modul": [0, 4, 8, 33, 35, 38, 40, 45, 51], "tcl": [0, 1, 2, 3, 4, 6, 11, 12, 23, 29, 30, 33, 37, 39, 40, 41, 48, 49, 51], "script": [0, 2, 3, 4, 6, 7, 8, 11, 23, 31, 32, 33, 37, 40, 41, 46, 49, 50, 51, 52], "support": [0, 2, 3, 4, 5, 6, 9, 11, 12, 15, 17, 18, 19, 23, 24, 25, 31, 33, 34, 37, 39, 40, 46, 49, 51], "With": [0, 4, 6, 16, 32, 38, 39, 45, 46, 48], "can": [0, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52], "almost": [0, 4, 33, 37, 52], "ani": [0, 1, 2, 3, 4, 5, 7, 13, 16, 17, 18, 19, 23, 24, 26, 29, 30, 31, 32, 33, 36, 37, 39, 40, 43, 45, 46, 48, 50, 51, 52], "want": [0, 3, 4, 6, 8, 11, 13, 15, 16, 18, 19, 23, 29, 30, 31, 32, 33, 38, 39, 41, 46, 48, 49], "thei": [0, 3, 4, 5, 7, 8, 11, 13, 14, 18, 19, 21, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 45, 46, 48, 50], "do": [0, 4, 6, 8, 11, 13, 16, 17, 18, 20, 23, 27, 30, 31, 32, 33, 35, 36, 38, 39, 40, 46, 47, 49, 50, 51], "anyth": [0, 4, 16, 30, 31, 32, 33, 36, 38, 39, 43, 46, 50], "prevent": [0, 4, 11, 18, 19, 26, 31, 33, 36, 38, 41, 46, 51], "flood": [0, 4, 11, 14, 19, 23, 36, 38, 39, 40, 46, 52], "greet": [0, 2, 4, 11, 21, 30, 35], "ban": [0, 2, 4, 11, 18, 26, 38, 39, 40, 51, 52], "advertis": [0, 4, 46], "also": [0, 2, 3, 4, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 43, 45, 46, 47, 48, 49, 50, 51, 52], "link": [0, 2, 3, 4, 5, 6, 7, 16, 24, 25, 29, 32, 39, 40, 42, 45, 48, 49], "multipl": [0, 2, 4, 8, 17, 30, 32, 33, 38, 39, 40, 46, 50], "togeth": [0, 2, 4, 23, 30, 38, 39, 40, 42, 46], "form": [0, 4, 29, 30, 46, 47], "botnet": [0, 2, 3, 4, 6, 9, 11, 13, 16, 23, 27, 33, 40, 41, 43, 45, 46, 49, 52], "thi": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52], "each": [0, 4, 6, 11, 16, 19, 21, 25, 30, 31, 33, 35, 36, 38, 39, 40, 43, 46, 49, 50, 52], "secur": [0, 2, 4, 10, 20, 31, 33, 39, 40, 45, 46], "control": [0, 2, 4, 18, 23, 30, 31, 38, 39, 40, 48, 51, 52], "effici": [0, 4, 33, 38, 39, 40], "even": [0, 4, 7, 16, 18, 29, 32, 33, 37, 38, 39, 40, 43, 46, 51], "across": [0, 4, 38, 42, 44, 46, 49], "network": [0, 2, 4, 18, 23, 39, 46, 47], "share": [0, 2, 4, 6, 11, 12, 25, 29, 39, 40, 46], "list": [0, 4, 6, 8, 11, 15, 16, 20, 21, 23, 24, 26, 27, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 42, 43, 48, 50, 51], "exempt": [0, 1, 2, 4, 11, 18, 26, 38, 40, 51, 52], "invit": [0, 2, 4, 11, 18, 26, 38, 40, 42, 51], "ignor": [0, 4, 8, 14, 23, 24, 30, 38, 39, 40, 46, 50], "userfil": [0, 2, 4, 5, 6, 10, 11, 12, 20, 21, 24, 25, 29, 31, 33, 38, 39, 45, 46, 49], "enabl": [0, 2, 4, 6, 7, 13, 16, 18, 23, 25, 29, 30, 31, 33, 36, 38, 39, 40, 41, 42, 48, 49, 51], "same": [0, 3, 4, 5, 7, 8, 11, 12, 17, 18, 21, 29, 30, 33, 35, 36, 38, 39, 42, 45, 46, 47, 48, 49, 50], "access": [0, 4, 17, 23, 29, 30, 31, 33, 36, 40, 43, 45, 46, 48, 50, 51, 52], "everi": [0, 3, 4, 11, 16, 18, 23, 25, 29, 30, 31, 35, 36, 37, 39, 41, 45, 46, 52], "your": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 38, 39, 40, 41, 43, 44, 45, 46, 48, 51], "see": [0, 2, 3, 4, 5, 6, 8, 11, 16, 18, 21, 23, 26, 27, 29, 30, 31, 32, 33, 34, 35, 38, 39, 41, 43, 44, 45, 46, 47, 50], "doc": [0, 3, 4, 5, 6, 23, 30, 32, 34, 39, 43, 46, 50, 51], "set": [0, 1, 2, 3, 4, 5, 6, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 29, 30, 34, 35, 37, 38, 40, 42, 43, 45, 47, 49, 50, 51, 52], "up": [0, 2, 3, 4, 5, 6, 16, 23, 27, 29, 30, 34, 35, 36, 38, 39, 43, 45, 46, 51], "alwai": [0, 3, 4, 11, 33, 35, 37, 46], "improv": [0, 4], "adjust": [0, 4, 18], "becaus": [0, 4, 8, 17, 23, 29, 30, 33, 36, 39, 46, 49, 50, 51], "ar": [0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52], "bug": [0, 3, 4, 30, 33, 44], "fix": [0, 3, 4, 29, 39, 46], "ad": [0, 2, 3, 4, 5, 7, 8, 11, 20, 21, 23, 24, 26, 29, 30, 33, 35, 36, 39, 40, 41, 42, 45, 46, 48, 50, 51], "demand": [0, 4], "them": [0, 1, 3, 4, 5, 7, 11, 13, 14, 15, 16, 18, 19, 21, 23, 24, 29, 30, 31, 33, 34, 36, 38, 39, 40, 41, 42, 45, 46, 49, 51, 52], "actual": [0, 4, 8, 16, 29, 30, 34, 39, 43, 46], "sens": [0, 4], "In": [0, 4, 5, 8, 15, 29, 31, 32, 33, 34, 35, 36, 38, 39, 46, 48, 51], "fact": [0, 4, 50], "exist": [0, 4, 8, 16, 21, 23, 29, 32, 35, 45, 46, 50, 51, 52], "sever": [0, 4, 14, 29, 33, 34, 42, 46, 49], "year": [0, 4, 33, 39, 46], "v0": [0, 4, 46], "7": [0, 4, 11, 33, 41, 46], "final": [0, 4, 8, 30, 31, 33, 39, 45], "go": [0, 3, 4, 6, 16, 23, 27, 30, 31, 33, 34, 35, 46], "part": [0, 4, 8, 23, 26, 30, 32, 39, 40, 46, 48, 49, 51], "tree": [0, 4, 33], "A": [0, 2, 4, 5, 11, 17, 30, 31, 32, 35, 36, 38, 39, 40, 42, 43, 46, 47, 48, 50, 52], "valiant": [0, 4], "effort": [0, 2, 4, 46], "been": [0, 1, 4, 5, 6, 16, 18, 21, 23, 29, 37, 39, 40, 46, 50], "made": [0, 1, 3, 4, 5, 11, 24, 32, 44, 46, 48, 51], "chase": [0, 4], "down": [0, 3, 4, 16, 38, 46], "destroi": [0, 4], "To": [0, 3, 4, 5, 7, 8, 21, 30, 31, 32, 33, 34, 35, 36, 39, 41, 43, 44, 46, 48, 49, 50], "need": [0, 3, 4, 8, 11, 15, 17, 18, 23, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 41, 45, 46, 48, 50, 51, 52], "sort": [0, 4, 37], "unix": [0, 3, 16, 17, 33, 40], "account": [0, 2, 4, 17, 19, 29, 31, 33, 40, 42, 44, 45, 51], "pretti": [0, 43], "good": [0, 16, 23, 26, 30, 33, 39, 46, 51, 52], "knowledg": 0, "how": [0, 3, 6, 8, 11, 14, 15, 16, 19, 21, 23, 24, 26, 30, 31, 32, 33, 34, 37, 38, 39, 46, 48, 49, 50, 51], "compil": [0, 2, 3, 4, 29, 32, 33, 34, 39, 41, 46, 48], "read": [0, 2, 3, 4, 6, 7, 17, 29, 30, 31, 33, 34, 39, 46, 47, 51], "dcc": [0, 2, 4, 6, 8, 16, 22, 23, 25, 29, 31, 32, 33, 38, 40, 41, 43, 45, 49], "absolut": [0, 34, 46, 52], "minimum": [0, 11, 32, 36, 46, 50], "mb": 0, "disk": [0, 33, 39, 40, 46], "space": [0, 39, 42, 46], "tarbal": [0, 33], "4": [0, 3, 4, 8, 11, 15, 23, 29, 30, 31, 32, 33, 34, 36, 38, 39, 41, 46], "unpack": 0, "cannot": [0, 11, 29, 33, 35, 45, 46, 52], "without": [0, 2, 4, 5, 6, 10, 11, 14, 20, 21, 29, 30, 31, 32, 33, 34, 36, 38, 39, 40, 42, 45, 46, 48], "instal": [0, 4, 5, 30, 31, 34, 36, 39], "shell": [0, 3, 4, 17, 31, 33, 39, 46], "copyright": [0, 1, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], "c": [0, 1, 2, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], "1999": [0, 3, 4, 7, 37, 38, 44, 46, 47, 49], "2023": [0, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], "egghead": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 33, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], "develop": [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 33, 34, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52], "team": [0, 1, 2, 3, 4, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], "eggdrop": [1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 37, 41, 42, 43, 45, 47, 48, 49, 51, 52], "robei": [1, 3, 4, 40, 47, 52], "pointer": [1, 3, 4, 8, 32, 40, 47], "As": [1, 16, 20, 30, 33, 34, 42, 46, 48, 51], "januari": [1, 9, 10, 13, 19, 22, 27, 46], "1997": [1, 3, 4, 40, 47], "accord": [1, 46, 52], "There": [1, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 29, 30, 31, 32, 34, 35, 37, 39, 41, 45, 47, 48, 51, 52], "should": [1, 3, 4, 5, 6, 8, 11, 13, 14, 15, 16, 18, 20, 21, 23, 24, 26, 29, 30, 31, 32, 33, 36, 38, 39, 41, 43, 45, 46, 48, 50, 51], "copi": [1, 2, 5, 7, 16, 29, 32, 33, 46], "file": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 35, 37, 38, 40, 41, 45, 47, 48, 52], "If": [1, 3, 4, 5, 6, 7, 8, 11, 13, 16, 17, 18, 20, 22, 23, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 44, 45, 46, 48, 49, 50], "write": [1, 2, 6, 7, 28, 33, 36, 39, 45, 46, 51], "free": [1, 2, 5, 29, 32], "foundat": [1, 32], "inc": [1, 32], "51": 1, "franklin": 1, "street": 1, "fifth": 1, "floor": 1, "boston": [1, 32], "ma": [1, 32], "02110": 1, "1301": 1, "usa": [1, 32], "3": [1, 8, 11, 14, 15, 16, 18, 23, 25, 31, 32, 33, 34, 35, 38, 39, 42, 46], "28": [1, 10, 20], "all": [1, 5, 6, 7, 8, 11, 14, 15, 16, 18, 20, 21, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48, 49, 50, 51, 52], "chang": [1, 2, 8, 10, 11, 16, 18, 20, 21, 23, 24, 26, 30, 32, 33, 34, 36, 38, 39, 40, 42, 43, 44, 48, 50, 51], "sourc": [1, 3, 4, 5, 6, 7, 8, 21, 29, 30, 32, 34, 36, 39, 44, 46, 48, 49], "code": [1, 2, 3, 4, 6, 7, 8, 29, 30, 36, 46], "relat": [1, 6, 11, 30, 32, 41, 46], "still": [1, 4, 5, 6, 11, 16, 24, 32, 33, 34, 35, 39, 40, 46, 51], "did": [1, 31, 45], "past": [1, 4, 29, 32, 39], "previou": [1, 3, 4, 5, 20, 33, 46, 51], "0m": 1, "were": [1, 17, 18, 37, 38, 39, 41, 45, 46, 51], "differ": [1, 3, 4, 5, 11, 16, 23, 30, 32, 34, 35, 39, 45, 46, 49, 50], "scheme": 1, "mai": [1, 4, 5, 11, 12, 16, 17, 18, 25, 30, 33, 38, 39, 41, 42, 46, 49, 50, 51], "option": [1, 3, 4, 7, 11, 16, 17, 20, 23, 31, 32, 33, 39, 48, 51], "those": [1, 3, 7, 12, 16, 23, 29, 30, 31, 32, 33, 46, 49, 50, 51], "instead": [1, 4, 5, 11, 16, 17, 18, 21, 24, 26, 33, 36, 38, 39, 45, 46, 48, 49, 51, 52], "packag": [1, 3, 4, 33, 34, 36], "bless": 1, "For": [1, 2, 3, 5, 6, 7, 8, 16, 21, 23, 31, 32, 33, 34, 36, 38, 39, 41, 42, 43, 45, 46, 48, 49, 50, 51], "bear": 1, "date": [1, 4, 32, 33, 35, 39, 46], "later": [1, 3, 6, 8, 10, 19, 20, 27, 30, 32, 33, 39, 46, 48], "choic": [1, 23, 30], "must": [1, 2, 3, 4, 8, 11, 15, 17, 18, 21, 23, 25, 29, 31, 32, 33, 34, 35, 36, 38, 39, 45, 46, 48, 50], "match": [1, 2, 8, 11, 16, 18, 29, 30, 32, 36, 37, 39, 45, 48, 50], "net": [1, 3, 18, 23, 26, 33, 35, 42], "blowfish": [1, 2, 5, 6, 20, 29, 39, 45, 46], "abov": [1, 4, 18, 20, 29, 30, 31, 40, 46, 47], "restrict": [1, 16, 17, 23, 39, 46, 47, 51], "origin": [1, 8, 23, 33, 44, 46], "chri": 1, "fuller": 1, "place": [1, 3, 5, 7, 11, 16, 18, 21, 30, 32, 33, 36, 37, 39, 46, 48, 51], "him": 1, "domain": [1, 15, 38], "variou": [1, 8, 29, 33, 37, 39, 46], "well": [1, 8, 26, 30, 31, 32, 33, 34, 35, 36, 39, 45, 46, 48, 51], "contain": [1, 3, 4, 5, 30, 33, 35, 36, 38, 39, 41, 46, 48, 50], "could": [1, 8, 23, 30, 36, 38, 39, 41, 44, 45, 46, 48, 51], "port": [1, 5, 15, 17, 23, 24, 31, 33, 34, 38, 39, 41, 48], "applic": [1, 39, 46], "john": 1, "ousterhout": 1, "wai": [1, 3, 17, 23, 26, 29, 30, 31, 33, 34, 35, 37, 38, 39, 43, 45, 46, 48, 51], "affili": [1, 51], "its": [1, 2, 4, 6, 7, 11, 16, 17, 18, 20, 23, 24, 26, 30, 31, 32, 33, 35, 36, 38, 39, 40, 44, 46, 49, 51], "own": [1, 6, 7, 16, 17, 23, 24, 30, 31, 32, 33, 34, 36, 42, 46, 48, 49, 51], "nots": 1, "warranti": [1, 32], "impli": [1, 29, 32], "whatev": [1, 3, 30, 39, 40, 46, 47], "risk": [1, 23], "matter": [1, 8, 15, 30, 31], "put": [1, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 33, 39, 46, 48], "built": [2, 17, 21, 46, 49], "assist": [2, 33, 35, 48], "manag": [2, 4, 6, 16, 26, 34, 36, 51], "oldest": [2, 46], "activ": [2, 11, 17, 32, 33, 35, 36, 37, 43, 46, 48], "maintain": [2, 17, 33, 35, 49, 50], "via": [2, 3, 4, 6, 11, 12, 17, 18, 21, 22, 24, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 50, 51], "abil": [2, 6, 7, 17, 34, 35, 38, 40, 46], "run": [2, 3, 4, 5, 6, 7, 11, 17, 21, 23, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 45, 47, 48, 50], "join": [2, 6, 8, 11, 13, 18, 19, 26, 30, 32, 33, 34, 37, 39, 40, 42, 43, 46, 50, 51, 52], "perorm": 2, "obtain": [2, 34, 48], "larg": [2, 16, 18, 23, 39], "number": [2, 11, 16, 18, 19, 20, 23, 25, 26, 29, 32, 33, 34, 36, 38, 39, 45, 46, 48, 50, 51, 52], "integr": [2, 21], "ircv3": [2, 35, 40, 46, 49], "capabl": [2, 39, 40, 46, 49, 51], "tl": [2, 3, 4, 5, 8, 31, 33, 36, 39, 46], "ipv6": [2, 33, 39, 40, 46], "twitch": [2, 6, 40], "much": [2, 3, 8, 26, 29, 43, 46], "project": [2, 44, 51], "http": [2, 4, 6, 21, 22, 27, 33, 35, 36, 42], "github": [2, 4, 33], "com": [2, 4, 5, 6, 21, 22, 23, 30, 31, 33, 38, 39, 45, 46, 48], "clone": [2, 4, 11, 33], "git": [2, 3, 33, 44], "altern": [2, 4, 6, 17, 23, 33, 34, 36, 38, 39, 46, 48], "stabl": [2, 4, 33], "snapshot": [2, 33], "locat": [2, 4, 30, 31, 34, 36, 39, 48], "geteggdrop": [2, 4, 33], "addit": [2, 4, 5, 8, 17, 23, 33, 39, 46, 48, 50], "found": [2, 4, 8, 29, 39, 46, 50], "offici": [2, 4], "webpag": 2, "www": [2, 4, 6, 22], "org": [2, 4, 5, 6, 27, 30, 33, 34, 38, 39, 46], "requir": [2, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 39, 45, 48, 50], "header": [2, 4, 6, 29, 30, 34, 48], "present": [2, 6, 30, 31, 35, 36, 41, 46, 50, 51], "system": [2, 3, 7, 15, 16, 17, 29, 33, 36, 39, 40, 41, 46, 47, 48], "strongli": [2, 4, 33], "encourag": [2, 33, 45], "openssl": [2, 3, 4, 20, 31, 33, 34, 39, 48], "commun": [2, 29, 38, 43, 44, 46], "guid": [2, 3, 30, 33, 34], "quickli": [2, 39], "here": [2, 4, 11, 14, 15, 16, 18, 19, 21, 23, 25, 30, 31, 32, 33, 36, 37, 38, 39, 46, 49, 50], "lurk": 2, "libera": [2, 4, 5, 23, 29, 30, 31, 33], "readm": [2, 3, 36], "notic": [2, 14, 16, 30, 38, 39, 46, 51], "quick": [2, 29, 33, 39], "startup": [2, 8, 45, 46], "upgrad": [2, 33, 45, 48], "command": [2, 3, 6, 8, 11, 13, 16, 17, 18, 22, 23, 29, 30, 31, 33, 34, 35, 37, 38, 39, 40, 41, 43, 45, 48, 51, 52], "line": [2, 3, 5, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 33, 34, 35, 36, 38, 39, 40, 45, 46, 48, 49, 50, 51], "auto": [2, 3, 38, 52], "start": [2, 3, 5, 6, 10, 17, 20, 23, 28, 30, 31, 36, 38, 39, 42, 43, 45, 46, 47, 50, 51], "document": [2, 8, 17, 30, 33, 34, 36, 38, 41, 42, 44, 48, 49], "cygwin": [2, 41], "window": [2, 31, 41], "v1": [2, 24, 25, 30, 36, 46, 48, 50], "core": [2, 3, 6, 7, 8, 18, 19, 21, 23, 29, 30, 32, 46, 49], "execut": [2, 3, 7, 29, 30, 31, 35, 46], "path": [2, 3, 6, 16, 17, 33, 34, 36, 46, 48], "basic": [2, 4, 6, 7, 21, 22, 30, 33], "consol": [2, 4, 6, 11, 29, 36, 40, 43], "directori": [2, 3, 4, 6, 7, 29, 31, 33, 34, 36, 40, 44, 48, 49], "telnet": [2, 31, 33, 38, 40, 41, 43, 45, 46, 47, 48], "ssl": [2, 3, 4, 5, 23, 31, 33, 34, 38, 40, 46], "parti": [2, 5, 13, 21, 33, 38, 39, 40, 46, 48, 52], "autoscript": 2, "usag": [2, 4, 6, 29, 39, 46], "structur": 2, "hint": [2, 30], "flag": [2, 5, 6, 8, 11, 14, 18, 24, 29, 30, 32, 33, 36, 39, 40, 47], "term": [2, 30, 32, 34, 46], "exampl": [2, 3, 4, 5, 7, 8, 16, 17, 21, 23, 29, 30, 31, 32, 33, 34, 36, 39, 43, 46, 48, 49, 50, 51], "bottre": 2, "botflag": [2, 24], "record": [2, 24, 29, 32, 35, 40, 52], "certif": [2, 3, 23, 31, 34, 39, 46], "authent": [2, 35, 45, 46, 51], "ctcp": [2, 6, 11, 23, 31, 33, 39, 46, 48], "chat4": 2, "chat6": 2, "kei": [2, 3, 11, 18, 26, 30, 31, 39, 45, 50, 51], "cap": [2, 29, 35, 40, 51], "track": [2, 3, 16, 26, 29, 31, 46, 51], "server": [2, 5, 6, 7, 11, 14, 15, 16, 17, 18, 20, 26, 27, 29, 31, 32, 33, 39, 40, 41, 42, 48, 49, 50, 51], "check": [2, 4, 5, 8, 11, 23, 29, 30, 31, 32, 34, 36, 39, 45, 46, 48, 50], "determin": [2, 3, 17, 29, 31, 33, 38, 41, 46, 48], "best": [2, 3, 6, 17, 33, 36, 38, 46, 50], "encrypt": [2, 5, 6, 10, 20, 31, 34, 38, 39, 40, 48], "hash": [2, 5, 6, 20, 33], "background": [2, 4, 30], "interfac": [2, 26, 46, 51], "disclaim": [2, 46], "regist": [2, 8, 11, 31, 32, 46], "edit": [2, 3, 8, 30, 32, 36, 49], "config": [2, 3, 4, 6, 7, 11, 12, 13, 14, 15, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 30, 31, 34, 35, 37, 38, 39, 41, 45, 47, 48], "web": [2, 6, 21, 26, 39, 50], "ui": [2, 50], "limit": [2, 6, 8, 11, 16, 18, 23, 36, 38, 41], "tip": [2, 46], "renam": [2, 16, 29, 33, 39, 46], "keep": [2, 4, 11, 16, 23, 25, 33, 39, 51], "self": [2, 23, 34, 39, 48], "modifi": [2, 6, 11, 15, 18, 30, 32, 35, 36, 39, 46], "default": [2, 3, 4, 6, 12, 15, 16, 18, 23, 25, 31, 33, 34, 35, 36, 37, 39, 45, 46, 48], "string": [2, 6, 8, 11, 18, 29, 30, 31, 36, 39, 45, 50, 51], "modular": 2, "variabl": [2, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 29, 30, 35, 36, 39, 41, 47, 50], "textfil": 2, "substitut": [2, 39], "output": [2, 3, 29, 31, 32, 34, 45, 47, 49, 50], "manipul": [2, 39], "note": [2, 3, 6, 7, 8, 10, 11, 15, 18, 20, 23, 24, 29, 31, 32, 33, 35, 38, 39, 45, 48, 50, 51], "assoc": [2, 6], "compress": [2, 6, 31], "filesi": [2, 6, 39], "miscellan": 2, "global": [2, 8, 13, 17, 18, 23, 24, 29, 30, 32, 36, 37, 38, 50, 52], "bind": [2, 6, 17, 18, 23, 26, 29, 30, 35, 39, 49, 51], "procedur": [2, 24, 35, 50, 52], "tcp": [2, 17, 41], "connect": [2, 4, 5, 6, 15, 16, 17, 23, 26, 29, 31, 33, 38, 39, 41, 43, 48, 51, 52], "charact": [2, 11, 16, 23, 33, 38, 39, 41, 45], "patch": [2, 41, 46], "submit": [2, 46], "prerequisit": 2, "super": 2, "short": [2, 29, 31, 41, 48], "configur": [2, 3, 4, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 36, 39, 41, 44, 46, 48], "common": [2, 23, 33, 34, 38, 39, 42, 48, 52], "step": [2, 3, 5, 29, 33, 51], "partylin": [2, 4, 6, 8, 11, 13, 33, 34, 35, 36, 38, 39, 41, 45, 46, 48, 49, 50, 51, 52], "automat": [2, 3, 4, 5, 8, 13, 17, 21, 23, 33, 35, 36, 37, 38, 39, 40, 41, 45, 46, 48, 51, 52], "restart": [2, 3, 4, 5, 7, 30, 33, 36, 39], "nickserv": [2, 48], "sasl": [2, 33, 40, 42], "export": [2, 8, 49], "dynam": [2, 3, 11, 31, 33, 37, 46], "static": [2, 3, 8, 11, 29, 31, 32, 46], "dn": [2, 6, 39, 46], "ident": [2, 6, 7, 18, 23, 31, 39, 41, 45, 46], "pbkdf2": [2, 5, 6, 45], "seen": [2, 6, 11, 35, 39, 46], "transfer": [2, 6, 7, 12, 16, 21, 24, 33, 38, 39, 41, 46, 48, 52], "woobi": [2, 3, 6, 29, 32, 36], "uptim": [2, 6], "intern": [2, 23, 35, 39, 46, 50], "tabl": [2, 29, 32, 42, 46], "creation": [2, 31, 35], "stackabl": 2, "ht_stackabl": [2, 32], "trigger": [2, 11, 21, 23, 29, 30, 32, 35, 46, 50], "handler": 2, "summari": [2, 36], "bore": [2, 4], "legal": [2, 4], "stuff": [2, 4, 29, 30, 33, 39, 46], "had": [3, 5, 8, 11, 38, 39, 46, 51], "littl": [3, 5, 16, 26, 33, 36, 38, 49], "experi": [3, 16, 30, 33], "THE": 3, "now": [3, 5, 8, 16, 17, 18, 30, 31, 32, 33, 34, 36, 38, 39, 41, 45, 46, 50, 52], "experienc": 3, "more": [3, 4, 5, 6, 8, 14, 16, 18, 21, 22, 29, 30, 31, 32, 33, 34, 36, 38, 39, 40, 42, 44, 45, 46, 48], "cours": [3, 8, 30, 38, 39, 46], "autoconfigur": 3, "thing": [3, 4, 6, 26, 28, 29, 30, 31, 38, 39, 46, 51], "easier": [3, 20], "type": [3, 4, 6, 7, 8, 11, 13, 18, 21, 23, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 48], "figur": [3, 33], "correctli": [3, 46], "try": [3, 4, 6, 7, 22, 23, 27, 29, 30, 31, 33, 35, 39, 50], "find": [3, 6, 15, 18, 22, 29, 30, 31, 33, 43, 44, 46, 51], "which": [3, 5, 6, 8, 11, 13, 15, 16, 17, 21, 23, 24, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 43, 45, 46, 47, 48, 49, 50, 52], "either": [3, 4, 8, 16, 17, 21, 31, 32, 33, 34, 35, 37, 38, 39, 41, 46, 48, 50], "iconfig": [3, 7, 33], "everyth": [3, 8, 21, 30, 46], "mod": [3, 6, 7, 22, 26, 29, 39, 46, 50], "choos": [3, 7, 31, 33, 39, 40, 51], "forc": [3, 11, 13, 16, 20, 24, 30, 39, 41, 46], "otherwis": [3, 4, 13, 16, 30, 35, 37, 38, 39, 41, 45, 46, 48, 50], "makefil": [3, 29], "better": [3, 4, 6, 22, 31, 33, 39], "possibl": [3, 6, 11, 14, 16, 23, 31, 34, 38, 39, 41, 42, 43, 46, 48, 50], "debug": [3, 27, 29, 30, 39, 46, 48, 50], "sdebug": 3, "give": [3, 4, 11, 16, 23, 30, 33, 38, 39, 40, 43, 45, 46, 52], "detail": [3, 4, 6, 8, 29, 32, 33, 35, 46, 48, 50], "highli": [3, 23, 33], "unlik": [3, 40], "crash": [3, 4, 8, 46], "take": [3, 4, 5, 6, 11, 16, 20, 21, 23, 27, 30, 32, 33, 36, 39, 45, 46, 48], "longer": [3, 5, 16, 18, 20, 29, 33, 34, 36, 46], "enlarg": 3, "binari": [3, 34], "bit": [3, 16, 26, 30, 33, 34, 39, 46, 48, 51], "worth": 3, "somewher": [3, 39], "accomplish": 3, "enter": [3, 11, 16, 31, 34, 39, 43, 44, 45, 46, 48, 50], "home": [3, 16, 17, 31, 33, 48], "e": [3, 6, 8, 9, 10, 11, 18, 20, 29, 31, 33, 38, 39, 46, 47, 52], "dest": [3, 6, 33, 34, 39, 46, 48], "otherdir": 3, "full": [3, 4, 5, 8, 11, 26, 33, 41, 46, 48, 50, 51], "8": [3, 5, 6, 8, 11, 15, 20, 23, 32, 33, 38, 39, 41, 45, 46, 48], "intend": [3, 8, 36, 37, 46], "traffic": [3, 39, 49], "between": [3, 6, 11, 16, 19, 23, 24, 32, 34, 35, 38, 39, 41, 46], "sslcert": [3, 34, 39, 48], "Or": [3, 34, 46], "non": [3, 11, 15, 17, 18, 23, 29, 31, 37, 38, 46, 48, 51], "interact": [3, 4, 6, 17, 18, 32, 39, 46, 48, 51], "sslsilent": [3, 48], "info": [3, 4, 11, 13, 18, 29, 33, 39], "follow": [3, 4, 5, 8, 11, 16, 18, 21, 23, 26, 29, 32, 33, 34, 36, 38, 39, 40, 42, 44, 45, 46, 47, 48, 49, 50, 51], "complet": [3, 4, 16, 21, 24, 33, 40, 46, 48, 52], "m": [3, 4, 11, 23, 33, 39, 41, 45, 46, 47, 49, 50, 52], "lamestbot": [3, 11, 19, 23, 33, 38, 39, 46, 47], "conf": [3, 7, 17, 31, 33, 42, 46, 48], "when": [3, 4, 6, 7, 10, 11, 13, 16, 17, 18, 21, 23, 24, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 43, 45, 46, 48, 50, 51], "futur": [3, 18, 31, 33, 45, 46], "drop": [3, 4, 39, 46], "chmod": [3, 39], "u": [3, 5, 8, 29, 30, 31, 32, 38, 39, 46, 47, 52], "x": [3, 5, 8, 11, 14, 21, 32, 33, 34, 39, 41, 46, 52], "my": [3, 5, 36, 39, 41, 48, 52], "name": [3, 4, 6, 8, 9, 16, 23, 29, 30, 31, 32, 33, 34, 35, 36, 39, 50], "abl": [3, 6, 11, 16, 18, 23, 33, 35, 39, 43, 45, 46], "prompt": [3, 4, 35], "work": [3, 5, 6, 8, 11, 14, 16, 20, 21, 22, 24, 29, 30, 31, 32, 33, 37, 38, 39, 41, 42, 44, 45, 46, 48, 49, 50], "top": [3, 4, 30, 44, 46], "correct": [3, 8, 32, 34, 39, 45], "advis": [3, 23], "crontab": [3, 4, 46], "so": [3, 4, 6, 7, 8, 10, 16, 17, 18, 20, 27, 30, 31, 32, 33, 35, 37, 39, 40, 41, 45, 46, 50], "machin": [3, 4, 17, 33, 36, 39], "goe": [3, 11, 31, 36, 37, 38, 43, 46, 48], "heaven": 3, "forbid": 3, "helper": 3, "systemd": [3, 4], "entri": [3, 4, 8, 31, 33, 39], "add": [3, 4, 5, 6, 7, 8, 11, 17, 18, 21, 26, 29, 30, 32, 33, 34, 35, 36, 38, 39, 40, 45, 51], "job": [3, 4, 31, 48], "autobotchk": [3, 4, 31], "yourconfig": 3, "smile": 3, "tool": [3, 33], "prior": [3, 31, 33, 35, 45, 48], "interpret": [3, 6, 21, 32, 41, 46, 47], "devel": 3, "autoconf": 3, "gcc": 3, "util": 3, "diffutil": 3, "small": [3, 25, 38, 49], "piec": [3, 30, 32], "separ": [3, 7, 8, 23, 33, 36, 38, 39, 40, 41, 42, 46, 49, 50], "smaller": 3, "download": [3, 4, 5, 7, 16, 25, 36, 39, 40, 46], "src": [3, 7, 8, 18, 29], "extens": [3, 33, 35, 36], "dure": [3, 12, 21, 24, 29, 31, 33], "valid": [3, 11, 23, 29, 38, 39, 40, 46, 48], "compat": [3, 5, 36, 42, 46, 50, 51], "rest": [3, 29, 32, 38, 39, 45, 46, 50], "wish": [3, 5, 7, 17, 18, 27, 29, 33, 36, 37, 38, 39, 46, 50], "paragraph": 3, "2": [3, 8, 11, 14, 18, 21, 23, 31, 32, 33, 34, 35, 38, 39, 41, 42, 45, 46, 48], "after": [3, 4, 8, 11, 17, 18, 23, 29, 30, 31, 35, 36, 37, 39, 46, 48, 49, 51], "move": [3, 4, 16, 23, 33, 46, 51], "appropri": [3, 5, 33, 38, 39, 42, 44, 45], "onli": [3, 4, 5, 6, 7, 8, 11, 16, 17, 18, 19, 22, 23, 24, 27, 28, 30, 31, 33, 35, 37, 38, 39, 41, 43, 45, 46, 47, 48, 49, 50, 52], "portion": [3, 7, 11, 46], "end": [3, 29, 31, 32, 39, 45, 46, 47], "point": [3, 6, 8, 23, 28, 32, 33, 36, 38, 39, 46], "hopefulli": [3, 46], "IT": [3, 4], "fun": [3, 51], "pleas": [4, 5, 6, 7, 10, 11, 17, 20, 21, 23, 34, 39, 42, 46], "least": [4, 18, 29, 32, 33, 37, 39], "skim": 4, "ask": [4, 18, 31, 33, 43, 46, 48], "question": [4, 31], "ve": [4, 16, 33, 37, 38, 43], "never": [4, 5, 11, 39, 46], "successfulli": [4, 29, 46, 50], "sure": [4, 11, 29, 30, 33, 34, 38, 39, 46, 51], "select": [4, 33, 39, 40, 44, 46], "n": [4, 5, 11, 31, 32, 38, 39, 43, 46, 47, 52], "owner": [4, 8, 11, 33, 39, 43, 46, 52], "wise": [4, 39], "100": [4, 18, 50], "power": [4, 40], "TO": 4, "someon": [4, 11, 18, 30, 33, 34, 46, 50], "trust": [4, 39, 52], "about": [4, 6, 26, 27, 29, 30, 31, 32, 36, 39, 46, 49, 51], "older": [4, 41, 46], "frequent": [4, 33], "where": [4, 6, 8, 11, 15, 16, 19, 23, 29, 30, 31, 33, 34, 35, 36, 39, 40, 45, 46, 48, 50], "might": [4, 18, 29, 39, 46, 48], "two": [4, 6, 11, 18, 21, 24, 30, 32, 33, 35, 36, 37, 38, 39, 45, 46, 48, 49], "method": [4, 10, 17, 18, 20, 21, 26, 30, 33, 34, 45, 49, 51], "come": [4, 6, 18, 23, 31, 33, 44, 46], "imag": 4, "latest": [4, 5], "pub": [4, 5, 21, 23, 31, 32, 35, 46], "cv": 4, "base": [4, 6, 33, 35, 36, 39, 45, 46], "interest": 4, "veri": [4, 6, 17, 21, 22, 23, 30, 39], "updat": [4, 5, 6, 20, 29, 33, 35, 39, 40, 45, 46, 50], "pull": [4, 44, 45], "recent": [4, 33, 46, 48], "BE": 4, "warn": [4, 17, 30, 46], "branch": [4, 44], "consid": [4, 33, 35, 37, 39, 43, 46], "haha": 4, "signific": [4, 6], "repositori": [4, 33], "simpli": [4, 5, 21, 31, 33, 34, 42, 46, 51], "tar": [4, 7, 33], "archiv": 4, "gz": [4, 33], "hub": [4, 24, 33, 38, 39, 45, 48], "_": [4, 35, 47], "mani": [4, 5, 11, 15, 16, 18, 23, 29, 31, 32, 33, 34, 38, 39, 46], "tclsh": 4, "given": [4, 8, 15, 16, 17, 33, 38, 46, 50], "exit": [4, 6, 13, 16, 23, 46], "howev": [4, 6, 7, 14, 23, 31, 33, 34, 35, 39, 45, 46, 48, 49], "often": [4, 6, 15, 31, 33, 39, 50], "o": [4, 11, 14, 18, 26, 33, 34, 38, 39, 41, 46, 50, 51, 52], "usual": [4, 31, 32, 33, 34, 37, 41, 44, 45, 46, 48, 51], "someth": [4, 8, 21, 30, 33, 36, 44, 46, 51], "similar": [4, 11, 31, 32, 33, 36, 39, 43, 44, 46, 49], "dev": [4, 33, 34], "tk": 4, "tcltk": 4, "html": [4, 41], "recommend": [4, 5, 11, 25, 29, 33, 36, 45, 46, 49, 50], "order": [4, 15, 30, 32, 35, 39, 45, 46, 48, 50], "data": [4, 11, 24, 29, 34, 45, 46], "libssl": [4, 33, 34], "finish": [4, 8, 16, 33, 46], "simpl": [4, 29, 30, 31, 32, 33, 36, 46], "new": [4, 5, 6, 7, 20, 26, 30, 31, 32, 33, 35, 36, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51], "repeat": [4, 35, 46], "defin": [4, 6, 8, 11, 12, 14, 18, 23, 29, 30, 33, 35, 36, 37, 38, 39, 42, 46, 52], "through": [4, 11, 16, 23, 26, 30, 34, 40, 41, 42, 43, 46, 51, 52], "sometim": [4, 23, 33], "mode": [4, 5, 11, 14, 18, 23, 26, 29, 31, 35, 37, 39, 40, 42, 51], "let": [4, 6, 8, 11, 15, 19, 29, 30, 33, 38, 39, 40, 46], "avail": [4, 8, 11, 16, 20, 27, 29, 31, 32, 33, 34, 36, 39, 40, 41, 43, 46, 51], "t": [4, 6, 7, 8, 10, 11, 13, 15, 16, 17, 18, 20, 23, 24, 26, 27, 29, 30, 31, 32, 33, 36, 37, 38, 39, 43, 46, 47, 48, 49, 50, 52], "don": [4, 7, 11, 15, 16, 18, 23, 24, 26, 29, 30, 31, 32, 33, 36, 38, 39, 43, 46, 48, 49], "termin": [4, 5, 8, 46], "session": [4, 41, 42], "troubleshoot": [4, 33], "issu": [4, 5, 17, 26, 33, 35, 39, 44, 46, 48, 50, 51], "show": [4, 6, 8, 11, 16, 21, 27, 30, 38, 39, 46], "10": [4, 8, 11, 18, 31, 33, 36, 38, 39, 46], "second": [4, 11, 14, 15, 18, 23, 25, 29, 30, 32, 39, 49], "screen": [4, 44, 47], "clear": [4, 6, 8, 44, 48, 50, 51], "one": [4, 8, 11, 16, 17, 18, 23, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 43, 44, 45, 46, 48, 49], "person": [4, 30, 33, 39, 46], "introduc": [4, 33, 46], "himself": 4, "herself": 4, "ll": [4, 30, 31, 32, 33, 35, 39, 45, 46, 48], "h": [4, 8, 18, 29, 34, 38, 39, 46, 52], "quit": [4, 6, 23, 33, 39, 46], "v": [4, 8, 11, 18, 31, 39, 46, 47, 52], "peopl": [4, 11, 16, 17, 18, 19, 23, 24, 30, 33, 39, 40, 43, 46, 47, 52], "except": [4, 14, 21, 23, 29, 39, 46, 48], "onc": [4, 6, 11, 16, 18, 20, 23, 30, 31, 33, 38, 44, 46], "along": [4, 16, 32], "manual": [4, 21, 31, 36, 38, 39, 41, 46, 48, 50], "oper": [4, 14, 23, 30, 36, 39, 41, 46, 47], "reason": [4, 29, 31, 33, 36, 38, 39], "monitor": [4, 31, 37, 40, 42], "boot": [4, 8, 39], "b": [4, 11, 16, 18, 26, 30, 31, 38, 39, 44, 46, 47, 51, 52], "minut": [4, 11, 18, 25, 29, 31, 33, 37, 39], "attempt": [4, 5, 11, 17, 18, 21, 23, 26, 34, 35, 37, 38, 39, 46, 48, 51], "geneer": 4, "setup": [4, 6, 7, 33, 39], "would": [4, 5, 14, 21, 30, 31, 33, 34, 35, 38, 39, 46, 47, 48, 50, 51], "noemail": 4, "botchk": [4, 31, 33], "send": [4, 6, 12, 16, 18, 19, 21, 23, 24, 25, 29, 30, 33, 35, 38, 41, 46, 49, 50], "email": [4, 31, 39, 46], "sai": [4, 11, 16, 30, 34, 38, 46], "we": [4, 5, 8, 11, 18, 26, 29, 30, 31, 32, 33, 34, 36, 38, 46, 51], "re": [4, 11, 17, 18, 23, 30, 31, 33, 34, 35, 36, 37, 39, 41, 43, 46, 51], "feel": [4, 5, 29, 44], "miss": [4, 33, 35, 46], "yet": [4, 23, 32, 33, 39, 46], "thank": 4, "discuss": [4, 44], "dalnet": [4, 18, 23], "efnet": [4, 18, 23], "egghelp": [4, 33], "ircnet": [4, 11, 18, 23], "quakenet": [4, 23], "undernet": [4, 18, 23, 46], "plan": [4, 30, 46], "familiar": [4, 30], "etiquett": 4, "capit": [4, 52], "letter": [4, 39, 52], "color": [4, 46], "bold": [4, 46, 47, 52], "excess": [4, 11, 23], "msg": [4, 6, 18, 22, 23, 31, 32, 33, 39, 40, 43, 45, 50], "permiss": [4, 39, 45], "than": [4, 8, 11, 14, 16, 18, 33, 34, 39, 45, 46, 48], "text": [4, 11, 23, 29, 31, 32, 39, 47, 48, 49, 50, 52], "state": [4, 46], "relev": [4, 29, 33], "error": [4, 23, 29, 33, 39, 46, 51], "messag": [4, 11, 23, 29, 30, 32, 33, 35, 39, 40, 42, 43, 45, 47, 49, 50], "easi": [5, 6, 30, 33, 36, 46, 48], "pictur": 5, "reus": [5, 46], "visit": [5, 51], "newer": [5, 33, 36], "backup": [5, 29], "chan": [5, 8, 11, 18, 21, 30, 31, 32, 33, 49], "save": [5, 6, 11, 12, 13, 21, 24, 38, 39, 40, 45], "overwritten": [5, 39, 46], "hurt": 5, "another": 5, "next": [5, 8, 11, 16, 23, 29, 30, 32, 33, 34, 36, 38, 39, 46], "view": [5, 7, 20, 21, 31, 33, 36, 40, 46, 50], "pai": [5, 35, 46], "particular": [5, 31, 32, 36, 39], "attent": [5, 23, 35, 46], "section": [5, 6, 8, 18, 23, 26, 30, 32, 33, 38, 39, 46, 51], "Then": [5, 31, 33, 48], "previous": [5, 33, 46], "unzip": [5, 33], "untar": 5, "These": [5, 11, 12, 18, 29, 33, 35, 36, 37, 38, 39, 41, 47, 48, 50, 52], "NOT": [5, 30, 33, 35, 38, 39, 46, 50], "rather": [5, 46, 48], "killer": 5, "directli": [5, 6, 11, 17, 24, 32, 33, 46], "affect": [5, 11, 26, 39, 40, 41, 46, 51], "modif": [5, 46], "migrat": 5, "suggest": [5, 29, 36], "deprec": [5, 6, 34, 46], "password": [5, 6, 10, 18, 20, 23, 24, 31, 33, 38, 39, 40, 43, 45, 48, 51], "favor": [5, 6, 24], "big": [5, 46, 49], "done": [5, 8, 21, 24, 29, 31, 32, 33, 34, 38, 44, 45, 46, 51], "carelessli": 5, "potenti": [5, 17, 30, 46, 50], "render": [5, 26, 51], "store": [5, 6, 11, 13, 16, 19, 26, 27, 30, 33, 35, 36, 38, 45, 46, 50, 51], "useless": [5, 26, 51], "properli": [5, 32, 33, 34, 38, 39], "switch": [5, 29, 33, 35, 39, 46, 48, 49], "syntax": [5, 8, 21, 31, 39, 48, 52], "6667": [5, 23, 33, 46, 51], "3rd": [5, 8], "remov": [5, 6, 11, 16, 20, 29, 31, 32, 33, 37, 40, 41, 45, 49, 50, 51], "ftp": [5, 33], "fulli": [5, 36, 39, 46, 51], "explicitli": [5, 46, 48], "prefix": [5, 8, 18, 23, 30, 34, 36, 38, 39, 43, 48, 50, 51], "advantag": [5, 33, 49], "chaddr": [5, 38], "lot": [5, 8, 18, 30, 33, 35], "backward": [5, 42], "reflect": [5, 46], "valu": [6, 8, 14, 15, 18, 21, 23, 26, 29, 30, 36, 39, 45, 47, 48, 50, 51], "disabl": [6, 18, 23, 31, 36, 39, 41, 46, 48], "cancel": [6, 46], "cd": [6, 8, 29, 32, 33, 46], "cp": 6, "dst": 6, "desc": [6, 29], "descript": [6, 29, 30, 31, 36, 39, 46, 50, 52], "filestat": 6, "stat": 6, "get": [6, 7, 8, 11, 21, 23, 24, 25, 29, 30, 34, 35, 39, 43, 52], "filenam": [6, 11, 19, 33, 36, 39, 48], "nicknam": [6, 8, 23, 30, 31, 33, 35, 39, 47, 49, 50, 52], "hide": [6, 41, 46], "ln": 6, "filepath": 6, "localfil": 6, "l": [6, 11, 18, 23, 31, 35, 38, 39, 52], "filemask": 6, "mkdir": 6, "dir": [6, 31], "mv": 6, "pend": [6, 11], "pwd": [6, 33], "rm": [6, 33], "rmdir": 6, "optim": [6, 8, 23], "unhid": 6, "unshar": [6, 52], "api": [6, 32, 36], "decrypt": 6, "won": [6, 11, 24, 29, 30, 33, 37, 38, 39, 46, 48, 50], "specif": [6, 11, 15, 17, 18, 20, 21, 23, 26, 32, 33, 38, 41, 42, 46, 48, 50, 51, 52], "therefor": [6, 18, 39, 46], "amount": [6, 39], "bandwidth": [6, 12], "storag": [6, 13, 45], "repli": [6, 14, 15, 17, 18, 35, 39, 46], "d": [6, 11, 14, 16, 29, 31, 32, 33, 34, 38, 39, 44, 46, 49, 52], "expect": [6, 14, 39, 46], "load": [6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 38, 39, 45, 46, 51], "asynchron": [6, 15, 46], "avoid": [6, 8, 15, 31], "long": [6, 11, 15, 19, 23, 24, 37, 39, 46, 47, 50], "period": [6, 15, 33, 46], "hang": [6, 15], "wait": [6, 15, 16, 18, 23, 25, 33, 35, 39, 46], "hostnam": [6, 11, 15, 31, 39, 41], "resolv": [6, 15, 39, 46], "timeout": [6, 15, 23, 25, 39, 50], "area": [6, 16, 39, 46, 49, 52], "within": [6, 16, 21, 29, 33, 34, 36, 37, 39, 42, 46], "usabl": [6, 16, 21, 39], "extern": [6, 8, 17, 31, 39], "oident": [6, 17], "servic": [6, 11, 17, 26, 31, 35, 46, 48, 51], "act": [6, 17, 29, 39, 40, 46, 48], "daemon": [6, 17, 39], "onlin": [6, 16, 19, 31, 35], "retriev": [6, 19, 21], "transit": [6, 20, 45, 46], "earlier": [6, 20, 32, 33], "AND": [6, 8, 20, 33, 46], "By": [6, 16, 18, 20, 23, 25, 31, 35, 38, 39, 46, 48, 51], "seamlessli": [6, 20], "old": [6, 20, 23, 33], "eventu": [6, 20], "altogeth": [6, 20], "itself": [6, 16, 29, 30, 31, 32, 39, 46], "ie": [6, 33, 36, 45, 46, 48], "userlist": [6, 18, 22, 24], "gseen": [6, 22], "g": [6, 8, 22, 29, 33, 38, 39, 46, 52], "quann": [6, 22], "kreativrauschen": [6, 22], "Not": [6, 23, 31, 42], "equival": [6, 23, 34], "no_irc": [6, 23], "implement": [6, 7, 8, 17, 34, 35, 39, 42, 44, 45, 46, 51], "tiwtch": 6, "report": [6, 16, 27, 29, 33, 49], "statist": [6, 16, 27], "contest": 6, "site": [6, 52], "hour": [6, 27, 29, 37, 39, 46], "isn": [6, 16, 23, 24, 27, 33, 37, 46], "again": [6, 16, 27, 29, 32, 36, 37, 38, 39, 45, 46, 50], "sent": [6, 16, 18, 24, 27, 31, 35, 39, 42, 43, 46, 48, 50, 52], "demonstr": [6, 21, 28, 46], "right": [6, 8, 16, 17, 28, 30, 33, 46], "jul": 7, "25": [7, 11, 23, 50], "2016": 7, "independ": 7, "main": [7, 30, 33, 34, 35, 43], "desir": [7, 8, 29, 31, 32, 33, 45], "extra": [7, 21, 39, 42], "overhead": 7, "bloat": 7, "enhanc": 7, "instruct": [7, 33, 45], "direct": [7, 34, 38, 44, 46], "un": [7, 18, 37, 39, 46], "format": [7, 21, 23, 29, 31, 33, 34, 39, 45, 46, 47, 50], "modulenam": [7, 29], "folder": [7, 21], "suffix": [7, 39], "rehash": [7, 29, 30, 31, 39], "ye": [7, 30, 31, 34, 46], "detect": [7, 23, 34, 41, 46, 48], "yourself": [7, 31, 33, 44, 45, 48], "until": [7, 11, 16, 37, 39, 46], "henc": [7, 29, 46], "nearli": 7, "who": [8, 11, 16, 18, 23, 30, 33, 35, 39, 43, 46, 52], "understand": [8, 32, 36, 39, 46], "alreadi": [8, 11, 23, 29, 30, 32, 33, 34, 35, 38, 39, 45, 46, 51], "suitabl": [8, 50], "illustr": 8, "handl": [8, 30, 31, 32, 37, 39, 45, 48, 50], "snippet": 8, "alter": [8, 16, 40, 46, 51], "breviti": 8, "simplic": 8, "initi": [8, 29, 30, 33, 41, 42, 46, 48], "symbol": [8, 34, 46], "p_tcl_bind_list": [8, 32], "h_dcc": 8, "param": 8, "const": [8, 29], "char": [8, 29, 32, 39, 46], "length": [8, 18, 23, 29, 45, 46, 48], "tclhash": 8, "int": [8, 29, 32, 36], "intfunc": 8, "return": [8, 18, 21, 29, 32, 35, 36, 45, 50], "aka": [8, 39], "tcl_bind_list_t": 8, "add_bind_t": [8, 32], "builtin_dcc": 8, "doe": [8, 11, 26, 30, 31, 35, 36, 37, 39, 42, 43, 46, 50, 51, 52], "explain": [8, 38, 46], "happen": [8, 30, 33, 37, 39, 46], "arbitrari": [8, 46], "argument": [6, 8, 16, 18, 30, 31, 41, 46, 50], "import": [8, 21, 29, 30, 31, 33, 35, 39, 43, 46], "That": [8, 26, 30, 33, 38, 46, 52], "mean": [8, 16, 18, 23, 30, 31, 32, 35, 37, 38, 39, 40, 41, 45, 46, 48, 50], "mask": [8, 16, 21, 23, 30, 32, 39, 50], "test": [8, 30, 33, 52], "proc1": 8, "proc2": 8, "overwrit": [8, 17, 33, 46], "proc": [8, 21, 23, 29, 30, 36, 50], "myproc": [8, 21, 46], "arg": [8, 29, 32], "putlog": [8, 21, 23, 29, 30, 32], "Of": [8, 38, 39], "far": [8, 16, 33], "against": [8, 11, 16, 20, 23, 30, 32, 33, 45, 46, 50], "receiv": [8, 15, 16, 23, 31, 32, 38, 46, 50], "accept": [8, 16, 24, 26, 32, 34, 36, 38, 39, 46, 48, 51], "check_tcl_dcc": 8, "cmd": [8, 39, 46], "idx": [8, 29, 32], "struct": [8, 32], "flag_record": [8, 32], "fr": [8, 32], "fr_global": [8, 32], "fr_chan": [8, 32], "11": [8, 46], "get_user_flagrec": 8, "con_chan": 8, "egg_snprintf": 8, "sizeof": [8, 32], "ld": 8, "sock": [8, 29, 39], "tcl_setvar": [8, 32], "interp": [8, 32], "_dcc1": 8, "nick": [8, 11, 18, 23, 27, 30, 31, 32, 33, 39, 52], "_dcc2": 8, "_dcc3": 8, "check_tcl_bind": [8, 32], "match_parti": 8, "bind_use_attr": 8, "bind_has_builtin": 8, "snip": 8, "temporari": [8, 11, 27, 37, 39, 46], "pass": [8, 21, 30, 31, 32, 33, 35, 41, 43, 45, 50], "callback": [8, 35], "socket": [8, 17, 29, 34, 46, 48], "id": [8, 46], "putdcc": 8, "respond": [8, 11, 33, 46], "back": [8, 23, 30, 33, 39, 41, 44, 45, 46, 49], "depend": [8, 29, 35, 37, 44, 46, 48, 52], "caller": 8, "pars": [8, 21, 46], "atr": 8, "match_typ": 8, "matchtyp": 8, "result": [8, 23, 35, 37, 39, 41, 46], "bind_nomatch": 8, "tm": 8, "tm_last": 8, "check_bind_match": 8, "continu": [8, 33, 46], "tc": 8, "suffic": [8, 30], "check_bind_flag": 8, "hit": [8, 46], "tcl_eval": 8, "procnam": [8, 30, 46, 50], "grab": [8, 46], "trigger_bind": 8, "func_nam": [8, 29], "suppli": [8, 39], "case": [8, 15, 20, 21, 23, 30, 32, 33, 35, 36, 39, 46], "uniqu": [8, 36, 39, 46, 50], "identifi": [8, 31, 39, 45, 46, 52], "unsur": [8, 33], "wildcard": [8, 11, 30, 31, 46, 50], "exact": [8, 46], "tclegg": 8, "describ": [8, 29, 30, 33, 34, 36, 38, 39], "bind_stack": [8, 32], "add_builtin": [8, 29], "cmd_t": [8, 29, 32], "null": [8, 29, 32], "mycmd": 8, "tcl_name": 8, "void": [8, 29, 32], "cc": [8, 29], "p": [8, 11, 17, 31, 33, 38, 39, 46, 52], "1024": [8, 16, 17, 25, 32, 33], "cd_tcl_cmd": 8, "tclcmd": 8, "func": [8, 29], "bindtyp": 8, "funcnam": 8, "h_raw": 8, "324": 8, "got324": 8, "raw": [8, 35, 39, 48], "cmd_boot": 8, "cdata": 8, "add_cd_tcl_cmd": 8, "bind_bind_entri": 8, "context": [8, 29], "suppos": 8, "typic": [8, 16, 26, 39, 40, 43, 46, 51], "tcl_command": 8, "tcl_putdcc": 8, "clientdata": 8, "tcl_interp": 8, "irp": [8, 32], "argc": 8, "argv": [8, 32], "f": [8, 11, 32, 38, 39, 46, 47, 50, 52], "okai": [8, 39], "verifi": [8, 23, 31, 39, 48], "count": [8, 23], "badarg": [8, 32], "hand": [8, 30, 39, 46], "macro": [8, 29, 32], "saniti": 8, "checkvalid": [8, 32], "findidx": 8, "atoi": 8, "tcl_appendresult": [8, 32], "invalid": [8, 46], "tcl_error": [8, 32], "tcl_resetresult": 8, "tcl_ok": [8, 32], "oppos": [8, 46], "userrec": [8, 32], "know": [8, 18, 19, 23, 26, 29, 30, 35, 37, 38, 39, 46, 49, 51], "els": [8, 21, 30, 32, 43, 46], "par": [8, 32], "associ": [8, 26, 35, 46, 51], "gbuildin_dcc": 8, "annot": 8, "gdb": 8, "backtrac": 8, "thommei": 8, "0x55e8bd8a49b0": 8, "0x55e8be6a0010": 8, "614": 8, "0x55e8bd8aec90": 8, "8977024": 8, "flags_udef": 8, "chanrec": [8, 18, 46], "0x55e8bd8aeae0": 8, "0x55e8bd8a4a10": 8, "0x55e8bbf002d0": 8, "0x55e8bd59b1c0": 8, "0x55e8bd7e3e00": 8, "678": 8, "0x55e8be642fa0": 8, "0x55e8be9f6bd0": 8, "0x55e8be7d9020": 8, "0x0": 8, "usr": 8, "lib": 8, "x86_64": 8, "linux": [8, 33, 41], "libtcl8": 8, "lastbind": 8, "0x55e8bd5efda0": 8, "0x55e8bbf4112b": 8, "0x55e8bd5efd40": 8, "742": 8, "0x55e8bd5eecb0": 8, "0x7ffcf3f9dac1": 8, "0x7ffcf3f9d100": 8, "80": 8, "942": 8, "brkt": 8, "0x7ffcf3f9dac6": 8, "974": 8, "udef_glob": 8, "udef_chan": 8, "dcc_chat": 8, "buf": [8, 18], "1068": 8, "2002": [9, 13, 14, 19, 22, 27, 37, 43, 47, 52], "none": [9, 10, 11, 13, 15, 19, 20, 21, 22, 23, 25, 28, 46], "loadmodul": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 39, 45, 51], "2000": [9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 28, 39, 40, 45], "2003": [10, 24, 30], "md5": 10, "anymor": [10, 20, 39], "octob": [11, 20, 23], "chanfil": [11, 33, 49], "expir": [11, 18, 19, 23, 37, 39, 46, 48], "enforc": [11, 31, 35, 39], "chanmod": [11, 31], "mix": [11, 18], "endless": 11, "preconfigur": 11, "specifi": [11, 15, 16, 17, 19, 23, 24, 29, 31, 33, 36, 37, 39, 40, 41, 45, 46, 48, 50], "turn": [11, 17, 23, 39, 46], "off": [11, 17, 18, 23, 33, 38, 39, 43, 46], "plu": [11, 23, 39, 46, 48], "minu": 11, "front": [11, 30, 33, 34, 36, 46, 51], "integ": [11, 36, 46], "idl": [11, 29, 46], "kick": [11, 18, 23, 35, 36, 39, 46, 49, 52], "stopnethack": [11, 52], "de": [11, 35, 46], "anyon": [11, 36, 37, 46], "serverop": 11, "seven": [11, 46], "isoptest": 11, "wasoptest": 11, "split": [11, 18, 41, 43, 46, 47], "isop": 11, "wasop": [11, 18, 52], "bitch": 11, "reveng": 11, "punish": [11, 46, 52], "bad": [11, 46, 52], "four": [11, 30, 35, 39, 41, 46, 47], "deop": [11, 46, 52], "k": [11, 18, 23, 39, 46, 52], "19": [11, 46], "correspond": [11, 31, 37, 46], "replac": [11, 23, 29, 31, 39, 46, 47, 51], "20": [11, 16, 18, 26, 31, 39, 46], "29": [11, 25, 39, 46], "30": [11, 16, 18, 25, 31, 45, 46], "39": [11, 46], "120": [11, 23, 46], "60": [11, 16, 19, 23, 39, 46], "aop": 11, "delai": [11, 16, 18, 30], "maximum": [11, 15, 16, 18, 19, 23, 25, 32, 39, 45, 46, 48], "autoop": 11, "autohalfop": 11, "autovoic": [11, 52], "No": [11, 24, 31, 34, 46, 51], "y": [11, 14, 21, 34, 39, 52], "random": [11, 23, 38, 46], "putserv": [11, 21, 30, 31], "privmsg": [11, 30, 31, 46], "lamest": [11, 33, 38, 39, 47], "me": [11, 52], "co": 11, "lame": [11, 18, 38, 39, 46], "enclos": [11, 32, 41, 46, 50], "brace": 11, "shorter": 11, "getop": 11, "botnetop": 11, "unban": [11, 39, 46], "rais": [11, 23], "15": [11, 39, 45, 46, 47], "constitut": [11, 23, 39], "preced": [11, 33, 46, 48], "respctiv": 11, "enforceban": 11, "dynamicban": [11, 46], "necessari": [11, 34], "rememb": [11, 30, 31, 33], "userban": 11, "dynamicexempt": [11, 46], "remain": [11, 33, 37, 46], "userexempt": 11, "dynamicinvit": [11, 46], "userinvit": 11, "soon": [11, 46], "insecur": 11, "halfop": [11, 46, 52], "protectop": 11, "protecthalfop": 11, "dehalfop": [11, 46, 52], "protectfriend": 11, "statuslog": 11, "total": [11, 29, 40, 46], "member": [11, 29, 35], "regular": [11, 46, 48], "sampl": [11, 32, 33, 51], "01": [11, 18, 46], "40": [11, 31], "istn": 11, "friend": [11, 52], "revengebot": 11, "secret": 11, "cycl": [11, 23, 39], "dontkickop": 11, "instanc": [11, 35], "attack": [11, 20, 45], "inact": [11, 25], "leav": [11, 23, 33, 39, 43, 46, 51], "lose": 11, "nodesynch": 11, "fight": 11, "chanserv": 11, "ircop": [11, 18], "perman": [11, 37, 39, 46], "below": [11, 16, 17, 24, 26, 29, 30, 33, 39, 45, 46, 50], "fil": [11, 46], "explan": [11, 33, 34, 46, 50], "nt": 11, "chanset": [11, 31, 36, 38], "2004": [12, 18], "level": [12, 17, 31, 32, 35, 39, 52], "gzip": [12, 46], "autosav": 13, "doesn": [13, 15, 18, 32, 33, 36, 43, 46, 49, 50], "displai": [13, 16, 18, 23, 31, 32, 33, 36, 39, 46, 47, 50], "februari": 14, "12": [14, 46], "behavior": [14, 18, 37, 39, 41, 46], "ping": 14, "less": [14, 43, 46], "finger": [14, 33], "userinfo": [14, 46], "septemb": 15, "26": [15, 33, 48, 52], "troubl": [15, 39], "ones": [15, 24, 38, 41, 46], "rel": [15, 29, 33, 46], "standard": [15, 17, 18, 25, 29, 30, 42, 46, 48, 51, 52], "cach": [15, 46], "86400": 15, "respect": [15, 41, 46, 47], "ttl": 15, "upper": 15, "boundari": [15, 32], "negcach": 15, "600": [15, 18], "neg": [15, 39, 46], "nxdomain": 15, "lookup": [15, 39, 41, 46], "fail": [15, 25, 39, 46, 48], "maxsend": 15, "resend": [15, 46], "queri": [15, 17, 35, 41], "retrydelai": 15, "dec": [16, 46], "2017": 16, "mydir": 16, "root": [16, 17], "incom": [16, 39, 46], "upload": [16, 33, 40, 46, 49], "central": [16, 36, 39], "filedb": [16, 46], "subdirectori": [16, 46], "databas": [16, 46], "max": [16, 18, 19, 23, 25, 39], "effect": [16, 37, 39, 46], "infinit": 16, "files": 16, "size": [16, 25, 29, 32, 39, 46], "kb": 16, "sub": [16, 36, 46], "brows": 16, "tell": [16, 30, 31, 32, 33, 34, 35, 38, 39, 46, 51], "queu": [16, 23, 46], "exactli": [16, 18, 29, 30, 36, 46], "group": [16, 17, 39, 42, 46], "master": [16, 31, 33, 37, 38, 39, 46, 47, 52], "janitor": [16, 52], "broken": [16, 30, 39, 46], "word": [16, 18, 31, 32, 33, 38, 46, 50, 51], "break": [16, 46], "comment": [16, 18, 27, 30, 33, 39, 45], "over": [16, 21, 23, 26, 29, 30, 33, 39, 41, 46, 48, 49, 51], "client": [16, 17, 23, 26, 31, 33, 35, 39, 42, 46, 48, 51], "too": [16, 18, 23, 25, 29, 39, 46], "patient": 16, "simultan": [16, 25, 46], "remaind": [16, 50], "mark": [16, 32, 40, 46, 52], "hidden": [16, 33, 40, 46], "lsa": 16, "gif": 16, "uglyman": 16, "nobodi": [16, 30], "local": [16, 30, 33, 36, 39, 43, 44, 46, 48], "snowbot": 16, "ugli": 16, "shown": [16, 33, 36, 39], "kilobyt": [16, 39], "progress": 16, "eras": [16, 46], "remot": [16, 38, 39, 46, 47], "clean": 16, "slow": [16, 33, 39], "db": 16, "though": [16, 23, 30, 33, 46, 48], "tag": [16, 40, 42, 50], "filesystem": [16, 36, 46, 52], "june": 17, "2019": 17, "tradition": 17, "113": 17, "usernam": [17, 31, 33, 39, 50, 51], "custom": [17, 23, 30, 31, 35, 36, 40, 46, 48], "oidentd": 17, "nor": 17, "thu": [17, 30, 35, 41, 45, 46], "modern": [17, 33, 45], "oss": 17, "sudo": [17, 33], "setcap": 17, "cap_net_bind_servic": 17, "ep": 17, "imperson": 17, "iptabl": 17, "rout": [17, 46], "destin": [17, 29], "nat": [17, 39, 41], "prerout": 17, "eth0": 17, "dport": 17, "j": [17, 29, 38, 39, 46, 52], "redirect": 17, "addition": [17, 21, 33, 35, 46], "caus": [17, 32, 33, 38, 46, 49], "bound": [17, 39, 46], "netsplit": [17, 18, 39, 40, 46], "reboot": [17, 31], "conflict": 17, "suit": [17, 32, 33], "singl": [17, 18, 31, 36, 46, 50], "environ": [17, 39, 40, 48], "spoof": 17, "open": [17, 31, 32, 36, 39, 43, 44, 46, 48], "builtin": [17, 46], "identd": [17, 33], "shouldn": 17, "begin": [17, 30, 41, 46], "august": [18, 39], "21": [18, 33], "bounc": 18, "reach": [18, 23, 32, 39], "45": 18, "left": [18, 32, 46], "unless": [18, 23, 30, 33, 37, 39, 46], "overridden": 18, "unabl": [18, 33, 38, 41, 46, 51], "learn": [18, 31, 32, 33, 39, 40, 46], "themselv": [18, 33, 38, 46, 49], "userflag": 18, "hello": [18, 21, 23, 31, 33, 39, 40, 46], "afterward": [18, 39], "1500": 18, "180": 18, "200": [18, 43], "byte": [18, 23, 25, 29, 32, 46], "unbind": [18, 39, 49, 50], "myword": 18, "addhost": 18, "takeov": 18, "occur": [18, 30, 46], "due": [18, 23, 30, 39, 46, 50], "blindli": 18, "ing": [18, 26, 51], "guess": 18, "discourag": 18, "opchar": 18, "recogn": [18, 23, 31, 52], "fine": [18, 23, 39, 50], "unrealircd": [18, 46], "lazi": 18, "gone": [18, 46], "At": [18, 32, 38, 39, 43, 51], "moment": [18, 33, 34], "ircd": [18, 23, 46], "per": [18, 46, 50], "stack": [18, 41, 46], "guarante": [18, 35], "although": [18, 33, 39, 46], "higher": [18, 20, 24, 25, 33, 48], "modes_per_line_max": 18, "recompil": [18, 33], "lk": 18, "354": [18, 46], "ircu2": 18, "rfc": [18, 23, 26, 46, 51], "compliant": [18, 23, 46], "1459": 18, "routin": [18, 39, 46], "notefil": [19, 46], "privat": [19, 24, 30, 31, 33, 34, 36, 39, 43, 46, 48], "50": [19, 31, 39], "life": [19, 33], "dai": [19, 25, 39, 46, 49], "fwd": 19, "forward": 19, "address": [19, 24, 27, 33, 38, 39, 41, 48], "notifi": [19, 23, 33, 39, 40, 42, 46], "hourli": [19, 29, 39], "onjoin": 19, "2020": [20, 26, 39, 48, 50], "safe": [20, 31, 33, 34, 45, 51], "outsid": [20, 32, 34, 39], "rijndael": 20, "sha256": 20, "cryptograph": [20, 45, 46], "digest": [20, 46], "algorithm": [20, 45], "round": [20, 45], "1600": 20, "brute": 20, "novemb": [21, 24, 25, 42], "03": [21, 39, 46], "py": 21, "myscript": 21, "putmsg": 21, "extend": [21, 26, 40, 42, 46], "analg": 21, "entir": [21, 33, 46, 50, 51], "catalog": 21, "chanlist": 21, "convert": [21, 46], "empti": [21, 46, 50], "object": 21, "tupl": 21, "dict": [21, 36, 46, 50], "dictionari": [21, 46], "str": [21, 36], "few": [21, 26, 30, 32, 33, 34, 39, 46, 51], "convers": [21, 29, 43, 48], "tcl_binds_": [], "known": [21, 23, 31, 39, 45, 46], "onvert": 21, "resync": [21, 24], "disconnect": [21, 23, 24, 39, 46], "buffer": [21, 24], "reconnect": [21, 24, 46], "examplescript": 21, "bestfriend": 21, "imdb": 21, "third": [21, 30, 32, 38], "listtl": 21, "tcl_list": 21, "usuabl": 21, "urltitl": 21, "parser": 21, "collect": 21, "titl": [21, 52], "page": [21, 33, 44], "z": [21, 34, 52], "librari": [21, 30, 32, 45, 48], "egg": 21, "freenod": 23, "rizon": 23, "sane": 23, "altnick": [23, 33], "stb": 23, "unavail": [23, 39], "hi": [23, 30, 33], "primari": [23, 39], "realnam": [23, 46], "real": [23, 29, 31, 46], "field": [23, 32, 35, 36, 39, 46, 48], "evnt": [23, 46], "init": [23, 39, 46], "init_serv": 23, "botnick": [23, 30, 31, 33, 39], "putquick": 23, "w": [23, 39, 46, 47, 52], "immedi": [23, 32, 33, 35, 45, 46], "deprici": 23, "7000": [23, 33, 34, 46], "2001": [23, 27, 28, 33, 39, 43], "db8": [23, 33, 39], "618": [23, 33, 39], "5c0": [23, 33, 39], "263": [23, 33, 39], "6669": [23, 33], "6697": [23, 33, 46, 48], "whenev": [23, 29, 32, 35, 38, 46, 48], "sign": [23, 31, 34, 39, 46, 47, 48, 51], "jump": [23, 32, 38, 48], "rate": 23, "transmit": 23, "lower": 23, "512": [23, 25], "verif": [23, 39, 48], "assum": [23, 30, 33, 34, 35, 37, 39, 46], "peer": [23, 39, 48], "alt": [23, 39], "16": [23, 39, 45, 46], "32": [23, 39], "revok": [23, 39], "instantli": 23, "low": 23, "respons": [23, 35, 46], "stone": 23, "di": 23, "hasn": 23, "serverror": 23, "queue": [23, 29], "300": [23, 39], "dump": [23, 39, 46], "chunk": 23, "probabl": [23, 31, 33, 34, 46], "quiet": [23, 36, 39, 52], "reject": [23, 38, 39], "squelch": 23, "lowercas": 23, "mirc": [23, 46], "exclus": [23, 46], "pubm": [23, 46], "msgm": [23, 46], "doubl": 23, "penalti": 23, "calcul": 23, "measur": 23, "trace": 23, "accordingli": 23, "three": [23, 31, 32, 35, 36, 37, 38, 39, 46], "summar": 23, "cpu": [23, 39, 46], "intens": 23, "r": [23, 31, 38, 39, 46, 52], "umod": 23, "understood": 23, "indic": [23, 29, 33, 46, 50], "len": 23, "900": 24, "hold": [24, 46], "flush": 24, "overrid": [24, 41, 48], "mnot": 24, "paranoid": [24, 39], "discard": [24, 46], "dload": 25, "block": [25, 26, 29, 33, 47, 51], "ircii": [25, 46], "admit": 25, "turbo": [25, 33], "xfer": [25, 52], "sharefail": 25, "unlink": [25, 39], "abort": [25, 33, 46, 48], "retri": 25, "april": [26, 50], "gatewai": [26, 50, 51], "stream": [26, 51], "claim": [26, 51], "certainli": [26, 33, 51], "meaning": [26, 46, 51], "intent": [26, 51], "spectrum": [26, 51], "focus": [26, 51], "raid": [26, 51], "donat": [26, 51], "userst": [26, 51], "roomstat": [26, 51], "broadcast": [26, 43, 46, 50, 51], "000": [26, 43, 51], "unreli": [26, 50, 51], "moder": [26, 31, 50, 51], "mostli": [26, 46, 51], "infeas": [26, 51], "workaround": [26, 35], "tradit": [26, 41, 49, 50, 51], "downer": 26, "worri": 26, "ton": 26, "clearchat": [26, 50], "clearmsg": [26, 50], "hosttarget": [26, 50], "whisper": [26, 50], "usernotic": [26, 50], "roomsstat": 26, "twcmd": [26, 51], "ip": [27, 31, 33, 34, 39, 41], "logfil": [27, 29, 33, 39, 49], "publicli": 27, "31": [28, 39, 43, 46], "occurr": 29, "ensur": [29, 31, 33, 38, 45, 46], "module_nam": [29, 32], "making_modulenam": 29, "examin": 29, "close": [29, 46], "stdio": 29, "stdlib": 29, "sy": 29, "drastic": [29, 46], "reduc": [29, 50], "decent": 29, "throughout": 29, "refer": [29, 30, 34, 39, 46], "liter": [29, 46], "func_tabl": 29, "module_regist": [29, 32], "major": [29, 32, 33, 36, 46], "minor": [29, 32, 36, 46], "module_depend": [29, 32], "success": [29, 33, 46], "stage": 29, "any_other_funct": 29, "you_want_to_export": 29, "unload": [29, 32, 46], "apart": [29, 39], "tidi": 29, "thorough": [29, 31, 34, 51], "trail": 29, "garbag": 29, "module_undepend": [29, 32], "talli": 29, "memori": [29, 32, 46], "alloc": [29, 46], "dealloc": 29, "nmalloc": 29, "nfree": 29, "fault": 29, "posit": [29, 39], "resourc": 29, "dprintf": [29, 32], "printf": 29, "dp_log": 29, "dp_stdout": 29, "stdout": 29, "dp_mode": 29, "dp_server": 29, "dp_help": 29, "module_entri": 29, "module_find": 29, "search": [29, 31, 46], "module_renam": 29, "old_module_nam": 29, "new_module_nam": 29, "frim": 29, "add_hook": 29, "hook_num": 29, "del_hook": 29, "hook": 29, "hook_secondli": 29, "hook_minut": 29, "hook_5minut": 29, "hook_hourli": 29, "hook_daili": 29, "hook_read_userfil": 29, "hook_userfil": 29, "hook_pre_rehash": 29, "hook_rehash": 29, "hook_idl": 29, "whole": 29, "hook_backup": 29, "hook_load": 29, "hook_di": 29, "die": [29, 31, 33], "module_unload": 29, "module_load": 29, "tri": [29, 39, 46], "add_tcl_command": 29, "tcl_cmd": [29, 32], "tab": 29, "rem_tcl_command": 29, "function_to_cal": 29, "add_tcl_int": 29, "tcl_int": 29, "rem_tcl_int": 29, "variable_nam": 29, "readonli": 29, "add_tcl_str": 29, "tcl_string": 29, "rem_tcl_str": 29, "str_dir": 29, "constantli": 29, "append": [29, 32, 36, 46], "str_protect": 29, "p_tcl_hash_list": 29, "rem_builtin": 29, "displaynam": 29, "taken": [29, 46], "auch": 29, "filt": [29, 46], "noth": [29, 36, 39, 46, 51], "logmod": 29, "nice": 29, "mention": 29, "realli": [30, 32, 33, 36, 39, 49], "idea": [30, 33, 44], "busi": 30, "annoi": 30, "intention": 30, "definit": [30, 33, 34, 45], "languag": [30, 39, 40, 49], "especi": 30, "bottom": 30, "greetscript": 30, "author": [30, 34, 39, 48], "geo": 30, "gree": 30, "pmsg": 30, "greetmsg": 30, "welcom": 30, "uhost": [30, 46], "whew": 30, "ok": 30, "importantli": [30, 32], "wrote": 30, "credit": [30, 46], "contact": [30, 39], "hard": [30, 39], "larger": [30, 45], "harder": [30, 33], "why": [30, 33, 46], "And": [30, 32, 36], "omin": 30, "dissect": 30, "action": [30, 31, 34, 39, 46], "react": [30, 35], "toward": 30, "refin": 30, "foo": [21, 30, 31, 32, 36, 46], "aol": [30, 45], "sum": 30, "hostmask": [30, 31, 37, 38, 40, 45], "told": 30, "declar": [30, 32, 36, 46], "said": [30, 32, 38, 46], "magic": 30, "awesom": [30, 36], "sexystuff": 30, "fourth": 30, "trick": [30, 49], "didn": [30, 33, 46], "talk": [30, 32, 34, 35, 36, 40, 43], "bodi": 30, "true": 30, "deserv": 30, "insid": [30, 36, 39], "challeng": [30, 31], "mayb": [30, 39], "fancyp": 30, "sound": 30, "utim": 30, "dozen": 30, "defens": 30, "grain": 30, "salt": [30, 45], "further": [31, 46], "IN": 31, "OR": [31, 46], "putti": 31, "listen": [31, 33, 38, 39, 41, 48], "3183": 31, "whoi": [31, 39], "chattr": [31, 52], "grant": [31, 40, 48, 51], "numer": [31, 34, 46], "chaninfo": [31, 38], "involv": 31, "snt": 31, "histor": [31, 46], "reli": [31, 46], "ten": 31, "commonli": [31, 34, 36, 39, 46], "humor": 31, "youreggdropconfignameher": 31, "review": [31, 34], "youreggdrop": 31, "editor": [31, 33, 36], "thee": [31, 46], "systemctl": 31, "botnam": [31, 38], "reload": [31, 36], "acknowledg": 31, "confus": [31, 46], "unfortun": 31, "consult": [31, 41, 42, 48], "uncom": [31, 34, 39, 45], "layer": [31, 34], "becom": [31, 33, 39, 46], "preval": 31, "elimin": 31, "cloak": 31, "ever": [31, 33, 39, 46, 48], "appear": [31, 33, 38, 39, 46, 50], "mechan": 31, "plain": [31, 39, 48], "plaintext": [31, 46, 48], "exchang": 31, "ecdsa": 31, "nist256p": 31, "keypair": [31, 34], "pair": [31, 34, 35, 46, 48, 50], "ecparam": 31, "genkei": 31, "prime256v1": 31, "pem": [31, 39], "fingerprint": [31, 38, 39, 48], "ec": 31, "noout": 31, "conv_form": 31, "grep": 31, "tail": 31, "tr": 31, "xxd": 31, "base64": 31, "On": [31, 33, 34, 37, 38], "pubkei": 31, "req": [31, 39, 48], "x509": [31, 39, 48], "node": [31, 48], "keyout": [31, 48], "crt": [31, 39, 48], "yoru": 31, "outform": 31, "der": 31, "sha1sum": 31, "cut": 31, "f1": 31, "privatekei": [31, 34, 38, 39, 48], "cert": [31, 38, 39, 48], "onto": 32, "wherea": [32, 46], "our": [32, 33, 38, 46], "redistribut": 32, "publish": [32, 39], "hope": [32, 33, 51], "merchant": 32, "fit": 32, "FOR": 32, "59": [32, 46], "templ": 32, "330": 32, "02111": 32, "1307": 32, "necessarili": [32, 46], "undef": 32, "server_func": 32, "export_scop": 32, "woobie_start": 32, "woobie_expmem": 32, "woobie_report": 32, "global_func": 32, "woobie_t": 32, "108": 32, "woobie_clos": 32, "log_cmd": 32, "print": 32, "cmd_woobi": 32, "mywoobi": 32, "scope": [32, 34], "tutori": [32, 34], "echo": [32, 40, 42, 49], "tcl_echom": 32, "stdvar": 32, "strcmp": 32, "llama": [32, 38], "illeg": 32, "input": [32, 46], "paramet": [32, 46], "exceed": [32, 39], "style": [32, 37, 46], "quset": 32, "mytcl": 32, "echom": 32, "newli": 32, "certain": [32, 37, 39, 40, 41, 46, 47, 50, 52], "condit": 32, "met": 32, "h_woob": 32, "woobie_2char": 32, "del_bind_t": 32, "woobie_3char": 32, "bar": [32, 46], "moo": [32, 46], "boilerpl": 32, "check_tcl_bindnam": 32, "check_tcl_woobi": 32, "userhost": [32, 50], "snprintf": 32, "_woob1": 32, "_woob2": 32, "match_mask": 32, "bind_exec_log": 32, "encount": [32, 33, 51], "perhap": 33, "websit": [33, 36], "slennox": 33, "incredibli": [33, 46], "prove": 33, "debian": [33, 34], "apt": [33, 34], "wget": 33, "commandlin": 33, "zxvf": 33, "seri": [33, 46, 48], "multi": 33, "patchlevel": 33, "comfort": 33, "haven": 33, "daili": [33, 46], "chanc": [33, 36], "checkout": [33, 44], "skip": [33, 46], "commerci": 33, "problem": [33, 39, 41], "box": [33, 39], "isp": 33, "appli": [33, 37, 39, 45, 52], "curl": 33, "ssh": 33, "gunzip": 33, "xvf": 33, "extract": [33, 36, 46], "slash": [33, 43], "brief": 33, "fast": 33, "botdir": 33, "cooldud": 33, "delet": [33, 36, 49], "rf": 33, "handi": 33, "zip": 33, "notepad": 33, "editplu": 33, "nano": 33, "vim": 33, "offer": [33, 34, 35, 50, 51], "quicker": 33, "nicebot": 33, "carefulli": [33, 46], "vagu": 33, "preserv": 33, "llamabot": [33, 39], "login": [33, 39, 45, 50], "vhost4": [33, 39, 41], "vhost": [33, 39, 41], "ipv4": [33, 39, 41], "vhost6": [33, 39, 41], "5254": 33, "dead": 33, "b33f": 33, "1337": 33, "f270": 33, "captur": [33, 46, 49], "mcobx": 33, "jkp": 33, "donkei": 33, "hors": 33, "3333": [33, 38, 39], "65535": [33, 39], "49152": 33, "rang": [33, 39], "reserv": [33, 39, 43], "basi": 33, "stealth": [33, 39], "scan": 33, "newus": [33, 39], "mrlame": [33, 39], "mrslame": [33, 39], "addus": 33, "rejoin": [33, 46], "aren": [33, 39, 46, 49, 50], "pain": 33, "backslash": 33, "rule": 33, "prematur": 33, "phew": 33, "cross": 33, "gave": 33, "promptli": 33, "kill": [33, 46], "pid": [33, 39, 46], "mnt": 33, "launch": 33, "persist": 33, "luck": [33, 51], "walk": 34, "scenario": [34, 35, 38], "sidenot": 34, "despit": 34, "anachron": 34, "interchang": [34, 41], "transport": 34, "protocol": [34, 39, 42, 46, 48], "appreci": 34, "fork": [34, 44], "ubuntu": 34, "distro": 34, "denot": [34, 46], "pretendnet": 34, "suffici": 34, "wizard": 34, "5555": [34, 38, 39], "hubbot": [34, 38], "perfect": 35, "status": 35, "accur": [35, 46, 50], "alert": [35, 51], "deauthent": 35, "spec": [35, 46], "isupport": 35, "005": [35, 42, 46], "eggdroptest": [35, 50], "beerbot": 35, "tn": 35, "announc": 35, "issupport": 35, "isset": 35, "reliabl": [35, 46, 50], "significantli": [35, 50], "increas": [35, 39, 45], "accuraci": 35, "supplementari": 35, "attach": [35, 46, 50], "overal": 35, "situat": [35, 38], "cover": [35, 37, 38], "incept": 36, "friendli": 36, "special": [36, 38, 46], "locallt": 36, "novel": 36, "namespac": 36, "wrap": 36, "eval": 36, "scriptnam": 36, "statement": [36, 46], "practic": [36, 45, 46], "lessen": 36, "collid": 36, "metadata": 36, "th": 36, "schema": 36, "version_major": 36, "version_minor": 36, "long_descript": 36, "yeah": 36, "besid": 36, "enough": [36, 39], "udef": 36, "myflag": 36, "mystr1": 36, "mystr2": 36, "myint1": 36, "var": [36, 46], "woobie_dict": 36, "q": [36, 52], "woobie_set": 36, "woobie_str": 36, "arrai": 36, "whether": [36, 39, 41, 46], "varnam": 36, "tgz": 36, "proper": [36, 41, 46], "myscript_goodversion_specialfeatur": 36, "sorri": 36, "collis": 36, "myscript_set": 36, "ms_set": 36, "localm": 36, "regardless": [36, 46], "march": [37, 47, 52], "07": [37, 52], "clarifi": 37, "sticki": [37, 46], "unsticki": 37, "stick": 37, "attribut": [37, 38, 46, 52], "kept": [37, 39], "obvious": [37, 46], "unstick": 37, "whose": [37, 46], "whichev": 37, "consist": [38, 40, 43, 46], "leaf": [38, 39, 45, 48], "assign": [38, 39, 46], "aggress": 38, "passiv": 38, "physic": 38, "bota": 38, "botb": 38, "botc": 38, "sharebot": [38, 39, 46], "slave": 38, "botattr": 38, "isol": 38, "unlimit": 38, "4444": [38, 39], "thoroughli": 38, "relink": 38, "scripter": 38, "prepar": 38, "lameshar": 38, "hp": [38, 39], "beldin": 38, "pipe": 38, "he": [38, 46], "unreach": 38, "auth": [38, 39, 48], "fprint": [38, 39, 48], "sha1": [38, 48], "0and": 38, "qualifi": 39, "admin": [39, 47], "lamer": 39, "someircnetwork": 39, "timezon": 39, "est": 39, "timestamp": [39, 46], "alphabet": 39, "european": 39, "utc": 39, "cet": 39, "offset": 39, "coordin": 39, "univers": 39, "gmt": [39, 46], "west": 39, "prime": 39, "meridian": 39, "east": 39, "23": [39, 46], "env": 39, "tz": 39, "everywher": [39, 41, 46], "99": [39, 43], "virtual": 39, "outgo": [39, 46, 49], "prefer": [39, 41, 48], "resolut": 39, "famili": 39, "addlang": [39, 46], "english": [39, 49], "egg_lang": 39, "danish": 39, "french": 39, "finnish": 39, "german": 39, "chatter": 39, "24": [39, 41], "logfilenam": 39, "yesterdai": 39, "48": 39, "concurr": [39, 45], "infin": 39, "decreas": 39, "logsiz": 39, "550": 39, "fill": [39, 44, 48], "quota": 39, "ram": 39, "hole": 39, "care": [39, 46, 51], "logflag": 39, "misc": [39, 46], "wallop": [39, 46], "eight": [39, 46], "belong": 39, "mco": [39, 46], "jpk": 39, "min": 39, "sec": 39, "man": 39, "strftime": 39, "forev": 39, "digit": [39, 48], "month": [39, 46], "fresh": 39, "militari": 39, "00": [39, 46, 47], "am": [39, 52], "midnight": 39, "04may2000": 39, "produc": [39, 46], "yyyymmdd": 39, "manpag": 39, "mkcoblx": 39, "pidfil": 39, "motd": [39, 47], "banner": [39, 47], "perm": 39, "0600": 39, "octal": 39, "remind": 39, "rw": 39, "0400": 39, "0200": 39, "0660": 39, "0440": 39, "0220": 39, "0666": 39, "0444": 39, "0222": 39, "kiddi": 39, "head": 39, "unimport": 39, "deal": [39, 46, 52], "maxim": 39, "1025": 39, "prepend": 39, "prohibit": 39, "sanitycheck": 39, "bogu": 39, "ground": 39, "wouldn": 39, "anywai": 39, "thr": 39, "firewal": 39, "sun": 39, "barr": 39, "ebai": 39, "3666": 39, "behind": 39, "passthru": 39, "127": 39, "192": [39, 46], "168": [39, 46], "255": 39, "172": 39, "transpar": 39, "masquerad": 39, "portrang": 39, "url": [39, 46], "birthdai": 39, "userinfo1": 39, "moreov": 39, "simul": [39, 46], "ethic": 39, "dk": [39, 46], "dupwait": 39, "spread": 39, "lag": [39, 43], "cidr": [39, 46], "notat": 39, "genrsa": 39, "4096": [39, 48], "rsa": 39, "strong": 39, "schat": [39, 48], "conveni": 39, "cipher": [39, 46, 48], "side": [39, 46, 48, 51], "365": 39, "depth": [39, 48], "chain": [39, 48], "shall": 39, "capath": [39, 48], "cafil": [39, 48], "ca": 39, "colon": [39, 41], "comma": [39, 43, 46], "silent": 39, "adh": 39, "anonym": 39, "dh": 39, "uid": [39, 48], "chfinger": 39, "slower": 39, "everydai": 39, "limbo": 39, "serv": 39, "alltool": 39, "robot": 40, "regularli": 40, "awai": [40, 42, 46], "chghost": [40, 42, 46], "setnam": [40, 42], "whox": [40, 46], "unaccess": 40, "combin": [40, 46], "mar": 41, "2021": [41, 42, 49], "establish": [41, 46, 48], "freebsd": 41, "netbsd": 41, "openbsd": 41, "mac": 41, "vista": 41, "xp": 41, "unoffici": 41, "wherev": 41, "squar": 41, "bracket": 41, "doubt": 41, "Their": 41, "began": 42, "rfc1459": [42, 46], "rfc2812": 42, "compris": 42, "decid": [42, 45], "emerg": 42, "optino": 42, "assumpt": 42, "explicit": 42, "302": [42, 46], "miniatur": 43, "watch": [43, 50], "999": 43, "wide": [43, 48], "anywher": [43, 46], "dot": 43, "apostroph": 43, "everyon": [43, 46], "contribut": 44, "think": [44, 52], "repo": 44, "click": [44, 51], "button": [44, 51], "descriptivebranchnam": 44, "confirm": [44, 46], "push": [44, 46], "yourusernam": 44, "yourbranchnam": 44, "templat": 44, "pour": 44, "cold": [44, 45], "bask": 44, "warm": 44, "karma": 44, "crytopgraphi": 45, "content": [45, 46, 50], "sensit": 45, "crypto": 45, "solut": 45, "deriv": 45, "revers": [45, 46], "seamless": 45, "enjoi": 45, "beverag": 45, "chpass": 45, "consider": 45, "ideal": [45, 51], "essenti": 45, "fanci": 45, "lobster": 45, "dinner": 45, "encpass2": 45, "pbk": 45, "2024": 46, "exhaust": [46, 50], "categori": 46, "vertic": 46, "faster": 46, "bypass": 46, "caution": 46, "lieu": 46, "negoti": [46, 48], "mytag": 46, "baa": 46, "flat": 46, "servivc": 46, "botfl": 46, "botaddr": 46, "laston": 46, "xtra": 46, "visibl": 46, "counterpart": 46, "filearea": 46, "remotebotnam": 46, "globalflag": 46, "channelflag": 46, "subsequ": 46, "botaddress": 46, "ipaddress": 46, "ipv4address": 46, "ipv6address": 46, "behav": 46, "getinfo": 46, "unstuck": 46, "jupe": 46, "sublist": 46, "zero": 46, "differenti": 46, "abcdechannel": 46, "got": 46, "modechang": 46, "refresh": [46, 50], "fragil": 46, "notif": 46, "behalf": 46, "compon": 46, "duplic": 46, "element": 46, "bywho": 46, "ag": 46, "reset": 46, "reread": 46, "memberlist": 46, "lost": 46, "ntik": 46, "serverlist": 46, "ex": 46, "goober": 46, "ON": 46, "forget": 46, "reiniti": 46, "coupl": 46, "throw": 46, "alia": 46, "99999": 46, "greater": 46, "equal": 46, "she": 46, "mpj": 46, "pj": 46, "moc": 46, "mp": 46, "configfil": 46, "omit": [46, 48], "boldfac": 46, "video": 46, "underlin": [46, 47], "ansi": 46, "ctrl": 46, "bell": 46, "ordinari": [46, 48], "ital": 46, "intercept": 46, "item": 46, "uplink": 46, "botnetnick": 46, "file_receiv": 46, "file_send": 46, "file_send_pend": 46, "readabl": 46, "lindex": 46, "six": 46, "blank": 46, "mandatori": 46, "permit": 46, "failur": [46, 50], "kind": 46, "succeed": 46, "pathnam": 46, "resum": 46, "bitchx": 46, "python": [2, 6, 46], "five": 46, "jp": 46, "34": 46, "04": 46, "06": 46, "08": [46, 47], "interv": 46, "secondli": 46, "repres": [46, 50], "jan": [46, 48], "1970": 46, "week": 46, "804600": 46, "vari": [46, 52], "posix": 46, "portabl": 46, "fri": 46, "aug": 46, "55": 46, "1973": 46, "rand_max": 46, "2147483647": 46, "underli": 46, "pseudo": 46, "relinquish": 46, "deliv": 46, "notebox": 46, "caught": 46, "encod": [46, 47], "ascii": 46, "64": 46, "ecb": 46, "cbc": 46, "pick": 46, "fatal": 46, "wasn": 46, "128": 46, "pre": [46, 48], "myownevent123": 46, "todai": 46, "couldn": 46, "17": 46, "insensit": 46, "simplifi": 46, "rfc_compliant": 46, "spent": 46, "mem": 46, "exclud": 46, "cleartext": 46, "vali": 46, "valis0": 46, "crappi": 46, "math": 46, "ufl": 46, "edu": [46, 52], "eu": 46, "pl1": 46, "1010201": 46, "mnnrrpp": 46, "nn": 46, "rr": 46, "pp": 46, "437": 46, "expans": 46, "quot": [46, 50], "highest": 46, "prioriti": 46, "danger": 46, "logic": 46, "proce": 46, "easiest": 46, "build": 46, "ti": 46, "lastli": 46, "ov": 46, "mn": 46, "unknown": 46, "phrase": 46, "spoken": 46, "notc": 46, "breach": 46, "notcproc": 46, "partproc": 46, "signoff": 46, "possibli": [46, 50], "twice": 46, "rawt": 46, "topc": 46, "kicker": 46, "newnick": 46, "typo": 46, "18": 46, "guppi": 46, "mode_proc": 46, "stai": 46, "mode_proc_fix": 46, "ctcr": 46, "embed": 46, "supplant": 46, "368": 46, "unexpect": 46, "chon": 46, "chof": 46, "recipi": 46, "rcvd": 46, "invok": 46, "dronepup": 46, "eden": 46, "wild": 46, "spoke": 46, "bcst": 46, "disc": 46, "splt": 46, "Be": 46, "awar": 46, "fals": 46, "alarm": 46, "fake": 46, "rejn": 46, "needop": 46, "needal": 46, "flud": 46, "wall": 46, "sender": 46, "chjn": 46, "chpt": 46, "0000": 46, "9999": 46, "schedul": 46, "pad": 46, "unld": 46, "nkch": 46, "oldhandl": 46, "newhandl": 46, "sighup": 46, "hup": 46, "sigterm": 46, "sigil": 46, "ill": 46, "sigquit": 46, "prerehash": 46, "prerestart": 46, "preinit": 46, "tout": 46, "stall": 46, "flexibl": [46, 48], "noqueu": 46, "cron": 46, "weekdai": 46, "evalu": 46, "express": [6, 46], "delimit": 46, "whitespac": 46, "sundai": 46, "handshak": 46, "shutdownreason": 46, "shutdown": 46, "sigkil": 46, "ircawai": 46, "301": 46, "catch": 46, "invt": 46, "invite": 46, "late": 46, "distinguish": 46, "unset": 46, "revert": 46, "treat": [46, 51], "signal": 46, "verbos": 46, "affet": 46, "retain": 46, "driven": 46, "misnom": 46, "song": 46, "danc": 46, "eof": 46, "arriv": 46, "dispos": 46, "newidx": 46, "6687": 46, "escap": 46, "insert": 47, "invers": 47, "flash": 47, "botnetcentr": 47, "percent": 47, "col": 47, "column": 47, "width": 47, "center": 47, "70": 47, "meet": 48, "autodetect": 48, "forcefulli": 48, "sslinc": 48, "ssllib": 48, "starttl": 48, "certifict": 48, "graphic": 48, "deliber": 48, "sdcc": 48, "kvirc": 48, "synchron": 48, "infrastructur": 48, "subject": 48, "s_client": 48, "sslport": 48, "issuer": 48, "jun": 49, "02": 49, "2500": 49, "high": 49, "therebi": [49, 51], "lang": 49, "techniqu": 49, "yourbot": 49, "myvar": 49, "held": 50, "natur": 50, "WILL": 50, "unintend": 50, "consequ": 50, "truncat": 50, "assur": 50, "replic": [50, 51], "vip": [50, 51], "subscrib": [50, 51], "badgui": 50, "comprehens": 50, "twith": 50, "gui": 50, "flagmask": 50, "ccht": 50, "histori": 50, "tmi": 50, "tv": [50, 51], "target": 50, "cmsg": 50, "msgid": 50, "htgt": 50, "viewer": 50, "similarli": 50, "arbitrarili": 50, "wspr": 50, "popul": 50, "wspm": 50, "rmst": 50, "emot": 50, "uncertainti": 50, "usst": 50, "usrntc": 50, "discontinu": 51, "technic": 51, "token": 51, "oauth": 51, "alphanumer": 51, "pretend": 51, "j9irk4vs28b0obz9easys4w2ystji3u": 51, "spoiler": 51, "sake": 51, "light": 51, "decis": 51, "notabl": 51, "topic": 51, "degrad": 51, "capac": 51, "face": 51, "hubcap": 52, "clemson": 52, "hate": 52, "milk": 52, "meaningless": 52, "entitl": 52, "badg": 52, "mainten": 52, "washalfop": 52, "nethack": 52, "highlight": 52, "individu": 21, "eggsrop": 21, "bind_typ": [], "pysourc": 6, "parse_tcl_list": 6, "parse_tcl_dict": 6}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"about": [0, 2, 41, 42, 48], "eggdrop": [0, 2, 3, 4, 5, 6, 7, 8, 21, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 44, 46, 50], "bore": 1, "legal": 1, "stuff": 1, "an": [2, 21, 29, 30, 31, 34], "open": 2, "sourc": [2, 16, 33], "irc": [2, 18, 34, 48, 51], "bot": [2, 16, 38, 46], "some": 2, "thing": 2, "you": 2, "can": [2, 7], "do": [2, 7, 29], "how": [2, 4, 5, 7, 29], "get": [2, 4, 16, 33, 46], "instal": [2, 3, 7, 33, 41, 48], "pre": [2, 4, 34], "requisit": [2, 4, 34], "where": 2, "find": 2, "more": 2, "help": [2, 4], "us": [2, 21, 35, 38], "tutori": 2, "modul": [2, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 32, 39, 46], "quick": [3, 4], "startup": [3, 4], "cygwin": 3, "requir": [3, 29, 32, 35, 46], "window": 3, "readm": 4, "notic": 4, "what": [4, 7, 29, 38], "i": [4, 7, 38], "ftp": 4, "git": 4, "develop": [4, 36], "snapshot": 4, "docker": 4, "system": [4, 31], "upgrad": [4, 5], "command": [4, 5, 21, 26, 32, 36, 46, 49, 50], "line": [4, 43], "auto": 4, "start": [4, 33], "document": [4, 5], "obtain": 4, "must": 5, "read": 5, "chang": [5, 46], "v1": 5, "9": 5, "config": [5, 16, 21, 33, 36, 46, 49, 51], "file": [5, 16, 21, 33, 34, 36, 39, 46, 49, 51], "script": [5, 21, 30, 35, 36, 39, 48], "botnet": [5, 34, 38, 39, 48], "tcl": [5, 8, 21, 26, 32, 35, 36, 45, 46, 50], "includ": 6, "inform": [7, 34], "ar": 7, "compil": 7, "without": 7, "dynam": 7, "static": 7, "still": 7, "need": 7, "loadmodul": [7, 46], "bind": [8, 21, 32, 46, 50], "intern": 8, "tabl": 8, "creation": 8, "stackabl": [8, 46], "ht_stackabl": 8, "trigger": 8, "ani": 8, "c": 8, "handler": 8, "summari": 8, "assoc": [9, 46], "blowfish": 10, "channel": [11, 16, 31, 46, 50], "set": [11, 31, 33, 36, 39, 41, 46, 48], "valu": [11, 46], "base": 11, "enabl": [11, 34, 35, 45, 46], "disabl": 11, "default": [11, 49], "compress": [12, 46], "consol": [13, 39, 46], "ctcp": [14, 41], "dn": 15, "filesi": [16, 46], "setup": 16, "partylin": [16, 21, 26, 31, 32], "usag": [16, 36, 41, 42, 45, 48], "cancel": 16, "cd": 16, "directori": [16, 39, 46], "cp": [16, 46], "dst": 16, "desc": [16, 46], "descript": 16, "filestat": 16, "user": [16, 31, 38, 46, 52], "clear": [16, 46], "stat": 16, "filenam": [16, 46], "nicknam": [16, 46], "hide": 16, "ln": 16, "filepath": 16, "localfil": 16, "l": [16, 46], "filemask": 16, "mkdir": [16, 46], "dir": [16, 46], "flag": [16, 31, 38, 46, 50, 52], "mv": [16, 46], "dest": 16, "pend": 16, "pwd": 16, "quit": 16, "rm": 16, "rmdir": [16, 46], "share": [16, 24, 38], "optim": 16, "unhid": 16, "unshar": 16, "ident": 17, "note": [19, 46], "pbkdf2": 20, "python": 21, "load": [21, 36], "express": 21, "pysourc": 21, "path": [21, 39], "argument": [21, 32], "parse_tcl_list": 21, "string": [21, 46, 49], "parse_tcl_dict": 21, "variabl": [21, 46, 49], "write": [21, 29, 30, 32], "header": [21, 32], "section": 21, "code": [21, 32], "seen": 22, "server": [23, 34, 35, 46], "transfer": 25, "twitch": [26, 50, 51], "limit": [26, 46, 51], "api": 26, "uptim": [27, 46], "woobi": 28, "module_start": 29, "module_t": 29, "module_clos": 29, "module_expmem": 29, "module_report": 29, "addit": [29, 34], "function": [29, 51], "common": 31, "first": 31, "step": 31, "log": [31, 39, 49], "join": [31, 35], "add": [31, 46], "host": [31, 46], "assign": 31, "permiss": 31, "configur": [31, 33, 34, 45], "automat": 31, "restart": [31, 46], "crontab": 31, "method": 31, "old": [31, 46], "systemd": 31, "newer": 31, "authent": [31, 38, 48], "nickserv": 31, "up": [31, 33], "sasl": 31, "basic": [32, 39], "ad": [32, 38], "defin": 32, "call": 32, "export": 32, "prerequisit": 33, "The": [33, 43], "super": 33, "short": 33, "version": [33, 46], "histori": 33, "download": 33, "locat": 33, "edit": [33, 51], "No": 33, "show": 33, "tl": [34, 38, 48], "secur": [34, 38, 48], "connect": [34, 46], "protect": 34, "commun": 34, "prepar": 34, "gener": 34, "kei": [34, 46, 48], "listen": [34, 46], "account": [35, 46], "track": 35, "capabl": [35, 42], "extend": 35, "notifi": 35, "whox": 35, "check": 35, "statu": [35, 46], "determin": 35, "support": [35, 41, 42, 48], "best": 35, "effort": 35, "tag": [35, 46], "autoscript": 36, "remot": 36, "fetch": 36, "list": [36, 46], "unload": 36, "clean": 36, "updat": 36, "structur": 36, "manifest": 36, "json": 36, "placement": 36, "hint": 36, "egg_load": 36, "egg_unload": 36, "egg_al": 36, "ban": [37, 46], "invit": [37, 46], "exempt": [37, 46], "link": [38, 46], "term": 38, "exampl": 38, "bottre": 38, "botflag": 38, "make": 38, "record": [38, 46], "certif": [38, 48], "core": 39, "execut": 39, "dcc": [39, 46, 48], "telnet": 39, "advanc": [39, 49], "ssl": [39, 48], "featur": 40, "ipv6": 41, "chat": 41, "chat4": 41, "chat6": 41, "ircv3": 42, "cap": [42, 46], "parti": 43, "patch": 44, "submit": 44, "via": [44, 46], "github": 44, "encrypt": [45, 46], "hash": 45, "background": 45, "hybrid": 45, "solo": 45, "interfac": 45, "output": 46, "putserv": 46, "text": 46, "option": 46, "puthelp": 46, "putquick": 46, "putnow": 46, "onelin": 46, "putkick": 46, "nick": [46, 50], "reason": 46, "putlog": 46, "putcmdlog": 46, "putxferlog": 46, "putloglev": 46, "": 46, "dumpfil": 46, "queuesiz": 46, "queue": 46, "clearqueu": 46, "req": 46, "raw": 46, "arg": [46, 50], "tagmsg": 46, "target": 46, "ip": 46, "port": 46, "password": 46, "remov": 46, "manipul": 46, "countus": 46, "validus": 46, "handl": 46, "findus": 46, "userlist": 46, "passwdok": 46, "pass": 46, "getus": 46, "entri": 46, "type": [46, 50], "extra": 46, "info": 46, "setus": 46, "chhandl": 46, "new": 46, "chattr": 46, "botattr": 46, "matchattr": 46, "addus": 46, "hostmask": 46, "addbot": 46, "address": 46, "botport": 46, "userport": 46, "delus": 46, "delhost": 46, "addchanrec": 46, "delchanrec": 46, "haschanrec": 46, "getchaninfo": 46, "setchaninfo": 46, "newchanban": 46, "creator": 46, "comment": 46, "lifetim": 46, "newban": 46, "newchanexempt": 46, "newexempt": 46, "newchaninvit": 46, "newinvit": 46, "stickban": 46, "banmask": 46, "unstickban": 46, "stickexempt": 46, "exemptmask": 46, "unstickexempt": 46, "stickinvit": 46, "invitemask": 46, "unstickinvit": 46, "killchanban": 46, "killban": 46, "killchanexempt": 46, "killexempt": 46, "killchaninvit": 46, "killinvit": 46, "ischanjup": 46, "isban": 46, "ispermban": 46, "isexempt": 46, "ispermexempt": 46, "isinvit": 46, "isperminvit": 46, "isbansticki": 46, "isexemptsticki": 46, "isinvitesticki": 46, "matchban": 46, "matchexempt": 46, "matchinvit": 46, "banlist": 46, "exemptlist": 46, "invitelist": 46, "newignor": 46, "killignor": 46, "ignorelist": 46, "isignor": 46, "save": 46, "reload": 46, "backup": 46, "name": 46, "savechannel": 46, "loadchannel": 46, "channame2dnam": 46, "chandname2nam": 46, "dname": 46, "isbotnick": 46, "botisop": 46, "botishalfop": 46, "botisvoic": 46, "botonchan": 46, "isop": 46, "ishalfop": 46, "wasop": 46, "washalfop": 46, "isvoic": 46, "isidentifi": 46, "isawai": 46, "isircbot": 46, "onchan": 46, "monitor": 46, "delet": 46, "onlin": 46, "offlin": 46, "accounttrack": 46, "getaccount": 46, "nick2hand": 46, "account2nick": 46, "hand2nick": 46, "handonchan": 46, "ischanban": 46, "ischanexempt": 46, "ischaninvit": 46, "chanban": 46, "chanexempt": 46, "chaninvit": 46, "resetban": 46, "resetexempt": 46, "resetinvit": 46, "resetchanidl": 46, "resetchanjoin": 46, "resetchan": 46, "refreshchan": 46, "getchanhost": 46, "getchanjoin": 46, "onchansplit": 46, "chanlist": 46, "chanflag": 46, "getchanidl": 46, "getchanmod": 46, "jump": 46, "pushmod": 46, "mode": 46, "flushmod": 46, "topic": 46, "validchan": 46, "isdynam": 46, "setudef": 46, "int": 46, "str": 46, "renudef": 46, "oldnam": 46, "newnam": 46, "deludef": 46, "getudef": 46, "chansettyp": 46, "isupport": 46, "isset": 46, "putdcc": 46, "idx": 46, "putidx": 46, "dccbroadcast": 46, "messag": 46, "dccputchan": 46, "boot": 46, "dccsimul": 46, "hand2idx": 46, "idx2hand": 46, "valididx": 46, "getchan": 46, "setchan": 46, "resetconsol": 46, "echo": 46, "strip": 46, "putbot": 46, "putallbot": 46, "killdcc": 46, "botlist": 46, "islink": 46, "dccuse": 46, "dcclist": 46, "socklist": 46, "whom": 46, "chan": [46, 50], "getdccidl": 46, "getdccawai": 46, "setdccawai": 46, "dccdumpfil": 46, "numberlist": 46, "erasenot": 46, "listnot": 46, "storenot": 46, "from": 46, "msg": 46, "killassoc": 46, "compressfil": 46, "level": 46, "src": 46, "uncompressfil": 46, "iscompress": 46, "setpwd": 46, "getpwd": 46, "getfil": 46, "getdir": 46, "dccsend": 46, "ircnick": 46, "filesend": 46, "fileresend": 46, "setdesc": 46, "getdesc": 46, "setown": 46, "getown": 46, "setlink": 46, "getlink": 46, "getfileq": 46, "getfilesendtim": 46, "destin": 46, "getflag": 46, "setflag": 46, "miscellan": 46, "keyword": 46, "mask": 46, "proc": 46, "unbind": 46, "logfil": 46, "maskhost": 46, "masktyp": 46, "timer": 46, "minut": 46, "count": 46, "timernam": 46, "utim": 46, "second": 46, "killtim": 46, "killutim": 46, "unixtim": 46, "durat": 46, "strftime": 46, "formatstr": 46, "time": 46, "ctime": 46, "myip": 46, "rand": 46, "control": 46, "sendnot": 46, "unlink": 46, "decrypt": 46, "base64": 46, "encpass": 46, "die": 46, "unam": 46, "dnslookup": 46, "hostnam": 46, "arg1": 46, "arg2": 46, "argn": 46, "md5": 46, "callev": 46, "event": 46, "traffic": 46, "unloadmodul": 46, "loadhelp": 46, "helpfil": 46, "unloadhelp": 46, "reloadhelp": 46, "rehash": 46, "stripcod": 46, "matchaddr": 46, "matchcidr": 46, "block": 46, "prefix": 46, "matchstr": 46, "pattern": 46, "rfcequal": 46, "string1": 46, "string2": 46, "istl": 46, "starttl": 46, "tlsstatu": 46, "global": 46, "botnick": 46, "botnam": 46, "serveraddress": 46, "numvers": 46, "lastbind": 46, "isjup": 46, "handlen": 46, "configurearg": 46, "languag": 46, "return": 46, "procedur": 46, "tcp": 46, "match": 46, "charact": 46, "textfil": 47, "substitut": 47, "tip": 49, "renam": 49, "keep": 49, "self": 49, "modifi": 49, "modular": 49, "your": 49, "twcmd": 50, "cmd": 50, "userst": 50, "roomstat": 50, "twitchmod": 50, "twitchvip": 50, "ismod": 50, "isvip": 50, "disclaim": 51, "regist": 51, "web": 51, "ui": 51}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"About Eggdrop": [[0, "about-eggdrop"], [2, null]], "Boring legal stuff": [[1, "boring-legal-stuff"]], "Eggdrop, an open source IRC bot": [[2, "eggdrop-an-open-source-irc-bot"]], "Some things you can do with Eggdrop": [[2, "some-things-you-can-do-with-eggdrop"]], "How to get Eggdrop": [[2, "how-to-get-eggdrop"]], "How to install Eggdrop": [[2, "how-to-install-eggdrop"]], "Installation Pre-requisites": [[2, "installation-pre-requisites"]], "Installation": [[2, "installation"], [33, "installation"], [41, "installation"], [48, "installation"]], "Where to find more help": [[2, "where-to-find-more-help"]], "Installing Eggdrop": [[2, null], [3, "installing-eggdrop"]], "Using Eggdrop": [[2, null]], "Tutorials": [[2, null]], "Eggdrop Modules": [[2, null]], "Quick Startup": [[3, "quick-startup"], [4, "quick-startup"]], "Cygwin Requirements (Windows)": [[3, "cygwin-requirements-windows"]], "Modules": [[3, "modules"], [5, "modules"], [39, "modules"]], "README": [[4, "readme"]], "Notice": [[4, "notice"]], "What is Eggdrop?": [[4, "what-is-eggdrop"]], "How to Get Eggdrop": [[4, "how-to-get-eggdrop"]], "FTP": [[4, "ftp"]], "Git Development Snapshot": [[4, "git-development-snapshot"]], "Docker": [[4, "docker"]], "System Pre-Requisites": [[4, "system-pre-requisites"]], "Upgrading": [[4, "upgrading"]], "Command Line": [[4, "command-line"]], "Auto-starting Eggdrop": [[4, "auto-starting-eggdrop"]], "Documentation": [[4, "documentation"], [5, "documentation"]], "Obtaining Help": [[4, "obtaining-help"]], "Upgrading Eggdrop": [[5, "upgrading-eggdrop"]], "How to Upgrade": [[5, "how-to-upgrade"]], "Must-read changes for Eggdrop v1.9": [[5, "must-read-changes-for-eggdrop-v1-9"]], "Config file changes": [[5, "config-file-changes"]], "Scripts": [[5, "scripts"], [39, "scripts"], [48, "scripts"]], "Botnet": [[5, "botnet"], [48, "botnet"]], "Tcl Commands": [[5, "tcl-commands"], [21, "tcl-commands"], [36, "tcl-commands"]], "Modules included with Eggdrop": [[6, "modules-included-with-eggdrop"]], "Eggdrop Module Information": [[7, "eggdrop-module-information"]], "What are modules?": [[7, "what-are-modules"]], "How to install a module": [[7, "how-to-install-a-module"]], "Can I compile Eggdrop without dynamic modules? (Static compile)": [[7, "can-i-compile-eggdrop-without-dynamic-modules-static-compile"]], "Do I still need to \u2018loadmodule\u2019 modules?": [[7, "do-i-still-need-to-loadmodule-modules"]], "Eggdrop Bind Internals": [[8, "eggdrop-bind-internals"]], "Bind Table Creation": [[8, "bind-table-creation"]], "Stackable Binds: HT_STACKABLE": [[8, "stackable-binds-ht-stackable"]], "Tcl Binding": [[8, "tcl-binding"]], "Triggering the Bind": [[8, "triggering-the-bind"]], "Triggering any Bind": [[8, "triggering-any-bind"]], "C Binding": [[8, "c-binding"]], "C Handler": [[8, "c-handler"]], "Summary": [[8, "summary"]], "Assoc Module": [[9, "assoc-module"], [46, "assoc-module"]], "Blowfish Module": [[10, "blowfish-module"]], "Channels Module": [[11, "channels-module"]], "Channel Settings": [[11, "channel-settings"]], "Value-based Channel Settings": [[11, "value-based-channel-settings"]], "Enable/Disable Channel Settings": [[11, "enable-disable-channel-settings"]], "Default Channel Values": [[11, "default-channel-values"]], "Compress Module": [[12, "compress-module"], [46, "compress-module"]], "Console Module": [[13, "console-module"]], "CTCP Module": [[14, "ctcp-module"]], "DNS Module": [[15, "dns-module"]], "Filesys Module": [[16, "filesys-module"], [46, "filesys-module"]], "Config file setup": [[16, "config-file-setup"]], "Partyline usage": [[16, "partyline-usage"]], ".files": [[16, "files"]], ".cancel [file] \u2026": [[16, "cancel-file-file"]], ".cd ": [[16, "cd-directory"]], ".cp ": [[16, "cp-source-dst"]], ".desc ": [[16, "desc-file-description"]], ".filestats [clear]": [[16, "filestats-user-clear"]], ".stats": [[16, "stats"]], ".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"]], ".pending": [[16, "pending"]], ".pwd": [[16, "pwd"]], ".quit": [[16, "quit"]], "rm [files] \u2026": [[16, "rm-file-files"]], ".rmdir ": [[16, "rmdir-dir"]], ".share [files] \u2026": [[16, "share-file-files"]], ".optimize": [[16, "optimize"]], ".unhide": [[16, "unhide"]], ".unshare [file] \u2026": [[16, "unshare-file-file"]], ".filesys module": [[16, "id1"]], "Ident Module": [[17, "ident"]], "IRC Module": [[18, "irc-module"]], "Notes Module": [[19, "notes-module"], [46, "notes-module"]], "PBKDF2 Module": [[20, "pbkdf2-module"]], "Python Module": [[21, "python-module"]], "Loading Python": [[21, "loading-python"]], "Partyline Commands": [[21, "partyline-commands"]], "python ": [[21, "python-expression"]], ".binds python": [[21, "binds-python"]], "pysource ": [[21, "pysource-path-to-file"]], "Eggdrop Python Commands": [[21, "eggdrop-python-commands"]], "bind ": [[21, "bind-arguments"]], "parse_tcl_list ": [[21, "parse-tcl-list-string"]], "parse_tcl_dict ": [[21, "parse-tcl-dict-string"]], "Config variables": [[21, "config-variables"]], "Writing an Eggdrop Python script": [[21, "writing-an-eggdrop-python-script"]], "Header section": [[21, "header-section"]], "Code Section": [[21, "code-section"]], "Writing a module for use with Eggdrop": [[21, "writing-a-module-for-use-with-eggdrop"]], "Seen Module": [[22, "seen-module"]], "Server Module": [[23, "server-module"]], "Share Module": [[24, "share-module"]], "Transfer Module": [[25, "transfer-module"]], "Twitch Module": [[26, "twitch-module"]], "Limitations": [[26, "limitations"]], "Tcl API": [[26, "tcl-api"]], "Partyline commands": [[26, "partyline-commands"]], "Uptime Module": [[27, "uptime-module"]], "Woobie Module": [[28, "woobie-module"]], "How to Write an Eggdrop Module": [[29, "how-to-write-an-eggdrop-module"]], "Module requirements": [[29, "module-requirements"]], "MODULE_start": [[29, "module-start"]], "MODULE_table": [[29, "module-table"]], "MODULE_close ()": [[29, "module-close"]], "MODULE_expmem": [[29, "module-expmem"]], "MODULE_report": [[29, "module-report"]], "Additional functions": [[29, "additional-functions"]], "What to do with a module?": [[29, "what-to-do-with-a-module"]], "Writing an Eggdrop Script": [[30, "writing-an-eggdrop-script"]], "Common First Steps": [[31, "common-first-steps"]], "Log on to the partyline": [[31, "log-on-to-the-partyline"]], "Common first steps": [[31, "id1"]], "Join a Channel": [[31, "join-a-channel"]], "Add a User": [[31, "add-a-user"]], "Add a Host to a User": [[31, "add-a-host-to-a-user"]], "Assign Permission Flags": [[31, "assign-permission-flags"]], "Configure Channel Settings": [[31, "configure-channel-settings"]], "Automatically restarting an Eggdrop": [[31, "automatically-restarting-an-eggdrop"]], "Crontab Method (Old)": [[31, "crontab-method-old"]], "Systemd Method (Newer Systems)": [[31, "systemd-method-newer-systems"]], "Authenticating with NickServ": [[31, "authenticating-with-nickserv"]], "Setting up SASL authentication": [[31, "setting-up-sasl-authentication"]], "Writing a Basic Eggdrop Module": [[32, "writing-a-basic-eggdrop-module"]], "Module Header": [[32, "module-header"]], "Required Code": [[32, "required-code"]], "Adding a Partyline Command": [[32, "adding-a-partyline-command"]], "Adding a Tcl Command": [[32, "adding-a-tcl-command"]], "Adding a Tcl Bind": [[32, "adding-a-tcl-bind"]], "Defining bind arguments": [[32, "defining-bind-arguments"]], "Calling the Bind": [[32, "calling-the-bind"]], "Exporting the Bind": [[32, "exporting-the-bind"]], "Setting Up Eggdrop": [[33, "setting-up-eggdrop"]], "Prerequisites": [[33, "prerequisites"]], "The super-short version": [[33, "the-super-short-version"]], "Getting the source": [[33, "getting-the-source"]], "History": [[33, "history"]], "Download locations": [[33, "download-locations"]], "Configuration": [[33, "configuration"]], "Editing the config file": [[33, "editing-the-config-file"], [51, "editing-the-config-file"]], "Starting the Eggdrop": [[33, "starting-the-eggdrop"]], "No show?": [[33, "no-show"]], "Enabling TLS Security on Eggdrop": [[34, "enabling-tls-security-on-eggdrop"]], "Pre-requisites": [[34, "pre-requisites"]], "Connecting to a TLS-enabled IRC server": [[34, "connecting-to-a-tls-enabled-irc-server"]], "Protecting Botnet Communications": [[34, "protecting-botnet-communications"]], "Configuration File Preparation - Generating Keys": [[34, "configuration-file-preparation-generating-keys"]], "Configuration File Preparation - Listening with TLS": [[34, "configuration-file-preparation-listening-with-tls"]], "Connecting to an Eggdrop listening with TLS": [[34, "connecting-to-an-eggdrop-listening-with-tls"]], "Additional Information": [[34, "additional-information"]], "Account tracking in Eggdrop": [[35, "account-tracking-in-eggdrop"]], "Required Server Capabilities": [[35, "required-server-capabilities"]], "extended-join": [[35, "extended-join"]], "account-notify": [[35, "account-notify"]], "WHOX": [[35, "whox"]], "Enabling Eggdrop Account Tracking": [[35, "enabling-eggdrop-account-tracking"]], "Checking Account-tracking Status": [[35, "checking-account-tracking-status"]], "Determining if a Server Supports Account Capabilities": [[35, "determining-if-a-server-supports-account-capabilities"]], "Best-Effort Account Tracking": [[35, "best-effort-account-tracking"]], "account-tag": [[35, "account-tag"]], "Using Accounts with Tcl Scripts": [[35, "using-accounts-with-tcl-scripts"]], "Eggdrop Autoscripts": [[36, "eggdrop-autoscripts"]], "Autoscripts usage": [[36, "autoscripts-usage"]], "remote": [[36, "remote"]], "fetch - - - + + + + +
    -

    Development hints

    +

    Development hints

    • An autoscript should not require a user to manually open the script in an editor for any reason. Design your script as such!

    • Use user defined channel flags to enable/disable a script for a particular channel, they’re easy!

    • -
    • Variables used in autoscripts are placed into the global namespace. Make them unique to prevent collisions! We recommend prefixing the script name in front of a variable, such as myscript_setting or ms_setting.

    • +
    • Don’t use global statements. Based on the manifest, variables are created by autoscript in the global namespace before the script is loaded. Instead of the global command, use the variable command to access a global variable inside a proc. And because Tcl is awesome, each variable must be declared on its own line, not all on a single line like you can do with global. Sorry!

    • +
    • While we’re talking about variables… make them unique to prevent collisions! We recommend prefixing the script name in front of a variable, such as myscript_setting or ms_setting. Alternatively, you can wrap your autoscript inside a namespace eval <scriptname> {} statement, which create a private namespace for your script to operate within.

    -

    Tcl Commands

    +

    Tcl Commands

    The autoscripts Tcl script adds three new commands for use with Tcl scripts:

    -

    egg_loaded

    +

    egg_loaded

    Description: lists all scripts currently loaded via the autoscripts system

    Returns: A Tcl list of script names currently loaded via autoscripts

    -

    egg_unloaded

    +

    egg_unloaded

    Description: lists all scripts downloaded to the local machine via the autoscripts system but not currently loaded by Eggdrop

    Returns: A Tcl list of script names downloaded but not currently loaded via autoscripts

    -

    egg_all

    +

    egg_all

    Description: lists all script downloaded to the localm machine via the autoscripts system, regardless if they are running or not

    Returns: A Tcl list of all script namees download via autoscripts

    @@ -328,9 +329,9 @@

    egg_all

    diff --git a/doc/html/using/bans.html b/doc/html/using/bans.html index 55787dc1b..e2468189e 100644 --- a/doc/html/using/bans.html +++ b/doc/html/using/bans.html @@ -1,17 +1,16 @@ - - + - + Bans, Invites, and Exempts — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -99,7 +99,7 @@

    Search

    Bans, Invites and Exempts Last revised: March 07, 2002

    -

    Bans, Invites, and Exempts

    +

    Bans, Invites, and Exempts

    I assume that you know how bans work on IRC. Eggdrop handles bans, exempts and invites in various ways, and this file is intended to help clarify how @@ -199,9 +199,9 @@

    Bans, Invites, and Exempts

    diff --git a/doc/html/using/botnet.html b/doc/html/using/botnet.html index 524870353..4e1c584a5 100644 --- a/doc/html/using/botnet.html +++ b/doc/html/using/botnet.html @@ -1,17 +1,16 @@ - - + - + Botnet Sharing and Linking — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
      @@ -108,19 +108,19 @@

      Search

      Botnet Sharing and Linking

      -

      Botnet Sharing and Linking

      +

      Botnet Sharing and Linking

      The purpose of this document is to show you what a botnet is and how it could be useful to you. It also covers botflags userfile sharing.

      -

      What is a botnet?

      +

      What is a botnet?

      A botnet consists of two or more bots linked together. This can allow bots to op each other securely, control floods efficiently, and share user lists, ban lists, exempt/invite lists, and ignore lists (if sharing is enabled).

      -

      Terms

      +

      Terms

      The following are some common terms used in this document:

      Botnet

      A botnet consists of two or more bots connected together.

      @@ -159,7 +159,7 @@

      Terms

      -

      Example bottree

      +

      Example bottree

      BotA
         |-+BotB
         `-+BotC
      @@ -168,7 +168,7 @@ 

      Example bottree -

      Bot Flags

      +

      Bot Flags

      Flags are attributes that determine what a bot can or is allowed to do. Flags can be either global (such as +s) or channel specific (such as |+s #lamest). See ‘.help botattr’ for help with setting these flags.

      @@ -236,7 +236,7 @@

      Bot Flags -

      Adding and linking bots

      +

      Adding and linking bots

      With the common terms out of the way, we can start with the process of linking two bots. Before you start, you need to know the address and port of each bot you wish to link.

      Here is an example scenario:

      @@ -249,12 +249,12 @@

      Adding and linking bots

      At this point, you can link the two bots by typing ‘.link BotA’ on BotB (or ‘.link BotB’ on BotA). The bots will now give themselves random passwords which are not stored encrypted in the userfile. Note that you can link as many bots as you wish to your botnet.

      -

      Using botflags

      +

      Using botflags

      Botflags are needed to assign special functions and tasks to your bots. Bot flags are set with the ‘.botattr’ command. See ‘.help botattr’ for help with this command. The following is a list of botflags and their @@ -299,7 +299,7 @@

      Using botflags -

      Making bots share user records

      +

      Making bots share user records

      Before you start preparing your bots for sharing, make sure that you’ve loaded the transfer and share modules. You also have to ensure @@ -398,7 +398,7 @@

      Making bots share user records -

      Using certificates to authenticate Eggdrops

      +

      Using certificates to authenticate Eggdrops

      Eggdrops can use certificates to authenticate when linking to each other instead of a password. First, you must ensure you have set the appropriate certificates in the ssl-privatekey and ssl-certificate settings in the config file, and then enable the ssl-cert-auth setting. Next, add the certificate on the partyline by using .fprint + to add the fingerprint for the certificate currently in use, or .fprint <SHA1 fingerprint> to manually add a fingerprint. Once the config file settings are set 0and fingerprints are added on the partyline, Eggdrops will attempt to use their certificates instead of passwords for authentication.

      Copyright (C) 1999 - 2023 Eggheads Development Team

      @@ -430,9 +430,9 @@

      Using certificates to authenticate Eggdrops
      diff --git a/doc/html/using/core.html b/doc/html/using/core.html index 2fa9db43d..63574f00f 100644 --- a/doc/html/using/core.html +++ b/doc/html/using/core.html @@ -1,17 +1,16 @@ - - + - + Eggdrop Core Settings — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -57,6 +56,7 @@

      Table of Contents

  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -108,14 +108,14 @@

    Search

    -

    Last revised: October 25, 2010

    +

    Last revised: August 29, 2023

    -

    Eggdrop Core Settings

    +

    Eggdrop Core Settings

    This file describes the syntax and all the settings of your Eggdrop configuration file. Please note that you don’t need to set all of these variables to make your bot work properly.

    -

    Executable Path

    +

    Executable Path

    The first line in an Eggdrop configuration file should contain a fully qualified path to your Eggdrop executable. It has to be implemented in the way the example shows to make the config file @@ -126,7 +126,7 @@

    Executable Path -

    Basic Settings

    +

    Basic Settings

    You can change the basic Eggdrop appearance and behavior in this section.

    @@ -190,7 +190,7 @@

    Basic Settings -

    Log Files

    +

    Log Files

    Eggdrop is capable of logging various things, from channel chatter to partyline commands and file transfers.

    Logfiles are normally kept for 24 hours. Afterwards, they will be renamed @@ -341,7 +341,7 @@

    Log Files -

    Console Settings

    +

    Console Settings

    set console “mkcoblxs”

    This is the default console mode. It uses the same event flags as the @@ -353,7 +353,7 @@

    Console Settings -

    File and Directory Settings

    +

    File and Directory Settings

    set userfile “LamestBot.user”

    Specify here the filename your userfile should be saved as.

    @@ -395,7 +395,7 @@

    File and Directory Settings -

    Botnet/Dcc/Telnet Settings

    +

    Botnet/Dcc/Telnet Settings

    Settings in this section should be unimportant for you until you deal with botnets (multiple Eggdrops connected together to maximize efficiency). You should read doc/BOTNET before modifying these settings.

    @@ -494,7 +494,7 @@

    Botnet/Dcc/Telnet Settings -

    Advanced Settings

    +

    Advanced Settings

    set firewall “!sun-barr.ebay:3666”

    Set this to your socks host if your Eggdrop sits behind a firewall. If @@ -571,7 +571,7 @@

    Advanced Settings -

    SSL Settings

    +

    SSL Settings

    Settings in this section take effect when eggdrop is compiled with TLS support.

    @@ -688,7 +688,7 @@

    SSL Settings -

    Modules

    +

    Modules

    After the core settings, you should start loading modules. Modules are loaded by the command “loadmodule <module>”. Eggdrop looks for modules in the directory you specified by the module-path setting in the files @@ -708,13 +708,13 @@

    Modules -

    Scripts

    +

    Scripts

    The scripts section should be placed at the end of the config file. All modules should be loaded and their variables should be set at this point.

    @@ -762,9 +762,9 @@

    Scripts

    diff --git a/doc/html/using/features.html b/doc/html/using/features.html index 920a81fc0..c5d468e49 100644 --- a/doc/html/using/features.html +++ b/doc/html/using/features.html @@ -1,17 +1,16 @@ - - + - + Eggdrop Features — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -97,7 +97,7 @@

    Search

    -

    Eggdrop Features

    +

    Eggdrop Features

    Eggdrop is the most advanced IRC robot available. It has been under development since December 1993, and unlike most other bots, it is still @@ -168,9 +168,9 @@

    Eggdrop Features

    diff --git a/doc/html/using/ipv6.html b/doc/html/using/ipv6.html index 06fcf9d87..ca3aec141 100644 --- a/doc/html/using/ipv6.html +++ b/doc/html/using/ipv6.html @@ -1,17 +1,16 @@ - - + - + IPv6 support — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -106,11 +106,11 @@

    Search

    IPv6 support Last revised: Mar 24, 2021

    -

    IPv6 support

    +

    IPv6 support

    This document provides information about IPv6 support which is a new eggdrop feature since version 1.8.0.

    -

    About

    +

    About

    Eggdrop can be compiled with IPv6 support. To make use of this, you need an IPv6-enabled OS and IPv6 connectivity. Every possible type of TCP connection can be established over IPv6 now, @@ -119,7 +119,7 @@

    About commands, telnet and ident lookups.

    -

    Installation

    +

    Installation

    ./configure and install as usual, the configure script will detect if your system supports IPv6 and will enable it automatically. You can override this behavior and manually enable or disable IPv6 with ./configure –enable-ipv6 @@ -132,7 +132,7 @@

    Installation -

    Usage

    +

    Usage

    You can use IPv6 addresses wherever you could specify IPv4 ones. IPs and hostnames are interchangeable everywhere. For certain settings and commands, you can enclose IPv6 addresses in square brackets to prevent @@ -141,11 +141,11 @@

    Usage consult them when in doubt.

    -

    CTCP CHAT/CHAT4/CHAT6

    +

    CTCP CHAT/CHAT4/CHAT6

    When a user sends a CTCP chat request, the request is passed to the bot via the IRC server, hiding the user’s IP. Since Eggdrop is unable to ‘see’ the type IP of the user is using (IPv4 or IPv6), it is thus unable to determine whether it should send back an IPv4 or an IPv6 address for the user to connect to. To work around this problem, the CHAT4 and CHAT6 commands were added to Eggdrop to force it to present an IPv4 or IPv6 address for use with a DCC connection, respectively. Otherwise, the traditional CHAT command will likely result in the Eggdrop presenting an IPv4 address to the user. So in short, if you’re on an IPv6 address and want to use CTCP CHAT to initiate a DCC session for the partyline, use CHAT6, not CHAT as the CTCP argument.

    -

    Settings

    +

    Settings

    There are four new IPv6 related config variables:

    vhost4

    @@ -201,9 +201,9 @@

    Settings

    diff --git a/doc/html/using/ircv3.html b/doc/html/using/ircv3.html index a15e1f393..431a7fd37 100644 --- a/doc/html/using/ircv3.html +++ b/doc/html/using/ircv3.html @@ -1,17 +1,16 @@ - - + - + IRCv3 support — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -104,18 +104,18 @@

    Search

    IRCv3 support Last revised: November 27, 2021

    -

    IRCv3 support

    +

    IRCv3 support

    This document provides information about IRCv3 capabilities, as defined via specifications documented by the IRCv3 working group (https://ircv3.net/). Support for some of these specifications was added starting with version 1.9.0, and more capabilities are added as possible with new versions.

    -

    About

    +

    About

    As more and more IRC servers began to develop and implement their own versions of the IRC protocol (generally defined in RFC1459 and RFC2812), a working group comprised of server, client, and bot developers decided to work together to document these features to make their implementation defined and standardized across servers. What emerged was the IRCv3 set of standards. The specifications developed by the IRCv3 working group was designed to be backwards compatible and are generally implemented via a CAP (capability) request sent at the initialization of an IRC session. A client can optinoally request these “extra” capabilities be enabled through the CAP request, with the assumption that the client can then support the capability requested and enabled. Not all servers or clients support the same capabilities, a general support list can be via the appropriate support table link at https://ircv3.net/.

    -

    Usage

    +

    Usage

    Within eggdrop.conf, several common IRCv3-defined capabilities are enabled simply changing their setting to ‘1’. Other capabilities without explicit settings in eggdrop.conf may be requested by adding them in a space-separated list to the cap-request setting. For more information on what a specific IRCv3-defined capability does, please consult https://ircv3.net/irc/.

    -

    Supported CAP capabilities

    +

    Supported CAP capabilities

    The following capabilities are supported by Eggdrop:

    diff --git a/doc/html/using/partyline.html b/doc/html/using/partyline.html index 49265ebd3..2d7e7ad0c 100644 --- a/doc/html/using/partyline.html +++ b/doc/html/using/partyline.html @@ -1,19 +1,18 @@ - - + - + The Party Line — Eggdrop 1.9.5 documentation - - - - - + + + + + - + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -98,7 +98,7 @@

    Search

    Last revised: December 31, 2001

    -

    The Party Line

    +

    The Party Line

    The most important way you will communicate with your bot is through the party line. The party line is accessible via DCC chat or telnet. It’s pretty much just a miniature, lag-less IRC (see doc/BOTNET), but @@ -145,7 +145,7 @@

    The Party Line previous | - next

    @@ -155,9 +155,9 @@

    The Party Line

    diff --git a/doc/html/using/patch.html b/doc/html/using/patch.html index aac2d4b1f..a98538093 100644 --- a/doc/html/using/patch.html +++ b/doc/html/using/patch.html @@ -1,17 +1,16 @@ - - + - + Patching Eggdrop — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -100,10 +100,10 @@

    Search

    -

    Patching Eggdrop

    +

    Patching Eggdrop

    Eggdrop is an open source project that depends on contributions of its users- like you! If you come across a feature you’d like to see implemented, find a bug, or think the documentation could be made more clear, you can open an issue on GitHub to discuss your ideas, and then submit a Pull Request to implement it!

    -

    Submitting a patch via GitHub

    +

    Submitting a patch via GitHub

    To create a patch via github:

      @@ -160,9 +160,9 @@

      Submitting a patch via GitHub

    diff --git a/doc/html/using/pbkdf2info.html b/doc/html/using/pbkdf2info.html index b2c98a2d4..2fceff8dc 100644 --- a/doc/html/using/pbkdf2info.html +++ b/doc/html/using/pbkdf2info.html @@ -1,17 +1,16 @@ - - + - + Encryption/Hashing — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

    Table of Contents

  • Eggdrop Features
  • Eggdrop Core Settings
  • The Party Line
  • +
  • Eggdrop Autoscripts
  • Users and Flags
  • Bans, Invites, and Exempts
  • Botnet Sharing and Linking
  • @@ -102,12 +102,12 @@

    Search

    -

    Encryption/Hashing

    +

    Encryption/Hashing

    With the release of Eggdrop 1.9.0, an updated crytopgraphy module (PBKDF2) was released for use with Eggdrop. PBKDF2 is a one-way hashing algorithm used to protect the contents of the password file, as well as for use via the Tcl interface. Prior to this, blowfish was used for cryptographic requirements, such as hashing passwords for storage in the userfile.

    -

    Background

    +

    Background

    Prior to Eggdrop 1.9.0, the blowfish module was included with Eggdrop to protect sensitive data such as passwords stored in the userfile. While there are no known practical attacks against blowfish at the time of this writing, it was decided that a more modern crypto solution was desirable to be included with Eggdrop. The PBKDF2 (Password-based Key Derivation Function 2) uses a password and salt value to create a password hash (the salt value ensures that the hashes of two identical passwords are different). This process is one-way, which means the hashes cannot be cryptographically reversed and thus are safe for storing in a file.

    The default configuration of Eggdrop 1.9.0 has both the blowfish and pbkdf2 modules enabled (see Hybrid Configuration below). This will allow users upgrading a seamless transition to the PBKDF2 module. For users starting an Eggdrop for the first time, it is recommended to comment out the ‘loadmodule blowfish’ line, in order to implement the Solo Configuration.

    @@ -115,17 +115,17 @@

    Background -

    Usage

    +

    Usage

    There are two ways to implement PBKDF2- Hybrid configuration, which is recommended for transitioning an already-existing userfile to PBKDF2 by working with the blowfish module, and Solo configuration, which is recommended for use when starting a new Eggdrop for the first time.

    -

    Hybrid Configuration

    +

    Hybrid Configuration

    With a hybrid configuration, Eggdrop will run both the blowfish and the pbkdf2 modules concurrently. This will allow Eggdrop to authenticate users against their existing blowfish passwords stored in the userfile. However, the first time a user logs in, the pbkdf2 module will hash the (correct) password they enter and save it to the userfile. The pbkdf2-hashed password will then be used for all future logins.

    -

    Enabling hybrid configuration

    +

    Enabling hybrid configuration

    1. BACK UP YOUR USERFILE! This is the file that usually ends with ‘.user’.

    2. Ensure

    3. @@ -149,13 +149,13 @@

      Enabling hybrid configuration -

      Solo configuration

      +

      Solo configuration

      With a solo configuration, Eggdrop will only run the pbkdf2 module. Eggdrop will not be able to authenticate against passwords in an already-existing userfile and thus will require every user to set a password again, as if they were just added to Eggdrop. This can be done via the PASS msg command (/msg bot PASS <password>) or by having a user with appropriate permissions (and an already-set password) log into the partyline and use the ‘.chpass’ command.

      SECURITY CONSIDERATION: This configuration is not ideal for transitioning an existing userfile to PBKDF2. Without the blowfish module loaded, every user in the userfile essentially has no password set. This means any other user that matches a hostmask applied to a handle (!*@.aol.com, I’m looking at you) could set the password and gain access to that user’s Eggdrop account.

      -

      Enabling solo configuration

      +

      Enabling solo configuration

      1. BACK UP YOUR USERFILE! This is the file that usually ends with ‘.user’.

      2. Remove or comment:

        @@ -182,7 +182,7 @@

        Enabling solo configuration -

        Tcl Interface

        +

        Tcl Interface

        The PBKDF2 module adds the ‘encpass2’ command to the Tcl library. This command takes a string and hashes it using the PBKDF2 algorithm, and returns a string in the following format:

        $<PBK method>$rounds=<rounds>$<salt>$<password hash>
         
        @@ -218,9 +218,9 @@

        Tcl Interface

        diff --git a/doc/html/using/tcl-commands.html b/doc/html/using/tcl-commands.html index 3045c8e5d..9af070bc5 100644 --- a/doc/html/using/tcl-commands.html +++ b/doc/html/using/tcl-commands.html @@ -1,27 +1,22 @@ - - + - + Eggdrop Tcl Commands — Eggdrop 1.9.5 documentation - - - - - - + + + + +
      3. Eggdrop Features
      4. Eggdrop Core Settings
      5. The Party Line
      6. +
      7. Eggdrop Autoscripts
      8. Users and Flags
      9. Bans, Invites, and Exempts
      10. Botnet Sharing and Linking
      11. @@ -117,9 +113,9 @@

        Search

        Eggdrop Tcl Commands -Last revised: January 24, 2021

        +Last revised: January 6, 2024

        -

        Eggdrop Tcl Commands

        +

        Eggdrop Tcl Commands

        This is an exhaustive list of all the Tcl commands added to Eggdrop. All 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 @@ -131,9 +127,9 @@

        Eggdrop Tcl Commands
        -

        Output Commands

        +

        Output Commands

        -

        putserv <text> [options]

        +

        putserv <text> [options]

        Description: sends text to the server, like ‘.dump’ (intended for direct server commands); output is queued so that the bot won’t flood itself off the server.

        Options: @@ -144,7 +140,7 @@

        putserv <text> [options] -

        puthelp <text> [options]

        +

        puthelp <text> [options]

        Description: sends text to the server, like ‘putserv’, but it uses a different queue intended for sending messages to channels or people.

        Options: @@ -155,7 +151,7 @@

        puthelp <text> [options] -

        putquick <text> [options]

        +

        putquick <text> [options]

        Description: sends text to the server, like ‘putserv’, but it uses a different (and faster) queue.

        Options: @@ -166,7 +162,7 @@

        putquick <text> [options] -

        putnow <text> [-oneline]

        +

        putnow <text> [-oneline]

        Description: sends text to the server immediately, bypassing all queues. Use with caution, as the bot may easily flood itself off the server.

        Options: @@ -176,7 +172,7 @@

        putnow <text> [-oneline] -

        putkick <channel> <nick,nick,…> [reason]

        +

        putkick <channel> <nick,nick,…> [reason]

        Description: sends kicks to the server and tries to put as many nicks into one kick command as possible.

        Returns: nothing

        @@ -184,7 +180,7 @@

        putkick <channel> <nick,nick,…> [reason]

        -

        putlog <text>

        +

        putlog <text>

        Description: logs <text> to the logfile and partyline if the ‘misc’ flag (o) is active via the ‘logfile’ config file setting and the ‘.console’ partyline setting, respectively.

        Returns: nothing

        @@ -192,7 +188,7 @@

        putlog <text> -

        putcmdlog <text>

        +

        putcmdlog <text>

        Description: logs <text> to the logfile and partyline if the ‘cmds’ flag (c) is active via the ‘logfile’ config file setting and the ‘.console’ partyline setting, respectively.

        Returns: nothing

        @@ -200,7 +196,7 @@

        putcmdlog <text> -

        putxferlog <text>

        +

        putxferlog <text>

        Description: logs <text> to the logfile and partyline if the ‘files’ flag (x) is active via the ‘logfile’ config file setting and the ‘.console’ partyline setting, respectively.

        Returns: nothing

        @@ -208,7 +204,7 @@

        putxferlog <text> -

        putloglev <flag(s)> <channel> <text>

        +

        putloglev <flag(s)> <channel> <text>

        Description: logs <text> to the logfile and partyline at the log level of the specified flag. Use “*” in lieu of a flag to indicate all log levels.

        Returns: nothing

        @@ -216,7 +212,7 @@

        putloglev <flag(s)> <channel> <text>

        -

        dumpfile <nick> <filename>

        +

        dumpfile <nick> <filename>

        Description: dumps file from the help/text directory to a user on IRC via msg (one line per msg). The user has no flags, so the flag bindings won’t work within the file.

        Returns: nothing

        @@ -224,14 +220,14 @@

        dumpfile <nick> <filename> -

        queuesize [queue]

        +

        queuesize [queue]

        Returns: the number of messages in all queues. If a queue is specified, only the size of this queue is returned. Valid queues are: mode, server, help.

        Module: server

        -

        clearqueue <queue>

        +

        clearqueue <queue>

        Description: removes all messages from a queue. Valid arguments are: mode, server, help, or all.

        Returns: the number of deleted lines from the specified queue.

        @@ -239,7 +235,7 @@

        clearqueue <queue>

        -

        cap <ls/values/req/enabled/raw> [arg]

        +

        cap <ls/values/req/enabled/raw> [arg]

        Description: displays CAP status or sends a raw CAP command to the server. “ls” will list the capabilities Eggdrop is internally tracking as supported by the server. “values” will list all capabilities and their associated CAP 302 values (if any) as a key/value pair, and “values” with a capability name as arg will list the values associated for the capability. “enabled” will list the capabilities Eggdrop is internally tracking as negotiated with the server. “req” will request the capabilities listed in “arg” from the server. “raw” will send a raw CAP command to the server. The arg field is a single argument, and should be submitted as a single string. For example, to request capabilities foo and bar, you would use [cap req “foo bar”], and for example purposes, sending the same request as a raw command would be [cap raw “REQ :foo bar”].

        Returns: a list of CAP capabilities for the “enabled” and “ls” sub-commands; a dict of capability/value pairs for the “values” command or a list if “values” if followed by an argument; otherwise nothing.

        @@ -247,7 +243,7 @@

        cap <ls/values/req/enabled/raw> [arg] -

        tagmsg <tags> <target>

        +

        tagmsg <tags> <target>

        Description: sends an IRCv3 TAGMSG command to the target. Only works if message-tags has been negotiated with the server via the cap command. tags is a Tcl dict (or space-separated string) of the tags you wish to send separated by commas (do not include the @prefix), and target is the nickname or channel you wish to send the tags to. To send a tag only (not a key/value pair), use a “” as the value for a key in a dict, or a “{}” if you are sending as a space-separated string.

        @@ -260,7 +256,7 @@

        tagmsg <tags> <target> -

        server add <ip/host> [[+]port [password]]

        +

        server add <ip/host> [[+]port [password]]

        Description: adds a server to the list of servers Eggdrop will connect to. Prefix the port with ‘+’ to indicate an SSL-protected port. A port value is required if password is to be specified. The SSL status (+) of the provided port is matched against as well (ie, 7000 is not the same as +7000).

        Returns: nothing

        @@ -268,7 +264,7 @@

        server add <ip/host> [[+]port [password]] -

        server remove <ip/host> [[+]port]

        +

        server remove <ip/host> [[+]port]

        Description: removes a server from the list of servers Eggdrop will connect to. If no port is provided, all servers matching the ip or hostname provided will be removed, otherwise only the ip/host with the corresponding port will be removed. The SSL status (+) of the provided port is matched against as well (ie, 7000 is not the same as +7000).

        Returns: nothing

        @@ -276,7 +272,7 @@

        server remove <ip/host> [[+]port] -

        server list

        +

        server list

        Description: lists all servers currently added to the bots internal server list

        Returns: A list of lists in the format {{hostname} {port} {password}}

        @@ -285,23 +281,23 @@

        server list -

        User Record Manipulation Commands

        +

        User Record Manipulation Commands

        -

        countusers

        +

        countusers

        Returns: number of users in the bot’s database

        Module: core

        -

        validuser <handle>

        +

        validuser <handle>

        Returns: 1 if a user by that name exists; 0 otherwise

        Module: core

        -

        finduser [-account] <value>

        +

        finduser [-account] <value>

        Description: finds the internal user record which most closely matches the given value. When used with the -account flag, value is a services account name, otherwise by default value is a string in the hostmask format of nick!user@host.

        Returns: the handle found, or “*” if none

        @@ -309,14 +305,14 @@

        finduser [-account] <value> -

        userlist [flags]

        +

        userlist [flags]

        Returns: a list of users on the bot. You can use the flag matching system here ([global]{&/|}[chan]{&/|}[bot]). ‘&’ specifies “and”; ‘|’ specifies “or”.

        Module: core

        -

        passwdok <handle> <pass>

        +

        passwdok <handle> <pass>

        Description: checks the password given against the user’s password. Check against the password “-” to find out if a user has no password set.

        Returns: 1 if the password matches for that user; 0 otherwise. Or if we are checking against the password “-”: 1 if the user has no password set; 0 otherwise.

        @@ -324,14 +320,10 @@

        passwdok <handle> <pass> -

        getuser <handle> [entry-type] [extra info]

        +

        getuser <handle> [entry-type] [extra info]

        Description: an interface to the new generic userfile support. Without an entry-type, it returns a flat key/value list (dict) of all set entries. Valid entry types are:

        ---- @@ -373,14 +365,10 @@

        getuser <handle> [entry-type] [extra info] -

        setuser <handle> <entry-type> [extra info]

        +

        setuser <handle> <entry-type> [extra info]

        Description: this is the counterpart of getuser. It lets you set the various values. Other then the ones listed below, the entry-types are the same as getuser’s.

        ACCOUNT

        returns thee a list of servivce accounts associated with the user

        ---- @@ -437,7 +425,7 @@

        setuser <handle> <entry-type> [extra info]
        -

        chhandle <old-handle> <new-handle>

        +

        chhandle <old-handle> <new-handle>

        Description: changes a user’s handle

        Returns: 1 on success; 0 if the new handle is invalid or already used, or if the user can’t be found

        @@ -445,7 +433,7 @@

        chhandle <old-handle> <new-handle> -

        chattr <handle> [changes [channel]]

        +

        chattr <handle> [changes [channel]]

        Description: changes the attributes for a user record, if you include any. Changes are of the form ‘+f’, ‘-o’, ‘+dk’, ‘-o+d’, etc. If changes are specified in the format of |<changes> <channel>, the channel-specific flags for that channel are altered. You can now use the +o|-o #channel format here too.

        @@ -454,7 +442,7 @@

        chattr <handle> [changes [channel]] -

        botattr <handle> [changes [channel]]

        +

        botattr <handle> [changes [channel]]

        Description: similar to chattr except this modifies bot flags rather than normal user attributes.

        Returns: new flags for the bot (if you made no changes, the current flags are returned). If a channel was specified, the global AND the channel-specific flags for that channel are returned in the format of globalflags|channelflags. “*” is returned if the specified bot does not exist.

        @@ -462,7 +450,7 @@

        botattr <handle> [changes [channel]] -

        matchattr <handle> <flags> [channel]

        +

        matchattr <handle> <flags> [channel]

        Description: checks if the flags of the specified user match the flags provided. “flags” is of the form:

        [+/-]<global flags>[&/|<channel flags>[&/|<bot flags>]]
        @@ -474,7 +462,7 @@ 

        botattr <handle> [changes [channel]] -

        adduser <handle> [hostmask]

        +

        adduser <handle> [hostmask]

        Description: creates a new user entry with the handle and hostmask given (with no password and the default flags)

        Returns: 1 if successful; 0 if the handle already exists

        @@ -482,7 +470,7 @@

        adduser <handle> [hostmask] -

        addbot <handle> <address> [botport [userport]]

        +

        addbot <handle> <address> [botport [userport]]

        Description: adds a new bot to the userlist with the handle and botaddress given (with no password and no flags). <address> format is one of:

          @@ -499,7 +487,7 @@

          addbot <handle> <address> [botport [userport]] -

          deluser <handle>

          +

          deluser <handle>

          Description: attempts to erase the user record for a handle

          Returns: 1 if successful, 0 if no such user exists

          @@ -507,7 +495,7 @@

          deluser <handle> -

          delhost <handle> <hostmask>

          +

          delhost <handle> <hostmask>

          Description: deletes a hostmask from a user’s host list

          Returns: 1 on success; 0 if the hostmask (or user) doesn’t exist

          @@ -515,7 +503,7 @@

          delhost <handle> <hostmask> -

          addchanrec <handle> <channel>

          +

          addchanrec <handle> <channel>

          Description: adds a channel record for a user

          Returns: 1 on success; 0 if the user or channel does not exist

          @@ -523,7 +511,7 @@

          addchanrec <handle> <channel> -

          delchanrec <handle> <channel>

          +

          delchanrec <handle> <channel>

          Description: removes a channel record for a user. This includes all associated channel flags.

          Returns: 1 on success; 0 if the user or channel does not exist

          @@ -531,21 +519,21 @@

          delchanrec <handle> <channel> -

          haschanrec <handle> <channel>

          +

          haschanrec <handle> <channel>

          Returns: 1 if the given handle has a chanrec for the specified channel; 0 otherwise

          Module: channels

        -

        getchaninfo <handle> <channel>

        +

        getchaninfo <handle> <channel>

        Returns: info line for a specific channel (behaves just like ‘getinfo’)

        Module: channels

        -

        setchaninfo <handle> <channel> <info>

        +

        setchaninfo <handle> <channel> <info>

        Description: sets the info line on a specific channel for a user. If info is “none”, it will be removed.

        Returns: nothing

        @@ -553,15 +541,11 @@

        setchaninfo <handle> <channel> <info>

        -

        newchanban <channel> <ban> <creator> <comment> [lifetime] [options]

        +

        newchanban <channel> <ban> <creator> <comment> [lifetime] [options]

        Description: adds a ban to the ban list of a channel; creator is given credit for the ban in the ban list. lifetime is specified in minutes. If lifetime is not specified, ban-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent ban.

        Options:

        Type

        Extra Info

        ---- @@ -573,15 +557,11 @@

        newchanban <channel> <ban> <creator> <comment> [life
        -

        newban <ban> <creator> <comment> [lifetime] [options]

        +

        newban <ban> <creator> <comment> [lifetime] [options]

        Description: adds a ban to the global ban list (which takes effect on all channels); creator is given credit for the ban in the ban list. lifetime is specified in minutes. If lifetime is not specified, default-ban-time (usually 120) is used. Setting the lifetime to 0 makes it a permanent ban.

        Options:

        sticky

        forces the ban to be always active on a channel, even with dynamicbans on

        ---- @@ -593,15 +573,11 @@

        newban <ban> <creator> <comment> [lifetime] [options]
        -

        newchanexempt <channel> <exempt> <creator> <comment> [lifetime] [options]

        +

        newchanexempt <channel> <exempt> <creator> <comment> [lifetime] [options]

        Description: adds a exempt to the exempt list of a channel; creator is given credit for the exempt in the exempt list. lifetime is specified in minutes. If lifetime is not specified, exempt-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent exempt. The exempt will not be removed until the corresponding ban has been removed. For timed bans, once the time period has expired, the exempt will not be removed until the corresponding ban has either expired or been removed.

        Options:

        sticky

        forces the ban to be always active on a channel, even with dynamicbans on

        ---- @@ -613,15 +589,11 @@

        newchanexempt <channel> <exempt> <creator> <comment>
        -

        newexempt <exempt> <creator> <comment> [lifetime] [options]

        +

        newexempt <exempt> <creator> <comment> [lifetime] [options]

        Description: adds a exempt to the global exempt list (which takes effect on all channels); creator is given credit for the exempt in the exempt list. lifetime is specified in minutes. If lifetime is not specified, exempt-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent exempt. The exempt will not be removed until the corresponding ban has been removed.

        Options:

        sticky

        forces the exempt to be always active on a channel, even with dynamicexempts on

        ---- @@ -633,15 +605,11 @@

        newexempt <exempt> <creator> <comment> [lifetime] [options
        -

        newchaninvite <channel> <invite> <creator> <comment> [lifetime] [options]

        +

        newchaninvite <channel> <invite> <creator> <comment> [lifetime] [options]

        Description: adds a invite to the invite list of a channel; creator is given credit for the invite in the invite list. lifetime is specified in minutes. If lifetime is not specified, invite-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent invite. The invite will not be removed until the channel has gone -i.

        Options:

        sticky

        forces the exempt to be always active on a channel, even with dynamicexempts on

        ---- @@ -653,15 +621,11 @@

        newchaninvite <channel> <invite> <creator> <comment>
        -

        newinvite <invite> <creator> <comment> [lifetime] [options]

        +

        newinvite <invite> <creator> <comment> [lifetime] [options]

        Description: adds a invite to the global invite list (which takes effect on all channels); creator is given credit for the invite in the invite list. lifetime is specified in minutes. If lifetime is not specified, invite-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent invite. The invite will not be removed until the channel has gone -i.

        Options:

        sticky

        forces the invite to be always active on a channel, even with dynamicinvites on

        ---- @@ -673,7 +637,7 @@

        newinvite <invite> <creator> <comment> [lifetime] [options
        -

        stickban <banmask> [channel]

        +

        stickban <banmask> [channel]

        Description: makes a ban sticky, or, if a channel is specified, then it is set sticky on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -681,7 +645,7 @@

        stickban <banmask> [channel] -

        unstickban <banmask> [channel]

        +

        unstickban <banmask> [channel]

        Description: makes a ban no longer sticky, or, if a channel is specified, then it is unstuck on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -689,7 +653,7 @@

        unstickban <banmask> [channel] -

        stickexempt <exemptmask> [channel]

        +

        stickexempt <exemptmask> [channel]

        Description: makes an exempt sticky, or, if a channel is specified, then it is set sticky on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -697,7 +661,7 @@

        stickexempt <exemptmask> [channel] -

        unstickexempt <exemptmask> [channel]

        +

        unstickexempt <exemptmask> [channel]

        Description: makes an exempt no longer sticky, or, if a channel is specified, then it is unstuck on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -705,7 +669,7 @@

        unstickexempt <exemptmask> [channel] -

        stickinvite <invitemask> [channel]

        +

        stickinvite <invitemask> [channel]

        Description: makes an invite sticky, or, if a channel is specified, then it is set sticky on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -713,7 +677,7 @@

        stickinvite <invitemask> [channel] -

        unstickinvite <invitemask> [channel]

        +

        unstickinvite <invitemask> [channel]

        Description: makes an invite no longer sticky, or, if a channel is specified, then it is unstuck on that channel only.

        Returns: 1 on success; 0 otherwise

        @@ -721,7 +685,7 @@

        unstickinvite <invitemask> [channel] -

        killchanban <channel> <ban>

        +

        killchanban <channel> <ban>

        Description: removes a ban from the ban list for a channel

        Returns: 1 on success; 0 otherwise

        @@ -729,7 +693,7 @@

        killchanban <channel> <ban> -

        killban <ban>

        +

        killban <ban>

        Description: removes a ban from the global ban list

        Returns: 1 on success; 0 otherwise

        @@ -737,7 +701,7 @@

        killban <ban> -

        killchanexempt <channel> <exempt>

        +

        killchanexempt <channel> <exempt>

        Description: removes an exempt from the exempt list for a channel

        Returns: 1 on success; 0 otherwise

        @@ -745,7 +709,7 @@

        killchanexempt <channel> <exempt> -

        killexempt <exempt>

        +

        killexempt <exempt>

        Description: removes an exempt from the global exempt list

        Returns: 1 on success; 0 otherwise

        @@ -753,7 +717,7 @@

        killexempt <exempt>

        -

        killchaninvite <channel> <invite>

        +

        killchaninvite <channel> <invite>

        Description: removes an invite from the invite list for a channel

        Returns: 1 on success; 0 otherwise

        @@ -761,7 +725,7 @@

        killchaninvite <channel> <invite> -

        killinvite <invite>

        +

        killinvite <invite>

        Description: removes an invite from the global invite list

        Returns: 1 on success; 0 otherwise

        @@ -769,91 +733,91 @@

        killinvite <invite>

        -

        ischanjuped <channel>

        +

        ischanjuped <channel>

        Returns: 1 if the channel is juped, and the bot is unable to join; 0 otherwise

        Module: channels

        -

        isban <ban> [channel [-channel]]

        +

        isban <ban> [channel [-channel]]

        Returns: 1 if the specified ban is in the global ban list; 0 otherwise. If a channel is specified, that channel’s ban list is checked as well. If the -channel flag is used at the end of the command, *only* the channel bans are checked.

        Module: channels

        -

        ispermban <ban> [channel [-channel]]

        +

        ispermban <ban> [channel [-channel]]

        Returns: 1 if the specified ban is in the global ban list AND is marked as permanent; 0 otherwise. If a channel is specified, that channel’s ban list is checked as well. If the -channel flag is used at the end of the command, *only* the channel bans are checked.

        Module: channels

        -

        isexempt <exempt> [channel [-channel]]

        +

        isexempt <exempt> [channel [-channel]]

        Returns: 1 if the specified exempt is in the global exempt list; 0 otherwise. If a channel is specified, that channel’s exempt list is checked as well. If the -channel flag is used at the end of the command, *only* the channel exempts are checked.

        Module: channels

        -

        ispermexempt <exempt> [channel [-channel]]

        +

        ispermexempt <exempt> [channel [-channel]]

        Returns: 1 if the specified exempt is in the global exempt list AND is marked as permanent; 0 otherwise. If a channel is specified, that channel’s exempt list is checked as well. If the -channel flag is used at the end of the command, *only* the channel exempts are checked.

        Module: channels

        -

        isinvite <invite> [channel [-channel]]

        +

        isinvite <invite> [channel [-channel]]

        Returns: 1 if the specified invite is in the global invite list; 0 otherwise. If a channel is specified, that channel’s invite list is checked as well. If the -channel flag is used at the end of the command, *only* the channel invites are checked.

        Module: channels

        -

        isperminvite <invite> [channel [-channel]]

        +

        isperminvite <invite> [channel [-channel]]

        Returns: 1 if the specified invite is in the global invite list AND is marked as permanent; 0 otherwise. If a channel is specified, that channel’s invite list is checked as well. If the -channel flag is used at the end of the command, *only* the channel invites are checked.

        Module: channels

        -

        isbansticky <ban> [channel [-channel]]

        +

        isbansticky <ban> [channel [-channel]]

        Returns: 1 if the specified ban is marked as sticky in the global ban list; 0 otherwise. If a channel is specified, that channel’s ban list is checked as well. If the -channel flag is used at the end of the command, *only* the channel bans are checked.

        Module: channels

        -

        isexemptsticky <exempt> [channel [-channel]]

        +

        isexemptsticky <exempt> [channel [-channel]]

        Returns: 1 if the specified exempt is marked as sticky in the global exempt list; 0 otherwise. If a channel is specified, that channel’s exempt list is checked as well. If the -channel flag is used at the end of the command, *only* the channel exempts are checked.

        Module: channels

        -

        isinvitesticky <invite> [channel [-channel]]

        +

        isinvitesticky <invite> [channel [-channel]]

        Returns: 1 if the specified invite is marked as sticky in the global invite list; 0 otherwise. If a channel is specified, that channel’s invite list is checked as well. If the -channel flag is used at the end of the command, *only* the channel invites are checked.

        Module: channels

        -

        matchban <nick!user@host> [channel]

        +

        matchban <nick!user@host> [channel]

        Returns: 1 if the specified nick!user@host matches a ban in the global ban list; 0 otherwise. If a channel is specified, that channel’s ban list is checked as well.

        Module: channels

        -

        matchexempt <nick!user@host> [channel]

        +

        matchexempt <nick!user@host> [channel]

        Returns: 1 if the specified nick!user@host matches an exempt in the global exempt list; 0 otherwise. If a channel is specified, that channel’s exempt list is checked as well.

        Module: channels

        -

        matchinvite <nick!user@host> [channel]

        +

        matchinvite <nick!user@host> [channel]

        Returns: 1 if the specified nick!user@host matches an invite in the global invite list; 0 otherwise. If a channel is specified, that channel’s invite list is checked as well.

        @@ -861,28 +825,28 @@

        matchinvite < -

        banlist [channel]

        +

        banlist [channel]

        Returns: a list of global bans, or, if a channel is specified, a list of channel-specific bans. Each entry is a sublist containing: hostmask, comment, expiration timestamp, time added, last time active, and creator. The three timestamps are in unixtime format.

        Module: channels

        -

        exemptlist [channel]

        +

        exemptlist [channel]

        Returns: a list of global exempts, or, if a channel is specified, a list of channel-specific exempts. Each entry is a sublist containing: hostmask, comment, expiration timestamp, time added, last time active, and creator. The three timestamps are in unixtime format.

        Module: channels

        -

        invitelist [channel]

        +

        invitelist [channel]

        Returns: a list of global invites, or, if a channel is specified, a list of channel-specific invites. Each entry is a sublist containing: hostmask, comment, expiration timestamp, time added, last time active, and creator. The three timestamps are in unixtime format.

        Module: channels

        -

        newignore <hostmask> <creator> <comment> [lifetime]

        +

        newignore <hostmask> <creator> <comment> [lifetime]

        Description: adds an entry to the ignore list; creator is given credit for the ignore. lifetime is how many minutes until the ignore expires and is removed. If lifetime is not specified, ignore-time (usually 60) is used. Setting the lifetime to 0 makes it a permanent ignore.

        Returns: nothing

        @@ -890,7 +854,7 @@

        newignore <hostmask> <creator> <comment> [lifetime]

        -

        killignore <hostmask>

        +

        killignore <hostmask>

        Description: removes an entry from the ignore list

        Returns: 1 if successful; 0 otherwise

        @@ -898,21 +862,21 @@

        killignore <hostmask>

        -

        ignorelist

        +

        ignorelist

        Returns: a list of ignores. Each entry is a sublist containing: hostmask, comment, expiration timestamp, time added, and creator. The timestamps are in unixtime format.

        Module: core

        -

        isignore <hostmask>

        +

        isignore <hostmask>

        Returns: 1 if the ignore is in the list; 0 otherwise

        Module: core

        -

        save

        +

        save

        Description: writes the user and channel files to disk

        Returns: nothing

        @@ -920,7 +884,7 @@

        save

        -

        reload

        +

        reload

        Description: loads the userfile from disk, replacing whatever is in memory

        Returns: nothing

        @@ -928,7 +892,7 @@

        reload -

        backup

        +

        backup

        Description: makes a simple backup of the userfile that’s on disk. If the channels module is loaded, this also makes a simple backup of the channel file.

        Returns: nothing

        @@ -936,7 +900,7 @@

        backup -

        getting-users

        +

        getting-users

        Returns: 1 if the bot is currently downloading a userfile from a sharebot (and hence, user records are about to drastically change); 0 if not

        Module: core

        @@ -944,9 +908,9 @@

        getting-users -

        Channel Commands

        +

        Channel Commands

        -

        channel add <name> [option-list]

        +

        channel add <name> [option-list]

        Description: adds a channel record for the bot to monitor. The full list of possible options are given in doc/settings/mod.channels. Note that the channel options must be in a list (enclosed in {}).

        Returns: nothing

        @@ -954,7 +918,7 @@

        channel add <name> [option-list] -

        channel set <name> <options…>

        +

        channel set <name> <options…>

        Description: sets options for the channel specified. The full list of possible options are given in doc/settings/mod.channels.

        Returns: nothing

        @@ -962,21 +926,21 @@

        channel set <name> <options…> -

        channel info <name>

        +

        channel info <name>

        Returns: a list of info about the specified channel’s settings.

        Module: channels

        -

        channel get <name> [setting]

        +

        channel get <name> [setting]

        Returns: The value of the setting you specify. For flags, a value of 0 means it is disabled (-), and non-zero means enabled (+). If no setting is specified, a flat list of all available settings and their values will be returned.

        Module: channels

        -

        channel remove <name>

        +

        channel remove <name>

        Description: removes a channel record from the bot and makes the bot no longer monitor the channel

        Returns: nothing

        @@ -984,7 +948,7 @@

        channel remove <name>

        -

        savechannels

        +

        savechannels

        Description: saves the channel settings to the channel-file if one is defined.

        Returns: nothing

        @@ -992,7 +956,7 @@

        savechannels -

        loadchannels

        +

        loadchannels

        Description: reloads the channel settings from the channel-file if one is defined.

        Returns: nothing

        @@ -1000,17 +964,17 @@

        loadchannels -

        channels

        +

        channels

        Returns: a list of the channels the bot has a channel record for

        Module: channels

        -

        channame2dname <channel-name>

        +

        channame2dname <channel-name>

        -

        chandname2name <channel-dname>

        +

        chandname2name <channel-dname>

        Description: these two functions are important to correctly support !channels. The bot differentiates between channel description names (chan dnames) and real channel names (chan names). The chan dnames are what you would normally call the channel, such as “!channel”. The chan names are what the IRC server uses to identify the channel. They consist of the chan dname prefixed with an ID; such as “!ABCDEchannel”.

        For bot functions like isop, isvoice, etc. you need to know the chan dnames. If you communicate with the server, you usually get the chan name, though. That’s what you need the channame2dname function for.

        @@ -1020,77 +984,77 @@

        chandname2name <channel-dname> -

        isbotnick <nick>

        +

        isbotnick <nick>

        Returns: 1 if the nick matches the botnick; 0 otherwise

        Module: server

        -

        botisop [channel]

        +

        botisop [channel]

        Returns: 1 if the bot has ops on the specified channel (or any channel if no channel is specified); 0 otherwise

        Module: irc

        -

        botishalfop [channel]

        +

        botishalfop [channel]

        Returns: 1 if the bot has halfops on the specified channel (or any channel if no channel is specified); 0 otherwise

        Module: irc

        -

        botisvoice [channel]

        +

        botisvoice [channel]

        Returns: 1 if the bot has a voice on the specified channel (or any channel if no channel is specified); 0 otherwise

        Module: irc

        -

        botonchan [channel]

        +

        botonchan [channel]

        Returns: 1 if the bot is on the specified channel (or any channel if no channel is specified); 0 otherwise

        Module: irc

        -

        isop <nickname> [channel]

        +

        isop <nickname> [channel]

        Returns: 1 if someone by the specified nickname is on the channel (or any channel if no channel name is specified) and has ops; 0 otherwise

        Module: irc

        -

        ishalfop <nickname> [channel]

        +

        ishalfop <nickname> [channel]

        Returns: 1 if someone by the specified nickname is on the channel (or any channel if no channel name is specified) and has halfops; 0 otherwise

        Module: irc

        -

        wasop <nickname> <channel>

        +

        wasop <nickname> <channel>

        Returns: 1 if someone that just got opped/deopped in the chan had op before the modechange; 0 otherwise

        Module: irc

        -

        washalfop <nickname> <channel>

        +

        washalfop <nickname> <channel>

        Returns: 1 if someone that just got halfopped/dehalfopped in the chan had halfop before the modechange; 0 otherwise

        Module: irc

        -

        isvoice <nickname> [channel]

        +

        isvoice <nickname> [channel]

        Returns: 1 if someone by that nickname is on the channel (or any channel if no channel is specified) and has voice (+v); 0 otherwise

        Module: irc

        -

        isidentified <nickname> [channel]

        +

        isidentified <nickname> [channel]

        Description: determine if a user is identified to irc services. WARNING: this may not be accurate depending on the server and configuration. For accurate results, the server must support (and Eggdrop must have enabled via CAP) the account-notify and extended-join capabilities, and the server must understand WHOX requests (also known as raw 354 responses)

        Returns: 1 if someone by the specified nickname is on the channel (or any channel if no channel name is specified) and is logged in); 0 otherwise.

        @@ -1098,7 +1062,7 @@

        isidentified <nickname> [channel] -

        isaway <nickname> [channel]

        +

        isaway <nickname> [channel]

        Description: determine if a user is marked as ‘away’ on a server. IMPORTANT: this command is only “mostly” reliable on its own when the IRCv3 away-notify capability is available and negotiated with the IRC server (if you didn’t add this to your config file, it likely isn’t enabled- you can confirm using the cap Tcl command). Additionally, there is no way for Eggdrop (or any client) to capture a user’s away status when the user first joins a channel (they are assumed present by Eggdrop on join). To use this command without the away-notify capability negotiated, or to get a user’s away status on join (via a JOIN bind), use refreshchan <channel> w on a channel the user is on, which will refresh the current away status stored by Eggdrop for all users on the channel.

        Returns: 1 if Eggdrop is currently tracking someone by that nickname marked as ‘away’ (again, see disclaimer above) by an IRC server; 0 otherwise.

        @@ -1106,121 +1070,121 @@

        isaway <nickname> [channel] -

        isircbot <nickname> [channel]

        +

        isircbot <nickname> [channel]

        Description: determine if a user has denoted themselves as a bot via an ircd-defined user flag (declared via BOT in a server’s 005/ISUPPORT line). Due to server implementations, accurately monitoring this is incredibly fragile, as the flag can be added and removed by a user without any notification to other users. To ensure this status is current for use, it is recommended to use refreshchan <channel> w on a channel the user is on, which will refresh if the user is a bot or not for all users on the channel. If a server does not advertise BOT in its ISUPPORT line but still supports it (currently the case for unrealircd), you can manually set it by adding “BOT=B” (or whatever flag is used) to the isupport-default setting in your eggdrop.conf file.

        Returns: 1 if Eggdrop is currently tracking someone by that nickname marked as a bot by an IRC server; 0 otherwise.

        -

        onchan <nickname> [channel]

        +

        onchan <nickname> [channel]

        Returns: 1 if someone by that nickname is on the specified channel (or any channel if none is specified); 0 otherwise

        Module: irc

        -

        monitor <add/delete/list/online/offline/status/clear> [nickname]

        +

        monitor <add/delete/list/online/offline/status/clear> [nickname]

        Description: interacts with the list of nicknames Eggdrop has asked the IRC server to track. valid sub-commands are add, delete, list, online, offline, status, and clear. The ‘add’ command sends ‘nickname’ to the server to track. The ‘delete’ command removes ‘nickname’ from being tracked by the server (or returns an error if the nickname is not present). The ‘list’ command returns a list of all nicknames the IRC server is tracking on behalf of Eggdrop. The ‘online’ command returns a string of tracked nicknames that are currently online. The ‘offline’ command returns a list of tracked nicknames that are currently offline.

        -

        Returns: The ‘add’ sub-command returns a ‘1’ if the nick was succssfully added, a ‘0’ if the nick is already in the monitor list, and a ‘2’ if the nick could not be added. The ‘delete’ sub-command returns a ‘1’ if the nick is removed, or an error if the nick is not found. The ‘status’ sub-command returns a ‘1’ if ‘nickname’ is online or a 0 if ‘nickname’ is offline. The ‘clear’ command removes all nicknames from the list the server is monitoring.

        +

        Returns: The ‘add’ sub-command returns a ‘1’ if the nick was successfully added, a ‘0’ if the nick is already in the monitor list, and a ‘2’ if the nick could not be added. The ‘delete’ sub-command returns a ‘1’ if the nick is removed, or an error if the nick is not found. The ‘status’ sub-command returns a ‘1’ if ‘nickname’ is online or a 0 if ‘nickname’ is offline. The ‘clear’ command removes all nicknames from the list the server is monitoring.

        Module: irc

        -

        accounttracking

        +

        accounttracking

        -

        Description: checks to see if the three required functionalities to enable proper account tracking are available (and enabled) to Eggdrop. This checks if the extended-join and account-notify IRCv3 capabilities are currently enabled, and checks if the server supports WHOX (based on the type of server selected in the config file, or the use-354 variable being set to 1 when seleceting an “Other” server).

        +

        Description: checks to see if the three required functionalities to enable proper account tracking are available (and enabled) to Eggdrop. This checks if the extended-join and account-notify IRCv3 capabilities are currently enabled, and checks if the server supports WHOX (based on the type of server selected in the config file, or the use-354 variable being set to 1 when selecting an “Other” server).

        Returns: a ‘1’ if all three functionalities are present, a ‘0’ if one or more are missing.

        Module: irc

        -

        getaccount <nickname> [channel]

        +

        getaccount <nickname> [channel]

        Returns: the services account name associated with nickname, “*” if the user is not logged into services, or “” if eggdrop does not know the account status of the user.

        NOTE: the three required IRC components for account tracking are: the WHOX feature, the extended-join IRCv3 capability and the account-notify IRCv3 capability. if only some of the three feature are available, eggdrop provides best-effort account tracking. please see doc/ACCOUNTS for additional information.

        -

        nick2hand <nickname> [channel]

        +

        nick2hand <nickname> [channel]

        Returns: the handle of a nickname on a channel. If a channel is not specified, the bot will check all of its channels. If the nick is not found, “” is returned. If the nick is found but does not have a handle, “*” is returned. If no channel is specified, all channels are checked.

        Module: irc

        -

        account2nicks <handle> [channel]

        +

        account2nicks <handle> [channel]

        Returns: a de-duplicated Tcl list of the nickname(s) on the specified channel (if one is specified) whose nickname matches the given account; “” is returned if no match is found. This command will only work if a server supports (and Eggdrop has enabled) the account-notify and extended-join capabilities, and the server understands WHOX requests (also known as raw 354 responses). If no channel is specified, all channels are checked.

        Module: irc

        -

        hand2nick <handle> [channel]

        +

        hand2nick <handle> [channel]

        Returns: nickname of the first person on the specified channel (if one is specified) whose nick!user@host matches the given handle; “” is returned if no match is found. If no channel is specified, all channels are checked.

        Module: irc

        -

        hand2nicks <handle> [channel]

        +

        hand2nicks <handle> [channel]

        Returns: a de-duplicated Tcl list of the nickname(s) on the specified channel (if one is specified) whose nick!user@host matches the given handle; “” is returned if no match is found. If no channel is specified, all channels are checked.

        Module: irc

        -

        handonchan <handle> [channel]

        +

        handonchan <handle> [channel]

        Returns: 1 if the the nick!user@host for someone on the channel (or any channel if no channel name is specified) matches for the handle given; 0 otherwise

        Module: irc

        -

        ischanban <ban> <channel>

        +

        ischanban <ban> <channel>

        Returns: 1 if the specified ban is on the given channel’s ban list (not the bot’s banlist for the channel)

        Module: irc

        -

        ischanexempt <exempt> <channel>

        +

        ischanexempt <exempt> <channel>

        Returns: 1 if the specified exempt is on the given channel’s exempt list (not the bot’s exemptlist for the channel)

        Module: irc

        -

        ischaninvite <invite> <channel>

        +

        ischaninvite <invite> <channel>

        Returns: 1 if the specified invite is on the given channel’s invite list (not the bot’s invitelist for the channel)

        Module: irc

        -

        chanbans <channel>

        +

        chanbans <channel>

        Returns: a list of the current bans on the channel. Each element is a sublist of the form {<ban> <bywho> <age>}. age is seconds from the bot’s point of view

        Module: irc

        -

        chanexempts <channel>

        +

        chanexempts <channel>

        Returns: a list of the current exempts on the channel. Each element is a sublist of the form {<exempts> <bywho> <age>}. age is seconds from the bot’s point of view

        Module: irc

        -

        chaninvites <channel>

        +

        chaninvites <channel>

        Returns: a list of the current invites on the channel. Each element is a sublist of the form {<invites> <bywho> <age>}. age is seconds from the bot’s point of view

        Module: irc

        -

        resetbans <channel>

        +

        resetbans <channel>

        Description: removes all bans on the channel that aren’t in the bot’s ban list and refreshes any bans that should be on the channel but aren’t

        Returns: nothing

        @@ -1228,7 +1192,7 @@

        resetbans <channel>

        -

        resetexempts <channel>

        +

        resetexempts <channel>

        Description: removes all exempt on the channel that aren’t in the bot’s exempt list and refreshes any exempts that should be on the channel but aren’t

        Returns: nothing

        @@ -1236,7 +1200,7 @@

        resetexempts <channel> -

        resetinvites <channel>

        +

        resetinvites <channel>

        Description: removes all invites on the channel that aren’t in the bot’s invite list and refreshes any invites that should be on the channel but aren’t

        Returns: nothing

        @@ -1244,7 +1208,7 @@

        resetinvites <channel> -

        resetchanidle [nick] <channel>

        +

        resetchanidle [nick] <channel>

        Description: resets the channel idle time for the given nick or for all nicks on the channel if no nick is specified.

        Returns: nothing

        @@ -1252,7 +1216,7 @@

        resetchanidle [nick] <channel> -

        resetchanjoin [nick] <channel>

        +

        resetchanjoin [nick] <channel>

        Description: resets the channel join time for the given nick or for all nicks on the channel if no nick is specified.

        Returns: nothing

        @@ -1260,14 +1224,10 @@

        resetchanjoin [nick] <channel> -

        resetchan <channel> [flags]

        +

        resetchan <channel> [flags]

        Description: clears the channel info Eggdrop is currently storing for a channel, then rereads the channel info from the server. Useful if Eggdrop gets into a bad state on a server with respect to a channel userlist, for example. If flags are specified, only the required information will be reset, according to the given flags. Available flags:

        sticky

        forces the invite to be always active on a channel, even with dynamicinvites on

        ---- @@ -1291,14 +1251,10 @@

        resetchan <channel> [flags] -

        refreshchan <channel> [flags]

        +

        refreshchan <channel> [flags]

        Description: An alternative to resetchan, refresh rereads the channel info from the server without first clearing out the previously stored information. Useful for updating a user’s away status without resetting their idle time, for example. If flags are specified, only the required information will be refreshed, according to the given flags. Available flags:

        b

        channel bans

        ---- @@ -1325,51 +1281,51 @@

        refreshchan <channel> [flags] -

        getchanhost <nickname> [channel]

        +

        getchanhost <nickname> [channel]

        Returns: user@host of the specified nickname (the nickname is not included in the returned host). If a channel is not specified, bot will check all of its channels. If the nickname is not on the channel(s), “” is returned.

        Module: irc

        -

        getchanjoin <nickname> <channel>

        +

        getchanjoin <nickname> <channel>

        Returns: timestamp (unixtime format) of when the specified nickname joined the channel if available, 0 otherwise. Note that after a channel reset this information will be lost, even if previously available.

        Module: irc

        -

        onchansplit <nick> [channel]

        +

        onchansplit <nick> [channel]

        Returns: 1 if that nick is split from the channel (or any channel if no channel is specified); 0 otherwise

        Module: irc

        -

        chanlist <channel> [flags][<&|>chanflags]

        +

        chanlist <channel> [flags][<&|>chanflags]

        -

        Description: flags are any global flags; the ‘&’ or ‘|’ denotes to look for channel specific flags, where ‘&’ will return users having ALL chanflags and ‘|’ returns users having ANY of the chanflags (See Flag Masks for additional information).

        +

        Description: lists all users on a channel Eggdrop has joined. flags are any global flags; the ‘&’ or ‘|’ denotes to look for channel specific flags, where ‘&’ will return users having ALL chanflags and ‘|’ returns users having ANY of the chanflags (See Flag Masks for additional information).

        Returns: Searching for flags optionally preceded with a ‘+’ will return a list of nicknames that have all the flags listed. Searching for flags preceded with a ‘-’ will return a list of nicknames that do not have have any of the flags (differently said, ‘-’ will hide users that have all flags listed). If no flags are given, all of the nicknames on the channel are returned.

        Please note that if you’re executing chanlist after a part or sign bind, the gone user will still be listed, so you can check for wasop, isop, etc.

        Module: irc

        -

        getchanidle <nickname> <channel>

        +

        getchanidle <nickname> <channel>

        Returns: number of minutes that person has been idle; -1 if the specified user isn’t on the channel

        Module: irc

        -

        getchanmode <channel>

        +

        getchanmode <channel>

        Returns: string of the type “+ntik key” for the channel specified

        Module: irc

        -

        jump [server [[+]port [password]]]

        +

        jump [server [[+]port [password]]]

        Description: jumps to the server specified, or (if none is specified) the next server in the bot’s serverlist. If you prefix the port with a plus sign (e.g. +6697), SSL connection will be attempted.

        Returns: nothing

        @@ -1377,7 +1333,7 @@

        jump [server [[+]port [password]]] -

        pushmode <channel> <mode> [arg]

        +

        pushmode <channel> <mode> [arg]

        Description: sends out a channel mode change (ex: pushmode #lame +o goober) through the bot’s queuing system. All the mode changes will be sent out at once (combined into one line as much as possible) after the script finishes, or when ‘flushmode’ is called.

        Returns: nothing

        @@ -1385,7 +1341,7 @@

        pushmode <channel> <mode> [arg] -

        flushmode <channel>

        +

        flushmode <channel>

        Description: forces all previously pushed channel mode changes to be sent to the server, instead of when the script is finished (just for the channel specified)

        Returns: nothing

        @@ -1393,14 +1349,14 @@

        flushmode <channel>

        -

        topic <channel>

        +

        topic <channel>

        Returns: string containing the current topic of the specified channel

        Module: irc

        -

        validchan <channel>

        +

        validchan <channel>

        Description: checks if the bot has a channel record for the specified channel. Note that this does not necessarily mean that the bot is ON the channel.

        Returns: 1 if the channel exists, 0 if not

        @@ -1408,14 +1364,14 @@

        validchan <channel>

        -

        isdynamic <channel>

        +

        isdynamic <channel>

        Returns: 1 if the channel is a dynamic channel; 0 otherwise

        Module: channels

        -

        setudef <flag/int/str> <name>

        +

        setudef <flag/int/str> <name>

        Description: initializes a user defined channel flag, string or integer setting. You can use it like any other flag/setting. IMPORTANT: Don’t forget to reinitialize your flags/settings after a restart, or it’ll be lost.

        Returns: nothing

        @@ -1423,7 +1379,7 @@

        setudef <flag/int/str> <name> -

        renudef <flag/int/str> <oldname> <newname>

        +

        renudef <flag/int/str> <oldname> <newname>

        Description: renames a user defined channel flag, string, or integer setting.

        Returns: nothing

        @@ -1431,7 +1387,7 @@

        renudef <flag/int/str> <oldname> <newname> -

        deludef <flag/int/str> <name>

        +

        deludef <flag/int/str> <name>

        Description: deletes a user defined channel flag, string, or integer setting.

        Returns: nothing

        @@ -1439,21 +1395,21 @@

        deludef <flag/int/str> <name> -

        getudefs [flag/int/str]

        +

        getudefs [flag/int/str]

        Returns: a list of user defined channel settings of the given type, or all of them if no type is given.

        Module: channels

        -

        chansettype <setting>

        +

        chansettype <setting>

        Returns: The type of the setting you specify. The possible types are flag, int, str, pair. A flag type references a channel flag setting that can be set to either + or -. An int type is a channel setting that is set to a number, such as ban-time. A str type is a channel setting that stores a string, such as need-op. A pair type is a setting that holds a value couple, such as the flood settings.

        Module: channels

        -

        isupport get [key]

        +

        isupport get [key]

        Description: - isupport get: Returns a flat key/value list (dict) of settings. @@ -1463,7 +1419,7 @@

        isupport get [key] -

        isupport isset <key>

        +

        isupport isset <key>

        Description: Returns 0/1 depending on whether the key has a value.

        Returns: 0 or 1

        @@ -1472,9 +1428,9 @@

        isupport isset <key>

        -

        DCC Commands

        +

        DCC Commands

        -

        putdcc <idx> <text> [-raw]

        +

        putdcc <idx> <text> [-raw]

        Description: sends text to the idx specified. If -raw is specified, the text will be sent as is, without forced new lines or limits to line length.

        Returns: nothing

        @@ -1482,7 +1438,7 @@

        DCC Commands -

        putidx <idx> <text> -[raw]

        +

        putidx <idx> <text> -[raw]

        Description. Alias for the putdcc command.

        Returns: nothing

        @@ -1490,7 +1446,7 @@

        putidx <idx> <text> -[raw] -

        dccbroadcast <message>

        +

        dccbroadcast <message>

        Description: sends a message to everyone on the party line across the botnet, in the form of “*** <message>” for local users, “*** (Bot) <message>” for users on other bots with version below 1.8.4, and “(Bot) <message>” for users on other bots with version 1.8.4+ and console log mode ‘l’ enabled

        Returns: nothing

        @@ -1498,7 +1454,7 @@

        dccbroadcast <message> -

        dccputchan <channel> <message>

        +

        dccputchan <channel> <message>

        Description: sends your message to everyone on a certain channel on the botnet, in a form exactly like dccbroadcast does. Valid channels are 0 through 99999.

        Returns: nothing

        @@ -1506,7 +1462,7 @@

        dccputchan <channel> <message> -

        boot <user@bot> [reason]

        +

        boot <user@bot> [reason]

        Description: boots a user from the partyline

        Returns: nothing

        @@ -1514,7 +1470,7 @@

        boot <

        -

        dccsimul <idx> <text>

        +

        dccsimul <idx> <text>

        Description: simulates text typed in by the dcc user specified. Note that in v0.9, this only simulated commands; now a command must be preceded by a ‘.’ to be simulated.

        Returns: nothing

        @@ -1522,35 +1478,35 @@

        dccsimul <idx> <text> -

        hand2idx <handle>

        +

        hand2idx <handle>

        Returns: the idx (a number greater than or equal to zero) for the user given if the user is on the party line in chat mode (even if she is currently on a channel or in chat off), the file area, or in the control of a script. -1 is returned if no idx is found. If the user is on multiple times, the oldest idx is returned.

        Module: core

        -

        idx2hand <idx>

        +

        idx2hand <idx>

        Returns: handle of the user with the given idx

        Module: core

        -

        valididx <idx>

        +

        valididx <idx>

        Returns: 1 if the idx currently exists; 0 otherwise

        Module: core

        -

        getchan <idx>

        +

        getchan <idx>

        Returns: the current party line channel for a user on the party line; “0” indicates he’s on the group party line, “-1” means he has chat off, and a value from 1 to 99999 is a private channel

        Module: core

        -

        setchan <idx> <channel>

        +

        setchan <idx> <channel>

        Description: sets a party line user’s channel. The party line user is not notified that she is now on a new channel. A channel name can be used (provided it exists).

        Returns: nothing

        @@ -1558,7 +1514,7 @@

        setchan <idx> <channel> -

        console <idx> [channel] [console-modes]

        +

        console <idx> [channel] [console-modes]

        Description: changes a dcc user’s console mode, either to an absolute mode (like “mpj”) or just adding/removing flags (like “+pj” or “-moc” or “+mp-c”). The user’s console channel view can be changed also (as long as the new channel is a valid channel).

        Returns: a list containing the user’s (new) channel view and (new) console modes, or nothing if that user isn’t currently on the partyline

        @@ -1566,7 +1522,7 @@

        console <idx> [channel] [console-modes] -

        resetconsole <idx>

        +

        resetconsole <idx>

        Description: changes a dcc user’s console mode to the default setting in the configfile.

        Returns: a list containing the user’s channel view and (new) console modes, or nothing if that user isn’t currently on the partyline

        @@ -1574,7 +1530,7 @@

        resetconsole <idx>

        -

        echo <idx> [status]

        +

        echo <idx> [status]

        Description: turns a user’s echo on or off; the status has to be a 1 or 0

        Returns: new value of echo for that user (or the current value, if status was omitted)

        @@ -1582,14 +1538,10 @@

        echo <idx> [status]

        -

        strip <idx> [+/-strip-flags]

        +

        strip <idx> [+/-strip-flags]

        Description: modifies the strip-flags for a user. The supported strip-flags are:

        b

        channel bans

        ---- @@ -1625,7 +1577,7 @@

        strip <idx> [+/-strip-flags] -

        putbot <bot-nick> <message>

        +

        putbot <bot-nick> <message>

        Description: sends a message across the botnet to another bot. If no script intercepts the message on the other end, the message is ignored.

        Returns: nothing

        @@ -1633,7 +1585,7 @@

        putbot <bot-nick> <message> -

        putallbots <message>

        +

        putallbots <message>

        Description: sends a message across the botnet to all bots. If no script intercepts the message on the other end, the message is ignored.

        Returns: nothing

        @@ -1641,7 +1593,7 @@

        putallbots <message>

        -

        killdcc <idx>

        +

        killdcc <idx>

        Description: kills a partyline or file area connection

        Returns: nothing

        @@ -1649,21 +1601,17 @@

        killdcc <idx> -

        bots

        +

        bots

        Returns: list of the bots currently connected to the botnet

        Module: core

        -

        botlist

        +

        botlist

        Returns: a list of bots currently on the botnet. Each item in the list is a sublist with four elements: bot, uplink, version, and sharing status:

        c

        remove all color codes

        ---- @@ -1683,21 +1631,21 @@

        botlist -

        islinked <bot>

        +

        islinked <bot>

        Returns: 1 if the bot is currently linked; 0 otherwise

        Module: core

        -

        dccused

        +

        dccused

        Returns: number of dcc connections currently in use

        Module: core

        -

        dcclist [type]

        +

        dcclist [type]

        Returns: a list of active connections, each item in the list is a sublist containing seven elements: {<idx> <handle> <hostname> <[+]port> <type> {<other>} <timestamp>}.

        @@ -1706,15 +1654,11 @@

        dcclist [type] -

        socklist [type]

        +

        socklist [type]

        Returns: a list of active connections, each item in the list is a sublist containing eight elements (in dict-readable format). The order of items returned should not be considered static or permanent, so it is recommended to access the items as key/value pairs with the dict command, as opposed to something like lindex, to extract values. The possible keys returned are:

        bot

        the bot’s botnetnick

        ---- @@ -1755,28 +1699,28 @@

        socklist [type] -

        whom <chan>

        +

        whom <chan>

        Returns: list of people on the botnet who are on that channel. 0 is the default party line. Each item in the list is a sublist with six elements: nickname, bot, hostname, access flag (‘-’, ‘@’, ‘+’, or ‘*’), minutes idle, and away message (blank if the user is not away). If you specify * for channel, every user on the botnet is returned with an extra argument indicating the channel the user is on.

        Module: core

        -

        getdccidle <idx>

        +

        getdccidle <idx>

        Returns: number of seconds the dcc chat/file system/script user has been idle

        Module: core

        -

        getdccaway <idx>

        +

        getdccaway <idx>

        Returns: away message for a dcc chat user (or “” if the user is not set away)

        Module: core

        -

        setdccaway <idx> <message>

        +

        setdccaway <idx> <message>

        Description: sets a party line user’s away message and marks them away. If set to “”, the user is marked as no longer away.

        Returns: nothing

        @@ -1784,7 +1728,7 @@

        setdccaway <idx> <message> -

        connect <host> <[+]port>

        +

        connect <host> <[+]port>

        Description: makes an outgoing connection attempt and creates a dcc entry for it. A ‘control’ command should be used immediately after a successful ‘connect’ so no input is lost. If the port is prefixed with a plus sign, SSL encrypted connection will be attempted.

        Returns: idx of the new connection

        @@ -1792,7 +1736,7 @@

        connect <host> <[+]port> -

        listen [ip] <port> <type> [options [flag]]

        +

        listen [ip] <port> <type> [options [flag]]

        Description: opens a listening port to accept incoming telnets; type must be one of “bots”, “all”, “users”, “script”, or “off”. Prefixing the port with a plus sign will make eggdrop accept SSL connections on it. An IP may optionally be listed before the mandatory port argument. If no IP is specified, all available interfaces are used.

        @@ -1826,7 +1770,7 @@

        listen [ip] <port> <type> [options [flag]]

        -

        dccdumpfile <idx> <filename>

        +

        dccdumpfile <idx> <filename>

        Description: dumps out a file from the text directory to a dcc chat user. The flag matching that’s used everywhere else works here, too.

        Returns: nothing

        @@ -1835,9 +1779,9 @@

        dccdumpfile <idx> <filename> -

        Notes Module

        +

        Notes Module

        -

        notes <user> [numberlist]

        +

        notes <user> [numberlist]

        Returns: -1 if no such user, -2 if notefile failure. If a numberlist is not specified, the number of notes stored for the user is returned. Otherwise, a list of sublists containing information about notes stored for the user is returned. Each sublist is in the format of:

        {<from> <timestamp> <note text>}
        @@ -1847,7 +1791,7 @@ 

        notes <user> [numberlist] -

        erasenotes <user> <numberlist>

        +

        erasenotes <user> <numberlist>

        Description: erases some or all stored notes for a user. Use ‘-’ to erase all notes.

        Returns: -1 if no such user, -2 if notefile failure, 0 if no such note, or number of erased notes.

        @@ -1855,7 +1799,7 @@

        erasenotes <user> <numberlist> -

        listnotes <user> <numberlist>

        +

        listnotes <user> <numberlist>

        Description: lists existing notes according to the numberlist (ex: “2-4;8;16-“)

        Returns: -1 if no such user, -2 if notefile failure, 0 if no such note, list of existing notes.

        @@ -1863,7 +1807,7 @@

        listnotes <user> <numberlist> -

        storenote <from> <to> <msg> <idx>

        +

        storenote <from> <to> <msg> <idx>

        Description: stores a note for later reading, notifies idx of any results (use idx -1 for no notify).

        Returns: 0 on success; non-0 on failure

        @@ -1872,9 +1816,9 @@

        storenote <from> <to> <msg> <idx> -

        Assoc Module

        +

        Assoc Module

        -

        assoc <chan> [name]

        +

        assoc <chan> [name]

        Description: sets the name associated with a botnet channel, if you specify one

        Returns: current name for that channel, if any

        @@ -1882,7 +1826,7 @@

        assoc <chan> [name]

        -

        killassoc <chan>

        +

        killassoc <chan>

        Description: removes the name associated with a botnet channel, if any exists. Use ‘killassoc &’ to kill all assocs.

        Returns: nothing

        @@ -1891,14 +1835,14 @@

        killassoc <chan> -

        Compress Module

        +

        Compress Module

        -

        compressfile [-level <level>] <src-file> [target-file]

        +

        compressfile [-level <level>] <src-file> [target-file]

        -

        and

        +

        and

        -

        uncompressfile <src-file> [target-file]

        +

        uncompressfile <src-file> [target-file]

        Description: compresses or un-compresses files. The level option specifies the compression mode to use when compressing. Available modes are from 0 (minimum CPU usage, minimum compression) all the way up to 9 (maximum CPU usage, maximum compression). If you don’t specify the target-file, the src-file will be overwritten.

        Returns: nothing

        @@ -1907,7 +1851,7 @@

        uncompressfile <src-file> [target-file] -

        iscompressed <filename>

        +

        iscompressed <filename>

        Description: determines whether <filename> is gzip compressed.

        Returns: 1 if it is, 0 if it isn’t, and 2 if some kind of error prevented the checks from succeeding.

        @@ -1916,9 +1860,9 @@

        iscompressed <filename> -

        Filesys Module

        +

        Filesys Module

        -

        setpwd <idx> <dir>

        +

        setpwd <idx> <dir>

        Description: changes the directory of a file system user, in exactly the same way as a ‘cd’ command would. The directory can be specified relative or absolute.

        Returns: nothing

        @@ -1926,36 +1870,32 @@

        setpwd <idx> <dir>

        -

        getpwd <idx>

        +

        getpwd <idx>

        Returns: the current directory of a file system user

        Module: filesys

        -

        getfiles <dir>

        +

        getfiles <dir>

        Returns: a list of files in the directory given; the directory is relative to dcc-path

        Module: filesys

        -

        getdirs <dir>

        +

        getdirs <dir>

        Returns: a list of subdirectories in the directory given; the directory is relative to dcc-path

        Module: filesys

        -

        dccsend <filename> <ircnick>

        +

        dccsend <filename> <ircnick>

        Description: attempts to start a dcc file transfer to the given nick; the filename must be specified either by full pathname or in relation to the bot’s startup directory

        Returns:

        idx

        integer value assigned to Eggdrop connections

        ---- @@ -1974,8 +1914,7 @@

        dccsend <filename> <ircnick>

        - +

        0

        success

        5

        copy-to-tmp is enabled and the file already exists in the temp -directory

        the file could not be opened or temporary file could not be created

        @@ -1983,7 +1922,7 @@

        dccsend <filename> <ircnick> -

        filesend <idx> <filename> [ircnick]

        +

        filesend <idx> <filename> [ircnick]

        Description: like dccsend, except it operates for a current filesystem user, and the filename is assumed to be a relative path from that user’s current directory

        Returns: 0 on failure; 1 on success (either an immediate send or a queued send)

        @@ -1991,7 +1930,7 @@

        filesend <idx> <filename> [ircnick] -

        fileresend <idx> <filename> [ircnick]

        +

        fileresend <idx> <filename> [ircnick]

        Description: functions like filesend, only that it sends a DCC RESEND instead of a DCC SEND, which allows people to resume aborted file transfers if their client supports that protocol. ircII/BitchX/etc. support it; mIRC does not.

        Returns: 0 on failure; 1 on success (either an immediate send or a queued send)

        @@ -1999,7 +1938,7 @@

        fileresend <idx> <filename> [ircnick]

        -

        setdesc <dir> <file> <desc>

        +

        setdesc <dir> <file> <desc>

        Description: sets the description for a file in a file system directory; the directory is relative to dcc-path

        Returns: nothing

        @@ -2007,14 +1946,14 @@

        setdesc <dir> <file> <desc> -

        getdesc <dir> <file>

        +

        getdesc <dir> <file>

        Returns: the description for a file in the file system, if one exists

        Module: filesys

        -

        setowner <dir> <file> <handle>

        +

        setowner <dir> <file> <handle>

        Description: changes the owner for a file in the file system; the directory is relative to dcc-path

        Returns: nothing

        @@ -2022,14 +1961,14 @@

        setowner <dir> <file> <handle> -

        getowner <dir> <file>

        +

        getowner <dir> <file>

        Returns: the owner of a file in the file system

        Module: filesys

        -

        getfileq <handle>

        +

        getfileq <handle>

        Returns: list of files queued by someone; each item in the list will be a sublist with two elements: nickname the file is being sent to and the filename

        Module: transfer

        -

        getfilesendtime <idx>

        +

        getfilesendtime <idx>

        Returns: the unixtime value from when a file transfer started, or a negative number:

        ---- @@ -2072,15 +2007,11 @@

        getfilesendtime <idx>
        -

        mkdir <directory> [<required-flags> [channel]]

        +

        mkdir <directory> [<required-flags> [channel]]

        Description: creates a directory in the file system. Only users with the required flags may access it.

        Returns:

        -1

        no matching transfer with the specified idx was found

        ---- @@ -2100,7 +2031,7 @@

        mkdir <directory> [<required-flags> [channel]] -

        rmdir <directory>

        +

        rmdir <directory>

        Description: removes a directory from the file system.

        Returns: 0 on success; 1 on failure

        @@ -2108,15 +2039,11 @@

        rmdir <directory> -

        mv <file> <destination>

        +

        mv <file> <destination>

        Description: moves a file from its source to the given destination. The file can also be a mask, such as /incoming/*, provided the destination is a directory.

        Returns: If the command was successful, the number of files moved will be returned. Otherwise, a negative number will be returned:

        0

        success

        ---- @@ -2136,15 +2063,11 @@

        mv <file> <destination> -

        cp <file> <destination>

        +

        cp <file> <destination>

        Description: copies a file from its source to the given destination. The file can also be a mask, such as /incoming/*, provided the destination is a directory.

        Returns: If the command was successful, the number of files copied will be returned. Otherwise, a negative number will be returned:

        -1

        invalid source file

        ---- @@ -2164,14 +2087,14 @@

        cp <file> <destination> -

        getflags <dir>

        +

        getflags <dir>

        Returns: the flags required to access a directory

        Module: filesys

        -

        setflags <dir> [<flags> [channel]]

        +

        setflags <dir> [<flags> [channel]]

        Description: sets the flags required to access a directory

        Returns: 0 on success; -1 or -3 on failure

        @@ -2180,9 +2103,9 @@

        setflags <dir> [<flags> [channel]] -

        Miscellaneous Commands

        +

        Miscellaneous Commands

        -

        bind <type> <flags> <keyword/mask> [proc-name]

        +

        bind <type> <flags> <keyword/mask> [proc-name]

        Description: You can use the ‘bind’ command to attach Tcl procedures to certain events. flags are the flags the user must have to trigger the event (if applicable). proc-name is the name of the Tcl procedure to call for this command (see below for the format of the procedure call). If the proc-name is omitted, no binding is added. Instead, the current binding is returned (if it’s stackable, a list of the current bindings is returned).

        Returns: name of the command that was added, or (if proc-name was omitted), a list of the current bindings for this command

        @@ -2190,7 +2113,7 @@

        bind <type> <flags> <keyword/mask> [proc-name] -

        unbind <type> <flags> <keyword/mask> <proc-name>

        +

        unbind <type> <flags> <keyword/mask> <proc-name>

        Description: removes a previously created bind

        Returns: name of the command that was removed

        @@ -2198,9 +2121,10 @@

        unbind <type> <flags> <keyword/mask> <proc-name>

        -

        binds [type/mask]

        +

        binds [type/mask]

        -
        +

        Description: By default, lists Tcl binds registered with the Eggdrop. You can specify ‘all’ to view all binds, ‘tcl’ to view Tcl binds, and ‘python’ to view Python binds. Alternately, you can specify a bind type (pub, msg, etc) to view all binds that match that type of bind, or a mask that is matched against the command associated with the bind.

        +
        Returns: a list of Tcl binds, each item in the list is a sublist of five elements:

        {<type> <flags> <name> <hits> <proc>}

        @@ -2208,15 +2132,11 @@

        binds [type/mask] -

        logfile [<modes> <channel> <filename>]

        +

        logfile [<modes> <channel> <filename>]

        Description: creates a new logfile, which will log the modes given for the channel listed. If no logfile is specified, a list of existing logfiles will be returned. “*” indicates all channels. You can also change the modes and channel of an existing logfile with this command. Entering a blank mode and channel (“”) makes the bot stop logging there.

        Logfile flags:

        -1

        invalid source file

        ---- @@ -2279,15 +2199,11 @@

        logfile [<modes> <channel> <filename>] -

        maskhost <nick!user@host> [masktype]

        +

        maskhost <nick!user@host> [masktype]

        Returns: masked hostmask for the string given according to the masktype (the default is 3).

        Available types are:

        b

        information about bot linking and userfile sharing

        ---- @@ -2330,7 +2246,7 @@

        maskhost < -

        timer <minutes> <tcl-command> [count [timerName]]

        +

        timer <minutes> <tcl-command> [count [timerName]]

        Description: executes the given Tcl command after a certain number of minutes have passed, at the top of the minute (ie, if a timer is started at 10:03:34 with 1 minute specified, it will execute at 10:04:00. If a timer is started at 10:06:34 with 2 minutes specified, it will execute at 10:08:00). If count is specified, the command will be executed count times with the given interval in between. If you specify a count of 0, the timer will repeat until it’s removed with killtimer or until the bot is restarted. If timerName is specified, it will become the unique identifier for the timer. If no timerName is specified, Eggdrop will assign a timerName in the format of “timer<integer>”.

        Returns: a timerName

        @@ -2338,7 +2254,7 @@

        timer <minutes> <tcl-command> [count [timerName]] -

        utimer <seconds> <tcl-command> [count [timerName]]

        +

        utimer <seconds> <tcl-command> [count [timerName]]

        Description: executes the given Tcl command after a certain number of seconds have passed. If count is specified, the command will be executed count times with the given interval in between. If you specify a count of 0, the utimer will repeat until it’s removed with killutimer or until the bot is restarted. If timerName is specified, it will become the unique identifier for the timer. If timerName is not specified, Eggdrop will assign a timerName in the format of “timer<integer>”.

        Returns: a timerName

        @@ -2346,7 +2262,7 @@

        utimer <seconds> <tcl-command> [count [timerName]] -

        timers

        +

        timers

        Description: lists all active minutely timers.

        Returns: a list of active minutely timers, with each timer sub-list containing the number of minutes left until activation, the command that will be executed, the timerName, and the remaining number of repeats.

        @@ -2354,7 +2270,7 @@

        timers -

        utimers

        +

        utimers

        Description: lists all active secondly timers.

        Returns: a list of active secondly timers, with each timer sub-list containing the number of minutes left until activation, the command that will be executed, the timerName, and the remaining number of repeats.

        @@ -2362,7 +2278,7 @@

        utimers -

        killtimer <timerName>

        +

        killtimer <timerName>

        Description: removes the timerName minutely timer from the timer list.

        Returns: nothing

        @@ -2370,7 +2286,7 @@

        killtimer <timerName>

        -

        killutimer <timerName>

        +

        killutimer <timerName>

        Description: removes the timerName secondly timer from the timer list.

        Returns: nothing

        @@ -2378,49 +2294,49 @@

        killutimer <timerName> -

        unixtime

        +

        unixtime

        Returns: a long integer which represents the number of seconds that have passed since 00:00 Jan 1, 1970 (GMT).

        Module: core

        -

        duration <seconds>

        +

        duration <seconds>

        Returns: the number of seconds converted into years, weeks, days, hours, minutes, and seconds. 804600 seconds is turned into 1 week 2 days 7 hours 30 minutes.

        Module: core

        -

        strftime <formatstring> [time]

        +

        strftime <formatstring> [time]

        Returns: a formatted string of time using standard strftime format. If time is specified, the value of the specified time is used. Otherwise, the current time is used. Note: The implementation of strftime varies from platform to platform, so the user should only use POSIX-compliant format specifiers to ensure fully portable code.

        Module: core

        -

        ctime <unixtime>

        +

        ctime <unixtime>

        Returns: a formatted date/time string based on the current locale settings from the unixtime string given; for example “Fri Aug 3 11:34:55 1973”

        Module: core

        -

        myip

        +

        myip

        Returns: a long number representing the bot’s IP address, as it might appear in (for example) a DCC request

        Module: core

        -

        rand <limit>

        +

        rand <limit>

        Returns: a random integer between 0 and limit-1. Limit must be greater than 0 and equal to or less than RAND_MAX, which is generally 2147483647. The underlying pseudo-random number generator is not cryptographically secure.

        Module: core

        -

        control <idx> <command>

        +

        control <idx> <command>

        Description: removes an idx from the party line and sends all future input to the Tcl command given. The command will be called with two parameters: the idx and the input text. The command should return 0 to indicate success and 1 to indicate that it relinquishes control of the user back to the bot. If the input text is blank (“”), it indicates that the connection has been dropped. Also, if the input text is blank, never call killdcc on it, as it will fail with “invalid idx”.

        Returns: nothing

        @@ -2428,15 +2344,11 @@

        control <idx> <command> -

        sendnote <from> <to[@bot]> <message>

        +

        sendnote <from> <to[@bot]> <message>

        Description: simulates what happens when one user sends a note to another

        Returns:

        0

        *!user@host

        ---- @@ -2462,7 +2374,7 @@

        sendnote <from> <to[@bot]> <message> -

        link [via-bot] <bot>

        +

        link [via-bot] <bot>

        Description: attempts to link to another bot directly. If you specify a via-bot, it tells the via-bot to attempt the link.

        Returns: 1 if the link will be attempted; 0 otherwise

        @@ -2470,7 +2382,7 @@

        link [via-bot] <bot>

        -

        encrypt <key> <string>

        +

        encrypt <key> <string>

        Returns: encrypted string (using the currently loaded encryption module), encoded into ASCII using base-64. As of v1.8.4, the default blowfish encryption module can use either the older ECB mode (currently used by default for compatibility reasons), or the more recent and more-secure CBC mode. You can explicitly request which encryption mode to use by prefixing the encryption key with either “ecb:” or “cbc:”, or by using the blowfish-use-mode setting in the config file. Note: the default encryption mode for this function is planned to transition from ECB to CBC in v1.9.0.

        Module: encryption

        -

        decrypt <key> <encrypted-base64-string>

        +

        decrypt <key> <encrypted-base64-string>

        Returns: decrypted string (using the currently loaded encryption module). If the default blowfish encryption module is used, this automatically picks the right decryption mode. You may still prefix the key with “ecb:” or “cbc:” or use the blowfish-use-mode setting in the config file (see the encrypt command for more detailed information).

        Module: encryption

        -

        encpass <password>

        +

        encpass <password>

        Returns: encrypted string (using the currently loaded encryption module)

        Module: encryption

        -

        die [reason]

        +

        die [reason]

        Description: causes the bot to log a fatal error and exit completely. If no reason is given, “EXIT” is used.

        Returns: none

        @@ -2507,14 +2419,14 @@

        die [reason] -

        unames

        +

        unames

        Returns: the current operating system the bot is using

        Module: core

        -

        dnslookup <ip-address/hostname> <proc> [[arg1] [arg2] … [argN]]

        +

        dnslookup <ip-address/hostname> <proc> [[arg1] [arg2] … [argN]]

        Description: This issues an asynchronous dns lookup request. The command will block if dns module is not loaded; otherwise it will either return immediately or immediately call the specified proc (e.g. if the lookup is already cached).

        As soon as the request completes, the specified proc will be called as follows:

        @@ -2527,14 +2439,14 @@

        dnslookup <ip-address/hostname> <proc> [[arg1] [arg2] … [argN]

        -

        md5 <string>

        +

        md5 <string>

        Returns: the 128 bit MD5 message-digest of the specified string

        Module: core

        -

        callevent <event>

        +

        callevent <event>

        Description: triggers the evnt bind manually for a certain event. You can call arbitrary events here, even ones that are not pre-defined by Eggdrop. For example: callevent rehash, or callevent myownevent123.

        Returns: nothing

        @@ -2542,21 +2454,21 @@

        callevent <event> -

        traffic

        +

        traffic

        Returns: a list of sublists containing information about the bot’s traffic usage in bytes. Each sublist contains five elements: type, in-traffic today, in-traffic total, out-traffic today, out-traffic total (in that order).

        Module: core

        -

        modules

        +

        modules

        Returns: a list of sublists containing information about the bot’s currently loaded modules. Each sublist contains three elements: module, version, and dependencies. Each dependency is also a sublist containing the module name and version.

        Module: core

        -

        loadmodule <module>

        +

        loadmodule <module>

        Description: attempts to load the specified module.

        Returns: “Already loaded.” if the module is already loaded, “” if successful, or the reason the module couldn’t be loaded.

        @@ -2564,7 +2476,7 @@

        loadmodule <module>

        -

        unloadmodule <module>

        +

        unloadmodule <module>

        Description: attempts to unload the specified module.

        Returns: “No such module” if the module is not loaded, “” otherwise.

        @@ -2572,7 +2484,7 @@

        unloadmodule <module>

        -

        loadhelp <helpfile-name>

        +

        loadhelp <helpfile-name>

        Description: attempts to load the specified help file from the help/ directory.

        Returns: nothing

        @@ -2580,7 +2492,7 @@

        loadhelp <helpfile-name> -

        unloadhelp <helpfile-name>

        +

        unloadhelp <helpfile-name>

        Description: attempts to unload the specified help file.

        Returns: nothing

        @@ -2588,7 +2500,7 @@

        unloadhelp <helpfile-name> -

        reloadhelp

        +

        reloadhelp

        Description: reloads the bot’s help files.

        Returns: nothing

        @@ -2596,7 +2508,7 @@

        reloadhelp -

        restart

        +

        restart

        Description: rehashes the bot, kills all timers, reloads all modules, and reconnects the bot to the next server in its list.

        Returns: nothing

        @@ -2604,7 +2516,7 @@

        restart -

        rehash

        +

        rehash

        Description: rehashes the bot

        Returns: nothing

        @@ -2612,14 +2524,10 @@

        rehash -

        stripcodes <strip-flags> <string>

        +

        stripcodes <strip-flags> <string>

        Description: strips specified control characters from the string given. strip-flags can be any combination of the following:

        0

        the send failed

        ---- @@ -2655,7 +2563,7 @@

        stripcodes <strip-flags> <string> -

        matchaddr <hostmask> <address>

        +

        matchaddr <hostmask> <address>

        Description: checks if the address matches the hostmask given. The address should be in the form nick!user@host.

        Returns: 1 if the address matches the hostmask, 0 otherwise.

        @@ -2663,7 +2571,7 @@

        matchaddr <hostmask> <address> -

        matchcidr <block> <address> <prefix>

        +

        matchcidr <block> <address> <prefix>

        Description: performs a cidr match on the specified ip addresses. IPv6 is supported, if enabled at compile time.

        Example: matchcidr 192.168.0.0 192.168.1.17 16

        @@ -2672,7 +2580,7 @@

        matchcidr <block> <address> <prefix>

        -

        matchstr <pattern> <string>

        +

        matchstr <pattern> <string>

        Description: checks if pattern matches string. Only two wildcards are supported: ‘*’ and ‘?’. Matching is case-insensitive. This command is intended as a simplified alternative to Tcl’s string match.

        Returns: 1 if the pattern matches the string, 0 if it doesn’t.

        @@ -2680,7 +2588,7 @@

        matchstr <pattern> <string> -

        rfcequal <string1> <string2>

        +

        rfcequal <string1> <string2>

        Description: Checks if two strings are equal. Case is ignored, and this uses RFC1459 matching {}|~ == []^, depending on the rfc_compliant setting.

        Returns: 1 if equal, 0 if not.

        @@ -2688,14 +2596,10 @@

        rfcequal <string1> <string2> -

        status [type]

        +

        status [type]

        Description: provides eggdrop status information similar to the .status command in partyline. The available types of information are:

        c

        remove all color codes

        ---- @@ -2716,7 +2620,7 @@

        status [type] -

        istls <idx>

        +

        istls <idx>

        Description: checks if a connection is encrypted or cleartext. This command is available on TLS-enabled bots only.

        Returns: 1 if the idx is a TLS connection, 0 if it’s plaintext.

        @@ -2724,7 +2628,7 @@

        istls <idx> -

        starttls <idx>

        +

        starttls <idx>

        Description: establishes a secure (using TLS) connection over idx. The TLS connection should be first negotiated over the plaintext link, or using other means. Both parties must switch to TLS simultaneously. This command is available on TLS-enabled bots only.

        Returns: nothing

        @@ -2732,7 +2636,7 @@

        starttls <idx> -

        tlsstatus <idx>

        +

        tlsstatus <idx>

        Description: provides information about an established TLS connection This includes certificate and cipher information as well as protocol version. This command is available on TLS-enabled bots only.

        Returns: a flat list of name-value pairs

        @@ -2741,52 +2645,48 @@

        tlsstatus <idx> -

        Global Variables

        +

        Global Variables

        NOTE: All config file variables are also global.

        -

        botnick

        +

        botnick

        Value: the current nickname the bot is using (for example: “Valis”, “Valis0”, etc.)

        Module: server

        -

        botname

        +

        botname

        Value: the current nick!user@host that the server sees (for example: “Valis!valis@crappy.com”)

        Module: server

        -

        server

        +

        server

        Value: the current server’s real name (what server calls itself) and port bot is connected to (for example: “irc.math.ufl.edu:6667”) Note that this does not necessarily match the servers internet address.

        Module: server

        -

        serveraddress

        +

        serveraddress

        Value: the current server’s internet address (hostname or IP) and port bot is connected to. This will correspond to the entry in server list (for example: “eu.undernet.org:6667”). Note that this does not necessarily match the name server calls itself.

        Module: server

        -

        version

        +

        version

        Value: current bot version “1.1.2+pl1 1010201”; first item is the text version, to include a patch string if present, and second item is a numerical version

        Module: core

        -

        numversion*

        +

        numversion*

        Value: the current numeric bot version (for example: “1010201”). Numerical version is in the format of “MNNRRPP”, where:

        cpu

        total cpu time spent by eggdrop

        ---- @@ -2806,56 +2706,56 @@

        numversion* -

        uptime

        +

        uptime

        Value: the unixtime value for when the bot was started

        Module: core

        -

        server-online

        +

        server-online

        Value: the unixtime value when the bot connected to its current server, or ‘0’ if the bot is currently disconnected from a server.

        Module: server

        -

        lastbind

        +

        lastbind

        Value: the last command binding which was triggered. This allows you to identify which command triggered a Tcl proc.

        Module: core

        -

        isjuped

        +

        isjuped

        Value: 1 if bot’s nick is juped(437); 0 otherwise

        Module: server

        -

        handlen

        +

        handlen

        Value: the value of the HANDLEN define in src/eggdrop.h

        Module: core

        -

        config

        +

        config

        Value: the filename of the config file Eggdrop is currently using

        Module: core

        -

        configureargs

        +

        configureargs

        Value: a string (not list) of configure arguments in shell expansion (single quotes)

        Module: core

        -

        language

        +

        language

        Value: a string containing the language with the highest priority for use by Eggdrop. This commonly reflects what is added with addlang in the config file

        Module: core

        @@ -2863,28 +2763,24 @@

        language -

        Binds

        +

        Binds

        You can use the ‘bind’ command to attach Tcl procedures to certain events. For example, you can write a Tcl procedure that gets called every time a user says “danger” on the channel. When a bind is triggered, ALL of the Tcl procs that are bound to it will be called. Raw binds are triggered before builtin binds, as a builtin bind has the potential to modify args.

        -

        Stackable binds

        +

        Stackable binds

        Some bind types are marked as “stackable”. That means that you can bind multiple commands to the same trigger. Normally, for example, a bind such as ‘bind msg - stop msg:stop’ (which makes a msg-command “stop” call the Tcl proc “msg:stop”) will overwrite any previous binding you had for the msg command “stop”. With stackable bindings, like ‘msgm’ for example, you can bind the same command to multiple procs.

        -

        Removing a bind

        +

        Removing a bind

        To remove a bind, use the ‘unbind’ command. For example, to remove the bind for the “stop” msg command, use ‘unbind msg - stop msg:stop’.

        -

        Flag Masks

        -

        In the Bind Types section (and other commands, such as matchattr), you will see several references to the “flags” argument. The “flags” argument takes a flag mask, which is a value that represents the type of user that is allowed to trigger the procedure associated to that bind. The flags can be any of the standard Eggdrop flags (o, m, v, etc). Additionally, when used by itself, a “-” or “*” can be used to skip processing for a flag type. A flag mask has three sections to it- global, channel, and bot flag sections. Each section is separated by the | or & logical operators ( the | means “OR” and the & means “AND; if nothing proceeds the flag then Eggdrop assumes it to be an OR). Additionally, a ‘+’ and ‘-’ can be used in front of a flag to check if the user does (+) have it, or does not (-) have it.

        +

        Flag Masks

        +

        In the Bind Types section (and other commands, such as matchattr), you will see several references to the “flags” argument. The “flags” argument takes a flag mask, which is a value that represents the type of user that is allowed to trigger the procedure associated to that bind. The flags can be any of the standard Eggdrop flags (o, m, v, etc). Additionally, when used by itself, a “-” or “*” can be used to skip processing for a flag type. A flag mask has three sections to it- global, channel, and bot flag sections. Each section is separated by the | or & logical operators ( the | means “OR” and the & means “AND; if nothing proceeds the flag then Eggdrop assumes it to be an OR). Additionally, a ‘+’ and ‘-’ can be used in front of a flag to check if the user does (+) have it, or does not (-) have it.

        The easiest way to explain how to build a flag mask is by demonstration. A flag mask of “v” by itself means “has a global v flag”. To also check for a channel flag, you would use the flag mask “v|v”. This checks if the user has a global “v” flag, OR a channel “v” flag (again, the | means “OR” and ties the two types of flags together). You could change this mask to be “v&v”, which would check if the user has a global “v” flag AND a channel “v” flag. Lastly, to check if a user ONLY has a channel flag, you would use “*|v” as a mask, which would not check global flags but does check if the user had a channel “v” flag.

        You will commonly see flag masks for global flags written “ov”; this is the same as “|ov” or “*|ov”.

        Some additional examples:

        M

        major release number

        ---- @@ -2942,7 +2838,7 @@

        Flag Masks -

        Bind Types

        +

        Bind Types

        The following is a list of bind types and how they work. Below each bind type is the format of the bind command, the list of arguments sent to the Tcl proc, and an explanation.

        1. MSG

        2. @@ -3368,7 +3264,7 @@

          Bind Types
          sighup            - called on a kill -HUP <pid>
           sigterm           - called on a kill -TERM <pid>
          @@ -3387,6 +3283,7 @@ 

          Bind Types -

          Return Values

          +

          Return Values

          Several bindings pay attention to the value you return from the proc(using ‘return <value>’). Usually, they expect a 0 or 1, and returning an empty return is interpreted as a 0. Be aware if you omit the return statement, the result of the last Tcl command executed will be returned by the proc. This will not likely produce the results you intended (this is a “feature” of Tcl).

          Here’s a list of the bindings that use the return value from procs they trigger:

            @@ -3560,7 +3457,7 @@

            Return Values -

            Control Procedures

            +

            Control Procedures

            Using the ‘control’ command, you can put a DCC connection (or outgoing TCP connection) in control of a script. All text received from the connection is sent to the proc you specify. All outgoing text should @@ -3582,7 +3479,7 @@

            Control Procedures -

            TCP Connections

            +

            TCP Connections

            Eggdrop allows you to make two types of TCP (“telnet”) connections: outgoing and incoming. For an outgoing connection, you specify the remote host and port to connect to. For an incoming connection, you @@ -3643,14 +3540,10 @@

            TCP Connections -

            Match Characters

            +

            Match Characters

            Many of the bindings allow match characters in the arguments. Here are the four special characters:

        Flag Mask

        Action

        ---- @@ -3704,9 +3597,9 @@

        TCP Connections
        diff --git a/doc/html/using/text-sub.html b/doc/html/using/text-sub.html index 0f1a11190..6e2441d44 100644 --- a/doc/html/using/text-sub.html +++ b/doc/html/using/text-sub.html @@ -1,17 +1,16 @@ - - + - + Textfile Substitutions — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

        Table of Contents

      12. Eggdrop Features
      13. Eggdrop Core Settings
      14. The Party Line
      15. +
      16. Eggdrop Autoscripts
      17. Users and Flags
      18. Bans, Invites, and Exempts
      19. Botnet Sharing and Linking
      20. @@ -99,7 +99,7 @@

        Search

        Textfile Substitutions Last revised: March 08, 2002

        -

        Textfile Substitutions

        +

        Textfile Substitutions

        These %-variables can be inserted into help files, the banner, the MOTD, and other text files. There are four variables that can be used to format text:

        @@ -130,8 +130,8 @@

        Textfile Substitutions

        current Eggdrop version (i.e. “eggdrop v1.9.5”)

        - + @@ -220,9 +220,9 @@

        Textfile Substitutions
        diff --git a/doc/html/using/tls.html b/doc/html/using/tls.html index 55eb28a60..86cb03fec 100644 --- a/doc/html/using/tls.html +++ b/doc/html/using/tls.html @@ -1,17 +1,16 @@ - - + - + TLS support — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

        Table of Contents

      21. Eggdrop Features
      22. Eggdrop Core Settings
      23. The Party Line
      24. +
      25. Eggdrop Autoscripts
      26. Users and Flags
      27. Bans, Invites, and Exempts
      28. Botnet Sharing and Linking
      29. @@ -106,18 +106,18 @@

        Search

        TLS support Last revised: Jan 26, 2020

        -

        TLS support

        +

        TLS support

        This document provides information about TLS support which is a new eggdrop feature since version 1.8.0.

        -

        About

        +

        About

        Eggdrop can be optionally compiled with TLS support. This requires OpenSSL 0.9.8 or more recent installed on your system. TLS support includes encryption for IRC, DCC, botnet, telnet and scripted connections as well as certificate authentication for users and bots.

        -

        Installation

        +

        Installation

        ./configure and install as usual, the configure script will detect if your system meets the requirements and will enable TLS automatically. You can override the autodetection and manually disable TLS with @@ -130,7 +130,7 @@

        Installation -

        Usage

        +

        Usage

        As of v1.9.0, TLS support must be requested explicitly for botnet links. To create a TLS-enabled listening port or connect to a TLS-enabled listening port, you must prefix the port with a plus sign (+). If a port number could @@ -143,7 +143,7 @@

        Usage additional configuration (This was changed to provide users the flexibility to configure their own environments and assist in debugging).

        -

        IRC

        +

        IRC

        To connect to IRC using SSL, specify the port number and prefix it with a plus sign. Example: .jump irc.server.com +6697. The same goes for the server list in the config file.

        @@ -152,7 +152,7 @@

        IRC

        -

        Botnet

        +

        Botnet

        Eggdrop can use TLS connections to protect botnet links if it is compiled with TLS support. As of version 1.9.0, only raw TLS sockets are used to protect a connection. By prefixing a listen port in the Eggdrop configuration with a plus (+), that specifies that port as a TLS-enabled port, and will only accept TLS connections (no plain text connections will be allowed). With two TLS-enabled Eggdrops, it graphically looks like this:

        ?

        matches any single character

        %E

        long form of %V (i.e. “Eggdrop v1.9.5 (C) 1997 Robey -Pointer (C) 2010 Eggheads Development Team”)

        long form of %V (i.e. “Eggdrop v1.9.5 (C) 1997 +Robey Pointer (C) 2010 Eggheads Development Team”)

        %C

        channels the bot is on (i.e. “#lamest, #botnetcentral”)

        @@ -185,7 +185,7 @@

        BotnetEggdrop can also upgrade a plaintext connection with the starttls Tcl command. To use this, a plaintext connection is first made to a non-TLS port (ie, one that is not prefixed with a plus), then the starttls command is issued to upgrade that link to a TLS connection. In the Eggdrop 1.8 series, Eggdrop automatically attempted a starttls upgrade on all botnet connections. As such, if a 1.8 Eggdrop connects to a plain listening port on a 1.9.0 or later Eggdrop, it will automatically attempt to upgrade the link to TLS.

        -

        Secure DCC

        +

        Secure DCC

        Eggdrop supports the SDCC protocol, allowing you to establish DCC chat and file transfers over SSL. Example: /ctcp bot schat Note, that currently the only IRC client supporting SDCC is KVIrc. For @@ -193,7 +193,7 @@

        Secure DCC -

        Scripts

        +

        Scripts

        Scripts can open or connect to TLS ports the usual way specifying the port with a plus sign. Alternatively, the connection could be established as plaintext and later switched on with the starttls Tcl @@ -202,7 +202,7 @@

        Scripts -

        Keys, certificates and authentication

        +

        Keys, certificates and authentication

        You need a private key and a digital certificate whenever your bot will act as a server in a connection of any type. Common examples are hub bots and TLS listening ports. General information about certificates and @@ -233,7 +233,7 @@

        Keys, certificates and authentication -

        SSL/TLS Settings

        +

        SSL/TLS Settings

        There are some new settings allowing control over certificate verification and authorization.

        @@ -324,9 +324,9 @@

        SSL/TLS Settings
        diff --git a/doc/html/using/tricks.html b/doc/html/using/tricks.html index a429394fc..599269979 100644 --- a/doc/html/using/tricks.html +++ b/doc/html/using/tricks.html @@ -1,17 +1,16 @@ - - + - + Advanced Tips — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

        Table of Contents

      30. Eggdrop Features
      31. Eggdrop Core Settings
      32. The Party Line
      33. +
      34. Eggdrop Autoscripts
      35. Users and Flags
      36. Bans, Invites, and Exempts
      37. Botnet Sharing and Linking
      38. @@ -107,10 +107,10 @@

        Search

        Eggdrop Tricks Last revised: Jun 02, 2021

        -

        Advanced Tips

        +

        Advanced Tips

        Here are some little tricks that you may or may not know about, which aren’t documented in other areas.

        -

        Renaming commands

        +

        Renaming commands

        You can rename a built-in command by binding over it. To rename ‘.status’ to ‘.report’, you’d do:

        unbind dcc - status *dcc:status
         bind dcc m report *dcc:status
        @@ -119,23 +119,23 @@ 

        Renaming commands -

        Keeping Logs

        +

        Keeping Logs

        If you don’t want your logfiles to be deleted after two days and don’t want the bot to create a new logfile each new day, then set ‘keep-all-logs’ to 0 and ‘switch-logfiles-at’ to 2500 in your bot’s config file to make it keeping one logfile all the time. This is not recommended on high traffic channels.

        -

        Self-logging

        +

        Self-logging

        Because of how traditional IRC works, Eggdrop doesn’t capture outgoing messages to its logfile. However, if the server you are on supports the IRCv3 capability “echo-message”, you can request this capability to be enabled by the server in your config file. This will cause the server to send Eggdrop’d public messages back, thereby allowing those messages to be logged.

        -

        Modifying Default Strings

        +

        Modifying Default Strings

        You can modify Eggdrop’s output in the partyline, kick messages, and other texts by editing core.english.lang in the language directory.

        -

        Modularizing Your Config File

        +

        Modularizing Your Config File

        You can export parts of your config file to separate files. For example, if you have several config files which differ from themselves only by the nickname and the used servers, you can export them to an own file and link it with the ‘source’ Tcl command, similar to a script. The advantage of this is that you have to edit/upload only the small file instead of the big one. This technique is also useful if you want to maintain the same channel settings, etc across your botnet.

        -

        Variables in Your Config

        +

        Variables in Your Config

        You can use variables in your config file, since it’s really just a normal Tcl file. For example, you can set ‘userfile’ and ‘chanfile’ to “yourbot.user” and “yourbot.chan” using the following method:

        set myvar "yourbot"
         set userfile "$myvar.user"
        @@ -172,9 +172,9 @@ 

        Variables in Your Config

        diff --git a/doc/html/using/twitch-tcl-commands.html b/doc/html/using/twitch-tcl-commands.html index 4b6d3978a..94789d19f 100644 --- a/doc/html/using/twitch-tcl-commands.html +++ b/doc/html/using/twitch-tcl-commands.html @@ -1,17 +1,16 @@ - - + - + Eggdrop Twitch Tcl Commands — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

        Table of Contents

      39. Eggdrop Features
      40. Eggdrop Core Settings
      41. The Party Line
      42. +
      43. Eggdrop Autoscripts
      44. Users and Flags
      45. Bans, Invites, and Exempts
      46. Botnet Sharing and Linking
      47. @@ -103,7 +103,7 @@

        Search

        Eggdrop Twitch Tcl Commands Last revised: April 25, 2020

        -

        Eggdrop Twitch Tcl Commands

        +

        Eggdrop Twitch Tcl Commands

        This is an exhaustive list of all the Twitch-specific Tcl commands added to Eggdrop. These commands are held separate from the traditional tcl-commands.doc due to the unique nature of Twitch and the fact that these commands WILL NOT @@ -119,9 +119,9 @@

        Eggdrop Twitch Tcl Commands -

        Commands

        +

        Commands

        -

        twcmd <chan> <cmd> [arg]

        +

        twcmd <chan> <cmd> [arg]

        Description: sends cmd to the server, prefixed with a ‘/’. This is replicates the web UI functionality of sending commands such as /vip or /subscribers. Do @@ -131,42 +131,42 @@

        twcmd <chan> <cmd> [arg] -

        userstate <channel>

        +

        userstate <channel>

        Description: provides current userstate for the Eggdrop on the given channel.

        Returns: a dict containing key/value pairs for userstate values.

        -

        roomstate <channel>

        +

        roomstate <channel>

        Description: provides current roomstate of a channel Eggdrop is on.

        Returns: a dict containing key/value pairs for roomstate values.

        -

        twitchmods <channel>

        +

        twitchmods <channel>

        Description: maintains a list of usernames provided by Twitch as those that have moderator status on the provided channel. This list is refreshed upon join, or can manually be refreshed by using the Tcl twcmd to issue a /mods Twitch command. This list is a comprehensive list, the user does not need to be present on the channel to be included on this list.

        Returns: A list of usernames designated as having moderator status by Twitch.

        -

        twitchvips <channel>

        +

        twitchvips <channel>

        Description: maintains a list of usernames provided by Twitch as those that have VIP status on the provided channel. This list is refreshed upon join, or can manually be refreshed by using the Tcl twcmd to issue a /vips Twitch command. This list is a comprehensive list, the user does not need to be present on the channel to be included on this list.

        Returns: A list of usernames designated as having VIP status by Twitch.

        -

        ismod <nick> [channel]

        +

        ismod <nick> [channel]

        Description: checks if a user is on the moderator list maintained by Twitch (the same list accessible by the /mods command entered via the Twith web GUI). This differs from the other “normal” is* Eggdrop Tcl cmds, as this does NOT check if the user is currently on the channel (that status is unreliable on Twitch IRC).

        Returns: 1 if someone by the specified nickname is on the moderator list for the channel (or any channel if no channel name is specified); 0 otherwise.

        -

        isvip <nick> [channel]

        +

        isvip <nick> [channel]

        Description: checks if a user is on the VIP list maintained by Twitch (the same list accessible by the /vips command entered via the Twith web GUI). This differs from the other “normal” is* Eggdrop Tcl cmds, as this does NOT check if the user is currently on the channel (that status is unreliable on Twitch IRC).

        Returns: 1 if someone by the specified nickname is on the VIP list for the channel (or any channel if no channel name is specified); 0 otherwise.

        @@ -174,7 +174,7 @@

        isvip <nick> [channel]

        -

        Binds

        +

        Binds

        You can use the ‘bind’ command to attach Tcl procedures to certain events. The binds listed here are in addition to the binds listed in tcl-commands.doc.

        Because Twitch offers an IRC gateway that significantly reduces traditional IRC @@ -184,7 +184,7 @@

        Binds

        To remove a bind, use the ‘unbind’ command. For example, to remove the bind for the “stop” msg command, use ‘unbind msg - stop msg:stop’.

        -

        Flags

        +

        Flags

        Most of the following binds have “flags” listed as an argument for the bind. Flags represents a flagmask that the user, if found, must match in order for the bind to trigger. Example flag masks are:

        @@ -207,7 +207,7 @@

        Flags

        -

        Bind Types

        +

        Bind Types

        The following is a list of bind types and how they work. Below each bind type is the format of the bind command, the list of arguments sent to the Tcl proc, and an explanation.

        1. CCHT (CLEARCHAT)

        2. @@ -303,9 +303,9 @@

          Bind Types

        diff --git a/doc/html/using/twitchinfo.html b/doc/html/using/twitchinfo.html index 6a3200e8b..b1254710c 100644 --- a/doc/html/using/twitchinfo.html +++ b/doc/html/using/twitchinfo.html @@ -1,17 +1,16 @@ - - + - + Twitch — Eggdrop 1.9.5 documentation - - - - - + + + + + @@ -45,6 +44,7 @@

        Table of Contents

      48. Eggdrop Features
      49. Eggdrop Core Settings
      50. The Party Line
      51. +
      52. Eggdrop Autoscripts
      53. Users and Flags
      54. Bans, Invites, and Exempts
      55. Botnet Sharing and Linking
      56. @@ -104,7 +104,7 @@

        Search

        -

        Twitch

        +

        Twitch

        This module attempts to provide connectivity with the Twitch gaming platform. While Twitch provides an IRC gateway to connect with it’s streaming service, it does not claim to (and certainly does not) follow the IRC RFC in any meaningful way. The intent of this module is not to provide the full spectrum of management functions typically associated with Eggdrop; instead it focuses around the following key functions:

        -

        Disclaimer

        +

        Disclaimer

        We should also make clear that Eggdrop is in no way affiliated with Twitch in any way, and Twitch fully controls their own platform, to include the IRC gateway. This was just a fun project implemented at the request of some users to interact with the Twitch IRC development gateway as it existed at the time of development. At any time, Twitch could choose to alter or discontinue their IRC connectivity, thereby rendering this Eggdrop module useless. Eggdrop developers are also unable to offer technical support for Twitch-specific issues encountered while using this module.

        -

        Registering with Twitch

        +

        Registering with Twitch

        1. Register an account with Twitch. At the time of writing, this is done by visiting Twitch and clicking on the Sign Up button.

        2. Generate a token to authenticate your bot with Twitch. At the time of writing, this is done by visiting the Twitch OAuth generator while logged in to the account you just created. The token will be an alphanumeric string and should be treated like a password (…because it is). Make note of it, and keep it safe!

        -

        Editing the config file

        +

        Editing the config file

        1. Find the options to add a server in the server section of the config file. Remove the sample servers listed and add the following line in their place, replacing the alphanumeric string after ‘oauth:’ with the token you created when registering with Twitch in the previous section. Pretending your Twitch token from the previous step is ‘j9irk4vs28b0obz9easys4w2ystji3u’, it should look like this:

          server add irc.chat.twitch.tv 6667 oauth:j9irk4vs28b0obz9easys4w2ystji3u
          @@ -143,11 +143,11 @@ 

          Editing the config file

        -

        Twitch web UI functions

        +

        Twitch web UI functions

        Twitch is normally accessed via a web UI, and uses commands prefixed with a . or a / to interact with the channel. The Twitch module adds the partyline command twcmd to replicate those Twitch-specific commands. For example, to grant VIP status to a user via Tcl, you would use the command .twcmd vip username. or to restrict chat to subscribers, you would use .twcmd subscribers (Note: no . or / is needed as a prefix to the Twitch command). In other words, .twcmd in Tcl is the interface to the standard Twitch set of commands available through the web UI (Also available as a Tcl command).

        -

        Twitch IRC limitations

        +

        Twitch IRC limitations

        There are a few things you should know about how Twitch provides service through the IRC gateway that affects how well Eggdrop can function:

        diff --git a/doc/html/using/users.html b/doc/html/using/users.html index 6f478e43a..a7786e0e2 100644 --- a/doc/html/using/users.html +++ b/doc/html/using/users.html @@ -1,27 +1,26 @@ - - + - + Users and Flags — Eggdrop 1.9.5 documentation - - - - - + + + + + - +
        @@ -280,7 +280,7 @@

        Modules
        diff --git a/doc/html/install/readme.html b/doc/html/install/readme.html index c36eb5238..c1d48b064 100644 --- a/doc/html/install/readme.html +++ b/doc/html/install/readme.html @@ -305,7 +305,7 @@

        Obtaining Help diff --git a/doc/html/install/upgrading.html b/doc/html/install/upgrading.html index 0bd4a45c3..97559ee4f 100644 --- a/doc/html/install/upgrading.html +++ b/doc/html/install/upgrading.html @@ -186,7 +186,7 @@

        Documentation diff --git a/doc/html/modules/assoc.html b/doc/html/modules/assoc.html index e00b9a19d..4ebbdb2ef 100644 --- a/doc/html/modules/assoc.html +++ b/doc/html/modules/assoc.html @@ -102,7 +102,7 @@

        Search

        loadmodule assoc
         
        -

        Copyright (C) 2000 - 2023 Eggheads Development Team

        +

        Copyright (C) 2000 - 2024 Eggheads Development Team

        diff --git a/doc/html/modules/blowfish.html b/doc/html/modules/blowfish.html index cc7a9c8da..946d54113 100644 --- a/doc/html/modules/blowfish.html +++ b/doc/html/modules/blowfish.html @@ -128,7 +128,7 @@

        Search

        loadmodule blowfish
         
        -

        Copyright (C) 2000 - 2023 Eggheads Development Team

        +

        Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/channels.html b/doc/html/modules/channels.html index bc267dc1e..e5ea73dc0 100644 --- a/doc/html/modules/channels.html +++ b/doc/html/modules/channels.html @@ -504,7 +504,7 @@

    Search

    }

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/compress.html b/doc/html/modules/compress.html index f73333233..f720e6883 100644 --- a/doc/html/modules/compress.html +++ b/doc/html/modules/compress.html @@ -137,7 +137,7 @@

    Search

    as those used by GNU gzip.
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/console.html b/doc/html/modules/console.html index fea12a5fd..e4128e02e 100644 --- a/doc/html/modules/console.html +++ b/doc/html/modules/console.html @@ -139,7 +139,7 @@

    Search

    when they join a botnet channel.
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/ctcp.html b/doc/html/modules/ctcp.html index 1f1926884..d41fe637d 100644 --- a/doc/html/modules/ctcp.html +++ b/doc/html/modules/ctcp.html @@ -156,7 +156,7 @@

    Search

    There are also several variables to help make your bot less noticeable. They are: ctcp-version, ctcp-finger, and ctcp-userinfo. You can use set to set them to values you’d like.

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/dns.html b/doc/html/modules/dns.html index 6450379bc..a46cf62b9 100644 --- a/doc/html/modules/dns.html +++ b/doc/html/modules/dns.html @@ -152,7 +152,7 @@

    Search

    the query. The value must be in seconds. -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/filesys.html b/doc/html/modules/filesys.html index 9574e8bcc..715609cf0 100644 --- a/doc/html/modules/filesys.html +++ b/doc/html/modules/filesys.html @@ -332,7 +332,7 @@

    .filesys moduleSearch

    for potential ways to implement this setting. -

    Copyright (C) 2019 - 2023 Eggheads Development Team

    +

    Copyright (C) 2019 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/included.html b/doc/html/modules/included.html index 8287dd532..2c4be443c 100644 --- a/doc/html/modules/included.html +++ b/doc/html/modules/included.html @@ -311,7 +311,7 @@

    Modules included with Eggdrop diff --git a/doc/html/modules/index.html b/doc/html/modules/index.html index bf4a4712a..12b535244 100644 --- a/doc/html/modules/index.html +++ b/doc/html/modules/index.html @@ -135,7 +135,7 @@

    Can I compile Eggdrop without dynamic modules? (Static compile)

    Do I still need to ‘loadmodule’ modules?

    YES, when you compile statically, all the modules are linked into the main executable. HOWEVER, they are not enabled until you use loadmodule to enable them, hence you get nearly the same functionality with static modules as with dynamic modules.

    -

    Copyright (C) 1999 - 2023 Eggheads Development Team

    +

    Copyright (C) 1999 - 2024 Eggheads Development Team

    @@ -166,7 +166,7 @@

    Do I still need to ‘loadmodule’ modules? diff --git a/doc/html/modules/internals.html b/doc/html/modules/internals.html index 555ed6d4c..c94ad6489 100644 --- a/doc/html/modules/internals.html +++ b/doc/html/modules/internals.html @@ -379,7 +379,7 @@

    Summary
    diff --git a/doc/html/modules/irc.html b/doc/html/modules/irc.html index 868377b61..7960f9dd2 100644 --- a/doc/html/modules/irc.html +++ b/doc/html/modules/irc.html @@ -255,7 +255,7 @@

    Search

    set this to 0.
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/mod/assoc.html b/doc/html/modules/mod/assoc.html index 0a923b00b..0bfefacd8 100644 --- a/doc/html/modules/mod/assoc.html +++ b/doc/html/modules/mod/assoc.html @@ -128,7 +128,7 @@

    Search

    loadmodule assoc
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -157,7 +157,7 @@

    Search

    diff --git a/doc/html/modules/mod/blowfish.html b/doc/html/modules/mod/blowfish.html index 6df5205f5..40372bb17 100644 --- a/doc/html/modules/mod/blowfish.html +++ b/doc/html/modules/mod/blowfish.html @@ -132,7 +132,7 @@

    Search

    loadmodule blowfish
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -162,7 +162,7 @@

    Search

    diff --git a/doc/html/modules/mod/channels.html b/doc/html/modules/mod/channels.html index d82d8ab5f..fdf0cfdcb 100644 --- a/doc/html/modules/mod/channels.html +++ b/doc/html/modules/mod/channels.html @@ -503,7 +503,7 @@

    Default Channel Values}

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -534,7 +534,7 @@

    Default Channel Values diff --git a/doc/html/modules/mod/compress.html b/doc/html/modules/mod/compress.html index 88924232b..5f3e14696 100644 --- a/doc/html/modules/mod/compress.html +++ b/doc/html/modules/mod/compress.html @@ -141,7 +141,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -170,7 +170,7 @@

    Search

    diff --git a/doc/html/modules/mod/console.html b/doc/html/modules/mod/console.html index f9d6a99ce..6de9fce47 100644 --- a/doc/html/modules/mod/console.html +++ b/doc/html/modules/mod/console.html @@ -143,7 +143,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -172,7 +172,7 @@

    Search

    diff --git a/doc/html/modules/mod/ctcp.html b/doc/html/modules/mod/ctcp.html index 49be32ecb..915b4acbe 100644 --- a/doc/html/modules/mod/ctcp.html +++ b/doc/html/modules/mod/ctcp.html @@ -155,7 +155,7 @@

    Search

    There are also several variables to help make your bot less noticeable. They are: ctcp-version, ctcp-finger, and ctcp-userinfo. You can use set to set them to values you’d like.

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -184,7 +184,7 @@

    Search

    diff --git a/doc/html/modules/mod/dns.html b/doc/html/modules/mod/dns.html index 17d42f77b..cfffaf7a3 100644 --- a/doc/html/modules/mod/dns.html +++ b/doc/html/modules/mod/dns.html @@ -156,7 +156,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -185,7 +185,7 @@

    Search

    diff --git a/doc/html/modules/mod/filesys.html b/doc/html/modules/mod/filesys.html index 397a41817..aeabce403 100644 --- a/doc/html/modules/mod/filesys.html +++ b/doc/html/modules/mod/filesys.html @@ -351,7 +351,7 @@

    .filesys module diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index 80ee7add4..249d7ecb5 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -194,7 +194,7 @@

    Search

    -

    Copyright (C) 2019 - 2023 Eggheads Development Team

    +

    Copyright (C) 2019 - 2024 Eggheads Development Team

    @@ -223,7 +223,7 @@

    Search

    diff --git a/doc/html/modules/mod/irc.html b/doc/html/modules/mod/irc.html index 88cf758c3..3fa36c056 100644 --- a/doc/html/modules/mod/irc.html +++ b/doc/html/modules/mod/irc.html @@ -264,7 +264,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -293,7 +293,7 @@

    Search

    diff --git a/doc/html/modules/mod/notes.html b/doc/html/modules/mod/notes.html index efe43cd39..bbdea5dbe 100644 --- a/doc/html/modules/mod/notes.html +++ b/doc/html/modules/mod/notes.html @@ -151,7 +151,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -180,7 +180,7 @@

    Search

    diff --git a/doc/html/modules/mod/pbkdf2.html b/doc/html/modules/mod/pbkdf2.html index 4e7b21bb7..7f6f48ac4 100644 --- a/doc/html/modules/mod/pbkdf2.html +++ b/doc/html/modules/mod/pbkdf2.html @@ -149,7 +149,7 @@

    Search

    This module requires: none

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -179,7 +179,7 @@

    Search

    diff --git a/doc/html/modules/mod/python.html b/doc/html/modules/mod/python.html index 7ed056faa..66dbab2ea 100644 --- a/doc/html/modules/mod/python.html +++ b/doc/html/modules/mod/python.html @@ -231,7 +231,7 @@

    Code Section

    Writing a module for use with Eggdrop

    This is how you import a module for use with an egg python script.

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -261,7 +261,7 @@

    Writing a module for use with Eggdrop diff --git a/doc/html/modules/mod/seen.html b/doc/html/modules/mod/seen.html index b2ccae2aa..762b215de 100644 --- a/doc/html/modules/mod/seen.html +++ b/doc/html/modules/mod/seen.html @@ -130,7 +130,7 @@

    Search

    loadmodule seen
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -159,7 +159,7 @@

    Search

    diff --git a/doc/html/modules/mod/server.html b/doc/html/modules/mod/server.html index e42d70e5c..32d3ae644 100644 --- a/doc/html/modules/mod/server.html +++ b/doc/html/modules/mod/server.html @@ -338,7 +338,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -368,7 +368,7 @@

    Search

    diff --git a/doc/html/modules/mod/share.html b/doc/html/modules/mod/share.html index 518dad3df..33f66f6ad 100644 --- a/doc/html/modules/mod/share.html +++ b/doc/html/modules/mod/share.html @@ -160,7 +160,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -189,7 +189,7 @@

    Search

    diff --git a/doc/html/modules/mod/transfer.html b/doc/html/modules/mod/transfer.html index f20020dd4..eef7fe318 100644 --- a/doc/html/modules/mod/transfer.html +++ b/doc/html/modules/mod/transfer.html @@ -149,7 +149,7 @@

    Search

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -178,7 +178,7 @@

    Search

    diff --git a/doc/html/modules/mod/twitch.html b/doc/html/modules/mod/twitch.html index 216560543..ee2929846 100644 --- a/doc/html/modules/mod/twitch.html +++ b/doc/html/modules/mod/twitch.html @@ -162,7 +162,7 @@

    Partyline commands diff --git a/doc/html/modules/mod/uptime.html b/doc/html/modules/mod/uptime.html index b93153160..c84f8e9ef 100644 --- a/doc/html/modules/mod/uptime.html +++ b/doc/html/modules/mod/uptime.html @@ -136,7 +136,7 @@

    Search

    loadmodule uptime
     
    -

    Copyright (C) 2001 - 2023 Eggheads Development Team

    +

    Copyright (C) 2001 - 2024 Eggheads Development Team

    @@ -165,7 +165,7 @@

    Search

    diff --git a/doc/html/modules/mod/woobie.html b/doc/html/modules/mod/woobie.html index 45607c452..4c175976a 100644 --- a/doc/html/modules/mod/woobie.html +++ b/doc/html/modules/mod/woobie.html @@ -129,7 +129,7 @@

    Search

    loadmodule woobie
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -158,7 +158,7 @@

    Search

    diff --git a/doc/html/modules/notes.html b/doc/html/modules/notes.html index d09c2e6ae..b30055d74 100644 --- a/doc/html/modules/notes.html +++ b/doc/html/modules/notes.html @@ -147,7 +147,7 @@

    Search

    any notes.
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/pbkdf2.html b/doc/html/modules/pbkdf2.html index 7cbf42856..a5222aa20 100644 --- a/doc/html/modules/pbkdf2.html +++ b/doc/html/modules/pbkdf2.html @@ -145,7 +145,7 @@

    Search

    Number of rounds. The higher the number, the longer hashing takes; but also generally the higher the protection against brute force attacks.

    This module requires: none

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/seen.html b/doc/html/modules/seen.html index 3ba76754a..69103c9b8 100644 --- a/doc/html/modules/seen.html +++ b/doc/html/modules/seen.html @@ -126,7 +126,7 @@

    Search

    loadmodule seen
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/server.html b/doc/html/modules/server.html index 5a9c69c01..2448f92b6 100644 --- a/doc/html/modules/server.html +++ b/doc/html/modules/server.html @@ -344,7 +344,7 @@

    Search

    Eggdrop is 32. -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/share.html b/doc/html/modules/share.html index 593929171..f4d98cce5 100644 --- a/doc/html/modules/share.html +++ b/doc/html/modules/share.html @@ -156,7 +156,7 @@

    Search

    are v1.5.1 or higher. -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/transfer.html b/doc/html/modules/transfer.html index 325d7a271..6fbdcc0cd 100644 --- a/doc/html/modules/transfer.html +++ b/doc/html/modules/transfer.html @@ -151,7 +151,7 @@

    Search

    be v1.9.0 or higher). -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/twitch.html b/doc/html/modules/twitch.html index bc21cddcf..65764cd8f 100644 --- a/doc/html/modules/twitch.html +++ b/doc/html/modules/twitch.html @@ -163,7 +163,7 @@

    Partyline commandsSearch

    loadmodule uptime
     
    -

    Copyright (C) 2001 - 2023 Eggheads Development Team

    +

    Copyright (C) 2001 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/woobie.html b/doc/html/modules/woobie.html index 02f5b6c8b..efc87f071 100644 --- a/doc/html/modules/woobie.html +++ b/doc/html/modules/woobie.html @@ -125,7 +125,7 @@

    Search

    loadmodule woobie
     
    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index 61a994db3..66b823642 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -423,7 +423,7 @@

    What to do with a module? diff --git a/doc/html/search.html b/doc/html/search.html index 537f62159..423788fbf 100644 --- a/doc/html/search.html +++ b/doc/html/search.html @@ -147,7 +147,7 @@

    Search

    diff --git a/doc/html/tutorials/firstscript.html b/doc/html/tutorials/firstscript.html index cb437b682..988ef562e 100644 --- a/doc/html/tutorials/firstscript.html +++ b/doc/html/tutorials/firstscript.html @@ -225,7 +225,7 @@

    Writing an Eggdrop Script diff --git a/doc/html/tutorials/firststeps.html b/doc/html/tutorials/firststeps.html index 246aa0ef3..958dd374f 100644 --- a/doc/html/tutorials/firststeps.html +++ b/doc/html/tutorials/firststeps.html @@ -303,7 +303,7 @@

    Setting up SASL authentication diff --git a/doc/html/tutorials/module.html b/doc/html/tutorials/module.html index 2c534118f..097ce753d 100644 --- a/doc/html/tutorials/module.html +++ b/doc/html/tutorials/module.html @@ -356,7 +356,7 @@

    Exporting the Bind diff --git a/doc/html/tutorials/setup.html b/doc/html/tutorials/setup.html index 1b3f9e7ed..a2107bad6 100644 --- a/doc/html/tutorials/setup.html +++ b/doc/html/tutorials/setup.html @@ -290,7 +290,7 @@

    No show?
    diff --git a/doc/html/tutorials/tlssetup.html b/doc/html/tutorials/tlssetup.html index b2182268d..b36d8a40c 100644 --- a/doc/html/tutorials/tlssetup.html +++ b/doc/html/tutorials/tlssetup.html @@ -195,7 +195,7 @@

    Additional Information diff --git a/doc/html/using/accounts.html b/doc/html/using/accounts.html index 7b989047a..fdb89efa9 100644 --- a/doc/html/using/accounts.html +++ b/doc/html/using/accounts.html @@ -204,7 +204,7 @@

    Using Accounts with Tcl Scripts diff --git a/doc/html/using/autoscripts.html b/doc/html/using/autoscripts.html index 0d6b6ce61..fc9c81e2e 100644 --- a/doc/html/using/autoscripts.html +++ b/doc/html/using/autoscripts.html @@ -329,7 +329,7 @@

    egg_all
    diff --git a/doc/html/using/bans.html b/doc/html/using/bans.html index e2468189e..2257abc79 100644 --- a/doc/html/using/bans.html +++ b/doc/html/using/bans.html @@ -169,7 +169,7 @@

    Bans, Invites, and Exempts diff --git a/doc/html/using/botnet.html b/doc/html/using/botnet.html index 4e1c584a5..6bc802079 100644 --- a/doc/html/using/botnet.html +++ b/doc/html/using/botnet.html @@ -400,7 +400,7 @@

    Making bots share user records

    Using certificates to authenticate Eggdrops

    Eggdrops can use certificates to authenticate when linking to each other instead of a password. First, you must ensure you have set the appropriate certificates in the ssl-privatekey and ssl-certificate settings in the config file, and then enable the ssl-cert-auth setting. Next, add the certificate on the partyline by using .fprint + to add the fingerprint for the certificate currently in use, or .fprint <SHA1 fingerprint> to manually add a fingerprint. Once the config file settings are set 0and fingerprints are added on the partyline, Eggdrops will attempt to use their certificates instead of passwords for authentication.

    -

    Copyright (C) 1999 - 2023 Eggheads Development Team

    +

    Copyright (C) 1999 - 2024 Eggheads Development Team

    @@ -430,7 +430,7 @@

    Using certificates to authenticate Eggdrops diff --git a/doc/html/using/core.html b/doc/html/using/core.html index 63574f00f..21302afdc 100644 --- a/doc/html/using/core.html +++ b/doc/html/using/core.html @@ -732,7 +732,7 @@

    Scripts

    -

    Copyright (C) 2000 - 2023 Eggheads Development Team

    +

    Copyright (C) 2000 - 2024 Eggheads Development Team

    @@ -762,7 +762,7 @@

    Scripts
    diff --git a/doc/html/using/features.html b/doc/html/using/features.html index c5d468e49..00387c256 100644 --- a/doc/html/using/features.html +++ b/doc/html/using/features.html @@ -139,7 +139,7 @@

    Eggdrop Features diff --git a/doc/html/using/ipv6.html b/doc/html/using/ipv6.html index ca3aec141..396d93b9d 100644 --- a/doc/html/using/ipv6.html +++ b/doc/html/using/ipv6.html @@ -171,7 +171,7 @@

    Settings

    nat-ip works with IPv4 as it used to. It has no meaning for IPv6 and is not queried for IPv6 connections.

    -

    Copyright (C) 2010 - 2023 Eggheads Development Team

    +

    Copyright (C) 2010 - 2024 Eggheads Development Team

    @@ -201,7 +201,7 @@

    Settings
    diff --git a/doc/html/using/ircv3.html b/doc/html/using/ircv3.html index 431a7fd37..1257f7b04 100644 --- a/doc/html/using/ircv3.html +++ b/doc/html/using/ircv3.html @@ -137,7 +137,7 @@

    Supported CAP capabilities diff --git a/doc/html/using/partyline.html b/doc/html/using/partyline.html index 2d7e7ad0c..3f03d779b 100644 --- a/doc/html/using/partyline.html +++ b/doc/html/using/partyline.html @@ -126,7 +126,7 @@

    The Party Line diff --git a/doc/html/using/patch.html b/doc/html/using/patch.html index a98538093..f83ac29d4 100644 --- a/doc/html/using/patch.html +++ b/doc/html/using/patch.html @@ -130,7 +130,7 @@

    Submitting a patch via GitHub diff --git a/doc/html/using/pbkdf2.html b/doc/html/using/pbkdf2.html index 17c073be0..75cf54f60 100644 --- a/doc/html/using/pbkdf2.html +++ b/doc/html/using/pbkdf2.html @@ -188,7 +188,7 @@

    Tcl Interface diff --git a/doc/html/using/tcl-commands.html b/doc/html/using/tcl-commands.html index 9af070bc5..50cb59f37 100644 --- a/doc/html/using/tcl-commands.html +++ b/doc/html/using/tcl-commands.html @@ -3566,7 +3566,7 @@

    TCP Connections diff --git a/doc/html/using/text-sub.html b/doc/html/using/text-sub.html index 6e2441d44..7bac99298 100644 --- a/doc/html/using/text-sub.html +++ b/doc/html/using/text-sub.html @@ -190,7 +190,7 @@

    Textfile Substitutions
    -

    Copyright (C) 1999 - 2023 Eggheads Development Team

    +

    Copyright (C) 1999 - 2024 Eggheads Development Team

    @@ -220,7 +220,7 @@

    Textfile Substitutions diff --git a/doc/html/using/tls.html b/doc/html/using/tls.html index 86cb03fec..c326c0dd1 100644 --- a/doc/html/using/tls.html +++ b/doc/html/using/tls.html @@ -294,7 +294,7 @@

    SSL/TLS Settings diff --git a/doc/html/using/tricks.html b/doc/html/using/tricks.html index 599269979..409db4a2a 100644 --- a/doc/html/using/tricks.html +++ b/doc/html/using/tricks.html @@ -142,7 +142,7 @@

    Variables in Your Configset chanfile "$myvar.chan"

    -

    Copyright (C) 1999 - 2023 Eggheads Development Team

    +

    Copyright (C) 1999 - 2024 Eggheads Development Team

    @@ -172,7 +172,7 @@

    Variables in Your Config diff --git a/doc/html/using/twitch-tcl-commands.html b/doc/html/using/twitch-tcl-commands.html index 94789d19f..769757da4 100644 --- a/doc/html/using/twitch-tcl-commands.html +++ b/doc/html/using/twitch-tcl-commands.html @@ -303,7 +303,7 @@

    Bind Types diff --git a/doc/html/using/twitchinfo.html b/doc/html/using/twitchinfo.html index b1254710c..9a5eb698e 100644 --- a/doc/html/using/twitchinfo.html +++ b/doc/html/using/twitchinfo.html @@ -185,7 +185,7 @@

    Twitch IRC limitations diff --git a/doc/html/using/users.html b/doc/html/using/users.html index a7786e0e2..fa526e3df 100644 --- a/doc/html/using/users.html +++ b/doc/html/using/users.html @@ -227,7 +227,7 @@

    Users and Flags diff --git a/doc/man1/eggdrop.1 b/doc/man1/eggdrop.1 index a9fe4406f..155680cef 100644 --- a/doc/man1/eggdrop.1 +++ b/doc/man1/eggdrop.1 @@ -1,6 +1,6 @@ .\" To view: groff -man -Tascii eggdrop.1 .\" -.\" Copyright (C) 1999 - 2023 Eggheads Development Team +.\" Copyright (C) 1999 - 2024 Eggheads Development Team .\" .\" This file is free software; you can redistribute it and/or modify it .\" under the terms of the GNU General Public License as published by @@ -143,7 +143,7 @@ Bugs can be reported directly via GitHub at .SH COPYRIGHT Copyright (C) 1997 Robey Pointer .br -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team .PP This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/doc/modules/mod.assoc b/doc/modules/mod.assoc index c20635102..4527a9e31 100644 --- a/doc/modules/mod.assoc +++ b/doc/modules/mod.assoc @@ -11,4 +11,4 @@ module: loadmodule assoc -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.blowfish b/doc/modules/mod.blowfish index 1f3b454de..1139d4307 100644 --- a/doc/modules/mod.blowfish +++ b/doc/modules/mod.blowfish @@ -14,4 +14,4 @@ Blowfish Module loadmodule blowfish - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.channels b/doc/modules/mod.channels index c1e33ce98..7bab6eda8 100644 --- a/doc/modules/mod.channels +++ b/doc/modules/mod.channels @@ -477,4 +477,4 @@ DEFAULT CHANNEL VALUES } - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.compress b/doc/modules/mod.compress index 8b9eb24b3..80843b3c5 100644 --- a/doc/modules/mod.compress +++ b/doc/modules/mod.compress @@ -25,4 +25,4 @@ There are also some variables you can set in your config file: This is the default compression level used. These levels are the same as those used by GNU gzip. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.console b/doc/modules/mod.console index 9e764f82c..7c7b84c3a 100644 --- a/doc/modules/mod.console +++ b/doc/modules/mod.console @@ -29,4 +29,4 @@ There are also some variables you can set in your config file: Enable this setting if a user's global info line should be displayed when they join a botnet channel. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.ctcp b/doc/modules/mod.ctcp index 4fa0bee9a..3ecd15fe8 100644 --- a/doc/modules/mod.ctcp +++ b/doc/modules/mod.ctcp @@ -33,4 +33,4 @@ There are also several variables to help make your bot less noticeable. They are: ctcp-version, ctcp-finger, and ctcp-userinfo. You can use set to set them to values you'd like. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.dns b/doc/modules/mod.dns index 38a27f39c..ea7300a58 100644 --- a/doc/modules/mod.dns +++ b/doc/modules/mod.dns @@ -44,4 +44,4 @@ There are also some variables you can set in your config file: Specify how long should the DNS module wait for a reply before resending the query. The value must be in seconds. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.filesys b/doc/modules/mod.filesys index b8cd261e8..1ff14418b 100644 --- a/doc/modules/mod.filesys +++ b/doc/modules/mod.filesys @@ -197,4 +197,4 @@ rm [files] ... files -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.ident b/doc/modules/mod.ident index fac1d8fc4..fef76623b 100644 --- a/doc/modules/mod.ident +++ b/doc/modules/mod.ident @@ -83,4 +83,4 @@ There are also some variables you can set in your config file: beginning of this document for potential ways to implement this setting. -Copyright (C) 2019 - 2023 Eggheads Development Team +Copyright (C) 2019 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.irc b/doc/modules/mod.irc index ca39625b6..bb28fa17e 100644 --- a/doc/modules/mod.irc +++ b/doc/modules/mod.irc @@ -169,4 +169,4 @@ Use the following settings only if you set 'net-type' to IRCnet! If your network doesn't use rfc 1459 compliant string matching routines, set this to 0. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.notes b/doc/modules/mod.notes index bcf5b8baa..5433eca70 100644 --- a/doc/modules/mod.notes +++ b/doc/modules/mod.notes @@ -44,4 +44,4 @@ There are also some variables you can set in your config file: Set this to 1 if you want the bot to let people know on join if they have any notes. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.pbkdf2 b/doc/modules/mod.pbkdf2 index 319ec4c35..4a508edb9 100644 --- a/doc/modules/mod.pbkdf2 +++ b/doc/modules/mod.pbkdf2 @@ -38,4 +38,4 @@ There are also some variables you can set in your config file: This module requires: none - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.seen b/doc/modules/mod.seen index af637b8ec..0d010be8d 100644 --- a/doc/modules/mod.seen +++ b/doc/modules/mod.seen @@ -15,4 +15,4 @@ module: loadmodule seen -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.server b/doc/modules/mod.server index 2b5c2d123..36cf8f9db 100644 --- a/doc/modules/mod.server +++ b/doc/modules/mod.server @@ -265,4 +265,4 @@ There are additional settings for 'net-type' Efnet. supported by your network. The default setting is 9. The maximum supported length by Eggdrop is 32. - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.share b/doc/modules/mod.share index 30105db44..157868a7f 100644 --- a/doc/modules/mod.share +++ b/doc/modules/mod.share @@ -52,4 +52,4 @@ There are also some variables you can set in your config file: shared, only ports and address are added to sharing procedure. This only works with hubs that are v1.5.1 or higher. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.transfer b/doc/modules/mod.transfer index b2ad7edd9..e9c35fd94 100644 --- a/doc/modules/mod.transfer +++ b/doc/modules/mod.transfer @@ -37,4 +37,4 @@ There are also some variables you can set in your config file: to keep the bots linked if the userfile transfer fails and retry every minute (both bots must be v1.9.0 or higher). -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.twitch b/doc/modules/mod.twitch index 16bd125c5..cb3b20647 100644 --- a/doc/modules/mod.twitch +++ b/doc/modules/mod.twitch @@ -60,4 +60,4 @@ Lists current userstate on a channel * roomsstate - Lists current roomstate for a channel * twcmd - Issues a traditional Twitch web interface command to the Twitch server (/ban, /block, /host, etc) - Copyright (C) 2020 - 2023 Eggheads Development Team + Copyright (C) 2020 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.uptime b/doc/modules/mod.uptime index 483175e7a..c6acd360c 100644 --- a/doc/modules/mod.uptime +++ b/doc/modules/mod.uptime @@ -20,4 +20,4 @@ module: loadmodule uptime -Copyright (C) 2001 - 2023 Eggheads Development Team +Copyright (C) 2001 - 2024 Eggheads Development Team diff --git a/doc/modules/mod.woobie b/doc/modules/mod.woobie index eef5d5157..28dd56f74 100644 --- a/doc/modules/mod.woobie +++ b/doc/modules/mod.woobie @@ -12,4 +12,4 @@ module: loadmodule woobie -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/CONTENTS b/doc/settings/CONTENTS index 75c7df16f..5301bf99c 100644 --- a/doc/settings/CONTENTS +++ b/doc/settings/CONTENTS @@ -57,4 +57,4 @@ Last revised: April 16, 2003 Documentation for the woobie module is provided in this file. ________________________________________________________________________ - Copyright (C) 2003 - 2023 Eggheads Development Team + Copyright (C) 2003 - 2024 Eggheads Development Team diff --git a/doc/settings/core.settings b/doc/settings/core.settings index 9e6d285d5..7424efa50 100644 --- a/doc/settings/core.settings +++ b/doc/settings/core.settings @@ -712,4 +712,4 @@ point. source scripts/alltools.tcl source scripts/action.fix.tcl -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.assoc b/doc/settings/mod.assoc index c20635102..4527a9e31 100644 --- a/doc/settings/mod.assoc +++ b/doc/settings/mod.assoc @@ -11,4 +11,4 @@ module: loadmodule assoc -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.blowfish b/doc/settings/mod.blowfish index 1f3b454de..1139d4307 100644 --- a/doc/settings/mod.blowfish +++ b/doc/settings/mod.blowfish @@ -14,4 +14,4 @@ Blowfish Module loadmodule blowfish - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.channels b/doc/settings/mod.channels index 00d7a5ad4..b235d4f46 100644 --- a/doc/settings/mod.channels +++ b/doc/settings/mod.channels @@ -485,4 +485,4 @@ There are also some variables you can set in your config file: } - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.compress b/doc/settings/mod.compress index 8b9eb24b3..80843b3c5 100644 --- a/doc/settings/mod.compress +++ b/doc/settings/mod.compress @@ -25,4 +25,4 @@ There are also some variables you can set in your config file: This is the default compression level used. These levels are the same as those used by GNU gzip. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.console b/doc/settings/mod.console index 9e764f82c..7c7b84c3a 100644 --- a/doc/settings/mod.console +++ b/doc/settings/mod.console @@ -29,4 +29,4 @@ There are also some variables you can set in your config file: Enable this setting if a user's global info line should be displayed when they join a botnet channel. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.ctcp b/doc/settings/mod.ctcp index 4fa0bee9a..3ecd15fe8 100644 --- a/doc/settings/mod.ctcp +++ b/doc/settings/mod.ctcp @@ -33,4 +33,4 @@ There are also several variables to help make your bot less noticeable. They are: ctcp-version, ctcp-finger, and ctcp-userinfo. You can use set to set them to values you'd like. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.dns b/doc/settings/mod.dns index 38a27f39c..ea7300a58 100644 --- a/doc/settings/mod.dns +++ b/doc/settings/mod.dns @@ -44,4 +44,4 @@ There are also some variables you can set in your config file: Specify how long should the DNS module wait for a reply before resending the query. The value must be in seconds. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.filesys b/doc/settings/mod.filesys index b8cd261e8..1ff14418b 100644 --- a/doc/settings/mod.filesys +++ b/doc/settings/mod.filesys @@ -197,4 +197,4 @@ rm [files] ... files -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.ident b/doc/settings/mod.ident index fac1d8fc4..fef76623b 100644 --- a/doc/settings/mod.ident +++ b/doc/settings/mod.ident @@ -83,4 +83,4 @@ There are also some variables you can set in your config file: beginning of this document for potential ways to implement this setting. -Copyright (C) 2019 - 2023 Eggheads Development Team +Copyright (C) 2019 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.irc b/doc/settings/mod.irc index ca39625b6..bb28fa17e 100644 --- a/doc/settings/mod.irc +++ b/doc/settings/mod.irc @@ -169,4 +169,4 @@ Use the following settings only if you set 'net-type' to IRCnet! If your network doesn't use rfc 1459 compliant string matching routines, set this to 0. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.notes b/doc/settings/mod.notes index bcf5b8baa..5433eca70 100644 --- a/doc/settings/mod.notes +++ b/doc/settings/mod.notes @@ -44,4 +44,4 @@ There are also some variables you can set in your config file: Set this to 1 if you want the bot to let people know on join if they have any notes. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.seen b/doc/settings/mod.seen index af637b8ec..0d010be8d 100644 --- a/doc/settings/mod.seen +++ b/doc/settings/mod.seen @@ -15,4 +15,4 @@ module: loadmodule seen -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.server b/doc/settings/mod.server index 9e4a07b2d..f87c8613f 100644 --- a/doc/settings/mod.server +++ b/doc/settings/mod.server @@ -265,4 +265,4 @@ There are additional settings for 'net-type' Efnet. supported by your network. The default setting is 9. The maximum supported length by Eggdrop is 32. - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.share b/doc/settings/mod.share index 30105db44..157868a7f 100644 --- a/doc/settings/mod.share +++ b/doc/settings/mod.share @@ -52,4 +52,4 @@ There are also some variables you can set in your config file: shared, only ports and address are added to sharing procedure. This only works with hubs that are v1.5.1 or higher. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.transfer b/doc/settings/mod.transfer index 14a5cf0b7..39963f6b7 100644 --- a/doc/settings/mod.transfer +++ b/doc/settings/mod.transfer @@ -45,4 +45,4 @@ There are also some variables you can set in your config file: to keep the bots linked if the userfile transfer fails and retry every minute (both bots must be v1.9.0 or higher). -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.uptime b/doc/settings/mod.uptime index 483175e7a..c6acd360c 100644 --- a/doc/settings/mod.uptime +++ b/doc/settings/mod.uptime @@ -20,4 +20,4 @@ module: loadmodule uptime -Copyright (C) 2001 - 2023 Eggheads Development Team +Copyright (C) 2001 - 2024 Eggheads Development Team diff --git a/doc/settings/mod.woobie b/doc/settings/mod.woobie index eef5d5157..28dd56f74 100644 --- a/doc/settings/mod.woobie +++ b/doc/settings/mod.woobie @@ -12,4 +12,4 @@ module: loadmodule woobie -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/about/about.rst b/doc/sphinx_source/about/about.rst index 601a6116b..3e516fa27 100644 --- a/doc/sphinx_source/about/about.rst +++ b/doc/sphinx_source/about/about.rst @@ -55,4 +55,4 @@ About Eggdrop * Tcl -- Eggdrop cannot compile without Tcl installed on your shell. - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/conf.py b/doc/sphinx_source/conf.py index f5bbaa7f5..b59b22f93 100644 --- a/doc/sphinx_source/conf.py +++ b/doc/sphinx_source/conf.py @@ -44,7 +44,7 @@ # General information about the project. project = u'Eggdrop' -copyright = u'2023, Eggheads' +copyright = u'2024, Eggheads' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the diff --git a/doc/sphinx_source/install/install.rst b/doc/sphinx_source/install/install.rst index 94cdc0749..21ee258bf 100644 --- a/doc/sphinx_source/install/install.rst +++ b/doc/sphinx_source/install/install.rst @@ -143,4 +143,4 @@ the README file. If not, then READ IT!&@#%@! Have fun with Eggdrop! Copyright (C) 1997 Robey Pointer - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/install/readme.rst b/doc/sphinx_source/install/readme.rst index 80453b226..29cc7e8f3 100644 --- a/doc/sphinx_source/install/readme.rst +++ b/doc/sphinx_source/install/readme.rst @@ -191,4 +191,4 @@ Obtaining Help * Don't ask to ask- just state your question, along with any relevant details and error messages Copyright (C) 1997 Robey Pointer -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/index.rst b/doc/sphinx_source/modules/index.rst index a5a4a6523..fc0318e96 100644 --- a/doc/sphinx_source/modules/index.rst +++ b/doc/sphinx_source/modules/index.rst @@ -44,4 +44,4 @@ Do I still need to 'loadmodule' modules? YES, when you compile statically, all the modules are linked into the main executable. HOWEVER, they are not enabled until you use loadmodule to enable them, hence you get nearly the same functionality with static modules as with dynamic modules. -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/assoc.rst b/doc/sphinx_source/modules/mod/assoc.rst index 60ccc09e5..0833a9150 100644 --- a/doc/sphinx_source/modules/mod/assoc.rst +++ b/doc/sphinx_source/modules/mod/assoc.rst @@ -15,4 +15,4 @@ module:: loadmodule assoc -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/blowfish.rst b/doc/sphinx_source/modules/mod/blowfish.rst index be67a622b..0d894ec77 100644 --- a/doc/sphinx_source/modules/mod/blowfish.rst +++ b/doc/sphinx_source/modules/mod/blowfish.rst @@ -18,4 +18,4 @@ Blowfish Module loadmodule blowfish - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/channels.rst b/doc/sphinx_source/modules/mod/channels.rst index b55e4d2e3..f47085664 100644 --- a/doc/sphinx_source/modules/mod/channels.rst +++ b/doc/sphinx_source/modules/mod/channels.rst @@ -410,4 +410,4 @@ Default Channel Values } - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/compress.rst b/doc/sphinx_source/modules/mod/compress.rst index 21e1de6c0..8d531dce9 100644 --- a/doc/sphinx_source/modules/mod/compress.rst +++ b/doc/sphinx_source/modules/mod/compress.rst @@ -28,4 +28,4 @@ There are also some variables you can set in your config file: as those used by GNU gzip. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/console.rst b/doc/sphinx_source/modules/mod/console.rst index cc51727ba..9bdd8edaa 100644 --- a/doc/sphinx_source/modules/mod/console.rst +++ b/doc/sphinx_source/modules/mod/console.rst @@ -33,4 +33,4 @@ There are also some variables you can set in your config file: when they join a botnet channel. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/ctcp.rst b/doc/sphinx_source/modules/mod/ctcp.rst index 98d5c5c9d..650050d87 100644 --- a/doc/sphinx_source/modules/mod/ctcp.rst +++ b/doc/sphinx_source/modules/mod/ctcp.rst @@ -37,4 +37,4 @@ They are: ctcp-version, ctcp-finger, and ctcp-userinfo. You can use set to set them to values you'd like. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/dns.rst b/doc/sphinx_source/modules/mod/dns.rst index 93300a011..daa98cb8f 100644 --- a/doc/sphinx_source/modules/mod/dns.rst +++ b/doc/sphinx_source/modules/mod/dns.rst @@ -46,4 +46,4 @@ There are also some variables you can set in your config file: the query. The value must be in seconds. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/filesys.rst b/doc/sphinx_source/modules/mod/filesys.rst index e5afdb400..67ef08c7e 100644 --- a/doc/sphinx_source/modules/mod/filesys.rst +++ b/doc/sphinx_source/modules/mod/filesys.rst @@ -252,4 +252,4 @@ rm [files] ... -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/ident.rst b/doc/sphinx_source/modules/mod/ident.rst index 11247fdf0..f542da253 100644 --- a/doc/sphinx_source/modules/mod/ident.rst +++ b/doc/sphinx_source/modules/mod/ident.rst @@ -73,4 +73,4 @@ There are also some variables you can set in your config file: for potential ways to implement this setting. -Copyright (C) 2019 - 2023 Eggheads Development Team +Copyright (C) 2019 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/irc.rst b/doc/sphinx_source/modules/mod/irc.rst index f8a046d0a..5b1b8d2f3 100644 --- a/doc/sphinx_source/modules/mod/irc.rst +++ b/doc/sphinx_source/modules/mod/irc.rst @@ -151,4 +151,4 @@ Use the following settings only if you set 'net-type' to IRCnet! If your network doesn't use rfc 1459 compliant string matching routines, set this to 0. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/notes.rst b/doc/sphinx_source/modules/mod/notes.rst index 657253255..8190c9143 100644 --- a/doc/sphinx_source/modules/mod/notes.rst +++ b/doc/sphinx_source/modules/mod/notes.rst @@ -42,4 +42,4 @@ There are also some variables you can set in your config file: any notes. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/pbkdf2.rst b/doc/sphinx_source/modules/mod/pbkdf2.rst index 2b3a6c1b7..883db733b 100644 --- a/doc/sphinx_source/modules/mod/pbkdf2.rst +++ b/doc/sphinx_source/modules/mod/pbkdf2.rst @@ -35,4 +35,4 @@ There are also some variables you can set in your config file: This module requires: none - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/python.rst b/doc/sphinx_source/modules/mod/python.rst index cc82fa9d9..97500493c 100644 --- a/doc/sphinx_source/modules/mod/python.rst +++ b/doc/sphinx_source/modules/mod/python.rst @@ -151,4 +151,4 @@ Writing a module for use with Eggdrop This is how you import a module for use with an egg python script. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/seen.rst b/doc/sphinx_source/modules/mod/seen.rst index 05f17700c..0ddf12153 100644 --- a/doc/sphinx_source/modules/mod/seen.rst +++ b/doc/sphinx_source/modules/mod/seen.rst @@ -18,4 +18,4 @@ Put this line into your Eggdrop configuration file to load the seen module:: loadmodule seen -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/server.rst b/doc/sphinx_source/modules/mod/server.rst index 26eed0dac..6f4cbd926 100644 --- a/doc/sphinx_source/modules/mod/server.rst +++ b/doc/sphinx_source/modules/mod/server.rst @@ -237,5 +237,5 @@ There are additional settings for 'net-type' Efnet. your network. The default setting is 9. The maximum supported length by Eggdrop is 32. - Copyright (C) 2000 - 2023 Eggheads Development Team + Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/share.rst b/doc/sphinx_source/modules/mod/share.rst index f40b92874..3a1c3649b 100644 --- a/doc/sphinx_source/modules/mod/share.rst +++ b/doc/sphinx_source/modules/mod/share.rst @@ -50,4 +50,4 @@ There are also some variables you can set in your config file: address are added to sharing procedure. This only works with hubs that are v1.5.1 or higher. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/transfer.rst b/doc/sphinx_source/modules/mod/transfer.rst index 1d804c229..8055298da 100644 --- a/doc/sphinx_source/modules/mod/transfer.rst +++ b/doc/sphinx_source/modules/mod/transfer.rst @@ -37,4 +37,4 @@ There are also some variables you can set in your config file: linked if the userfile transfer fails and retry every minute (both bots must be v1.9.0 or higher). -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/twitch.rst b/doc/sphinx_source/modules/mod/twitch.rst index a1c25aaed..533bd7246 100644 --- a/doc/sphinx_source/modules/mod/twitch.rst +++ b/doc/sphinx_source/modules/mod/twitch.rst @@ -55,5 +55,5 @@ This module adds the following commands to the partyline: * roomsstate - Lists current roomstate for a channel * twcmd - Issues a traditional Twitch web interface command to the Twitch server (/ban, /block, /host, etc) - Copyright (C) 2020 - 2023 Eggheads Development Team + Copyright (C) 2020 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/uptime.rst b/doc/sphinx_source/modules/mod/uptime.rst index 7ad024f78..d88b9244d 100644 --- a/doc/sphinx_source/modules/mod/uptime.rst +++ b/doc/sphinx_source/modules/mod/uptime.rst @@ -24,4 +24,4 @@ module:: loadmodule uptime -Copyright (C) 2001 - 2023 Eggheads Development Team +Copyright (C) 2001 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/modules/mod/woobie.rst b/doc/sphinx_source/modules/mod/woobie.rst index 38b38b0dd..2516fc0b7 100644 --- a/doc/sphinx_source/modules/mod/woobie.rst +++ b/doc/sphinx_source/modules/mod/woobie.rst @@ -15,4 +15,4 @@ module:: loadmodule woobie -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/tutorials/firstscript.rst b/doc/sphinx_source/tutorials/firstscript.rst index ff35aa6e8..67a9dafaa 100644 --- a/doc/sphinx_source/tutorials/firstscript.rst +++ b/doc/sphinx_source/tutorials/firstscript.rst @@ -143,4 +143,4 @@ If you want to try these out, join #eggdrop on Libera and check your answers (an
    -Copyright (C) 2003 - 2023 Eggheads Development Team +Copyright (C) 2003 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/bans.rst b/doc/sphinx_source/using/bans.rst index 83431e390..6fcb4e5d2 100644 --- a/doc/sphinx_source/using/bans.rst +++ b/doc/sphinx_source/using/bans.rst @@ -73,4 +73,4 @@ Bans, Invites, and Exempts (defined in config file) or until the channel goes -i again, whichever happens last. - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/botnet.rst b/doc/sphinx_source/using/botnet.rst index e58450369..53a11046e 100644 --- a/doc/sphinx_source/using/botnet.rst +++ b/doc/sphinx_source/using/botnet.rst @@ -322,4 +322,4 @@ Using certificates to authenticate Eggdrops ------------------------------------------- Eggdrops can use certificates to authenticate when linking to each other instead of a password. First, you must ensure you have set the appropriate certificates in the `ssl-privatekey` and `ssl-certificate` settings in the config file, and then enable the `ssl-cert-auth` setting. Next, add the certificate on the partyline by using `.fprint +` to add the fingerprint for the certificate currently in use, or `.fprint ` to manually add a fingerprint. Once the config file settings are set 0and fingerprints are added on the partyline, Eggdrops will attempt to use their certificates instead of passwords for authentication. -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/core.rst b/doc/sphinx_source/using/core.rst index 117cd935d..bf560b351 100644 --- a/doc/sphinx_source/using/core.rst +++ b/doc/sphinx_source/using/core.rst @@ -638,4 +638,4 @@ modules should be loaded and their variables should be set at this point. source scripts/alltools.tcl source scripts/action.fix.tcl -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/features.rst b/doc/sphinx_source/using/features.rst index ebc511ad9..b28195c2b 100644 --- a/doc/sphinx_source/using/features.rst +++ b/doc/sphinx_source/using/features.rst @@ -52,4 +52,4 @@ Eggdrop Features Copyright (C) 1997 Robey Pointer -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/ipv6.rst b/doc/sphinx_source/using/ipv6.rst index 93d322f11..83891df2c 100644 --- a/doc/sphinx_source/using/ipv6.rst +++ b/doc/sphinx_source/using/ipv6.rst @@ -81,4 +81,4 @@ Other affected variables: nat-ip works with IPv4 as it used to. It has no meaning for IPv6 and is not queried for IPv6 connections. -Copyright (C) 2010 - 2023 Eggheads Development Team +Copyright (C) 2010 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/ircv3.rst b/doc/sphinx_source/using/ircv3.rst index 5f7b0e60b..c2fff5299 100644 --- a/doc/sphinx_source/using/ircv3.rst +++ b/doc/sphinx_source/using/ircv3.rst @@ -43,4 +43,4 @@ The following capabilities are supported by Eggdrop: * setname * +typing -Copyright (C) 2010 - 2023 Eggheads Development Team +Copyright (C) 2010 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/partyline.rst b/doc/sphinx_source/using/partyline.rst index 2bc477ac8..d0c7f80a6 100644 --- a/doc/sphinx_source/using/partyline.rst +++ b/doc/sphinx_source/using/partyline.rst @@ -36,4 +36,4 @@ prefixed with an apostrophe is sent to all users on the local bot only. You can change channels with the ".chat" command or even leave all channels with ".chat off". -Copyright (C) 2002 - 2023 Eggheads Development Team +Copyright (C) 2002 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/patch.rst b/doc/sphinx_source/using/patch.rst index 3a0f4c7ee..1dd4167e8 100644 --- a/doc/sphinx_source/using/patch.rst +++ b/doc/sphinx_source/using/patch.rst @@ -33,4 +33,4 @@ To create a patch via github: 7. Pour yourself a cold one and bask in the warm feeling of contributing to the open source community! Karma++! -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/pbkdf2info.rst b/doc/sphinx_source/using/pbkdf2info.rst index 3053e43dc..2888be9f0 100644 --- a/doc/sphinx_source/using/pbkdf2info.rst +++ b/doc/sphinx_source/using/pbkdf2info.rst @@ -90,4 +90,4 @@ The PBKDF2 module adds the 'encpass2' command to the Tcl library. This command t where 'PBK method' is the method specified in the configuration file, 'rounds' is the number of rounds specified in the configuration file, 'salt' is the value used for the salt, and 'password hash' is the output of the hashing algorithm. -Copyright (C) 2000 - 2023 Eggheads Development Team +Copyright (C) 2000 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 1f305c6a6..f18290c2b 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -3761,4 +3761,4 @@ are the four special characters: | | so a bind would have to use "\\*" or {\*} for a mask argument | +-----+--------------------------------------------------------------------------+ - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/text-sub.rst b/doc/sphinx_source/using/text-sub.rst index dc81af3ee..98ab9042a 100644 --- a/doc/sphinx_source/using/text-sub.rst +++ b/doc/sphinx_source/using/text-sub.rst @@ -76,4 +76,4 @@ Other variables: | %{center} | center the following text (70 columns) | +-------------+---------------------------------------------------------+ - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/tls.rst b/doc/sphinx_source/using/tls.rst index aff81637e..6d73e79bf 100644 --- a/doc/sphinx_source/using/tls.rst +++ b/doc/sphinx_source/using/tls.rst @@ -201,4 +201,4 @@ verification and authorization. Higher values enable specific exceptions like allowing self-signed or expired certificates. Details are documented in eggdrop.conf. -Copyright (C) 2010 - 2023 Eggheads Development Team +Copyright (C) 2010 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/tricks.rst b/doc/sphinx_source/using/tricks.rst index cafbaafbf..8d6ea6722 100644 --- a/doc/sphinx_source/using/tricks.rst +++ b/doc/sphinx_source/using/tricks.rst @@ -52,4 +52,4 @@ You can use variables in your config file, since it's really just a normal Tcl f set chanfile "$myvar.chan" -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/doc/sphinx_source/using/users.rst b/doc/sphinx_source/using/users.rst index ef462644e..e6adafa7b 100644 --- a/doc/sphinx_source/using/users.rst +++ b/doc/sphinx_source/using/users.rst @@ -79,4 +79,4 @@ Eggdrop does not have access levels like some bots. There are no meaningless num There are also 26 global user-defined flags and 26 channel user-defined flags (Capital letters A through Z). These are used by scripts, and their uses vary depending on the script that uses them. -Copyright (C) 2002 - 2023 Eggheads Development Team +Copyright (C) 2002 - 2024 Eggheads Development Team diff --git a/doc/tcl-commands.doc b/doc/tcl-commands.doc index 84136fd4b..bcbf842ee 100644 --- a/doc/tcl-commands.doc +++ b/doc/tcl-commands.doc @@ -4170,4 +4170,4 @@ the four special characters: well, so a bind would have to use "\*" or {*} for a mask argument ----- ----------------------------------------------------------------- - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team diff --git a/logs/CONTENTS b/logs/CONTENTS index f09e3f3d1..57d32b6c6 100644 --- a/logs/CONTENTS +++ b/logs/CONTENTS @@ -8,4 +8,4 @@ Last revised: August 08, 2004 This is a good place to put your logfiles. _____________________________________________________________________ - Copyright (C) 2001 - 2023 Eggheads Development Team + Copyright (C) 2001 - 2024 Eggheads Development Team diff --git a/m4/python.m4 b/m4/python.m4 index 84dc338ba..5409d7b6b 100644 --- a/m4/python.m4 +++ b/m4/python.m4 @@ -1,6 +1,6 @@ dnl python.m4 -- Autoconf macros to compile python.mod dnl -dnl Copyright (c) 2022 - 2022 Eggheads Development Team +dnl Copyright (c) 2022 - 2024 Eggheads Development Team dnl dnl This program is free software; you can redistribute it and/or dnl modify it under the terms of the GNU General Public License diff --git a/m4/tcl.m4 b/m4/tcl.m4 index d4a95c5e8..93320acf8 100644 --- a/m4/tcl.m4 +++ b/m4/tcl.m4 @@ -5,7 +5,7 @@ # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. -# Copyright (c) 2017 - 2023 Eggheads Development Team +# Copyright (c) 2017 - 2024 Eggheads Development Team # # Original Tcl/TEA license.terms information for this file: # This software is copyrighted by the Regents of the University of diff --git a/misc/genchanges b/misc/genchanges index 9e7432292..31fa8dc5e 100755 --- a/misc/genchanges +++ b/misc/genchanges @@ -2,7 +2,7 @@ # # genchanges - Generate changelog (doc/Changes and ChangeLog) files. # -# Copyright (C) 2017 - 2023 Eggheads Development Team +# Copyright (C) 2017 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/generatedocs b/misc/generatedocs index 0267d360b..b00e847ac 100755 --- a/misc/generatedocs +++ b/misc/generatedocs @@ -4,7 +4,7 @@ # reStructuredText format files. -Geo # # -# Copyright (C) 2004 - 2023 Eggheads Development Team +# Copyright (C) 2004 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/getcommit b/misc/getcommit index 433704ec3..a310aa8df 100755 --- a/misc/getcommit +++ b/misc/getcommit @@ -2,7 +2,7 @@ # # getcommit - get a descriptive commit name (git) # -# Copyright (C) 2015 - 2023 Eggheads Development Team +# Copyright (C) 2015 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/killwhitespace b/misc/killwhitespace index b1a96c330..bea3e450a 100755 --- a/misc/killwhitespace +++ b/misc/killwhitespace @@ -2,7 +2,7 @@ # # killwhitespace - removes trailing whitespace from source files # -# Copyright (C) 2005 - 2023 Eggheads Development Team +# Copyright (C) 2005 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/makedepend b/misc/makedepend index c355c6fcc..8dc7e9533 100755 --- a/misc/makedepend +++ b/misc/makedepend @@ -2,7 +2,7 @@ # # makedepend - updates Makefile dependencies throughout the tree # -# Copyright (C) 2004 - 2023 Eggheads Development Team +# Copyright (C) 2004 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/modconfig b/misc/modconfig index 78fdb1038..0fd07b063 100755 --- a/misc/modconfig +++ b/misc/modconfig @@ -2,7 +2,7 @@ # # modconfig # -# Copyright (C) 2000 - 2023 Eggheads Development Team +# Copyright (C) 2000 - 2024 Eggheads Development Team # Written by Fabian Knittel # # This program is free software; you can redistribute it and/or diff --git a/misc/newversion b/misc/newversion index f4e6c8aa8..5bb879d0c 100755 --- a/misc/newversion +++ b/misc/newversion @@ -2,7 +2,7 @@ # # newversion - prepares the tree for a new version number in git # -# Copyright (C) 2004 - 2023 Eggheads Development Team +# Copyright (C) 2004 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/releaseprep b/misc/releaseprep index 5c818f276..de3fc5612 100755 --- a/misc/releaseprep +++ b/misc/releaseprep @@ -2,7 +2,7 @@ # # releaseprep - prepares the tree for release # -# Copyright (C) 2004 - 2023 Eggheads Development Team +# Copyright (C) 2004 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/runautotools b/misc/runautotools index 48e9b93d5..cb16ab666 100755 --- a/misc/runautotools +++ b/misc/runautotools @@ -2,7 +2,7 @@ # # runautotools - # -# Copyright (C) 2004 - 2023 Eggheads Development Team +# Copyright (C) 2004 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/misc/setpatch b/misc/setpatch index 1e107e009..74620c560 100755 --- a/misc/setpatch +++ b/misc/setpatch @@ -2,7 +2,7 @@ # # addpatch - generates src/version.h # -# Copyright (C) 2002 - 2023 Eggheads Development Team +# Copyright (C) 2002 - 2024 Eggheads Development Team # Copyright (C) 2000 Fabian Knittel # # This file is free software; you can redistribute it and/or modify it @@ -88,7 +88,7 @@ cat < src/version.h */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/misc/updatecopyright b/misc/updatecopyright index 1ba241fa3..a17b5edaf 100755 --- a/misc/updatecopyright +++ b/misc/updatecopyright @@ -2,7 +2,7 @@ # # updatecopyright - updates copyright in files # -# Copyright (C) 2005 - 2023 Eggheads Development Team +# Copyright (C) 2005 - 2024 Eggheads Development Team # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by diff --git a/scripts/CONTENTS b/scripts/CONTENTS index 7e395fbf4..ec0813aff 100644 --- a/scripts/CONTENTS +++ b/scripts/CONTENTS @@ -68,4 +68,4 @@ Last revised: August 08, 2004 _____________________________________________________________________ - Copyright (C) 2001 - 2023 Eggheads Development Team + Copyright (C) 2001 - 2024 Eggheads Development Team diff --git a/scripts/action.fix.tcl b/scripts/action.fix.tcl index 13e13b4c8..b2cfb2bee 100644 --- a/scripts/action.fix.tcl +++ b/scripts/action.fix.tcl @@ -1,6 +1,6 @@ # action.fix.tcl # -# Copyright (C) 2002 - 2023 Eggheads Development Team +# Copyright (C) 2002 - 2024 Eggheads Development Team # # Tothwolf 25May1999: cleanup # Tothwolf 04Oct1999: changed proc names slightly diff --git a/scripts/autobotchk b/scripts/autobotchk index 9ad2b5b8b..f9f1e8b40 100755 --- a/scripts/autobotchk +++ b/scripts/autobotchk @@ -1,7 +1,7 @@ #! /bin/sh # # Copyright (C) 1999-2003 Jeff Fisher (guppy@eggheads.org) -# Copyright (C) 2004-2023 Eggheads Development Team +# Copyright (C) 2004-2024 Eggheads Development Team # # systemd formatting contributed by PeGaSuS # @@ -59,7 +59,7 @@ exec tclsh$lastver "$0" ${1+"$@"} # AutoBotchk - An eggdrop utility to autogenerate botchk/crontab entries # # Copyright (C) 1999-2003 Jeff Fisher (guppy@eggheads.org) -# Copyright (C) 2004-2023 Eggheads Development Team +# Copyright (C) 2004-2024 Eggheads Development Team # # How to use # ---------- @@ -330,7 +330,7 @@ puts $fd "#! /bin/sh # # Generated by AutoBotchk 1.11 # Copyright (C) 1999-2003 Jeff Fisher (guppy@eggheads.org) -# Copyright (C) 2004-2023 Eggheads Development Team +# Copyright (C) 2004-2024 Eggheads Development Team # # change this to the directory you run your bot from: diff --git a/scripts/compat.tcl b/scripts/compat.tcl index 0ce91fac4..6e1e0bb64 100644 --- a/scripts/compat.tcl +++ b/scripts/compat.tcl @@ -2,7 +2,7 @@ # This script just quickly maps old Tcl commands to the new ones. # Use this if you are too lazy to get off your butt and update your scripts :D # -# Copyright (C) 2002 - 2023 Eggheads Development Team +# Copyright (C) 2002 - 2024 Eggheads Development Team # # Wiktor 31Mar2000: added binds and chnick proc # Tothwolf 25May1999: cleanup diff --git a/scripts/ques5.tcl b/scripts/ques5.tcl index e554fa062..1a5028580 100644 --- a/scripts/ques5.tcl +++ b/scripts/ques5.tcl @@ -2,7 +2,7 @@ # ques5.tcl # # Copyright (C) 1995 - 1997 Robey Pointer -# Copyright (C) 1999 - 2023 Eggheads Development Team +# Copyright (C) 1999 - 2024 Eggheads Development Team # # v1 -- 20aug95 # v2 -- 2oct95 [improved it] diff --git a/src/bg.c b/src/bg.c index 3c8a712de..540dc60bd 100644 --- a/src/bg.c +++ b/src/bg.c @@ -5,7 +5,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/bg.h b/src/bg.h index f5e79d368..70f98ab6e 100644 --- a/src/bg.h +++ b/src/bg.h @@ -2,7 +2,7 @@ * bg.h */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/botcmd.c b/src/botcmd.c index e4fb59713..f3440f3c7 100644 --- a/src/botcmd.c +++ b/src/botcmd.c @@ -5,7 +5,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/botmsg.c b/src/botmsg.c index 2c00552d0..3a4cb37d5 100644 --- a/src/botmsg.c +++ b/src/botmsg.c @@ -7,7 +7,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/botnet.c b/src/botnet.c index 7d42e1187..88484235d 100644 --- a/src/botnet.c +++ b/src/botnet.c @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/chan.h b/src/chan.h index 33ba807d1..19a56e5a1 100644 --- a/src/chan.h +++ b/src/chan.h @@ -5,7 +5,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/chanprog.c b/src/chanprog.c index 6253fd474..c4b679c07 100644 --- a/src/chanprog.c +++ b/src/chanprog.c @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/cmds.c b/src/cmds.c index 47923b2ef..ceb7bca49 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -5,7 +5,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/cmdt.h b/src/cmdt.h index d5cea1fb4..e7f16815b 100644 --- a/src/cmdt.h +++ b/src/cmdt.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/base64.c b/src/compat/base64.c index d3b7218d3..2e835d2e6 100644 --- a/src/compat/base64.c +++ b/src/compat/base64.c @@ -2,7 +2,7 @@ * base64.c -- provides b64_ntop() and b64_pton() if necessary */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/base64.h b/src/compat/base64.h index 1925f7257..1f36e9dc6 100644 --- a/src/compat/base64.h +++ b/src/compat/base64.h @@ -3,7 +3,7 @@ * prototypes for base64.c */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/compat.h b/src/compat/compat.h index 0346097b5..6294c6711 100644 --- a/src/compat/compat.h +++ b/src/compat/compat.h @@ -3,7 +3,7 @@ * wrap-around header for all compatibility functions. */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/explicit_bzero.c b/src/compat/explicit_bzero.c index 862c491a9..b5c9553bb 100644 --- a/src/compat/explicit_bzero.c +++ b/src/compat/explicit_bzero.c @@ -2,7 +2,7 @@ * explicit_bzero.c -- provides explicit_bzero() if necessary */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/explicit_bzero.h b/src/compat/explicit_bzero.h index a9a3f3b9c..f0b58697a 100644 --- a/src/compat/explicit_bzero.h +++ b/src/compat/explicit_bzero.h @@ -3,7 +3,7 @@ * prototypes for explicit_bzero.c */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/in6.h b/src/compat/in6.h index ca84cd57d..bfb43d8e3 100644 --- a/src/compat/in6.h +++ b/src/compat/in6.h @@ -2,7 +2,7 @@ * in6.h -- various IPv6 related definitions and macros */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/inet_aton.c b/src/compat/inet_aton.c index dc2c02d44..cb471b287 100644 --- a/src/compat/inet_aton.c +++ b/src/compat/inet_aton.c @@ -2,7 +2,7 @@ /* * inet_aton.c -- provides inet_aton() if necessary. * - * Portions Copyright (C) 2000 - 2023 Eggheads Development Team + * Portions Copyright (C) 2000 - 2024 Eggheads Development Team */ #include "main.h" diff --git a/src/compat/inet_aton.h b/src/compat/inet_aton.h index 97303653b..78acf4463 100644 --- a/src/compat/inet_aton.h +++ b/src/compat/inet_aton.h @@ -3,7 +3,7 @@ * prototypes for inet_aton.c */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/snprintf.c b/src/compat/snprintf.c index 71a64e42d..1204b70f1 100644 --- a/src/compat/snprintf.c +++ b/src/compat/snprintf.c @@ -2,7 +2,7 @@ * snprintf.c - a portable implementation of snprintf and vsnprintf */ /* - * Portions Copyright (C) 2000 - 2023 Eggheads Development Team + * Portions Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/snprintf.h b/src/compat/snprintf.h index d9d7ba791..293f6647d 100644 --- a/src/compat/snprintf.h +++ b/src/compat/snprintf.h @@ -3,7 +3,7 @@ * header file for snprintf.c */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/strlcpy.c b/src/compat/strlcpy.c index f834d6ca5..f162bb149 100644 --- a/src/compat/strlcpy.c +++ b/src/compat/strlcpy.c @@ -2,7 +2,7 @@ * strlcpy.c -- provides strlcpy() if necessary */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/compat/strlcpy.h b/src/compat/strlcpy.h index 66d8e26d1..dbdc1d169 100644 --- a/src/compat/strlcpy.h +++ b/src/compat/strlcpy.h @@ -3,7 +3,7 @@ * prototypes for strlcpy.c */ /* - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/dcc.c b/src/dcc.c index 931c37d63..9030f1a02 100644 --- a/src/dcc.c +++ b/src/dcc.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/dccutil.c b/src/dccutil.c index ece4d895d..17b5054e9 100644 --- a/src/dccutil.c +++ b/src/dccutil.c @@ -8,7 +8,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/dns.c b/src/dns.c index afa407b07..ab1fdbeae 100644 --- a/src/dns.c +++ b/src/dns.c @@ -7,7 +7,7 @@ /* * Written by Fabian Knittel * - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/dns.h b/src/dns.h index 771798994..5bfe44031 100644 --- a/src/dns.h +++ b/src/dns.h @@ -5,7 +5,7 @@ /* * Written by Fabian Knittel * - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/eggdrop.h b/src/eggdrop.h index 964a63c28..a7774e294 100644 --- a/src/eggdrop.h +++ b/src/eggdrop.h @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/flags.c b/src/flags.c index c86627794..aea4ec9b2 100644 --- a/src/flags.c +++ b/src/flags.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/flags.h b/src/flags.h index 565709615..bfc868139 100644 --- a/src/flags.h +++ b/src/flags.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/lang.h b/src/lang.h index a130819b3..ff7f9b4eb 100644 --- a/src/lang.h +++ b/src/lang.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/language.c b/src/language.c index 7d2539159..7056311a2 100644 --- a/src/language.c +++ b/src/language.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/main.c b/src/main.c index b4324f7ac..74688099d 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -989,13 +989,13 @@ int main(int arg_c, char **arg_v) egg_snprintf(egg_version, sizeof egg_version, "%s+%s %u", EGG_STRINGVER, EGG_PATCH, egg_numver); egg_snprintf(ver, sizeof ver, "eggdrop v%s+%s", EGG_STRINGVER, EGG_PATCH); egg_snprintf(version, sizeof version, - "Eggdrop v%s+%s (C) 1997 Robey Pointer (C) 1999-2023 Eggheads", + "Eggdrop v%s+%s (C) 1997 Robey Pointer (C) 2010-2024 Eggheads", EGG_STRINGVER, EGG_PATCH); #else egg_snprintf(egg_version, sizeof egg_version, "%s %u", EGG_STRINGVER, egg_numver); egg_snprintf(ver, sizeof ver, "eggdrop v%s", EGG_STRINGVER); egg_snprintf(version, sizeof version, - "Eggdrop v%s (C) 1997 Robey Pointer (C) 1999-2023 Eggheads", + "Eggdrop v%s (C) 1997 Robey Pointer (C) 2010-2024 Eggheads", EGG_STRINGVER); #endif diff --git a/src/main.h b/src/main.h index 3cba18fd3..d9c3cc50d 100644 --- a/src/main.h +++ b/src/main.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mem.c b/src/mem.c index 4c92aa59a..949e6fee6 100644 --- a/src/mem.c +++ b/src/mem.c @@ -5,7 +5,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/misc.c b/src/misc.c index 990a3824a..2418157a5 100644 --- a/src/misc.c +++ b/src/misc.c @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/misc_file.c b/src/misc_file.c index 84110987b..7d279c4eb 100644 --- a/src/misc_file.c +++ b/src/misc_file.c @@ -3,7 +3,7 @@ * copyfile() movefile() file_readable() */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/misc_file.h b/src/misc_file.h index 07a7ca1b5..2de9445a9 100644 --- a/src/misc_file.h +++ b/src/misc_file.h @@ -3,7 +3,7 @@ * prototypes for misc_file.c */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/assoc.mod/assoc.c b/src/mod/assoc.mod/assoc.c index eb41e401f..48891a633 100644 --- a/src/mod/assoc.mod/assoc.c +++ b/src/mod/assoc.mod/assoc.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/assoc.mod/assoc.h b/src/mod/assoc.mod/assoc.h index c0cc1e782..2c105124a 100644 --- a/src/mod/assoc.mod/assoc.h +++ b/src/mod/assoc.mod/assoc.h @@ -2,7 +2,7 @@ * assoc.h -- part of assoc.mod */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/blowfish.mod/bf_tab.h b/src/mod/blowfish.mod/bf_tab.h index a4e75c7aa..2e20e66c4 100644 --- a/src/mod/blowfish.mod/bf_tab.h +++ b/src/mod/blowfish.mod/bf_tab.h @@ -3,7 +3,7 @@ * Blowfish P-box and S-box tables */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/blowfish.mod/blowfish.c b/src/mod/blowfish.mod/blowfish.c index f1621d378..caf27b026 100644 --- a/src/mod/blowfish.mod/blowfish.c +++ b/src/mod/blowfish.mod/blowfish.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/blowfish.mod/blowfish.h b/src/mod/blowfish.mod/blowfish.h index dc57eb9a9..fa427fe6a 100644 --- a/src/mod/blowfish.mod/blowfish.h +++ b/src/mod/blowfish.mod/blowfish.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/channels.c b/src/mod/channels.mod/channels.c index dc202dc22..95fed762b 100644 --- a/src/mod/channels.mod/channels.c +++ b/src/mod/channels.mod/channels.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/channels.h b/src/mod/channels.mod/channels.h index a165e20be..38dbe0869 100644 --- a/src/mod/channels.mod/channels.h +++ b/src/mod/channels.mod/channels.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/cmdschan.c b/src/mod/channels.mod/cmdschan.c index a267dfb08..4d96630a7 100644 --- a/src/mod/channels.mod/cmdschan.c +++ b/src/mod/channels.mod/cmdschan.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/tclchan.c b/src/mod/channels.mod/tclchan.c index debfb1368..512702703 100644 --- a/src/mod/channels.mod/tclchan.c +++ b/src/mod/channels.mod/tclchan.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/udefchan.c b/src/mod/channels.mod/udefchan.c index 72f645fa3..21518314a 100644 --- a/src/mod/channels.mod/udefchan.c +++ b/src/mod/channels.mod/udefchan.c @@ -3,7 +3,7 @@ * user definable channel flags/settings */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/channels.mod/userchan.c b/src/mod/channels.mod/userchan.c index 9eb1794d8..4960b42fc 100644 --- a/src/mod/channels.mod/userchan.c +++ b/src/mod/channels.mod/userchan.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/compress.mod/compress.c b/src/mod/compress.mod/compress.c index 97639d2d2..e94124fed 100644 --- a/src/mod/compress.mod/compress.c +++ b/src/mod/compress.mod/compress.c @@ -7,7 +7,7 @@ * by Jean-loup Gailly and Miguel Albrecht. */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/compress.mod/compress.h b/src/mod/compress.mod/compress.h index 3cabf141a..f2ba71135 100644 --- a/src/mod/compress.mod/compress.h +++ b/src/mod/compress.mod/compress.h @@ -3,7 +3,7 @@ * header file for the zlib compression module */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/compress.mod/configure b/src/mod/compress.mod/configure index 3be5c671f..e95014b1d 100755 --- a/src/mod/compress.mod/configure +++ b/src/mod/compress.mod/configure @@ -13,7 +13,7 @@ # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # -# Copyright (C) 1999 - 2023 Eggheads Development Team +# Copyright (C) 1999 - 2024 Eggheads Development Team ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## @@ -1410,7 +1410,7 @@ Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team _ACEOF exit fi diff --git a/src/mod/compress.mod/configure.ac b/src/mod/compress.mod/configure.ac index 8455c296e..1dcf19572 100644 --- a/src/mod/compress.mod/configure.ac +++ b/src/mod/compress.mod/configure.ac @@ -9,7 +9,7 @@ AC_INIT([Eggdrop Compress Module],[1.9.5],[bugs@eggheads.org]) AC_CONFIG_SRCDIR(compress.c) AC_CONFIG_AUX_DIR(../../../misc) -AC_COPYRIGHT([Copyright (C) 1999 - 2023 Eggheads Development Team]) +AC_COPYRIGHT([Copyright (C) 1999 - 2024 Eggheads Development Team]) AC_REVISION([m4_esyscmd([../../../misc/getcommit])]) AC_PROG_CC([gcc cc clang]) diff --git a/src/mod/compress.mod/tclcompress.c b/src/mod/compress.mod/tclcompress.c index 9e89538dd..c6c33f862 100644 --- a/src/mod/compress.mod/tclcompress.c +++ b/src/mod/compress.mod/tclcompress.c @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/console.mod/console.c b/src/mod/console.mod/console.c index 089c1e326..d54f93751 100644 --- a/src/mod/console.mod/console.c +++ b/src/mod/console.mod/console.c @@ -4,7 +4,7 @@ * by cmwagner/billyjoe/D. Senso */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/console.mod/console.h b/src/mod/console.mod/console.h index f3155f201..d846d62df 100644 --- a/src/mod/console.mod/console.h +++ b/src/mod/console.mod/console.h @@ -2,7 +2,7 @@ * console.h -- part of console.mod */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/ctcp.mod/ctcp.c b/src/mod/ctcp.mod/ctcp.c index ace8c7289..ebe45c2fc 100644 --- a/src/mod/ctcp.mod/ctcp.c +++ b/src/mod/ctcp.mod/ctcp.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/ctcp.mod/ctcp.h b/src/mod/ctcp.mod/ctcp.h index 63bdb890f..ff1bc36bc 100644 --- a/src/mod/ctcp.mod/ctcp.h +++ b/src/mod/ctcp.mod/ctcp.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/dns.mod/configure b/src/mod/dns.mod/configure index 12ea1bab8..894006d91 100755 --- a/src/mod/dns.mod/configure +++ b/src/mod/dns.mod/configure @@ -13,7 +13,7 @@ # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # -# Copyright (C) 1999 - 2023 Eggheads Development Team +# Copyright (C) 1999 - 2024 Eggheads Development Team ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## @@ -1379,7 +1379,7 @@ Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (C) 1999 - 2023 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team _ACEOF exit fi diff --git a/src/mod/dns.mod/configure.ac b/src/mod/dns.mod/configure.ac index aef8b6a5c..7ec02e33d 100644 --- a/src/mod/dns.mod/configure.ac +++ b/src/mod/dns.mod/configure.ac @@ -9,7 +9,7 @@ AC_INIT([Eggdrop DNS Module],[1.9.5],[bugs@eggheads.org]) AC_CONFIG_SRCDIR(coredns.c) AC_CONFIG_AUX_DIR(../../../misc) -AC_COPYRIGHT([Copyright (C) 1999 - 2023 Eggheads Development Team]) +AC_COPYRIGHT([Copyright (C) 1999 - 2024 Eggheads Development Team]) AC_REVISION([m4_esyscmd([../../../misc/getcommit])]) AC_PROG_CC([gcc cc clang]) diff --git a/src/mod/dns.mod/coredns.c b/src/mod/dns.mod/coredns.c index 6e01ceedc..f1f440770 100644 --- a/src/mod/dns.mod/coredns.c +++ b/src/mod/dns.mod/coredns.c @@ -8,7 +8,7 @@ * /etc/hosts support added by Michael Ortmann */ /* - * Portions Copyright (C) 1999 - 2023 Eggheads Development Team + * Portions Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/dns.mod/dns.c b/src/mod/dns.mod/dns.c index e0b8cb59b..a25ee2be8 100644 --- a/src/mod/dns.mod/dns.c +++ b/src/mod/dns.mod/dns.c @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/dns.mod/dns.h b/src/mod/dns.mod/dns.h index 508511ba8..5b8b30e2b 100644 --- a/src/mod/dns.mod/dns.h +++ b/src/mod/dns.mod/dns.h @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/dbcompat.c b/src/mod/filesys.mod/dbcompat.c index b4db2c091..e50550e4c 100644 --- a/src/mod/filesys.mod/dbcompat.c +++ b/src/mod/filesys.mod/dbcompat.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/dbcompat.h b/src/mod/filesys.mod/dbcompat.h index 341fe5e3a..c8af6c481 100644 --- a/src/mod/filesys.mod/dbcompat.h +++ b/src/mod/filesys.mod/dbcompat.h @@ -6,7 +6,7 @@ * Written for filedb3 by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filedb3.c b/src/mod/filesys.mod/filedb3.c index df2b41d81..37884c5c6 100644 --- a/src/mod/filesys.mod/filedb3.c +++ b/src/mod/filesys.mod/filedb3.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filedb3.h b/src/mod/filesys.mod/filedb3.h index bdb28266e..08f15f8e0 100644 --- a/src/mod/filesys.mod/filedb3.h +++ b/src/mod/filesys.mod/filedb3.h @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filelist.c b/src/mod/filesys.mod/filelist.c index 7342f6913..591dcaa54 100644 --- a/src/mod/filesys.mod/filelist.c +++ b/src/mod/filesys.mod/filelist.c @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filelist.h b/src/mod/filesys.mod/filelist.h index 10868c43e..456e2fdd3 100644 --- a/src/mod/filesys.mod/filelist.h +++ b/src/mod/filesys.mod/filelist.h @@ -5,7 +5,7 @@ * Written by Fabian Knittel */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/files.c b/src/mod/filesys.mod/files.c index 186f5b12e..f6c26edfc 100644 --- a/src/mod/filesys.mod/files.c +++ b/src/mod/filesys.mod/files.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/files.h b/src/mod/filesys.mod/files.h index 36e419730..f374f2721 100644 --- a/src/mod/filesys.mod/files.h +++ b/src/mod/filesys.mod/files.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filesys.c b/src/mod/filesys.mod/filesys.c index f5ef33533..2db7aec92 100644 --- a/src/mod/filesys.mod/filesys.c +++ b/src/mod/filesys.mod/filesys.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/filesys.h b/src/mod/filesys.mod/filesys.h index bf545286a..be566eb69 100644 --- a/src/mod/filesys.mod/filesys.h +++ b/src/mod/filesys.mod/filesys.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/filesys.mod/tclfiles.c b/src/mod/filesys.mod/tclfiles.c index c4d4a7ccd..1da1b3049 100644 --- a/src/mod/filesys.mod/tclfiles.c +++ b/src/mod/filesys.mod/tclfiles.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/ident.mod/ident.c b/src/mod/ident.mod/ident.c index e6ea5e7d0..6942d73ad 100644 --- a/src/mod/ident.mod/ident.c +++ b/src/mod/ident.mod/ident.c @@ -3,7 +3,7 @@ */ /* * Copyright (c) 2018 - 2019 Michael Ortmann MIT License - * Copyright (C) 2019 - 2023 Eggheads Development Team + * Copyright (C) 2019 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index 94807f6e8..46aa48190 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -8,7 +8,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/cmdsirc.c b/src/mod/irc.mod/cmdsirc.c index 6f878f983..2491b6731 100644 --- a/src/mod/irc.mod/cmdsirc.c +++ b/src/mod/irc.mod/cmdsirc.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/irc.c b/src/mod/irc.mod/irc.c index 52518ce12..8cce81776 100644 --- a/src/mod/irc.mod/irc.c +++ b/src/mod/irc.mod/irc.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/irc.h b/src/mod/irc.mod/irc.h index 2a030e023..2ea77db73 100644 --- a/src/mod/irc.mod/irc.h +++ b/src/mod/irc.mod/irc.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/mode.c b/src/mod/irc.mod/mode.c index 93df97da9..327844c3b 100644 --- a/src/mod/irc.mod/mode.c +++ b/src/mod/irc.mod/mode.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/msgcmds.c b/src/mod/irc.mod/msgcmds.c index 4f3d14756..e8baa831e 100644 --- a/src/mod/irc.mod/msgcmds.c +++ b/src/mod/irc.mod/msgcmds.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/irc.mod/tclirc.c b/src/mod/irc.mod/tclirc.c index 1e1d688e5..52826b8e5 100644 --- a/src/mod/irc.mod/tclirc.c +++ b/src/mod/irc.mod/tclirc.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/module.h b/src/mod/module.h index 594182a9f..951241adb 100644 --- a/src/mod/module.h +++ b/src/mod/module.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/modvals.h b/src/mod/modvals.h index 5eda82948..9ec2a9e18 100644 --- a/src/mod/modvals.h +++ b/src/mod/modvals.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/notes.mod/cmdsnote.c b/src/mod/notes.mod/cmdsnote.c index cb4dd489b..68f9ad494 100644 --- a/src/mod/notes.mod/cmdsnote.c +++ b/src/mod/notes.mod/cmdsnote.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/notes.mod/notes.c b/src/mod/notes.mod/notes.c index 17d9fff31..5c5d47aa8 100644 --- a/src/mod/notes.mod/notes.c +++ b/src/mod/notes.mod/notes.c @@ -7,7 +7,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/notes.mod/notes.h b/src/mod/notes.mod/notes.h index 02c5d123d..79c222702 100644 --- a/src/mod/notes.mod/notes.h +++ b/src/mod/notes.mod/notes.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/pbkdf2.mod/pbkdf2.c b/src/mod/pbkdf2.mod/pbkdf2.c index 8210c5fd6..169d92bc8 100644 --- a/src/mod/pbkdf2.mod/pbkdf2.c +++ b/src/mod/pbkdf2.mod/pbkdf2.c @@ -4,7 +4,7 @@ * * Written by thommey and Michael Ortmann * - * Copyright (C) 2017 - 2023 Eggheads Development Team + * Copyright (C) 2017 - 2024 Eggheads Development Team */ #include "src/mod/module.h" diff --git a/src/mod/python.mod/configure b/src/mod/python.mod/configure index 40bd0c84a..532be77df 100755 --- a/src/mod/python.mod/configure +++ b/src/mod/python.mod/configure @@ -12,7 +12,7 @@ # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # -# Copyright (C) 1999 - 2022 Eggheads Development Team +# Copyright (C) 1999 - 2024 Eggheads Development Team ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## @@ -1346,7 +1346,7 @@ Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (C) 1999 - 2022 Eggheads Development Team +Copyright (C) 1999 - 2024 Eggheads Development Team _ACEOF exit fi diff --git a/src/mod/python.mod/configure.ac b/src/mod/python.mod/configure.ac index b52a686b3..249d5ca46 100644 --- a/src/mod/python.mod/configure.ac +++ b/src/mod/python.mod/configure.ac @@ -10,7 +10,7 @@ AC_INIT([Eggdrop Python Module],[1.9.3],[bugs@eggheads.org]) AC_CONFIG_SRCDIR(python.c) AC_CONFIG_AUX_DIR(../../../misc) -AC_COPYRIGHT([Copyright (C) 1999 - 2022 Eggheads Development Team]) +AC_COPYRIGHT([Copyright (C) 1999 - 2024 Eggheads Development Team]) AC_REVISION([m4_esyscmd([../../../misc/getcommit])]) AC_PROG_FGREP diff --git a/src/mod/python.mod/pycmds.c b/src/mod/python.mod/pycmds.c index 302dd82b5..051bf7844 100644 --- a/src/mod/python.mod/pycmds.c +++ b/src/mod/python.mod/pycmds.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2020 - 2021 Eggheads Development Team + * Copyright (C) 2020 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/python.mod/python.c b/src/mod/python.mod/python.c index 4cb3b70d4..814fde8ec 100644 --- a/src/mod/python.mod/python.c +++ b/src/mod/python.mod/python.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2020 - 2021 Eggheads Development Team + * Copyright (C) 2020 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/python.mod/tclpython.c b/src/mod/python.mod/tclpython.c index 88a89b2d7..fed1f6386 100644 --- a/src/mod/python.mod/tclpython.c +++ b/src/mod/python.mod/tclpython.c @@ -2,7 +2,7 @@ * tclpython.c -- tcl functions for python.mod */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/seen.mod/seen.c b/src/mod/seen.mod/seen.c index de3fc487d..41cea68d2 100644 --- a/src/mod/seen.mod/seen.c +++ b/src/mod/seen.mod/seen.c @@ -11,7 +11,7 @@ * 1.2a 1997-08-24 Minor fixes. [BB] */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/cmdsserv.c b/src/mod/server.mod/cmdsserv.c index 8f6302d45..ab580d208 100644 --- a/src/mod/server.mod/cmdsserv.c +++ b/src/mod/server.mod/cmdsserv.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/isupport.c b/src/mod/server.mod/isupport.c index d3d08ada7..61636fc26 100644 --- a/src/mod/server.mod/isupport.c +++ b/src/mod/server.mod/isupport.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/server.c b/src/mod/server.mod/server.c index a206b6810..907656c7f 100644 --- a/src/mod/server.mod/server.c +++ b/src/mod/server.mod/server.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/server.h b/src/mod/server.mod/server.h index f70d8db91..7764c6228 100644 --- a/src/mod/server.mod/server.h +++ b/src/mod/server.mod/server.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 956fdaf4c..85baed7cf 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/tclisupport.c b/src/mod/server.mod/tclisupport.c index e59359e63..9dff94a65 100644 --- a/src/mod/server.mod/tclisupport.c +++ b/src/mod/server.mod/tclisupport.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/server.mod/tclserv.c b/src/mod/server.mod/tclserv.c index b675cb392..c8a753bd6 100644 --- a/src/mod/server.mod/tclserv.c +++ b/src/mod/server.mod/tclserv.c @@ -2,7 +2,7 @@ * tclserv.c -- part of server.mod * * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/share.mod/share.c b/src/mod/share.mod/share.c index 9e7bc519a..9fc14891f 100644 --- a/src/mod/share.mod/share.c +++ b/src/mod/share.mod/share.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/share.mod/share.h b/src/mod/share.mod/share.h index 603f76e2a..cf74f4048 100644 --- a/src/mod/share.mod/share.h +++ b/src/mod/share.mod/share.h @@ -3,7 +3,7 @@ * */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/share.mod/uf_features.c b/src/mod/share.mod/uf_features.c index c8dec6603..9acd43069 100644 --- a/src/mod/share.mod/uf_features.c +++ b/src/mod/share.mod/uf_features.c @@ -3,7 +3,7 @@ * */ /* - * Copyright (C) 2000 - 2023 Eggheads Development Team + * Copyright (C) 2000 - 2024 Eggheads Development Team * Written by Fabian Knittel * * This program is free software; you can redistribute it and/or diff --git a/src/mod/transfer.mod/tcltransfer.c b/src/mod/transfer.mod/tcltransfer.c index 0456bf56a..e5cf6cd1a 100644 --- a/src/mod/transfer.mod/tcltransfer.c +++ b/src/mod/transfer.mod/tcltransfer.c @@ -1,7 +1,7 @@ /* * tcltransfer.c -- part of transfer.mod * - * Copyright (C) 2003 - 2023 Eggheads Development Team + * Copyright (C) 2003 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/transfer.mod/transfer.c b/src/mod/transfer.mod/transfer.c index 0171b6fbc..9bfdbb1db 100644 --- a/src/mod/transfer.mod/transfer.c +++ b/src/mod/transfer.mod/transfer.c @@ -2,7 +2,7 @@ * transfer.c -- part of transfer.mod * * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/transfer.mod/transfer.h b/src/mod/transfer.mod/transfer.h index 163190355..dbbd145d2 100644 --- a/src/mod/transfer.mod/transfer.h +++ b/src/mod/transfer.mod/transfer.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/transfer.mod/transferfstat.c b/src/mod/transfer.mod/transferfstat.c index fec601ae3..76cf57b94 100644 --- a/src/mod/transfer.mod/transferfstat.c +++ b/src/mod/transfer.mod/transferfstat.c @@ -1,7 +1,7 @@ /* * transferfstat.c -- part of transfer.mod * - * Copyright (C) 2003 - 2023 Eggheads Development Team + * Copyright (C) 2003 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/transfer.mod/transferqueue.c b/src/mod/transfer.mod/transferqueue.c index 101bfa235..ab4de05c3 100644 --- a/src/mod/transfer.mod/transferqueue.c +++ b/src/mod/transfer.mod/transferqueue.c @@ -1,7 +1,7 @@ /* * transferqueue.c -- part of transfer.mod * - * Copyright (C) 2003 - 2023 Eggheads Development Team + * Copyright (C) 2003 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/twitch.mod/twitch.c b/src/mod/twitch.mod/twitch.c index c6a90aac2..1ef9e7e60 100644 --- a/src/mod/twitch.mod/twitch.c +++ b/src/mod/twitch.mod/twitch.c @@ -18,7 +18,7 @@ */ /* - * Copyright (C) 2020 - 2023 Eggheads Development Team + * Copyright (C) 2020 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/twitch.mod/twitch.h b/src/mod/twitch.mod/twitch.h index f063d90d2..97b39e938 100644 --- a/src/mod/twitch.mod/twitch.h +++ b/src/mod/twitch.mod/twitch.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/uptime.mod/uptime.c b/src/mod/uptime.mod/uptime.c index 0e222cdba..de75b2c21 100644 --- a/src/mod/uptime.mod/uptime.c +++ b/src/mod/uptime.mod/uptime.c @@ -11,7 +11,7 @@ */ /* * Copyright (C) 2001 proton - * Copyright (C) 2001 - 2023 Eggheads Development Team + * Copyright (C) 2001 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/uptime.mod/uptime.h b/src/mod/uptime.mod/uptime.h index f2cd360b1..4468c6156 100644 --- a/src/mod/uptime.mod/uptime.h +++ b/src/mod/uptime.mod/uptime.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 2001 proton - * Copyright (C) 2001 - 2023 Eggheads Development Team + * Copyright (C) 2001 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/mod/woobie.mod/woobie.c b/src/mod/woobie.mod/woobie.c index 71e49f948..d0a6e19de 100644 --- a/src/mod/woobie.mod/woobie.c +++ b/src/mod/woobie.mod/woobie.c @@ -6,7 +6,7 @@ * Comments by Fabian Knittel 29 December 1999 */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/modules.c b/src/modules.c index d85a09742..afb614221 100644 --- a/src/modules.c +++ b/src/modules.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/modules.h b/src/modules.h index 8e28878ef..839d5e87f 100644 --- a/src/modules.h +++ b/src/modules.h @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/net.c b/src/net.c index 85f353d7e..9ea150019 100644 --- a/src/net.c +++ b/src/net.c @@ -8,7 +8,7 @@ * * Changes after Feb 23, 1999 Copyright Eggheads Development Team * - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/proto.h b/src/proto.h index 9183dfa32..e1e0868ac 100644 --- a/src/proto.h +++ b/src/proto.h @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/rfc1459.c b/src/rfc1459.c index c7756db7d..631d7e62b 100644 --- a/src/rfc1459.c +++ b/src/rfc1459.c @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1990 Jarkko Oikarinen - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This code was more or less cloned from the ircd-hybrid 5.3 source. * The original code was written by Otto Harkoonen and even though it diff --git a/src/stat.h b/src/stat.h index 4b7d54fff..5802a0549 100644 --- a/src/stat.h +++ b/src/stat.h @@ -3,7 +3,7 @@ * file attributes */ /* - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tandem.h b/src/tandem.h index 97cf1df73..2d41f12d6 100644 --- a/src/tandem.h +++ b/src/tandem.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tcl.c b/src/tcl.c index 6557645d5..db0d50d71 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tcldcc.c b/src/tcldcc.c index 6a704de87..601714ba2 100644 --- a/src/tcldcc.c +++ b/src/tcldcc.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tclegg.h b/src/tclegg.h index caea8283e..d5e868d41 100644 --- a/src/tclegg.h +++ b/src/tclegg.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tclhash.c b/src/tclhash.c index 7f905e816..86bd17633 100644 --- a/src/tclhash.c +++ b/src/tclhash.c @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tclhash.h b/src/tclhash.h index c7ebb50b3..5fb0b5f44 100644 --- a/src/tclhash.h +++ b/src/tclhash.h @@ -3,7 +3,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tclmisc.c b/src/tclmisc.c index cfa6d5420..ad9406809 100644 --- a/src/tclmisc.c +++ b/src/tclmisc.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tcluser.c b/src/tcluser.c index 8cd52dc95..d8e51a48b 100644 --- a/src/tcluser.c +++ b/src/tcluser.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/tls.c b/src/tls.c index d9500b799..c3297f3ab 100644 --- a/src/tls.c +++ b/src/tls.c @@ -7,7 +7,7 @@ /* * Written by Rumen Stoyanov * - * Copyright (C) 2010 - 2023 Eggheads Development Team + * Copyright (C) 2010 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/userent.c b/src/userent.c index ce92dd590..3fde1f20a 100644 --- a/src/userent.c +++ b/src/userent.c @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/userrec.c b/src/userrec.c index 4fd8eaef3..487fd79a8 100644 --- a/src/userrec.c +++ b/src/userrec.c @@ -6,7 +6,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/users.c b/src/users.c index 2e8f5ff5c..703e344b1 100644 --- a/src/users.c +++ b/src/users.c @@ -12,7 +12,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/users.h b/src/users.h index a97d123cf..49f20853b 100644 --- a/src/users.h +++ b/src/users.h @@ -4,7 +4,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/src/version.h b/src/version.h index 0bf3573cd..0aec1d28b 100644 --- a/src/version.h +++ b/src/version.h @@ -9,7 +9,7 @@ */ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2023 Eggheads Development Team + * Copyright (C) 1999 - 2024 Eggheads Development Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/text/CONTENTS b/text/CONTENTS index f012103d5..2e55fba95 100644 --- a/text/CONTENTS +++ b/text/CONTENTS @@ -15,4 +15,4 @@ Last revised: December 02, 2003 _____________________________________________________________________ - Copyright (C) 2003 - 2023 Eggheads Development Team + Copyright (C) 2003 - 2024 Eggheads Development Team diff --git a/text/banner b/text/banner index cce1f61bd..fe5959b99 100644 --- a/text/banner +++ b/text/banner @@ -5,4 +5,4 @@ |___/ |___/ |_| Copyright (C) 1997 Robey Pointer - Copyright (C) 1999 - 2023 Eggheads Development Team + Copyright (C) 1999 - 2024 Eggheads Development Team From d11609c9fa2fedfb7355ae551878379971e56792 Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 14 Jan 2024 16:10:46 -0500 Subject: [PATCH 19/20] update patchlevel --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index 0aec1d28b..63e9d3316 100644 --- a/src/version.h +++ b/src/version.h @@ -27,5 +27,5 @@ */ #define EGG_STRINGVER "1.9.5" -#define EGG_NUMVER 1090504 -#define EGG_PATCH "needtls" +#define EGG_NUMVER 1090505 +#define EGG_PATCH "python" From 40f93b8a313f465dc6914f4baaf5e1921ba1e01a Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 14 Jan 2024 22:20:19 +0100 Subject: [PATCH 20/20] remove quick-logs option Found by: michaelortmann Patch by: michaelortmann Fixes: #1449 Line-buffer instead --- doc/sphinx_source/tutorials/setup.rst | 2 +- doc/sphinx_source/using/core.rst | 7 ----- eggdrop.conf | 6 ---- help/core.help | 1 - help/set/cmds1.help | 7 ----- src/main.c | 16 ++-------- src/misc.c | 45 +++------------------------ src/proto.h | 1 - src/tcl.c | 2 -- 9 files changed, 9 insertions(+), 78 deletions(-) diff --git a/doc/sphinx_source/tutorials/setup.rst b/doc/sphinx_source/tutorials/setup.rst index 364287924..a50d4de9c 100644 --- a/doc/sphinx_source/tutorials/setup.rst +++ b/doc/sphinx_source/tutorials/setup.rst @@ -158,7 +158,7 @@ Now that your Eggdrop is on IRC and you've introduced yourself as owner, it's ti No show? ~~~~~~~~ -If your bot didn't appear on IRC, you should log in to the shell and view the bot's logfile (the default in the config file is "logs/eggdrop.log"). Note that logfile entries are not written to disk immediately unless quick-logs is enabled, so you may have to wait a few minutes before the logfile appears, or contains messages that indicate why your bot isn't showing up. +If your bot didn't appear on IRC, you should log in to the shell and view the bot's logfile (the default in the config file is "logs/eggdrop.log"). Additionally, you can kill the bot via the command line (``kill pid``, the pid is shown to you when you started the bot or can be viewed by running ``ps x``) and then restart it with the -mnt flag, which will launch you directly into the partyline, to assist with troubleshooting. Note that if you use the -t flag, the bot will not persist and you will kill it once you quit the partyline. diff --git a/doc/sphinx_source/using/core.rst b/doc/sphinx_source/using/core.rst index bf560b351..f192c3cac 100644 --- a/doc/sphinx_source/using/core.rst +++ b/doc/sphinx_source/using/core.rst @@ -107,13 +107,6 @@ the logfile of the next day. reaches the size of 550 kilobytes. Note that this only works if you have keep-all-logs set to 0 (OFF). - set quick-logs 0 - This could be good if you have had a problem with logfiles filling - your quota/hard disk or if you log +p and publish it to the web, and - you need more up-to-date info. Note that this setting might increase - the CPU usage of your bot (on the other hand it will decrease your RAM - usage). - set raw-log 0 This setting allows you the logging of raw incoming server traffic via console/log flag 'r', raw outgoing server traffic via console/log mode diff --git a/eggdrop.conf b/eggdrop.conf index fedb6d919..86ac99e64 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -157,12 +157,6 @@ set max-logs 20 # have keep-all-logs 0 (OFF). set max-logsize 0 -# This could be good if you have had problem with the logfile filling -# your quota/hard disk or if you log +p and publish it to the web and -# need more up-to-date info. Note that this setting might increase the -# CPU usage of your bot (on the other hand it will decrease your mem usage). -set quick-logs 0 - # This setting allows you the logging of raw incoming server traffic via # console/log flag 'r', raw outgoing server traffic via console/log mode 'v', # raw incoming botnet traffic via console/log mode 't', raw outgoing botnet diff --git a/help/core.help b/help/core.help index 2f957cc9f..2c8d9d7bc 100644 --- a/help/core.help +++ b/help/core.help @@ -183,7 +183,6 @@ default-flags log-time timestamp-format max-logsize -quick-logs logfile-suffix quiet-save remote-boots diff --git a/help/set/cmds1.help b/help/set/cmds1.help index f6fead459..5d25fbbda 100644 --- a/help/set/cmds1.help +++ b/help/set/cmds1.help @@ -199,13 +199,6 @@ This value is in kilobytes, so '550' would mean cycle logs when it reaches the size of 550 kilobytes. Note that this only works if you have keep-all-logs 0 (OFF). -%{help=set quick-logs}%{+n} -### %bset quick-logs%b <0/1> - This could be good if you have had problem with the logfile - filling your quota/hard disk or if you log +p and publish it to - the web and need more up-to-date info. Note that this setting - might increase the CPU usage of your bot (on the other hand it will - decrease your mem usage). %{help=set logfile-suffix}%{+n} ### %bset logfile-suffix%b If keep-all-logs is 1, this setting will define the suffix of the diff --git a/src/main.c b/src/main.c index 74688099d..f698606a0 100644 --- a/src/main.c +++ b/src/main.c @@ -83,8 +83,7 @@ #endif extern char origbotname[], botnetnick[]; -extern int dcc_total, conmask, cache_hit, cache_miss, max_logs, quick_logs, - quiet_save; +extern int dcc_total, conmask, cache_hit, cache_miss, max_logs, quiet_save; extern struct dcc_t *dcc; extern struct userrec *userlist; extern struct chanset_t *chanset; @@ -179,7 +178,6 @@ void fatal(const char *s, int recoverable) int i; putlog(LOG_MISC, "*", "* %s", s); - flushlogs(); for (i = 0; i < dcc_total; i++) if (dcc[i].sock >= 0) killsock(dcc[i].sock); @@ -589,7 +587,6 @@ static void core_secondly() if (nowmins > lastmin) { memcpy(&nowtm, localtime(&now), sizeof(struct tm)); i = 0; - /* Once a minute */ ++lastmin; call_hook(HOOK_MINUTELY); @@ -610,10 +607,7 @@ static void core_secondly() if (((int) (nowtm.tm_min / 5) * 5) == (nowtm.tm_min)) { /* 5 min */ call_hook(HOOK_5MINUTELY); check_botnet_pings(); - if (!quick_logs) { - flushlogs(); - check_logsize(); - } + if (!miltime) { /* At midnight */ char s[25]; int j; @@ -661,10 +655,7 @@ static void core_minutely() { check_tcl_time_and_cron(&nowtm); do_check_timers(&timer); - if (quick_logs != 0) { - flushlogs(); - check_logsize(); - } + check_logsize(); } static void core_hourly() @@ -901,7 +892,6 @@ static void mainloop(int toplevel) putlog(LOG_MISC, "*", "%s", MOD_STAGNANT); } - flushlogs(); kill_tcl(); init_tcl(argc, argv); init_language(0); diff --git a/src/misc.c b/src/misc.c index 2418157a5..ee7ffc3d6 100644 --- a/src/misc.c +++ b/src/misc.c @@ -43,8 +43,7 @@ extern struct chanset_t *chanset; extern char helpdir[], version[], origbotname[], botname[], admin[], network[], motdfile[], ver[], botnetnick[], bannerfile[], textdir[]; -extern int backgrd, con_chan, term_z, use_stderr, dcc_total, keep_all_logs, - quick_logs; +extern int backgrd, con_chan, term_z, use_stderr, dcc_total, keep_all_logs; extern time_t now; extern Tcl_Interp *interp; @@ -579,9 +578,10 @@ void putlog (int type, char *chname, const char *format, ...) /* Open this logfile */ if (keep_all_logs) { snprintf(path, sizeof path, "%s%s", logs[i].filename, ct); - logs[i].f = fopen(path, "a"); - } else - logs[i].f = fopen(logs[i].filename, "a"); + if ((logs[i].f = fopen(path, "a"))) + setvbuf(logs[i].f, NULL, _IOLBF, 0); /* line buffered */ + } else if ((logs[i].f = fopen(logs[i].filename, "a"))) + setvbuf(logs[i].f, NULL, _IOLBF, 0); /* line buffered */ } if (logs[i].f != NULL) { /* Check if this is the same as the last line added to @@ -653,7 +653,6 @@ void logsuffix_change(char *s) } for (i = 0; i < max_logs; i++) { if (logs[i].f) { - fflush(logs[i].f); fclose(logs[i].f); logs[i].f = NULL; } @@ -678,7 +677,6 @@ void check_logsize() if (logs[i].f) { /* write to the log before closing it huh.. */ putlog(LOG_MISC, "*", MISC_CLOGS, logs[i].filename, ss.st_size); - fflush(logs[i].f); fclose(logs[i].f); logs[i].f = NULL; } @@ -693,39 +691,6 @@ void check_logsize() } } -/* Flush the logfiles to disk - */ -void flushlogs() -{ - int i; - - /* Logs may not be initialised yet. */ - if (!logs) - return; - - /* Now also checks to see if there's a repeat message and - * displays the 'last message repeated...' stuff too - */ - for (i = 0; i < max_logs; i++) { - if (logs[i].f != NULL) { - if ((logs[i].repeats > 0) && quick_logs) { - /* Repeat.. if quicklogs used then display 'last message - * repeated x times' and reset repeats. - */ - char stamp[33]; - - strftime(stamp, sizeof(stamp) - 1, log_ts, localtime(&now)); - fprintf(logs[i].f, "%s ", stamp); - fprintf(logs[i].f, MISC_LOGREPEAT, logs[i].repeats); - /* Reset repeats */ - logs[i].repeats = 0; - } - fflush(logs[i].f); - } - } -} - - /* * String substitution functions */ diff --git a/src/proto.h b/src/proto.h index e1e0868ac..463a087d6 100644 --- a/src/proto.h +++ b/src/proto.h @@ -228,7 +228,6 @@ void debug_mem_to_dcc(int); int egg_strcatn(char *, const char *, size_t); int my_strcpy(char *, char *); void putlog(int type, char *chname, const char *format, ...) ATTRIBUTE_FORMAT(printf,3,4); -void flushlogs(void); void check_logsize(void); void splitc(char *, char *, char); void splitcn(char *, char *, char, size_t); diff --git a/src/tcl.c b/src/tcl.c index db0d50d71..fe9b7eedf 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -87,7 +87,6 @@ int allow_dk_cmds = 1; int must_be_owner = 1; int quiet_reject = 1; int max_socks = 100; -int quick_logs = 0; int par_telnet_flood = 1; int quiet_save = 0; int strtot = 0; @@ -480,7 +479,6 @@ static tcl_ints def_tcl_ints[] = { {"max-socks", &max_socks, 0}, {"max-logs", &max_logs, 0}, {"max-logsize", &max_logsize, 0}, - {"quick-logs", &quick_logs, 0}, {"raw-log", &raw_log, 1}, {"protect-telnet", &protect_telnet, 0}, {"dcc-sanitycheck", &dcc_sanitycheck, 0},