From 80c3eeb9bc5794e46142cbdc7af86e533713f4d0 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:02:59 +0200 Subject: [PATCH 01/92] Move account bind to irc.mod and normalize account bind. accountname being "" means unknown, accountname being "*" is not logged into services. Account bind is triggered whenever a known account changes. Patch by: thommey --- doc/sphinx_source/using/tcl-commands.rst | 8 +- src/mod/irc.mod/chan.c | 110 +++++++++++------------ src/mod/irc.mod/irc.c | 105 +++++++++++++++------- src/mod/irc.mod/irc.h | 1 + src/mod/irc.mod/tclirc.c | 2 +- src/mod/server.mod/server.c | 19 +--- src/mod/server.mod/server.h | 4 +- src/mod/server.mod/servmsg.c | 45 ---------- 8 files changed, 143 insertions(+), 151 deletions(-) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index e928d0f61..715d28806 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -1157,7 +1157,9 @@ accounttracking getaccount [channel] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Returns: the services account name associated with nickname (if Eggdrop is configured to track account status), and "" if they are not logged in or Eggdrop is not able to determine the account status. WARNING: this account list may not be accurate depending on the server and configuration. This command is only accurate 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). + 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 [channel] @@ -3526,7 +3528,9 @@ The following is a list of bind types and how they work. Below each bind type is procname - Description: triggered when Eggdrop detects a change in a service account status. The change could be initiated by receiving an IRCv3 ACCOUNT message, receiving IRCv3 extended-join information when a user on an existing channel joins a new channel, or detecting an IRCv3 account-tag in a PRIVMSG. The mask for the bind is in the format "#channel nick!user@hostname.com account" where channel is the channel the user was found on when the bind was triggered, the hostmask is the user's hostmask, and account is the account name the user is logging in to, or "" for logging out. The mask argument can accept wildcards. For the proc, nick is the nickname of the user logging into/out of an account, user is the user@host.com hostmask, hand is the handle of the user (or * if none), and account is the name of the account the user logged in to (or "" if the user logged out of an account). + Description: this bind will trigger when eggdrop detects a change in the authentication status of a user's service account. The mask for the bind is in the format "#channel nick!user@hostname.com account" and accepts :ref:`Match Characters`. account is either the account name the user is logging in to or "*" if the user is not logged in to an account. + + 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 but this bind could be triggered late or never on account changes. Please see doc/ACCOUNTS for additional information. (54) ISUPPORT (stackable) diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index bdd6924d7..bba3be9b7 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -212,6 +212,32 @@ static void update_idle(char *chname, char *nick) } } +/* set user account on all members on all channels, + * trigger account bind if account state was not "unknown" (empty string) + */ +static void setaccount(char *nick, char *account) +{ + memberlist *m; + struct chanset_t *chan; + + for (chan = chanset; chan; chan = chan->next) { + if ((m = ismember(chan, nick))) { + if (rfc_casecmp(m->account, account)) { + /* account was known */ + if (m->account[0]) { + if (!strcmp(account, "*")) { + putlog(LOG_JOIN, chan->dname, "%s!%s has logged out of their account", nick, m->userhost); + } else { + putlog(LOG_JOIN, chan->dname, "%s!%s logged in to their account %s", nick, m->userhost, account); + } + check_tcl_account(m->nick, m->userhost, m->user, chan->dname, account); + } + strlcpy(m->account, account, sizeof m->account); + } + } + } +} + /* Returns the current channel mode. */ static char *getchanmode(struct chanset_t *chan) @@ -1163,10 +1189,8 @@ static int got324(char *from, char *msg) static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick, char *flags, char *account) { - char userhost[UHOSTLEN], mask[CHANNELLEN+UHOSTLEN+NICKMAX+2]; - struct chanset_t *acctchan; + char userhost[UHOSTLEN]; memberlist *m; - int empty_accounts; m = ismember(chan, nick); /* In my channel list copy? */ if (!m) { /* Nope, so update */ @@ -1216,25 +1240,11 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, /* Update accountname in channel records, 0 means logged out */ /* A 0 is not a change from "" */ if (account) { - empty_accounts = (!strcmp(account, "0") && (!strcmp(m->account, ""))); - /* If the account has changed... */ - if (strcmp(account, m->account) && !empty_accounts) { - for (acctchan = chanset; acctchan; acctchan = acctchan->next) { - if ((m = ismember(chan, nick))) { - if (strcmp(account, "0")) { - strlcpy(m->account, account, sizeof(m->account)); - snprintf(mask, sizeof mask, "%s %s", acctchan->dname, userhost); - if (strcasecmp(chan->dname, acctchan->dname)) { - } - } else { /* Explicitly clear, in case someone deauthenticated? */ - m->account[0] = 0; - snprintf(mask, sizeof mask, "%s %s", acctchan->dname, userhost); - if (strcasecmp(chan->dname, acctchan->dname)) { - } - } - } - } + if (!strcmp(account, "0")) { + /* normalize "logged out" to "*" */ + account = "*"; } + setaccount(nick, account); } return 0; } @@ -2046,12 +2056,11 @@ static void set_delay(struct chanset_t *chan, char *nick) */ static int gotjoin(char *from, char *channame) { - char *nick, *p, buf[UHOSTLEN], account[NICKMAX], *uhost = buf, *chname; - char *ch_dname = NULL, mask[CHANNELLEN+UHOSTLEN+NICKMAX+2]; + char *nick, *p, buf[UHOSTLEN], *uhost = buf, *chname; + char *ch_dname = NULL; int extjoin = 0; struct chanset_t *chan; - struct chanset_t *extchan; - memberlist *m, *n; + memberlist *m; masklist *b; struct capability *current; struct userrec *u; @@ -2183,42 +2192,23 @@ static int gotjoin(char *from, char *channame) strlcpy(m->userhost, uhost, sizeof m->userhost); m->user = u; m->flags |= STOPWHO; + if (extjoin) { - /* Update account for all channels the nick is on, not just this one */ - strlcpy(account, newsplit(&channame), sizeof account); - for (extchan = chanset; extchan; extchan = extchan->next) { - if ((n = ismember(extchan, nick))) { - if (strcmp(account, "*")) { - strlcpy (n->account, account, sizeof n->account); - } else { - n->account[0] = 0; - } - /* Don't trigger for the channel the user joined, but do trigger - * for other channels the user is already in - */ - if (strcasecmp(chname, extchan->dname)) { - snprintf(mask, sizeof mask, "%s %s", chname, from); - //check_tcl_account(nick, from, mask, u, extchan->dname, account); - } - } + /* calls check_tcl_account which can delete the channel */ + setaccount(nick, newsplit(&channame)); + + if (!(chan = findchan(chname)) && !(chan = findchan_by_dname(ch_dname ? ch_dname : chname))) { + /* The channel doesn't exist anymore, so get out of here. */ + goto exit; } } + check_tcl_join(nick, uhost, u, chan->dname); - /* The tcl binding might have deleted the current user and the - * current channel, so we'll now have to re-check whether they - * both still exist. - */ - chan = findchan(chname); - if (!chan) { - if (ch_dname) - chan = findchan_by_dname(ch_dname); - else - chan = findchan_by_dname(chname); - } - if (!chan) + if (!(chan = findchan(chname)) && !(chan = findchan_by_dname(ch_dname ? ch_dname : chname))) { /* The channel doesn't exist anymore, so get out of here. */ goto exit; + } /* The record saved in the channel record always gets updated, * so we can use that. */ @@ -2891,6 +2881,15 @@ static int gotnotice(char *from, char *msg) return 0; } +/* Got ACCOUNT message; only valid for account-notify capability */ +static int gotaccount(char *from, char *msg) { + char *nick = splitnick(&from); + fixcolon(msg); + /* nick!ident@host ACCOUNT xxx */ + setaccount(nick, msg); + return 0; +} + static int parse_maxlist(const char *value) { int tmpsum = 0, addtosum; @@ -3019,7 +3018,8 @@ static cmd_t irc_raw[] = { {"347", "", (IntFunc) got347, "irc:347"}, {"348", "", (IntFunc) got348, "irc:348"}, {"349", "", (IntFunc) got349, "irc:349"}, - {NULL, NULL, NULL, NULL} + {"ACCOUNT", "", (IntFunc) gotaccount, "irc:account"}, + {NULL, NULL, NULL, NULL} }; static cmd_t irc_isupport_binds[] = { diff --git a/src/mod/irc.mod/irc.c b/src/mod/irc.mod/irc.c index 3d36394bc..e60aad444 100644 --- a/src/mod/irc.mod/irc.c +++ b/src/mod/irc.mod/irc.c @@ -33,7 +33,7 @@ static p_tcl_bind_list H_topc, H_splt, H_sign, H_rejn, H_part, H_pub, H_pubm; static p_tcl_bind_list H_nick, H_mode, H_kick, H_join, H_need, H_invt, H_ircaway; -static p_tcl_bind_list H_monitor; +static p_tcl_bind_list H_monitor, H_account; static Function *global = NULL, *channels_funcs = NULL, *server_funcs = NULL; @@ -981,6 +981,22 @@ static void check_tcl_need(char *chname, char *type) MATCH_MASK | BIND_STACKABLE); } +static void check_tcl_account(char *nick, char *uhost, struct userrec *u, char *chan, char *account) +{ + char mask[1024]; + struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 }; + + snprintf(mask, sizeof mask, "%s %s!%s %s", chan, nick, uhost, account); + Tcl_SetVar(interp, "_acnt1", nick, 0); + Tcl_SetVar(interp, "_acnt2", uhost, 0); + Tcl_SetVar(interp, "_acnt3", u ? u->handle : "*", 0); + Tcl_SetVar(interp, "_acnt4", chan, 0); + Tcl_SetVar(interp, "_acnt5", account, 0); + check_tcl_bind(H_account, mask, &fr, + " $_acnt1 $_acnt2 $_acnt3 $_acnt4 $_acnt5", MATCH_MASK | BIND_STACKABLE); +} + + static tcl_strings mystrings[] = { {"opchars", opchars, 7, 0}, {NULL, NULL, 0, 0} @@ -1045,13 +1061,66 @@ static void flush_modes() } } +static void tell_account_tracking_status(int idx, int details) +{ + struct capability *current; + int extjoin = 0, notify = 0, tag = 0, whox = use_354; + /* List status of account tracking. For 100% accuracy, this requires + * WHOX ability (354 messages) and the extended-join and account-notify + * capabilities to be enabled. + */ + /* Check if CAPs are enabled */ + current = cap; + while (current != NULL) { + if (!strcasecmp("extended-join", current->name) && current->enabled) { + extjoin = 1; + } else if (!strcasecmp("account-notify", current->name) && current->enabled) { + notify = 1; + } else if (!strcasecmp("account-tag", current->name) && current->enabled) { + tag = 1; + } + current = current->next; + } + + if (whox && notify && extjoin) { + dprintf(idx, "%s", " Account tracking: Enabled\n"); + } else { + if (!details) { + dprintf(idx, " Account tracking: Best-effort (Missing capabilities:%s%s%s%s)\n", + whox ? "" : " WHOX", notify ? "" : " account-notify", extjoin ? "" : " extended-join", + details ? "" : ", see .status all for details"); + } else { + dprintf(idx, " Account tracking: Best-effort\n"); + if (!whox) { + dprintf(idx, "%s", " - WHOX missing => Accounts will NOT be known after Eggdrop joins a channel (raw 315)\n"); + } else { + dprintf(idx, "%s", " - WHOX enabled => Accounts will be known after Eggdrop joins a channel (raw 315)\n"); + } + + if (!notify) { + dprintf(idx, "%s", " - account-notify missing => Accounts will NOT update immediately when users log in or out\n"); + } else { + dprintf(idx, "%s", " - account-notify enabled => Accounts will update immediately when users log in or out\n"); + } + if (!extjoin) { + dprintf(idx, "%s", " - extended-join missing => Accounts will NOT be known immediately when a user joins (bind join)\n"); + } else { + dprintf(idx, "%s", " - extended-join enabled => Accounts will be known immediately when a user joins (bind join)\n"); + } + if (tag && (!whox || !notify || !extjoin)) { + dprintf(idx, "%s", " - account-tag enabled => Accounts will update whenever someone messages a channel or this bot\n"); + } + dprintf(idx, "%s", " See doc/ACCOUNT for more details\n"); + } + } +} + static void irc_report(int idx, int details) { struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; char ch[1024], q[256], *p; - int k, l, extjoin, acctnotify; + int k, l; struct chanset_t *chan; - struct capability *current; strcpy(q, "Channels: "); k = 10; @@ -1084,33 +1153,7 @@ static void irc_report(int idx, int details) q[k - 2] = 0; dprintf(idx, " %s\n", q); } - /* List status of account tracking. For 100% accuracy, this requires - * WHOX ability (354 messages) and the extended-join and account-notify - * capabilities to be enabled. - */ - /* Check if CAPs are enabled */ - current = cap; - extjoin = 0; - acctnotify = 0; - while (current != NULL) { - if (!strcasecmp("extended-join", current->name)) { - extjoin = current->enabled ? 1 : 0; - } - if (!strcasecmp("account-notify", current->name)) { - acctnotify = current->enabled ? 1 : 0; - } - current = current->next; - } - - if (use_354 && extjoin && acctnotify) { - dprintf(idx, " Account tracking: Enabled\n"); - } else { - dprintf(idx, " Account tracking: Disabled\n" - " (Missing capabilities:%s%s%s)\n", - use_354 ? "" : " use-354", - extjoin ? "" : " extended-join", - acctnotify ? "" : " account-notify"); - } + tell_account_tracking_status(idx, details); } /* Many networks either support max_bans/invite/exempts/ *or* @@ -1296,6 +1339,7 @@ static char *irc_close() del_bind_table(H_need); del_bind_table(H_ircaway); del_bind_table(H_monitor); + del_bind_table(H_account); rem_tcl_strings(mystrings); rem_tcl_ints(myints); rem_builtins(H_dcc, irc_dcc); @@ -1426,6 +1470,7 @@ char *irc_start(Function *global_funcs) H_need = add_bind_table("need", HT_STACKABLE, channels_2char); H_ircaway = add_bind_table("ircaway", HT_STACKABLE, channels_5char); H_monitor = add_bind_table("monitor", HT_STACKABLE, monitor_2char); + H_account = add_bind_table("account", HT_STACKABLE, channels_5char); do_nettype(); return NULL; } diff --git a/src/mod/irc.mod/irc.h b/src/mod/irc.mod/irc.h index 423617e35..737eb400f 100644 --- a/src/mod/irc.mod/irc.h +++ b/src/mod/irc.mod/irc.h @@ -48,6 +48,7 @@ static int check_tcl_pub(char *, char *, char *, char *); static int check_tcl_ircaway(char *, char *, char *, struct userrec *, char *, char*); static int check_tcl_monitor(char *, int); +static void check_tcl_account(char *nick, char *uhost, struct userrec *u, char *chan, char *account); static int me_op(struct chanset_t *); static int me_halfop(struct chanset_t *); static int me_voice(struct chanset_t *); diff --git a/src/mod/irc.mod/tclirc.c b/src/mod/irc.mod/tclirc.c index e622a1885..ea5bef5fe 100644 --- a/src/mod/irc.mod/tclirc.c +++ b/src/mod/irc.mod/tclirc.c @@ -587,7 +587,7 @@ static int tcl_accounttracking STDVAR acctnotify = 1; } Tcl_SetResult(irp, use_354 && extjoin && acctnotify ? "1" : "0", NULL); - return TCL_OK; + return TCL_OK; } static int tcl_getchanhost STDVAR diff --git a/src/mod/server.mod/server.c b/src/mod/server.mod/server.c index 8e40be533..a1721ff00 100644 --- a/src/mod/server.mod/server.c +++ b/src/mod/server.mod/server.c @@ -105,7 +105,7 @@ static char sslserver = 0; #endif static p_tcl_bind_list H_wall, H_raw, H_notc, H_msgm, H_msg, H_flud, H_ctcr, - H_ctcp, H_out, H_rawt, H_account; + H_ctcp, H_out, H_rawt; static void empty_msgq(void); static void next_server(int *, char *, unsigned int *, char *); @@ -1279,17 +1279,6 @@ static int server_msg STDVAR return TCL_OK; } -static int server_account STDVAR -{ - Function F = (Function) cd; - - BADARGS(6, 6, " nick uhost hand chan account"); - - CHECKVALIDITY(server_account); - F(argv[1], argv[2], get_user_by_handle(userlist, argv[3]), argv[4], argv[5]); - return TCL_OK; -} - static int server_raw STDVAR { Function F = (Function) cd; @@ -2139,7 +2128,6 @@ static char *server_close() isupport_fini(); /* Restore original commands. */ del_bind_table(H_wall); - del_bind_table(H_account); del_bind_table(H_raw); del_bind_table(H_rawt); del_bind_table(H_notc); @@ -2246,7 +2234,7 @@ static Function server_table[] = { /* 40 - 43 */ (Function) & H_out, /* p_tcl_bind_list */ (Function) & net_type_int, /* int */ - (Function) & H_account, /* p_tcl_bind)list */ + (Function) NULL, /* was H_account, now irc.mod */ (Function) & cap, /* capability_t */ /* 44 - 47 */ (Function) & extended_join, /* int */ @@ -2255,7 +2243,7 @@ static Function server_table[] = { (Function) & isupport_get, /* */ /* 48 - 52 */ (Function) & isupport_parseint,/* */ - (Function) check_tcl_account, + (Function) NULL, /* was check_tcl_account, now irc.mod */ (Function) & find_capability, (Function) encode_msgtags }; @@ -2358,7 +2346,6 @@ char *server_start(Function *global_funcs) TCL_TRACE_READS | TCL_TRACE_WRITES | TCL_TRACE_UNSETS, traced_nicklen, NULL); H_wall = add_bind_table("wall", HT_STACKABLE, server_2char); - H_account = add_bind_table("account", HT_STACKABLE, server_account); H_raw = add_bind_table("raw", HT_STACKABLE, server_raw); H_rawt = add_bind_table("rawt", HT_STACKABLE, server_rawt); H_notc = add_bind_table("notc", HT_STACKABLE, server_5char); diff --git a/src/mod/server.mod/server.h b/src/mod/server.mod/server.h index ba7817525..9c523751d 100644 --- a/src/mod/server.mod/server.h +++ b/src/mod/server.mod/server.h @@ -86,7 +86,7 @@ /* 40 - 43 */ #define H_out (*(p_tcl_bind_list *)(server_funcs[40])) #define net_type_int (*(int *)(server_funcs[41])) -#define H_account (*(p_tcl_bind_list *)(server_funcs[42])) +/* #define H_account unused */ #define cap (*(capability_t **)(server_funcs[43])) /* 44 - 47 */ #define extended_join (*(int *)(server_funcs[44])) @@ -95,7 +95,7 @@ #define isupport_get ((struct isupport *(*)(const char *, size_t))(server_funcs[47])) /* 48 - 51 */ #define isupport_parseint ((int (*)(const char *, const char *, int, int, int, int, int *))(server_funcs[48])) -#define check_tcl_account ((int (*)(char *,char *,char *,struct userrec *,char *,char *))server_funcs[49]) +/* #define check_tcl_account NULL */ #define find_capability ((struct capability *(*)(char *))(server_funcs[50])) #define encode_msgtags ((char *(*)(Tcl_Obj *))(server_funcs[51])) #endif /* MAKING_SERVER */ diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 09ef62f9c..2c34d6340 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -259,22 +259,6 @@ static int check_tcl_wall(char *from, char *msg) return 1; } -static int check_tcl_account(char *nick, char *uhost, char *mask, - struct userrec *u, char *chan, char *account) -{ - struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 }; - int x; - - Tcl_SetVar(interp, "_acnt1", nick, 0); - Tcl_SetVar(interp, "_acnt2", uhost, 0); - Tcl_SetVar(interp, "_acnt3", u ? u->handle : "*", 0); - Tcl_SetVar(interp, "_acnt4", chan, 0); - Tcl_SetVar(interp, "_acnt5", account, 0); - x = check_tcl_bind(H_account, mask, &fr, - " $_acnt1 $_acnt2 $_acnt3 $_acnt4 $_acnt5", MATCH_MASK | BIND_STACKABLE); - return (x == BIND_EXEC_LOG); -} - static int check_tcl_flud(char *nick, char *uhost, struct userrec *u, char *ftype, char *chname) { @@ -1646,34 +1630,6 @@ static int handle_sasl_timeout() return sasl_error("timeout"); } -/* Got ACCOUNT message; only valid for account-notify capability */ -static int gotaccount(char *from, char *msg) { - struct chanset_t *chan; - struct userrec *u; - memberlist *m; - char *nick, *chname, mask[CHANNELLEN+UHOSTLEN+NICKMAX+2]; - - u = get_user_by_host(from); - nick = splitnick(&from); - for (chan = chanset; chan; chan = chan->next) { - chname = chan->dname; - if ((m = ismember(chan, nick))) { - strlcpy (m->account, msg[0] == '*' ? "" : msg, sizeof m->account); - snprintf(mask, sizeof mask, "%s %s", chname, from); - if (!strcasecmp(msg, "*")) { - msg[0] = '\0'; - putlog(LOG_JOIN, chname, "%s!%s has logged out of their " - "account", nick, from); - } else { - putlog(LOG_JOIN, chname, "%s!%s has logged into account %s", - nick, from, msg); - } - check_tcl_account(nick, from, mask, u, chname, msg[0] == '*' ? "" : msg); - } - } - return 0; -} - /* * 465 ERR_YOUREBANNEDCREEP :You are banned from this server */ @@ -2085,7 +2041,6 @@ static cmd_t my_raw_binds[] = { {"KICK", "", (IntFunc) gotkick, NULL}, {"CAP", "", (IntFunc) gotcap, NULL}, {"AUTHENTICATE", "", (IntFunc) gotauthenticate, NULL}, - {"ACCOUNT", "", (IntFunc) gotaccount, NULL}, {"CHGHOST", "", (IntFunc) gotchghost, NULL}, {"SETNAME", "", (IntFunc) gotsetname, NULL}, {NULL, NULL, NULL, NULL} From f6703baa574d7c34acef43ddb3ab1bee1140d94a Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:04:52 +0200 Subject: [PATCH 02/92] Raw and rawt bind now support wildcards, necessary for account-tag usage --- doc/sphinx_source/using/tcl-commands.rst | 12 ++++++------ src/mod/server.mod/servmsg.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 715d28806..5a41089a0 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -3137,13 +3137,13 @@ The following is a list of bind types and how they work. Below each bind type is (17) RAW (stackable) - bind raw + bind raw procname - IMPORTANT: While not necessarily deprecated, this bind has been supplanted by the RAWT bind as of 1.9.0. You probably want to be using RAWT, not RAW. + IMPORTANT: While not necessarily deprecated, this bind has been supplanted by the RAWT bind, which supports the IRCv3 message-tags capability, as of 1.9.0. You probably want to be using RAWT, not RAW. - Description: previous versions of Eggdrop required a special compile option to enable this binding, but it's now standard. The keyword is either a numeric, like "368", or a keyword, such as "PRIVMSG". "from" will be the server name or the source user (depending on the keyword); flags are ignored. The order of the arguments is identical to the order that the IRC server sends to the bot. The pre-processing only splits it apart enough to determine the keyword. If the proc returns 1, Eggdrop will not process the line any further (this could cause unexpected behavior in some cases), although RAWT binds are processed before RAW binds (and thus, a RAW bind cannot block a RAWT bind). The RAW bind does not support the IRCv3 message-tags capability, please see RAWT for more information. + Description: The mask can contain wildcards and is matched against the keyword, which is either a numeric, like "368", or a keyword, such as "PRIVMSG". "from" will be the server name or the source nick!ident@host (depending on the keyword); flags are ignored. If the proc returns 1, Eggdrop will not process the line any further (this could cause unexpected behavior in some cases), although RAWT binds are processed before RAW binds (and thus, a RAW bind cannot block a RAWT bind). Module: server @@ -3516,11 +3516,11 @@ The following is a list of bind types and how they work. Below each bind type is (52) RAWT (stackable) - bind rawt + bind rawt - procname + procname - Description: similar to the RAW bind, but allows an extra field for the IRCv3 message-tags capability. The keyword is either a numeric, like "368", or a keyword, such as "PRIVMSG" or "TAGMSG". "from" will be the server name or the source user (depending on the keyword); flags are ignored. "tag" will be the contents, if any, of the entire tag message prefixed to the server message in a dict format, such as "msgid 890157217279768 aaa bbb". The order of the arguments is identical to the order that the IRC server sends to the bot. If the proc returns 1, Eggdrop will not process the line any further, to include not being processed by a RAW bind (this could cause unexpected behavior in some cases). As of 1.9.0, it is recommended to use the RAWT bind instead of the RAW bind. + Description: similar to the RAW bind, but allows an extra field for the IRCv3 message-tags capability. The mask can contain wildcards and is matched against the keyword which is either a numeric, like "368", or a keyword, such as "PRIVMSG" or "TAGMSG". "from" will be the server name or the source nick!ident@host (depending on the keyword); flags are ignored. "tag" is a dictionary (flat key/value list) of the message tags with "" for empty values (e.g. "account eggdrop realname LamestBot"). If the proc returns 1, Eggdrop will not process the line any further, to include not being processed by a RAW bind (this could cause unexpected behavior in some cases). As of 1.9.0, it is recommended to use the RAWT bind instead of the RAW bind. (53) ACCOUNT (stackable) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 2c34d6340..56089f1ed 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -196,7 +196,7 @@ static int check_tcl_raw(char *from, char *code, char *msg) Tcl_SetVar(interp, "_raw2", code, 0); Tcl_SetVar(interp, "_raw3", msg, 0); x = check_tcl_bind(H_raw, code, 0, " $_raw1 $_raw2 $_raw3", - MATCH_EXACT | BIND_STACKABLE | BIND_WANTRET); + MATCH_MASK | BIND_STACKABLE | BIND_WANTRET); /* Return 1 if processed */ return (x == BIND_EXEC_LOG); @@ -212,7 +212,7 @@ static int check_tcl_rawt(char *from, char *code, char *msg, char *tagdict) Tcl_SetVar(interp, "_rawt3", msg, 0); Tcl_SetVar(interp, "_rawt4", tagdict, 0); x = check_tcl_bind(H_rawt, code, 0, " $_rawt1 $_rawt2 $_rawt3 $_rawt4", - MATCH_EXACT | BIND_STACKABLE | BIND_WANTRET); + MATCH_MASK | BIND_STACKABLE | BIND_WANTRET); return (x == BIND_EXEC_LOG); } From 098b459ab592e2fa2402b27309ca561c3d0a630c Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:05:21 +0200 Subject: [PATCH 03/92] Document how to wildcard match against an asterisk (*) --- doc/sphinx_source/using/tcl-commands.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 5a41089a0..ea19d7869 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -3718,6 +3718,9 @@ are the four special characters: +-----+--------------------------------------------------------------------------+ | ~ | matches 1 or more space characters (can be used for whitespace between | | | words) (This char only works in binds, not in regular matching) | ++-----+--------------------------------------------------------------------------+ +| \\* | matches a literal \*, but please note that Tcl needs escaping as well, | +| | so a bind would have to use "\\*" or {\*} for a mask argument | +-----+--------------------------------------------------------------------------+ Copyright (C) 1999 - 2022 Eggheads Development Team From a9048c3e03d05fe849792e284e4d854614714d6d Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:06:08 +0200 Subject: [PATCH 04/92] Eggdrop no longer interprets WHO response it didn't request in the WHOX case The response could have different arguments, so we now validate our query type parameter is in the response. Tcl scripts wanting to poll WHO and eggdrop to parse it, must send query type 222 in the same format as eggdrop requests it. Found by: Geo Patch by: thommey --- src/mod/irc.mod/chan.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index bba3be9b7..63a75f2ab 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -1311,9 +1311,10 @@ static int got354(char *from, char *msg) if (use_354) { newsplit(&msg); /* Skip my nick - efficiently */ - if (!strncmp(msg, "222", strlen("222"))) { - newsplit(&msg); /* Skip our query-type magic number" */ + if (strncmp(msg, "222", strlen("222"))) { + return 0; /* ignore request without our query type, could be different arguments */ } + newsplit(&msg); /* Skip our query-type magic number" */ if (msg[0] && (strchr(CHANMETA, msg[0]) != NULL)) { chname = newsplit(&msg); /* Grab the channel */ chan = findchan(chname); /* See if I'm on channel */ From d7169ac55d5daeaef4a3bb06415c82d1b1429248 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:07:17 +0200 Subject: [PATCH 05/92] Offer the option to use account-tag for imperfect tracking It must be explicitely enabled in the configuration. The requirements for perfect tracking are now enabled by default. Patch by: thommey --- eggdrop.conf | 13 +++++++++---- src/mod/irc.mod/chan.c | 17 +++++++++++++++++ src/mod/irc.mod/irc.c | 1 + src/mod/server.mod/server.c | 1 + src/mod/server.mod/servmsg.c | 5 ++++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/eggdrop.conf b/eggdrop.conf index 8464bfcee..f1ccfd7b8 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -1158,18 +1158,23 @@ server add ssl.example.net +7000 #set sasl-timeout 15 # To request the account-notify feature via CAP, set this to 1 -#set account-notify 0 +set account-notify 1 # To request the extended-join feature via CAP, set this to 1 -#set extended-join 0 +set extended-join 1 # To request the invite-notify feature via CAP, set this to 1 #set invite-notify 0 -# To request the message-tags feature via CAP, set this to 1. NOTE: Enabling -# this feature may interfere with RAW binds in scripts. +# To request the message-tags feature via CAP, set this to 1 #set message-tags 0 +# To request the account-tag feature via CAP, set this to 1 +# This can be enabled if necessary for imperfect account tracking if you don't +# have the WHOX (use_354), account-notify and extended-join features available +# see doc/ACCOUNT for details +#set account-tag 0 + # If you have any additional CAP features you would like to request at # registration but are not listed above, set them here as space separated # strings. Setting features here does not guarantee Eggdrop's ability to support diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index 63a75f2ab..52d385190 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -2982,6 +2982,18 @@ static int irc_isupport(char *key, char *isset_str, char *value) return 0; } +static int gotrawt(char *from, char *msg, Tcl_Obj *tags) { + Tcl_Obj *valueobj; + if (TCL_OK != Tcl_DictObjGet(interp, tags, Tcl_NewStringObj("account", -1), &valueobj)) { + putlog(LOG_MISC, "*", "ERROR: irc:rawt called with invalid dictionary"); + return 0; + } + if (valueobj) { + setaccount(splitnick(&from), Tcl_GetString(valueobj)); + } + return 0; +} + static cmd_t irc_raw[] = { {"324", "", (IntFunc) got324, "irc:324"}, {"352", "", (IntFunc) got352, "irc:352"}, @@ -3023,6 +3035,11 @@ static cmd_t irc_raw[] = { {NULL, NULL, NULL, NULL} }; +static cmd_t irc_rawt[] = { + {"*", "", (IntFunc) gotrawt, "irc:rawt"}, + {NULL, NULL, NULL, NULL} +}; + static cmd_t irc_isupport_binds[] = { {"*", "", (IntFunc) irc_isupport, "irc:isupport"}, {NULL, NULL, NULL, NULL} diff --git a/src/mod/irc.mod/irc.c b/src/mod/irc.mod/irc.c index e60aad444..ae5eeaa87 100644 --- a/src/mod/irc.mod/irc.c +++ b/src/mod/irc.mod/irc.c @@ -1452,6 +1452,7 @@ char *irc_start(Function *global_funcs) add_builtins(H_dcc, irc_dcc); add_builtins(H_msg, C_msg); add_builtins(H_raw, irc_raw); + add_builtins(H_rawt, irc_rawt); add_builtins(H_isupport, irc_isupport_binds); add_tcl_commands(tclchan_cmds); add_help_reference("irc.help"); diff --git a/src/mod/server.mod/server.c b/src/mod/server.mod/server.c index a1721ff00..7453c6386 100644 --- a/src/mod/server.mod/server.c +++ b/src/mod/server.mod/server.c @@ -1661,6 +1661,7 @@ static tcl_ints my_tcl_ints[] = { {"message-tags", &message_tags, 0}, {"extended-join", &extended_join, 0}, {"account-notify", &account_notify, 0}, + {"account-tag", &account_tag, 0}, {NULL, NULL, 0} }; diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 56089f1ed..9b029f22b 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -40,7 +40,7 @@ static int multistatus = 0, count_ctcp = 0; static char altnick_char = 0; struct capability *cap; struct capability *find_capability(char *capname); -int account_notify, extended_join; +int account_notify = 1, extended_join = 1, account_tag = 0; Tcl_Obj *ncapeslist; /* We try to change to a preferred unique nick here. We always first try the @@ -1843,6 +1843,9 @@ static int gotcap(char *from, char *msg) { } else if (!strcmp(current->name, "account-notify") && (account_notify) && (!current->enabled)) { add_req(current->name); + } else if (!strcmp(current->name, "account-tag") && (account_tag) + && (!current->enabled)) { + add_req(current->name); } else if (!strcmp(current->name, "extended-join") && (extended_join) && (!current->enabled)) { add_req(current->name); From 0f036d59eb88d112405a17a19541fe1fa1cf2f15 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:08:03 +0200 Subject: [PATCH 06/92] Format fix for .channel --- src/mod/irc.mod/cmdsirc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mod/irc.mod/cmdsirc.c b/src/mod/irc.mod/cmdsirc.c index 0db64e93c..66179ba6d 100644 --- a/src/mod/irc.mod/cmdsirc.c +++ b/src/mod/irc.mod/cmdsirc.c @@ -853,11 +853,11 @@ static void cmd_channel(struct userrec *u, int idx, char *par) else chanflag = ' '; if (chan_issplit(m)) { - dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- netsplit, %fs\n", + dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- netsplit, %fs\n", chanflag, maxnicklen, m->nick, maxhandlen, handle, maxnicklen, m->account, s, atrflag, difftime(now, m->split)); } else if (!rfc_casecmp(m->nick, botname)) { - dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- it's me!\n", chanflag, + dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- it's me!\n", chanflag, maxnicklen, m->nick, maxhandlen, handle, maxnicklen, m->account, s, atrflag); } else { From 0a741bdad116a876d59e7051ff0d32422eafa6a0 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 18 Sep 2022 21:26:51 +0200 Subject: [PATCH 07/92] Move away and account change logs from console +j to +m Found by: Geo Patch by: Geo, thommey --- src/mod/irc.mod/chan.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index 52d385190..94776aed6 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -226,9 +226,9 @@ static void setaccount(char *nick, char *account) /* account was known */ if (m->account[0]) { if (!strcmp(account, "*")) { - putlog(LOG_JOIN, chan->dname, "%s!%s has logged out of their account", nick, m->userhost); + putlog(LOG_MODES, chan->dname, "%s!%s has logged out of their account", nick, m->userhost); } else { - putlog(LOG_JOIN, chan->dname, "%s!%s logged in to their account %s", nick, m->userhost, account); + putlog(LOG_MODES, chan->dname, "%s!%s logged in to their account %s", nick, m->userhost, account); } check_tcl_account(m->nick, m->userhost, m->user, chan->dname, account); } @@ -1415,10 +1415,10 @@ static int gotaway(char *from, char *msg) if (strlen(msg)) { m->flags |= IRCAWAY; fixcolon(msg); - putlog(LOG_JOIN, chan->dname, "%s is now away: %s", from, msg); + putlog(LOG_MODES, chan->dname, "%s is now away: %s", from, msg); } else { m->flags &= ~IRCAWAY; - putlog(LOG_JOIN, chan->dname, "%s has returned from away status", from); + putlog(LOG_MODES, chan->dname, "%s has returned from away status", from); } } } @@ -3043,4 +3043,4 @@ static cmd_t irc_rawt[] = { static cmd_t irc_isupport_binds[] = { {"*", "", (IntFunc) irc_isupport, "irc:isupport"}, {NULL, NULL, NULL, NULL} -}; \ No newline at end of file +}; From 1191c7599c3b5f4206a90f0b4f10553f05664fbe Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 18 Sep 2022 17:32:54 -0400 Subject: [PATCH 08/92] Add ACCOUNTS doc Patch by: Geo --- doc/html/using/accounts.html | 219 +++++++++++++++++++++++ doc/sphinx_source/index.rst | 1 + doc/sphinx_source/using/accounts.rst | 81 +++++++++ doc/sphinx_source/using/tcl-commands.rst | 36 ++-- eggdrop.conf | 2 +- misc/generatedocs | 1 + src/mod/irc.mod/irc.c | 2 +- 7 files changed, 324 insertions(+), 18 deletions(-) create mode 100644 doc/html/using/accounts.html create mode 100644 doc/sphinx_source/using/accounts.rst diff --git a/doc/html/using/accounts.html b/doc/html/using/accounts.html new file mode 100644 index 000000000..3ac3b9b4b --- /dev/null +++ b/doc/html/using/accounts.html @@ -0,0 +1,219 @@ + + + + + + + + Account tracking in Eggdrop — Eggdrop 1.9.3 documentation + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+ +
+

Account tracking in Eggdrop

+

In Eggdrop 1.9.3, Eggdrop added the ability to associate nicknames with the service accounts they are logged into. It is IMPORTANT to note that Eggdrop’s ability to do this is dependent on an IRC server’s implementation of three features- the IRCv3 extended-join capability, the IRCv3 account-notify capability, and WHOX support. All three of these features must be supported by the server and, in the case of extended-join and account-notify, requested by Eggdrop in order for Eggdrop to maintain “perfect” association between nicknames and account statuses.

+
+

Required Server Capabilities

+

You’re going to see this repeated a lot- the IRC server must support three features in order for Eggdrop to accurately associate accounts with nicknames. These three features allow Eggdrop to always know the current association between an account and a nickname by getting account statuses of users already on a channel when it joins, new users joining a channel, and users who authenticate while on a channel.

+
+

extended-join

+

extended-join is an IRCv3-defined capability that adds the account name of a user to the JOIN message sent by the IRC server, alerting clients that a new member has joined a channel. Enabling this capability allows Eggdrop to immediately determine the account name associated with a user joining a channel

+
+
+

account-notify

+

account-notify is an IRCv3-defined capability that sends a message to a channel when a member of the channel either authenticates or deauthenticates from their account. Enabling this capability allows Eggdrop to immediately associate an account to a channel member when they authenticate or deauthenticate.

+
+
+

WHOX

+

‘WHOX <https://ircv3.net/specs/extensions/whox>`_ is a server feature that allows a client to request custom fields to be returned in a WHO response. If a server supports this capability, Eggdrop sends a WHOX query to the server when it joins a channel, allowing it to immediately determine accounts associated with channel members when Eggdrop joins a channel.

+
+
+
+

Enabling Eggdrop Account Tracking

+

By default, the Eggdrop config file will attempt to enable all the capabilities required for account tracking. There are two settings to pay attention to

+
# To request the account-notify feature via CAP, set this to 1
+set account-notify 1
+
+# To request the extended-join feature via CAP, set this to 1
+set extended-join 1
+
+
+

The ability of a server to support WHOX queries is determined via a server’s ISUPPORT (005) reply. If a server supports WHOX queries, Eggdrop will automatically enable this feature.

+
+
+

Checking Account-tracking Status

+

While Eggdrop is running, join the partyline and type .status. If account-tracking is enabled (both the server supports and Eggdrop has requested), you’ll see this line

+
Loaded module information:
+  #eggdroptest        : (not on channel)
+  Channels: #eggdroptest (trying)
+  Account tracking: Enabled           <--- This line
+  Online as: BeerBot (BeerBot)
+
+
+

Otherwise, the prompt will tell you which required capability is missing/not enabled

+
Loaded module information:
+  #eggdroptest        :   2 members, enforcing "+tn" (greet)
+  Channels: #eggdroptest (need ops)
+  Account tracking: Best-effort (Missing capabilities: extended-join, see .status all for details)      <---- This line
+  Online as: Eggdrop (Eggdrop)
+
+
+
+
+

Determining if a Server Supports Account Capabilities

+

A server announces the capabilities it supports via a CAP request. If you have Tcl enabled on the partyline (or via a raw message from a client), you can send .tcl cap ls and see if the extended-join and account-notify capabilities are supported by the server. If they are not listed, the server does not support it.

+

A server announces if it supports WHOX via its ISUPPORT (005) announcement. If you have Tcl enabled on the partyline, you can send .tcl issupport isset WHOX and if it returns ‘1’, WHOX is supported by the server.

+
+
+

Best-Effort Account Tracking

+

If a server only supports some, but not all, of the required capabilities, Eggdrop will switch to ‘best effort’ account tracking. This means Eggdrop will update account statuses whenever it sees account information, but Eggdrop cannnot guarantee the accuracy of account association at any given time.

+

If a server does not support extended-join, Eggdrop will not be able to determine the account associated with a user when they join. Eggdrop can update this information by sending a WHOX to the server.

+

If a server does not support account-notify, Eggdrop will not be able to determine the account assoicated with a user if they authenticate/deauthenticate from their account after joining a channel. Eggdrop can update this information by sending a WHOX to the server.

+

If a server does not support WHOX, Eggdrop will not be able to determine the accounts associated with users already on a channel before Eggdrop joined. There is no reliable way to update this information.

+

One workaround to significantly increase the accuracy of account tracking for scripts in a ‘best effort’ scenario would be to issue a WHOX query (assuming the server supports it), wait for the reply from the eserver, and then query for the account information.

+
+

account-tag

+

One supplementary capability that can assist a best-effort account tracking scenario is the IRCv3-defined account-tag capability. The account-tag capability attaches a tag with the account name associated with the user sending a command. Enabling this capability allows Eggdrop to update its account tracking every time a user talks in channel, sets a mode, sends a kick, etc. While still not able to offer the same level of accuracy as enabling the “main three” account tracking features, it can increase the accuracy and can help with scripts that react to user commands/messages.

+
+
+
+

Using Accounts with Tcl Scripts

+

The Eggdrop Tcl ACCOUNT bind is triggered whenver an existing account record stored by Eggdrop is modified, such as a user de/authenticating to their account while in a channel, or information such as an account-tag being seen that updates an existing user. However, the ACCOUNT bind will NOT be triggered for the creation of a new user record, such as a user joining a channel. The bind is triggered for every channel the user is seen on- this means if a user is present with Eggdrop on four channels, the bind will be executed four times, each time with a different channel variable being passed to the associated Tcl procedure. Additionally, in a best-effort account tracking situation, Eggdrop will update the account associated with a user on all channels, not just the channel the event is seen on (and thus resulting in a bind trigger for each channel the user is on).

+

In order to trigger Tcl script events to cover all instances where a user logs in, you need to pair an ACCOUNT bind with a JOIN bind. This will allow you to execute account-based events when a user joins as well as if they authenticate after joining.

+
+
+ + +
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/doc/sphinx_source/index.rst b/doc/sphinx_source/index.rst index 3f3eae599..dca64902a 100644 --- a/doc/sphinx_source/index.rst +++ b/doc/sphinx_source/index.rst @@ -61,6 +61,7 @@ The Eggheads development team can be found lurking on #eggdrop on the Libera net using/ipv6 using/tls using/ircv3 + using/accounts using/pbkdf2info using/twitchinfo using/tricks diff --git a/doc/sphinx_source/using/accounts.rst b/doc/sphinx_source/using/accounts.rst new file mode 100644 index 000000000..9791ca847 --- /dev/null +++ b/doc/sphinx_source/using/accounts.rst @@ -0,0 +1,81 @@ +Account tracking in Eggdrop +=========================== + +In Eggdrop 1.9.3, Eggdrop added the ability to associate nicknames with the service accounts they are logged into. It is IMPORTANT to note that Eggdrop's ability to do this is dependent on an IRC server's implementation of three features- the IRCv3 extended-join capability, the IRCv3 account-notify capability, and WHOX support. All three of these features must be supported by the server and, in the case of extended-join and account-notify, requested by Eggdrop in order for Eggdrop to maintain "perfect" association between nicknames and account statuses. + +Required Server Capabilities +---------------------------- +You're going to see this repeated a lot- the IRC server must support three features in order for Eggdrop to accurately associate accounts with nicknames. These three features allow Eggdrop to always know the current association between an account and a nickname by getting account statuses of users already on a channel when it joins, new users joining a channel, and users who authenticate while on a channel. + +extended-join +^^^^^^^^^^^^^ +`extended-join `_ is an IRCv3-defined capability that adds the account name of a user to the JOIN message sent by the IRC server, alerting clients that a new member has joined a channel. Enabling this capability allows Eggdrop to immediately determine the account name associated with a user joining a channel + +account-notify +^^^^^^^^^^^^^^ +`account-notify `_ is an IRCv3-defined capability that sends a message to a channel when a member of the channel either authenticates or deauthenticates from their account. Enabling this capability allows Eggdrop to immediately associate an account to a channel member when they authenticate or deauthenticate. + +WHOX +^^^^ +'WHOX `_ is a server feature that allows a client to request custom fields to be returned in a WHO response. If a server supports this capability, Eggdrop sends a WHOX query to the server when it joins a channel, allowing it to immediately determine accounts associated with channel members when Eggdrop joins a channel. + +Enabling Eggdrop Account Tracking +--------------------------------- +By default, the Eggdrop config file will attempt to enable all the capabilities required for account tracking. There are two settings to pay attention to +:: + + # To request the account-notify feature via CAP, set this to 1 + set account-notify 1 + + # To request the extended-join feature via CAP, set this to 1 + set extended-join 1 + +The ability of a server to support WHOX queries is determined via a server's ISUPPORT (005) reply. If a server supports WHOX queries, Eggdrop will automatically enable this feature. + +Checking Account-tracking Status +-------------------------------- +While Eggdrop is running, join the partyline and type `.status`. If account-tracking is enabled (both the server supports and Eggdrop has requested), you'll see this line +:: + + Loaded module information: + #eggdroptest : (not on channel) + Channels: #eggdroptest (trying) + Account tracking: Enabled <--- This line + Online as: BeerBot (BeerBot) + +Otherwise, the prompt will tell you which required capability is missing/not enabled +:: + + Loaded module information: + #eggdroptest : 2 members, enforcing "+tn" (greet) + Channels: #eggdroptest (need ops) + Account tracking: Best-effort (Missing capabilities: extended-join, see .status all for details) <---- This line + Online as: Eggdrop (Eggdrop) + +Determining if a Server Supports Account Capabilities +----------------------------------------------------- +A server announces the capabilities it supports via a CAP request. If you have Tcl enabled on the partyline (or via a raw message from a client), you can send `.tcl cap ls` and see if the extended-join and account-notify capabilities are supported by the server. If they are not listed, the server does not support it. + +A server announces if it supports WHOX via its ISUPPORT (005) announcement. If you have Tcl enabled on the partyline, you can send `.tcl issupport isset WHOX` and if it returns '1', WHOX is supported by the server. + +Best-Effort Account Tracking +---------------------------- +If a server only supports some, but not all, of the required capabilities, Eggdrop will switch to 'best effort' account tracking. This means Eggdrop will update account statuses whenever it sees account information, but in this mode Eggdrop cannnot guarantee that all account associations are up to date. + +If a server does not support extended-join, Eggdrop will not be able to determine the account associated with a user when they join. Eggdrop can update this information by sending a WHOX to the server. + +If a server does not support account-notify, Eggdrop will not be able to determine the account assoicated with a user if they authenticate/deauthenticate from their account after joining a channel. Eggdrop can update this information by sending a WHOX to the server. + +If a server does not support WHOX, Eggdrop will not be able to determine the accounts associated with users already on a channel before Eggdrop joined. There is no reliable way to update this information. + +One workaround to significantly increase the accuracy of account tracking for scripts in a 'best effort' scenario would be to issue a WHOX query (assuming the server supports it), wait for the reply from the server, and then query for the account information. + +account-tag +^^^^^^^^^^^ +One supplementary capability that can assist a best-effort account tracking scenario is the IRCv3-defined `account-tag capability `_. The account-tag capability attaches a tag with the account name associated with the user sending a command. Enabling this capability allows Eggdrop to update its account tracking every time a user talks in channel, sets a mode, sends a kick, etc. While still not able to offer the same level of accuracy as enabling the "main three" account tracking features, it can increase the overall accuracy of the account list. Additionally, binds that react to user activity (pub, kick, mode, etc) containing account-tag will update the internal account list prior to executing the associated callback, so looking up the account name in the callback can be considered accurate. + +Using Accounts with Tcl Scripts +------------------------------- +The Eggdrop Tcl ACCOUNT bind is triggered whenver an existing account record stored by Eggdrop is modified, such as a user de/authenticating to their account while in a channel, or information such as an account-tag being seen that updates an existing user. However, the ACCOUNT bind will NOT be triggered for the creation of a new user record, such as a user joining a channel. The bind is triggered for every channel the user is seen on- this means if a user is present with Eggdrop on four channels, the bind will be executed four times, each time with a different channel variable being passed to the associated Tcl procedure. Additionally, in a best-effort account tracking situation, Eggdrop will update the account associated with a user on all channels, not just the channel the event is seen on (and thus resulting in a bind trigger for each channel the user is on). + +In order to trigger Tcl script events to cover all instances where a user logs in, you need to pair an ACCOUNT bind with a JOIN bind. This will allow you to execute account-based events when a user joins as well as if they authenticate after joining. diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index ea19d7869..5d8aaa9ec 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -367,6 +367,8 @@ botattr [changes [channel]] Module: core +.. _matchattr: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ matchattr [channel] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1372,7 +1374,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 matchattr above for additional examples). + 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 matchattr_ above for additional examples). 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. @@ -2357,8 +2359,7 @@ timer [count [timerName]] utimer [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 no timer -Name is specified, Eggdrop will assign a timerName in the format of "timer". + 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 no timerName is specified, Eggdrop will assign a timerName in the format of "timer". Returns: a timerName @@ -2908,23 +2909,24 @@ language 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. +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. -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. When the 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 +^^^^^^^^^^^^^^^ +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 +^^^^^^^^^^^^^^^ 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 next section, you will see several references to "flags". The "flags" argument 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), or a "-" or "*" can be used to denote "any user". For example, a flag mask of "ov" would allow a bind to be triggered by a user added to Eggdrop with either the o or v global flags. A flag mask of of "-\|m" would allow a bind to be triggered by a user with the m channel flag. For more advanced information on how flag matching works, please see the matchattr_ description. + ^^^^^^^^^^ Bind Types ^^^^^^^^^^ @@ -3528,7 +3530,7 @@ The following is a list of bind types and how they work. Below each bind type is procname - Description: this bind will trigger when eggdrop detects a change in the authentication status of a user's service account. The mask for the bind is in the format "#channel nick!user@hostname.com account" and accepts :ref:`Match Characters`. account is either the account name the user is logging in to or "*" if the user is not logged in to an account. + Description: this bind will trigger when eggdrop detects a change in the authentication status of a user's service account. The mask for the bind is in the format "#channel nick!user@hostname.com account" and accepts wildcards_. account is either the account name the user is logging in to or "*" if the user is not logged in to an account. 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 but this bind could be triggered late or never on account changes. Please see doc/ACCOUNTS for additional information. @@ -3702,6 +3704,8 @@ Secure connection can be also established after a connection is active. You can The best way to learn how to use these commands is to find a script that uses them and follow it carefully. However, hopefully this has given you a good start. +.. _wildcards: + Match Characters ---------------- diff --git a/eggdrop.conf b/eggdrop.conf index f1ccfd7b8..81e35bfe9 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -1172,7 +1172,7 @@ set extended-join 1 # To request the account-tag feature via CAP, set this to 1 # This can be enabled if necessary for imperfect account tracking if you don't # have the WHOX (use_354), account-notify and extended-join features available -# see doc/ACCOUNT for details +# see doc/ACCOUNTS for details #set account-tag 0 # If you have any additional CAP features you would like to request at diff --git a/misc/generatedocs b/misc/generatedocs index 11c09761c..fd07980ac 100755 --- a/misc/generatedocs +++ b/misc/generatedocs @@ -143,6 +143,7 @@ mv tmpdocs/tls.txt $BASEDIR/../doc/TLS mv tmpdocs/tricks.txt $BASEDIR/../doc/TRICKS mv tmpdocs/twitchinfo.txt $BASEDIR/../doc/TWITCH mv tmpdocs/users.txt $BASEDIR/../doc/USERS +mv tmpdocs/accounts.txt $BASEDIR/../doc/ACCOUNTS rm -rf tmpdocs rm -rf $BASEDIR/../doc/html/_sources rm -rf $BASEDIR/../doc/doctrees/ diff --git a/src/mod/irc.mod/irc.c b/src/mod/irc.mod/irc.c index ae5eeaa87..c7677706a 100644 --- a/src/mod/irc.mod/irc.c +++ b/src/mod/irc.mod/irc.c @@ -1110,7 +1110,7 @@ static void tell_account_tracking_status(int idx, int details) if (tag && (!whox || !notify || !extjoin)) { dprintf(idx, "%s", " - account-tag enabled => Accounts will update whenever someone messages a channel or this bot\n"); } - dprintf(idx, "%s", " See doc/ACCOUNT for more details\n"); + dprintf(idx, "%s", " See doc/ACCOUNTS for more details\n"); } } } From 8441b39d19f717544ea02a4a76afdebd7dd0aa22 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Tue, 27 Sep 2022 01:19:53 +0000 Subject: [PATCH 09/92] Fix format specifier for intptr_t Found by: michaelortmann Patch by: michaelortmann Fix format specifier for intptr_t with c99 PRIdPTR that were shadowed by the use of egg_snprintf() and simple_sprintf() / use snprintf() for all getudef() --- src/mod/channels.mod/tclchan.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mod/channels.mod/tclchan.c b/src/mod/channels.mod/tclchan.c index 66143963e..06b33b8d3 100644 --- a/src/mod/channels.mod/tclchan.c +++ b/src/mod/channels.mod/tclchan.c @@ -974,14 +974,14 @@ static int tcl_channel_info(Tcl_Interp *irp, struct chanset_t *chan) continue; if (ul->type == UDEF_FLAG) { - simple_sprintf(s, "%c%s", getudef(ul->values, chan->dname) ? '+' : '-', - ul->name); + snprintf(s, sizeof s, "%c%s", + getudef(ul->values, chan->dname) ? '+' : '-', ul->name); Tcl_AppendElement(irp, s); } else if (ul->type == UDEF_INT) { char *x; egg_snprintf(a, sizeof a, "%s", ul->name); - egg_snprintf(b, sizeof b, "%d", getudef(ul->values, chan->dname)); + snprintf(b, sizeof b, "%" PRIdPTR, getudef(ul->values, chan->dname)); args[0] = a; args[1] = b; x = Tcl_Merge(2, args); @@ -1120,7 +1120,7 @@ static int tcl_channel_getlist(Tcl_Interp *irp, struct chanset_t *chan) APPEND_KEYVAL(ul->name, argv[0]); Tcl_Free((char *) argv); } else { - simple_sprintf(s, "%d", getudef(ul->values, chan->dname)); + snprintf(s, sizeof s, "%" PRIdPTR, getudef(ul->values, chan->dname)); APPEND_KEYVAL(ul->name, s); } } @@ -1228,7 +1228,7 @@ static int tcl_channel_get(Tcl_Interp *irp, struct chanset_t *chan, Tcl_Free((char *) argv); } else { /* Flag or int, all the same. */ - simple_sprintf(s, "%d", getudef(ul->values, chan->dname)); + snprintf(s, sizeof s, "%" PRIdPTR, getudef(ul->values, chan->dname)); Tcl_AppendResult(irp, s, NULL); } return TCL_OK; From 36f0b83d6b6fb735d457794ee82c0aef9b6da165 Mon Sep 17 00:00:00 2001 From: Jonathan Rudolph Date: Mon, 26 Sep 2022 18:25:00 -0700 Subject: [PATCH 10/92] doc typo Found by: SpiKe^^ Patch by: simple --- doc/sphinx_source/using/tcl-commands.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 5d8aaa9ec..360997675 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -2359,7 +2359,7 @@ timer [count [timerName]] utimer [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 no timerName is specified, Eggdrop will assign a timerName in the format of "timer". + 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". Returns: a timerName From 9067ae8e7b8be46f85cfda65e7b1cde6c8a38a4b Mon Sep 17 00:00:00 2001 From: crazycatdevs <44431938+crazycatdevs@users.noreply.github.com> Date: Tue, 27 Sep 2022 03:26:26 +0200 Subject: [PATCH 11/92] Update doc typo A botnet needs at least 2 eggdrops! --- doc/sphinx_source/using/botnet.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinx_source/using/botnet.rst b/doc/sphinx_source/using/botnet.rst index 748f38649..7dea0d324 100644 --- a/doc/sphinx_source/using/botnet.rst +++ b/doc/sphinx_source/using/botnet.rst @@ -12,7 +12,7 @@ Botnet Sharing and Linking What is a botnet? ----------------- - A botnet consists of one 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). + 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 ----- @@ -20,7 +20,7 @@ Terms The following are some common terms used in this document: **Botnet** - A botnet consists of one or more bots connected together. + A botnet consists of two or more bots connected together. **Link** Link is the term used to describe a bot connecting to another bot. From 9bf8ad4955cbcc294382527393bc94f0e8cc2dc1 Mon Sep 17 00:00:00 2001 From: crazycatdevs <44431938+crazycatdevs@users.noreply.github.com> Date: Tue, 27 Sep 2022 03:32:33 +0200 Subject: [PATCH 12/92] Update install doc Found by: CrazyCatDevs Patch by: CrazyCatDevs step 5 must be done in source directory, not in eggdrop directory --- doc/sphinx_source/install/install.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/sphinx_source/install/install.rst b/doc/sphinx_source/install/install.rst index c571908ad..4425949be 100644 --- a/doc/sphinx_source/install/install.rst +++ b/doc/sphinx_source/install/install.rst @@ -56,8 +56,6 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. Note that you must use full path for every file to be correctly installed. - [The following is performed from the directory installed above.] - 5. Since version 1.8, Eggdrop can use SSL to protect botnet links. If you intend on protecting botnet traffic between Eggdrops, you must generate SSL certificates by running:: make sslcert @@ -74,6 +72,8 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. Read docs/TLS for more info on this process. +[The following steps are performed in the directory you just installed Eggdrop into from the preevious step] + 6. Edit your config file completely. 7. Start the bot with the "-m" option to create a user file, i.e. :: From 28539baa33eb18f385a389b25759a408e287ff6f Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Tue, 27 Sep 2022 01:36:02 +0000 Subject: [PATCH 13/92] Fix typos --- NEWS | 2 +- doc/html/install/upgrading.html | 2 +- doc/sphinx_source/modules/mod/filesys.rst | 2 +- doc/sphinx_source/modules/mod/irc.rst | 2 +- src/language.c | 2 +- src/mod/filesys.mod/help/filesys.help | 2 +- src/mod/irc.mod/chan.c | 2 +- src/mod/irc.mod/irc.c | 2 +- src/tclhash.c | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index f465fa4e1..e0dbe26b2 100644 --- a/NEWS +++ b/NEWS @@ -204,7 +204,7 @@ Eggdrop v1.9.0: with 'refreshchan w', described above. - Added the hand2nicks command, an alternative to the hand2nick command. hand2nicks returns ALL nicks matching a handle, not just the first one. - - Aded the socklist command, an update to the dcclist command. Returns + - Added the socklist command, an update to the dcclist command. Returns similar info as a Tcl dict, and adds the IP to the information. - Use the system's strftime formatting instead of Eggdrop-provided GNU version/extensions. This could cause formatting differences diff --git a/doc/html/install/upgrading.html b/doc/html/install/upgrading.html index a2789a6a6..3ad768398 100644 --- a/doc/html/install/upgrading.html +++ b/doc/html/install/upgrading.html @@ -105,7 +105,7 @@

Search

Upgrading Eggdrop

-

It is easy to upgrade Eggdrop to a new version! To have a full picture of the changes made since your last upgrade, we recommed reading the NEWS file. Upgrades from the 1.6 and 1.8 lines of Eggdrop should take place with little to no issues. The config file, user files, and channel files can all be reused.

+

It is easy to upgrade Eggdrop to a new version! To have a full picture of the changes made since your last upgrade, we recommend reading the NEWS file. Upgrades from the 1.6 and 1.8 lines of Eggdrop should take place with little to no issues. The config file, user files, and channel files can all be reused.

For support, feel free to visit us on Libera #eggdrop.

diff --git a/doc/sphinx_source/modules/mod/filesys.rst b/doc/sphinx_source/modules/mod/filesys.rst index 310f444a5..460b2e39c 100644 --- a/doc/sphinx_source/modules/mod/filesys.rst +++ b/doc/sphinx_source/modules/mod/filesys.rst @@ -222,7 +222,7 @@ rm [files] ... Cleans up the current directory's database. If you have a large directory with many files you may want to use this command if you experience slow-downs/delays over time. Normally, the db - should clean up itsself though. + should clean up itself though. ^^^^^^^ .unhide diff --git a/doc/sphinx_source/modules/mod/irc.rst b/doc/sphinx_source/modules/mod/irc.rst index 14397d4b4..1955d3174 100644 --- a/doc/sphinx_source/modules/mod/irc.rst +++ b/doc/sphinx_source/modules/mod/irc.rst @@ -84,7 +84,7 @@ There are also some variables you can set in your config file: | bind msg - myword \*msg:hello Many IRCops find bots by seeing if they reply to 'hello' in a msg. You - can change this to another word by un-commenting thse two lines and + can change this to another word by un-commenting these two lines and changing "myword" to the word wish to use instead of'hello'. It must be a single word. diff --git a/src/language.c b/src/language.c index 7a7b4fb53..252f7a43f 100644 --- a/src/language.c +++ b/src/language.c @@ -44,7 +44,7 @@ * FILE FORMAT: language.lang * , * TEXT MESSAGE USAGE: - * get_language( [,]) + * get_language( [,]) * * ADDING LANGUAGES: * o Copy an existing
..lang to a diff --git a/src/mod/filesys.mod/help/filesys.help b/src/mod/filesys.mod/help/filesys.help index e7188d397..bcd7f0760 100644 --- a/src/mod/filesys.mod/help/filesys.help +++ b/src/mod/filesys.mod/help/filesys.help @@ -167,7 +167,7 @@ see also: unshare, lsa, ln cleans up the current directory's database. if you have a large directory with many files you may want to use this command if you experience slow-downs/delays over time. normally, the db - should clean up itsself though. + should clean up itself though. %{help=filesys/sort}%{+j} ### %bsort%b this command is obsolete, because the directory is always diff --git a/src/mod/irc.mod/chan.c b/src/mod/irc.mod/chan.c index 94776aed6..e16e85527 100644 --- a/src/mod/irc.mod/chan.c +++ b/src/mod/irc.mod/chan.c @@ -1892,7 +1892,7 @@ static int gotinvite(char *from, char *msg) check_tcl_invite(nick, from, msg, invitee); /* Because who needs RFCs? Freakin IRCv3... */ if (!match_my_nick(invitee)) { - putlog(LOG_DEBUG, "*", "Received invite notifiation for %s to %s by %s.", + putlog(LOG_DEBUG, "*", "Received invite notification for %s to %s by %s.", invitee, msg, nick); return 1; } diff --git a/src/mod/irc.mod/irc.c b/src/mod/irc.mod/irc.c index c7677706a..3d1c96153 100644 --- a/src/mod/irc.mod/irc.c +++ b/src/mod/irc.mod/irc.c @@ -460,7 +460,7 @@ void reset_chan_info(struct chanset_t *chan, int reset, int do_reset) } /* Leave the specified channel and notify registered Tcl procs. This - * should not be called by itsself. + * should not be called by itself. */ static void do_channel_part(struct chanset_t *chan) { diff --git a/src/tclhash.c b/src/tclhash.c index 5266cfcb7..71d35f6c2 100644 --- a/src/tclhash.c +++ b/src/tclhash.c @@ -935,7 +935,7 @@ int check_tcl_bind(tcl_bind_list_t *tl, const char *match, if (tm_p && tm_p->next) { tm = tm_p->next; /* Move mask to front of bind's mask list. */ tm_p->next = tm->next; /* Unlink mask from list. */ - tm->next = tl->first; /* Readd mask to front of list. */ + tm->next = tl->first; /* Re-add mask to front of list. */ tl->first = tm; } From d50aa08b39603b4be0fd0179db7f94da48e03720 Mon Sep 17 00:00:00 2001 From: PeGaSuS Date: Sat, 1 Oct 2022 16:01:03 +0200 Subject: [PATCH 14/92] Fix typo --- doc/sphinx_source/install/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx_source/install/install.rst b/doc/sphinx_source/install/install.rst index 4425949be..ece05c0e4 100644 --- a/doc/sphinx_source/install/install.rst +++ b/doc/sphinx_source/install/install.rst @@ -72,7 +72,7 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. Read docs/TLS for more info on this process. -[The following steps are performed in the directory you just installed Eggdrop into from the preevious step] +[The following steps are performed in the directory you just installed Eggdrop into from the previous step] 6. Edit your config file completely. From b3b658b26e5442762f22423ab013a28b481d759d Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 1 Oct 2022 14:03:20 +0000 Subject: [PATCH 15/92] Fix typos --- doc/sphinx_source/using/accounts.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/sphinx_source/using/accounts.rst b/doc/sphinx_source/using/accounts.rst index 9791ca847..6d1b96128 100644 --- a/doc/sphinx_source/using/accounts.rst +++ b/doc/sphinx_source/using/accounts.rst @@ -60,11 +60,11 @@ A server announces if it supports WHOX via its ISUPPORT (005) announcement. If y Best-Effort Account Tracking ---------------------------- -If a server only supports some, but not all, of the required capabilities, Eggdrop will switch to 'best effort' account tracking. This means Eggdrop will update account statuses whenever it sees account information, but in this mode Eggdrop cannnot guarantee that all account associations are up to date. +If a server only supports some, but not all, of the required capabilities, Eggdrop will switch to 'best effort' account tracking. This means Eggdrop will update account statuses whenever it sees account information, but in this mode Eggdrop cannot guarantee that all account associations are up to date. If a server does not support extended-join, Eggdrop will not be able to determine the account associated with a user when they join. Eggdrop can update this information by sending a WHOX to the server. -If a server does not support account-notify, Eggdrop will not be able to determine the account assoicated with a user if they authenticate/deauthenticate from their account after joining a channel. Eggdrop can update this information by sending a WHOX to the server. +If a server does not support account-notify, Eggdrop will not be able to determine the account associated with a user if they authenticate/deauthenticate from their account after joining a channel. Eggdrop can update this information by sending a WHOX to the server. If a server does not support WHOX, Eggdrop will not be able to determine the accounts associated with users already on a channel before Eggdrop joined. There is no reliable way to update this information. @@ -76,6 +76,6 @@ One supplementary capability that can assist a best-effort account tracking scen Using Accounts with Tcl Scripts ------------------------------- -The Eggdrop Tcl ACCOUNT bind is triggered whenver an existing account record stored by Eggdrop is modified, such as a user de/authenticating to their account while in a channel, or information such as an account-tag being seen that updates an existing user. However, the ACCOUNT bind will NOT be triggered for the creation of a new user record, such as a user joining a channel. The bind is triggered for every channel the user is seen on- this means if a user is present with Eggdrop on four channels, the bind will be executed four times, each time with a different channel variable being passed to the associated Tcl procedure. Additionally, in a best-effort account tracking situation, Eggdrop will update the account associated with a user on all channels, not just the channel the event is seen on (and thus resulting in a bind trigger for each channel the user is on). +The Eggdrop Tcl ACCOUNT bind is triggered whenever an existing account record stored by Eggdrop is modified, such as a user de/authenticating to their account while in a channel, or information such as an account-tag being seen that updates an existing user. However, the ACCOUNT bind will NOT be triggered for the creation of a new user record, such as a user joining a channel. The bind is triggered for every channel the user is seen on- this means if a user is present with Eggdrop on four channels, the bind will be executed four times, each time with a different channel variable being passed to the associated Tcl procedure. Additionally, in a best-effort account tracking situation, Eggdrop will update the account associated with a user on all channels, not just the channel the event is seen on (and thus resulting in a bind trigger for each channel the user is on). In order to trigger Tcl script events to cover all instances where a user logs in, you need to pair an ACCOUNT bind with a JOIN bind. This will allow you to execute account-based events when a user joins as well as if they authenticate after joining. From 55595ab28935a1c2f29ed558a89b225e9ea31bce Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Wed, 5 Oct 2022 23:41:41 +0000 Subject: [PATCH 16/92] Avoid freeaddrinfo(NULL) Found by: Release_ Patch by: michaelortmann Fixes: #1329 The behavior of freeadrinfo(NULL) is left unspecified by RFC 3493. Some Operating Systems like FreeBSD handle this for compatibility / portability but others like OpenBSD do not (as reported in #1329), so let eggdrop avoid calling freeadrinfo(NULL). --- src/dns.c | 27 +++++++++++++++++---------- src/tcldcc.c | 20 ++++++++++++++------ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/dns.c b/src/dns.c index 39fb49973..6d5c67f79 100644 --- a/src/dns.c +++ b/src/dns.c @@ -503,6 +503,7 @@ void *thread_dns_hostbyip(void *arg) i = getnameinfo((const struct sockaddr *) &addr->addr.sa, addr->addrlen, dtn->host, sizeof dtn->host, NULL, 0, 0); if (i) { + debug1("dns: thread_dns_hostbyip(): getnameinfo(): error = %s", gai_strerror(i)); #ifdef IPV6 if (addr->family == AF_INET6) inet_ntop(AF_INET6, &addr->addr.s6.sin6_addr, dtn->host, sizeof dtn->host); @@ -520,13 +521,13 @@ void *thread_dns_hostbyip(void *arg) void *thread_dns_ipbyhost(void *arg) { struct dns_thread_node *dtn = (struct dns_thread_node *) arg; - struct addrinfo *res0, *res; - int i; + struct addrinfo *res0 = NULL, *res; + int error; sockname_t *addr = &dtn->addr; - i = getaddrinfo(dtn->host, NULL, NULL, &res0); + error = getaddrinfo(dtn->host, NULL, NULL, &res0); memset(addr, 0, sizeof *addr); - if (!i) { + if (!error) { #ifdef IPV6 for (res = res0; res; res = res->ai_next) { if (res == res0 || res->ai_family == (pref_af ? AF_INET6 : AF_INET)) { @@ -538,21 +539,27 @@ void *thread_dns_ipbyhost(void *arg) } } #else - i = 1; + error = 1; for (res = res0; res; res = res->ai_next) { if (res->ai_family == AF_INET) { addr->family = res->ai_family; addr->addrlen = res->ai_addrlen; memcpy(&addr->addr.sa, res->ai_addr, res->ai_addrlen); - i = 0; + error = 0; break; } } #endif - freeaddrinfo(res0); + if (res0) /* The behavior of freeadrinfo(NULL) is left unspecified by RFCs + * 2553 and 3493. Avoid to be compatible with all OSes. */ + freeaddrinfo(res0); } + else if (error == EAI_NONAME) + debug1("dns: thread_dns_ipbyhost(): getaddrinfo(): hostname %s not known", dtn->host); + else + debug1("dns: thread_dns_ipbyhost(): getaddrinfo(): error = %s", gai_strerror(error)); pthread_mutex_lock(&dtn->mutex); - dtn->ok = !i; + dtn->ok = !error; close(dtn->fildes[1]); pthread_mutex_unlock(&dtn->mutex); return NULL; @@ -661,7 +668,7 @@ void core_dns_hostbyip(sockname_t *addr) sizeof (struct sockaddr_in), host, sizeof host, NULL, 0, 0); alarm(0); if (i) - debug1("dns: getnameinfo(): error = %s", gai_strerror(i)); + debug1("dns: core_dns_hostbyip(): getnameinfo(): error = %s", gai_strerror(i)); } if (i) inet_ntop(AF_INET, &addr->addr.s4.sin_addr.s_addr, host, sizeof host); @@ -673,7 +680,7 @@ void core_dns_hostbyip(sockname_t *addr) sizeof (struct sockaddr_in6), host, sizeof host, NULL, 0, 0); alarm(0); if (i) - debug1("dns: getnameinfo(): error = %s", gai_strerror(i)); + debug1("dns: core_dns_hostbyip(): getnameinfo(): error = %s", gai_strerror(i)); } if (i) inet_ntop(AF_INET6, &addr->addr.s6.sin6_addr, host, sizeof host); diff --git a/src/tcldcc.c b/src/tcldcc.c index e54fec2de..6a7702b29 100644 --- a/src/tcldcc.c +++ b/src/tcldcc.c @@ -1028,13 +1028,12 @@ static int tcl_connect STDVAR } static int setlisten(Tcl_Interp *irp, char *ip, char *portp, char *type, char *maskproc, char *flag) { - int i, idx = -1, port, realport, found=0, ipv4=1; + int i, idx = -1, port, realport, found=0, ipv4=1, error; char s[11], msg[256], newip[EGG_INET_ADDRSTRLEN]; struct portmap *pmap = NULL, *pold = NULL; sockname_t name; struct in_addr ipaddr4; struct addrinfo hint, *ipaddr = NULL; - int ret; #ifdef IPV6 struct in6_addr ipaddr6; #endif @@ -1056,8 +1055,8 @@ static int setlisten(Tcl_Interp *irp, char *ip, char *portp, char *type, char *m strlcpy(newip, ip, sizeof newip); } /* Return addrinfo struct ipaddr containing family... */ - ret = getaddrinfo(newip, NULL, &hint, &ipaddr); - if (!ret) { + error = getaddrinfo(newip, NULL, &hint, &ipaddr); + if (!error) { /* Load network address to in(6)_addr struct for later byte comparisons */ if (ipaddr->ai_family == AF_INET) { inet_pton(AF_INET, newip, &ipaddr4); @@ -1068,8 +1067,17 @@ static int setlisten(Tcl_Interp *irp, char *ip, char *portp, char *type, char *m ipv4 = 0; } #endif + if (ipaddr) /* The behavior of freeadrinfo(NULL) is left unspecified by RFCs + * 2553 and 3493. Avoid to be compatible with all OSes. */ + freeaddrinfo(ipaddr); } - freeaddrinfo(ipaddr); + else if (error == EAI_NONAME) + /* currently setlisten() handles only ip not hostname */ + putlog(LOG_MISC, "*", + "tcldcc: setlisten(): getaddrinfo(): ip %s not known", newip); + else + putlog(LOG_MISC, "*", "tcldcc: setlisten(): getaddrinfo(): error = %s", + gai_strerror(error)); port = realport = atoi(portp); for (pmap = root; pmap; pold = pmap, pmap = pmap->next) { if (pmap->realport == port) { @@ -1282,7 +1290,7 @@ static int tcl_listen STDVAR strlcpy(ip, argv[1], sizeof(ip)); i++; } else { - Tcl_AppendResult(irp, "invalid ip address", NULL); + Tcl_AppendResult(irp, "invalid IP address argument", NULL); return TCL_ERROR; } } From d0cb5ff0b9eac51fa84cb189b633b3948ed14b6d Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Thu, 10 Nov 2022 18:06:04 +0100 Subject: [PATCH 17/92] Fix matchattr without flags Fixes: #1267 The matchattr/bind flag string "-" or "-|-" is commonly used to match "anyone". It isn't a real match because there are no flags specified so there is nothing to match. - and | are just meta-characters that don't parse to modes that can match. Found by: crazycatdevs Patch by: thommey --- src/tcluser.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tcluser.c b/src/tcluser.c index 85e5587aa..987a0e6dc 100644 --- a/src/tcluser.c +++ b/src/tcluser.c @@ -269,8 +269,9 @@ static int tcl_matchattr STDVAR nom = 1; if (!plus.global && !plus.udef_global && !plus.chan && !plus.udef_chan && !plus.bot) { - Tcl_AppendResult(irp, "Unknown flag specified for matching", NULL); - return TCL_ERROR; + /* No flags (e.g. "-" or "+" or "-|-" matches anyone */ + Tcl_AppendResult(irp, "1", NULL); + return TCL_OK; } } if (flagrec_eq(&plus, &user)) { From 56c00e51e5e668543fe539cc001b30c7c2dc812a Mon Sep 17 00:00:00 2001 From: Geo Date: Thu, 10 Nov 2022 12:07:00 -0500 Subject: [PATCH 18/92] redo matching docs Linked to #1334 --- doc/sphinx_source/using/tcl-commands.rst | 89 +++++++++++++----------- src/flags.c | 2 +- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 360997675..e4dacf9ea 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -367,8 +367,6 @@ botattr [changes [channel]] Module: core -.. _matchattr: - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ matchattr [channel] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -377,43 +375,7 @@ matchattr [channel] [+/-][&/|[&/|]] - Either | or & can be used as a separator between global, channel, and bot flags, but only one separator can be used per flag section. A '+' is used to check if a user has the subsequent flags, and a '-' is used to check if a user does NOT have the subsequent flags. - -+------------+-----------------------------------------------------------------+ -| Flag Mask | Action | -+============+=================================================================+ -| +m + Checks if the user has the m global flag | -+------------+-----------------------------------------------------------------+ -| +mn | Checks if the user has the m OR n global flag | -+------------+-----------------------------------------------------------------+ -| \|+mn | Checks if the user has the m OR n global flag | -+------------+-----------------------------------------------------------------+ -| \|+mn #foo | Checks if the user has the m OR n channel flag for #foo | -+------------+-----------------------------------------------------------------+ -| &+mn | Checks if the user has the m AND n global flag | -+------------+-----------------------------------------------------------------+ -| &mn #foo | Checks if the user has the m AND n channel flag for #foo | -+------------+-----------------------------------------------------------------+ -| \|+o #foo | Checks if the user has the o channel flag for #foo | -+------------+-----------------------------------------------------------------+ -| +o|+n #foo | Checks if the user has the o global flag OR the n channel flag | -| | for #foo | -+------------+-----------------------------------------------------------------+ -| +m&+v #foo | Checks if the user has the m global flag AND the v channel flag | -| | for #foo | -+------------+-----------------------------------------------------------------+ -| -m | Checks if the user does not have the m global flag | -+------------+-----------------------------------------------------------------+ -| \|-n #foo | Checks if the user does not have the n channel flag for #foo | -+------------+-----------------------------------------------------------------+ -| +m|-n #foo | Checks if the user has the global m flag OR does not have a | -| | channel n flag for #foo | -+------------+-----------------------------------------------------------------+ -| -n&-m #foo | Checks if the user does not have the global n flag AND does | -| | not have the channel m flag for #foo | -+------------+-----------------------------------------------------------------+ -| ||+b | Checks if the user has the bot flag b | -+------------+-----------------------------------------------------------------+ + Either | or & can be used as a separator between global, channel, and bot flags, but only one separator can be used per flag section. A '+' is used to check if a user has the subsequent flags, and a '-' is used to check if a user does NOT have the subsequent flags. Please see `Flag Masks`_ for additional information on flag usage. Returns: 1 if the specified user has the flags matching the provided mask; 0 otherwise @@ -1374,7 +1336,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 matchattr_ above for additional examples). + 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). 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. @@ -2922,10 +2884,55 @@ 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 next section, you will see several references to "flags". The "flags" argument 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), or a "-" or "*" can be used to denote "any user". For example, a flag mask of "ov" would allow a bind to be triggered by a user added to Eggdrop with either the o or v global flags. A flag mask of of "-\|m" would allow a bind to be triggered by a user with the m channel flag. For more advanced information on how flag matching works, please see the matchattr_ description. +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: + ++------------+-----------------------------------------------------------------+ +| Flag Mask | Action | ++============+=================================================================+ +| m, +m, m|* | Checks if the user has the m global flag | ++------------+-----------------------------------------------------------------+ +| +mn | Checks if the user has the m OR n global flag | ++------------+-----------------------------------------------------------------+ +| \|+mn | Checks if the user has the m OR n channel flag | ++------------+-----------------------------------------------------------------+ +| \|+mn #foo | Checks if the user has the m OR n channel flag for #foo | ++------------+-----------------------------------------------------------------+ +| &+mn | Checks if the user has the m AND n channel flag | ++------------+-----------------------------------------------------------------+ +| &mn #foo | Checks if the user has the m AND n channel flag for #foo | ++------------+-----------------------------------------------------------------+ +| \|+o #foo | Checks if the user has the o channel flag for #foo | ++------------+-----------------------------------------------------------------+ +| +o|+n #foo | Checks if the user has the o global flag OR the n channel flag | +| | for #foo | ++------------+-----------------------------------------------------------------+ +| +m&+v #foo | Checks if the user has the m global flag AND the v channel flag | +| | for #foo | ++------------+-----------------------------------------------------------------+ +| -m | Checks if the user does not have the m global flag | ++------------+-----------------------------------------------------------------+ +| \|-n #foo | Checks if the user does not have the n channel flag for #foo | ++------------+-----------------------------------------------------------------+ +| +m|-n #foo | Checks if the user has the global m flag OR does not have a | +| | channel n flag for #foo | ++------------+-----------------------------------------------------------------+ +| -n&-m #foo | Checks if the user does not have the global n flag AND does | +| | not have the channel m flag for #foo | ++------------+-----------------------------------------------------------------+ +| ||+b | Checks if the user has the bot flag b | ++------------+-----------------------------------------------------------------+ + +As a side note, Tcl scripts historically have used a '-' to skip processing of a flag type (Example: -|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a '*' to skip processing, so as not to confuse a single "-" meaning "skip processing" with a preceding "-ov" which means "not these flags". ^^^^^^^^^^ Bind Types diff --git a/src/flags.c b/src/flags.c index ce60b2e3d..26285fdbd 100644 --- a/src/flags.c +++ b/src/flags.c @@ -1133,7 +1133,7 @@ static int flag2str(char *string, int bot, int udef) x++; } if (string == old) - *string++ = '-'; + *string++ = '*'; return string - old; } From e9482fbe33af4462bf222bea4625451f8dd4f7df Mon Sep 17 00:00:00 2001 From: Geo Date: Thu, 10 Nov 2022 17:26:28 -0500 Subject: [PATCH 19/92] Update NEWS --- NEWS | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/NEWS b/NEWS index e0dbe26b2..44a6d3594 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,32 @@ Last revised: December 4, 2021 _________________________________________________________________ +Eggdrop v1.9.4: + + General changes: + - Fixed a DNS bug causing Eggdrop to often hang on DCC or telnet + connections + - Reverted matchattr match syntax to previous functionality. Matching + against "-" as a flag will once again successfully match against "no" + flags, instead of returning an error. + - Fixed some inaccurate log messages + - Fixed some format specifiers that could cause crashes in certain + situations + - Fixed logging of TAGMSG messages + - Fixed unspecified behavior of freeaddrinfo() on some BSD systems + + Botnet changes: + - None + + Tcl API changes: + - Moved the 'gotmsg' function back as a raw bind. It was inadvertantly + moved to a rawt bind in 1.9.3, causing issuse with scripts attempting to + unbind this internal reference + +Eggdrop config changes: + - None + + Eggdrop v1.9.3: General changes: From e4e914276d8eccdc7ae891072174faeec40fb532 Mon Sep 17 00:00:00 2001 From: Geo Date: Thu, 10 Nov 2022 17:26:52 -0500 Subject: [PATCH 20/92] Update version strings to 1.9.4 --- configure.ac | 2 +- doc/sphinx_source/conf.py | 4 ++-- doc/sphinx_source/using/tcl-commands.rst | 2 +- doc/sphinx_source/using/text-sub.rst | 4 ++-- src/mod/compress.mod/configure.ac | 2 +- src/mod/dns.mod/configure.ac | 2 +- src/version.h | 6 +++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 96e906230..f6c66bbae 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.61) -AC_INIT([Eggdrop],[1.9.3],[bugs@eggheads.org]) +AC_INIT([Eggdrop],[1.9.4],[bugs@eggheads.org]) AC_COPYRIGHT([Copyright (C) 1999 - 2022 Eggheads Development Team]) AC_LANG([C]) AC_REVISION([m4_esyscmd([misc/getcommit])]) diff --git a/doc/sphinx_source/conf.py b/doc/sphinx_source/conf.py index bcb0d64ed..77f7b8fe7 100644 --- a/doc/sphinx_source/conf.py +++ b/doc/sphinx_source/conf.py @@ -51,9 +51,9 @@ # built documents. # # The short X.Y version. -version = '1.9.3' +version = '1.9.4' # The full version, including alpha/beta/rc tags. -release = '1.9.3' +release = '1.9.4' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index e4dacf9ea..2f9132808 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -13,7 +13,7 @@ of the normal Tcl built-in commands are still there, of course, but you can also use these to manipulate features of the bot. They are listed according to category. -This list is accurate for Eggdrop v1.9.3. Scripts written for v1.3, v1.4, +This list is accurate for Eggdrop v1.9.4. Scripts written for v1.3, v1.4, 1.6 and 1.8 series of Eggdrop should probably work with a few minor modifications depending on the script. Scripts which were written for v0.9, v1.0, v1.1 or v1.2 will probably not work without modification. Commands which have diff --git a/doc/sphinx_source/using/text-sub.rst b/doc/sphinx_source/using/text-sub.rst index 70bab7fff..92dfaf013 100644 --- a/doc/sphinx_source/using/text-sub.rst +++ b/doc/sphinx_source/using/text-sub.rst @@ -25,9 +25,9 @@ respective values: +------+---------------------------------------------------------+ | %B | bot's nickname (i.e. "LamestBot") | +------+---------------------------------------------------------+ -| %V | current Eggdrop version (i.e. "eggdrop v1.9.3") | +| %V | current Eggdrop version (i.e. "eggdrop v1.9.4") | +------+---------------------------------------------------------+ -| %E | long form of %V (i.e. "Eggdrop v1.9.3 (C) 1997 Robey | +| %E | long form of %V (i.e. "Eggdrop v1.9.4 (C) 1997 Robey | | | Pointer (C) 2010 Eggheads Development Team") | +------+---------------------------------------------------------+ | %C | channels the bot is on (i.e. "#lamest, #botnetcentral") | diff --git a/src/mod/compress.mod/configure.ac b/src/mod/compress.mod/configure.ac index 8602d757a..aa6c416e4 100644 --- a/src/mod/compress.mod/configure.ac +++ b/src/mod/compress.mod/configure.ac @@ -4,7 +4,7 @@ AC_PREREQ(2.58) sinclude(../eggmod.m4) -AC_INIT([Eggdrop Compress Module],[1.9.3],[bugs@eggheads.org]) +AC_INIT([Eggdrop Compress Module],[1.9.4],[bugs@eggheads.org]) AC_CONFIG_SRCDIR(compress.c) AC_CONFIG_AUX_DIR(../../../misc) diff --git a/src/mod/dns.mod/configure.ac b/src/mod/dns.mod/configure.ac index 0b850a53d..cbb695e5b 100644 --- a/src/mod/dns.mod/configure.ac +++ b/src/mod/dns.mod/configure.ac @@ -4,7 +4,7 @@ AC_PREREQ(2.60) sinclude(../eggmod.m4) -AC_INIT([Eggdrop DNS Module],[1.9.3],[bugs@eggheads.org]) +AC_INIT([Eggdrop DNS Module],[1.9.4],[bugs@eggheads.org]) AC_CONFIG_SRCDIR(coredns.c) AC_CONFIG_AUX_DIR(../../../misc) diff --git a/src/version.h b/src/version.h index f173917d1..202b920d1 100644 --- a/src/version.h +++ b/src/version.h @@ -26,6 +26,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define EGG_STRINGVER "1.9.3" -#define EGG_NUMVER 1090303 -#define EGG_PATCH "gotmsg" +#define EGG_STRINGVER "1.9.4" +#define EGG_NUMVER 1090400 +#define EGG_PATCH "alpha" From 13ab01706a8a782dc46fb163aeca2a31c5f02bdf Mon Sep 17 00:00:00 2001 From: Geo Date: Thu, 10 Nov 2022 17:27:04 -0500 Subject: [PATCH 21/92] Generate docs with 1.9.4 version --- INSTALL | 5 +- doc/BOTNET | 4 +- doc/PBKDF2 | 2 - doc/html/_static/documentation_options.js | 2 +- doc/html/about/about.html | 7 +- doc/html/about/legal.html | 7 +- doc/html/index.html | 16 +- doc/html/install/install.html | 13 +- doc/html/install/readme.html | 7 +- doc/html/install/upgrading.html | 7 +- doc/html/modules/included.html | 7 +- doc/html/modules/index.html | 7 +- doc/html/modules/mod/assoc.html | 7 +- doc/html/modules/mod/blowfish.html | 7 +- doc/html/modules/mod/channels.html | 7 +- doc/html/modules/mod/compress.html | 7 +- doc/html/modules/mod/console.html | 7 +- doc/html/modules/mod/ctcp.html | 7 +- doc/html/modules/mod/dns.html | 7 +- doc/html/modules/mod/filesys.html | 9 +- doc/html/modules/mod/ident.html | 7 +- doc/html/modules/mod/irc.html | 9 +- doc/html/modules/mod/notes.html | 7 +- doc/html/modules/mod/pbkdf2.html | 7 +- doc/html/modules/mod/seen.html | 7 +- doc/html/modules/mod/server.html | 7 +- doc/html/modules/mod/share.html | 7 +- doc/html/modules/mod/transfer.html | 7 +- doc/html/modules/mod/twitch.html | 7 +- doc/html/modules/mod/uptime.html | 7 +- doc/html/modules/mod/woobie.html | 7 +- doc/html/modules/writing.html | 7 +- doc/html/objects.inv | Bin 1234 -> 1279 bytes doc/html/search.html | 7 +- doc/html/searchindex.js | 2 +- doc/html/tutorials/firstscript.html | 7 +- doc/html/tutorials/firststeps.html | 7 +- doc/html/tutorials/setup.html | 7 +- doc/html/tutorials/tlssetup.html | 7 +- doc/html/using/accounts.html | 16 +- doc/html/using/bans.html | 7 +- doc/html/using/botnet.html | 11 +- doc/html/using/core.html | 7 +- doc/html/using/features.html | 7 +- doc/html/using/ipv6.html | 7 +- doc/html/using/ircv3.html | 13 +- doc/html/using/partyline.html | 7 +- doc/html/using/patch.html | 7 +- doc/html/using/pbkdf2info.html | 20 +- doc/html/using/tcl-commands.html | 195 +++++++++--------- doc/html/using/text-sub.html | 11 +- doc/html/using/tls.html | 7 +- doc/html/using/tricks.html | 7 +- doc/html/using/twitch-tcl-commands.html | 7 +- doc/html/using/twitchinfo.html | 7 +- doc/html/using/users.html | 7 +- doc/modules/mod.filesys | 2 +- doc/modules/mod.irc | 2 +- doc/tcl-commands.doc | 240 +++++++++++++--------- 59 files changed, 477 insertions(+), 375 deletions(-) diff --git a/INSTALL b/INSTALL index 44e691dbd..064b9ea37 100644 --- a/INSTALL +++ b/INSTALL @@ -64,8 +64,6 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. Note that you must use full path for every file to be correctly installed. - [The following is performed from the directory installed above.] - 5. Since version 1.8, Eggdrop can use SSL to protect botnet links. If you intend on protecting botnet traffic between Eggdrops, you must generate SSL certificates by running: @@ -84,6 +82,9 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. Read docs/TLS for more info on this process. +[The following steps are performed in the directory you just installed +Eggdrop into from the previous step] + 6. Edit your config file completely. 7. Start the bot with the "-m" option to create a user file, i.e. : diff --git a/doc/BOTNET b/doc/BOTNET index d44584818..d3e700766 100644 --- a/doc/BOTNET +++ b/doc/BOTNET @@ -7,7 +7,7 @@ Botnet Sharing and Linking WHAT IS A BOTNET? - A botnet consists of one or more bots linked together. This can allow + 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). @@ -18,7 +18,7 @@ The following are some common terms used in this document: Botnet - A botnet consists of one or more bots connected together. + A botnet consists of two or more bots connected together. Link diff --git a/doc/PBKDF2 b/doc/PBKDF2 index dd5b1a058..cbb4e5e81 100644 --- a/doc/PBKDF2 +++ b/doc/PBKDF2 @@ -66,8 +66,6 @@ there). 1. Ensure -:: - loadmodule pbkdf2 is uncommented in the config file (or added, if this is a config file diff --git a/doc/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js index aec678252..c0721a95a 100644 --- a/doc/html/_static/documentation_options.js +++ b/doc/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.9.3', + VERSION: '1.9.4', LANGUAGE: 'None', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', diff --git a/doc/html/about/about.html b/doc/html/about/about.html index 7949b3d1c..aaa966ae2 100644 --- a/doc/html/about/about.html +++ b/doc/html/about/about.html @@ -6,7 +6,7 @@ - About Eggdrop — Eggdrop 1.9.2 documentation + About Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

+ href="../index.html">Eggdrop 1.9.4 documentation
diff --git a/doc/html/about/legal.html b/doc/html/about/legal.html index f53ab7e36..29a4e2838 100644 --- a/doc/html/about/legal.html +++ b/doc/html/about/legal.html @@ -6,7 +6,7 @@ - Boring legal stuff — Eggdrop 1.9.2 documentation + Boring legal stuff — Eggdrop 1.9.4 documentation @@ -23,7 +23,7 @@

+ href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/index.html b/doc/html/index.html index cb10f7d31..c0d84e9bc 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -6,7 +6,7 @@ - Eggdrop, an open source IRC bot — Eggdrop 1.9.3 documentation + Eggdrop, an open source IRC bot — Eggdrop 1.9.4 documentation @@ -23,7 +23,7 @@

+ href="#">Eggdrop 1.9.4 documentation diff --git a/doc/html/install/install.html b/doc/html/install/install.html index d05e0b2f1..d6ce5d245 100644 --- a/doc/html/install/install.html +++ b/doc/html/install/install.html @@ -6,7 +6,7 @@ - Installing Eggdrop — Eggdrop 1.9.2 documentation + Installing Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

+ href="../index.html">Eggdrop 1.9.4 documentation -

Note that you must use full path for every file to be correctly +

Note that you must use full path for every file to be correctly installed.

-

[The following is performed from the directory installed above.]

@@ -183,6 +183,9 @@

Quick Startup
  • Edit your config file completely.

  • Start the bot with the “-m” option to create a user file, i.e.

    @@ -281,7 +284,7 @@

    Modules © Copyright 2022, Eggheads. - Last updated on May 26, 2022. + Last updated on Nov 10, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/install/readme.html b/doc/html/install/readme.html index 6e356c9d3..24d2c1630 100644 --- a/doc/html/install/readme.html +++ b/doc/html/install/readme.html @@ -6,7 +6,7 @@ - README — Eggdrop 1.9.2 documentation + README — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/install/upgrading.html b/doc/html/install/upgrading.html index 3ad768398..7a2842f4b 100644 --- a/doc/html/install/upgrading.html +++ b/doc/html/install/upgrading.html @@ -6,7 +6,7 @@ - Upgrading Eggdrop — Eggdrop 1.9.2 documentation + Upgrading Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/included.html b/doc/html/modules/included.html index 8101520c8..edffbdbbc 100644 --- a/doc/html/modules/included.html +++ b/doc/html/modules/included.html @@ -6,7 +6,7 @@ - Modules included with Eggdrop — Eggdrop 1.9.3 documentation + Modules included with Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/index.html b/doc/html/modules/index.html index e8c974135..f17d8d8bf 100644 --- a/doc/html/modules/index.html +++ b/doc/html/modules/index.html @@ -6,7 +6,7 @@ - Eggdrop Module Information — Eggdrop 1.9.2 documentation + Eggdrop Module Information — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/assoc.html b/doc/html/modules/mod/assoc.html index c38e68f06..473290a3f 100644 --- a/doc/html/modules/mod/assoc.html +++ b/doc/html/modules/mod/assoc.html @@ -6,7 +6,7 @@ - Assoc Module — Eggdrop 1.9.2 documentation + Assoc Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/blowfish.html b/doc/html/modules/mod/blowfish.html index f077164f4..bd82779ea 100644 --- a/doc/html/modules/mod/blowfish.html +++ b/doc/html/modules/mod/blowfish.html @@ -6,7 +6,7 @@ - Blowfish Module — Eggdrop 1.9.2 documentation + Blowfish Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/channels.html b/doc/html/modules/mod/channels.html index 435e32d85..5b8fb089b 100644 --- a/doc/html/modules/mod/channels.html +++ b/doc/html/modules/mod/channels.html @@ -6,7 +6,7 @@ - Channels Module — Eggdrop 1.9.2 documentation + Channels Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/compress.html b/doc/html/modules/mod/compress.html index 911fbde6e..bde3bc8ae 100644 --- a/doc/html/modules/mod/compress.html +++ b/doc/html/modules/mod/compress.html @@ -6,7 +6,7 @@ - Compress Module — Eggdrop 1.9.2 documentation + Compress Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/console.html b/doc/html/modules/mod/console.html index 8089e6885..bdd760ceb 100644 --- a/doc/html/modules/mod/console.html +++ b/doc/html/modules/mod/console.html @@ -6,7 +6,7 @@ - Console Module — Eggdrop 1.9.2 documentation + Console Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/ctcp.html b/doc/html/modules/mod/ctcp.html index 62562ad04..70f7884ff 100644 --- a/doc/html/modules/mod/ctcp.html +++ b/doc/html/modules/mod/ctcp.html @@ -6,7 +6,7 @@ - CTCP Module — Eggdrop 1.9.2 documentation + CTCP Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/dns.html b/doc/html/modules/mod/dns.html index 75f893bd0..dbdd9a95d 100644 --- a/doc/html/modules/mod/dns.html +++ b/doc/html/modules/mod/dns.html @@ -6,7 +6,7 @@ - DNS Module — Eggdrop 1.9.2 documentation + DNS Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/filesys.html b/doc/html/modules/mod/filesys.html index 055d9b4e4..2ce90adf9 100644 --- a/doc/html/modules/mod/filesys.html +++ b/doc/html/modules/mod/filesys.html @@ -6,7 +6,7 @@ - Filesys Module — Eggdrop 1.9.2 documentation + Filesys Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index df57f1510..5cfcd7cad 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -6,7 +6,7 @@ - Ident Module — Eggdrop 1.9.2 documentation + Ident Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/irc.html b/doc/html/modules/mod/irc.html index 91d7235d0..cd7d05f14 100644 --- a/doc/html/modules/mod/irc.html +++ b/doc/html/modules/mod/irc.html @@ -6,7 +6,7 @@ - IRC Module — Eggdrop 1.9.2 documentation + IRC Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation
    Many IRCops find bots by seeing if they reply to ‘hello’ in a msg. You -can change this to another word by un-commenting thse two lines and +can change this to another word by un-commenting these two lines and changing “myword” to the word wish to use instead of’hello’. It must be a single word.
    @@ -289,7 +290,7 @@

    Search

    diff --git a/doc/html/modules/mod/notes.html b/doc/html/modules/mod/notes.html index 8365399dd..f27bedad9 100644 --- a/doc/html/modules/mod/notes.html +++ b/doc/html/modules/mod/notes.html @@ -6,7 +6,7 @@ - Notes Module — Eggdrop 1.9.2 documentation + Notes Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/pbkdf2.html b/doc/html/modules/mod/pbkdf2.html index 783d9de0d..b02d7e06e 100644 --- a/doc/html/modules/mod/pbkdf2.html +++ b/doc/html/modules/mod/pbkdf2.html @@ -6,7 +6,7 @@ - PBKDF2 Module — Eggdrop 1.9.3 documentation + PBKDF2 Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/seen.html b/doc/html/modules/mod/seen.html index 81c0da8a8..23b657e19 100644 --- a/doc/html/modules/mod/seen.html +++ b/doc/html/modules/mod/seen.html @@ -6,7 +6,7 @@ - Seen Module — Eggdrop 1.9.3 documentation + Seen Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/server.html b/doc/html/modules/mod/server.html index c1479a6c2..e83a3db20 100644 --- a/doc/html/modules/mod/server.html +++ b/doc/html/modules/mod/server.html @@ -6,7 +6,7 @@ - Server Module — Eggdrop 1.9.3 documentation + Server Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/share.html b/doc/html/modules/mod/share.html index 478c33ec1..2ffb85ec0 100644 --- a/doc/html/modules/mod/share.html +++ b/doc/html/modules/mod/share.html @@ -6,7 +6,7 @@ - Share Module — Eggdrop 1.9.3 documentation + Share Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/transfer.html b/doc/html/modules/mod/transfer.html index f41c5875e..9e2451cf1 100644 --- a/doc/html/modules/mod/transfer.html +++ b/doc/html/modules/mod/transfer.html @@ -6,7 +6,7 @@ - Transfer Module — Eggdrop 1.9.3 documentation + Transfer Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/twitch.html b/doc/html/modules/mod/twitch.html index acf9abca6..c7ad96918 100644 --- a/doc/html/modules/mod/twitch.html +++ b/doc/html/modules/mod/twitch.html @@ -6,7 +6,7 @@ - Twitch Module — Eggdrop 1.9.3 documentation + Twitch Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/uptime.html b/doc/html/modules/mod/uptime.html index 2cc120325..45993ea2a 100644 --- a/doc/html/modules/mod/uptime.html +++ b/doc/html/modules/mod/uptime.html @@ -6,7 +6,7 @@ - Uptime Module — Eggdrop 1.9.3 documentation + Uptime Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/mod/woobie.html b/doc/html/modules/mod/woobie.html index 23d5d7457..b9b05d0a4 100644 --- a/doc/html/modules/mod/woobie.html +++ b/doc/html/modules/mod/woobie.html @@ -6,7 +6,7 @@ - Woobie Module — Eggdrop 1.9.3 documentation + Woobie Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index 548e573d9..db0584e67 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -6,7 +6,7 @@ - Writing an Eggdrop Module — Eggdrop 1.9.3 documentation + Writing an Eggdrop Module — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/objects.inv b/doc/html/objects.inv index a4c3f8558582d0a190975a9a53497a39705f5c8a..769b0721ecbe8dca1923d114d1645a7c5de1f80d 100644 GIT binary patch delta 1174 zcmV;H1Zn%y3I7R@KLIq6Kt6vPHxRt*D+X|mR)jb}4!P|UUf63aEEzcl91bNBJ0b@p zM_T=Tn$IC;n#yHYVs#Z?-NhDZ#&$^e2i$fCw$Nhdqw1!|y>PgFbOFPMK?3v!c|BZtk`O|-I&7F&Vb?~a~ z(HvCfSVk$xW;L4h8L5UkgAg%}YP9wH+u$kU*hzNHW%l0sx81)*inZV9-6iSOeh z-O%9%7tlo9J-kI$CvL15z{q+0v5k~H2mE@276KymIm8G0fe9`;_EGZVs85a;`*FoP zCQN-A2ggZXTx^(P(hq;xmq~{_{oD}I$bpGQ%TZC*y!?Dc*G0*e7bvleM+QpI4IItIfR!$PyLl*XH&z_zswJn=Z9_K(?nWF z61FRKqc#CdHvtD3?g0?ws)y@30)87lI$U~G<%0HO$GZF&=2(AD*G*zvxH+a}Pn=m! z6hM(1(}MO=orvL5tQJOuNtG^DdKBhHHI2fp7G8z9QcbCFt%YY{?o?IE-D}}ph)van zCKsD~*xa$I8qv)PFPm9cjT~Jq_cX-5YV_RQ=H9ljr<%y*U8Qr)YN|>PGy zRl}oR;~yV6)3_*ZW{=Yh3hWREuWae6t0_0pmt@LLcuRkZ{LFF^WoB6k)G{wMBZ|)Y zLq8UC$l-6~U}HnxqO+vTg*o!v&GNOvOBw5!dCpFGic?djT4tWBMSh~(B13^b&rvfP zXv9gc!Pk^FnkqgNu7w6v?|AFrg{onLz9nk$^st9rw?`- zjE(}*2xbroHy(fRxfq+jK54qHG{?Z>=r4-w8AIW)8gJ7F>Hsk#of>)m`M`Z!&Xq5T@#z!O{@a?m+i9`=s< zy0(8vlwu!dt;ZIT2}n2v_+}ffW;?dpaHv#RRubv4WyEIJ7HxU>MsfO%QQUYamhMah zg&z?+KBReE;jaH@`^%u&Dfsfo4#Oe%loPpIpj7^WRTs(VC_YY0VUBkF)}HT zlxO_+X+D}F<)(8P+g)8HitH}-uvSfW!`$D-*#6I6bhRxw$kM=Y)cRu6kaOkxf zR{d%s~1*GNM9vWK#0M)DjSF!Mt` z(rq{1-~yV6yN6d~_43Aw0YuK@_bpQP0`SWXT1-IdbIgzQ1D8Vf{G;S!G!(~+`??Z6 zm$v>G5932#d~STitRH`?FO!aS`nh4UQ6ra)QIqa?^YY`NX_W=8v1}MN@v~GZAY7{d z;c6LM0P{3w{fScw0SN*>p6(vMJtfjK9yIHn9KlOqp#Ds`i$_D~Umil`{!y>+X(p|a zM7@>1(VGCKlYotk=Ku(C)Z=B1KzNOi9Sdg*~Qa&zwa~ z6hKiM^MdwDpO_U&uC9!Tk}6%Q^eD=WY8r)GU3nGdN;RdzwXQsia;K_N?p{~kMc7nb zXm+ushbZ(Nk4=Y_~zOZ2!VgGee3sMY6<}j60i4vKR$nrfrZ<^0>RTqxBZ@voo z2H&Gdr%H>RqvcHX;PT?p-~#rX*-3NaEf6U+o@0MB(#3fG#ET{NDn^=ILDiMp@(upKkJqX`&833kG; zSUY_g-K@I#i<#qmK(-s!Fua}M=!lKZ(Q>nQUFb%KpcMbGYcsWkOhn=?z%Mr@HQT8* zRzO^T!LpLbKrI7DRM%?d=36bgH;UrpankP3Om;B(@5Gp% - Search — Eggdrop 1.9.3 documentation + Search — Eggdrop 1.9.4 documentation @@ -31,7 +31,7 @@

    + href="index.html">Eggdrop 1.9.4 documentation @@ -59,6 +59,7 @@

    Table of Contents

  • IPv6 support
  • TLS support
  • IRCv3 support
  • +
  • Account tracking in Eggdrop
  • Encryption/Hashing
  • Twitch
  • Advanced Tips
  • @@ -146,7 +147,7 @@

    Search

    diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js index 20e288fc4..4857dc0ce 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/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/setup","tutorials/tlssetup","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"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},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/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/setup.rst","tutorials/tlssetup.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"],objects:{},objnames:{},objtypes:{},terms:{"04may2000":34,"3rd":5,"5c0":[21,30,34],"break":[15,41],"byte":[17,21,23,27,41],"case":[14,19,21,28,30,34,41],"catch":41,"char":[27,34,41],"const":27,"default":[2,3,4,10,11,14,15,17,21,23,29,30,31,32,34,40,41,43],"export":44,"final":[0,4,28,29,30,34,40],"function":[0,1,2,4,6,7,19,24,30,33,34,36,40,41,44,45],"import":[27,28,29,30,34,38,41],"int":27,"long":[6,10,14,18,21,22,32,34,41,42,45],"new":[4,5,7,19,24,28,29,30,34,35,36,37,38,39,40,43,44,46],"null":27,"public":[0,1,4,28,29,31,34,41,43,44,47],"return":[17,27,40,45],"short":[2,27,29,36,43],"static":[2,3,10,27,29,41],"super":2,"switch":[5,27,30,34,41,43,44],"throw":41,"true":28,"try":[3,4,6,7,20,21,25,27,28,29,30,34,45],"var":41,"void":27,"while":[0,4,5,10,16,24,30,32,34,38,40,41,46],AND:[19,30,41],ARE:28,Adding:[2,24,46],And:28,CVS:4,DNS:[2,6,41],DOING:28,For:[1,2,3,5,7,15,21,30,31,33,34,36,37,38,40,41,43,44,45,46],IPs:[29,31,36],NFS:23,NOT:[5,28,30,33,34,41,45],Not:[6,21,29,37],One:[0,4,28,41],THE:3,TLS:[2,3,4,5,29,30,34,41],That:[24,28,30,33,41,47],The:[0,1,2,3,4,5,6,10,11,13,14,15,16,19,21,22,23,24,25,27,28,29,31,32,33,34,35,37,40,41,43,44,45,46,47],Their:36,Then:[5,29,30,43],There:[1,3,4,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,29,31,32,34,36,40,42,43,46,47],These:[5,11,17,27,30,32,33,34,36,42,43,45,47],Use:[16,17,19,21,27,30,34,41],Used:41,Useful:41,Using:[2,4,27,41],WILL:45,With:[0,4,6,15,33,34,40,41,43],YES:7,Yes:7,aaa:41,abcdechannel:41,abil:[2,7,16,31,35,41],abl:[3,6,10,15,17,21,30,34,38,40,41],abort:[23,30,41,43],about:[2,4,6,24,25,27,28,29,34,41,44,46],abov:[1,3,4,10,17,19,27,28,29,35,41,42],absolut:[0,31,41,47],abus:[0,2,4],accept:[15,22,24,31,33,34,41,43,46],access:[0,4,16,21,27,28,29,30,35,38,40,41,43,45,46,47],accomplish:3,accord:[1,41,47],accordingli:21,account:[0,4,16,18,27,29,30,35,37,39,40,46],accur:[41,45],across:[0,4,33,37,39,41,44],act:[16,27,34,35,41,43],action:[28,29,31,34,41],activ:[2,10,16,30,32,38,41,43],actual:[0,4,15,27,28,31,34,38,41],acut:[],add:[3,4,5,7,10,16,17,24,27,28,30,31,33,34,35,40,46],add_builtin:27,add_hook:27,add_tcl_command:27,add_tcl_int:27,add_tcl_str:27,added:[0,3,4,5,19,22,24,28,30,33,34,35,36,37,40,41,43,45],addhost:17,adding:[4,7,21,27,34,35,37,41],addit:[2,4,5,16,21,30,34,41,43,45],addition:[16,30,41],addlang:[34,41],address:[18,22,25,30,33,34,36,43],addus:30,adh:34,adjust:[0,4,17],admin:[34,42],admit:23,advanc:[0,2,4,6,20,28,35],advantag:[5,30,44],advertis:[0,4,41],advis:[3,21,23],affect:[5,10,24,34,35,36,41,46],affet:41,affili:[1,46],after:[3,4,10,16,17,21,27,28,29,32,34,41,43,44,46],afterward:[17,34],again:[6,15,25,27,32,33,34,40,41,45],against:[10,15,19,21,28,30,40,41,45],age:41,aggress:33,aka:34,alarm:41,alert:46,algorithm:[19,40],all:[1,5,6,7,10,13,14,15,17,19,21,22,27,28,29,30,31,32,33,34,35,36,37,38,40,41,43,44,45,46,47],alloc:[27,41],allow:[0,3,4,5,6,7,10,11,15,16,17,18,19,21,22,23,24,27,28,29,30,33,34,35,40,41,43,44,46],alltool:34,almost:[0,4,30,32,47],along:[4,15],alphabet:34,alphanumer:46,alreadi:[10,21,27,28,30,31,33,34,40,41,46],also:[0,2,3,4,7,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,29,30,32,33,34,35,38,40,41,42,43,44,45,46,47],alt:[21,34],alter:[15,35,41,46],altern:[2,4,16,21,30,31,33,34,41,43],although:[17,30,34,41],altnick:[21,30],altogeth:19,alwai:[0,3,4,10,30,32,34,41],amount:[6,34],anachron:31,ani:[0,1,3,4,5,7,12,15,16,17,18,21,22,24,27,28,29,30,32,34,35,38,40,41,43,45,46,47],annoi:28,anonym:34,anoth:[0,10,15,17,18,21,22,27,30,33,34,41,42,45],another:5,ansi:41,answer:[0,7,13,16,21,28],any_other_funct:27,anymor:[6,9,19,34],anyon:[10,32,41],anyth:[0,4,15,28,29,30,33,34,38,41,45],anywai:34,anywher:[38,41],aol:[28,40],aop:10,apart:[27,34,41],api:6,apostroph:38,appear:[29,30,33,34,41,45],append:[27,41],appli:[30,32,34,40,47],applic:[1,34,41],appreci:31,appropri:[3,5,30,34,37,39,40],april:[24,45],apt:[30,31],arbitrari:41,arbitrarili:45,archiv:4,area:[6,15,34,41,44,47],aren:[30,34,41,44,45],arg:27,argument:[15,17,28,29,36,41,45],around:[0,4,24,31,36,41,46],arriv:41,ascii:41,ask:[4,17,29,30,38,41,43],assign:[33,34,41],assist:[2,30,43],assoc:[2,6],associ:[24,41,46],assum:[21,28,30,31,32,34,41],assumpt:37,assur:45,asynchron:[6,14,41],attach:[41,45],attack:[10,19,40],attempt:[5,10,16,17,21,24,31,32,33,34,41,43,46],attent:[5,21,41],attribut:[32,33,41,47],auch:27,aug:41,august:17,auth:[34,43],authent:[2,40,46],author:[28,31,34,43],auto:[33,47],autobotchk:[3,4,29],autoconf:3,autoconfigur:3,autodetect:43,autohalfop:10,autom:[0,2,4],automat:[2,3,4,5,12,16,21,30,32,33,34,35,36,40,41,43,46,47],autoop:10,autosav:12,autovoic:[10,47],avail:[4,10,15,19,25,27,29,30,31,34,35,36,38,41,46],avoid:[6,14,29],awai:[35,37,41],awar:41,awesom:28,b33f:30,baa:41,back:[21,28,30,34,36,39,40,41,44],background:[2,4,28],backslash:30,backup:[5,27],backward:[5,37],bad:[10,41,47],badg:47,badgui:45,ban:[0,2,4,10,17,24,33,34,35,46,47],bandwidth:[6,11],banner:[34,42],bar:41,barr:34,base64:29,base:[4,30,34,40,41],basi:30,basic:[2,4,6,7,20,28,30],bask:39,bbb:41,bcst:41,bear:1,becaus:[0,4,16,21,27,28,34,41,44,45,46],becom:[29,30,34,41],been:[0,1,4,5,15,17,21,27,32,34,35,41,45],befor:[0,4,10,14,16,17,18,21,22,23,27,29,30,33,34,41,46],began:37,begin:[16,28,36,41],behalf:41,behav:41,behavior:[13,17,32,34,36,41],behind:34,being:[0,4,10,15,17,21,31,35,36,41,45],beldin:33,bell:41,belong:34,below:[10,15,16,22,24,27,28,30,34,40,41,45],best:[3,6,16,30,33,41,45],better:[3,4,6,20,30,34],between:[3,6,10,15,18,21,22,31,33,34,36,41],beverag:40,big:[5,23,41,44],binari:[3,31],bind:[2,16,17,21,24,27,28,34,44,46],birthdai:34,bit:[3,15,24,28,30,31,34,41,43,46],bitch:10,bitchx:41,blank:41,bless:1,blindli:17,bloat:7,block:[23,24,27,30,42,46],blowfish:[1,2,5,6,19,27,34,40,41],bodi:28,bogu:34,bold:[4,41,42,47],boldfac:41,boot:34,bore:[2,4],boston:1,bot:[0,1,3,4,5,6,7,10,12,13,14,16,17,18,19,20,21,22,23,25,27,28,29,30,31,32,34,35,36,37,38,40,42,43,44,45,46,47],bota:33,botaddr:41,botaddress:41,botattr:33,botb:33,botc:33,botchk:[4,29,30],botdir:30,botfl:41,botflag:[2,22],both:[0,4,10,21,23,31,33,36,40,41,43],botnam:33,botnet:[0,2,3,4,6,8,10,12,15,21,25,30,35,36,38,40,41,44,47],botnetcentr:42,botnetnick:41,botnetop:10,botnick:[21,28,29,30,34],bottom:28,bottre:2,bounc:17,bound:[16,34,41],boundari:14,box:[30,34],brace:10,bracket:36,branch:[4,39],breach:41,brief:30,broadcast:[24,38,41,45,46],broken:[15,28,34,41],brows:15,brute:19,buf:17,buffer:22,bug:[0,3,4,28,30,39],built:[2,16,41,44],builtin:[16,41],busi:28,button:[39,46],bypass:41,bywho:41,cach:[14,41],cafil:[34,43],calcul:21,call:[0,3,4,27,28,29,33,34,41,45],can:[0,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],cancel:[6,41],cannot:[0,27,30,40,41,47],cap:[2,27,35,46],cap_net_bind_servic:16,capabl:[2,34,35,41,44,46],capac:46,capath:[34,43],capit:[4,47],caption:[],captur:[30,41,44],care:[34,41,46],carefulli:[30,41],carelessli:5,categori:41,caught:41,caus:[16,30,33,41,44],caution:41,cbc:41,ccht:45,center:42,central:[15,34],cerfif:[],cert:[29,34,43],certain:[32,34,35,36,41,42,45,47],certainli:[24,30,46],certif:[2,3,21,29,31,34,41],certifict:43,cet:34,chaddr:[5,33],chain:[34,43],challeng:[28,29],chan:[5,10,17,28,29,30,44],chanc:30,chanfil:[10,30,44],chang:[1,2,6,9,10,15,17,19,21,22,24,28,30,31,33,34,35,37,38,39,43,45,46],chaninfo:[29,33],chanmod:[10,29],channel:[0,2,4,5,6,8,12,17,20,21,22,24,27,28,30,32,33,34,35,38,42,44,46,47],channelflag:41,chanrec:[17,41],chanserv:10,chanset:[10,29,33],charact:[2,10,15,21,30,33,34,36,40],chase:[0,4],chat4:2,chat6:2,chat:[0,2,4,6,13,21,29,30,33,34,35,38,41,43,45,46],chatter:34,chattr:[29,47],check:[4,5,10,21,27,28,29,31,34,40,41,43,45],checkout:[30,39],chfinger:34,chghost:[35,37],chjn:41,chmod:[3,34],chof:41,choic:[1,21,28],chon:41,choos:[3,7,29,30,34,35,46],chpass:40,chpt:41,chri:1,chunk:21,cidr:[34,41],cipher:[34,41,43],claim:[24,46],clarifi:32,clean:15,clear:[4,6,39,41,43,45,46],clearchat:[24,45],clearmsg:[24,45],cleartext:41,clemson:47,click:[39,46],client:[15,16,21,24,29,30,34,37,41,43,46],cloak:29,clone:[2,4,10,30],close:[27,41],cmd:[34,41],cmd_t:27,cmsg:45,code:[1,2,3,4,7,27,28,41],coder:[],col:42,cold:[39,40],colon:[34,36],color:[4,41],column:42,com:[2,4,5,6,20,21,28,29,30,33,34,40,41,43],combin:[35,41],combo:29,come:[4,6,17,21,30,39,41],comfort:30,comma:[34,38,41],commadlin:30,command:[2,3,6,10,12,15,16,17,20,21,27,28,29,30,31,32,33,34,35,36,38,40,43,46,47],commandlin:30,comment:[15,17,25,28,30,34,40],commerci:30,common:[2,21,30,31,33,34,37,43,47],commonli:[29,31,34,41],commun:[2,27,33,38,39,41],compat:[3,5,37,41,45,46],compil:[0,2,3,4,27,30,31,34,36,41,43],complet:[3,4,10,15,22,30,35,41,43,47],compliant:[17,21,41],compon:41,comprehens:45,compress:[2,6,29],compris:37,concurr:[34,40],conf:[3,7,16,29,30,37,41,43],config:[2,3,4,6,7,10,11,12,13,14,16,17,18,19,21,22,23,24,25,27,28,29,31,32,33,34,36,40,42,43],configfil:41,configur:[2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,34,36,39,41,43],confirm:[39,41],conflict:16,connect:[2,4,5,6,14,15,16,21,24,27,29,30,33,34,36,38,43,46,47],connet:[],consequ:45,consid:[4,30,32,34,38,41],consider:40,consist:[33,35,38,41],consol:[2,4,6,10,27,35,38],constantli:27,constitut:[10,21,34],consult:[36,37,43],contact:[28,34],contain:[1,3,4,5,28,30,33,34,36,41,43,45],content:[40,41,45],contest:6,context:27,continu:[30,41],contribut:39,control:[0,2,4,17,21,28,29,33,34,35,43,46,47],conv_form:29,conveni:34,convers:[27,38,43],convert:41,cooldud:30,coordin:34,copi:[1,2,5,7,15,23,27,30,41],copyright:[0,1,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,32,33,34,35,36,37,38,39,40,41,42,43,44,47],core:[2,3,6,7,17,18,21,27,28,41,44],correct:[3,31,34,40],correctli:[3,41],correspond:[10,29,32,41],cos:10,could:[1,21,28,33,34,36,39,40,41,43,46],couldn:41,count:21,counterpart:41,coupl:41,cours:[3,28,33,34,41],cover:[32,33],cpu:[21,34,41],crappi:41,crash:[3,41],creat:[0,3,4,15,16,22,27,28,29,30,32,34,39,40,41,43,44,46],creation:29,credit:[28,41],cron:41,crontab:[2,3,29,41],cross:30,crotab:[],crt:[29,34,43],crypto:40,cryptograph:[19,40,41],crytopgraphi:40,ctcp:[2,6,10,21,29,30,34,41,43],ctcr:41,ctrl:41,curl:30,current:[2,4,6,7,9,15,17,18,19,24,27,29,30,34,35,38,41,42,43,45],custom:[16,21,28,29,35,41,43],cut:29,cycl:[10,21,34],cygwin:[2,36],daemon:[16,29,34],dai:[18,23,34,41,44],daili:[30,41],dalnet:[4,17,21],danc:41,danger:41,danish:34,data:[4,10,22,27,31,40,41],databas:[15,41],date:[1,4,30,34,41],db8:[21,30,34],dcc:[0,2,4,6,15,20,21,23,27,29,30,33,35,36,38,40,44],dead:30,deal:[34,41,47],dealloc:27,debian:[30,31],debug:[3,25,27,28,34,41,43,45],dec:[15,41],decemb:[0,26,35,38],decent:27,decid:[37,40],decis:46,declar:[28,41],decreas:34,defens:28,defin:[4,6,10,11,13,17,21,27,28,30,32,33,34,37,41,47],definit:[28,30,31,40],degrad:46,dehalfop:[10,41,47],del_hook:27,delai:[10,15,17,28],delet:[30,41,44],deliber:43,delimit:41,deliv:41,demand:[0,4],demonstr:[6,26],denot:[31,41],deop:[10,41,47],depend:[27,32,39,41,43,47],deprec:[5,31,41],deprici:21,depth:[34,43],der:29,deriv:40,desc:[6,27],describ:[27,28,30,31,33,34],descript:[6,27,28,29,34,41,45,47],descriptivebranchnam:39,deserv:28,design:[0,2,4,19,37,45],desir:[7,27,29,30,40],despit:31,dest:[3,6,30,31,34,41,43],destin:[16,27],destroi:[0,4],detail:[3,4,6,27,30,41,43,45],detect:[7,21,31,36,41,43],determin:[3,16,27,29,30,33,36,41,43],dev:[4,30,31],devel:3,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,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],devleop:[],dict:[41,45],did:[1,40],didn:[28,30,41],die:[27,29,30],died:21,differ:[1,3,4,5,10,15,21,28,31,34,40,41,44,45],differenti:41,diffutil:3,digest:[19,41],digit:[34,43],dinner:40,dir:[6,29],direct:[7,31,33,39,41],directli:[5,6,10,16,22,30,41],directori:[2,3,4,6,7,23,27,29,30,31,35,39,43,44],disabl:[10,17,21,34,36,41,43],disc:41,discard:[22,41],disclaim:[2,41],disconnect:[21,22,34,41],discontinu:46,discourag:17,discuss:[4,39],disk:[0,23,30,34,35,41],displai:[12,15,17,21,29,30,34,41,42,45],displaynam:27,dispos:41,dissect:28,distinguish:41,distribut:[0,1,4,30],distro:31,dload:23,dns:[6,14,34,41],doc:[0,3,4,5,6,21,28,31,34,38,41,45,46],document:[2,16,28,30,31,33,36,37,39,43,44],doe:[10,24,28,29,32,34,37,38,41,45,46,47],doesn:[12,14,17,30,38,41,44,45],doing:[19,21,28,34,41,42],domain:[1,14,33],don:[4,7,10,14,15,17,21,22,24,27,28,29,30,33,34,38,41,43,44],donat:[24,46],done:[5,22,27,29,30,31,33,39,40,41,46],donkei:30,dontkickop:10,dot:38,doubl:21,doubt:36,down:[0,3,4,15,33,41],downer:24,download:[3,4,5,7,15,23,34,35,41],dozen:28,dp_help:27,dp_log:27,dp_mode:27,dp_server:27,dp_stdout:27,dport:16,dprintf:27,drastic:[27,41],driven:41,dronepup:41,drop:[3,4,34,41],dropp:[],dst:6,due:[17,21,28,34,41,45],dump:[21,34,41],duplic:41,dupwait:34,dure:[3,11,22,27,29,30],dynam:[2,3,10,29,30,32,41],dynamicban:[10,41],dynamicexempt:[10,41],dynamicinvit:[10,41],each:[0,4,6,10,15,18,23,28,29,30,33,34,35,38,41,44,45,47],earlier:19,easi:[5,28,30,41,43],easier:[3,19],easili:[0,1,2,4,28,35,41],east:34,ebai:34,ecb:41,ecdsa:29,echo:[35,37,44],ecparam:29,eden:41,edit:[2,3,28,44],editor:[29,30],editplu:30,edu:[41,47],effect:[15,32,34,41],effici:[0,4,30,33,34,35],effort:[0,4],efnet:[4,17,21],egg_lang:34,eggdrop1:7,eggdrop:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,32,33,36,37,40,42,43,44,46,47],eggdroptest:45,egggdrop:2,egghead:[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,28,30,32,33,34,35,36,37,38,39,40,41,42,43,44,47],egghelp:[4,30],eight:[34,41],either:[3,4,15,16,29,30,31,32,33,34,36,41,43,45],element:41,elimin:29,els:[28,38,41],email:[4,29,34,41],embed:41,emerg:37,emot:45,empti:[41,45],enabl:[0,2,4,7,10,12,15,17,21,23,27,28,30,33,34,35,36,37,43,44,46],enclos:[10,36,41,45],encod:[41,42],encount:[30,46],encourag:[2,30,40],encpass2:40,encrypt:[2,5,6,9,19,29,31,33,35,43],end:[3,27,34,40,41,42],endless:10,enforc:[10,29,34],enforceban:10,english:[34,44],enhanc:7,enjoi:40,enlarg:3,enough:[34,41],ensur:[27,29,30,33,40,41],enter:[3,10,15,29,31,34,38,39,40,41,43,45],entir:[30,41,45,46],entitl:47,entri:[3,4,29,30,34],env:34,environ:[16,34,35,43],eof:41,equal:41,equival:[6,21,31],equivil:[],eras:[15,41],error:[4,21,27,30,34,41,46],especi:28,essenti:40,est:34,establish:[36,41,43],etc:[0,2,4,10,17,24,27,30,33,34,35,41,44,47],eth0:16,ethic:34,etiquett:4,european:34,evalu:41,even:[0,4,7,15,17,27,30,32,33,34,35,38,41,46],event:[0,4,24,27,33,34,45,46],eventu:19,ever:[29,30,34,41,43],everi:[0,3,4,10,15,17,21,23,27,28,29,32,34,36,40,41,47],everydai:34,everyon:[38,41],everyth:[3,28,41],everywher:[34,36,41],evnt:[21,41],exact:41,exactli:[15,17,27,28,41],examin:27,exampl:[2,3,4,5,7,15,16,21,27,28,29,30,31,34,38,41,43,44,45,46],exceed:34,except:[4,13,21,27,34,41,43],excess:[4,10,21],exchang:29,exclud:41,exclus:[21,41],execut:[2,3,7,27,28,41],exempt:[0,1,2,4,10,17,24,33,35,46,47],exhaust:[41,45],exist:[0,4,15,21,27,40,41,45,46,47],exit:[4,6,12,15,21,41],expand:[0,2,4],expans:41,expect:[6,13,34,41],experi:[3,15,28,30],experienc:3,expir:[10,17,18,21,32,34,41,43],explain:10,explan:[10,30,31,41,45],explicit:37,explicitli:[5,41,43],express:41,extend:[24,35,37,41],extens:[3,30],extern:[16,29,34],extra:[7,34,37],extract:[30,41],f270:30,face:46,fact:[0,4,45],fail:[14,23,34,41,43],failur:[41,45],fake:41,fals:41,famili:34,familiar:[4,28],fanci:40,fancyp:28,far:15,fast:30,faster:41,fastest:4,fatal:41,fault:27,favor:[5,22],featur:[0,2,4,7,10,17,21,22,29,30,34,36,37,39,41,43,46,47],februari:13,feel:[4,5,27,39],few:[24,28,30,31,34,41,46],field:[21,34,41,43],fifth:1,fight:10,figur:[3,30],fil:41,file:[1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,33,35,36,40,42,43,47],file_receiv:41,file_send:41,file_send_pend:41,filearea:41,filedb:[15,41],filemask:6,filenam:[6,10,18,30,34,43],filepath:6,files:15,filesi:[2,6,34],filestat:6,filesystem:[15,41,47],fill:[34,39,43],filt:[27,41],find:[3,6,14,17,20,27,28,29,30,38,39,41,46],fine:[17,21,34,45],finger:[13,30],fingerprint:[29,34,43],finish:[4,15,30,41],finnish:34,firewal:34,first:[0,2,4,5,15,19,21,27,28,30,31,33,34,40,41,43,44,45],five:41,fix:[0,3,4,27,34,41],flag:[2,5,6,10,13,17,22,27,28,30,34,35,42],flagmask:45,flash:42,flat:41,flexibl:[41,43],flood:[0,4,10,13,18,21,33,34,35,41,47],floor:1,flud:41,flush:22,focus:[24,46],folder:7,follow:[3,4,5,10,15,17,21,24,27,30,31,33,34,35,37,39,40,41,42,43,44,45,46],foo:[28,29,41],forbid:3,forc:[3,10,12,15,19,22,28,34,36,41],forcefulli:43,forev:34,forget:41,fork:[31,39],form:[0,4,27,28,41,42],format:[7,21,27,29,30,31,34,40,41,42,45],forward:18,found:[2,4,27,34,41,45],foundat:1,four:[10,28,34,36,41,42],fourth:28,fprint:[34,43],fragil:41,franklin:1,free:[1,2,5,27],freebsd:36,freeli:[0,4],freenod:21,french:34,frequent:[4,30],fresh:34,fri:41,friend:[10,47],frim:27,from:[0,1,2,3,4,5,6,7,10,15,16,17,18,19,21,22,24,27,28,29,30,31,32,33,34,36,38,40,42,43,44,45,46,47],front:[10,28,30,31,41,46],ftp:[5,30],full:[3,4,5,24,30,36,41,43,45,46],fuller:1,fulli:[5,34,41,46],fun:[3,46],func:27,func_nam:27,func_tabl:27,function_to_cal:27,further:[29,41],futur:[3,17,30,40,41],fwd:18,gain:[0,4,40,47],game:[0,2,4,24,46],garbag:27,gatewai:[24,45,46],gave:30,gayteen:0,gcc:3,gener:[0,1,3,4,19,24,28,29,30,37,40,41,43,46],genkei:29,genrsa:34,geo:28,german:34,get:[6,7,10,21,22,23,27,28,31,34,38,47],geteggdrop:[2,4,30],getinfo:41,getop:10,gif:15,git:[2,3,30,39],github:[2,4,30],give:[3,4,10,15,21,28,30,33,34,35,38,40,41,47],given:[4,14,15,16,30,41,45],global:[2,12,16,17,21,22,27,28,32,33,45,47],globalflag:41,gmt:[34,41],gnu:[0,1,3,4,11],goe:[3,10,29,32,33,38,41,43],going:[0,4,15,21,28,31,41],gone:[17,41],goober:41,good:[0,15,21,24,28,30,34,41,46,47],got:41,gpl:[0,4],grab:41,grain:28,grant:[29,35,43,46],graphic:43,greater:41,gree:28,greet:[0,2,4,10,28],greetmsg:28,greetscript:28,grep:29,ground:34,group:[15,16,34,37,41],grown:0,gseen:[6,20],guarante:17,guess:17,gui:45,guid:[2,3,28,30,31],gunzip:30,guppi:41,gzip:[11,41],had:[3,5,10,33,34,41,46],haha:4,halfop:[10,41,47],hand:[28,34,41],handi:30,handl:[28,29,32,34,40,43,45],handshak:41,hang:[6,14],happen:[28,30,32,34,41],hard:[28,34],harder:28,hardwar:[0,4],has:[0,1,2,4,5,10,14,15,17,21,28,30,31,32,33,34,35,36,40,41,43,45,46,47],hash:[2,5,19,30],hasn:21,hate:47,have:[0,1,3,4,5,6,9,10,12,15,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,36,38,40,41,43,44,45,46,47],haven:30,head:34,header:[2,4,27,28,31,43],heaven:3,held:45,hello:[17,21,29,30,34,35,41],help:[0,3,13,21,27,28,29,30,32,33,34,36,38,41,42,47],helper:3,henc:[7,27,41],here:[2,4,10,13,14,15,17,18,21,23,28,29,30,32,33,34,41,44,45],herself:4,hidden:[15,30,35],hide:[6,36,41],high:44,higher:[17,19,22,23,30,43],highest:41,highli:[3,21,30],highlight:47,him:1,himself:4,hint:28,his:[21,30],histori:45,hit:41,hold:[22,41],hole:34,home:[3,15,16,29,30,43],hook:27,hook_5minut:27,hook_backup:27,hook_daili:27,hook_di:27,hook_hourli:27,hook_idl:27,hook_load:27,hook_minut:27,hook_num:27,hook_pre_rehash:27,hook_read_userfil:27,hook_rehash:27,hook_secondli:27,hook_userfil:27,hope:[30,46],hopefulli:[3,41],hors:30,host:[0,2,4,10,16,21,24,28,32,33,34,43,45,47],hostmask:[28,29,32,33,35,40],hostnam:[6,10,14,29,34,36],hosttarget:[24,45],hour:[6,25,27,32,34,41],hourli:[18,27,34],how:[0,3,6,10,13,14,15,18,21,22,24,28,29,30,31,32,33,34,41,43,44,45,46],howev:[4,7,13,21,29,31,34,40,41,43,44],htgt:45,html:[4,36],http:[2,4,6,20,25,30,37],hub:[4,22,30,33,34,40,43],hubbot:31,hubcap:47,humor:29,hup:41,hurt:5,iconfig:[3,7,30],idea:[28,30,39],ideal:[40,46],ident:[2,6,7,17,21,29,34,36,40,41],identd:[16,30],identifi:[29,34,40,41,47],idl:[10,27,41],idx:27,ignor:[0,4,13,21,22,28,33,34,35,41,45],ill:41,imag:4,immedi:[21,30,40,41],imperson:16,implement:[6,7,16,31,34,37,39,40,41,46],implementatino:31,impli:[1,27],importantli:28,improv:[0,4],inact:[10,23],inc:1,incess:0,includ:[0,2,3,4,7,17,25,27,29,30,31,32,34,35,36,40,41,43,45,46],incom:[15,34,41],increas:[34,40],incred:[30,41],independ:7,indic:[21,27,30,41,45],infeas:[24,46],infin:34,infinit:15,info:[3,4,10,12,17,27,30,34],inform:[0,2,3,4,5,6,10,15,25,27,28,29,30,33,34,36,37,41,43],infrastructur:43,ing:[17,24,46],init:[21,34,41],init_serv:21,initi:[27,28,30,36,37,41,43],input:41,insecur:10,insensit:41,insert:[10,42],insid:[28,34],instal:[0,4,5,28,29,31,34],instanc:10,instantli:21,instead:[1,4,5,10,15,16,17,22,24,30,34,40,41,43,44,46,47],instruct:[7,30,40],integ:[10,41],integr:2,intend:[3,32,41],intens:21,intent:[24,46],intention:28,interact:[3,4,6,16,17,34,41,43,46],intercept:41,interchang:[31,36],interest:4,interfac:[2,24,41,46],intern:[21,34,41,45],internet:[0,4,41,43],interpret:[3,36,41,42],interv:41,introduc:[4,30,41],invalid:41,invers:42,invit:[0,2,4,10,17,24,33,35,37,46],invite:41,invok:41,involv:29,invt:41,ipaddress:41,iptabl:16,ipv4:[30,34,36],ipv4address:41,ipv6:[2,30,34,35,41],ipv6address:41,irc:[0,4,6,15,16,21,24,28,29,30,32,33,34,35,36,37,38,41,42,44,45,47],ircawai:41,ircd:[17,21,41],ircii:[23,41],ircnet:[4,10,17,21],ircop:[10,17],ircu2:17,ircv3:[2,35,41,44],isn:[6,15,21,22,25,30,32,41],isol:33,isop:10,isoptest:10,isp:30,issu:[4,5,16,24,30,34,39,41,43,45,46],issuer:43,istn:10,ital:41,item:41,its:[1,2,4,7,10,15,16,17,19,21,22,24,28,30,33,34,35,39,41,44,46],itself:[27,28,29,34,41],itsself:15,j9irk4vs28b0obz9easys4w2ystji3u:46,jan:[41,43],janitor:[15,47],januari:[1,8,9,12,18,20,23,25,41],jkp:30,job:43,john:1,join:[2,6,10,12,17,18,24,28,30,31,32,34,35,37,38,41,45,46,47],jpk:34,jul:7,juli:0,jump:[21,33,43],jun:44,june:16,jupe:41,just:[0,3,4,5,6,14,15,17,19,22,27,29,30,33,34,38,40,41,44,45,46],karma:39,keep:[2,4,10,15,21,23,30,34,46],kei:[2,3,10,17,24,28,29,34,40,45,46],kept:[32,34],keyout:[29,43],keypair:[29,31],kick:[10,17,21,34,41,44,47],kicker:41,kiddi:34,kill:[30,41],killer:5,kilobyt:[15,34],kind:41,know:[17,18,21,24,27,28,32,33,34,41,44,46],knowledg:0,known:[21,29,34,40,41],kreativrauschen:[6,20],kvirc:43,lag:[34,38],lame:[10,17,33,34,41],lamer:34,lameshar:33,lamest:[10,30,33,34,42],lamestbot:[3,10,18,21,30,33,34,42],lang:44,languag:[28,34,35,44],larg:[2,15,17,21,34],larger:[28,40],last:[0,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,30,32,33,34,36,37,38,41,42,43,44,45,47],laston:41,later:[1,3,6,9,18,19,25,28,30,34,41,43],latest:[4,5,30],launch:30,layer:[29,31],lazi:17,leaf:[33,34,40,43],learn:[17,29,30,34,35,41],least:[4,17,27,30,32,34],leav:[10,21,30,34,38,41,46],left:[17,41],legal:[2,4],len:21,length:[17,21,27,40,41,43],less:[13,38,41],let:[4,6,10,14,18,27,28,30,33,34,35,41],letter:[4,34,47],level:[11,16,29,34,47],libera:[2,4,5,21,27,28,29,30],librari:[28,40,43],libssl:[4,30,31],licens:[0,1,4],lieu:41,life:[18,30],light:46,like:[0,1,4,6,9,10,13,15,17,19,27,28,29,30,34,35,36,38,39,40,41,43,45,46,47],limbo:34,limit:[2,6,10,15,17,21,33,36],lindex:41,line:[2,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,33,34,35,40,41,43,44,45,46],link:[0,2,3,4,5,6,7,15,22,23,27,34,35,37,40,43,44],linux:36,list:[0,4,6,10,14,15,19,21,22,24,25,27,28,29,30,31,33,34,35,37,38,43,45,46],listen:[29,30,33,34,36,43],liter:[27,41],littl:[3,5,15,24,30,33,44],llama:33,llamabot:[30,34],load:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,33,34,40,41,46],loadmodul:[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,34,40,46],lobster:40,local:[15,28,30,34,38,39,41,43],localfil:6,locat:[2,4,23,28,29,31,34,43],log:[0,2,4,10,19,24,27,30,39,40,41,46],logfil:[25,27,30,34,44],logfilenam:34,logflag:34,login:[30,34,40,45],logmod:27,logsiz:34,longer:[3,5,15,17,19,27,30,31,41],look:[0,4,5,6,10,20,25,26,28,29,31,34,35,40,41,43,46],lookup:[14,34,36,41],lose:10,lost:41,lot:[5,17,28,30],low:[21,23],lower:21,lowercas:21,lsa:15,luck:[30,46],lurk:2,mac:36,machin:[3,16,30,34],macro:27,made:[0,1,3,4,5,10,22,39,41,43,46],magic:28,mai:[1,4,5,10,11,15,16,17,23,28,30,33,34,36,37,41,44,45,46],main:[7,28,30,31,38],maintain:[2,16,30,44,45],mainten:47,major:[27,30,41],make:[0,2,3,4,5,6,7,10,13,15,19,21,22,24,27,28,29,30,31,34,36,37,39,41,43,44,46],makefil:[3,27],making_modulenam:27,man:34,manag:[2,4,6,15,24,31,46],mandatori:41,mani:[4,5,10,14,15,17,21,27,29,30,31,33,34,41],manipul:[2,34],manpag:34,manual:[4,29,33,34,36,41,43,45],mar:36,march:[32,42,47],mark:[15,35,41,47],mask:[15,21,28,34,45],masquerad:34,master:[15,29,30,32,33,34,41,42,47],match:[1,2,10,15,17,27,28,32,34,40,43,45],math:41,matter:[1,14,28,29],max:[15,17,18,21,23,34],maxdepth:[],maxim:34,maximum:[10,14,15,17,18,21,23,34,40,41,43],maxsend:14,mayb:[28,34],mco:[34,41],mcobx:30,md5:[6,9],mean:[15,17,21,28,29,32,33,34,35,36,40,41,43,45],meaning:[24,41,46],meaningless:47,measur:21,mechan:29,meet:43,mem:41,member:[10,27],memberlist:41,memori:[27,41],mention:27,meridian:34,messag:[4,10,21,27,28,30,34,35,37,38,40,42,44,45],method:[4,6,9,16,17,19,24,28,29,30,31,40,44,46],midnight:34,might:[4,17,23,27,34,41,43],migrat:5,militari:34,milk:47,min:34,miniatur:38,minimum:[0,10,41,45],minor:[27,41],minu:10,minut:[4,10,17,23,27,29,30,32,34],mirc:[21,41],misc:[34,41],miscellan:2,misnom:41,miss:[4,30,41],mix:[10,17],mkcoblx:34,mkdir:6,mnnrrpp:41,mnot:22,mnt:30,moc:41,mod:[3,6,7,20,24,27,34,41,45],mode:[4,5,10,13,17,21,24,27,29,32,34,35,37,46],mode_proc:41,mode_proc_fix:41,modechang:41,moder:[24,29,45,46],modern:[16,40],modes_per_line_max:17,modif:[5,30,41],modifi:[2,6,14,17,28,34,41],modul:[0,2,4,30,33,35,40,46],modular:2,module_clos:[],module_depend:27,module_entri:27,module_expmem:[],module_find:27,module_load:27,module_nam:27,module_regist:27,module_renam:27,module_report:[],module_start:[],module_t:[],module_undepend:27,module_unload:27,modulenam:[7,27],moment:[17,30,31],monitor:[32,35,37],month:[34,41],moo:41,more:[3,4,5,6,13,15,17,20,27,28,29,30,31,33,34,35,37,39,40,41,43],moreov:34,most:[0,2,4,5,16,17,21,27,28,29,30,31,34,35,38,41,45,46],mostli:[24,41,46],motd:[34,42],mount:23,move:[3,4,15,21,30,41,46],mpj:41,mrlame:[30,34],mrslame:[30,34],msg:[4,6,17,20,21,29,30,34,35,38,40,45],msgid:[41,45],msgm:[21,41],much:[2,3,24,27,30,38,41],multi:30,multipl:[0,2,4,16,28,30,33,34,35,41,45],must:[1,2,3,4,10,14,16,17,21,23,27,29,30,31,33,34,40,41,43,45],mydir:15,myownevent123:41,myproc:41,mytag:41,myvar:44,myword:17,name:[3,4,6,8,15,21,27,28,29,30,31,34,45],nano:30,nat:[16,34,36],natur:45,nearli:7,necessari:[10,31],necessarili:41,need:[0,3,4,10,14,16,17,21,27,28,29,30,31,33,34,36,40,41,43,45,46,47],needal:41,needop:41,neg:[14,34,41],negcach:14,negoti:[41,43],net:[1,3,17,21,24,30,37],netbsd:36,nethack:47,netsplit:[16,17,34,35,41],network:[0,2,4,17,21,34,41,42],never:[4,5,10,34,41],new_module_nam:27,newer:[5,30],newhandl:41,newidx:41,newnick:41,newus:[30,34],next:[5,10,15,21,27,28,30,31,34,41],nfree:27,nice:27,nicebot:30,nick:[10,17,21,25,28,29,30,34,47],nicknam:[6,21,28,29,30,34,42,44,45,47],nickserv:[2,43],nist256p:29,nkch:41,nmalloc:27,no_irc:[6,21],nobodi:[15,28],node:[29,43],nodesynch:10,noemail:4,non:[3,10,14,16,17,21,27,29,32,33,41,43,46],none:[8,9,10,12,14,18,19,20,21,23,26,41],noout:29,noqueu:41,nor:16,normal:[0,4,6,13,14,15,16,21,27,28,31,34,41,43,44,45,46],notabl:46,notat:34,notc:41,notcproc:41,note:[2,3,6,7,9,10,14,17,19,21,22,27,29,30,33,34,40,43,45,46],notebox:41,notefil:[18,41],notepad:30,noth:[27,34,41,46],notic:[2,13,15,28,33,34,41,46],notif:41,notifi:[18,21,30,34,35,37,41],nots:1,nov:33,novemb:[22,37],novic:[0,4],now:[3,5,15,16,17,28,29,30,31,33,34,36,40,41,45,47],ntik:41,number:[2,10,15,17,18,19,21,23,24,27,30,31,33,34,40,41,43,45,46,47],numer:[29,31,41],nxdomain:14,oauth:46,obtain:[2,31,43],obvious:[32,41],occur:[17,28,41],occurr:27,octal:34,octob:[10,19,21,34],off:[10,16,17,21,30,33,34,38,41],offer:[30,31,45,46],offici:[2,4],offlin:41,offset:34,often:[4,6,14,29,34,45],oident:16,oidentd:16,okai:34,old:[6,19,21,30],old_module_nam:27,older:[4,36,41],oldest:[2,41],oldhandl:41,omin:28,omit:[41,43],onc:[4,10,15,17,19,21,28,29,30,39,41],one:[4,10,15,16,17,21,27,28,29,30,31,32,33,34,35,38,39,40,41,43,44],ones:[14,22,33,36,41],onjoin:18,onli:[3,4,5,6,7,10,15,16,17,18,20,21,22,25,26,28,29,30,32,33,34,36,38,40,41,42,43,44,45,47],onlin:[6,15,18,29],opchar:17,open:[16,29,34,38,39,41,43],openbsd:36,openssl:[2,3,4,19,29,30,31,34,43],oper:[13,21,28,34,36,41,42],opped:[10,41,47],opping:[0,4],oppos:41,ops:[10,41,47],optim:[6,21],optino:37,option:[1,3,4,7,10,15,16,19,21,29,30,34,43,46],order:[4,14,28,34,40,41,43,45],ordinari:[41,43],org:[2,4,5,6,25,28,30,31,33,34,41],origin:[1,21,30,39,41],oss:16,other:[0,1,4,6,9,10,14,15,16,17,18,19,21,22,27,28,29,30,31,32,33,34,35,36,37,38,40,41,42,43,44,45,46,47],otherdir:3,otherwis:[3,4,12,15,28,32,33,34,36,40,41,43,45],our:[30,33,41],ousterhout:1,out:[0,3,4,23,25,28,29,30,33,34,38,40,41,43],outform:29,outgo:[34,41,44],output:[2,3,27,29,31,40,42,44,45],outsid:[19,31,34],over:[15,21,24,27,28,30,34,36,41,43,44,46],overhead:7,overrid:[22,36,43],overridden:17,overwrit:[16,30,41],overwritten:[5,34,41],own:[1,7,15,16,21,22,28,29,30,31,37,41,43,44,46],owner:[4,10,30,34,38,41,47],p_tcl_hash_list:27,packag:[1,3,4,30,31],pad:41,page:[30,39],pai:[5,41],pain:[23,30],pair:[29,31,41,43,45],paragraph:3,paramet:41,paranoid:[22,34],pars:41,part:[0,4,21,24,28,34,35,41,43,44,46],parti:[2,5,12,30,33,34,35,41,43,47],particular:[5,29,34],partproc:41,partylin:[2,4,6,12,30,31,33,34,36,40,41,43,44,45,46,47],pass:[28,29,30,36,38,40,45],passiv:33,passthru:34,password:[5,6,9,17,19,21,22,29,30,33,34,35,38,40,43,46],past:[1,4,27,34],patch:[2,36,41],path:[2,3,15,16,30,31,41,43],pathnam:41,patient:15,pbk:40,pbkdf2:[2,5,6,40],peer:[21,34,43],pem:[29,34],penalti:21,pend:[6,10],peopl:[4,10,15,16,17,18,21,22,28,30,34,35,38,41,42,47],per:[17,41,45],percent:42,perform:[0,3,4,5,10,30,41,47],perhap:30,period:[6,14,30,41],perm:34,perman:[10,32,34,41],permiss:[4,34,40],permit:41,perorm:2,persist:30,person:[4,28,30,34,41],phew:30,phrase:41,physic:33,pick:41,pictur:5,pid:[30,34,41],pidfil:34,piec:[3,28],ping:13,pipe:33,pl1:41,place:[1,3,5,7,10,15,17,28,30,32,34,41,43,46],plain:[29,34,43],plaintext:[29,41,43],plan:[4,28,41],platform:[0,4,24,41,46],pleas:[4,5,6,7,9,10,16,19,21,31,34,37,41],plu:[10,21,34,41,43],pmsg:28,point:[3,6,21,26,30,33,34,41],pointer:[1,3,4,35,42],popul:45,popular:[0,4,5,30,34],port:[1,5,14,16,21,22,29,30,31,33,34,36,43],portabl:41,portion:[3,7,10,41],portrang:34,posit:[27,34],posix:41,possibl:[3,10,13,15,21,29,31,34,36,37,38,41,43,45],potenti:[5,16,28,41,45],pour:39,power:[4,35],practic:40,pre:[41,43],preced:[30,41,43],prefer:[34,36,43],prefix:[5,17,21,28,31,34,38,43,45,46],preinit:41,prematur:30,prepar:33,prepend:34,prerehash:41,prerequisit:2,prerestart:41,prerout:16,present:[2,6,28,29,36,41,45,46],preserv:30,pretend:46,pretendnet:31,pretti:[0,38],preval:29,prevent:[0,4,10,17,18,24,30,33,36,41,46],previou:[1,4,5,19,30,41,46],previous:[5,30,41],primari:[21,34],prime256v1:29,prime:34,printf:27,prior:[3,29,30,40,43],prioriti:41,privat:[18,22,28,29,30,31,34,38,41,43],privatekei:[29,31,34,43],privileg:[0,4,16,47],privmsg:[10,28,29,41],probabl:[4,21,29,30,31,41],problem:[30,34,36],proc:[21,27,28,45],proce:41,procedur:[2,22,45,47],process:[0,3,4,5,11,15,16,23,29,30,33,40,41,43],procnam:[28,41,45],produc:[34,41],program:[0,2,4,16,29,30],progress:15,prohibit:34,project:[2,39,46],prompt:[3,4],promptli:30,proper:[3,36,41],properli:[5,30,31,33,34],protect:[0,2,3,4,10,19,21,29,30,32,34,40,41,43,47],protectfriend:10,protecthalfop:10,protectop:10,protocol:[31,34,37,41,43],prove:30,provid:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,20,21,22,23,24,27,29,30,34,36,37,39,41,43,45,46],pseudo:41,pub:[4,5,21,29,41],pubkei:29,publicli:25,publish:34,pubm:[21,41],pull:[4,39,40],punish:[10,41,47],purpos:[0,1,6,25,26,33,34,41],push:[39,41],put:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,30,34,41,43],putlog:[21,27,28],putquick:21,putserv:[10,28,29],putti:29,pwd:[6,30],quakenet:[4,21],qualifi:34,quann:[6,20],queri:[14,16,36],question:[4,29],queu:[15,21,41],queue:[21,27],quick:[2,27,30,34],quicker:30,quickli:[2,34],quiet:[21,34,47],quit:[4,6,21,30,34,41],quot:[41,45],quota:34,raid:[24,46],rais:[10,21],ram:34,rand_max:41,random:[10,21,33,41],rang:[30,34],rate:21,rather:[5,41,43],raw:[34,43],rawt:41,rcvd:41,reach:[17,21,34],react:28,read:[0,2,3,4,6,7,16,27,28,29,30,31,34,41,42,46],readabl:41,readm:[2,3],readonli:27,real:[21,27,41],realli:[28,30,34,44],realnam:21,reason:[4,27,29,30,33,34],reboot:[16,29],receiv:[14,15,21,23,29,33,41,45],recent:[4,30,41,43],recev:[],recipi:41,recogn:[17,21,29,47],recom:5,recommend:[4,10,23,27,30,40,41,44,45],recompil:[17,30],reconnect:[22,41],record:[2,22,27,35,47],redirect:16,reduc:[27,45],refer:[27,28,31,34,41],refin:28,reflect:[5,41],refresh:[41,45],regardless:41,regist:[2,10,29],regular:[10,41,43],regularli:35,rehash:[7,27,28,34],reiniti:41,reject:[21,33,34],rejn:41,rejoin:[30,41],rel:[14,27,30,41],relai:[0,4,33,34],relat:[1,6,10,28,36,41],releas:[0,1,30,40,41],relev:[4,27,30],reli:41,reliabl:[41,45],relink:33,relinquish:41,rem_builtin:27,rem_tcl_command:27,rem_tcl_int:27,rem_tcl_str:27,remain:[10,32,41],remaind:[15,45],rememb:[10,28,29,30],remind:34,remot:[15,33,34,41,42],remotebotnam:41,remov:[5,10,15,19,27,29,30,32,35,36,40,44,45,46],renam:[2,15,27,30,34,41],render:[5,24,46],repeat:[4,41],replac:[10,21,27,29,34,41,42,46],repli:[6,13,14,16,17,34,41],replic:[45,46],repo:39,report:[6,15,25,27,30,44],repositori:[4,30],repres:[41,45],req:[29,34,43],request:[0,4,5,7,10,13,15,17,21,30,32,34,36,37,39,41,43,44,46],requir:[2,4,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,34,40,43,45],reread:41,resend:[14,41],reserv:[30,34,38],reset:41,resolut:34,resolv:[6,14,34,41],resourc:27,respect:[14,36,41,42],respond:[10,30,41],respons:[21,41],rest:[3,27,33,34,40,41,45],restart:[2,3,4,5,7,28,30,34],restrict:[1,15,16,21,34,41,42,46],result:[21,32,34,36,41],resum:41,resync:22,retain:41,retri:23,retriev:[6,18],retrydelai:14,reus:[5,41],reveng:10,revengebot:10,revers:[40,41],revert:41,review:[29,31],revis:[0,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,32,33,34,36,37,38,41,42,43,44,45,47],revok:[21,34],rfc1459:[37,41],rfc2812:37,rfc:[17,21,24,41,46],rfc_compliant:41,rich:[0,4,30],right:[6,15,16,26,28,30,41],rijndael:19,risk:[1,21],rizon:21,rmdir:6,rmst:45,robei:[1,3,4,35,42,47],robot:35,roomsstat:24,roomstat:[24,46],root:[15,16],round:[19,40],rout:[16,41],routin:[17,34,41],rsa:34,rule:30,run:[2,3,4,5,7,10,16,21,27,28,29,30,31,33,34,40,42,43,45],s_client:43,safe:[19,29,30,31,40,46],sai:[4,10,15,28,31,33,41],said:[28,33,41],sake:46,salt:[28,40],same:[0,3,4,5,7,10,11,16,17,27,28,30,33,34,37,40,41,42,43,44,45],sampl:[10,30,46],sane:21,sanitycheck:34,sasl:[2,30,35,37],save:[5,6,10,11,12,22,33,34,35,40],scan:30,scenario:[31,33],schat:[34,43],schedul:41,scheme:1,scope:31,screen:[4,39,42],script:[0,2,3,4,7,10,21,29,30,32,35,36,41,44,45,46,47],scripter:33,sdcc:43,sdebug:3,seamless:40,seamlessli:19,search:[27,29,41],sec:34,second:[4,10,13,14,17,21,23,27,28,34,44],secondli:41,secret:10,section:[5,10,17,21,24,28,30,33,34,41,46],secur:[0,2,4,6,9,19,29,30,33,34,35,40,41],see:[0,2,3,4,5,6,10,15,17,21,24,25,27,28,29,30,31,33,34,36,38,39,40,41,42,45],seen:[2,6,10,34,41],selecet:41,select:[4,30,34,35,39,41],self:[2,21,31,34,43],send:[4,6,11,15,17,18,21,22,23,27,28,30,33,36,41,44,45],sender:41,sens:[0,4],sensit:40,sent:[6,15,17,22,25,29,34,37,38,41,43,45,47],separ:[3,7,21,30,33,34,35,36,37,41,44,45],septemb:14,seri:[30,41,43],serv:34,server:[2,5,6,7,10,13,14,15,16,17,19,24,25,27,29,30,34,35,36,37,43,44,45,46],serverlist:41,serverop:10,serverror:21,servic:[6,10,16,24,29,41,43,46],servivc:41,session:[4,36,37],set:[0,1,2,3,5,6,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,31,32,33,35,37,38,40,42,44,45,46,47],setcap:16,setnam:[35,37],setup:[4,6,7,30,34],seven:[10,41],sever:[0,4,13,27,30,31,37,41,44],sexystuff:28,sha1:43,sha1sum:29,sha256:19,shall:34,share:[0,2,4,6,10,11,23,27,34,35,41],sharebot:[33,34,41],sharefail:23,she:41,shell:[0,3,4,16,29,30,34,41],shorter:10,should:[1,3,4,5,10,12,13,14,15,17,19,21,22,24,27,28,29,30,33,34,36,38,40,41,43,45,46],shouldn:16,show:[4,6,10,15,25,28,33,34,41],shown:[15,30,34],shutdown:41,shutdownreason:41,side:[34,41,43,46],sidenot:31,sighup:41,sigil:41,sigkil:41,sign:[21,29,31,34,41,42,43,46],signal:41,signific:[4,6],significantli:45,signoff:41,sigquit:41,sigterm:41,silent:34,simialar:[],similar:[4,10,29,30,34,38,39,41,44],similarli:45,simpl:[4,27,28,29,30,41],simpli:[4,5,29,30,31,37,41,46],simplifi:41,simul:[34,41],simultan:[15,23,41],sinc:[0,3,5,17,30,33,34,35,36,41,43,44],singl:[16,17,29,41,45],sit:[0,4,10,34,40],site:[6,47],situat:33,six:41,size:[15,23,27,34,41],skim:4,skip:[30,41],slash:[30,38],slave:33,slennox:30,slow:[15,30,34],slower:34,small:[3,23,33,44],smaller:3,smile:3,snapshot:[2,30],snowbot:15,snt:29,sock:[27,34],socket:[16,27,31,41,43],softwar:[0,1,2,4],solut:40,some:[0,4,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,30,32,33,34,35,36,37,41,43,44,46,47],someircnetwork:34,someon:[4,10,17,28,30,31,41,45],someth:[4,28,30,39,41,46],sometim:[4,21,30],somewher:[3,34],song:41,soon:[10,41],sort:[0,4,32],sound:28,sourc:[1,3,4,5,6,7,27,28,31,34,39,41,43,44],space:[0,23,34,37,41],spawn:0,special:[33,41],specif:[6,10,14,16,17,19,21,24,30,33,36,37,41,43,45,46,47],specifi:[10,14,15,16,18,21,22,27,29,30,32,34,35,36,40,41,43,45],spectrum:[24,46],spent:[30,41],split:[10,17,36,38,41,42],splt:41,spoiler:46,spoken:41,spoof:16,spread:34,squar:36,squelch:21,src:[3,7,17,27],ssh:30,ssl:[2,3,4,5,21,29,30,31,35,41],sslcert:[3,31,34,43],sslinc:43,ssllib:43,sslport:43,sslsilent:[3,43],sssss:[],stabil:23,stabl:[2,4,30],stack:[17,36,41],stackabl:41,stage:27,stai:41,stall:41,stand:[0,4,30],standard:[14,16,17,23,27,28,37,41,43,46,47],start:[2,3,4,5,6,9,16,19,21,26,28,29,33,34,37,38,40,41,42,45,46],starttl:43,startup:[2,40,41],stat:6,state:[4,41],statement:41,statist:[6,15,25],statu:[0,2,4,10,24,27,31,34,44,45,46],statuslog:10,stb:21,stdio:27,stdlib:27,stdout:27,stealth:[30,34],step:[2,3,5,27,30,46],stick:32,sticki:[32,41],still:[1,4,5,10,15,22,30,31,34,35,41,46],stone:21,stop:[0,10,15,17,27,41,45],stopnethack:[10,47],storag:[6,12,40],store:[5,6,10,12,15,18,24,25,28,30,33,40,41,45,46],str_dir:27,str_protect:27,stream:[24,46],street:1,strftime:34,string:[2,17,27,28,29,34,40,45,46],strong:34,strongli:[2,4,30],stuff:[2,4,27,28,30,34,41],style:32,sub:[15,41],subdirectori:[15,41],subject:43,sublist:41,submit:[2,41],subscrib:[45,46],subsequ:41,substitut:[2,34],succeed:41,success:[27,30,41],successfulli:[4,27,41,45],sudo:[16,30],suffic:28,suffici:31,suffix:[7,34],suggest:[5,27],suit:[16,30],suitabl:45,sum:28,summar:21,sun:34,sundai:41,supplant:41,suppli:34,support:[0,2,3,4,5,6,8,10,11,14,16,17,18,21,22,23,29,30,31,32,34,35,41,44,46],sure:[4,10,27,28,30,31,33,34,41,46],symbol:[31,41],synchron:43,syntax:[5,29,34,43,47],sys:27,system:[2,3,7,14,15,16,27,29,30,34,35,36,41,42,43],tab:27,tabl:[27,37,41],tag:[15,35,37,45],tail:29,take:[3,4,5,6,15,19,21,25,28,30,34,40,41,43],taken:[27,41],takeov:17,talk:[28,31,35,38],talli:27,tar:[4,7,30],tarbal:[0,30],target:45,task:[0,2,4,33],tcl:[0,1,2,3,4,6,10,11,21,27,28,30,32,34,35,36,43,44,46],tcl_cmd:27,tcl_int:27,tcl_string:27,tclsh:4,tcltk:4,tcp:[2,16,36],team:[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,32,33,34,35,36,37,38,39,40,41,42,43,44,47],technic:46,techniqu:44,tell:[15,28,29,30,31,33,34,41,46],telnet:[2,29,30,33,35,36,38,40,41,42,43],temp:41,templat:39,temporari:[10,23,25,32,34],ten:29,term:[2,28,31,41],termin:[4,5,41],test:[28,30,47],text:[4,10,21,27,29,34,42,43,44,45,47],textfil:2,than:[4,10,13,15,17,30,31,34,40,41,43],thank:4,thee:41,thei:[0,3,4,5,7,10,12,13,17,18,21,22,27,28,29,30,31,32,33,34,40,41,43,45],them:[0,1,3,4,5,7,10,12,13,14,15,17,18,21,22,23,27,28,29,30,31,33,34,35,36,37,40,41,44,46,47],themselv:[17,30,33,41,44],therebi:[44,46],therefor:[6,17,30,34,41],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,39,40,41,42,43,44,45,46,47],thing:[3,4,6,24,26,27,28,29,33,34,41,46],think:[39,47],third:[28,33],thorough:[27,29,31,46],those:[1,3,7,11,15,21,27,28,29,30,41,44,45,46],though:[15,21,28,30,41,43],thr:34,three:[21,29,32,33,34,41],through:[4,10,15,21,24,28,31,35,36,37,38,41,46,47],throughout:27,thse:17,thu:[16,28,36,40,41],tidi:27,till:[],time:[0,3,4,10,14,15,16,17,19,22,23,28,29,30,31,32,33,34,35,37,38,40,42,43,44,46],timeout:[6,14,21,23,34,45],timestamp:[34,41],timezon:34,tip:2,titl:47,tiwtch:6,tls:[41,43],tmi:45,tmp:[23,41],toctre:[],todai:41,togeth:[0,2,4,21,28,33,34,35,37],token:46,told:28,ton:24,too:[15,17,21,23,27,34,41],tool:[3,30],top:[3,4,28,39,41],topc:41,topic:46,total:[10,27,35,41],tout:41,toward:28,trace:21,track:[3,15,24,27,29,41,46],tradit:[24,36,44,45,46],tradition:16,traffic:[3,34,44],trail:27,transfer:[2,6,7,11,15,22,30,33,34,36,41,43,47],transit:[19,40,41],transmit:21,transpar:34,transport:31,treat:[41,46],tree:[0,4,30],tri:[27,34,41],trick:[28,44],trigger:[10,21,27,28,41,45],troubl:[14,34],troubleshoot:[4,30],truncat:45,trust:[4,34,47],ttl:14,turbo:[23,30],turn:[10,16,21,34,41],tutori:[2,31],twcmd:[24,46],twice:41,twitch:[2,6,35],twith:45,two:[4,6,17,22,28,30,32,33,34,40,41,43,44],type:[3,4,6,7,10,12,17,21,24,27,28,29,30,31,32,33,34,35,36,37,38,43],typic:[15,24,34,35,38,41,46],typo:41,ubuntu:31,ufl:41,ugli:15,uglyman:15,uhost:[28,41],uid:[34,43],umod:21,unabl:[17,30,33,36,41,46],unaccess:35,unavail:[21,34],unban:[10,34,41],unbind:[17,34,44,45],uncertainti:45,uncom:[29,31,34,40],under:[0,4,30,35,41],underli:41,underlin:[41,42],undernet:[4,17,21,41],understand:[34,41],understood:21,unexpect:41,unhid:6,unimport:34,unintend:45,uniqu:[34,41,45],univers:34,unix:[0,3,15,16,30,35],unld:41,unless:[17,21,28,30,32,34,41],unlik:[3,35],unlimit:33,unlink:[23,34],unload:[27,41],unoffici:36,unpack:0,unreach:33,unrealircd:[17,41],unreli:[24,45,46],unrest:0,unset:41,unshar:[6,47],unstick:32,unsticki:32,unstuck:41,unsur:30,untar:5,until:[7,10,15,32,34,41],unzip:[5,30],updat:[4,5,19,27,30,34,35,40,41,45],upgrad:[2,40,43],uplink:41,upload:[15,30,35,41,44],upon:[0,4,45,47],upper:14,uptim:[2,6],url:[34,41],usa:1,usabl:[6,15,34],usag:[2,4,6,27,34,41],use:[0,1,3,4,5,6,7,9,10,12,13,14,15,16,17,19,21,22,23,27,28,29,30,31,32,33,34,36,38,40,41,42,43,44,45,46,47],used:[0,2,4,10,11,13,15,19,21,27,28,29,30,31,32,33,34,35,36,38,40,41,42,43,44,45,46,47],useful:[1,4,10,23,30,33,41,43,44],useless:[5,24,46],user:[0,2,3,4,5,6,7,9,10,11,12,13,16,17,18,19,20,21,22,23,24,27,28,30,31,32,34,35,36,38,39,40,42,43,44,45,46],userban:10,userexempt:10,userfil:[0,2,4,5,6,9,10,11,19,22,23,27,29,30,33,34,40,41,44],userflag:17,userhost:45,userinfo1:34,userinfo:[13,41],userinvit:10,userlist:[6,17,20,22],usernam:[16,29,30,34,45,46],usernotic:[24,45],userst:[24,46],uses:[3,6,17,21,23,27,28,29,30,31,32,34,40,41,43,46,47],using:[1,3,4,6,7,9,10,15,16,17,19,21,27,28,29,30,32,33,34,36,40,41,43,44,45,46],usrntc:45,usst:45,usual:[4,29,30,31,32,36,39,40,41,43,46],utc:34,util:3,utim:28,vagu:30,vali:41,valiant:[0,4],valid:[3,10,21,27,33,34,35,41,43],valis0:41,valu:[10,13,14,17,21,24,27,28,34,40,42,43,45,46],vari:[41,47],variabl:[2,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,34,36,42,45],variable_nam:27,varieti:[0,4],variou:[1,27,30,32,34,41],verbos:41,veri:[4,6,16,20,21,28,34],verif:[21,34,43],verifi:[21,29,34,43],version:[0,1,2,3,4,5,13,17,25,27,28,36,37,42,43,45],vertic:41,vhost4:[30,34,36],vhost6:[30,34,36],vhost:[30,34,36],via:[2,3,4,6,11,16,17,20,22,27,28,29,30,32,33,34,35,36,37,38,40,42,43,45,46],video:41,view:[5,7,19,29,30,35,41,45],viewer:45,vim:30,vip:[45,46],virtual:34,visibl:41,visit:[5,46],vista:36,voic:[0,2,4,10,29,41,47],wai:[1,3,4,16,21,24,27,28,29,30,31,32,33,34,38,40,41,43,46],wait:[6,14,15,17,21,23,30,34,41],walk:31,wall:41,wallop:[34,41],want:[0,3,4,6,10,12,14,15,17,18,21,23,27,28,29,30,33,34,36,41,43,44],war:0,warm:39,warn:[4,16,28,41],warranti:1,washalfop:47,wasn:41,wasop:[10,17,47],wasoptest:10,watch:[38,45],web:[2,6,24,34,45],webpag:2,websit:30,week:41,weekdai:41,welcom:28,well:[1,24,28,29,30,31,34,40,41,43,46],were:[1,16,17,30,32,33,34,36,40,41,46],west:34,wget:30,what:[0,1,2,5,6,10,15,17,21,25,28,29,30,34,37,38,40,41],whatev:[1,3,28,34,35,41,42],when:[3,4,6,7,9,10,12,15,16,17,21,22,27,28,29,30,32,34,36,38,40,41,43,45,46],whenev:[21,27,33,41,43],where:[4,6,10,14,15,18,21,27,28,29,30,31,34,35,40,41,43,45],wherea:41,wherev:36,whether:[34,36,41],whew:28,which:[3,5,6,10,12,14,15,16,21,22,27,28,29,30,32,33,34,36,38,40,41,42,43,44,45,47],whichev:32,whisper:[24,45],whitespac:41,who:[10,15,17,21,28,30,34,38,41,47],whoi:[29,34],whole:27,whose:[32,41],whox:[35,41],why:[28,30],wide:[38,43],width:42,wild:41,wildcard:[10,28,29,41,45],window:[2,29,36],wise:[4,34],wish:[3,5,7,16,17,25,27,30,32,33,34,41,45],within:[6,15,27,30,31,32,34,37,41],without:[0,2,4,5,6,9,10,13,19,27,28,29,30,31,33,34,35,37,40,41,43],wizard:31,won:[6,10,22,27,28,30,32,33,34,41,43,45],woobi:[2,3,6,27],word:[15,17,29,30,41,45,46],work:[3,5,6,10,13,15,19,20,22,27,28,29,30,32,33,34,36,37,39,40,41,43,44,45],workaround:24,world:[0,2,4,31,34],worri:24,worth:3,would:[4,5,13,28,29,30,31,33,34,41,42,43,45,46],wouldn:34,write:[1,2,6,7,26,30,34,40,41,46],written:[0,27,30,41,46],wrote:28,wspm:45,wspr:45,wth:[],www:[2,4,6,20],x509:[29,34,43],xfer:[23,47],xtra:41,xvf:30,xxd:29,year:[0,4,30,34,41],yes:[28,31,41],yesterdai:34,yet:[4,21,30,34,41],yoru:29,you:[0,1,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,35,36,38,39,40,41,42,43,44,45,46,47],you_want_to_export:27,your:[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,33,34,35,36,38,39,40,41,43,46],yourbot:44,yourbranchnam:39,yourconfig:3,youreggdrop:29,youreggdropconfignameher:29,yourself:[7,29,30,39,40,43],yourusernam:39,yyyymmdd:34,zero:41,zip:30,zomg:[],zxvf:30},titles:["About Eggdrop","Boring legal stuff","Eggdrop, an open source IRC bot","Installing Eggdrop","README","Upgrading Eggdrop","Modules included with Eggdrop","Eggdrop Module Information","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","Writing an Eggdrop Module","Writing an Eggdrop Script","Common First Steps","Setting Up Eggdrop","Enabling TLS Security on 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"],titleterms:{"default":44,"function":[27,46],"int":41,"new":41,"return":41,"short":30,"static":7,"super":30,Adding:33,DNS:14,TLS:[31,43],The:[30,38],Using:33,about:[0,36,37,43],account2nick:41,account:41,accounttrack:41,add:[29,41],addbot:41,addchanrec:41,addit:[27,31],address:41,addus:41,advanc:[34,44],api:24,arg1:41,arg2:41,arg:[41,45],argn:41,assign:29,assoc:[8,41],authent:[29,43],automat:29,background:40,backup:41,ban:[32,41],banlist:41,banmask:41,base64:41,basic:34,bind:[41,45],block:41,blowfish:9,boot:41,bore:1,bot:[2,15,33,41],botattr:41,botflag:33,botishalfop:41,botisop:41,botisvoic:41,botlist:41,botnam:41,botnet:[5,31,33,34,43],botnick:41,botonchan:41,botport:41,bottre:33,callev:41,can:[2,7],cancel:15,cap:[37,41],capabl:37,certif:43,chan:[41,45],chanban:41,chandname2nam:41,chanexempt:41,chanflag:41,chang:[5,41],chaninvit:41,chanlist:41,channame2dnam:41,channel:[10,15,29,41,45],chansettyp:41,charact:41,chat4:36,chat6:36,chat:36,chattr:41,chhandl:41,clear:15,clearqueu:41,cmd:45,command:[4,5,24,41,44,45],comment:41,common:29,commun:31,compil:7,compress:[11,41],compressfil:41,config:[5,15,30,41,44,46],configur:[29,30,31,40],configurearg:41,connect:[31,41],consol:[12,34,41],control:41,core:34,count:41,countus:41,creator:41,crontab:4,ctcp:[13,36],ctime:41,cygwin:3,dcc:[34,41,43],dccbroadcast:41,dccdumpfil:41,dcclist:41,dccputchan:41,dccsend:41,dccsimul:41,dccuse:41,decrypt:41,delchanrec:41,delhost:41,deludef:41,delus:41,desc:[15,41],descript:15,dest:15,destin:41,develop:4,die:41,dir:[15,41],directori:[15,34,41],disclaim:46,dname:41,dnslookup:41,docker:4,document:[4,5],download:30,dst:15,dumpfil:41,durat:41,dynam:7,echo:41,edit:[30,46],eggdrop:[0,2,3,4,5,6,7,27,28,29,30,31,34,35,39,41,45],enabl:[31,40,41],encpass:41,encrypt:[40,41],entri:41,erasenot:41,event:41,exampl:33,execut:34,exempt:[32,41],exemptlist:41,exemptmask:41,extra:41,featur:35,file:[5,15,30,31,34,41,44,46],filemask:15,filenam:[15,41],filepath:15,fileresend:41,filesend:41,filesi:[15,41],filestat:15,find:2,findus:41,first:29,flag:[15,29,33,41,45,47],flushmod:41,formatstr:41,from:41,ftp:4,gener:31,get:[2,4,15,30,41],getaccount:41,getchan:41,getchanhost:41,getchanidl:41,getchaninfo:41,getchanjoin:41,getchanmod:41,getdccawai:41,getdccidl:41,getdesc:41,getdir:41,getfil:41,getfileq:41,getfilesendtim:41,getflag:41,getlink:41,getown:41,getpwd:41,getudef:41,getus:41,git:4,github:39,global:41,hand2idx:41,hand2nick:41,handl:41,handlen:41,handonchan:41,haschanrec:41,hash:40,help:[2,4],helpfil:41,hide:15,histori:30,host:[29,41],hostmask:41,hostnam:41,how:[2,4,5,7],hybrid:40,ident:16,idx2hand:41,idx:41,ignorelist:41,includ:6,info:41,inform:[7,31],instal:[2,3,7,30,36,43],interfac:40,invit:[32,41],invitelist:41,invitemask:41,ipv6:36,irc:[2,17,31,43,46],ircnick:41,ircv3:37,isawai:41,isban:41,isbansticki:41,isbotnick:41,ischanban:41,ischanexempt:41,ischaninvit:41,ischanjup:41,iscompress:41,isdynam:41,isexempt:41,isexemptsticki:41,ishalfop:41,isidentifi:41,isignor:41,isinvit:41,isinvitesticki:41,isircbot:41,isjup:41,islink:41,ismod:45,isop:41,ispermban:41,ispermexempt:41,isperminvit:41,isset:41,istl:41,isupport:41,isvip:45,isvoic:41,join:29,jump:41,keep:44,kei:[31,41,43],keyword:41,killassoc:41,killban:41,killchanban:41,killchanexempt:41,killchaninvit:41,killdcc:41,killexempt:41,killignor:41,killinvit:41,killtim:41,killutim:41,languag:41,lastbind:41,legal:1,level:41,lifetim:41,limit:[24,41,46],line:[4,38],link:[33,41],list:41,listen:[31,41],listnot:41,loadchannel:41,loadhelp:41,loadmodul:[7,41],localfil:15,locat:30,log:[29,34,44],logfil:41,make:33,manipul:41,mask:41,maskhost:41,masktyp:41,match:41,matchaddr:41,matchattr:41,matchban:41,matchcidr:41,matchexempt:41,matchinvit:41,matchstr:41,md5:41,messag:41,minut:41,miscellan:41,mkdir:[15,41],mode:41,modifi:44,modul:[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,34,41],modular:44,module_clos:27,module_expmem:27,module_report:27,module_start:27,module_t:27,monitor:41,more:2,msg:41,must:5,myip:41,name:41,need:7,newban:41,newchanban:41,newchanexempt:41,newchaninvit:41,newexempt:41,newignor:41,newinvit:41,newnam:41,nick2hand:41,nick:[41,45],nicknam:[15,41],nickserv:29,note:[18,41],notic:4,numberlist:41,numvers:41,obtain:4,old:41,oldnam:41,onchan:41,onchansplit:41,onelin:41,onlin:41,open:2,optim:15,option:41,output:41,own:[],parti:38,partylin:[15,24,29],pass:41,passwdok:41,password:41,patch:39,path:34,pattern:41,pbkdf2:19,pend:15,permiss:29,port:41,pre:[2,4,31],prefix:41,prepar:31,prerequisit:30,proc:41,procedur:41,protect:31,pushmod:41,putallbot:41,putbot:41,putcmdlog:41,putdcc:41,puthelp:41,putkick:41,putlog:41,putloglev:41,putnow:41,putquick:41,putserv:41,putxferlog:41,pwd:15,queue:41,queuesiz:41,quick:[3,4],quit:15,rand:41,raw:41,read:5,readm:4,reason:41,record:[33,41],refreshchan:41,regist:46,rehash:41,reload:41,reloadhelp:41,remov:41,renam:44,renudef:41,req:41,requir:[3,27,41],requisit:[2,4,31],resetban:41,resetchan:41,resetchanidl:41,resetchanjoin:41,resetconsol:41,resetexempt:41,resetinvit:41,restart:[29,41],rfcequal:41,rmdir:[15,41],roomstat:45,sasl:29,save:41,savechannel:41,script:[5,28,34,43],second:41,secur:[31,43],seen:20,self:44,sendnot:41,server:[21,31,41],serveraddress:41,set:[4,29,30,34,36,41,43],setchan:41,setchaninfo:41,setdccawai:41,setdesc:41,setflag:41,setlink:41,setown:41,setpwd:41,setudef:41,setup:15,setus:41,share:[15,22,33],show:30,snapshot:4,socklist:41,solo:40,some:2,sourc:[2,15,30],src:41,ssl:[34,43],start:30,starttl:41,startup:[3,4],stat:15,statu:41,step:29,stickban:41,stickexempt:41,stickinvit:41,still:7,storenot:41,str:41,strftime:41,string1:41,string2:41,string:[41,44],strip:41,stripcod:41,stuff:1,submit:39,substitut:42,support:[36,37,43],system:4,tag:41,tagmsg:41,target:41,tcl:[5,24,40,41,45],tcp:41,telnet:34,term:33,text:41,textfil:42,thing:2,time:41,timer:41,timerid:[],timernam:41,tip:44,tlsstatu:41,topic:41,traffic:41,transfer:23,twcmd:45,twitch:[24,45,46],twitchmod:45,twitchvip:45,type:[41,45],unam:41,unbind:41,uncompressfil:41,unhid:15,unixtim:41,unlink:41,unloadhelp:41,unloadmodul:41,unshar:15,unstickban:41,unstickexempt:41,unstickinvit:41,upgrad:[4,5],uptim:[25,41],usag:[15,36,37,40,43],use:[],user:[15,29,33,41,47],userlist:41,userport:41,userst:45,utim:41,validchan:41,valididx:41,validus:41,valu:41,variabl:[41,44],version:[30,41],via:[39,41],washalfop:41,wasop:41,web:46,what:[4,7,27,33],where:2,whom:41,why:[],window:3,without:7,woobi:26,write:[27,28],you:2,your:44}}) \ 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/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/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"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},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/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/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"],objects:{},objnames:{},objtypes:{},terms:{"04may2000":35,"3rd":5,"5c0":[21,30,35],"break":[15,42],"byte":[17,21,23,27,42],"case":[14,19,21,28,30,32,35,42],"catch":42,"char":[27,35,42],"const":27,"default":[2,3,4,10,11,14,15,17,21,23,29,30,31,32,33,35,41,42,44],"export":45,"final":[0,4,28,29,30,35,41],"function":[0,1,2,4,6,7,19,24,30,34,35,37,41,42,45,46],"import":[27,28,29,30,32,35,39,42],"int":27,"long":[6,10,14,18,21,22,33,35,42,43,46],"new":[4,5,7,19,24,28,29,30,32,35,36,37,38,39,40,41,44,45,47],"null":27,"public":[0,1,4,28,29,31,35,42,44,45,48],"return":[17,27,32,41,46],"short":[2,27,29,37,44],"static":[2,3,10,27,29,42],"super":2,"switch":[5,27,30,32,35,42,44,45],"throw":42,"true":28,"try":[3,4,6,7,20,21,25,27,28,29,30,32,35,46],"var":42,"void":27,"while":[0,4,5,10,16,24,30,32,33,35,39,41,42,47],AND:[19,30,42],ARE:28,Adding:[2,24,47],And:28,CVS:4,DNS:[2,6,42],DOING:28,For:[1,2,3,5,7,15,21,30,31,34,35,37,38,39,41,42,44,45,46,47],IPs:[29,31,37],NFS:23,NOT:[5,28,30,32,34,35,42,46],Not:[6,21,29,38],One:[0,4,28,32,42],THE:3,TLS:[2,3,4,5,29,30,35,42],That:[24,28,30,34,42,48],The:[0,1,2,3,4,5,6,10,11,13,14,15,16,19,21,22,23,24,25,27,28,29,31,32,33,34,35,36,38,41,42,44,45,46,47,48],Their:37,Then:[5,29,30,44],There:[1,3,4,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,29,31,32,33,35,37,41,43,44,47,48],These:[5,11,17,27,30,32,33,34,35,37,43,44,46,48],Use:[16,17,19,21,27,30,35,42],Used:42,Useful:42,Using:[2,4,27,42],WILL:46,With:[0,4,6,15,34,35,41,42,44],YES:7,Yes:7,aaa:[],abcdechannel:42,abil:[2,7,16,31,32,36,42],abl:[3,6,10,15,17,21,30,32,35,39,41,42],abort:[23,30,42,44],about:[2,4,6,24,25,27,28,29,35,42,45,47],abov:[1,4,10,17,19,27,28,29,36,42,43],absolut:[0,31,42,48],abus:[0,2,4],accept:[15,22,24,31,34,35,42,44,47],access:[0,4,16,21,27,28,29,30,36,39,41,42,44,46,47,48],accomplish:3,accord:[1,42,48],accordingli:21,account:[0,2,4,16,18,27,29,30,36,38,40,41,47],accur:[32,42,46],accuraci:32,across:[0,4,34,38,40,42,45],act:[16,27,35,36,42,44],action:[28,29,31,35,42],activ:[2,10,16,30,32,33,39,42,44],actual:[0,4,15,27,28,31,35,39,42],acut:[],add:[3,4,5,7,10,16,17,24,27,28,30,31,32,34,35,36,41,47],add_builtin:27,add_hook:27,add_tcl_command:27,add_tcl_int:27,add_tcl_str:27,added:[0,3,4,5,19,22,24,28,30,32,34,35,36,37,38,41,42,44,46],addhost:17,adding:[4,7,21,27,35,36,38,42],addit:[2,4,5,16,21,30,35,42,44,46],addition:[16,30,32,42],addlang:[35,42],address:[18,22,25,30,34,35,37,44],addus:30,adh:35,adjust:[0,4,17],admin:[35,43],admit:23,advanc:[0,2,4,6,20,28,36],advantag:[5,30,45],advertis:[0,4,42],advis:[3,21,23],affect:[5,10,24,35,36,37,42,47],affet:42,affili:[1,47],after:[3,4,10,16,17,21,27,28,29,32,33,35,42,44,45,47],afterward:[17,35],again:[6,15,25,27,33,34,35,41,42,46],against:[10,15,19,21,28,30,41,42,46],age:42,aggress:34,aka:35,alarm:42,alert:[32,47],algorithm:[19,41],all:[1,5,6,7,10,13,14,15,17,19,21,22,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,44,45,46,47,48],alloc:[27,42],allow:[0,3,4,5,6,7,10,11,15,16,17,18,19,21,22,23,24,27,28,29,30,32,34,35,36,41,42,44,45,47],alltool:35,almost:[0,4,30,33,48],along:[4,15],alphabet:35,alphanumer:47,alreadi:[10,21,27,28,30,31,32,34,35,41,42,47],also:[0,2,3,4,7,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,29,30,33,34,35,36,39,41,42,43,44,45,46,47,48],alt:[21,35],alter:[15,36,42,47],altern:[2,4,16,21,30,31,34,35,42,44],although:[17,30,35,42],altnick:[21,30],altogeth:19,alwai:[0,3,4,10,30,32,33,35,42],amount:[6,35],anachron:31,ani:[0,1,3,4,5,7,12,15,16,17,18,21,22,24,27,28,29,30,33,35,36,39,41,42,44,46,47,48],annoi:28,announc:32,anonym:35,anoth:[0,10,15,17,18,21,22,27,30,34,35,42,43,46],another:5,ansi:42,answer:[0,7,13,16,21,28],any_other_funct:27,anymor:[6,9,19,35],anyon:[10,33,42],anyth:[0,4,15,28,29,30,34,35,39,42,46],anywai:35,anywher:[39,42],aol:[28,41],aop:10,apart:[27,35],api:6,apostroph:39,appear:[29,30,34,35,42,46],append:[27,42],appli:[30,33,35,41,48],applic:[1,35,42],appreci:31,appropri:[3,5,30,35,38,40,41],april:[24,46],apt:[30,31],arbitrari:42,arbitrarili:46,archiv:4,area:[6,15,35,42,45,48],aren:[30,35,42,45,46],arg:27,argument:[15,17,28,29,37,42,46],around:[0,4,24,31,37,42,47],arriv:42,ascii:42,ask:[4,17,29,30,39,42,44],assign:[34,35,42],assist:[2,30,32,44],assoc:[2,6],associ:[24,32,42,47],assum:[21,28,30,31,32,33,35,42],assumpt:38,assur:46,asynchron:[6,14,42],attach:[32,42,46],attack:[10,19,41],attempt:[5,10,16,17,21,24,31,32,33,34,35,42,44,47],attent:[5,21,32,42],attribut:[33,34,42,48],auch:27,aug:42,august:17,auth:[35,44],authent:[2,32,41,42,47],author:[28,31,35,44],auto:[34,48],autobotchk:[3,4,29],autoconf:3,autoconfigur:3,autodetect:44,autohalfop:10,autom:[0,2,4],automat:[2,3,4,5,12,16,21,30,32,33,34,35,36,37,41,42,44,47,48],autoop:10,autosav:12,autovoic:[10,48],avail:[4,10,15,19,25,27,29,30,31,35,36,37,39,42,47],avoid:[6,14,29],awai:[36,38,42],awar:42,awesom:28,b33f:30,baa:42,back:[21,28,30,35,37,40,41,42,45],background:[2,4,28],backslash:30,backup:[5,27],backward:[5,38],bad:[10,42,48],badg:48,badgui:46,ban:[0,2,4,10,17,24,34,35,36,47,48],bandwidth:[6,11],banner:[35,43],bar:42,barr:35,base64:29,base:[4,30,32,35,41,42],basi:30,basic:[2,4,6,7,20,28,30],bask:40,bbb:[],bcst:42,bear:1,becaus:[0,4,16,21,27,28,35,42,45,46,47],becom:[29,30,35,42],been:[0,1,4,5,15,17,21,27,33,35,36,42,46],beerbot:32,befor:[0,4,10,14,16,17,18,21,22,23,27,29,30,32,34,35,42,47],began:38,begin:[16,28,37,42],behalf:42,behav:42,behavior:[13,17,33,35,37,42],behind:35,being:[0,4,10,15,17,21,31,32,36,37,42,46],beldin:34,bell:42,belong:35,below:[10,15,16,22,24,27,28,30,35,41,42,46],best:[2,3,6,16,30,34,42,46],better:[3,4,6,20,30,35],between:[3,6,10,15,18,21,22,31,32,34,35,37,42],beverag:41,big:[5,23,42,45],binari:[3,31],bind:[2,16,17,21,24,27,28,32,35,45,47],birthdai:35,bit:[3,15,24,28,30,31,35,42,44,47],bitch:10,bitchx:42,blank:42,bless:1,blindli:17,bloat:7,block:[23,24,27,30,43,47],blowfish:[1,2,5,6,19,27,35,41,42],bodi:28,bogu:35,bold:[4,42,43,48],boldfac:42,boot:35,bore:[2,4],boston:1,bot:[0,1,3,4,5,6,7,10,12,13,14,16,17,18,19,20,21,22,23,25,27,28,29,30,31,33,35,36,37,38,39,41,43,44,45,46,47,48],bota:34,botaddr:42,botaddress:42,botattr:34,botb:34,botc:34,botchk:[4,29,30],botdir:30,botfl:42,botflag:[2,22],both:[0,4,10,21,23,31,32,34,37,41,42,44],botnam:34,botnet:[0,2,3,4,6,8,10,12,15,21,25,30,36,37,39,41,42,45,48],botnetcentr:43,botnetnick:42,botnetop:10,botnick:[21,28,29,30,35],bottom:28,bottre:2,bounc:17,bound:[16,35,42],boundari:14,box:[30,35],brace:10,bracket:37,branch:[4,40],breach:42,brief:30,broadcast:[24,39,42,46,47],broken:[15,28,35,42],brows:15,brute:19,buf:17,buffer:22,bug:[0,3,4,28,30,40],build:42,built:[2,16,42,45],builtin:[16,42],busi:28,button:[40,47],bypass:42,bywho:42,cach:[14,42],cafil:[35,44],calcul:21,call:[0,3,4,27,28,29,34,35,42,46],callback:32,can:[0,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],cancel:[6,42],cannot:[0,27,30,32,41,42,48],cap:[2,27,32,36,47],cap_net_bind_servic:16,capabl:[2,35,36,42,45,47],capac:47,capath:[35,44],capit:[4,48],caption:[],captur:[30,42,45],care:[35,42,47],carefulli:[30,42],carelessli:5,categori:42,caught:42,caus:[16,30,34,42,45],caution:42,cbc:42,ccht:46,center:43,central:[15,35],cerfif:[],cert:[29,35,44],certain:[33,35,36,37,42,43,46,48],certainli:[24,30,47],certif:[2,3,21,29,31,35,42],certifict:44,cet:35,chaddr:[5,34],chain:[35,44],challeng:[28,29],chan:[5,10,17,28,29,30,45],chanc:30,chanfil:[10,30,45],chang:[1,2,6,9,10,15,17,19,21,22,24,28,30,31,34,35,36,38,39,40,44,46,47],chaninfo:[29,34],chanmod:[10,29],channel:[0,2,4,5,6,8,12,17,20,21,22,24,27,28,30,32,33,34,35,36,39,43,45,47,48],channelflag:42,chanrec:[17,42],chanserv:10,chanset:[10,29,34],charact:[2,10,15,21,30,34,35,37,41],chase:[0,4],chat4:2,chat6:2,chat:[0,2,4,6,13,21,29,30,34,35,36,39,42,44,46,47],chatter:35,chattr:[29,48],check:[2,4,5,10,21,27,28,29,31,35,41,42,44,46],checkout:[30,40],chfinger:35,chghost:[36,38],chjn:42,chmod:[3,35],chof:42,choic:[1,21,28],chon:42,choos:[3,7,29,30,35,36,47],chpass:41,chpt:42,chri:1,chunk:21,cidr:[35,42],cipher:[35,42,44],claim:[24,47],clarifi:33,clean:15,clear:[4,6,40,42,44,46,47],clearchat:[24,46],clearmsg:[24,46],cleartext:42,clemson:48,click:[40,47],client:[15,16,21,24,29,30,32,35,38,42,44,47],cloak:29,clone:[2,4,10,30],close:[27,42],cmd:[35,42],cmd_t:27,cmsg:46,code:[1,2,3,4,7,27,28,42],coder:[],col:43,cold:[40,41],colon:[35,37],color:[4,42],column:43,com:[2,4,5,6,20,21,28,29,30,34,35,41,42,44],combin:[36,42],combo:29,come:[4,6,17,21,30,40,42],comfort:30,comma:[35,39,42],commadlin:30,command:[2,3,6,10,12,15,16,17,20,21,27,28,29,30,31,32,33,34,35,36,37,39,41,44,47,48],commandlin:30,comment:[15,17,25,28,30,35,41],commerci:30,common:[2,21,30,31,34,35,38,44,48],commonli:[29,31,35,42],commun:[2,27,34,39,40,42],compat:[3,5,38,42,46,47],compil:[0,2,3,4,27,30,31,35,37,42,44],complet:[3,4,10,15,22,30,36,42,44,48],compliant:[17,21,42],compon:42,comprehens:46,compress:[2,6,29],compris:38,concurr:[35,41],conf:[3,7,16,29,30,38,42,44],config:[2,3,4,6,7,10,11,12,13,14,16,17,18,19,21,22,23,24,25,27,28,29,31,32,33,34,35,37,41,43,44],configfil:42,configur:[2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,35,37,40,42,44],confirm:[40,42],conflict:16,confus:42,connect:[2,4,5,6,14,15,16,21,24,27,29,30,34,35,37,39,44,47,48],connet:[],consequ:46,consid:[4,30,32,33,35,39,42],consider:41,consist:[34,36,39,42],consol:[2,4,6,10,27,36,39],constantli:27,constitut:[10,21,35],consult:[37,38,44],contact:[28,35],contain:[1,3,4,5,28,30,32,34,35,37,42,44,46],content:[41,42,46],contest:6,context:27,continu:[30,42],contribut:40,control:[0,2,4,17,21,28,29,34,35,36,44,47,48],conv_form:29,conveni:35,convers:[27,39,44],convert:42,cooldud:30,coordin:35,copi:[1,2,5,7,15,23,27,30,42],copyright:[0,1,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],core:[2,3,6,7,17,18,21,27,28,42,45],correct:[3,31,35,41],correctli:[3,42],correspond:[10,29,33,42],cos:10,could:[1,21,28,34,35,37,40,41,42,44,47],couldn:42,count:21,counterpart:42,coupl:42,cours:[3,28,34,35,42],cover:[32,33,34],cpu:[21,35,42],crappi:42,crash:[3,42],creat:[0,3,4,15,16,22,27,28,29,30,33,35,40,41,42,44,45,47],creation:[29,32],credit:[28,42],cron:42,crontab:[2,3,29,42],cross:30,crotab:[],crt:[29,35,44],crypto:41,cryptograph:[19,41,42],crytopgraphi:41,ctcp:[2,6,10,21,29,30,35,42,44],ctcr:42,ctrl:42,curl:30,current:[2,4,6,7,9,15,17,18,19,24,27,29,30,32,35,36,39,42,43,44,46],custom:[16,21,28,29,32,36,42,44],cut:29,cycl:[10,21,35],cygwin:[2,37],daemon:[16,29,35],dai:[18,23,35,42,45],daili:[30,42],dalnet:[4,17,21],danc:42,danger:42,danish:35,data:[4,10,22,27,31,41,42],databas:[15,42],date:[1,4,30,32,35,42],db8:[21,30,35],dcc:[0,2,4,6,15,20,21,23,27,29,30,34,36,37,39,41,45],dead:30,deal:[35,42,48],dealloc:27,deauthent:32,debian:[30,31],debug:[3,25,27,28,35,42,44,46],dec:[15,42],decemb:[0,26,36,39],decent:27,decid:[38,41],decis:47,declar:[28,42],decreas:35,defens:28,defin:[4,6,10,11,13,17,21,27,28,30,32,33,34,35,38,42,48],definit:[28,30,31,41],degrad:47,dehalfop:[10,42,48],del_hook:27,delai:[10,15,17,28],delet:[30,42,45],deliber:44,delimit:42,deliv:42,demand:[0,4],demonstr:[6,26,42],denot:[31,42],deop:[10,42,48],depend:[27,32,33,40,42,44,48],deprec:[5,31,42],deprici:21,depth:[35,44],der:29,deriv:41,desc:[6,27],describ:[27,28,30,31,34,35],descript:[6,27,28,29,35,42,46,48],descriptivebranchnam:40,deserv:28,design:[0,2,4,19,38,46],desir:[7,27,29,30,41],despit:31,dest:[3,6,30,31,35,42,44],destin:[16,27],destroi:[0,4],detail:[3,4,6,27,30,32,42,44,46],detect:[7,21,31,37,42,44],determin:[2,3,16,27,29,30,34,37,42,44],dev:[4,30,31],devel:3,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,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48],devleop:[],dict:[42,46],dictionari:42,did:[1,41],didn:[28,30,42],die:[27,29,30],died:21,differ:[1,3,4,5,10,15,21,28,31,32,35,41,42,45,46],differenti:42,diffutil:3,digest:[19,42],digit:[35,44],dinner:41,dir:[6,29],direct:[7,31,34,40,42],directli:[5,6,10,16,22,30,42],directori:[2,3,4,6,7,23,27,29,30,31,36,40,44,45],disabl:[10,17,21,35,37,42,44],disc:42,discard:[22,42],disclaim:[2,42],disconnect:[21,22,35,42],discontinu:47,discourag:17,discuss:[4,40],disk:[0,23,30,35,36,42],displai:[12,15,17,21,29,30,35,42,43,46],displaynam:27,dispos:42,dissect:28,distinguish:42,distribut:[0,1,4,30],distro:31,dload:23,dns:[6,14,35,42],doc:[0,3,4,5,6,21,28,31,35,39,42,46,47],document:[2,16,28,30,31,34,37,38,40,44,45],doe:[10,24,28,29,32,33,35,38,39,42,46,47,48],doesn:[12,14,17,30,39,42,45,46],doing:[19,21,28,35,42,43],domain:[1,14,34],don:[4,7,10,14,15,17,21,22,24,27,28,29,30,34,35,39,42,44,45],donat:[24,47],done:[5,22,27,29,30,31,34,40,41,42,47],donkei:30,dontkickop:10,dot:39,doubl:21,doubt:37,down:[0,3,4,15,34,42],downer:24,download:[3,4,5,7,15,23,35,36,42],dozen:28,dp_help:27,dp_log:27,dp_mode:27,dp_server:27,dp_stdout:27,dport:16,dprintf:27,drastic:[27,42],driven:42,dronepup:42,drop:[3,4,35,42],dropp:[],dst:6,due:[17,21,28,35,42,46],dump:[21,35,42],duplic:42,dupwait:35,dure:[3,11,22,27,29,30],dynam:[2,3,10,29,30,33,42],dynamicban:[10,42],dynamicexempt:[10,42],dynamicinvit:[10,42],each:[0,4,6,10,15,18,23,28,29,30,32,34,35,36,39,42,45,46,48],earlier:19,easi:[5,28,30,42,44],easier:[3,19],easiest:42,easili:[0,1,2,4,28,36,42],east:35,ebai:35,ecb:42,ecdsa:29,echo:[36,38,45],ecparam:29,eden:42,edit:[2,3,28,45],editor:[29,30],editplu:30,edu:[42,48],effect:[15,33,35,42],effici:[0,4,30,34,35,36],effort:[0,2,4,42],efnet:[4,17,21],egg_lang:35,eggdrop1:7,eggdrop:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,37,38,41,43,44,45,47,48],eggdroptest:[32,46],egggdrop:2,egghead:[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,28,30,33,34,35,36,37,38,39,40,41,42,43,44,45,48],egghelp:[4,30],eight:[35,42],either:[3,4,15,16,29,30,31,32,33,34,35,37,42,44,46],element:42,elimin:29,els:[28,39,42],email:[4,29,35,42],embed:42,emerg:38,emot:46,empti:[42,46],enabl:[0,2,4,7,10,12,15,17,21,23,27,28,30,34,35,36,37,38,44,45,47],enclos:[10,37,42,46],encod:[42,43],encount:[30,47],encourag:[2,30,41],encpass2:41,encrypt:[2,5,6,9,19,29,31,34,36,44],end:[3,27,35,41,42,43],endless:10,enforc:[10,29,32,35],enforceban:10,english:[35,45],enhanc:7,enjoi:41,enlarg:3,enough:35,ensur:[27,29,30,34,41,42],enter:[3,10,15,29,31,35,39,40,41,42,44,46],entir:[30,42,46,47],entitl:48,entri:[3,4,29,30,35],env:35,environ:[16,35,36,44],eof:42,equal:42,equival:[6,21,31],equivil:[],eras:[15,42],error:[4,21,27,30,35,42,47],escap:42,especi:28,essenti:41,est:35,establish:[37,42,44],etc:[0,2,4,10,17,24,27,30,32,34,35,36,42,45,48],eth0:16,ethic:35,etiquett:4,european:35,evalu:42,even:[0,4,7,15,17,27,30,33,34,35,36,39,42,47],event:[0,4,24,27,32,34,35,46,47],eventu:19,ever:[29,30,35,42,44],everi:[0,3,4,10,15,17,21,23,27,28,29,32,33,35,37,41,42,48],everydai:35,everyon:[39,42],everyth:[3,28,42],everywher:[35,37,42],evnt:[21,42],exact:42,exactli:[15,17,27,28,42],examin:27,exampl:[2,3,4,5,7,15,16,21,27,28,29,30,31,35,39,42,44,45,46,47],exceed:35,except:[4,13,21,27,35,42,44],excess:[4,10,21],exchang:29,exclud:42,exclus:[21,42],execut:[2,3,7,27,28,32,42],exempt:[0,1,2,4,10,17,24,34,36,47,48],exhaust:[42,46],exist:[0,4,15,21,27,32,41,42,46,47,48],exit:[4,6,12,15,21,42],expand:[0,2,4],expans:42,expect:[6,13,35,42],experi:[3,15,28,30],experienc:3,expir:[10,17,18,21,33,35,42,44],explain:[10,42],explan:[10,30,31,42,46],explicit:38,explicitli:[5,42,44],express:42,extend:[24,36,38,42],extens:[3,30,32],extern:[16,29,35],extra:[7,35,38],extract:[30,42],f270:30,face:47,fact:[0,4,46],fail:[14,23,35,42,44],failur:[42,46],fake:42,fals:42,famili:35,familiar:[4,28],fanci:41,fancyp:28,far:15,fast:30,faster:42,fastest:4,fatal:42,fault:27,favor:[5,22],featur:[0,2,4,7,10,17,21,22,29,30,32,35,37,38,40,42,44,47,48],februari:13,feel:[4,5,27,40],few:[24,28,30,31,35,42,47],field:[21,32,35,42,44],fifth:1,fight:10,figur:[3,30],fil:42,file:[1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,36,37,41,43,44,48],file_receiv:42,file_send:42,file_send_pend:42,filearea:42,filedb:[15,42],filemask:6,filenam:[6,10,18,30,35,44],filepath:6,files:15,filesi:[2,6,35],filestat:6,filesystem:[15,42,48],fill:[35,40,44],filt:[27,42],find:[3,6,14,17,20,27,28,29,30,39,40,42,47],fine:[17,21,35,46],finger:[13,30],fingerprint:[29,35,44],finish:[4,15,30,42],finnish:35,firewal:35,first:[0,2,4,5,15,19,21,27,28,30,31,34,35,41,42,44,45,46],five:42,fix:[0,3,4,27,35,42],flag:[2,5,6,10,13,17,22,27,28,30,35,36,43],flagmask:46,flash:43,flat:42,flexibl:[42,44],flood:[0,4,10,13,18,21,34,35,36,42,48],floor:1,flud:42,flush:22,focus:[24,47],folder:7,follow:[3,4,5,10,15,17,21,24,27,30,31,34,35,36,38,40,41,42,43,44,45,46,47],foo:[28,29,42],forbid:3,forc:[3,10,12,15,19,22,28,35,37,42],forcefulli:44,forev:35,forget:42,fork:[31,40],form:[0,4,27,28,42,43],format:[7,21,27,29,30,31,35,41,42,43,46],forward:18,found:[2,4,27,35,42,46],foundat:1,four:[10,28,32,35,37,42,43],fourth:28,fprint:[35,44],fragil:42,franklin:1,free:[1,2,5,27],freebsd:37,freeli:[0,4],freenod:21,french:35,frequent:[4,30],fresh:35,fri:42,friend:[10,48],frim:27,from:[0,1,2,3,4,5,6,7,10,15,16,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,37,39,41,43,44,45,46,47,48],front:[10,28,30,31,42,47],ftp:[5,30],full:[3,4,5,24,30,37,42,44,46,47],fuller:1,fulli:[5,35,42,47],fun:[3,47],func:27,func_nam:27,func_tabl:27,function_to_cal:27,further:[29,42],futur:[3,17,30,41,42],fwd:18,gain:[0,4,41,48],game:[0,2,4,24,47],garbag:27,gatewai:[24,46,47],gave:30,gayteen:0,gcc:3,gener:[0,1,3,4,19,24,28,29,30,38,41,42,44,47],genkei:29,genrsa:35,geo:28,german:35,get:[6,7,10,21,22,23,27,28,31,32,35,39,48],geteggdrop:[2,4,30],getinfo:42,getop:10,gif:15,git:[2,3,30,40],github:[2,4,30],give:[3,4,10,15,21,28,30,34,35,36,39,41,42,48],given:[4,14,15,16,30,42,46],global:[2,12,16,17,21,22,27,28,33,34,46,48],globalflag:42,gmt:[35,42],gnu:[0,1,3,4,11],goe:[3,10,29,33,34,39,42,44],going:[0,4,15,21,28,31,32,42],gone:[17,42],goober:42,good:[0,15,21,24,28,30,35,42,47,48],got:42,gpl:[0,4],grab:42,grain:28,grant:[29,36,44,47],graphic:44,greater:42,gree:28,greet:[0,2,4,10,28,32],greetmsg:28,greetscript:28,grep:29,ground:35,group:[15,16,35,38,42],grown:0,gseen:[6,20],guarante:[17,32],guess:17,gui:46,guid:[2,3,28,30,31],gunzip:30,guppi:42,gzip:[11,42],had:[3,5,10,34,35,42,47],haha:4,halfop:[10,42,48],hand:[28,35,42],handi:30,handl:[28,29,33,35,41,44,46],handshak:42,hang:[6,14],happen:[28,30,33,35,42],hard:[28,35],harder:28,hardwar:[0,4],has:[0,1,2,4,5,10,14,15,17,21,28,30,31,32,33,34,35,36,37,41,42,44,46,47,48],hash:[2,5,19,30],hasn:21,hate:48,have:[0,1,3,4,5,6,9,10,12,15,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,36,37,39,41,42,44,45,46,47,48],haven:30,head:35,header:[2,4,27,28,31,44],heaven:3,held:46,hello:[17,21,29,30,35,36,42],help:[0,3,13,21,27,28,29,30,33,34,35,37,39,42,43,48],helper:3,henc:[7,27,42],here:[2,4,10,13,14,15,17,18,21,23,28,29,30,33,34,35,42,45,46],herself:4,hidden:[15,30,36],hide:[6,37,42],high:45,higher:[17,19,22,23,30,44],highest:42,highli:[3,21,30],highlight:48,him:1,himself:4,hint:28,his:[21,30],histor:42,histori:46,hit:42,hold:[22,42],hole:35,home:[3,15,16,29,30,44],hook:27,hook_5minut:27,hook_backup:27,hook_daili:27,hook_di:27,hook_hourli:27,hook_idl:27,hook_load:27,hook_minut:27,hook_num:27,hook_pre_rehash:27,hook_read_userfil:27,hook_rehash:27,hook_secondli:27,hook_userfil:27,hope:[30,47],hopefulli:[3,42],hors:30,host:[0,2,4,10,16,21,24,28,33,34,35,44,46,48],hostmask:[28,29,33,34,36,41],hostnam:[6,10,14,29,35,37],hosttarget:[24,46],hour:[6,25,27,33,35,42],hourli:[18,27,35],how:[0,3,6,10,13,14,15,18,21,22,24,28,29,30,31,33,34,35,42,44,45,46,47],howev:[4,7,13,21,29,31,32,35,41,42,44,45],htgt:46,html:[4,37],http:[2,4,6,20,25,30,32,38],hub:[4,22,30,34,35,41,44],hubbot:31,hubcap:48,humor:29,hup:42,hurt:5,iconfig:[3,7,30],idea:[28,30,40],ideal:[41,47],ident:[2,6,7,17,21,29,35,37,41,42],identd:[16,30],identifi:[29,35,41,42,48],idl:[10,27,42],idx:27,ignor:[0,4,13,21,22,28,34,35,36,42,46],ill:42,imag:4,immedi:[21,30,32,41,42],imperson:16,implement:[6,7,16,31,32,35,38,40,41,42,47],implementatino:31,impli:[1,27],importantli:28,improv:[0,4],inact:[10,23],inc:1,incess:0,includ:[0,2,3,4,7,17,25,27,29,30,31,33,35,36,37,41,42,44,46,47],incom:[15,35,42],increas:[32,35,41],incred:[30,42],independ:7,indic:[21,27,30,42,46],infeas:[24,47],infin:35,infinit:15,info:[3,4,10,12,17,27,30,35],inform:[0,2,3,4,5,6,10,15,25,27,28,29,30,32,34,35,37,38,42,44],infrastructur:44,ing:[17,24,47],init:[21,35,42],init_serv:21,initi:[27,28,30,37,38,42,44],input:42,insecur:10,insensit:42,insert:[10,43],insid:[28,35],instal:[0,4,5,28,29,31,35],instanc:[10,32],instantli:21,instead:[1,4,5,10,15,16,17,22,24,30,35,41,42,44,45,47,48],instruct:[7,30,41],integ:[10,42],integr:2,intend:[3,33,42],intens:21,intent:[24,47],intention:28,interact:[3,4,6,16,17,35,42,44,47],intercept:42,interchang:[31,37],interest:4,interfac:[2,24,42,47],intern:[21,32,35,42,46],internet:[0,4,42,44],interpret:[3,37,42,43],interv:42,introduc:[4,30,42],invalid:42,invers:43,invit:[0,2,4,10,17,24,34,36,38,47],invite:42,invok:42,involv:29,invt:42,ipaddress:42,iptabl:16,ipv4:[30,35,37],ipv4address:42,ipv6:[2,30,35,36,42],ipv6address:42,irc:[0,4,6,15,16,21,24,28,29,30,32,33,34,35,36,37,38,39,42,43,45,46,48],ircawai:42,ircd:[17,21,42],ircii:[23,42],ircnet:[4,10,17,21],ircop:[10,17],ircu2:17,ircv3:[2,32,36,42,45],isn:[6,15,21,22,25,30,33,42],isol:34,isop:10,isoptest:10,isp:30,isset:32,issu:[4,5,16,24,30,32,35,40,42,44,46,47],issuer:44,issupport:32,istn:10,isupport:32,ital:42,item:42,its:[1,2,4,7,10,15,16,17,19,21,22,24,28,30,32,34,35,36,40,42,45,47],itself:[15,27,28,29,35,42],itsself:[],j9irk4vs28b0obz9easys4w2ystji3u:47,jan:[42,44],janitor:[15,48],januari:[1,8,9,12,18,20,23,25,42],jkp:30,job:44,john:1,join:[2,6,10,12,17,18,24,28,30,31,33,35,36,38,39,42,46,47,48],jpk:35,jul:7,juli:0,jump:[21,34,44],jun:45,june:16,jupe:42,just:[0,3,4,5,6,14,15,17,19,22,27,29,30,32,34,35,39,41,42,45,46,47],karma:40,keep:[2,4,10,15,21,23,30,35,47],kei:[2,3,10,17,24,28,29,35,41,46,47],kept:[33,35],keyout:[29,44],keypair:[29,31],kick:[10,17,21,32,35,42,45,48],kicker:42,kiddi:35,kill:[30,42],killer:5,kilobyt:[15,35],kind:42,know:[17,18,21,24,27,28,32,33,34,35,42,45,47],knowledg:0,known:[21,29,35,41,42],kreativrauschen:[6,20],kvirc:44,lag:[35,39],lame:[10,17,34,35,42],lamer:35,lameshar:34,lamest:[10,30,34,35,43],lamestbot:[3,10,18,21,30,34,35,42,43],lang:45,languag:[28,35,36,45],larg:[2,15,17,21,35],larger:[28,41],last:[0,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,30,33,34,35,37,38,39,42,43,44,45,46,48],lastli:42,laston:42,late:42,later:[1,3,6,9,18,19,25,28,30,35,42,44],latest:[4,5,30],launch:30,layer:[29,31],lazi:17,leaf:[34,35,41,44],learn:[17,29,30,35,36,42],least:[4,17,27,30,33,35],leav:[10,21,30,35,39,42,47],left:[17,42],legal:[2,4],len:21,length:[17,21,27,41,42,44],less:[13,39,42],let:[4,6,10,14,18,27,28,30,34,35,36,42],letter:[4,35,48],level:[11,16,29,32,35,48],libera:[2,4,5,21,27,28,29,30],librari:[28,41,44],libssl:[4,30,31],licens:[0,1,4],lieu:42,life:[18,30],light:47,like:[0,1,4,6,9,10,13,15,17,19,27,28,29,30,35,36,37,39,40,41,42,44,46,47,48],limbo:35,limit:[2,6,10,15,17,21,34,37],lindex:42,line:[2,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,34,35,36,41,42,44,45,46,47],link:[0,2,3,4,5,6,7,15,22,23,27,35,36,38,41,44,45],linux:37,list:[0,4,6,10,14,15,19,21,22,24,25,27,28,29,30,31,32,34,35,36,38,39,44,46,47],listen:[29,30,34,35,37,44],liter:[27,42],littl:[3,5,15,24,30,34,45],llama:34,llamabot:[30,35],load:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,34,35,41,42,47],loadmodul:[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,35,41,47],lobster:41,local:[15,28,30,35,39,40,42,44],localfil:6,locat:[2,4,23,28,29,31,35,44],log:[0,2,4,10,19,24,27,30,32,40,41,42,47],logfil:[25,27,30,35,45],logfilenam:35,logflag:35,logic:42,login:[30,35,41,46],logmod:27,logsiz:35,longer:[3,5,15,17,19,27,30,31,42],look:[0,4,5,6,10,20,25,26,28,29,31,32,35,36,41,42,44,47],lookup:[14,35,37,42],lose:10,lost:42,lot:[5,17,28,30,32],low:[21,23],lower:21,lowercas:21,lsa:15,luck:[30,47],lurk:2,mac:37,machin:[3,16,30,35],macro:27,made:[0,1,3,4,5,10,22,40,42,44,47],magic:28,mai:[1,4,5,10,11,15,16,17,23,28,30,34,35,37,38,42,45,46,47],main:[7,28,30,31,32,39],maintain:[2,16,30,32,45,46],mainten:48,major:[27,30,42],make:[0,2,3,4,5,6,7,10,13,15,19,21,22,24,27,28,29,30,31,35,37,38,40,42,44,45,47],makefil:[3,27],making_modulenam:27,man:35,manag:[2,4,6,15,24,31,47],mandatori:42,mani:[4,5,10,14,15,17,21,27,29,30,31,34,35,42],manipul:[2,35],manpag:35,manual:[4,29,34,35,37,42,44,46],mar:37,march:[33,43,48],mark:[15,36,42,48],mask:[15,21,28,35,46],masquerad:35,master:[15,29,30,33,34,35,42,43,48],match:[1,2,10,15,17,27,28,33,35,41,44,46],math:42,matter:[1,14,28,29],max:[15,17,18,21,23,35],maxdepth:[],maxim:35,maximum:[10,14,15,17,18,21,23,35,41,42,44],maxsend:14,mayb:[28,35],mco:[35,42],mcobx:30,md5:[6,9],mean:[15,17,21,28,29,32,33,34,35,36,37,41,42,44,46],meaning:[24,42,47],meaningless:48,measur:21,mechan:29,meet:44,mem:42,member:[10,27,32],memberlist:42,memori:[27,42],mention:27,meridian:35,messag:[4,10,21,27,28,30,32,35,36,38,39,41,43,45,46],method:[4,6,9,16,17,19,24,28,29,30,31,41,45,47],midnight:35,might:[4,17,23,27,35,42,44],migrat:5,militari:35,milk:48,min:35,miniatur:39,minimum:[0,10,42,46],minor:[27,42],minu:10,minut:[4,10,17,23,27,29,30,33,35],mirc:[21,42],misc:[35,42],miscellan:2,misnom:42,miss:[4,30,32,42],mix:[10,17],mkcoblx:35,mkdir:6,mnnrrpp:42,mnot:22,mnt:30,moc:42,mod:[3,6,7,20,24,27,35,42,46],mode:[4,5,10,13,17,21,24,27,29,32,33,35,36,38,47],mode_proc:42,mode_proc_fix:42,modechang:42,moder:[24,29,46,47],modern:[16,41],modes_per_line_max:17,modif:[5,30,42],modifi:[2,6,14,17,28,32,35,42],modul:[0,2,4,30,32,34,36,41,47],modular:2,module_clos:[],module_depend:27,module_entri:27,module_expmem:[],module_find:27,module_load:27,module_nam:27,module_regist:27,module_renam:27,module_report:[],module_start:[],module_t:[],module_undepend:27,module_unload:27,modulenam:[7,27],moment:[17,30,31],monitor:[33,36,38],month:[35,42],moo:42,more:[3,4,5,6,13,15,17,20,27,28,29,30,31,34,35,36,38,40,41,42,44],moreov:35,most:[0,2,4,5,16,17,21,27,28,29,30,31,35,36,39,42,46,47],mostli:[24,42,47],motd:[35,43],mount:23,move:[3,4,15,21,30,42,47],mpj:42,mrlame:[30,35],mrslame:[30,35],msg:[4,6,17,20,21,29,30,35,36,39,41,46],msgid:46,msgm:[21,42],much:[2,3,24,27,30,39,42],multi:30,multipl:[0,2,4,16,28,30,34,35,36,42,46],must:[1,2,3,4,10,14,16,17,21,23,27,29,30,31,32,34,35,41,42,44,46],mydir:15,myownevent123:42,myproc:42,mytag:42,myvar:45,myword:17,name:[3,4,6,8,15,21,27,28,29,30,31,32,35,46],nano:30,nat:[16,35,37],natur:46,nearli:7,necessari:[10,31],necessarili:42,need:[0,3,4,10,14,16,17,21,27,28,29,30,31,32,34,35,37,41,42,44,46,47,48],needal:42,needop:42,neg:[14,35,42],negcach:14,negoti:[42,44],net:[1,3,17,21,24,30,32,38],netbsd:37,nethack:48,netsplit:[16,17,35,36,42],network:[0,2,4,17,21,35,42,43],never:[4,5,10,35,42],new_module_nam:27,newer:[5,30],newhandl:42,newidx:42,newnick:42,newus:[30,35],next:[5,10,15,21,27,28,30,31,35,42],nfree:27,nice:27,nicebot:30,nick:[10,17,21,25,28,29,30,35,48],nicknam:[6,21,28,29,30,32,35,43,45,46,48],nickserv:[2,44],nist256p:29,nkch:42,nmalloc:27,no_irc:[6,21],nobodi:[15,28],node:[29,44],nodesynch:10,noemail:4,non:[3,10,14,16,17,21,27,29,33,34,42,44,47],none:[8,9,10,12,14,18,19,20,21,23,26,42],noout:29,noqueu:42,nor:16,normal:[0,4,6,13,14,15,16,21,27,28,31,35,42,44,45,46,47],notabl:47,notat:35,notc:42,notcproc:42,note:[2,3,6,7,9,10,14,17,19,21,22,27,29,30,32,34,35,41,44,46,47],notebox:42,notefil:[18,42],notepad:30,noth:[27,35,42,47],notic:[2,13,15,28,34,35,42,47],notif:42,notifi:[18,21,30,35,36,38,42],nots:1,nov:34,novemb:[22,38],novic:[0,4],now:[3,5,15,16,17,28,29,30,31,34,35,37,41,42,46,48],ntik:42,number:[2,10,15,17,18,19,21,23,24,27,30,31,34,35,41,42,44,46,47,48],numer:[29,31,42],nxdomain:14,oauth:47,obtain:[2,31,44],obvious:[33,42],occur:[17,28,42],occurr:27,octal:35,octob:[10,19,21,35],off:[10,16,17,21,30,34,35,39,42],offer:[30,31,32,46,47],offici:[2,4],offlin:42,offset:35,often:[4,6,14,29,35,46],oident:16,oidentd:16,okai:35,old:[6,19,21,30],old_module_nam:27,older:[4,37,42],oldest:[2,42],oldhandl:42,omin:28,omit:[42,44],onc:[4,10,15,17,19,21,28,29,30,40,42],one:[4,10,15,16,17,21,27,28,29,30,31,33,34,35,36,39,40,41,42,44,45],ones:[14,22,34,37,42],onjoin:18,onli:[3,4,5,6,7,10,15,16,17,18,20,21,22,25,26,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],onlin:[6,15,18,29,32],opchar:17,open:[16,29,35,39,40,42,44],openbsd:37,openssl:[2,3,4,19,29,30,31,35,44],oper:[13,21,28,35,37,42,43],opped:[10,42,48],opping:[0,4],oppos:42,ops:[10,32,42,48],optim:[6,21],optino:38,option:[1,3,4,7,10,15,16,19,21,29,30,35,44,47],order:[4,14,28,32,35,41,42,44,46],ordinari:[42,44],org:[2,4,5,6,25,28,30,31,34,35,42],origin:[1,21,30,40,42],oss:16,other:[0,1,4,6,9,10,14,15,16,17,18,19,21,22,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48],otherdir:3,otherwis:[3,4,12,15,28,32,33,34,35,37,41,42,44,46],our:[30,34,42],ousterhout:1,out:[0,3,4,23,25,28,29,30,34,35,39,41,42,44],outform:29,outgo:[35,42,45],output:[2,3,27,29,31,41,43,45,46],outsid:[19,31,35],over:[15,21,24,27,28,30,35,37,42,44,45,47],overal:32,overhead:7,overrid:[22,37,44],overridden:17,overwrit:[16,30,42],overwritten:[5,35,42],own:[1,7,15,16,21,22,28,29,30,31,38,42,44,45,47],owner:[4,10,30,35,39,42,48],p_tcl_hash_list:27,packag:[1,3,4,30,31],pad:42,page:[30,40],pai:[5,32,42],pain:[23,30],pair:[29,31,32,42,44,46],paragraph:3,paramet:42,paranoid:[22,35],pars:42,part:[0,4,21,24,28,35,36,42,44,45,47],parti:[2,5,12,30,34,35,36,42,44,48],particular:[5,29,35],partproc:42,partylin:[2,4,6,12,30,31,32,34,35,37,41,42,44,45,46,47,48],pass:[28,29,30,32,37,39,41,46],passiv:34,passthru:35,password:[5,6,9,17,19,21,22,29,30,34,35,36,39,41,44,47],past:[1,4,27,35],patch:[2,37,42],path:[2,3,15,16,30,31,42,44],pathnam:42,patient:15,pbk:41,pbkdf2:[2,5,6,41],peer:[21,35,44],pem:[29,35],penalti:21,pend:[6,10],peopl:[4,10,15,16,17,18,21,22,28,30,35,36,39,42,43,48],per:[17,42,46],percent:43,perfect:32,perform:[0,3,4,5,10,30,42,48],perhap:30,period:[6,14,30,42],perm:35,perman:[10,33,35,42],permiss:[4,35,41],permit:42,perorm:2,persist:30,person:[4,28,30,35,42],phew:30,phrase:42,physic:34,pick:42,pictur:5,pid:[30,35,42],pidfil:35,piec:[3,28],ping:13,pipe:34,pl1:42,place:[1,3,5,7,10,15,17,28,30,33,35,42,44,47],plain:[29,35,44],plaintext:[29,42,44],plan:[4,28,42],platform:[0,4,24,42,47],pleas:[4,5,6,7,9,10,16,19,21,31,35,38,42],plu:[10,21,35,42,44],pmsg:28,point:[3,6,21,26,30,34,35,42],pointer:[1,3,4,36,43],popul:46,popular:[0,4,5,30,35],port:[1,5,14,16,21,22,29,30,31,34,35,37,44],portabl:42,portion:[3,7,10,42],portrang:35,posit:[27,35],posix:42,possibl:[3,10,13,15,21,29,31,35,37,38,39,42,44,46],potenti:[5,16,28,42,46],pour:40,power:[4,36],practic:[41,42],pre:[42,44],preced:[30,42,44],prefer:[35,37,44],prefix:[5,17,21,28,31,35,39,44,46,47],preinit:42,prematur:30,prepar:34,prepend:35,prerehash:42,prerequisit:2,prerestart:42,prerout:16,present:[2,6,28,29,32,37,42,46,47],preserv:30,pretend:47,pretendnet:31,pretti:[0,39],preval:29,prevent:[0,4,10,17,18,24,30,34,37,42,47],previou:[1,3,4,5,19,30,42,47],previous:[5,30,42],primari:[21,35],prime256v1:29,prime:35,printf:27,prior:[3,29,30,32,41,44],prioriti:42,privat:[18,22,28,29,30,31,35,39,42,44],privatekei:[29,31,35,44],privileg:[0,4,16,48],privmsg:[10,28,29,42],probabl:[4,21,29,30,31,42],problem:[30,35,37],proc:[21,27,28,46],proce:42,procedur:[2,22,32,46,48],process:[0,3,4,5,11,15,16,23,29,30,34,41,42,44],procnam:[28,42,46],produc:[35,42],program:[0,2,4,16,29,30],progress:15,prohibit:35,project:[2,40,47],prompt:[3,4,32],promptli:30,proper:[3,37,42],properli:[5,30,31,34,35],protect:[0,2,3,4,10,19,21,29,30,33,35,41,42,44,48],protectfriend:10,protecthalfop:10,protectop:10,protocol:[31,35,38,42,44],prove:30,provid:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,20,21,22,23,24,27,29,30,35,37,38,40,42,44,46,47],pseudo:42,pub:[4,5,21,29,32,42],pubkei:29,publicli:25,publish:35,pubm:[21,42],pull:[4,40,41],punish:[10,42,48],purpos:[0,1,6,25,26,34,35,42],push:[40,42],put:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,30,35,42,44],putlog:[21,27,28],putquick:21,putserv:[10,28,29],putti:29,pwd:[6,30],quakenet:[4,21],qualifi:35,quann:[6,20],queri:[14,16,32,37],question:[4,29],queu:[15,21,42],queue:[21,27],quick:[2,27,30,35],quicker:30,quickli:[2,35],quiet:[21,35,48],quit:[4,6,21,30,35,42],quot:[42,46],quota:35,raid:[24,47],rais:[10,21],ram:35,rand_max:42,random:[10,21,34,42],rang:[30,35],rate:21,rather:[5,42,44],raw:[32,35,44],rawt:42,rcvd:42,reach:[17,21,35],react:[28,32],read:[0,2,3,4,6,7,16,27,28,29,30,31,35,42,43,47],readabl:42,readm:[2,3],readonli:27,real:[21,27,42],realli:[28,30,35,45],realnam:[21,42],reason:[4,27,29,30,34,35],reboot:[16,29],receiv:[14,15,21,23,29,34,42,46],recent:[4,30,42,44],recev:[],recipi:42,recogn:[17,21,29,48],recom:[],recommend:[4,5,10,23,27,30,41,42,45,46],recompil:[17,30],reconnect:[22,42],record:[2,22,27,32,36,48],redirect:16,reduc:[27,46],refer:[27,28,31,35,42],refin:28,reflect:[5,42],refresh:[42,46],regardless:42,regist:[2,10,29],regular:[10,42,44],regularli:36,rehash:[7,27,28,35],reiniti:42,reject:[21,34,35],rejn:42,rejoin:[30,42],rel:[14,27,30,42],relai:[0,4,34,35],relat:[1,6,10,28,37,42],releas:[0,1,30,41,42],relev:[4,27,30],reli:42,reliabl:[32,42,46],relink:34,relinquish:42,rem_builtin:27,rem_tcl_command:27,rem_tcl_int:27,rem_tcl_str:27,remain:[10,33,42],remaind:[15,46],rememb:[10,28,29,30],remind:35,remot:[15,34,35,42,43],remotebotnam:42,remov:[5,10,15,19,27,29,30,33,36,37,41,45,46,47],renam:[2,15,27,30,35,42],render:[5,24,47],repeat:[4,32,42],replac:[10,21,27,29,35,42,43,47],repli:[6,13,14,16,17,32,35,42],replic:[46,47],repo:40,report:[6,15,25,27,30,45],repositori:[4,30],repres:[42,46],req:[29,35,44],request:[0,4,5,7,10,13,15,17,21,30,32,33,35,37,38,40,42,44,45,47],requir:[2,4,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,35,41,44,46],reread:42,resend:[14,42],reserv:[30,35,39],reset:42,resolut:35,resolv:[6,14,35,42],resourc:27,respect:[14,37,42,43],respond:[10,30,42],respons:[21,32,42],rest:[3,27,34,35,41,42,46],restart:[2,3,4,5,7,28,30,35],restrict:[1,15,16,21,35,42,43,47],result:[21,32,33,35,37,42],resum:42,resync:22,retain:42,retri:23,retriev:[6,18],retrydelai:14,reus:[5,42],reveng:10,revengebot:10,revers:[41,42],revert:42,review:[29,31],revis:[0,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,35,37,38,39,42,43,44,45,46,48],revok:[21,35],rfc1459:[38,42],rfc2812:38,rfc:[17,21,24,42,47],rfc_compliant:42,rich:[0,4,30],right:[6,15,16,26,28,30,42],rijndael:19,risk:[1,21],rizon:21,rmdir:6,rmst:46,robei:[1,3,4,36,43,48],robot:36,roomsstat:24,roomstat:[24,47],root:[15,16],round:[19,41],rout:[16,42],routin:[17,35,42],rsa:35,rule:30,run:[2,3,4,5,7,10,16,21,27,28,29,30,31,32,34,35,41,43,44,46],s_client:44,safe:[19,29,30,31,41,47],sai:[4,10,15,28,31,34,42],said:[28,34,42],sake:47,salt:[28,41],same:[0,3,4,5,7,10,11,16,17,27,28,30,32,34,35,38,41,42,43,44,45,46],sampl:[10,30,47],sane:21,sanitycheck:35,sasl:[2,30,36,38],save:[5,6,10,11,12,22,34,35,36,41],scan:30,scenario:[31,32,34],schat:[35,44],schedul:42,scheme:1,scope:31,screen:[4,40,43],script:[0,2,3,4,7,10,21,29,30,33,36,37,42,45,46,47,48],scripter:34,sdcc:44,sdebug:3,seamless:41,seamlessli:19,search:[27,29,42],sec:35,second:[4,10,13,14,17,21,23,27,28,35,45],secondli:42,secret:10,section:[5,10,17,21,24,28,30,34,35,42,47],secur:[0,2,4,6,9,19,29,30,34,35,36,41,42],see:[0,2,3,4,5,6,10,15,17,21,24,25,27,28,29,30,31,32,34,35,37,39,40,41,42,43,46],seen:[2,6,10,32,35,42],selecet:42,select:[4,30,35,36,40,42],self:[2,21,31,35,44],send:[4,6,11,15,17,18,21,22,23,27,28,30,32,34,37,42,45,46],sender:42,sens:[0,4],sensit:41,sent:[6,15,17,22,25,29,32,35,38,39,42,44,46,48],separ:[3,7,21,30,34,35,36,37,38,42,45,46],septemb:14,seri:[30,42,44],serv:35,server:[2,5,6,7,10,13,14,15,16,17,19,24,25,27,29,30,35,36,37,38,44,45,46,47],serverlist:42,serverop:10,serverror:21,servic:[6,10,16,24,29,32,42,44,47],servivc:42,session:[4,37,38],set:[0,1,2,3,5,6,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,31,32,33,34,36,38,39,41,43,45,46,47,48],setcap:16,setnam:[36,38],setup:[4,6,7,30,35],seven:[10,42],sever:[0,4,13,27,30,31,38,42,45],sexystuff:28,sha1:44,sha1sum:29,sha256:19,shall:35,share:[0,2,4,6,10,11,23,27,35,36,42],sharebot:[34,35,42],sharefail:23,she:42,shell:[0,3,4,16,29,30,35,42],shorter:10,should:[1,3,4,5,10,12,13,14,15,17,19,21,22,24,27,28,29,30,34,35,37,39,41,42,44,46,47],shouldn:16,show:[4,6,10,15,25,28,34,35,42],shown:[15,30,35],shutdown:42,shutdownreason:42,side:[35,42,44,47],sidenot:31,sighup:42,sigil:42,sigkil:42,sign:[21,29,31,35,42,43,44,47],signal:42,signific:[4,6],significantli:[32,46],signoff:42,sigquit:42,sigterm:42,silent:35,simialar:[],similar:[4,10,29,30,35,39,40,42,45],similarli:46,simpl:[4,27,28,29,30,42],simpli:[4,5,29,30,31,38,42,47],simplifi:42,simul:[35,42],simultan:[15,23,42],sinc:[0,3,5,17,30,34,35,36,37,42,44,45],singl:[16,17,29,42,46],sit:[0,4,10,35,41],site:[6,48],situat:[32,34],six:42,size:[15,23,27,35,42],skim:4,skip:[30,42],slash:[30,39],slave:34,slennox:30,slow:[15,30,35],slower:35,small:[3,23,34,45],smaller:3,smile:3,snapshot:[2,30],snowbot:15,snt:29,sock:[27,35],socket:[16,27,31,42,44],softwar:[0,1,2,4],solut:41,some:[0,4,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,30,32,33,34,35,36,37,38,42,44,45,47,48],someircnetwork:35,someon:[4,10,17,28,30,31,42,46],someth:[4,28,30,40,42,47],sometim:[4,21,30],somewher:[3,35],song:42,soon:[10,42],sort:[0,4,33],sound:28,sourc:[1,3,4,5,6,7,27,28,31,35,40,42,44,45],space:[0,23,35,38,42],spawn:0,spec:32,special:[34,42],specif:[6,10,14,16,17,19,21,24,30,34,37,38,42,44,46,47,48],specifi:[10,14,15,16,18,21,22,27,29,30,33,35,36,37,41,42,44,46],spectrum:[24,47],spent:[30,42],split:[10,17,37,39,42,43],splt:42,spoiler:47,spoken:42,spoof:16,spread:35,squar:37,squelch:21,src:[3,7,17,27],ssh:30,ssl:[2,3,4,5,21,29,30,31,36,42],sslcert:[3,31,35,44],sslinc:44,ssllib:44,sslport:44,sslsilent:[3,44],sssss:[],stabil:23,stabl:[2,4,30],stack:[17,37,42],stackabl:[],stage:27,stai:42,stall:42,stand:[0,4,30],standard:[14,16,17,23,27,28,38,42,44,47,48],start:[2,3,4,5,6,9,16,19,21,26,28,29,34,35,38,39,41,42,43,46,47],starttl:44,startup:[2,41,42],stat:6,state:[4,42],statement:42,statist:[6,15,25],statu:[0,2,4,10,24,27,31,35,45,46,47],status:32,statuslog:10,stb:21,stdio:27,stdlib:27,stdout:27,stealth:[30,35],step:[2,3,5,27,30,47],stick:33,sticki:[33,42],still:[1,4,5,10,15,22,30,31,32,35,36,42,47],stone:21,stop:[0,10,15,17,27,42,46],stopnethack:[10,48],storag:[6,12,41],store:[5,6,10,12,15,18,24,25,28,30,32,34,41,42,46,47],str_dir:27,str_protect:27,stream:[24,47],street:1,strftime:35,string:[2,17,27,28,29,35,41,46,47],strong:35,strongli:[2,4,30],stuff:[2,4,27,28,30,35,42],style:[33,42],sub:[15,42],subdirectori:[15,42],subject:44,sublist:42,submit:[2,42],subscrib:[46,47],subsequ:42,substitut:[2,35],succeed:42,success:[27,30,42],successfulli:[4,27,42,46],sudo:[16,30],suffic:28,suffici:31,suffix:[7,35],suggest:[5,27],suit:[16,30],suitabl:46,sum:28,summar:21,sun:35,sundai:42,supplant:42,supplementari:32,suppli:35,support:[0,2,3,4,5,6,8,10,11,14,16,17,18,21,22,23,29,30,31,33,35,36,42,45,47],sure:[4,10,27,28,30,31,34,35,42,47],symbol:[31,42],synchron:44,syntax:[5,29,35,44,48],sys:27,system:[2,3,7,14,15,16,27,29,30,35,36,37,42,43,44],tab:27,tabl:[27,38,42],tag:[15,36,38,46],tail:29,take:[3,4,5,6,15,19,21,25,28,30,35,41,42,44],taken:[27,42],takeov:17,talk:[28,31,32,36,39],talli:27,tar:[4,7,30],tarbal:[0,30],target:46,task:[0,2,4,34],tcl:[0,1,2,3,4,6,10,11,21,27,28,30,33,35,36,37,44,45,47],tcl_cmd:27,tcl_int:27,tcl_string:27,tclsh:4,tcltk:4,tcp:[2,16,37],team:[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],technic:47,techniqu:45,tell:[15,28,29,30,31,32,34,35,42,47],telnet:[2,29,30,34,36,37,39,41,42,43,44],temp:42,templat:40,temporari:[10,23,25,33,35],ten:29,term:[2,28,31,42],termin:[4,5,42],test:[28,30,48],text:[4,10,21,27,29,35,43,44,45,46,48],textfil:2,than:[4,10,13,15,17,30,31,35,41,42,44],thank:4,thee:42,thei:[0,3,4,5,7,10,12,13,17,18,21,22,27,28,29,30,31,32,33,34,35,41,42,44,46],them:[0,1,3,4,5,7,10,12,13,14,15,17,18,21,22,23,27,28,29,30,31,34,35,36,37,38,41,42,45,47,48],themselv:[17,30,34,42,45],therebi:[45,47],therefor:[6,17,30,35,42],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,40,41,42,43,44,45,46,47,48],thing:[3,4,6,24,26,27,28,29,34,35,42,47],think:[40,48],third:[28,34],thorough:[27,29,31,47],those:[1,3,7,11,15,21,27,28,29,30,42,45,46,47],though:[15,21,28,30,42,44],thr:35,three:[21,29,32,33,34,35,42],through:[4,10,15,21,24,28,31,36,37,38,39,42,47,48],throughout:27,thse:[],thu:[16,28,32,37,41,42],tidi:27,ties:42,till:[],time:[0,3,4,10,14,15,16,17,19,22,23,28,29,30,31,32,33,34,35,36,38,39,41,43,44,45,47],timeout:[6,14,21,23,35,46],timestamp:[35,42],timezon:35,tip:[2,42],titl:48,tiwtch:6,tls:[42,44],tmi:46,tmp:[23,42],toctre:[],todai:42,togeth:[0,2,4,21,28,34,35,36,38,42],token:47,told:28,ton:24,too:[15,17,21,23,27,35,42],tool:[3,30],top:[3,4,28,40,42],topc:42,topic:47,total:[10,27,36,42],tout:42,toward:28,trace:21,track:[2,3,15,24,27,29,42,47],tradit:[24,37,45,46,47],tradition:16,traffic:[3,35,45],trail:27,transfer:[2,6,7,11,15,22,30,34,35,37,42,44,48],transit:[19,41,42],transmit:21,transpar:35,transport:31,treat:[42,47],tree:[0,4,30],tri:[27,35,42],trick:[28,45],trigger:[10,21,27,28,32,42,46],troubl:[14,35],troubleshoot:[4,30],truncat:46,trust:[4,35,48],ttl:14,turbo:[23,30],turn:[10,16,21,35,42],tutori:[2,31],twcmd:[24,47],twice:42,twitch:[2,6,36],twith:46,two:[4,6,17,22,28,30,32,33,34,35,41,42,44,45],type:[3,4,6,7,10,12,17,21,24,27,28,29,30,31,32,33,34,35,36,37,38,39,44],typic:[15,24,35,36,39,42,47],typo:42,ubuntu:31,ufl:42,ugli:15,uglyman:15,uhost:[28,42],uid:[35,44],umod:21,unabl:[17,30,34,37,42,47],unaccess:36,unavail:[21,35],unban:[10,35,42],unbind:[17,35,45,46],uncertainti:46,uncom:[29,31,35,41],under:[0,4,30,36,42],underli:42,underlin:[42,43],undernet:[4,17,21,42],understand:[35,42],understood:21,unexpect:42,unhid:6,unimport:35,unintend:46,uniqu:[35,42,46],univers:35,unix:[0,3,15,16,30,36],unknown:42,unld:42,unless:[17,21,28,30,33,35,42],unlik:[3,36],unlimit:34,unlink:[23,35],unload:[27,42],unoffici:37,unpack:0,unreach:34,unrealircd:[17,42],unreli:[24,46,47],unrest:0,unset:42,unshar:[6,48],unstick:33,unsticki:33,unstuck:42,unsur:30,untar:5,until:[7,10,15,33,35,42],unzip:[5,30],updat:[4,5,19,27,30,32,35,36,41,42,46],upgrad:[2,41,44],uplink:42,upload:[15,30,36,42,45],upon:[0,4,46,48],upper:14,uptim:[2,6],url:[35,42],usa:1,usabl:[6,15,35],usag:[2,4,6,27,35,42],use:[0,1,3,4,5,6,7,9,10,12,13,14,15,16,17,19,21,22,23,27,28,29,30,31,33,34,35,37,39,41,42,43,44,45,46,47,48],used:[0,2,4,10,11,13,15,19,21,27,28,29,30,31,33,34,35,36,37,39,41,42,43,44,45,46,47,48],useful:[1,4,10,23,30,34,42,44,45],useless:[5,24,47],user:[0,2,3,4,5,6,7,9,10,11,12,13,16,17,18,19,20,21,22,23,24,27,28,30,31,32,33,35,36,37,39,40,41,43,44,45,46,47],userban:10,userexempt:10,userfil:[0,2,4,5,6,9,10,11,19,22,23,27,29,30,34,35,41,42,45],userflag:17,userhost:46,userinfo1:35,userinfo:[13,42],userinvit:10,userlist:[6,17,20,22],usernam:[16,29,30,35,46,47],usernotic:[24,46],userst:[24,47],uses:[3,6,17,21,23,27,28,29,30,31,33,35,41,42,44,47,48],using:[1,3,4,6,7,9,10,15,16,17,19,21,27,28,29,30,33,34,35,37,41,42,44,45,46,47],usrntc:46,usst:46,usual:[4,29,30,31,33,37,40,41,42,44,47],utc:35,util:3,utim:28,vagu:30,vali:42,valiant:[0,4],valid:[3,10,21,27,34,35,36,42,44],valis0:42,valu:[10,13,14,17,21,24,27,28,35,41,43,44,46,47],vari:[42,48],variabl:[2,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,32,35,37,43,46],variable_nam:27,varieti:[0,4],variou:[1,27,30,33,35,42],verbos:42,veri:[4,6,16,20,21,28,35],verif:[21,35,44],verifi:[21,29,35,44],version:[0,1,2,3,4,5,13,17,25,27,28,37,38,43,44,46],vertic:42,vhost4:[30,35,37],vhost6:[30,35,37],vhost:[30,35,37],via:[2,3,4,6,11,16,17,20,22,27,28,29,30,32,33,34,35,36,37,38,39,41,43,44,46,47],video:42,view:[5,7,19,29,30,36,42,46],viewer:46,vim:30,vip:[46,47],virtual:35,visibl:42,visit:[5,47],vista:37,voic:[0,2,4,10,29,42,48],wai:[1,3,4,16,21,24,27,28,29,30,31,32,33,34,35,39,41,42,44,47],wait:[6,14,15,17,21,23,30,32,35,42],walk:31,wall:42,wallop:[35,42],want:[0,3,4,6,10,12,14,15,17,18,21,23,27,28,29,30,34,35,37,42,44,45],war:0,warm:40,warn:[4,16,28,42],warranti:1,washalfop:48,wasn:42,wasop:[10,17,48],wasoptest:10,watch:[39,46],web:[2,6,24,35,46],webpag:2,websit:30,week:42,weekdai:42,welcom:28,well:[1,24,28,29,30,31,32,35,41,42,44,47],were:[1,16,17,30,33,34,35,37,41,42,47],west:35,wget:30,what:[0,1,2,5,6,10,15,17,21,25,28,29,30,35,38,39,41,42],whatev:[1,3,28,35,36,42,43],when:[3,4,6,7,9,10,12,15,16,17,21,22,27,28,29,30,32,33,35,37,39,41,42,44,46,47],whenev:[21,27,32,34,42,44],where:[4,6,10,14,15,18,21,27,28,29,30,31,32,35,36,41,42,44,46],wherea:42,wherev:37,whether:[35,37,42],whew:28,which:[3,5,6,10,12,14,15,16,21,22,27,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],whichev:33,whisper:[24,46],whitespac:42,who:[10,15,17,21,28,30,32,35,39,42,48],whoi:[29,35],whole:27,whose:[33,42],whox:[36,42],why:[28,30,42],wide:[39,44],width:43,wild:42,wildcard:[10,28,29,42,46],window:[2,29,37],wise:[4,35],wish:[3,5,7,16,17,25,27,30,33,34,35,42,46],within:[6,15,27,30,31,33,35,38,42],without:[0,2,4,5,6,9,10,13,19,27,28,29,30,31,34,35,36,38,41,42,44],wizard:31,won:[6,10,22,27,28,30,33,34,35,42,44,46],woobi:[2,3,6,27],word:[15,17,29,30,42,46,47],work:[3,5,6,10,13,15,19,20,22,27,28,29,30,33,34,35,37,38,40,41,42,44,45,46],workaround:[24,32],world:[0,2,4,31,35],worri:24,worth:3,would:[4,5,13,28,29,30,31,32,34,35,42,43,44,46,47],wouldn:35,write:[1,2,6,7,26,30,35,41,42,47],written:[0,27,30,42,47],wrote:28,wspm:46,wspr:46,wth:[],www:[2,4,6,20],x509:[29,35,44],xfer:[23,48],xtra:42,xvf:30,xxd:29,year:[0,4,30,35,42],yes:[28,31,42],yesterdai:35,yet:[4,21,30,35,42],yoru:29,you:[0,1,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,35,36,37,39,40,41,42,43,44,45,46,47,48],you_want_to_export:27,your:[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,34,35,36,37,39,40,41,42,44,47],yourbot:45,yourbranchnam:40,yourconfig:3,youreggdrop:29,youreggdropconfignameher:29,yourself:[7,29,30,40,41,44],yourusernam:40,yyyymmdd:35,zero:42,zip:30,zomg:[],zxvf:30},titles:["About Eggdrop","Boring legal stuff","Eggdrop, an open source IRC bot","Installing Eggdrop","README","Upgrading Eggdrop","Modules included with Eggdrop","Eggdrop Module Information","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","Writing an Eggdrop Module","Writing an Eggdrop Script","Common First Steps","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"],titleterms:{"default":45,"function":[27,47],"int":42,"new":42,"return":42,"short":30,"static":7,"super":30,Adding:34,DNS:14,TLS:[31,44],The:[30,39],Using:[32,34],about:[0,37,38,44],account2nick:42,account:[32,42],accounttrack:42,add:[29,42],addbot:42,addchanrec:42,addit:[27,31],address:42,addus:42,advanc:[35,45],api:24,arg1:42,arg2:42,arg:[42,46],argn:42,assign:29,assoc:[8,42],authent:[29,44],automat:29,background:41,backup:42,ban:[33,42],banlist:42,banmask:42,base64:42,basic:35,best:32,bind:[42,46],block:42,blowfish:9,boot:42,bore:1,bot:[2,15,34,42],botattr:42,botflag:34,botishalfop:42,botisop:42,botisvoic:42,botlist:42,botnam:42,botnet:[5,31,34,35,44],botnick:42,botonchan:42,botport:42,bottre:34,callev:42,can:[2,7],cancel:15,cap:[38,42],capabl:[32,38],certif:44,chan:[42,46],chanban:42,chandname2nam:42,chanexempt:42,chanflag:42,chang:[5,42],chaninvit:42,chanlist:42,channame2dnam:42,channel:[10,15,29,42,46],chansettyp:42,charact:42,chat4:37,chat6:37,chat:37,chattr:42,check:32,chhandl:42,clear:15,clearqueu:42,cmd:46,command:[4,5,24,42,45,46],comment:42,common:29,commun:31,compil:7,compress:[11,42],compressfil:42,config:[5,15,30,42,45,47],configur:[29,30,31,41],configurearg:42,connect:[31,42],consol:[12,35,42],control:42,core:35,count:42,countus:42,creator:42,crontab:4,ctcp:[13,37],ctime:42,cygwin:3,dcc:[35,42,44],dccbroadcast:42,dccdumpfil:42,dcclist:42,dccputchan:42,dccsend:42,dccsimul:42,dccuse:42,decrypt:42,delchanrec:42,delhost:42,deludef:42,delus:42,desc:[15,42],descript:15,dest:15,destin:42,determin:32,develop:4,die:42,dir:[15,42],directori:[15,35,42],disclaim:47,dname:42,dnslookup:42,docker:4,document:[4,5],download:30,dst:15,dumpfil:42,durat:42,dynam:7,echo:42,edit:[30,47],effort:32,eggdrop:[0,2,3,4,5,6,7,27,28,29,30,31,32,35,36,40,42,46],enabl:[31,32,41,42],encpass:42,encrypt:[41,42],entri:42,erasenot:42,event:42,exampl:34,execut:35,exempt:[33,42],exemptlist:42,exemptmask:42,extend:32,extra:42,featur:36,file:[5,15,30,31,35,42,45,47],filemask:15,filenam:[15,42],filepath:15,fileresend:42,filesend:42,filesi:[15,42],filestat:15,find:2,findus:42,first:29,flag:[15,29,34,42,46,48],flushmod:42,formatstr:42,from:42,ftp:4,gener:31,get:[2,4,15,30,42],getaccount:42,getchan:42,getchanhost:42,getchanidl:42,getchaninfo:42,getchanjoin:42,getchanmod:42,getdccawai:42,getdccidl:42,getdesc:42,getdir:42,getfil:42,getfileq:42,getfilesendtim:42,getflag:42,getlink:42,getown:42,getpwd:42,getudef:42,getus:42,git:4,github:40,global:42,hand2idx:42,hand2nick:42,handl:42,handlen:42,handonchan:42,haschanrec:42,hash:41,help:[2,4],helpfil:42,hide:15,histori:30,host:[29,42],hostmask:42,hostnam:42,how:[2,4,5,7],hybrid:41,ident:16,idx2hand:42,idx:42,ignorelist:42,includ:6,info:42,inform:[7,31],instal:[2,3,7,30,37,44],interfac:41,invit:[33,42],invitelist:42,invitemask:42,ipv6:37,irc:[2,17,31,44,47],ircnick:42,ircv3:38,isawai:42,isban:42,isbansticki:42,isbotnick:42,ischanban:42,ischanexempt:42,ischaninvit:42,ischanjup:42,iscompress:42,isdynam:42,isexempt:42,isexemptsticki:42,ishalfop:42,isidentifi:42,isignor:42,isinvit:42,isinvitesticki:42,isircbot:42,isjup:42,islink:42,ismod:46,isop:42,ispermban:42,ispermexempt:42,isperminvit:42,isset:42,istl:42,isupport:42,isvip:46,isvoic:42,join:[29,32],jump:42,keep:45,kei:[31,42,44],keyword:42,killassoc:42,killban:42,killchanban:42,killchanexempt:42,killchaninvit:42,killdcc:42,killexempt:42,killignor:42,killinvit:42,killtim:42,killutim:42,languag:42,lastbind:42,legal:1,level:42,lifetim:42,limit:[24,42,47],line:[4,39],link:[34,42],list:42,listen:[31,42],listnot:42,loadchannel:42,loadhelp:42,loadmodul:[7,42],localfil:15,locat:30,log:[29,35,45],logfil:42,make:34,manipul:42,mask:42,maskhost:42,masktyp:42,match:42,matchaddr:42,matchattr:42,matchban:42,matchcidr:42,matchexempt:42,matchinvit:42,matchstr:42,md5:42,messag:42,minut:42,miscellan:42,mkdir:[15,42],mode:42,modifi:45,modul:[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,35,42],modular:45,module_clos:27,module_expmem:27,module_report:27,module_start:27,module_t:27,monitor:42,more:2,msg:42,must:5,myip:42,name:42,need:7,newban:42,newchanban:42,newchanexempt:42,newchaninvit:42,newexempt:42,newignor:42,newinvit:42,newnam:42,nick2hand:42,nick:[42,46],nicknam:[15,42],nickserv:29,note:[18,42],notic:4,notifi:32,numberlist:42,numvers:42,obtain:4,old:42,oldnam:42,onchan:42,onchansplit:42,onelin:42,onlin:42,open:2,optim:15,option:42,output:42,own:[],parti:39,partylin:[15,24,29],pass:42,passwdok:42,password:42,patch:40,path:35,pattern:42,pbkdf2:19,pend:15,permiss:29,port:42,pre:[2,4,31],prefix:42,prepar:31,prerequisit:30,proc:42,procedur:42,protect:31,pushmod:42,putallbot:42,putbot:42,putcmdlog:42,putdcc:42,puthelp:42,putkick:42,putlog:42,putloglev:42,putnow:42,putquick:42,putserv:42,putxferlog:42,pwd:15,queue:42,queuesiz:42,quick:[3,4],quit:15,rand:42,raw:42,read:5,readm:4,reason:42,record:[34,42],refreshchan:42,regist:47,rehash:42,reload:42,reloadhelp:42,remov:42,renam:45,renudef:42,req:42,requir:[3,27,32,42],requisit:[2,4,31],resetban:42,resetchan:42,resetchanidl:42,resetchanjoin:42,resetconsol:42,resetexempt:42,resetinvit:42,restart:[29,42],rfcequal:42,rmdir:[15,42],roomstat:46,sasl:29,save:42,savechannel:42,script:[5,28,32,35,44],second:42,secur:[31,44],seen:20,self:45,sendnot:42,server:[21,31,32,42],serveraddress:42,set:[4,29,30,35,37,42,44],setchan:42,setchaninfo:42,setdccawai:42,setdesc:42,setflag:42,setlink:42,setown:42,setpwd:42,setudef:42,setup:15,setus:42,share:[15,22,34],show:30,snapshot:4,socklist:42,solo:41,some:2,sourc:[2,15,30],src:42,ssl:[35,44],stackabl:42,start:30,starttl:42,startup:[3,4],stat:15,statu:[32,42],step:29,stickban:42,stickexempt:42,stickinvit:42,still:7,storenot:42,str:42,strftime:42,string1:42,string2:42,string:[42,45],strip:42,stripcod:42,stuff:1,submit:40,substitut:43,support:[32,37,38,44],system:4,tag:[32,42],tagmsg:42,target:42,tcl:[5,24,32,41,42,46],tcp:42,telnet:35,term:34,text:42,textfil:43,thing:2,time:42,timer:42,timerid:[],timernam:42,tip:45,tlsstatu:42,topic:42,track:32,traffic:42,transfer:23,twcmd:46,twitch:[24,46,47],twitchmod:46,twitchvip:46,type:[42,46],unam:42,unbind:42,uncompressfil:42,unhid:15,unixtim:42,unlink:42,unloadhelp:42,unloadmodul:42,unshar:15,unstickban:42,unstickexempt:42,unstickinvit:42,upgrad:[4,5],uptim:[25,42],usag:[15,37,38,41,44],use:[],user:[15,29,34,42,48],userlist:42,userport:42,userst:46,utim:42,validchan:42,valididx:42,validus:42,valu:42,variabl:[42,45],version:[30,42],via:[40,42],washalfop:42,wasop:42,web:47,what:[4,7,27,34],where:2,whom:42,whox:32,why:[],window:3,without:7,woobi:26,write:[27,28],you:2,your:45}}) \ No newline at end of file diff --git a/doc/html/tutorials/firstscript.html b/doc/html/tutorials/firstscript.html index cb7f27747..7ddc58f93 100644 --- a/doc/html/tutorials/firstscript.html +++ b/doc/html/tutorials/firstscript.html @@ -6,7 +6,7 @@ - Writing an Eggdrop Script — Eggdrop 1.9.3 documentation + Writing an Eggdrop Script — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/tutorials/firststeps.html b/doc/html/tutorials/firststeps.html index 6f5f4bc73..a176fca34 100644 --- a/doc/html/tutorials/firststeps.html +++ b/doc/html/tutorials/firststeps.html @@ -6,7 +6,7 @@ - Common First Steps — Eggdrop 1.9.3 documentation + Common First Steps — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/tutorials/setup.html b/doc/html/tutorials/setup.html index 399d47c2c..d9c1bd41d 100644 --- a/doc/html/tutorials/setup.html +++ b/doc/html/tutorials/setup.html @@ -6,7 +6,7 @@ - Setting Up Eggdrop — Eggdrop 1.9.3 documentation + Setting Up Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/tutorials/tlssetup.html b/doc/html/tutorials/tlssetup.html index 2ed53b411..13f99eab0 100644 --- a/doc/html/tutorials/tlssetup.html +++ b/doc/html/tutorials/tlssetup.html @@ -6,7 +6,7 @@ - Enabling TLS Security on Eggdrop — Eggdrop 1.9.3 documentation + Enabling TLS Security on Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/accounts.html b/doc/html/using/accounts.html index 3ac3b9b4b..635bbd06d 100644 --- a/doc/html/using/accounts.html +++ b/doc/html/using/accounts.html @@ -6,7 +6,7 @@ - Account tracking in Eggdrop — Eggdrop 1.9.3 documentation + Account tracking in Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation @@ -207,7 +207,7 @@

    Using Accounts with Tcl Scripts © Copyright 2022, Eggheads. - Last updated on Sep 18, 2022. + Last updated on Nov 10, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/bans.html b/doc/html/using/bans.html index e3493c8d3..bccb67da2 100644 --- a/doc/html/using/bans.html +++ b/doc/html/using/bans.html @@ -6,7 +6,7 @@ - Bans, Invites, and Exempts — Eggdrop 1.9.3 documentation + Bans, Invites, and Exempts — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/botnet.html b/doc/html/using/botnet.html index 805fb4f0f..9d6abcc86 100644 --- a/doc/html/using/botnet.html +++ b/doc/html/using/botnet.html @@ -6,7 +6,7 @@ - Botnet Sharing and Linking — Eggdrop 1.9.3 documentation + Botnet Sharing and Linking — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation

    Terms

    The following are some common terms used in this document:

    Botnet
    -
    A botnet consists of one or more bots connected together.
    +
    A botnet consists of two or more bots connected together.
    Link
    Link is the term used to describe a bot connecting to another bot.
    Hub
    @@ -428,7 +429,7 @@

    Making bots share user records © Copyright 2022, Eggheads. - Last updated on Jul 12, 2022. + Last updated on Nov 10, 2022. Created using Sphinx 1.8.5.

    diff --git a/doc/html/using/core.html b/doc/html/using/core.html index 186e4c606..9e00c138e 100644 --- a/doc/html/using/core.html +++ b/doc/html/using/core.html @@ -6,7 +6,7 @@ - Eggdrop Core Settings — Eggdrop 1.9.3 documentation + Eggdrop Core Settings — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/features.html b/doc/html/using/features.html index 0186707a8..bd4ac4294 100644 --- a/doc/html/using/features.html +++ b/doc/html/using/features.html @@ -6,7 +6,7 @@ - Eggdrop Features — Eggdrop 1.9.3 documentation + Eggdrop Features — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/ipv6.html b/doc/html/using/ipv6.html index a6d6cf720..2722906a9 100644 --- a/doc/html/using/ipv6.html +++ b/doc/html/using/ipv6.html @@ -6,7 +6,7 @@ - IPv6 support — Eggdrop 1.9.3 documentation + IPv6 support — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation

  • TLS support
  • IRCv3 support
  • +
  • Account tracking in Eggdrop
  • Encryption/Hashing
  • Twitch
  • Advanced Tips
  • @@ -200,7 +201,7 @@

    Settings © Copyright 2022, Eggheads. - Last updated on Jul 12, 2022. + Last updated on Nov 10, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/ircv3.html b/doc/html/using/ircv3.html index 4c17e7f20..aaf08ba28 100644 --- a/doc/html/using/ircv3.html +++ b/doc/html/using/ircv3.html @@ -6,7 +6,7 @@ - IRCv3 support — Eggdrop 1.9.3 documentation + IRCv3 support — Eggdrop 1.9.4 documentation @@ -15,7 +15,7 @@ - + @@ -61,6 +61,7 @@

    Table of Contents

  • Supported CAP capabilities
  • +
  • Account tracking in Eggdrop
  • Encryption/Hashing
  • Twitch
  • Advanced Tips
  • @@ -158,7 +159,7 @@

    Supported CAP capabilities previous | - next diff --git a/doc/html/using/partyline.html b/doc/html/using/partyline.html index 34d6ef5ca..93dc1ec45 100644 --- a/doc/html/using/partyline.html +++ b/doc/html/using/partyline.html @@ -6,7 +6,7 @@ - The Party Line — Eggdrop 1.9.3 documentation + The Party Line — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/patch.html b/doc/html/using/patch.html index b5f9098b9..063847d69 100644 --- a/doc/html/using/patch.html +++ b/doc/html/using/patch.html @@ -6,7 +6,7 @@ - Patching Eggdrop — Eggdrop 1.9.3 documentation + Patching Eggdrop — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

    + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/pbkdf2info.html b/doc/html/using/pbkdf2info.html index 56e29505e..af1b55ee0 100644 --- a/doc/html/using/pbkdf2info.html +++ b/doc/html/using/pbkdf2info.html @@ -6,7 +6,7 @@ - Encryption/Hashing — Eggdrop 1.9.3 documentation + Encryption/Hashing — Eggdrop 1.9.4 documentation @@ -16,7 +16,7 @@ - + - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Flag MaskAction
    +mChecks if the user has the m global flag
    +mnChecks if the user has the m OR n global flag
    |+mnChecks if the user has the m OR n global flag
    |+mn #fooChecks if the user has the m OR n channel flag for #foo
    &+mnChecks if the user has the m AND n global flag
    &mn #fooChecks if the user has the m AND n channel flag for #foo
    |+o #fooChecks if the user has the o channel flag for #foo
    +o|+n #fooChecks if the user has the o global flag OR the n channel flag -for #foo
    +m&+v #fooChecks if the user has the m global flag AND the v channel flag -for #foo
    -mChecks if the user does not have the m global flag
    |-n #fooChecks if the user does not have the n channel flag for #foo
    +m|-n #fooChecks if the user has the global m flag OR does not have a -channel n flag for #foo
    -n&-m #fooChecks if the user does not have the global n flag AND does -not have the channel m flag for #foo
    ||+bChecks if the user has the bot flag b
    -
    -
    @@ -1198,7 +1137,9 @@

    accounttracking

    getaccount <nickname> [channel]

    -
    Returns: the services account name associated with nickname (if Eggdrop is configured to track account status), and “” if they are not logged in or Eggdrop is not able to determine the account status. WARNING: this account list may not be accurate depending on the server and configuration. This command is only accurate 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).
    +

    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]

    @@ -1406,7 +1347,7 @@

    onchansplit <nick> [channel]

    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 matchattr above for additional examples).

    +

    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).

    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

    @@ -2390,10 +2331,8 @@

    timer <minutes> <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 no timer
    -

    Name is specified, Eggdrop will assign a timerName in the format of “timer<integer>”.

    -
    -

    Returns: a 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

    Module: core

    @@ -2915,20 +2854,83 @@

    language

    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.

    -

    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. When the 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.

    +

    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

    +

    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

    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.

    +

    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:

    + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Flag MaskAction
    m, +m, m|*Checks if the user has the m global flag
    +mnChecks if the user has the m OR n global flag
    |+mnChecks if the user has the m OR n channel flag
    |+mn #fooChecks if the user has the m OR n channel flag for #foo
    &+mnChecks if the user has the m AND n channel flag
    &mn #fooChecks if the user has the m AND n channel flag for #foo
    |+o #fooChecks if the user has the o channel flag for #foo
    +o|+n #fooChecks if the user has the o global flag OR the n channel flag +for #foo
    +m&+v #fooChecks if the user has the m global flag AND the v channel flag +for #foo
    -mChecks if the user does not have the m global flag
    |-n #fooChecks if the user does not have the n channel flag for #foo
    +m|-n #fooChecks if the user has the global m flag OR does not have a +channel n flag for #foo
    -n&-m #fooChecks if the user does not have the global n flag AND does +not have the channel m flag for #foo
    ||+bChecks if the user has the bot flag b
    +

    As a side note, Tcl scripts historically have used a ‘-‘ to skip processing of a flag type (Example: -|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a ‘*’ to skip processing, so as not to confuse a single “-” meaning “skip processing” with a preceding “-ov” which means “not these flags”.

    +

    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.

    @@ -3122,10 +3124,10 @@

    Bind Typesnick!ident@host (depending on the keyword); flags are ignored. If the proc returns 1, Eggdrop will not process the line any further (this could cause unexpected behavior in some cases), although RAWT binds are processed before RAW binds (and thus, a RAW bind cannot block a RAWT bind).

    Module: server

      @@ -3464,9 +3466,9 @@

      Bind Typesnick!ident@host (depending on the keyword); flags are ignored. “tag” is a dictionary (flat key/value list) of the message tags with “” for empty values (e.g. “account eggdrop realname LamestBot”). If the proc returns 1, Eggdrop will not process the line any further, to include not being processed by a RAW bind (this could cause unexpected behavior in some cases). As of 1.9.0, it is recommended to use the RAWT bind instead of the RAW bind.

    1. ACCOUNT (stackable)
    2. @@ -3474,7 +3476,8 @@

      Bind Typesnick!user@hostname.com account” where channel is the channel the user was found on when the bind was triggered, the hostmask is the user’s hostmask, and account is the account name the user is logging in to, or “” for logging out. The mask argument can accept wildcards. For the proc, nick is the nickname of the user logging into/out of an account, user is the user@host.com hostmask, hand is the handle of the user (or * if none), and account is the name of the account the user logged in to (or “” if the user logged out of an account).

      +

      Description: this bind will trigger when eggdrop detects a change in the authentication status of a user’s service account. The mask for the bind is in the format “#channel nick!user@hostname.com account” and accepts wildcards. account is either the account name the user is logging in to or “*” if the user is not logged in to an account.

      +

      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 but this bind could be triggered late or never on account changes. Please see doc/ACCOUNTS for additional information.

      1. ISUPPORT (stackable)
      2. @@ -3637,7 +3640,7 @@

        TCP Connections -

        Match Characters

        +

        Match Characters

        Many of the bindings allow match characters in the arguments. Here are the four special characters:

        @@ -3660,6 +3663,10 @@

        Match Characters

        + +
        \*matches a literal *, but please note that Tcl needs escaping as well, +so a bind would have to use “\*” or {*} for a mask argument
        @@ -3693,7 +3700,7 @@

        Match Characters © Copyright 2022, Eggheads. - Last updated on Jul 12, 2022. + Last updated on Nov 10, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/text-sub.html b/doc/html/using/text-sub.html index f043f9d2f..2eb4ed8f4 100644 --- a/doc/html/using/text-sub.html +++ b/doc/html/using/text-sub.html @@ -6,7 +6,7 @@ - Textfile Substitutions — Eggdrop 1.9.3 documentation + Textfile Substitutions — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/tls.html b/doc/html/using/tls.html index dad561e18..09531799b 100644 --- a/doc/html/using/tls.html +++ b/doc/html/using/tls.html @@ -6,7 +6,7 @@ - TLS support — Eggdrop 1.9.3 documentation + TLS support — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/tricks.html b/doc/html/using/tricks.html index bb11aa970..a63929472 100644 --- a/doc/html/using/tricks.html +++ b/doc/html/using/tricks.html @@ -6,7 +6,7 @@ - Advanced Tips — Eggdrop 1.9.3 documentation + Advanced Tips — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/twitch-tcl-commands.html b/doc/html/using/twitch-tcl-commands.html index 45419792b..c973faeb1 100644 --- a/doc/html/using/twitch-tcl-commands.html +++ b/doc/html/using/twitch-tcl-commands.html @@ -6,7 +6,7 @@ - Eggdrop Twitch Tcl Commands — Eggdrop 1.9.3 documentation + Eggdrop Twitch Tcl Commands — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/twitchinfo.html b/doc/html/using/twitchinfo.html index e6fad3dea..76ba167ed 100644 --- a/doc/html/using/twitchinfo.html +++ b/doc/html/using/twitchinfo.html @@ -6,7 +6,7 @@ - Twitch — Eggdrop 1.9.3 documentation + Twitch — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/html/using/users.html b/doc/html/using/users.html index debe28233..174947f73 100644 --- a/doc/html/using/users.html +++ b/doc/html/using/users.html @@ -6,7 +6,7 @@ - Users and Flags — Eggdrop 1.9.3 documentation + Users and Flags — Eggdrop 1.9.4 documentation @@ -24,7 +24,7 @@

        + href="../index.html">Eggdrop 1.9.4 documentation diff --git a/doc/modules/mod.filesys b/doc/modules/mod.filesys index 34290d2b5..49ea3ee1c 100644 --- a/doc/modules/mod.filesys +++ b/doc/modules/mod.filesys @@ -176,7 +176,7 @@ rm [files] ... Cleans up the current directory's database. If you have a large directory with many files you may want to use this command if you experience slow-downs/delays over time. Normally, the db should clean - up itsself though. + up itself though. .unhide diff --git a/doc/modules/mod.irc b/doc/modules/mod.irc index ace9404cb..cff7c251b 100644 --- a/doc/modules/mod.irc +++ b/doc/modules/mod.irc @@ -94,7 +94,7 @@ There are also some variables you can set in your config file: bind msg - myword *msg:hello Many IRCops find bots by seeing if they reply to 'hello' in a msg. - You can change this to another word by un-commenting thse two lines + You can change this to another word by un-commenting these two lines and changing "myword" to the word wish to use instead of'hello'. It must be a single word. diff --git a/doc/tcl-commands.doc b/doc/tcl-commands.doc index bf4d5db3b..8b73f3b70 100644 --- a/doc/tcl-commands.doc +++ b/doc/tcl-commands.doc @@ -7,7 +7,7 @@ of the normal Tcl built-in commands are still there, of course, but you can also use these to manipulate features of the bot. They are listed according to category. -This list is accurate for Eggdrop v1.9.3. Scripts written for v1.3, +This list is accurate for Eggdrop v1.9.4. Scripts written for v1.3, v1.4, 1.6 and 1.8 series of Eggdrop should probably work with a few minor modifications depending on the script. Scripts which were written for v0.9, v1.0, v1.1 or v1.2 will probably not work without @@ -404,44 +404,8 @@ matchattr [channel] Either | or & can be used as a separator between global, channel, and bot flags, but only one separator can be used per flag section. A '+' is used to check if a user has the subsequent flags, and a '-' is used - to check if a user does NOT have the subsequent flags. - - ----------------------------------------------------------------------- - Flag Mask Action - ----------- ----------------------------------------------------------- - +m + Checks if the user has the m global flag - - +mn Checks if the user has the m OR n global flag - - |+mn Checks if the user has the m OR n global flag - - |+mn #foo Checks if the user has the m OR n channel flag for #foo - - &+mn Checks if the user has the m AND n global flag - - &mn #foo Checks if the user has the m AND n channel flag for #foo - - |+o #foo Checks if the user has the o channel flag for #foo - - +o|+n #foo Checks if the user has the o global flag OR the n channel - flag for #foo - - +m&+v #foo Checks if the user has the m global flag AND the v channel - flag for #foo - - -m Checks if the user does not have the m global flag - - |-n #foo Checks if the user does not have the n channel flag for - #foo - - +m|-n #foo Checks if the user has the global m flag OR does not have a - channel n flag for #foo - - -n&-m #foo Checks if the user does not have the global n flag AND does - not have the channel m flag for #foo - - ||+b Checks if the user has the bot flag b - ----------------------------------------------------------------------- + to check if a user does NOT have the subsequent flags. Please see Flag + Masks for additional information on flag usage. Returns: 1 if the specified user has the flags matching the provided mask; 0 otherwise @@ -1223,14 +1187,15 @@ accounttracking getaccount [channel] - Returns: the services account name associated with nickname (if - Eggdrop is configured to track account status), and "" if they are not - logged in or Eggdrop is not able to determine the account status. - WARNING: this account list may not be accurate depending on the server - and configuration. This command is only accurate 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). + 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 [channel] @@ -1455,7 +1420,7 @@ 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 - matchattr above for additional examples). + 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 @@ -2447,10 +2412,9 @@ utimer [count [timerName]] 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 no timer - -Name is specified, Eggdrop will assign a timerName in the format of -"timer". + it will become the unique identifier for the timer. If timerName is + not specified, Eggdrop will assign a timerName in the format of + "timer". Returns: a timerName @@ -2478,7 +2442,7 @@ utimers Module: core -^^^^^^^^^^^^^^^^^^^ killtimer ^^^^^^^^^^^^^^^^^^^ +killtimer Description: removes the timerName minutely timer from the timer list. @@ -2486,7 +2450,7 @@ utimers Module: core -^^^^^^^^^^^^^^^^^^^^ killutimer ^^^^^^^^^^^^^^^^^^^^ +killutimer Description: removes the timerName secondly timer from the timer list. @@ -2994,21 +2958,98 @@ 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. +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 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. When the 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. +example, you can bind the same command to multiple procs. + +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. + +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 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: + + ----------------------------------------------------------------------- + Flag Mask Action + ----------- ----------------------------------------------------------- + m, +m, m|* Checks if the user has the m global flag + + +mn Checks if the user has the m OR n global flag + + |+mn Checks if the user has the m OR n channel flag + + |+mn #foo Checks if the user has the m OR n channel flag for #foo + + &+mn Checks if the user has the m AND n channel flag + + &mn #foo Checks if the user has the m AND n channel flag for #foo + + |+o #foo Checks if the user has the o channel flag for #foo + + +o|+n #foo Checks if the user has the o global flag OR the n channel + flag for #foo + + +m&+v #foo Checks if the user has the m global flag AND the v channel + flag for #foo + + -m Checks if the user does not have the m global flag + + |-n #foo Checks if the user does not have the n channel flag for + #foo + + +m|-n #foo Checks if the user has the global m flag OR does not have a + channel n flag for #foo + + -n&-m #foo Checks if the user does not have the global n flag AND does + not have the channel m flag for #foo + + ||+b Checks if the user has the bot flag b + ----------------------------------------------------------------------- + +As a side note, Tcl scripts historically have used a '-' to skip +processing of a flag type (Example: -|o). It is unknown where and why +this practice started, but as a style tip, Eggdrop developers recommend +using a '*' to skip processing, so as not to confuse a single "-" +meaning "skip processing" with a preceding "-ov" which means "not these +flags". + Bind Types The following is a list of bind types and how they work. Below each bind @@ -3295,26 +3336,22 @@ the Tcl proc, and an explanation. (17) RAW (stackable) - bind raw + bind raw procname IMPORTANT: While not necessarily deprecated, this bind has been - supplanted by the RAWT bind as of 1.9.0. You probably want to be using - RAWT, not RAW. - - Description: previous versions of Eggdrop required a special compile - option to enable this binding, but it's now standard. The keyword is - either a numeric, like "368", or a keyword, such as "PRIVMSG". "from" - will be the server name or the source user (depending on the keyword); - flags are ignored. The order of the arguments is identical to the - order that the IRC server sends to the bot. The pre-processing only - splits it apart enough to determine the keyword. If the proc returns - 1, Eggdrop will not process the line any further (this could cause - unexpected behavior in some cases), although RAWT binds are processed - before RAW binds (and thus, a RAW bind cannot block a RAWT bind). The - RAW bind does not support the IRCv3 message-tags capability, please - see RAWT for more information. + supplanted by the RAWT bind, which supports the IRCv3 message-tags + capability, as of 1.9.0. You probably want to be using RAWT, not RAW. + + Description: The mask can contain wildcards and is matched against the + keyword, which is either a numeric, like "368", or a keyword, such as + "PRIVMSG". "from" will be the server name or the source + nick!ident@host (depending on the keyword); flags are ignored. If the + proc returns 1, Eggdrop will not process the line any further (this + could cause unexpected behavior in some cases), although RAWT binds + are processed before RAW binds (and thus, a RAW bind cannot block a + RAWT bind). Module: server @@ -3824,22 +3861,21 @@ the Tcl proc, and an explanation. (52) RAWT (stackable) - bind rawt + bind rawt - procname + procname Description: similar to the RAW bind, but allows an extra field for - the IRCv3 message-tags capability. The keyword is either a numeric, - like "368", or a keyword, such as "PRIVMSG" or "TAGMSG". "from" will - be the server name or the source user (depending on the keyword); - flags are ignored. "tag" will be the contents, if any, of the entire - tag message prefixed to the server message in a dict format, such as - "msgid 890157217279768 aaa bbb". The order of the arguments is - identical to the order that the IRC server sends to the bot. If the - proc returns 1, Eggdrop will not process the line any further, to - include not being processed by a RAW bind (this could cause unexpected - behavior in some cases). As of 1.9.0, it is recommended to use the - RAWT bind instead of the RAW bind. + the IRCv3 message-tags capability. The mask can contain wildcards and + is matched against the keyword which is either a numeric, like "368", + or a keyword, such as "PRIVMSG" or "TAGMSG". "from" will be the server + name or the source nick!ident@host (depending on the keyword); flags + are ignored. "tag" is a dictionary (flat key/value list) of the + message tags with "" for empty values (e.g. "account eggdrop realname + LamestBot"). If the proc returns 1, Eggdrop will not process the line + any further, to include not being processed by a RAW bind (this could + cause unexpected behavior in some cases). As of 1.9.0, it is + recommended to use the RAWT bind instead of the RAW bind. (53) ACCOUNT (stackable) @@ -3847,19 +3883,18 @@ the Tcl proc, and an explanation. procname - Description: triggered when Eggdrop detects a change in a service - account status. The change could be initiated by receiving an IRCv3 - ACCOUNT message, receiving IRCv3 extended-join information when a user - on an existing channel joins a new channel, or detecting an IRCv3 - account-tag in a PRIVMSG. The mask for the bind is in the format - "#channel nick!user@hostname.com account" where channel is the channel - the user was found on when the bind was triggered, the hostmask is the - user's hostmask, and account is the account name the user is logging - in to, or "" for logging out. The mask argument can accept wildcards. - For the proc, nick is the nickname of the user logging into/out of an - account, user is the user@host.com hostmask, hand is the handle of the - user (or * if none), and account is the name of the account the user - logged in to (or "" if the user logged out of an account). + Description: this bind will trigger when eggdrop detects a change in + the authentication status of a user's service account. The mask for + the bind is in the format "#channel nick!user@hostname.com account" + and accepts wildcards. account is either the account name the user is + logging in to or "*" if the user is not logged in to an account. + + 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 but this bind + could be triggered late or never on account changes. Please see + doc/ACCOUNTS for additional information. (54) ISUPPORT (stackable) @@ -4090,6 +4125,9 @@ the four special characters: ~ matches 1 or more space characters (can be used for whitespace between words) (This char only works in binds, not in regular matching) + + \* matches a literal *, but please note that Tcl needs escaping as + well, so a bind would have to use "\*" or {*} for a mask argument ----- ----------------------------------------------------------------- Copyright (C) 1999 - 2022 Eggheads Development Team From 272983c2c34dd25673ab8dcf1be9ce897f217c85 Mon Sep 17 00:00:00 2001 From: Geo Date: Thu, 10 Nov 2022 17:27:05 -0500 Subject: [PATCH 22/92] Run autoconf --- configure | 20 ++++++++++---------- src/mod/compress.mod/configure | 20 ++++++++++---------- src/mod/dns.mod/configure | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/configure b/configure index ecfb818de..b7e1fb352 100755 --- a/configure +++ b/configure @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.ac bc41b3ea. +# From configure.ac 13ab0170. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Eggdrop 1.9.3. +# Generated by GNU Autoconf 2.69 for Eggdrop 1.9.4. # # Report bugs to . # @@ -583,8 +583,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Eggdrop' PACKAGE_TARNAME='eggdrop' -PACKAGE_VERSION='1.9.3' -PACKAGE_STRING='Eggdrop 1.9.3' +PACKAGE_VERSION='1.9.4' +PACKAGE_STRING='Eggdrop 1.9.4' PACKAGE_BUGREPORT='bugs@eggheads.org' PACKAGE_URL='' @@ -1334,7 +1334,7 @@ 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 1.9.3 to adapt to many kinds of systems. +\`configure' configures Eggdrop 1.9.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1401,7 +1401,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Eggdrop 1.9.3:";; + short | recursive ) echo "Configuration of Eggdrop 1.9.4:";; esac cat <<\_ACEOF @@ -1511,7 +1511,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Eggdrop configure 1.9.3 +Eggdrop configure 1.9.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2222,7 +2222,7 @@ 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 $as_me 1.9.3, which was +It was created by Eggdrop $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -10513,7 +10513,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Eggdrop $as_me 1.9.3, which was +This file was extended by Eggdrop $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -10579,7 +10579,7 @@ _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 config.status 1.9.3 +Eggdrop config.status 1.9.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/src/mod/compress.mod/configure b/src/mod/compress.mod/configure index 356916e6d..29f9f2adc 100755 --- a/src/mod/compress.mod/configure +++ b/src/mod/compress.mod/configure @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.ac bc41b3ea. +# From configure.ac 13ab0170. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Eggdrop Compress Module 1.9.3. +# Generated by GNU Autoconf 2.69 for Eggdrop Compress Module 1.9.4. # # Report bugs to . # @@ -583,8 +583,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Eggdrop Compress Module' PACKAGE_TARNAME='eggdrop-compress-module' -PACKAGE_VERSION='1.9.3' -PACKAGE_STRING='Eggdrop Compress Module 1.9.3' +PACKAGE_VERSION='1.9.4' +PACKAGE_STRING='Eggdrop Compress Module 1.9.4' PACKAGE_BUGREPORT='bugs@eggheads.org' PACKAGE_URL='' @@ -1240,7 +1240,7 @@ 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 Compress Module 1.9.3 to adapt to many kinds of systems. +\`configure' configures Eggdrop Compress Module 1.9.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1303,7 +1303,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Eggdrop Compress Module 1.9.3:";; + short | recursive ) echo "Configuration of Eggdrop Compress Module 1.9.4:";; esac cat <<\_ACEOF @@ -1383,7 +1383,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Eggdrop Compress Module configure 1.9.3 +Eggdrop Compress Module configure 1.9.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1687,7 +1687,7 @@ 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 Compress Module $as_me 1.9.3, which was +It was created by Eggdrop Compress Module $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3687,7 +3687,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Eggdrop Compress Module $as_me 1.9.3, which was +This file was extended by Eggdrop Compress Module $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -3740,7 +3740,7 @@ _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 Compress Module config.status 1.9.3 +Eggdrop Compress Module config.status 1.9.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/src/mod/dns.mod/configure b/src/mod/dns.mod/configure index c14fa7a18..00072f073 100755 --- a/src/mod/dns.mod/configure +++ b/src/mod/dns.mod/configure @@ -1,7 +1,7 @@ #! /bin/sh -# From configure.ac bc41b3ea. +# From configure.ac 13ab0170. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Eggdrop DNS Module 1.9.3. +# Generated by GNU Autoconf 2.69 for Eggdrop DNS Module 1.9.4. # # Report bugs to . # @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Eggdrop DNS Module' PACKAGE_TARNAME='eggdrop-dns-module' -PACKAGE_VERSION='1.9.3' -PACKAGE_STRING='Eggdrop DNS Module 1.9.3' +PACKAGE_VERSION='1.9.4' +PACKAGE_STRING='Eggdrop DNS Module 1.9.4' PACKAGE_BUGREPORT='bugs@eggheads.org' PACKAGE_URL='' @@ -1200,7 +1200,7 @@ 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 DNS Module 1.9.3 to adapt to many kinds of systems. +\`configure' configures Eggdrop DNS Module 1.9.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1263,7 +1263,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Eggdrop DNS Module 1.9.3:";; + short | recursive ) echo "Configuration of Eggdrop DNS Module 1.9.4:";; esac cat <<\_ACEOF @@ -1342,7 +1342,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Eggdrop DNS Module configure 1.9.3 +Eggdrop DNS Module configure 1.9.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1476,7 +1476,7 @@ 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 DNS Module $as_me 1.9.3, which was +It was created by Eggdrop DNS Module $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3119,7 +3119,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Eggdrop DNS Module $as_me 1.9.3, which was +This file was extended by Eggdrop DNS Module $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -3172,7 +3172,7 @@ _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 DNS Module config.status 1.9.3 +Eggdrop DNS Module config.status 1.9.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" From 2c493b66ba7dec041dbb3f85a2da5d32e4499245 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 11 Dec 2022 20:48:59 +0000 Subject: [PATCH 23/92] Fix typo --- doc/sphinx_source/tutorials/tlssetup.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx_source/tutorials/tlssetup.rst b/doc/sphinx_source/tutorials/tlssetup.rst index 23e2ea636..6cc8fff3e 100644 --- a/doc/sphinx_source/tutorials/tlssetup.rst +++ b/doc/sphinx_source/tutorials/tlssetup.rst @@ -39,7 +39,7 @@ Eggdrop has the ability to protect botnet (direct bot to bot) communications wit Configuration File Preparation - Generating Keys ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If an Eggdrop is going to listen/accept connections on a TLS port (more on that in a moment), it must have a public/private certificate pair generated and configured. For most users, a self-signed certificate is sufficient for encryption (a certificate signed by a certificate authority would be more secure, but obtaining one is outside the scope of this tutorial. However, the implementatino of a signed keypair is no different than a self-signed pair). To generate a self-signed key pair, enter the Eggdrop source directory (the directory you first compiled Eggdrop from, usually named eggdrop-X.Y.Z) and type:: +If an Eggdrop is going to listen/accept connections on a TLS port (more on that in a moment), it must have a public/private certificate pair generated and configured. For most users, a self-signed certificate is sufficient for encryption (a certificate signed by a certificate authority would be more secure, but obtaining one is outside the scope of this tutorial. However, the implementation of a signed keypair is no different than a self-signed pair). To generate a self-signed key pair, enter the Eggdrop source directory (the directory you first compiled Eggdrop from, usually named eggdrop-X.Y.Z) and type:: make sslcert From b2c9dae3f767c3942eda8b80c30e22ba6e9459fb Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 11 Dec 2022 21:26:40 -0500 Subject: [PATCH 24/92] Add systemd option to autobotchk Patch by: @PeGaSuS-Coder , Geo Adds a -systemd option to the autobotchk script. Will be considered Beta for now, and based on user feedback go stable in the next release. --- INSTALL | 8 +- README | 30 +++++--- doc/html/tutorials/firststeps.html | 23 +++++- doc/sphinx_source/install/install.rst | 6 +- doc/sphinx_source/install/readme.rst | 17 +++-- doc/sphinx_source/tutorials/firststeps.rst | 42 +++++++++- scripts/autobotchk | 89 ++++++++++++++++++---- 7 files changed, 171 insertions(+), 44 deletions(-) diff --git a/INSTALL b/INSTALL index 064b9ea37..1b355fd85 100644 --- a/INSTALL +++ b/INSTALL @@ -115,8 +115,12 @@ Eggdrop into from the previous step] automatically restart if the machine goes down or (heaven forbid) the bot should crash. Eggdrop includes a helper script - to generate a proper crontab script and entry. You can run this - script by typing: + to auto-generate either a systemd or crontab entry. To add a + systemd job, run: + + ./scripts/autobotchk [yourconfig.conf] -systemd + + or to add a crontab job, run: ./scripts/autobotchk [yourconfig.conf] diff --git a/README b/README index 456773650..9e5bef168 100644 --- a/README +++ b/README @@ -156,28 +156,36 @@ COMMAND LINE Most people never use any of the options except -m and you usually only need to use that once. -SETTING UP A CRONTAB +AUTO-STARTING EGGDROP Systems go down from time to time, taking your Eggdrop along with it. You may not be not around to restart it manually, so you can instead use -your host's crontab system to automatically restart Eggdrop should it -quit for any reason. Eggdrop comes with an autobotchk shell script -creates that both checks if your Eggdrop is still running, and a crontab -entry to run the botchk script every 10 minutes. +features of the operating system to automatically restart Eggdrop should +it quit for any reason. Eggdrop comes with an autobotchk shell script +that can create either a systemd or crontab entry. The systemd option +will monitor your Eggdrop and a) start it when the machine boots and b) +restart the Eggdrop if it crashes for any reason. The (older) crontab +option will check (by default) every 10 minutes to see if your Eggdrop +is still running, and attempt to restart it if it is not. - Using autobotchk is probably the fastest way of creating your botchk - and adding a crontab entry. From the install directory, simply run: + To auto-generate a systemd job, from the Eggdrop install directory, + simply run: + + ./scripts/autobotchk -systemd + + To auto-geneerate a script to check Eggdrop's status and run it via a + crontab entry, simply run: ./scripts/autobotchk This will crontab your bot using the default setup. If you want a list - of autobotchk options, type './autobotchk'. An example with options - would be: + of autobotchk options, type './autobotchk'. A crontab example with + options would be: ./scripts/autobotchk -noemail -5 - This would setup crontab to run the botchk every 5 minutes and also to - not send you email saying that it restarted your bot. + This would setup crontab to run the botchk every 5 minutes and not + send you an email saying that it restarted your bot. DOCUMENTATION diff --git a/doc/html/tutorials/firststeps.html b/doc/html/tutorials/firststeps.html index a176fca34..4a8c80084 100644 --- a/doc/html/tutorials/firststeps.html +++ b/doc/html/tutorials/firststeps.html @@ -180,13 +180,15 @@

        Configure Channel Settings

        Automatically restarting an Eggdrop

        -

        A common question asked by users is, how can I configure Eggdrop to automatically restart should it die, such as after a reboot? To do that, we use the system’s crontab daemon to run a script (called botchk) every ten minutes that checks if the eggdrop is running. If the eggdrop is not running, the script will restart the bot, with an optional email sent to the user informing them of the action. To make this process as simple as possible, we have included a script that can automatically configure your crontab and botchk scripts for you. To set up your crontab/botchk combo:

        +

        A common question asked by users is, how can I configure Eggdrop to automatically restart should it die, such as after a reboot? Historically, Eggdrop relied on the host’s crontab system to run a script (called botchk) every ten minutes to see if the eggdrop is running. If the eggdrop is not running, the script will restart the bot, with an optional email sent to the user informing them of the action. Newer systems come with systemd, which can provide better real-time monitoring of processes such as Eggdrop. You probably want to use systemd if your system has it.

        +
        +

        Crontab Method (Old)

        1. Enter the directory you installed your Eggdrop to. Most commonly, this is ~/eggdrop (also known as /home/<username>/eggdrop).

        2. Just humor us- run ./scripts/autobotchk without any arguments and read the options available to you. They’re listed there for a reason!

        3. -
        4. If you don’t want to customize anything via the options listed in #2, you can start the script simply by running:

          +
        5. If you don’t want to customize anything via the options listed in #2, you can install a crontab job to start Eggdrop simply by running:

          ./scripts/autobotchk yourEggdropConfigNameHere.conf
           
          @@ -203,6 +205,21 @@

          Automatically restarting an Eggdropcrontab -e to open the crontab file in your system’s default editor and remove the crontab line.

        +
        +

        Systemd Method (Newer Systems)

        +
          +
        1. Enter the directory you installed your Eggdrop to. Most commonly, this is ~/eggdrop (also known as /home/<username>/eggdrop).

          +
        2. +
        3. Install the systemd job for Eggdrop simply by running:

          +
          ./scripts/autobotchk yourEggdropConfigNameHere.conf -systemd
          +
          +
          +
        4. +
        5. Note the output at the end of the script informing you of the command you can use to start/stop the Eggdrop in thee future

          +
        6. +
        +
        +

        Authenticating with NickServ

        Many IRC features require you to authenticate with NickServ to use them. You can do this from your config file by searching for the line:

        @@ -273,7 +290,7 @@

        Setting up SASL authentication © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 03, 2022. Created using Sphinx 1.8.5.

        diff --git a/doc/sphinx_source/install/install.rst b/doc/sphinx_source/install/install.rst index ece05c0e4..2a1679844 100644 --- a/doc/sphinx_source/install/install.rst +++ b/doc/sphinx_source/install/install.rst @@ -96,7 +96,11 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. 9. It's advisable to run your bot via crontab, so that it will automatically restart if the machine goes down or (heaven forbid) - the bot should crash. Eggdrop includes a helper script to generate a proper crontab script and entry. You can run this script by typing:: + the bot should crash. Eggdrop includes a helper script to auto-generate either a systemd or crontab entry. To add a systemd job, run:: + + ./scripts/autobotchk [yourconfig.conf] -systemd + + or to add a crontab job, run:: ./scripts/autobotchk [yourconfig.conf] diff --git a/doc/sphinx_source/install/readme.rst b/doc/sphinx_source/install/readme.rst index 385c76265..0a1593dc6 100644 --- a/doc/sphinx_source/install/readme.rst +++ b/doc/sphinx_source/install/readme.rst @@ -142,21 +142,24 @@ Command Line Most people never use any of the options except -m and you usually only need to use that once. -Setting up a Crontab --------------------- +Auto-starting Eggdrop +--------------------- -Systems go down from time to time, taking your Eggdrop along with it. You may not be not around to restart it manually, so you can instead use your host's crontab system to automatically restart Eggdrop should it quit for any reason. Eggdrop comes with an autobotchk shell script creates that both checks if your Eggdrop is still running, and a crontab entry to run the botchk script every 10 minutes. +Systems go down from time to time, taking your Eggdrop along with it. You may not be not around to restart it manually, so you can instead use features of the operating system to automatically restart Eggdrop should it quit for any reason. Eggdrop comes with an autobotchk shell script that can create either a systemd or crontab entry. The systemd option will monitor your Eggdrop and a) start it when the machine boots and b) restart the Eggdrop if it crashes for any reason. The (older) crontab option will check (by default) every 10 minutes to see if your Eggdrop is still running, and attempt to restart it if it is not. - Using autobotchk is probably the fastest way of creating your botchk and adding a crontab entry. From the install directory, simply run:: + To auto-generate a systemd job, from the Eggdrop install directory, simply run:: - ./scripts/autobotchk + ./scripts/autobotchk -systemd + To auto-geneerate a script to check Eggdrop's status and run it via a crontab entry, simply run:: + + ./scripts/autobotchk - This will crontab your bot using the default setup. If you want a list of autobotchk options, type './autobotchk'. An example with options would be:: + This will crontab your bot using the default setup. If you want a list of autobotchk options, type './autobotchk'. A crontab example with options would be:: ./scripts/autobotchk -noemail -5 - This would setup crontab to run the botchk every 5 minutes and also to not send you email saying that it restarted your bot. + This would setup crontab to run the botchk every 5 minutes and not send you an email saying that it restarted your bot. Documentation ------------- diff --git a/doc/sphinx_source/tutorials/firststeps.rst b/doc/sphinx_source/tutorials/firststeps.rst index c3c1c9043..71330a631 100644 --- a/doc/sphinx_source/tutorials/firststeps.rst +++ b/doc/sphinx_source/tutorials/firststeps.rst @@ -80,15 +80,18 @@ which will enforce the s, n, and t flags on a channel. Automatically restarting an Eggdrop ----------------------------------- -A common question asked by users is, how can I configure Eggdrop to automatically restart should it die, such as after a reboot? To do that, we use the system's crontab daemon to run a script (called botchk) every ten minutes that checks if the eggdrop is running. If the eggdrop is not running, the script will restart the bot, with an optional email sent to the user informing them of the action. To make this process as simple as possible, we have included a script that can automatically configure your crontab and botchk scripts for you. To set up your crontab/botchk combo: +A common question asked by users is, how can I configure Eggdrop to automatically restart should it die, such as after a reboot? Historically, Eggdrop relied on the host's crontab system to run a script (called botchk) every ten minutes to see if the eggdrop is running. If the eggdrop is not running, the script will restart the bot, with an optional email sent to the user informing them of the action. Newer systems come with systemd, which can provide better real-time monitoring of processes such as Eggdrop. You probably want to use systemd if your system has it. + +Crontab Method (Old) +^^^^^^^^^^^^^^^^^^^^ 1. Enter the directory you installed your Eggdrop to. Most commonly, this is ~/eggdrop (also known as /home//eggdrop). -2. Just humor us- run ``./scripts/autobotchk`` without any arguments and read the options available to you. They're listed there for a reason! +2. Just humor us- run ``./scripts/autobotchk`` without any arguments and read the options available to you. They're listed there for a reason! -3. If you don't want to customize anything via the options listed in #2, you can start the script simply by running:: +3. If you don't want to customize anything via the options listed in #2, you can install a crontab job to start Eggdrop simply by running:: - ./scripts/autobotchk yourEggdropConfigNameHere.conf + ./scripts/autobotchk yourEggdropConfigNameHere.conf 4. Review the output of the script, and verify your new crontab entry by typing:: @@ -100,6 +103,37 @@ By default, it should create an entry that looks similar to:: This will run the generated botchk script every ten minutes and restart your Eggdrop if it is not running during the check. Also note that if you run autobotchk from the scripts directory, you'll have to manually specify your config file location with the -dir option. To remove a crontab entry, use ``crontab -e`` to open the crontab file in your system's default editor and remove the crontab line. +Systemd Method (Newer Systems) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +1. Enter the directory you installed your Eggdrop to. Most commonly, this is ~/eggdrop (also known as /home//eggdrop). + +2. Install the systemd job for Eggdrop simply by running:: + + ./scripts/autobotchk yourEggdropConfigNameHere.conf -systemd + +3. Note the output at the end of the script informing you of the command you can use to start/stop the Eggdrop in thee future. For example, to manually start the Eggdrop, use:: + + systemctl --user start .service + +To stop Eggdrop, use:: + + systemctl --user stop .service + +To rehash (not reload) Eggdrop, use:: + + systemctl --user reload .service + +(Yes, we acknowledge the confusion that the systemd reload command will execute the Eggdrop '.rehash' command, not the '.reload' command. Unfortunately, systemd did not consult us when choosing its commands!) + +To prevent Eggdrop from automatically running after a system start, use:: + + systemctl --user disable .service + +To re-enable Eggdrop automatically starting after a system start, use:: + + systemctl --user enable .service + Authenticating with NickServ ---------------------------- diff --git a/scripts/autobotchk b/scripts/autobotchk index d517717f9..801b80dc5 100755 --- a/scripts/autobotchk +++ b/scripts/autobotchk @@ -3,6 +3,8 @@ # Copyright (C) 1999-2003 Jeff Fisher (guppy@eggheads.org) # Copyright (C) 2004-2022 Eggheads Development Team # +# systemd formating contributed by PeGaSuS +# # 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 @@ -89,11 +91,16 @@ exec tclsh$lastver "$0" ${1+"$@"} # with len > handlen, for (botnet-)nicks with \[ \] and for # $(botnet-)nick used in pidfile, userfile or (botnet-)nick # 19Apr2017: Fix running this from a non-eggdrop dir. +# 28Nov2023: Added -systemd option, to (duh) create a systemd job if {$argc == 0} { puts "\nusage: $argv0 \[options\] \[additional configs\]" puts "Options:" puts "--------" + puts " systemd options:" + puts " -systemd (install systemd job instead of cron)" + puts "" + puts " crontab options:" puts " -dir (directory to run autobotchk in)" puts " -noemail (discard crontab e-mails)" puts " -5 (5 minute checks)" @@ -126,7 +133,7 @@ proc newsplit {text {split " "}} { } puts "\nautobotchk 1.11, (C) 1999-2003 Jeff Fisher (guppy@eggheads.org)" -puts "\n (C) 2004-2016 Eggheads Development Team" +puts " (C) 2004-2022 Eggheads Development Team" puts "------------------------------------------------------------\n" set mainconf [newsplit argv] @@ -134,12 +141,15 @@ set confs [list $mainconf] set dir [pwd] set delay 10 set email 1 +set systemd 0 +catch {exec which kill} kill # If you renamed your eggdrop binary, you should change this variable set binary "eggdrop" while {[set opt [newsplit argv]] != ""} { switch -- $opt { + "-systemd" { set systemd 1 } "-time" - "-1" { set delay 1 } "-5" { set delay 5 } @@ -257,17 +267,64 @@ foreach config $confs { } set nick [string range [subst -nocommands $nick] 0 $handlen] set botnet-nick [string range [subst -nocommands ${botnet-nick}] 0 $handlen] - if {![info exists pidfile]} { - puts " Defaulting \$pidfile to \"pid.${botnet-nick}\"" - set pidfile "pid.${botnet-nick}" + +### systemd stuff +if {$systemd} { + puts "Enabling user lingering..." + if {[catch {exec loginctl enable-linger} res]} { + puts "Oops, something went wrong. Is systemd running on this system?" + exit } - set pidfile [subst -nocommands $pidfile] - if {[catch {open $dir/${botnet-nick}.botchk w} fd]} { - puts " *** ERROR: unable to open '${botnet-nick}.botchk' for writing" + puts "Creating systemd directory..." + catch {file mkdir ~/.config/systemd/user } res + if {[catch {open ~/.config/systemd/user/${botnet-nick}.service w} fd]} { + puts " *** ERROR: unable to open '${botnet-nick}.service' for writing" puts "" exit } - puts $fd "#! /bin/sh + puts $fd "### Eggdrop systemd unit, generated by autosystemd" + puts $fd "" + puts $fd "\[Unit\]" + puts $fd "Description=${botnet-nick} (Eggdrop)" + puts $fd "After=default.target" + puts $fd "" + puts $fd "\[Service\]" + puts $fd "WorkingDirectory=${dir}" + puts $fd "ExecStart=${dir}/eggdrop ${config}" + puts $fd "ExecReload=${kill} -s HUP \$MAINPID" + puts $fd "Type=forking" + puts $fd "Restart=on-abnormal" + puts $fd "" + puts $fd "\[Install\]" + puts $fd "WantedBy=default.target" + close $fd + + catch {exec systemctl --user enable ${botnet-nick}.service} res + puts $res + puts "systemd job successfully installed as '${botnet-nick}.service'." + puts "* Use 'systemctl --user ${botnet-nick}.service' to control your Eggdrop" + puts "Starting Eggdrop..." + if {[catch {exec systemctl --user start ${botnet-nick}.service} res]} { + puts "ERROR: Eggdrop did not start." + puts $res + } else { + puts "Success." + } + exit +} + + +if {![info exists pidfile]} { + puts " Defaulting \$pidfile to \"pid.${botnet-nick}\"" + set pidfile "pid.${botnet-nick}" +} +set pidfile [subst -nocommands $pidfile] +if {[catch {open $dir/${botnet-nick}.botchk w} fd]} { + puts " *** ERROR: unable to open '${botnet-nick}.botchk' for writing" + puts "" + exit +} +puts $fd "#! /bin/sh # # ${botnet-nick}.botchk (generated on [clock format [clock seconds] -format "%B %d, %Y @ %I:%M%p"]) # @@ -360,14 +417,14 @@ fi exit 0 " - close $fd - puts "Wrote '${botnet-nick}.botchk' successfully ([file size $dir/${botnet-nick}.botchk] bytes)" - if {[catch {exec chmod u+x $dir/${botnet-nick}.botchk} 0]} { - puts " *** ERROR: unable to 'chmod u+x' the output file" - puts "" - exit - } - puts -nonewline "Scanning crontab entries ... " +close $fd +puts "Wrote '${botnet-nick}.botchk' successfully ([file size $dir/${botnet-nick}.botchk] bytes)" +if {[catch {exec chmod u+x $dir/${botnet-nick}.botchk} 0]} { + puts " *** ERROR: unable to 'chmod u+x' the output file" + puts "" + exit +} +puts -nonewline "Scanning crontab entries ... " set tmp ".autobotchk[clock clicks].[pid]" set cronbotchk [string map {\\ \\\\ \[ \\\[ \] \\\]} "${botnet-nick}.botchk"] From c76182c8687715d440b4e25385e171fe5175c67e Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 12 Dec 2022 17:32:00 -0500 Subject: [PATCH 25/92] Update NEWS for 1.9.4 --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 44a6d3594..6dfe4de3d 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ Eggdrop v1.9.4: General changes: - Fixed a DNS bug causing Eggdrop to often hang on DCC or telnet connections + - BETA: Added -systemd option to autobotchk script to restart Eggdrop via + systemd instead of cron - Reverted matchattr match syntax to previous functionality. Matching against "-" as a flag will once again successfully match against "no" flags, instead of returning an error. @@ -36,6 +38,8 @@ Eggdrop v1.9.4: - Moved the 'gotmsg' function back as a raw bind. It was inadvertantly moved to a rawt bind in 1.9.3, causing issuse with scripts attempting to unbind this internal reference + Module changes: + - None Eggdrop config changes: - None From 15949fb0675bc6a17916022cd7b9f3b39c5b5e52 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 12 Dec 2022 17:43:41 -0500 Subject: [PATCH 26/92] update docs for 1.9.4 --- doc/html/about/about.html | 2 +- doc/html/about/legal.html | 2 +- doc/html/index.html | 4 ++-- doc/html/install/install.html | 12 +++++++++--- doc/html/install/readme.html | 20 +++++++++++-------- doc/html/install/upgrading.html | 2 +- doc/html/modules/included.html | 2 +- doc/html/modules/index.html | 2 +- doc/html/modules/mod/assoc.html | 2 +- doc/html/modules/mod/blowfish.html | 2 +- doc/html/modules/mod/channels.html | 2 +- doc/html/modules/mod/compress.html | 2 +- doc/html/modules/mod/console.html | 2 +- doc/html/modules/mod/ctcp.html | 2 +- doc/html/modules/mod/dns.html | 2 +- doc/html/modules/mod/filesys.html | 2 +- doc/html/modules/mod/ident.html | 2 +- doc/html/modules/mod/irc.html | 2 +- doc/html/modules/mod/notes.html | 2 +- doc/html/modules/mod/pbkdf2.html | 2 +- doc/html/modules/mod/seen.html | 2 +- doc/html/modules/mod/server.html | 2 +- doc/html/modules/mod/share.html | 2 +- doc/html/modules/mod/transfer.html | 2 +- doc/html/modules/mod/twitch.html | 2 +- doc/html/modules/mod/uptime.html | 2 +- doc/html/modules/mod/woobie.html | 2 +- doc/html/modules/writing.html | 2 +- doc/html/objects.inv | Bin 1279 -> 1319 bytes doc/html/search.html | 2 +- doc/html/searchindex.js | 2 +- doc/html/tutorials/firstscript.html | 2 +- doc/html/tutorials/firststeps.html | 24 +++++++++++++++++++++-- doc/html/tutorials/setup.html | 2 +- doc/html/tutorials/tlssetup.html | 4 ++-- doc/html/using/accounts.html | 2 +- doc/html/using/bans.html | 2 +- doc/html/using/botnet.html | 2 +- doc/html/using/core.html | 2 +- doc/html/using/features.html | 2 +- doc/html/using/ipv6.html | 2 +- doc/html/using/ircv3.html | 2 +- doc/html/using/partyline.html | 2 +- doc/html/using/patch.html | 2 +- doc/html/using/pbkdf2info.html | 2 +- doc/html/using/tcl-commands.html | 8 ++++---- doc/html/using/text-sub.html | 2 +- doc/html/using/tls.html | 2 +- doc/html/using/tricks.html | 2 +- doc/html/using/twitch-tcl-commands.html | 2 +- doc/html/using/twitchinfo.html | 2 +- doc/html/using/users.html | 2 +- doc/sphinx_source/using/tcl-commands.rst | 6 ++++-- doc/tcl-commands.doc | 13 ++++++------ 54 files changed, 107 insertions(+), 74 deletions(-) diff --git a/doc/html/about/about.html b/doc/html/about/about.html index aaa966ae2..1da39cdbe 100644 --- a/doc/html/about/about.html +++ b/doc/html/about/about.html @@ -177,7 +177,7 @@

        About Eggdrop © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/about/legal.html b/doc/html/about/legal.html index 29a4e2838..1b1690f18 100644 --- a/doc/html/about/legal.html +++ b/doc/html/about/legal.html @@ -128,7 +128,7 @@

        Boring legal stuff © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/index.html b/doc/html/index.html index c0d84e9bc..412af9939 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -142,7 +142,7 @@

        Where to find more helpQuick Startup
      3. Upgrading
      4. Command Line
      5. -
      6. Setting up a Crontab
      7. +
      8. Auto-starting Eggdrop
      9. Documentation
      10. Obtaining Help
      11. @@ -375,7 +375,7 @@

        Where to find more help © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/install/install.html b/doc/html/install/install.html index d6ce5d245..a3a2ba473 100644 --- a/doc/html/install/install.html +++ b/doc/html/install/install.html @@ -212,8 +212,14 @@

        Quick Startup
        It’s advisable to run your bot via crontab, so that it will
        -

        automatically restart if the machine goes down or (heaven forbid) -the bot should crash. Eggdrop includes a helper script to generate a proper crontab script and entry. You can run this script by typing:

        +
        +

        automatically restart if the machine goes down or (heaven forbid) +the bot should crash. Eggdrop includes a helper script to auto-generate either a systemd or crontab entry. To add a systemd job, run:

        +
        ./scripts/autobotchk [yourconfig.conf] -systemd
        +
        +
        +
        +

        or to add a crontab job, run:

        ./scripts/autobotchk [yourconfig.conf]
         
        @@ -284,7 +290,7 @@

        Modules © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/install/readme.html b/doc/html/install/readme.html index 24d2c1630..4b774c066 100644 --- a/doc/html/install/readme.html +++ b/doc/html/install/readme.html @@ -49,7 +49,7 @@

        Table of Contents

      12. Quick Startup
      13. Upgrading
      14. Command Line
      15. -
      16. Setting up a Crontab
      17. +
      18. Auto-starting Eggdrop
      19. Documentation
      20. Obtaining Help
      21. @@ -247,19 +247,23 @@

        Command Line -

        Setting up a Crontab

        -

        Systems go down from time to time, taking your Eggdrop along with it. You may not be not around to restart it manually, so you can instead use your host’s crontab system to automatically restart Eggdrop should it quit for any reason. Eggdrop comes with an autobotchk shell script creates that both checks if your Eggdrop is still running, and a crontab entry to run the botchk script every 10 minutes.

        +
        +

        Auto-starting Eggdrop

        +

        Systems go down from time to time, taking your Eggdrop along with it. You may not be not around to restart it manually, so you can instead use features of the operating system to automatically restart Eggdrop should it quit for any reason. Eggdrop comes with an autobotchk shell script that can create either a systemd or crontab entry. The systemd option will monitor your Eggdrop and a) start it when the machine boots and b) restart the Eggdrop if it crashes for any reason. The (older) crontab option will check (by default) every 10 minutes to see if your Eggdrop is still running, and attempt to restart it if it is not.

        -

        Using autobotchk is probably the fastest way of creating your botchk and adding a crontab entry. From the install directory, simply run:

        +

        To auto-generate a systemd job, from the Eggdrop install directory, simply run:

        +
        ./scripts/autobotchk <Eggdrop config file> -systemd
        +
        +
        +

        To auto-geneerate a script to check Eggdrop’s status and run it via a crontab entry, simply run:

        ./scripts/autobotchk <Eggdrop config file>
         
        -

        This will crontab your bot using the default setup. If you want a list of autobotchk options, type ‘./autobotchk’. An example with options would be:

        +

        This will crontab your bot using the default setup. If you want a list of autobotchk options, type ‘./autobotchk’. A crontab example with options would be:

        ./scripts/autobotchk <Eggdrop config file> -noemail -5
         
        -

        This would setup crontab to run the botchk every 5 minutes and also to not send you email saying that it restarted your bot.

        +

        This would setup crontab to run the botchk every 5 minutes and not send you an email saying that it restarted your bot.

        diff --git a/doc/html/install/upgrading.html b/doc/html/install/upgrading.html index 7a2842f4b..f66935b1e 100644 --- a/doc/html/install/upgrading.html +++ b/doc/html/install/upgrading.html @@ -191,7 +191,7 @@

        Documentation © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/modules/included.html b/doc/html/modules/included.html index edffbdbbc..0ea348b20 100644 --- a/doc/html/modules/included.html +++ b/doc/html/modules/included.html @@ -277,7 +277,7 @@

        Modules included with Eggdrop © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/modules/index.html b/doc/html/modules/index.html index f17d8d8bf..a0b377a35 100644 --- a/doc/html/modules/index.html +++ b/doc/html/modules/index.html @@ -169,7 +169,7 @@

        Do I still need to ‘loadmodule’ modules? © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/modules/mod/assoc.html b/doc/html/modules/mod/assoc.html index 473290a3f..546553921 100644 --- a/doc/html/modules/mod/assoc.html +++ b/doc/html/modules/mod/assoc.html @@ -159,7 +159,7 @@

        Search

        diff --git a/doc/html/modules/mod/blowfish.html b/doc/html/modules/mod/blowfish.html index bd82779ea..c07a42010 100644 --- a/doc/html/modules/mod/blowfish.html +++ b/doc/html/modules/mod/blowfish.html @@ -164,7 +164,7 @@

        Search

        diff --git a/doc/html/modules/mod/channels.html b/doc/html/modules/mod/channels.html index 5b8fb089b..80a886f81 100644 --- a/doc/html/modules/mod/channels.html +++ b/doc/html/modules/mod/channels.html @@ -540,7 +540,7 @@

        Search

        diff --git a/doc/html/modules/mod/compress.html b/doc/html/modules/mod/compress.html index bde3bc8ae..55b0f5e18 100644 --- a/doc/html/modules/mod/compress.html +++ b/doc/html/modules/mod/compress.html @@ -172,7 +172,7 @@

        Search

        diff --git a/doc/html/modules/mod/console.html b/doc/html/modules/mod/console.html index bdd760ceb..3550c0a6b 100644 --- a/doc/html/modules/mod/console.html +++ b/doc/html/modules/mod/console.html @@ -174,7 +174,7 @@

        Search

        diff --git a/doc/html/modules/mod/ctcp.html b/doc/html/modules/mod/ctcp.html index 70f7884ff..b56e3d14c 100644 --- a/doc/html/modules/mod/ctcp.html +++ b/doc/html/modules/mod/ctcp.html @@ -191,7 +191,7 @@

        Search

        diff --git a/doc/html/modules/mod/dns.html b/doc/html/modules/mod/dns.html index dbdd9a95d..083d15fd6 100644 --- a/doc/html/modules/mod/dns.html +++ b/doc/html/modules/mod/dns.html @@ -187,7 +187,7 @@

        Search

        diff --git a/doc/html/modules/mod/filesys.html b/doc/html/modules/mod/filesys.html index 2ce90adf9..6aa7b62e9 100644 --- a/doc/html/modules/mod/filesys.html +++ b/doc/html/modules/mod/filesys.html @@ -365,7 +365,7 @@

        .filesys module © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index 5cfcd7cad..0fb9cf6a6 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -228,7 +228,7 @@

        Search

        diff --git a/doc/html/modules/mod/irc.html b/doc/html/modules/mod/irc.html index cd7d05f14..8e5e5f7ba 100644 --- a/doc/html/modules/mod/irc.html +++ b/doc/html/modules/mod/irc.html @@ -290,7 +290,7 @@

        Search

        diff --git a/doc/html/modules/mod/notes.html b/doc/html/modules/mod/notes.html index f27bedad9..f96790008 100644 --- a/doc/html/modules/mod/notes.html +++ b/doc/html/modules/mod/notes.html @@ -182,7 +182,7 @@

        Search

        diff --git a/doc/html/modules/mod/pbkdf2.html b/doc/html/modules/mod/pbkdf2.html index b02d7e06e..ce866e4b4 100644 --- a/doc/html/modules/mod/pbkdf2.html +++ b/doc/html/modules/mod/pbkdf2.html @@ -181,7 +181,7 @@

        Search

        diff --git a/doc/html/modules/mod/seen.html b/doc/html/modules/mod/seen.html index 23b657e19..94b1fad01 100644 --- a/doc/html/modules/mod/seen.html +++ b/doc/html/modules/mod/seen.html @@ -161,7 +161,7 @@

        Search

        diff --git a/doc/html/modules/mod/server.html b/doc/html/modules/mod/server.html index e83a3db20..ca54d385f 100644 --- a/doc/html/modules/mod/server.html +++ b/doc/html/modules/mod/server.html @@ -380,7 +380,7 @@

        Search

        diff --git a/doc/html/modules/mod/share.html b/doc/html/modules/mod/share.html index 2ffb85ec0..39b06314c 100644 --- a/doc/html/modules/mod/share.html +++ b/doc/html/modules/mod/share.html @@ -191,7 +191,7 @@

        Search

        diff --git a/doc/html/modules/mod/transfer.html b/doc/html/modules/mod/transfer.html index 9e2451cf1..6af988989 100644 --- a/doc/html/modules/mod/transfer.html +++ b/doc/html/modules/mod/transfer.html @@ -186,7 +186,7 @@

        Search

        diff --git a/doc/html/modules/mod/twitch.html b/doc/html/modules/mod/twitch.html index c7ad96918..94b38e74c 100644 --- a/doc/html/modules/mod/twitch.html +++ b/doc/html/modules/mod/twitch.html @@ -194,7 +194,7 @@

        Partyline commands © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/modules/mod/uptime.html b/doc/html/modules/mod/uptime.html index 45993ea2a..cc5e5f575 100644 --- a/doc/html/modules/mod/uptime.html +++ b/doc/html/modules/mod/uptime.html @@ -167,7 +167,7 @@

        Search

        diff --git a/doc/html/modules/mod/woobie.html b/doc/html/modules/mod/woobie.html index b9b05d0a4..aad24ae95 100644 --- a/doc/html/modules/mod/woobie.html +++ b/doc/html/modules/mod/woobie.html @@ -160,7 +160,7 @@

        Search

        diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index db0584e67..4cd607b43 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -428,7 +428,7 @@

        What to do with a module? © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/objects.inv b/doc/html/objects.inv index 769b0721ecbe8dca1923d114d1645a7c5de1f80d..3eeec3c4f2f64ba7cdec65c523bdfc5395e4a612 100644 GIT binary patch delta 1213 zcmV;u1Va1&38xB>dVh^q+m72d5PkPo2uL5}8cl&d6hVN!qKjsOMeHCCMG?>xZ4)b# z0!i8HzwhuWQW`pa*~^?cMhT4zx$=RakvUZqW<-U%$cPH^*ej;5DTIuq5E)59XxXuA0xn_X z`}{~Zw7#qnhS zT=13&Q-6$u<9|b*TyA*8s2{2?lMZ$Iz9FKKJrj+VgQBc?`g+%Fr2(!sr0Z7Ucd1f9 zajEVfTg$NpVxD58Ju*zeBVOR^!_EEkLn00RUXj+yA-n{7>bI0Tc{GH6Fdr(<58J}K zk+h5?Y**?^ZvvR!1RP{|4@Y94ZH!SRanPWrc%;p#lG0!1Is->MzR(_`~sQ2&EL)$_4F)mbLlePO+S>o5VPCb4Z6Vawe5l07b=( z3))Eq8|6|gX7+|jmEKo6ALem2jlu(G4v2YOO{wt0nG<53S5?YAaps7K`PGF+Z=5>g z)Ca2?(SIWghnyHX4bQD1&ew9+Ge3_bz-W{w`f#wnV80bsA?TL zFetb@M8GH_^sc^)hqK@29ak;g%`tGpk9InN=lF%evHzC_0%seJs|H z!(YhW=7zdOpOPvUo{`sXR<9Las#wR&Yj&(toSG`tGV@w3>J#M_6$uaJGPZ!Hk3h-43H)|Wu#56NQkLx%nzDwhl^{r1s zz?f$`eMKdrVH^-->jtaM=QXI(0rq=oq!?w#rp6C{Y-@Y;MPp~pjB>Mf25#BVek>!D z%0ZaoU`r&7A^yJxN`b!G?eK92K7UIDqJLteVFH1_-orR_;?RzE9&ek6H+JlejsnsM zW)KM%kDrk)$JVbenzs4Og{HM-Z~7#1egSiGO6_ za2?w}^N)d$;k=Qe z5t)F5Q-J^Mz}2jWtu`Dw6_%AmI&2wn*tJbt9==hWzG4&?56#k^h@kKhvEhAsj%(cI zPqsf#nw)}ff9xi_$l_v|VT bJ{-V23}`K~0Rr`{Y=i)MIYj&i88NeH3Jp#f delta 1173 zcmV;G1Zw-I3jYa^dVhsi%Z?j25WMRv25^p6gg8JBx$P5P*lR2-894?V4kZygA_pW# zTK#>R&mm`;%4Jt#broOT#TIGhXg0+DZM5nB?j&v2e>7wo{{3i9eRJm`o(_jj$zkQ; zo*hWPWVvC_x|fQJLlXnX{eDHXhG0wTNy~amJIQYBncl$vjemn3`O|OBor`^S@T%?Q zWzY4o&W#a~ejgb@fgXtvtk-pg7!eg7A|oou)1a8Xr4S;LLS!Tbp=Hl*3AliX@8cug z(BTFb&_vulyhTofr&=TQBl^s{CsFyX@IK@>HAIiU#b*PT&nwG zb2*kkj8lwsCx$6_#0&ghwC~5ej7eITzXXHg7#y_x_|r_=2%YGO=4WQIi_V#oLNp3 zK#?2Mg7#9Kh~ZMK7Dj|gl`d6!6y`=Xjl!)KUWK_*O{s9Lg=b;zR8`8|YvEmpP1S`a z7n^(7+_9<}(aj1kn^{+l99=EJ-3u#z& z0}k}`AAc?m5g6L{ZvUmG;88E}cK_}1`3t6@nRQoO!D61jwNWTrotdihEgBVEB&KmB zs+xxm3<@p|5ip7fy{|7L;$CJKqcJ5gC0Z?bj|LSViD-<2;iu|;JQ^Pc7l~+Gq-=Rr z!=ql~A0Ii>xF~LBkJAha><|a9Z0V}2DL2uVWPi#|cuR`>%yJTCW?2c;GA}hFiq85& zKNfSy;cw(%V?*Aev!u+0Ir7}i^0mTC8S9vN&Q5uXQ&Xl|W}d4>exlqWLxDceQ8OB7 z#7VEg*OWGzDn1mhg$7jbcU5xv;%^)t_9kC--0R~VZYZ#ib-}VYW(o0vbING6n0k3C^su-;FbkF zYFO2VP%1}Zii0hY(1!SL4Wt5nx7*><4t#t|1fpU`Lk9w%K0`Zn=1`8dbMBg_4|W=i zjsnsMW)KNC9)Iw;7@NO7X}ab+7j{8Ggn!D?tf$ekJA1Hk;gaJ5_KcWOF=Q7JDK(zM zXrS}q{MV9dN5eDwX7O?yHC zpFJYkaCnaG$GmM15zZSqG_(jiVKMEgx(>GM-FzkbI9-sT{TkZ96I>l~&^cNj_J5B0 zy0%D^VjpI$#}<(ZNH_)fW*e?%JGR166vvJ#AeqPZF%@car%x?+;}LK?o0%Q z9}zn~q1mXyf3bGV892x-^VQcNVCr~XH-glI! nZuS6IZV-&;)ny#~Z~*f#ptZ^x2oBV@vK9j9WfSoqL41_VbRaMs diff --git a/doc/html/search.html b/doc/html/search.html index abcccf546..bab736ece 100644 --- a/doc/html/search.html +++ b/doc/html/search.html @@ -147,7 +147,7 @@

        Search

        diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js index 4857dc0ce..8beae41b2 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/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/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"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},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/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/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"],objects:{},objnames:{},objtypes:{},terms:{"04may2000":35,"3rd":5,"5c0":[21,30,35],"break":[15,42],"byte":[17,21,23,27,42],"case":[14,19,21,28,30,32,35,42],"catch":42,"char":[27,35,42],"const":27,"default":[2,3,4,10,11,14,15,17,21,23,29,30,31,32,33,35,41,42,44],"export":45,"final":[0,4,28,29,30,35,41],"function":[0,1,2,4,6,7,19,24,30,34,35,37,41,42,45,46],"import":[27,28,29,30,32,35,39,42],"int":27,"long":[6,10,14,18,21,22,33,35,42,43,46],"new":[4,5,7,19,24,28,29,30,32,35,36,37,38,39,40,41,44,45,47],"null":27,"public":[0,1,4,28,29,31,35,42,44,45,48],"return":[17,27,32,41,46],"short":[2,27,29,37,44],"static":[2,3,10,27,29,42],"super":2,"switch":[5,27,30,32,35,42,44,45],"throw":42,"true":28,"try":[3,4,6,7,20,21,25,27,28,29,30,32,35,46],"var":42,"void":27,"while":[0,4,5,10,16,24,30,32,33,35,39,41,42,47],AND:[19,30,42],ARE:28,Adding:[2,24,47],And:28,CVS:4,DNS:[2,6,42],DOING:28,For:[1,2,3,5,7,15,21,30,31,34,35,37,38,39,41,42,44,45,46,47],IPs:[29,31,37],NFS:23,NOT:[5,28,30,32,34,35,42,46],Not:[6,21,29,38],One:[0,4,28,32,42],THE:3,TLS:[2,3,4,5,29,30,35,42],That:[24,28,30,34,42,48],The:[0,1,2,3,4,5,6,10,11,13,14,15,16,19,21,22,23,24,25,27,28,29,31,32,33,34,35,36,38,41,42,44,45,46,47,48],Their:37,Then:[5,29,30,44],There:[1,3,4,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,29,31,32,33,35,37,41,43,44,47,48],These:[5,11,17,27,30,32,33,34,35,37,43,44,46,48],Use:[16,17,19,21,27,30,35,42],Used:42,Useful:42,Using:[2,4,27,42],WILL:46,With:[0,4,6,15,34,35,41,42,44],YES:7,Yes:7,aaa:[],abcdechannel:42,abil:[2,7,16,31,32,36,42],abl:[3,6,10,15,17,21,30,32,35,39,41,42],abort:[23,30,42,44],about:[2,4,6,24,25,27,28,29,35,42,45,47],abov:[1,4,10,17,19,27,28,29,36,42,43],absolut:[0,31,42,48],abus:[0,2,4],accept:[15,22,24,31,34,35,42,44,47],access:[0,4,16,21,27,28,29,30,36,39,41,42,44,46,47,48],accomplish:3,accord:[1,42,48],accordingli:21,account:[0,2,4,16,18,27,29,30,36,38,40,41,47],accur:[32,42,46],accuraci:32,across:[0,4,34,38,40,42,45],act:[16,27,35,36,42,44],action:[28,29,31,35,42],activ:[2,10,16,30,32,33,39,42,44],actual:[0,4,15,27,28,31,35,39,42],acut:[],add:[3,4,5,7,10,16,17,24,27,28,30,31,32,34,35,36,41,47],add_builtin:27,add_hook:27,add_tcl_command:27,add_tcl_int:27,add_tcl_str:27,added:[0,3,4,5,19,22,24,28,30,32,34,35,36,37,38,41,42,44,46],addhost:17,adding:[4,7,21,27,35,36,38,42],addit:[2,4,5,16,21,30,35,42,44,46],addition:[16,30,32,42],addlang:[35,42],address:[18,22,25,30,34,35,37,44],addus:30,adh:35,adjust:[0,4,17],admin:[35,43],admit:23,advanc:[0,2,4,6,20,28,36],advantag:[5,30,45],advertis:[0,4,42],advis:[3,21,23],affect:[5,10,24,35,36,37,42,47],affet:42,affili:[1,47],after:[3,4,10,16,17,21,27,28,29,32,33,35,42,44,45,47],afterward:[17,35],again:[6,15,25,27,33,34,35,41,42,46],against:[10,15,19,21,28,30,41,42,46],age:42,aggress:34,aka:35,alarm:42,alert:[32,47],algorithm:[19,41],all:[1,5,6,7,10,13,14,15,17,19,21,22,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,44,45,46,47,48],alloc:[27,42],allow:[0,3,4,5,6,7,10,11,15,16,17,18,19,21,22,23,24,27,28,29,30,32,34,35,36,41,42,44,45,47],alltool:35,almost:[0,4,30,33,48],along:[4,15],alphabet:35,alphanumer:47,alreadi:[10,21,27,28,30,31,32,34,35,41,42,47],also:[0,2,3,4,7,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,29,30,33,34,35,36,39,41,42,43,44,45,46,47,48],alt:[21,35],alter:[15,36,42,47],altern:[2,4,16,21,30,31,34,35,42,44],although:[17,30,35,42],altnick:[21,30],altogeth:19,alwai:[0,3,4,10,30,32,33,35,42],amount:[6,35],anachron:31,ani:[0,1,3,4,5,7,12,15,16,17,18,21,22,24,27,28,29,30,33,35,36,39,41,42,44,46,47,48],annoi:28,announc:32,anonym:35,anoth:[0,10,15,17,18,21,22,27,30,34,35,42,43,46],another:5,ansi:42,answer:[0,7,13,16,21,28],any_other_funct:27,anymor:[6,9,19,35],anyon:[10,33,42],anyth:[0,4,15,28,29,30,34,35,39,42,46],anywai:35,anywher:[39,42],aol:[28,41],aop:10,apart:[27,35],api:6,apostroph:39,appear:[29,30,34,35,42,46],append:[27,42],appli:[30,33,35,41,48],applic:[1,35,42],appreci:31,appropri:[3,5,30,35,38,40,41],april:[24,46],apt:[30,31],arbitrari:42,arbitrarili:46,archiv:4,area:[6,15,35,42,45,48],aren:[30,35,42,45,46],arg:27,argument:[15,17,28,29,37,42,46],around:[0,4,24,31,37,42,47],arriv:42,ascii:42,ask:[4,17,29,30,39,42,44],assign:[34,35,42],assist:[2,30,32,44],assoc:[2,6],associ:[24,32,42,47],assum:[21,28,30,31,32,33,35,42],assumpt:38,assur:46,asynchron:[6,14,42],attach:[32,42,46],attack:[10,19,41],attempt:[5,10,16,17,21,24,31,32,33,34,35,42,44,47],attent:[5,21,32,42],attribut:[33,34,42,48],auch:27,aug:42,august:17,auth:[35,44],authent:[2,32,41,42,47],author:[28,31,35,44],auto:[34,48],autobotchk:[3,4,29],autoconf:3,autoconfigur:3,autodetect:44,autohalfop:10,autom:[0,2,4],automat:[2,3,4,5,12,16,21,30,32,33,34,35,36,37,41,42,44,47,48],autoop:10,autosav:12,autovoic:[10,48],avail:[4,10,15,19,25,27,29,30,31,35,36,37,39,42,47],avoid:[6,14,29],awai:[36,38,42],awar:42,awesom:28,b33f:30,baa:42,back:[21,28,30,35,37,40,41,42,45],background:[2,4,28],backslash:30,backup:[5,27],backward:[5,38],bad:[10,42,48],badg:48,badgui:46,ban:[0,2,4,10,17,24,34,35,36,47,48],bandwidth:[6,11],banner:[35,43],bar:42,barr:35,base64:29,base:[4,30,32,35,41,42],basi:30,basic:[2,4,6,7,20,28,30],bask:40,bbb:[],bcst:42,bear:1,becaus:[0,4,16,21,27,28,35,42,45,46,47],becom:[29,30,35,42],been:[0,1,4,5,15,17,21,27,33,35,36,42,46],beerbot:32,befor:[0,4,10,14,16,17,18,21,22,23,27,29,30,32,34,35,42,47],began:38,begin:[16,28,37,42],behalf:42,behav:42,behavior:[13,17,33,35,37,42],behind:35,being:[0,4,10,15,17,21,31,32,36,37,42,46],beldin:34,bell:42,belong:35,below:[10,15,16,22,24,27,28,30,35,41,42,46],best:[2,3,6,16,30,34,42,46],better:[3,4,6,20,30,35],between:[3,6,10,15,18,21,22,31,32,34,35,37,42],beverag:41,big:[5,23,42,45],binari:[3,31],bind:[2,16,17,21,24,27,28,32,35,45,47],birthdai:35,bit:[3,15,24,28,30,31,35,42,44,47],bitch:10,bitchx:42,blank:42,bless:1,blindli:17,bloat:7,block:[23,24,27,30,43,47],blowfish:[1,2,5,6,19,27,35,41,42],bodi:28,bogu:35,bold:[4,42,43,48],boldfac:42,boot:35,bore:[2,4],boston:1,bot:[0,1,3,4,5,6,7,10,12,13,14,16,17,18,19,20,21,22,23,25,27,28,29,30,31,33,35,36,37,38,39,41,43,44,45,46,47,48],bota:34,botaddr:42,botaddress:42,botattr:34,botb:34,botc:34,botchk:[4,29,30],botdir:30,botfl:42,botflag:[2,22],both:[0,4,10,21,23,31,32,34,37,41,42,44],botnam:34,botnet:[0,2,3,4,6,8,10,12,15,21,25,30,36,37,39,41,42,45,48],botnetcentr:43,botnetnick:42,botnetop:10,botnick:[21,28,29,30,35],bottom:28,bottre:2,bounc:17,bound:[16,35,42],boundari:14,box:[30,35],brace:10,bracket:37,branch:[4,40],breach:42,brief:30,broadcast:[24,39,42,46,47],broken:[15,28,35,42],brows:15,brute:19,buf:17,buffer:22,bug:[0,3,4,28,30,40],build:42,built:[2,16,42,45],builtin:[16,42],busi:28,button:[40,47],bypass:42,bywho:42,cach:[14,42],cafil:[35,44],calcul:21,call:[0,3,4,27,28,29,34,35,42,46],callback:32,can:[0,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],cancel:[6,42],cannot:[0,27,30,32,41,42,48],cap:[2,27,32,36,47],cap_net_bind_servic:16,capabl:[2,35,36,42,45,47],capac:47,capath:[35,44],capit:[4,48],caption:[],captur:[30,42,45],care:[35,42,47],carefulli:[30,42],carelessli:5,categori:42,caught:42,caus:[16,30,34,42,45],caution:42,cbc:42,ccht:46,center:43,central:[15,35],cerfif:[],cert:[29,35,44],certain:[33,35,36,37,42,43,46,48],certainli:[24,30,47],certif:[2,3,21,29,31,35,42],certifict:44,cet:35,chaddr:[5,34],chain:[35,44],challeng:[28,29],chan:[5,10,17,28,29,30,45],chanc:30,chanfil:[10,30,45],chang:[1,2,6,9,10,15,17,19,21,22,24,28,30,31,34,35,36,38,39,40,44,46,47],chaninfo:[29,34],chanmod:[10,29],channel:[0,2,4,5,6,8,12,17,20,21,22,24,27,28,30,32,33,34,35,36,39,43,45,47,48],channelflag:42,chanrec:[17,42],chanserv:10,chanset:[10,29,34],charact:[2,10,15,21,30,34,35,37,41],chase:[0,4],chat4:2,chat6:2,chat:[0,2,4,6,13,21,29,30,34,35,36,39,42,44,46,47],chatter:35,chattr:[29,48],check:[2,4,5,10,21,27,28,29,31,35,41,42,44,46],checkout:[30,40],chfinger:35,chghost:[36,38],chjn:42,chmod:[3,35],chof:42,choic:[1,21,28],chon:42,choos:[3,7,29,30,35,36,47],chpass:41,chpt:42,chri:1,chunk:21,cidr:[35,42],cipher:[35,42,44],claim:[24,47],clarifi:33,clean:15,clear:[4,6,40,42,44,46,47],clearchat:[24,46],clearmsg:[24,46],cleartext:42,clemson:48,click:[40,47],client:[15,16,21,24,29,30,32,35,38,42,44,47],cloak:29,clone:[2,4,10,30],close:[27,42],cmd:[35,42],cmd_t:27,cmsg:46,code:[1,2,3,4,7,27,28,42],coder:[],col:43,cold:[40,41],colon:[35,37],color:[4,42],column:43,com:[2,4,5,6,20,21,28,29,30,34,35,41,42,44],combin:[36,42],combo:29,come:[4,6,17,21,30,40,42],comfort:30,comma:[35,39,42],commadlin:30,command:[2,3,6,10,12,15,16,17,20,21,27,28,29,30,31,32,33,34,35,36,37,39,41,44,47,48],commandlin:30,comment:[15,17,25,28,30,35,41],commerci:30,common:[2,21,30,31,34,35,38,44,48],commonli:[29,31,35,42],commun:[2,27,34,39,40,42],compat:[3,5,38,42,46,47],compil:[0,2,3,4,27,30,31,35,37,42,44],complet:[3,4,10,15,22,30,36,42,44,48],compliant:[17,21,42],compon:42,comprehens:46,compress:[2,6,29],compris:38,concurr:[35,41],conf:[3,7,16,29,30,38,42,44],config:[2,3,4,6,7,10,11,12,13,14,16,17,18,19,21,22,23,24,25,27,28,29,31,32,33,34,35,37,41,43,44],configfil:42,configur:[2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,35,37,40,42,44],confirm:[40,42],conflict:16,confus:42,connect:[2,4,5,6,14,15,16,21,24,27,29,30,34,35,37,39,44,47,48],connet:[],consequ:46,consid:[4,30,32,33,35,39,42],consider:41,consist:[34,36,39,42],consol:[2,4,6,10,27,36,39],constantli:27,constitut:[10,21,35],consult:[37,38,44],contact:[28,35],contain:[1,3,4,5,28,30,32,34,35,37,42,44,46],content:[41,42,46],contest:6,context:27,continu:[30,42],contribut:40,control:[0,2,4,17,21,28,29,34,35,36,44,47,48],conv_form:29,conveni:35,convers:[27,39,44],convert:42,cooldud:30,coordin:35,copi:[1,2,5,7,15,23,27,30,42],copyright:[0,1,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],core:[2,3,6,7,17,18,21,27,28,42,45],correct:[3,31,35,41],correctli:[3,42],correspond:[10,29,33,42],cos:10,could:[1,21,28,34,35,37,40,41,42,44,47],couldn:42,count:21,counterpart:42,coupl:42,cours:[3,28,34,35,42],cover:[32,33,34],cpu:[21,35,42],crappi:42,crash:[3,42],creat:[0,3,4,15,16,22,27,28,29,30,33,35,40,41,42,44,45,47],creation:[29,32],credit:[28,42],cron:42,crontab:[2,3,29,42],cross:30,crotab:[],crt:[29,35,44],crypto:41,cryptograph:[19,41,42],crytopgraphi:41,ctcp:[2,6,10,21,29,30,35,42,44],ctcr:42,ctrl:42,curl:30,current:[2,4,6,7,9,15,17,18,19,24,27,29,30,32,35,36,39,42,43,44,46],custom:[16,21,28,29,32,36,42,44],cut:29,cycl:[10,21,35],cygwin:[2,37],daemon:[16,29,35],dai:[18,23,35,42,45],daili:[30,42],dalnet:[4,17,21],danc:42,danger:42,danish:35,data:[4,10,22,27,31,41,42],databas:[15,42],date:[1,4,30,32,35,42],db8:[21,30,35],dcc:[0,2,4,6,15,20,21,23,27,29,30,34,36,37,39,41,45],dead:30,deal:[35,42,48],dealloc:27,deauthent:32,debian:[30,31],debug:[3,25,27,28,35,42,44,46],dec:[15,42],decemb:[0,26,36,39],decent:27,decid:[38,41],decis:47,declar:[28,42],decreas:35,defens:28,defin:[4,6,10,11,13,17,21,27,28,30,32,33,34,35,38,42,48],definit:[28,30,31,41],degrad:47,dehalfop:[10,42,48],del_hook:27,delai:[10,15,17,28],delet:[30,42,45],deliber:44,delimit:42,deliv:42,demand:[0,4],demonstr:[6,26,42],denot:[31,42],deop:[10,42,48],depend:[27,32,33,40,42,44,48],deprec:[5,31,42],deprici:21,depth:[35,44],der:29,deriv:41,desc:[6,27],describ:[27,28,30,31,34,35],descript:[6,27,28,29,35,42,46,48],descriptivebranchnam:40,deserv:28,design:[0,2,4,19,38,46],desir:[7,27,29,30,41],despit:31,dest:[3,6,30,31,35,42,44],destin:[16,27],destroi:[0,4],detail:[3,4,6,27,30,32,42,44,46],detect:[7,21,31,37,42,44],determin:[2,3,16,27,29,30,34,37,42,44],dev:[4,30,31],devel:3,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,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48],devleop:[],dict:[42,46],dictionari:42,did:[1,41],didn:[28,30,42],die:[27,29,30],died:21,differ:[1,3,4,5,10,15,21,28,31,32,35,41,42,45,46],differenti:42,diffutil:3,digest:[19,42],digit:[35,44],dinner:41,dir:[6,29],direct:[7,31,34,40,42],directli:[5,6,10,16,22,30,42],directori:[2,3,4,6,7,23,27,29,30,31,36,40,44,45],disabl:[10,17,21,35,37,42,44],disc:42,discard:[22,42],disclaim:[2,42],disconnect:[21,22,35,42],discontinu:47,discourag:17,discuss:[4,40],disk:[0,23,30,35,36,42],displai:[12,15,17,21,29,30,35,42,43,46],displaynam:27,dispos:42,dissect:28,distinguish:42,distribut:[0,1,4,30],distro:31,dload:23,dns:[6,14,35,42],doc:[0,3,4,5,6,21,28,31,35,39,42,46,47],document:[2,16,28,30,31,34,37,38,40,44,45],doe:[10,24,28,29,32,33,35,38,39,42,46,47,48],doesn:[12,14,17,30,39,42,45,46],doing:[19,21,28,35,42,43],domain:[1,14,34],don:[4,7,10,14,15,17,21,22,24,27,28,29,30,34,35,39,42,44,45],donat:[24,47],done:[5,22,27,29,30,31,34,40,41,42,47],donkei:30,dontkickop:10,dot:39,doubl:21,doubt:37,down:[0,3,4,15,34,42],downer:24,download:[3,4,5,7,15,23,35,36,42],dozen:28,dp_help:27,dp_log:27,dp_mode:27,dp_server:27,dp_stdout:27,dport:16,dprintf:27,drastic:[27,42],driven:42,dronepup:42,drop:[3,4,35,42],dropp:[],dst:6,due:[17,21,28,35,42,46],dump:[21,35,42],duplic:42,dupwait:35,dure:[3,11,22,27,29,30],dynam:[2,3,10,29,30,33,42],dynamicban:[10,42],dynamicexempt:[10,42],dynamicinvit:[10,42],each:[0,4,6,10,15,18,23,28,29,30,32,34,35,36,39,42,45,46,48],earlier:19,easi:[5,28,30,42,44],easier:[3,19],easiest:42,easili:[0,1,2,4,28,36,42],east:35,ebai:35,ecb:42,ecdsa:29,echo:[36,38,45],ecparam:29,eden:42,edit:[2,3,28,45],editor:[29,30],editplu:30,edu:[42,48],effect:[15,33,35,42],effici:[0,4,30,34,35,36],effort:[0,2,4,42],efnet:[4,17,21],egg_lang:35,eggdrop1:7,eggdrop:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,37,38,41,43,44,45,47,48],eggdroptest:[32,46],egggdrop:2,egghead:[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,28,30,33,34,35,36,37,38,39,40,41,42,43,44,45,48],egghelp:[4,30],eight:[35,42],either:[3,4,15,16,29,30,31,32,33,34,35,37,42,44,46],element:42,elimin:29,els:[28,39,42],email:[4,29,35,42],embed:42,emerg:38,emot:46,empti:[42,46],enabl:[0,2,4,7,10,12,15,17,21,23,27,28,30,34,35,36,37,38,44,45,47],enclos:[10,37,42,46],encod:[42,43],encount:[30,47],encourag:[2,30,41],encpass2:41,encrypt:[2,5,6,9,19,29,31,34,36,44],end:[3,27,35,41,42,43],endless:10,enforc:[10,29,32,35],enforceban:10,english:[35,45],enhanc:7,enjoi:41,enlarg:3,enough:35,ensur:[27,29,30,34,41,42],enter:[3,10,15,29,31,35,39,40,41,42,44,46],entir:[30,42,46,47],entitl:48,entri:[3,4,29,30,35],env:35,environ:[16,35,36,44],eof:42,equal:42,equival:[6,21,31],equivil:[],eras:[15,42],error:[4,21,27,30,35,42,47],escap:42,especi:28,essenti:41,est:35,establish:[37,42,44],etc:[0,2,4,10,17,24,27,30,32,34,35,36,42,45,48],eth0:16,ethic:35,etiquett:4,european:35,evalu:42,even:[0,4,7,15,17,27,30,33,34,35,36,39,42,47],event:[0,4,24,27,32,34,35,46,47],eventu:19,ever:[29,30,35,42,44],everi:[0,3,4,10,15,17,21,23,27,28,29,32,33,35,37,41,42,48],everydai:35,everyon:[39,42],everyth:[3,28,42],everywher:[35,37,42],evnt:[21,42],exact:42,exactli:[15,17,27,28,42],examin:27,exampl:[2,3,4,5,7,15,16,21,27,28,29,30,31,35,39,42,44,45,46,47],exceed:35,except:[4,13,21,27,35,42,44],excess:[4,10,21],exchang:29,exclud:42,exclus:[21,42],execut:[2,3,7,27,28,32,42],exempt:[0,1,2,4,10,17,24,34,36,47,48],exhaust:[42,46],exist:[0,4,15,21,27,32,41,42,46,47,48],exit:[4,6,12,15,21,42],expand:[0,2,4],expans:42,expect:[6,13,35,42],experi:[3,15,28,30],experienc:3,expir:[10,17,18,21,33,35,42,44],explain:[10,42],explan:[10,30,31,42,46],explicit:38,explicitli:[5,42,44],express:42,extend:[24,36,38,42],extens:[3,30,32],extern:[16,29,35],extra:[7,35,38],extract:[30,42],f270:30,face:47,fact:[0,4,46],fail:[14,23,35,42,44],failur:[42,46],fake:42,fals:42,famili:35,familiar:[4,28],fanci:41,fancyp:28,far:15,fast:30,faster:42,fastest:4,fatal:42,fault:27,favor:[5,22],featur:[0,2,4,7,10,17,21,22,29,30,32,35,37,38,40,42,44,47,48],februari:13,feel:[4,5,27,40],few:[24,28,30,31,35,42,47],field:[21,32,35,42,44],fifth:1,fight:10,figur:[3,30],fil:42,file:[1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,36,37,41,43,44,48],file_receiv:42,file_send:42,file_send_pend:42,filearea:42,filedb:[15,42],filemask:6,filenam:[6,10,18,30,35,44],filepath:6,files:15,filesi:[2,6,35],filestat:6,filesystem:[15,42,48],fill:[35,40,44],filt:[27,42],find:[3,6,14,17,20,27,28,29,30,39,40,42,47],fine:[17,21,35,46],finger:[13,30],fingerprint:[29,35,44],finish:[4,15,30,42],finnish:35,firewal:35,first:[0,2,4,5,15,19,21,27,28,30,31,34,35,41,42,44,45,46],five:42,fix:[0,3,4,27,35,42],flag:[2,5,6,10,13,17,22,27,28,30,35,36,43],flagmask:46,flash:43,flat:42,flexibl:[42,44],flood:[0,4,10,13,18,21,34,35,36,42,48],floor:1,flud:42,flush:22,focus:[24,47],folder:7,follow:[3,4,5,10,15,17,21,24,27,30,31,34,35,36,38,40,41,42,43,44,45,46,47],foo:[28,29,42],forbid:3,forc:[3,10,12,15,19,22,28,35,37,42],forcefulli:44,forev:35,forget:42,fork:[31,40],form:[0,4,27,28,42,43],format:[7,21,27,29,30,31,35,41,42,43,46],forward:18,found:[2,4,27,35,42,46],foundat:1,four:[10,28,32,35,37,42,43],fourth:28,fprint:[35,44],fragil:42,franklin:1,free:[1,2,5,27],freebsd:37,freeli:[0,4],freenod:21,french:35,frequent:[4,30],fresh:35,fri:42,friend:[10,48],frim:27,from:[0,1,2,3,4,5,6,7,10,15,16,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,37,39,41,43,44,45,46,47,48],front:[10,28,30,31,42,47],ftp:[5,30],full:[3,4,5,24,30,37,42,44,46,47],fuller:1,fulli:[5,35,42,47],fun:[3,47],func:27,func_nam:27,func_tabl:27,function_to_cal:27,further:[29,42],futur:[3,17,30,41,42],fwd:18,gain:[0,4,41,48],game:[0,2,4,24,47],garbag:27,gatewai:[24,46,47],gave:30,gayteen:0,gcc:3,gener:[0,1,3,4,19,24,28,29,30,38,41,42,44,47],genkei:29,genrsa:35,geo:28,german:35,get:[6,7,10,21,22,23,27,28,31,32,35,39,48],geteggdrop:[2,4,30],getinfo:42,getop:10,gif:15,git:[2,3,30,40],github:[2,4,30],give:[3,4,10,15,21,28,30,34,35,36,39,41,42,48],given:[4,14,15,16,30,42,46],global:[2,12,16,17,21,22,27,28,33,34,46,48],globalflag:42,gmt:[35,42],gnu:[0,1,3,4,11],goe:[3,10,29,33,34,39,42,44],going:[0,4,15,21,28,31,32,42],gone:[17,42],goober:42,good:[0,15,21,24,28,30,35,42,47,48],got:42,gpl:[0,4],grab:42,grain:28,grant:[29,36,44,47],graphic:44,greater:42,gree:28,greet:[0,2,4,10,28,32],greetmsg:28,greetscript:28,grep:29,ground:35,group:[15,16,35,38,42],grown:0,gseen:[6,20],guarante:[17,32],guess:17,gui:46,guid:[2,3,28,30,31],gunzip:30,guppi:42,gzip:[11,42],had:[3,5,10,34,35,42,47],haha:4,halfop:[10,42,48],hand:[28,35,42],handi:30,handl:[28,29,33,35,41,44,46],handshak:42,hang:[6,14],happen:[28,30,33,35,42],hard:[28,35],harder:28,hardwar:[0,4],has:[0,1,2,4,5,10,14,15,17,21,28,30,31,32,33,34,35,36,37,41,42,44,46,47,48],hash:[2,5,19,30],hasn:21,hate:48,have:[0,1,3,4,5,6,9,10,12,15,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,36,37,39,41,42,44,45,46,47,48],haven:30,head:35,header:[2,4,27,28,31,44],heaven:3,held:46,hello:[17,21,29,30,35,36,42],help:[0,3,13,21,27,28,29,30,33,34,35,37,39,42,43,48],helper:3,henc:[7,27,42],here:[2,4,10,13,14,15,17,18,21,23,28,29,30,33,34,35,42,45,46],herself:4,hidden:[15,30,36],hide:[6,37,42],high:45,higher:[17,19,22,23,30,44],highest:42,highli:[3,21,30],highlight:48,him:1,himself:4,hint:28,his:[21,30],histor:42,histori:46,hit:42,hold:[22,42],hole:35,home:[3,15,16,29,30,44],hook:27,hook_5minut:27,hook_backup:27,hook_daili:27,hook_di:27,hook_hourli:27,hook_idl:27,hook_load:27,hook_minut:27,hook_num:27,hook_pre_rehash:27,hook_read_userfil:27,hook_rehash:27,hook_secondli:27,hook_userfil:27,hope:[30,47],hopefulli:[3,42],hors:30,host:[0,2,4,10,16,21,24,28,33,34,35,44,46,48],hostmask:[28,29,33,34,36,41],hostnam:[6,10,14,29,35,37],hosttarget:[24,46],hour:[6,25,27,33,35,42],hourli:[18,27,35],how:[0,3,6,10,13,14,15,18,21,22,24,28,29,30,31,33,34,35,42,44,45,46,47],howev:[4,7,13,21,29,31,32,35,41,42,44,45],htgt:46,html:[4,37],http:[2,4,6,20,25,30,32,38],hub:[4,22,30,34,35,41,44],hubbot:31,hubcap:48,humor:29,hup:42,hurt:5,iconfig:[3,7,30],idea:[28,30,40],ideal:[41,47],ident:[2,6,7,17,21,29,35,37,41,42],identd:[16,30],identifi:[29,35,41,42,48],idl:[10,27,42],idx:27,ignor:[0,4,13,21,22,28,34,35,36,42,46],ill:42,imag:4,immedi:[21,30,32,41,42],imperson:16,implement:[6,7,16,31,32,35,38,40,41,42,47],implementatino:31,impli:[1,27],importantli:28,improv:[0,4],inact:[10,23],inc:1,incess:0,includ:[0,2,3,4,7,17,25,27,29,30,31,33,35,36,37,41,42,44,46,47],incom:[15,35,42],increas:[32,35,41],incred:[30,42],independ:7,indic:[21,27,30,42,46],infeas:[24,47],infin:35,infinit:15,info:[3,4,10,12,17,27,30,35],inform:[0,2,3,4,5,6,10,15,25,27,28,29,30,32,34,35,37,38,42,44],infrastructur:44,ing:[17,24,47],init:[21,35,42],init_serv:21,initi:[27,28,30,37,38,42,44],input:42,insecur:10,insensit:42,insert:[10,43],insid:[28,35],instal:[0,4,5,28,29,31,35],instanc:[10,32],instantli:21,instead:[1,4,5,10,15,16,17,22,24,30,35,41,42,44,45,47,48],instruct:[7,30,41],integ:[10,42],integr:2,intend:[3,33,42],intens:21,intent:[24,47],intention:28,interact:[3,4,6,16,17,35,42,44,47],intercept:42,interchang:[31,37],interest:4,interfac:[2,24,42,47],intern:[21,32,35,42,46],internet:[0,4,42,44],interpret:[3,37,42,43],interv:42,introduc:[4,30,42],invalid:42,invers:43,invit:[0,2,4,10,17,24,34,36,38,47],invite:42,invok:42,involv:29,invt:42,ipaddress:42,iptabl:16,ipv4:[30,35,37],ipv4address:42,ipv6:[2,30,35,36,42],ipv6address:42,irc:[0,4,6,15,16,21,24,28,29,30,32,33,34,35,36,37,38,39,42,43,45,46,48],ircawai:42,ircd:[17,21,42],ircii:[23,42],ircnet:[4,10,17,21],ircop:[10,17],ircu2:17,ircv3:[2,32,36,42,45],isn:[6,15,21,22,25,30,33,42],isol:34,isop:10,isoptest:10,isp:30,isset:32,issu:[4,5,16,24,30,32,35,40,42,44,46,47],issuer:44,issupport:32,istn:10,isupport:32,ital:42,item:42,its:[1,2,4,7,10,15,16,17,19,21,22,24,28,30,32,34,35,36,40,42,45,47],itself:[15,27,28,29,35,42],itsself:[],j9irk4vs28b0obz9easys4w2ystji3u:47,jan:[42,44],janitor:[15,48],januari:[1,8,9,12,18,20,23,25,42],jkp:30,job:44,john:1,join:[2,6,10,12,17,18,24,28,30,31,33,35,36,38,39,42,46,47,48],jpk:35,jul:7,juli:0,jump:[21,34,44],jun:45,june:16,jupe:42,just:[0,3,4,5,6,14,15,17,19,22,27,29,30,32,34,35,39,41,42,45,46,47],karma:40,keep:[2,4,10,15,21,23,30,35,47],kei:[2,3,10,17,24,28,29,35,41,46,47],kept:[33,35],keyout:[29,44],keypair:[29,31],kick:[10,17,21,32,35,42,45,48],kicker:42,kiddi:35,kill:[30,42],killer:5,kilobyt:[15,35],kind:42,know:[17,18,21,24,27,28,32,33,34,35,42,45,47],knowledg:0,known:[21,29,35,41,42],kreativrauschen:[6,20],kvirc:44,lag:[35,39],lame:[10,17,34,35,42],lamer:35,lameshar:34,lamest:[10,30,34,35,43],lamestbot:[3,10,18,21,30,34,35,42,43],lang:45,languag:[28,35,36,45],larg:[2,15,17,21,35],larger:[28,41],last:[0,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,30,33,34,35,37,38,39,42,43,44,45,46,48],lastli:42,laston:42,late:42,later:[1,3,6,9,18,19,25,28,30,35,42,44],latest:[4,5,30],launch:30,layer:[29,31],lazi:17,leaf:[34,35,41,44],learn:[17,29,30,35,36,42],least:[4,17,27,30,33,35],leav:[10,21,30,35,39,42,47],left:[17,42],legal:[2,4],len:21,length:[17,21,27,41,42,44],less:[13,39,42],let:[4,6,10,14,18,27,28,30,34,35,36,42],letter:[4,35,48],level:[11,16,29,32,35,48],libera:[2,4,5,21,27,28,29,30],librari:[28,41,44],libssl:[4,30,31],licens:[0,1,4],lieu:42,life:[18,30],light:47,like:[0,1,4,6,9,10,13,15,17,19,27,28,29,30,35,36,37,39,40,41,42,44,46,47,48],limbo:35,limit:[2,6,10,15,17,21,34,37],lindex:42,line:[2,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,34,35,36,41,42,44,45,46,47],link:[0,2,3,4,5,6,7,15,22,23,27,35,36,38,41,44,45],linux:37,list:[0,4,6,10,14,15,19,21,22,24,25,27,28,29,30,31,32,34,35,36,38,39,44,46,47],listen:[29,30,34,35,37,44],liter:[27,42],littl:[3,5,15,24,30,34,45],llama:34,llamabot:[30,35],load:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,34,35,41,42,47],loadmodul:[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,35,41,47],lobster:41,local:[15,28,30,35,39,40,42,44],localfil:6,locat:[2,4,23,28,29,31,35,44],log:[0,2,4,10,19,24,27,30,32,40,41,42,47],logfil:[25,27,30,35,45],logfilenam:35,logflag:35,logic:42,login:[30,35,41,46],logmod:27,logsiz:35,longer:[3,5,15,17,19,27,30,31,42],look:[0,4,5,6,10,20,25,26,28,29,31,32,35,36,41,42,44,47],lookup:[14,35,37,42],lose:10,lost:42,lot:[5,17,28,30,32],low:[21,23],lower:21,lowercas:21,lsa:15,luck:[30,47],lurk:2,mac:37,machin:[3,16,30,35],macro:27,made:[0,1,3,4,5,10,22,40,42,44,47],magic:28,mai:[1,4,5,10,11,15,16,17,23,28,30,34,35,37,38,42,45,46,47],main:[7,28,30,31,32,39],maintain:[2,16,30,32,45,46],mainten:48,major:[27,30,42],make:[0,2,3,4,5,6,7,10,13,15,19,21,22,24,27,28,29,30,31,35,37,38,40,42,44,45,47],makefil:[3,27],making_modulenam:27,man:35,manag:[2,4,6,15,24,31,47],mandatori:42,mani:[4,5,10,14,15,17,21,27,29,30,31,34,35,42],manipul:[2,35],manpag:35,manual:[4,29,34,35,37,42,44,46],mar:37,march:[33,43,48],mark:[15,36,42,48],mask:[15,21,28,35,46],masquerad:35,master:[15,29,30,33,34,35,42,43,48],match:[1,2,10,15,17,27,28,33,35,41,44,46],math:42,matter:[1,14,28,29],max:[15,17,18,21,23,35],maxdepth:[],maxim:35,maximum:[10,14,15,17,18,21,23,35,41,42,44],maxsend:14,mayb:[28,35],mco:[35,42],mcobx:30,md5:[6,9],mean:[15,17,21,28,29,32,33,34,35,36,37,41,42,44,46],meaning:[24,42,47],meaningless:48,measur:21,mechan:29,meet:44,mem:42,member:[10,27,32],memberlist:42,memori:[27,42],mention:27,meridian:35,messag:[4,10,21,27,28,30,32,35,36,38,39,41,43,45,46],method:[4,6,9,16,17,19,24,28,29,30,31,41,45,47],midnight:35,might:[4,17,23,27,35,42,44],migrat:5,militari:35,milk:48,min:35,miniatur:39,minimum:[0,10,42,46],minor:[27,42],minu:10,minut:[4,10,17,23,27,29,30,33,35],mirc:[21,42],misc:[35,42],miscellan:2,misnom:42,miss:[4,30,32,42],mix:[10,17],mkcoblx:35,mkdir:6,mnnrrpp:42,mnot:22,mnt:30,moc:42,mod:[3,6,7,20,24,27,35,42,46],mode:[4,5,10,13,17,21,24,27,29,32,33,35,36,38,47],mode_proc:42,mode_proc_fix:42,modechang:42,moder:[24,29,46,47],modern:[16,41],modes_per_line_max:17,modif:[5,30,42],modifi:[2,6,14,17,28,32,35,42],modul:[0,2,4,30,32,34,36,41,47],modular:2,module_clos:[],module_depend:27,module_entri:27,module_expmem:[],module_find:27,module_load:27,module_nam:27,module_regist:27,module_renam:27,module_report:[],module_start:[],module_t:[],module_undepend:27,module_unload:27,modulenam:[7,27],moment:[17,30,31],monitor:[33,36,38],month:[35,42],moo:42,more:[3,4,5,6,13,15,17,20,27,28,29,30,31,34,35,36,38,40,41,42,44],moreov:35,most:[0,2,4,5,16,17,21,27,28,29,30,31,35,36,39,42,46,47],mostli:[24,42,47],motd:[35,43],mount:23,move:[3,4,15,21,30,42,47],mpj:42,mrlame:[30,35],mrslame:[30,35],msg:[4,6,17,20,21,29,30,35,36,39,41,46],msgid:46,msgm:[21,42],much:[2,3,24,27,30,39,42],multi:30,multipl:[0,2,4,16,28,30,34,35,36,42,46],must:[1,2,3,4,10,14,16,17,21,23,27,29,30,31,32,34,35,41,42,44,46],mydir:15,myownevent123:42,myproc:42,mytag:42,myvar:45,myword:17,name:[3,4,6,8,15,21,27,28,29,30,31,32,35,46],nano:30,nat:[16,35,37],natur:46,nearli:7,necessari:[10,31],necessarili:42,need:[0,3,4,10,14,16,17,21,27,28,29,30,31,32,34,35,37,41,42,44,46,47,48],needal:42,needop:42,neg:[14,35,42],negcach:14,negoti:[42,44],net:[1,3,17,21,24,30,32,38],netbsd:37,nethack:48,netsplit:[16,17,35,36,42],network:[0,2,4,17,21,35,42,43],never:[4,5,10,35,42],new_module_nam:27,newer:[5,30],newhandl:42,newidx:42,newnick:42,newus:[30,35],next:[5,10,15,21,27,28,30,31,35,42],nfree:27,nice:27,nicebot:30,nick:[10,17,21,25,28,29,30,35,48],nicknam:[6,21,28,29,30,32,35,43,45,46,48],nickserv:[2,44],nist256p:29,nkch:42,nmalloc:27,no_irc:[6,21],nobodi:[15,28],node:[29,44],nodesynch:10,noemail:4,non:[3,10,14,16,17,21,27,29,33,34,42,44,47],none:[8,9,10,12,14,18,19,20,21,23,26,42],noout:29,noqueu:42,nor:16,normal:[0,4,6,13,14,15,16,21,27,28,31,35,42,44,45,46,47],notabl:47,notat:35,notc:42,notcproc:42,note:[2,3,6,7,9,10,14,17,19,21,22,27,29,30,32,34,35,41,44,46,47],notebox:42,notefil:[18,42],notepad:30,noth:[27,35,42,47],notic:[2,13,15,28,34,35,42,47],notif:42,notifi:[18,21,30,35,36,38,42],nots:1,nov:34,novemb:[22,38],novic:[0,4],now:[3,5,15,16,17,28,29,30,31,34,35,37,41,42,46,48],ntik:42,number:[2,10,15,17,18,19,21,23,24,27,30,31,34,35,41,42,44,46,47,48],numer:[29,31,42],nxdomain:14,oauth:47,obtain:[2,31,44],obvious:[33,42],occur:[17,28,42],occurr:27,octal:35,octob:[10,19,21,35],off:[10,16,17,21,30,34,35,39,42],offer:[30,31,32,46,47],offici:[2,4],offlin:42,offset:35,often:[4,6,14,29,35,46],oident:16,oidentd:16,okai:35,old:[6,19,21,30],old_module_nam:27,older:[4,37,42],oldest:[2,42],oldhandl:42,omin:28,omit:[42,44],onc:[4,10,15,17,19,21,28,29,30,40,42],one:[4,10,15,16,17,21,27,28,29,30,31,33,34,35,36,39,40,41,42,44,45],ones:[14,22,34,37,42],onjoin:18,onli:[3,4,5,6,7,10,15,16,17,18,20,21,22,25,26,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],onlin:[6,15,18,29,32],opchar:17,open:[16,29,35,39,40,42,44],openbsd:37,openssl:[2,3,4,19,29,30,31,35,44],oper:[13,21,28,35,37,42,43],opped:[10,42,48],opping:[0,4],oppos:42,ops:[10,32,42,48],optim:[6,21],optino:38,option:[1,3,4,7,10,15,16,19,21,29,30,35,44,47],order:[4,14,28,32,35,41,42,44,46],ordinari:[42,44],org:[2,4,5,6,25,28,30,31,34,35,42],origin:[1,21,30,40,42],oss:16,other:[0,1,4,6,9,10,14,15,16,17,18,19,21,22,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48],otherdir:3,otherwis:[3,4,12,15,28,32,33,34,35,37,41,42,44,46],our:[30,34,42],ousterhout:1,out:[0,3,4,23,25,28,29,30,34,35,39,41,42,44],outform:29,outgo:[35,42,45],output:[2,3,27,29,31,41,43,45,46],outsid:[19,31,35],over:[15,21,24,27,28,30,35,37,42,44,45,47],overal:32,overhead:7,overrid:[22,37,44],overridden:17,overwrit:[16,30,42],overwritten:[5,35,42],own:[1,7,15,16,21,22,28,29,30,31,38,42,44,45,47],owner:[4,10,30,35,39,42,48],p_tcl_hash_list:27,packag:[1,3,4,30,31],pad:42,page:[30,40],pai:[5,32,42],pain:[23,30],pair:[29,31,32,42,44,46],paragraph:3,paramet:42,paranoid:[22,35],pars:42,part:[0,4,21,24,28,35,36,42,44,45,47],parti:[2,5,12,30,34,35,36,42,44,48],particular:[5,29,35],partproc:42,partylin:[2,4,6,12,30,31,32,34,35,37,41,42,44,45,46,47,48],pass:[28,29,30,32,37,39,41,46],passiv:34,passthru:35,password:[5,6,9,17,19,21,22,29,30,34,35,36,39,41,44,47],past:[1,4,27,35],patch:[2,37,42],path:[2,3,15,16,30,31,42,44],pathnam:42,patient:15,pbk:41,pbkdf2:[2,5,6,41],peer:[21,35,44],pem:[29,35],penalti:21,pend:[6,10],peopl:[4,10,15,16,17,18,21,22,28,30,35,36,39,42,43,48],per:[17,42,46],percent:43,perfect:32,perform:[0,3,4,5,10,30,42,48],perhap:30,period:[6,14,30,42],perm:35,perman:[10,33,35,42],permiss:[4,35,41],permit:42,perorm:2,persist:30,person:[4,28,30,35,42],phew:30,phrase:42,physic:34,pick:42,pictur:5,pid:[30,35,42],pidfil:35,piec:[3,28],ping:13,pipe:34,pl1:42,place:[1,3,5,7,10,15,17,28,30,33,35,42,44,47],plain:[29,35,44],plaintext:[29,42,44],plan:[4,28,42],platform:[0,4,24,42,47],pleas:[4,5,6,7,9,10,16,19,21,31,35,38,42],plu:[10,21,35,42,44],pmsg:28,point:[3,6,21,26,30,34,35,42],pointer:[1,3,4,36,43],popul:46,popular:[0,4,5,30,35],port:[1,5,14,16,21,22,29,30,31,34,35,37,44],portabl:42,portion:[3,7,10,42],portrang:35,posit:[27,35],posix:42,possibl:[3,10,13,15,21,29,31,35,37,38,39,42,44,46],potenti:[5,16,28,42,46],pour:40,power:[4,36],practic:[41,42],pre:[42,44],preced:[30,42,44],prefer:[35,37,44],prefix:[5,17,21,28,31,35,39,44,46,47],preinit:42,prematur:30,prepar:34,prepend:35,prerehash:42,prerequisit:2,prerestart:42,prerout:16,present:[2,6,28,29,32,37,42,46,47],preserv:30,pretend:47,pretendnet:31,pretti:[0,39],preval:29,prevent:[0,4,10,17,18,24,30,34,37,42,47],previou:[1,3,4,5,19,30,42,47],previous:[5,30,42],primari:[21,35],prime256v1:29,prime:35,printf:27,prior:[3,29,30,32,41,44],prioriti:42,privat:[18,22,28,29,30,31,35,39,42,44],privatekei:[29,31,35,44],privileg:[0,4,16,48],privmsg:[10,28,29,42],probabl:[4,21,29,30,31,42],problem:[30,35,37],proc:[21,27,28,46],proce:42,procedur:[2,22,32,46,48],process:[0,3,4,5,11,15,16,23,29,30,34,41,42,44],procnam:[28,42,46],produc:[35,42],program:[0,2,4,16,29,30],progress:15,prohibit:35,project:[2,40,47],prompt:[3,4,32],promptli:30,proper:[3,37,42],properli:[5,30,31,34,35],protect:[0,2,3,4,10,19,21,29,30,33,35,41,42,44,48],protectfriend:10,protecthalfop:10,protectop:10,protocol:[31,35,38,42,44],prove:30,provid:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,20,21,22,23,24,27,29,30,35,37,38,40,42,44,46,47],pseudo:42,pub:[4,5,21,29,32,42],pubkei:29,publicli:25,publish:35,pubm:[21,42],pull:[4,40,41],punish:[10,42,48],purpos:[0,1,6,25,26,34,35,42],push:[40,42],put:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,30,35,42,44],putlog:[21,27,28],putquick:21,putserv:[10,28,29],putti:29,pwd:[6,30],quakenet:[4,21],qualifi:35,quann:[6,20],queri:[14,16,32,37],question:[4,29],queu:[15,21,42],queue:[21,27],quick:[2,27,30,35],quicker:30,quickli:[2,35],quiet:[21,35,48],quit:[4,6,21,30,35,42],quot:[42,46],quota:35,raid:[24,47],rais:[10,21],ram:35,rand_max:42,random:[10,21,34,42],rang:[30,35],rate:21,rather:[5,42,44],raw:[32,35,44],rawt:42,rcvd:42,reach:[17,21,35],react:[28,32],read:[0,2,3,4,6,7,16,27,28,29,30,31,35,42,43,47],readabl:42,readm:[2,3],readonli:27,real:[21,27,42],realli:[28,30,35,45],realnam:[21,42],reason:[4,27,29,30,34,35],reboot:[16,29],receiv:[14,15,21,23,29,34,42,46],recent:[4,30,42,44],recev:[],recipi:42,recogn:[17,21,29,48],recom:[],recommend:[4,5,10,23,27,30,41,42,45,46],recompil:[17,30],reconnect:[22,42],record:[2,22,27,32,36,48],redirect:16,reduc:[27,46],refer:[27,28,31,35,42],refin:28,reflect:[5,42],refresh:[42,46],regardless:42,regist:[2,10,29],regular:[10,42,44],regularli:36,rehash:[7,27,28,35],reiniti:42,reject:[21,34,35],rejn:42,rejoin:[30,42],rel:[14,27,30,42],relai:[0,4,34,35],relat:[1,6,10,28,37,42],releas:[0,1,30,41,42],relev:[4,27,30],reli:42,reliabl:[32,42,46],relink:34,relinquish:42,rem_builtin:27,rem_tcl_command:27,rem_tcl_int:27,rem_tcl_str:27,remain:[10,33,42],remaind:[15,46],rememb:[10,28,29,30],remind:35,remot:[15,34,35,42,43],remotebotnam:42,remov:[5,10,15,19,27,29,30,33,36,37,41,45,46,47],renam:[2,15,27,30,35,42],render:[5,24,47],repeat:[4,32,42],replac:[10,21,27,29,35,42,43,47],repli:[6,13,14,16,17,32,35,42],replic:[46,47],repo:40,report:[6,15,25,27,30,45],repositori:[4,30],repres:[42,46],req:[29,35,44],request:[0,4,5,7,10,13,15,17,21,30,32,33,35,37,38,40,42,44,45,47],requir:[2,4,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,35,41,44,46],reread:42,resend:[14,42],reserv:[30,35,39],reset:42,resolut:35,resolv:[6,14,35,42],resourc:27,respect:[14,37,42,43],respond:[10,30,42],respons:[21,32,42],rest:[3,27,34,35,41,42,46],restart:[2,3,4,5,7,28,30,35],restrict:[1,15,16,21,35,42,43,47],result:[21,32,33,35,37,42],resum:42,resync:22,retain:42,retri:23,retriev:[6,18],retrydelai:14,reus:[5,42],reveng:10,revengebot:10,revers:[41,42],revert:42,review:[29,31],revis:[0,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,35,37,38,39,42,43,44,45,46,48],revok:[21,35],rfc1459:[38,42],rfc2812:38,rfc:[17,21,24,42,47],rfc_compliant:42,rich:[0,4,30],right:[6,15,16,26,28,30,42],rijndael:19,risk:[1,21],rizon:21,rmdir:6,rmst:46,robei:[1,3,4,36,43,48],robot:36,roomsstat:24,roomstat:[24,47],root:[15,16],round:[19,41],rout:[16,42],routin:[17,35,42],rsa:35,rule:30,run:[2,3,4,5,7,10,16,21,27,28,29,30,31,32,34,35,41,43,44,46],s_client:44,safe:[19,29,30,31,41,47],sai:[4,10,15,28,31,34,42],said:[28,34,42],sake:47,salt:[28,41],same:[0,3,4,5,7,10,11,16,17,27,28,30,32,34,35,38,41,42,43,44,45,46],sampl:[10,30,47],sane:21,sanitycheck:35,sasl:[2,30,36,38],save:[5,6,10,11,12,22,34,35,36,41],scan:30,scenario:[31,32,34],schat:[35,44],schedul:42,scheme:1,scope:31,screen:[4,40,43],script:[0,2,3,4,7,10,21,29,30,33,36,37,42,45,46,47,48],scripter:34,sdcc:44,sdebug:3,seamless:41,seamlessli:19,search:[27,29,42],sec:35,second:[4,10,13,14,17,21,23,27,28,35,45],secondli:42,secret:10,section:[5,10,17,21,24,28,30,34,35,42,47],secur:[0,2,4,6,9,19,29,30,34,35,36,41,42],see:[0,2,3,4,5,6,10,15,17,21,24,25,27,28,29,30,31,32,34,35,37,39,40,41,42,43,46],seen:[2,6,10,32,35,42],selecet:42,select:[4,30,35,36,40,42],self:[2,21,31,35,44],send:[4,6,11,15,17,18,21,22,23,27,28,30,32,34,37,42,45,46],sender:42,sens:[0,4],sensit:41,sent:[6,15,17,22,25,29,32,35,38,39,42,44,46,48],separ:[3,7,21,30,34,35,36,37,38,42,45,46],septemb:14,seri:[30,42,44],serv:35,server:[2,5,6,7,10,13,14,15,16,17,19,24,25,27,29,30,35,36,37,38,44,45,46,47],serverlist:42,serverop:10,serverror:21,servic:[6,10,16,24,29,32,42,44,47],servivc:42,session:[4,37,38],set:[0,1,2,3,5,6,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,31,32,33,34,36,38,39,41,43,45,46,47,48],setcap:16,setnam:[36,38],setup:[4,6,7,30,35],seven:[10,42],sever:[0,4,13,27,30,31,38,42,45],sexystuff:28,sha1:44,sha1sum:29,sha256:19,shall:35,share:[0,2,4,6,10,11,23,27,35,36,42],sharebot:[34,35,42],sharefail:23,she:42,shell:[0,3,4,16,29,30,35,42],shorter:10,should:[1,3,4,5,10,12,13,14,15,17,19,21,22,24,27,28,29,30,34,35,37,39,41,42,44,46,47],shouldn:16,show:[4,6,10,15,25,28,34,35,42],shown:[15,30,35],shutdown:42,shutdownreason:42,side:[35,42,44,47],sidenot:31,sighup:42,sigil:42,sigkil:42,sign:[21,29,31,35,42,43,44,47],signal:42,signific:[4,6],significantli:[32,46],signoff:42,sigquit:42,sigterm:42,silent:35,simialar:[],similar:[4,10,29,30,35,39,40,42,45],similarli:46,simpl:[4,27,28,29,30,42],simpli:[4,5,29,30,31,38,42,47],simplifi:42,simul:[35,42],simultan:[15,23,42],sinc:[0,3,5,17,30,34,35,36,37,42,44,45],singl:[16,17,29,42,46],sit:[0,4,10,35,41],site:[6,48],situat:[32,34],six:42,size:[15,23,27,35,42],skim:4,skip:[30,42],slash:[30,39],slave:34,slennox:30,slow:[15,30,35],slower:35,small:[3,23,34,45],smaller:3,smile:3,snapshot:[2,30],snowbot:15,snt:29,sock:[27,35],socket:[16,27,31,42,44],softwar:[0,1,2,4],solut:41,some:[0,4,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,30,32,33,34,35,36,37,38,42,44,45,47,48],someircnetwork:35,someon:[4,10,17,28,30,31,42,46],someth:[4,28,30,40,42,47],sometim:[4,21,30],somewher:[3,35],song:42,soon:[10,42],sort:[0,4,33],sound:28,sourc:[1,3,4,5,6,7,27,28,31,35,40,42,44,45],space:[0,23,35,38,42],spawn:0,spec:32,special:[34,42],specif:[6,10,14,16,17,19,21,24,30,34,37,38,42,44,46,47,48],specifi:[10,14,15,16,18,21,22,27,29,30,33,35,36,37,41,42,44,46],spectrum:[24,47],spent:[30,42],split:[10,17,37,39,42,43],splt:42,spoiler:47,spoken:42,spoof:16,spread:35,squar:37,squelch:21,src:[3,7,17,27],ssh:30,ssl:[2,3,4,5,21,29,30,31,36,42],sslcert:[3,31,35,44],sslinc:44,ssllib:44,sslport:44,sslsilent:[3,44],sssss:[],stabil:23,stabl:[2,4,30],stack:[17,37,42],stackabl:[],stage:27,stai:42,stall:42,stand:[0,4,30],standard:[14,16,17,23,27,28,38,42,44,47,48],start:[2,3,4,5,6,9,16,19,21,26,28,29,34,35,38,39,41,42,43,46,47],starttl:44,startup:[2,41,42],stat:6,state:[4,42],statement:42,statist:[6,15,25],statu:[0,2,4,10,24,27,31,35,45,46,47],status:32,statuslog:10,stb:21,stdio:27,stdlib:27,stdout:27,stealth:[30,35],step:[2,3,5,27,30,47],stick:33,sticki:[33,42],still:[1,4,5,10,15,22,30,31,32,35,36,42,47],stone:21,stop:[0,10,15,17,27,42,46],stopnethack:[10,48],storag:[6,12,41],store:[5,6,10,12,15,18,24,25,28,30,32,34,41,42,46,47],str_dir:27,str_protect:27,stream:[24,47],street:1,strftime:35,string:[2,17,27,28,29,35,41,46,47],strong:35,strongli:[2,4,30],stuff:[2,4,27,28,30,35,42],style:[33,42],sub:[15,42],subdirectori:[15,42],subject:44,sublist:42,submit:[2,42],subscrib:[46,47],subsequ:42,substitut:[2,35],succeed:42,success:[27,30,42],successfulli:[4,27,42,46],sudo:[16,30],suffic:28,suffici:31,suffix:[7,35],suggest:[5,27],suit:[16,30],suitabl:46,sum:28,summar:21,sun:35,sundai:42,supplant:42,supplementari:32,suppli:35,support:[0,2,3,4,5,6,8,10,11,14,16,17,18,21,22,23,29,30,31,33,35,36,42,45,47],sure:[4,10,27,28,30,31,34,35,42,47],symbol:[31,42],synchron:44,syntax:[5,29,35,44,48],sys:27,system:[2,3,7,14,15,16,27,29,30,35,36,37,42,43,44],tab:27,tabl:[27,38,42],tag:[15,36,38,46],tail:29,take:[3,4,5,6,15,19,21,25,28,30,35,41,42,44],taken:[27,42],takeov:17,talk:[28,31,32,36,39],talli:27,tar:[4,7,30],tarbal:[0,30],target:46,task:[0,2,4,34],tcl:[0,1,2,3,4,6,10,11,21,27,28,30,33,35,36,37,44,45,47],tcl_cmd:27,tcl_int:27,tcl_string:27,tclsh:4,tcltk:4,tcp:[2,16,37],team:[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],technic:47,techniqu:45,tell:[15,28,29,30,31,32,34,35,42,47],telnet:[2,29,30,34,36,37,39,41,42,43,44],temp:42,templat:40,temporari:[10,23,25,33,35],ten:29,term:[2,28,31,42],termin:[4,5,42],test:[28,30,48],text:[4,10,21,27,29,35,43,44,45,46,48],textfil:2,than:[4,10,13,15,17,30,31,35,41,42,44],thank:4,thee:42,thei:[0,3,4,5,7,10,12,13,17,18,21,22,27,28,29,30,31,32,33,34,35,41,42,44,46],them:[0,1,3,4,5,7,10,12,13,14,15,17,18,21,22,23,27,28,29,30,31,34,35,36,37,38,41,42,45,47,48],themselv:[17,30,34,42,45],therebi:[45,47],therefor:[6,17,30,35,42],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,40,41,42,43,44,45,46,47,48],thing:[3,4,6,24,26,27,28,29,34,35,42,47],think:[40,48],third:[28,34],thorough:[27,29,31,47],those:[1,3,7,11,15,21,27,28,29,30,42,45,46,47],though:[15,21,28,30,42,44],thr:35,three:[21,29,32,33,34,35,42],through:[4,10,15,21,24,28,31,36,37,38,39,42,47,48],throughout:27,thse:[],thu:[16,28,32,37,41,42],tidi:27,ties:42,till:[],time:[0,3,4,10,14,15,16,17,19,22,23,28,29,30,31,32,33,34,35,36,38,39,41,43,44,45,47],timeout:[6,14,21,23,35,46],timestamp:[35,42],timezon:35,tip:[2,42],titl:48,tiwtch:6,tls:[42,44],tmi:46,tmp:[23,42],toctre:[],todai:42,togeth:[0,2,4,21,28,34,35,36,38,42],token:47,told:28,ton:24,too:[15,17,21,23,27,35,42],tool:[3,30],top:[3,4,28,40,42],topc:42,topic:47,total:[10,27,36,42],tout:42,toward:28,trace:21,track:[2,3,15,24,27,29,42,47],tradit:[24,37,45,46,47],tradition:16,traffic:[3,35,45],trail:27,transfer:[2,6,7,11,15,22,30,34,35,37,42,44,48],transit:[19,41,42],transmit:21,transpar:35,transport:31,treat:[42,47],tree:[0,4,30],tri:[27,35,42],trick:[28,45],trigger:[10,21,27,28,32,42,46],troubl:[14,35],troubleshoot:[4,30],truncat:46,trust:[4,35,48],ttl:14,turbo:[23,30],turn:[10,16,21,35,42],tutori:[2,31],twcmd:[24,47],twice:42,twitch:[2,6,36],twith:46,two:[4,6,17,22,28,30,32,33,34,35,41,42,44,45],type:[3,4,6,7,10,12,17,21,24,27,28,29,30,31,32,33,34,35,36,37,38,39,44],typic:[15,24,35,36,39,42,47],typo:42,ubuntu:31,ufl:42,ugli:15,uglyman:15,uhost:[28,42],uid:[35,44],umod:21,unabl:[17,30,34,37,42,47],unaccess:36,unavail:[21,35],unban:[10,35,42],unbind:[17,35,45,46],uncertainti:46,uncom:[29,31,35,41],under:[0,4,30,36,42],underli:42,underlin:[42,43],undernet:[4,17,21,42],understand:[35,42],understood:21,unexpect:42,unhid:6,unimport:35,unintend:46,uniqu:[35,42,46],univers:35,unix:[0,3,15,16,30,36],unknown:42,unld:42,unless:[17,21,28,30,33,35,42],unlik:[3,36],unlimit:34,unlink:[23,35],unload:[27,42],unoffici:37,unpack:0,unreach:34,unrealircd:[17,42],unreli:[24,46,47],unrest:0,unset:42,unshar:[6,48],unstick:33,unsticki:33,unstuck:42,unsur:30,untar:5,until:[7,10,15,33,35,42],unzip:[5,30],updat:[4,5,19,27,30,32,35,36,41,42,46],upgrad:[2,41,44],uplink:42,upload:[15,30,36,42,45],upon:[0,4,46,48],upper:14,uptim:[2,6],url:[35,42],usa:1,usabl:[6,15,35],usag:[2,4,6,27,35,42],use:[0,1,3,4,5,6,7,9,10,12,13,14,15,16,17,19,21,22,23,27,28,29,30,31,33,34,35,37,39,41,42,43,44,45,46,47,48],used:[0,2,4,10,11,13,15,19,21,27,28,29,30,31,33,34,35,36,37,39,41,42,43,44,45,46,47,48],useful:[1,4,10,23,30,34,42,44,45],useless:[5,24,47],user:[0,2,3,4,5,6,7,9,10,11,12,13,16,17,18,19,20,21,22,23,24,27,28,30,31,32,33,35,36,37,39,40,41,43,44,45,46,47],userban:10,userexempt:10,userfil:[0,2,4,5,6,9,10,11,19,22,23,27,29,30,34,35,41,42,45],userflag:17,userhost:46,userinfo1:35,userinfo:[13,42],userinvit:10,userlist:[6,17,20,22],usernam:[16,29,30,35,46,47],usernotic:[24,46],userst:[24,47],uses:[3,6,17,21,23,27,28,29,30,31,33,35,41,42,44,47,48],using:[1,3,4,6,7,9,10,15,16,17,19,21,27,28,29,30,33,34,35,37,41,42,44,45,46,47],usrntc:46,usst:46,usual:[4,29,30,31,33,37,40,41,42,44,47],utc:35,util:3,utim:28,vagu:30,vali:42,valiant:[0,4],valid:[3,10,21,27,34,35,36,42,44],valis0:42,valu:[10,13,14,17,21,24,27,28,35,41,43,44,46,47],vari:[42,48],variabl:[2,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,32,35,37,43,46],variable_nam:27,varieti:[0,4],variou:[1,27,30,33,35,42],verbos:42,veri:[4,6,16,20,21,28,35],verif:[21,35,44],verifi:[21,29,35,44],version:[0,1,2,3,4,5,13,17,25,27,28,37,38,43,44,46],vertic:42,vhost4:[30,35,37],vhost6:[30,35,37],vhost:[30,35,37],via:[2,3,4,6,11,16,17,20,22,27,28,29,30,32,33,34,35,36,37,38,39,41,43,44,46,47],video:42,view:[5,7,19,29,30,36,42,46],viewer:46,vim:30,vip:[46,47],virtual:35,visibl:42,visit:[5,47],vista:37,voic:[0,2,4,10,29,42,48],wai:[1,3,4,16,21,24,27,28,29,30,31,32,33,34,35,39,41,42,44,47],wait:[6,14,15,17,21,23,30,32,35,42],walk:31,wall:42,wallop:[35,42],want:[0,3,4,6,10,12,14,15,17,18,21,23,27,28,29,30,34,35,37,42,44,45],war:0,warm:40,warn:[4,16,28,42],warranti:1,washalfop:48,wasn:42,wasop:[10,17,48],wasoptest:10,watch:[39,46],web:[2,6,24,35,46],webpag:2,websit:30,week:42,weekdai:42,welcom:28,well:[1,24,28,29,30,31,32,35,41,42,44,47],were:[1,16,17,30,33,34,35,37,41,42,47],west:35,wget:30,what:[0,1,2,5,6,10,15,17,21,25,28,29,30,35,38,39,41,42],whatev:[1,3,28,35,36,42,43],when:[3,4,6,7,9,10,12,15,16,17,21,22,27,28,29,30,32,33,35,37,39,41,42,44,46,47],whenev:[21,27,32,34,42,44],where:[4,6,10,14,15,18,21,27,28,29,30,31,32,35,36,41,42,44,46],wherea:42,wherev:37,whether:[35,37,42],whew:28,which:[3,5,6,10,12,14,15,16,21,22,27,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],whichev:33,whisper:[24,46],whitespac:42,who:[10,15,17,21,28,30,32,35,39,42,48],whoi:[29,35],whole:27,whose:[33,42],whox:[36,42],why:[28,30,42],wide:[39,44],width:43,wild:42,wildcard:[10,28,29,42,46],window:[2,29,37],wise:[4,35],wish:[3,5,7,16,17,25,27,30,33,34,35,42,46],within:[6,15,27,30,31,33,35,38,42],without:[0,2,4,5,6,9,10,13,19,27,28,29,30,31,34,35,36,38,41,42,44],wizard:31,won:[6,10,22,27,28,30,33,34,35,42,44,46],woobi:[2,3,6,27],word:[15,17,29,30,42,46,47],work:[3,5,6,10,13,15,19,20,22,27,28,29,30,33,34,35,37,38,40,41,42,44,45,46],workaround:[24,32],world:[0,2,4,31,35],worri:24,worth:3,would:[4,5,13,28,29,30,31,32,34,35,42,43,44,46,47],wouldn:35,write:[1,2,6,7,26,30,35,41,42,47],written:[0,27,30,42,47],wrote:28,wspm:46,wspr:46,wth:[],www:[2,4,6,20],x509:[29,35,44],xfer:[23,48],xtra:42,xvf:30,xxd:29,year:[0,4,30,35,42],yes:[28,31,42],yesterdai:35,yet:[4,21,30,35,42],yoru:29,you:[0,1,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,35,36,37,39,40,41,42,43,44,45,46,47,48],you_want_to_export:27,your:[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,34,35,36,37,39,40,41,42,44,47],yourbot:45,yourbranchnam:40,yourconfig:3,youreggdrop:29,youreggdropconfignameher:29,yourself:[7,29,30,40,41,44],yourusernam:40,yyyymmdd:35,zero:42,zip:30,zomg:[],zxvf:30},titles:["About Eggdrop","Boring legal stuff","Eggdrop, an open source IRC bot","Installing Eggdrop","README","Upgrading Eggdrop","Modules included with Eggdrop","Eggdrop Module Information","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","Writing an Eggdrop Module","Writing an Eggdrop Script","Common First Steps","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"],titleterms:{"default":45,"function":[27,47],"int":42,"new":42,"return":42,"short":30,"static":7,"super":30,Adding:34,DNS:14,TLS:[31,44],The:[30,39],Using:[32,34],about:[0,37,38,44],account2nick:42,account:[32,42],accounttrack:42,add:[29,42],addbot:42,addchanrec:42,addit:[27,31],address:42,addus:42,advanc:[35,45],api:24,arg1:42,arg2:42,arg:[42,46],argn:42,assign:29,assoc:[8,42],authent:[29,44],automat:29,background:41,backup:42,ban:[33,42],banlist:42,banmask:42,base64:42,basic:35,best:32,bind:[42,46],block:42,blowfish:9,boot:42,bore:1,bot:[2,15,34,42],botattr:42,botflag:34,botishalfop:42,botisop:42,botisvoic:42,botlist:42,botnam:42,botnet:[5,31,34,35,44],botnick:42,botonchan:42,botport:42,bottre:34,callev:42,can:[2,7],cancel:15,cap:[38,42],capabl:[32,38],certif:44,chan:[42,46],chanban:42,chandname2nam:42,chanexempt:42,chanflag:42,chang:[5,42],chaninvit:42,chanlist:42,channame2dnam:42,channel:[10,15,29,42,46],chansettyp:42,charact:42,chat4:37,chat6:37,chat:37,chattr:42,check:32,chhandl:42,clear:15,clearqueu:42,cmd:46,command:[4,5,24,42,45,46],comment:42,common:29,commun:31,compil:7,compress:[11,42],compressfil:42,config:[5,15,30,42,45,47],configur:[29,30,31,41],configurearg:42,connect:[31,42],consol:[12,35,42],control:42,core:35,count:42,countus:42,creator:42,crontab:4,ctcp:[13,37],ctime:42,cygwin:3,dcc:[35,42,44],dccbroadcast:42,dccdumpfil:42,dcclist:42,dccputchan:42,dccsend:42,dccsimul:42,dccuse:42,decrypt:42,delchanrec:42,delhost:42,deludef:42,delus:42,desc:[15,42],descript:15,dest:15,destin:42,determin:32,develop:4,die:42,dir:[15,42],directori:[15,35,42],disclaim:47,dname:42,dnslookup:42,docker:4,document:[4,5],download:30,dst:15,dumpfil:42,durat:42,dynam:7,echo:42,edit:[30,47],effort:32,eggdrop:[0,2,3,4,5,6,7,27,28,29,30,31,32,35,36,40,42,46],enabl:[31,32,41,42],encpass:42,encrypt:[41,42],entri:42,erasenot:42,event:42,exampl:34,execut:35,exempt:[33,42],exemptlist:42,exemptmask:42,extend:32,extra:42,featur:36,file:[5,15,30,31,35,42,45,47],filemask:15,filenam:[15,42],filepath:15,fileresend:42,filesend:42,filesi:[15,42],filestat:15,find:2,findus:42,first:29,flag:[15,29,34,42,46,48],flushmod:42,formatstr:42,from:42,ftp:4,gener:31,get:[2,4,15,30,42],getaccount:42,getchan:42,getchanhost:42,getchanidl:42,getchaninfo:42,getchanjoin:42,getchanmod:42,getdccawai:42,getdccidl:42,getdesc:42,getdir:42,getfil:42,getfileq:42,getfilesendtim:42,getflag:42,getlink:42,getown:42,getpwd:42,getudef:42,getus:42,git:4,github:40,global:42,hand2idx:42,hand2nick:42,handl:42,handlen:42,handonchan:42,haschanrec:42,hash:41,help:[2,4],helpfil:42,hide:15,histori:30,host:[29,42],hostmask:42,hostnam:42,how:[2,4,5,7],hybrid:41,ident:16,idx2hand:42,idx:42,ignorelist:42,includ:6,info:42,inform:[7,31],instal:[2,3,7,30,37,44],interfac:41,invit:[33,42],invitelist:42,invitemask:42,ipv6:37,irc:[2,17,31,44,47],ircnick:42,ircv3:38,isawai:42,isban:42,isbansticki:42,isbotnick:42,ischanban:42,ischanexempt:42,ischaninvit:42,ischanjup:42,iscompress:42,isdynam:42,isexempt:42,isexemptsticki:42,ishalfop:42,isidentifi:42,isignor:42,isinvit:42,isinvitesticki:42,isircbot:42,isjup:42,islink:42,ismod:46,isop:42,ispermban:42,ispermexempt:42,isperminvit:42,isset:42,istl:42,isupport:42,isvip:46,isvoic:42,join:[29,32],jump:42,keep:45,kei:[31,42,44],keyword:42,killassoc:42,killban:42,killchanban:42,killchanexempt:42,killchaninvit:42,killdcc:42,killexempt:42,killignor:42,killinvit:42,killtim:42,killutim:42,languag:42,lastbind:42,legal:1,level:42,lifetim:42,limit:[24,42,47],line:[4,39],link:[34,42],list:42,listen:[31,42],listnot:42,loadchannel:42,loadhelp:42,loadmodul:[7,42],localfil:15,locat:30,log:[29,35,45],logfil:42,make:34,manipul:42,mask:42,maskhost:42,masktyp:42,match:42,matchaddr:42,matchattr:42,matchban:42,matchcidr:42,matchexempt:42,matchinvit:42,matchstr:42,md5:42,messag:42,minut:42,miscellan:42,mkdir:[15,42],mode:42,modifi:45,modul:[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,35,42],modular:45,module_clos:27,module_expmem:27,module_report:27,module_start:27,module_t:27,monitor:42,more:2,msg:42,must:5,myip:42,name:42,need:7,newban:42,newchanban:42,newchanexempt:42,newchaninvit:42,newexempt:42,newignor:42,newinvit:42,newnam:42,nick2hand:42,nick:[42,46],nicknam:[15,42],nickserv:29,note:[18,42],notic:4,notifi:32,numberlist:42,numvers:42,obtain:4,old:42,oldnam:42,onchan:42,onchansplit:42,onelin:42,onlin:42,open:2,optim:15,option:42,output:42,own:[],parti:39,partylin:[15,24,29],pass:42,passwdok:42,password:42,patch:40,path:35,pattern:42,pbkdf2:19,pend:15,permiss:29,port:42,pre:[2,4,31],prefix:42,prepar:31,prerequisit:30,proc:42,procedur:42,protect:31,pushmod:42,putallbot:42,putbot:42,putcmdlog:42,putdcc:42,puthelp:42,putkick:42,putlog:42,putloglev:42,putnow:42,putquick:42,putserv:42,putxferlog:42,pwd:15,queue:42,queuesiz:42,quick:[3,4],quit:15,rand:42,raw:42,read:5,readm:4,reason:42,record:[34,42],refreshchan:42,regist:47,rehash:42,reload:42,reloadhelp:42,remov:42,renam:45,renudef:42,req:42,requir:[3,27,32,42],requisit:[2,4,31],resetban:42,resetchan:42,resetchanidl:42,resetchanjoin:42,resetconsol:42,resetexempt:42,resetinvit:42,restart:[29,42],rfcequal:42,rmdir:[15,42],roomstat:46,sasl:29,save:42,savechannel:42,script:[5,28,32,35,44],second:42,secur:[31,44],seen:20,self:45,sendnot:42,server:[21,31,32,42],serveraddress:42,set:[4,29,30,35,37,42,44],setchan:42,setchaninfo:42,setdccawai:42,setdesc:42,setflag:42,setlink:42,setown:42,setpwd:42,setudef:42,setup:15,setus:42,share:[15,22,34],show:30,snapshot:4,socklist:42,solo:41,some:2,sourc:[2,15,30],src:42,ssl:[35,44],stackabl:42,start:30,starttl:42,startup:[3,4],stat:15,statu:[32,42],step:29,stickban:42,stickexempt:42,stickinvit:42,still:7,storenot:42,str:42,strftime:42,string1:42,string2:42,string:[42,45],strip:42,stripcod:42,stuff:1,submit:40,substitut:43,support:[32,37,38,44],system:4,tag:[32,42],tagmsg:42,target:42,tcl:[5,24,32,41,42,46],tcp:42,telnet:35,term:34,text:42,textfil:43,thing:2,time:42,timer:42,timerid:[],timernam:42,tip:45,tlsstatu:42,topic:42,track:32,traffic:42,transfer:23,twcmd:46,twitch:[24,46,47],twitchmod:46,twitchvip:46,type:[42,46],unam:42,unbind:42,uncompressfil:42,unhid:15,unixtim:42,unlink:42,unloadhelp:42,unloadmodul:42,unshar:15,unstickban:42,unstickexempt:42,unstickinvit:42,upgrad:[4,5],uptim:[25,42],usag:[15,37,38,41,44],use:[],user:[15,29,34,42,48],userlist:42,userport:42,userst:46,utim:42,validchan:42,valididx:42,validus:42,valu:42,variabl:[42,45],version:[30,42],via:[40,42],washalfop:42,wasop:42,web:47,what:[4,7,27,34],where:2,whom:42,whox:32,why:[],window:3,without:7,woobi:26,write:[27,28],you:2,your:45}}) \ 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/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/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"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},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/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/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"],objects:{},objnames:{},objtypes:{},terms:{"04may2000":35,"3rd":5,"5c0":[21,30,35],"break":[15,42],"byte":[17,21,23,27,42],"case":[14,19,21,28,30,32,35,42],"catch":42,"char":[27,35,42],"const":27,"default":[2,3,4,10,11,14,15,17,21,23,29,30,31,32,33,35,41,42,44],"export":45,"final":[0,4,28,29,30,35,41],"function":[0,1,2,4,6,7,19,24,30,34,35,37,41,42,45,46],"import":[27,28,29,30,32,35,39,42],"int":27,"long":[6,10,14,18,21,22,33,35,42,43,46],"new":[4,5,7,19,24,28,29,30,32,35,36,37,38,39,40,41,44,45,47],"null":27,"public":[0,1,4,28,29,31,35,42,44,45,48],"return":[17,27,32,41,46],"short":[2,27,29,37,44],"static":[2,3,10,27,29,42],"super":2,"switch":[5,27,30,32,35,42,44,45],"throw":42,"true":28,"try":[3,4,6,7,20,21,25,27,28,29,30,32,35,46],"var":42,"void":27,"while":[0,4,5,10,16,24,30,32,33,35,39,41,42,47],AND:[19,30,42],ARE:28,Adding:[2,24,47],And:28,CVS:4,DNS:[2,6,42],DOING:28,For:[1,2,3,5,7,15,21,29,30,31,34,35,37,38,39,41,42,44,45,46,47],IPs:[29,31,37],NFS:23,NOT:[5,28,30,32,34,35,42,46],Not:[6,21,29,38],One:[0,4,28,32,42],THE:3,TLS:[2,3,4,5,29,30,35,42],That:[24,28,30,34,42,48],The:[0,1,2,3,4,5,6,10,11,13,14,15,16,19,21,22,23,24,25,27,28,29,31,32,33,34,35,36,38,41,42,44,45,46,47,48],Their:37,Then:[5,29,30,44],There:[1,3,4,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,29,31,32,33,35,37,41,43,44,47,48],These:[5,11,17,27,30,32,33,34,35,37,43,44,46,48],Use:[16,17,19,21,27,30,35,42],Used:42,Useful:42,Using:[2,27,42],WILL:46,With:[0,4,6,15,34,35,41,42,44],YES:7,Yes:[7,29],aaa:[],abcdechannel:42,abil:[2,7,16,31,32,36,42],abl:[3,6,10,15,17,21,30,32,35,39,41,42],abort:[23,30,42,44],about:[2,4,6,24,25,27,28,29,35,42,45,47],abov:[1,4,10,17,19,27,28,29,36,42,43],absolut:[0,31,42,48],abus:[0,2,4],accept:[15,22,24,31,34,35,42,44,47],access:[0,4,16,21,27,28,29,30,36,39,41,42,44,46,47,48],accomplish:3,accord:[1,42,48],accordingli:21,account:[0,2,4,16,18,27,29,30,36,38,40,41,47],accur:[32,42,46],accuraci:32,acknowledg:29,across:[0,4,34,38,40,42,45],act:[16,27,35,36,42,44],action:[28,29,31,35,42],activ:[2,10,16,30,32,33,39,42,44],actual:[0,4,15,27,28,31,35,39,42],acut:[],add:[3,4,5,7,10,16,17,24,27,28,30,31,32,34,35,36,41,47],add_builtin:27,add_hook:27,add_tcl_command:27,add_tcl_int:27,add_tcl_str:27,added:[0,3,4,5,19,22,24,28,30,32,34,35,36,37,38,41,42,44,46],addhost:17,adding:[7,21,27,35,36,38,42],addit:[2,4,5,16,21,30,35,42,44,46],addition:[16,30,32,42],addlang:[35,42],address:[18,22,25,30,34,35,37,44],addus:30,adh:35,adjust:[0,4,17],admin:[35,43],admit:23,advanc:[0,2,4,6,20,28,36],advantag:[5,30,45],advertis:[0,4,42],advis:[3,21,23],affect:[5,10,24,35,36,37,42,47],affet:42,affili:[1,47],after:[3,4,10,16,17,21,27,28,29,32,33,35,42,44,45,47],afterward:[17,35],again:[6,15,25,27,33,34,35,41,42,46],against:[10,15,19,21,28,30,41,42,46],age:42,aggress:34,aka:35,alarm:42,alert:[32,47],algorithm:[19,41],all:[1,5,6,7,10,13,14,15,17,19,21,22,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,44,45,46,47,48],alloc:[27,42],allow:[0,3,4,5,6,7,10,11,15,16,17,18,19,21,22,23,24,27,28,29,30,32,34,35,36,41,42,44,45,47],alltool:35,almost:[0,4,30,33,48],along:[4,15],alphabet:35,alphanumer:47,alreadi:[10,21,27,28,30,31,32,34,35,41,42,47],also:[0,2,3,4,7,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,29,30,33,34,35,36,39,41,42,43,44,45,46,47,48],alt:[21,35],alter:[15,36,42,47],altern:[2,4,16,21,30,31,34,35,42,44],although:[17,30,35,42],altnick:[21,30],altogeth:19,alwai:[0,3,4,10,30,32,33,35,42],amount:[6,35],anachron:31,ani:[0,1,3,4,5,7,12,15,16,17,18,21,22,24,27,28,29,30,33,35,36,39,41,42,44,46,47,48],annoi:28,announc:32,anonym:35,anoth:[0,10,15,17,18,21,22,27,30,34,35,42,43,46],another:5,ansi:42,answer:[0,7,13,16,21,28],any_other_funct:27,anymor:[6,9,19,35],anyon:[10,33,42],anyth:[0,4,15,28,29,30,34,35,39,42,46],anywai:35,anywher:[39,42],aol:[28,41],aop:10,apart:[27,35],api:6,apostroph:39,appear:[29,30,34,35,42,46],append:[27,42],appli:[30,33,35,41,48],applic:[1,35,42],appreci:31,appropri:[3,5,30,35,38,40,41],april:[24,46],apt:[30,31],arbitrari:42,arbitrarili:46,archiv:4,area:[6,15,35,42,45,48],aren:[30,35,42,45,46],arg:27,argument:[15,17,28,29,37,42,46],around:[0,4,24,31,37,42,47],arriv:42,ascii:42,ask:[4,17,29,30,39,42,44],assign:[34,35,42],assist:[2,30,32,44],assoc:[2,6],associ:[24,32,42,47],assum:[21,28,30,31,32,33,35,42],assumpt:38,assur:46,asynchron:[6,14,42],attach:[32,42,46],attack:[10,19,41],attempt:[4,5,10,16,17,21,24,31,32,33,34,35,42,44,47],attent:[5,21,32,42],attribut:[33,34,42,48],auch:27,aug:42,august:17,auth:[35,44],authent:[2,32,41,42,47],author:[28,31,35,44],auto:[2,3,34,48],autobotchk:[3,4,29],autoconf:3,autoconfigur:3,autodetect:44,autohalfop:10,autom:[0,2,4],automat:[2,3,4,5,12,16,21,30,32,33,34,35,36,37,41,42,44,47,48],autoop:10,autosav:12,autovoic:[10,48],avail:[4,10,15,19,25,27,29,30,31,35,36,37,39,42,47],avoid:[6,14,29],awai:[36,38,42],awar:42,awesom:28,b33f:30,baa:42,back:[21,28,30,35,37,40,41,42,45],background:[2,4,28],backslash:30,backup:[5,27],backward:[5,38],bad:[10,42,48],badg:48,badgui:46,ban:[0,2,4,10,17,24,34,35,36,47,48],bandwidth:[6,11],banner:[35,43],bar:42,barr:35,base64:29,base:[4,30,32,35,41,42],basi:30,basic:[2,4,6,7,20,28,30],bask:40,bbb:[],bcst:42,bear:1,becaus:[0,4,16,21,27,28,35,42,45,46,47],becom:[29,30,35,42],been:[0,1,4,5,15,17,21,27,33,35,36,42,46],beerbot:32,befor:[0,4,10,14,16,17,18,21,22,23,27,29,30,32,34,35,42,47],began:38,begin:[16,28,37,42],behalf:42,behav:42,behavior:[13,17,33,35,37,42],behind:35,being:[0,4,10,15,17,21,31,32,36,37,42,46],beldin:34,bell:42,belong:35,below:[10,15,16,22,24,27,28,30,35,41,42,46],best:[2,3,6,16,30,34,42,46],better:[3,4,6,20,29,30,35],between:[3,6,10,15,18,21,22,31,32,34,35,37,42],beverag:41,big:[5,23,42,45],binari:[3,31],bind:[2,16,17,21,24,27,28,32,35,45,47],birthdai:35,bit:[3,15,24,28,30,31,35,42,44,47],bitch:10,bitchx:42,blank:42,bless:1,blindli:17,bloat:7,block:[23,24,27,30,43,47],blowfish:[1,2,5,6,19,27,35,41,42],bodi:28,bogu:35,bold:[4,42,43,48],boldfac:42,boot:[4,35],bore:[2,4],boston:1,bot:[0,1,3,4,5,6,7,10,12,13,14,16,17,18,19,20,21,22,23,25,27,28,29,30,31,33,35,36,37,38,39,41,43,44,45,46,47,48],bota:34,botaddr:42,botaddress:42,botattr:34,botb:34,botc:34,botchk:[4,29,30],botdir:30,botfl:42,botflag:[2,22],both:[0,4,10,21,23,31,32,34,37,41,42,44],botnam:[29,34],botnet:[0,2,3,4,6,8,10,12,15,21,25,30,36,37,39,41,42,45,48],botnetcentr:43,botnetnick:42,botnetop:10,botnick:[21,28,29,30,35],bottom:28,bottre:2,bounc:17,bound:[16,35,42],boundari:14,box:[30,35],brace:10,bracket:37,branch:[4,40],breach:42,brief:30,broadcast:[24,39,42,46,47],broken:[15,28,35,42],brows:15,brute:19,buf:17,buffer:22,bug:[0,3,4,28,30,40],build:42,built:[2,16,42,45],builtin:[16,42],busi:28,button:[40,47],bypass:42,bywho:42,cach:[14,42],cafil:[35,44],calcul:21,call:[0,3,4,27,28,29,34,35,42,46],callback:32,can:[0,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],cancel:[6,42],cannot:[0,27,30,32,41,42,48],cap:[2,27,32,36,47],cap_net_bind_servic:16,capabl:[2,35,36,42,45,47],capac:47,capath:[35,44],capit:[4,48],caption:[],captur:[30,42,45],care:[35,42,47],carefulli:[30,42],carelessli:5,categori:42,caught:42,caus:[16,30,34,42,45],caution:42,cbc:42,ccht:46,center:43,central:[15,35],cerfif:[],cert:[29,35,44],certain:[33,35,36,37,42,43,46,48],certainli:[24,30,47],certif:[2,3,21,29,31,35,42],certifict:44,cet:35,chaddr:[5,34],chain:[35,44],challeng:[28,29],chan:[5,10,17,28,29,30,45],chanc:30,chanfil:[10,30,45],chang:[1,2,6,9,10,15,17,19,21,22,24,28,30,31,34,35,36,38,39,40,44,46,47],chaninfo:[29,34],chanmod:[10,29],channel:[0,2,4,5,6,8,12,17,20,21,22,24,27,28,30,32,33,34,35,36,39,43,45,47,48],channelflag:42,chanrec:[17,42],chanserv:10,chanset:[10,29,34],charact:[2,10,15,21,30,34,35,37,41],chase:[0,4],chat4:2,chat6:2,chat:[0,2,4,6,13,21,29,30,34,35,36,39,42,44,46,47],chatter:35,chattr:[29,48],check:[2,4,5,10,21,27,28,29,31,35,41,42,44,46],checkout:[30,40],chfinger:35,chghost:[36,38],chjn:42,chmod:[3,35],chof:42,choic:[1,21,28],chon:42,choos:[3,7,29,30,35,36,47],chpass:41,chpt:42,chri:1,chunk:21,cidr:[35,42],cipher:[35,42,44],claim:[24,47],clarifi:33,clean:15,clear:[4,6,40,42,44,46,47],clearchat:[24,46],clearmsg:[24,46],cleartext:42,clemson:48,click:[40,47],client:[15,16,21,24,29,30,32,35,38,42,44,47],cloak:29,clone:[2,4,10,30],close:[27,42],cmd:[35,42],cmd_t:27,cmsg:46,code:[1,2,3,4,7,27,28,42],coder:[],col:43,cold:[40,41],colon:[35,37],color:[4,42],column:43,com:[2,4,5,6,20,21,28,29,30,34,35,41,42,44],combin:[36,42],combo:[],come:[4,6,17,21,29,30,40,42],comfort:30,comma:[35,39,42],commadlin:30,command:[2,3,6,10,12,15,16,17,20,21,27,28,29,30,31,32,33,34,35,36,37,39,41,44,47,48],commandlin:30,comment:[15,17,25,28,30,35,41],commerci:30,common:[2,21,30,31,34,35,38,44,48],commonli:[29,31,35,42],commun:[2,27,34,39,40,42],compat:[3,5,38,42,46,47],compil:[0,2,3,4,27,30,31,35,37,42,44],complet:[3,4,10,15,22,30,36,42,44,48],compliant:[17,21,42],compon:42,comprehens:46,compress:[2,6,29],compris:38,concurr:[35,41],conf:[3,7,16,29,30,38,42,44],config:[2,3,4,6,7,10,11,12,13,14,16,17,18,19,21,22,23,24,25,27,28,29,31,32,33,34,35,37,41,43,44],configfil:42,configur:[2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,35,37,40,42,44],confirm:[40,42],conflict:16,confus:[29,42],connect:[2,4,5,6,14,15,16,21,24,27,29,30,34,35,37,39,44,47,48],connet:[],consequ:46,consid:[4,30,32,33,35,39,42],consider:41,consist:[34,36,39,42],consol:[2,4,6,10,27,36,39],constantli:27,constitut:[10,21,35],consult:[29,37,38,44],contact:[28,35],contain:[1,3,4,5,28,30,32,34,35,37,42,44,46],content:[41,42,46],contest:6,context:27,continu:[30,42],contribut:40,control:[0,2,4,17,21,28,29,34,35,36,44,47,48],conv_form:29,conveni:35,convers:[27,39,44],convert:42,cooldud:30,coordin:35,copi:[1,2,5,7,15,23,27,30,42],copyright:[0,1,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],core:[2,3,6,7,17,18,21,27,28,42,45],correct:[3,31,35,41],correctli:[3,42],correspond:[10,29,33,42],cos:10,could:[1,21,28,34,35,37,40,41,42,44,47],couldn:42,count:21,counterpart:42,coupl:42,cours:[3,28,34,35,42],cover:[32,33,34],cpu:[21,35,42],crappi:42,crash:[3,4,42],creat:[0,3,4,15,16,22,27,28,29,30,33,35,40,41,42,44,45,47],creation:[29,32],credit:[28,42],cron:42,crontab:[3,4,42],cross:30,crotab:[],crt:[29,35,44],crypto:41,cryptograph:[19,41,42],crytopgraphi:41,ctcp:[2,6,10,21,29,30,35,42,44],ctcr:42,ctrl:42,curl:30,current:[2,4,6,7,9,15,17,18,19,24,27,29,30,32,35,36,39,42,43,44,46],custom:[16,21,28,29,32,36,42,44],cut:29,cycl:[10,21,35],cygwin:[2,37],daemon:[16,35],dai:[18,23,35,42,45],daili:[30,42],dalnet:[4,17,21],danc:42,danger:42,danish:35,data:[4,10,22,27,31,41,42],databas:[15,42],date:[1,4,30,32,35,42],db8:[21,30,35],dcc:[0,2,4,6,15,20,21,23,27,29,30,34,36,37,39,41,45],dead:30,deal:[35,42,48],dealloc:27,deauthent:32,debian:[30,31],debug:[3,25,27,28,35,42,44,46],dec:[15,42],decemb:[0,26,36,39],decent:27,decid:[38,41],decis:47,declar:[28,42],decreas:35,defens:28,defin:[4,6,10,11,13,17,21,27,28,30,32,33,34,35,38,42,48],definit:[28,30,31,41],degrad:47,dehalfop:[10,42,48],del_hook:27,delai:[10,15,17,28],delet:[30,42,45],deliber:44,delimit:42,deliv:42,demand:[0,4],demonstr:[6,26,42],denot:[31,42],deop:[10,42,48],depend:[27,32,33,40,42,44,48],deprec:[5,31,42],deprici:21,depth:[35,44],der:29,deriv:41,desc:[6,27],describ:[27,28,30,31,34,35],descript:[6,27,28,29,35,42,46,48],descriptivebranchnam:40,deserv:28,design:[0,2,4,19,38,46],desir:[7,27,29,30,41],despit:31,dest:[3,6,30,31,35,42,44],destin:[16,27],destroi:[0,4],detail:[3,4,6,27,30,32,42,44,46],detect:[7,21,31,37,42,44],determin:[2,3,16,27,29,30,34,37,42,44],dev:[4,30,31],devel:3,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,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48],devleop:[],dict:[42,46],dictionari:42,did:[1,29,41],didn:[28,30,42],die:[27,29,30],died:21,differ:[1,3,4,5,10,15,21,28,31,32,35,41,42,45,46],differenti:42,diffutil:3,digest:[19,42],digit:[35,44],dinner:41,dir:[6,29],direct:[7,31,34,40,42],directli:[5,6,10,16,22,30,42],directori:[2,3,4,6,7,23,27,29,30,31,36,40,44,45],disabl:[10,17,21,29,35,37,42,44],disc:42,discard:[22,42],disclaim:[2,42],disconnect:[21,22,35,42],discontinu:47,discourag:17,discuss:[4,40],disk:[0,23,30,35,36,42],displai:[12,15,17,21,29,30,35,42,43,46],displaynam:27,dispos:42,dissect:28,distinguish:42,distribut:[0,1,4,30],distro:31,dload:23,dns:[6,14,35,42],doc:[0,3,4,5,6,21,28,31,35,39,42,46,47],document:[2,16,28,30,31,34,37,38,40,44,45],doe:[10,24,28,29,32,33,35,38,39,42,46,47,48],doesn:[12,14,17,30,39,42,45,46],doing:[19,21,28,35,42,43],domain:[1,14,34],don:[4,7,10,14,15,17,21,22,24,27,28,29,30,34,35,39,42,44,45],donat:[24,47],done:[5,22,27,29,30,31,34,40,41,42,47],donkei:30,dontkickop:10,dot:39,doubl:21,doubt:37,down:[0,3,4,15,34,42],downer:24,download:[3,4,5,7,15,23,35,36,42],dozen:28,dp_help:27,dp_log:27,dp_mode:27,dp_server:27,dp_stdout:27,dport:16,dprintf:27,drastic:[27,42],driven:42,dronepup:42,drop:[3,4,35,42],dropp:[],dst:6,due:[17,21,28,35,42,46],dump:[21,35,42],duplic:42,dupwait:35,dure:[3,11,22,27,29,30],dynam:[2,3,10,29,30,33,42],dynamicban:[10,42],dynamicexempt:[10,42],dynamicinvit:[10,42],each:[0,4,6,10,15,18,23,28,29,30,32,34,35,36,39,42,45,46,48],earlier:19,easi:[5,28,30,42,44],easier:[3,19],easiest:42,easili:[0,1,2,4,28,36,42],east:35,ebai:35,ecb:42,ecdsa:29,echo:[36,38,45],ecparam:29,eden:42,edit:[2,3,28,45],editor:[29,30],editplu:30,edu:[42,48],effect:[15,33,35,42],effici:[0,4,30,34,35,36],effort:[0,2,4,42],efnet:[4,17,21],egg_lang:35,eggdrop1:7,eggdrop:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,37,38,41,43,44,45,47,48],eggdroptest:[32,46],egggdrop:2,egghead:[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,28,30,33,34,35,36,37,38,39,40,41,42,43,44,45,48],egghelp:[4,30],eight:[35,42],either:[3,4,15,16,29,30,31,32,33,34,35,37,42,44,46],element:42,elimin:29,els:[28,39,42],email:[4,29,35,42],embed:42,emerg:38,emot:46,empti:[42,46],enabl:[0,2,4,7,10,12,15,17,21,23,27,28,29,30,34,35,36,37,38,44,45,47],enclos:[10,37,42,46],encod:[42,43],encount:[30,47],encourag:[2,30,41],encpass2:41,encrypt:[2,5,6,9,19,29,31,34,36,44],end:[3,27,29,35,41,42,43],endless:10,enforc:[10,29,32,35],enforceban:10,english:[35,45],enhanc:7,enjoi:41,enlarg:3,enough:35,ensur:[27,29,30,34,41,42],enter:[3,10,15,29,31,35,39,40,41,42,44,46],entir:[30,42,46,47],entitl:48,entri:[3,4,29,30,35],env:35,environ:[16,35,36,44],eof:42,equal:42,equival:[6,21,31],equivil:[],eras:[15,42],error:[4,21,27,30,35,42,47],escap:42,especi:28,essenti:41,est:35,establish:[37,42,44],etc:[0,2,4,10,17,24,27,30,32,34,35,36,42,45,48],eth0:16,ethic:35,etiquett:4,european:35,evalu:42,even:[0,4,7,15,17,27,30,33,34,35,36,39,42,47],event:[0,4,24,27,32,34,35,46,47],eventu:19,ever:[29,30,35,42,44],everi:[0,3,4,10,15,17,21,23,27,28,29,32,33,35,37,41,42,48],everydai:35,everyon:[39,42],everyth:[3,28,42],everywher:[35,37,42],evnt:[21,42],exact:42,exactli:[15,17,27,28,42],examin:27,exampl:[2,3,4,5,7,15,16,21,27,28,29,30,31,35,39,42,44,45,46,47],exceed:35,except:[4,13,21,27,35,42,44],excess:[4,10,21],exchang:29,exclud:42,exclus:[21,42],execut:[2,3,7,27,28,29,32,42],exempt:[0,1,2,4,10,17,24,34,36,47,48],exhaust:[42,46],exist:[0,4,15,21,27,32,41,42,46,47,48],exit:[4,6,12,15,21,42],expand:[0,2,4],expans:42,expect:[6,13,35,42],experi:[3,15,28,30],experienc:3,expir:[10,17,18,21,33,35,42,44],explain:[10,42],explan:[10,30,31,42,46],explicit:38,explicitli:[5,42,44],express:42,extend:[24,36,38,42],extens:[3,30,32],extern:[16,29,35],extra:[7,35,38],extract:[30,42],f270:30,face:47,fact:[0,4,46],fail:[14,23,35,42,44],failur:[42,46],fake:42,fals:42,famili:35,familiar:[4,28],fanci:41,fancyp:28,far:15,fast:30,faster:42,fastest:[],fatal:42,fault:27,favor:[5,22],featur:[0,2,4,7,10,17,21,22,29,30,32,35,37,38,40,42,44,47,48],februari:13,feel:[4,5,27,40],few:[24,28,30,31,35,42,47],field:[21,32,35,42,44],fifth:1,fight:10,figur:[3,30],fil:42,file:[1,2,3,4,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,33,34,36,37,41,43,44,48],file_receiv:42,file_send:42,file_send_pend:42,filearea:42,filedb:[15,42],filemask:6,filenam:[6,10,18,30,35,44],filepath:6,files:15,filesi:[2,6,35],filestat:6,filesystem:[15,42,48],fill:[35,40,44],filt:[27,42],find:[3,6,14,17,20,27,28,29,30,39,40,42,47],fine:[17,21,35,46],finger:[13,30],fingerprint:[29,35,44],finish:[4,15,30,42],finnish:35,firewal:35,first:[0,2,4,5,15,19,21,27,28,30,31,34,35,41,42,44,45,46],five:42,fix:[0,3,4,27,35,42],flag:[2,5,6,10,13,17,22,27,28,30,35,36,43],flagmask:46,flash:43,flat:42,flexibl:[42,44],flood:[0,4,10,13,18,21,34,35,36,42,48],floor:1,flud:42,flush:22,focus:[24,47],folder:7,follow:[3,4,5,10,15,17,21,24,27,30,31,34,35,36,38,40,41,42,43,44,45,46,47],foo:[28,29,42],forbid:3,forc:[3,10,12,15,19,22,28,35,37,42],forcefulli:44,forev:35,forget:42,fork:[31,40],form:[0,4,27,28,42,43],format:[7,21,27,29,30,31,35,41,42,43,46],forward:18,found:[2,4,27,35,42,46],foundat:1,four:[10,28,32,35,37,42,43],fourth:28,fprint:[35,44],fragil:42,franklin:1,free:[1,2,5,27],freebsd:37,freeli:[0,4],freenod:21,french:35,frequent:[4,30],fresh:35,fri:42,friend:[10,48],frim:27,from:[0,1,2,3,4,5,6,7,10,15,16,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,37,39,41,43,44,45,46,47,48],front:[10,28,30,31,42,47],ftp:[5,30],full:[3,4,5,24,30,37,42,44,46,47],fuller:1,fulli:[5,35,42,47],fun:[3,47],func:27,func_nam:27,func_tabl:27,function_to_cal:27,further:[29,42],futur:[3,17,29,30,41,42],fwd:18,gain:[0,4,41,48],game:[0,2,4,24,47],garbag:27,gatewai:[24,46,47],gave:30,gayteen:0,gcc:3,geneer:4,gener:[0,1,3,4,19,24,28,29,30,38,41,42,44,47],genkei:29,genrsa:35,geo:28,german:35,get:[6,7,10,21,22,23,27,28,31,32,35,39,48],geteggdrop:[2,4,30],getinfo:42,getop:10,gif:15,git:[2,3,30,40],github:[2,4,30],give:[3,4,10,15,21,28,30,34,35,36,39,41,42,48],given:[4,14,15,16,30,42,46],global:[2,12,16,17,21,22,27,28,33,34,46,48],globalflag:42,gmt:[35,42],gnu:[0,1,3,4,11],goe:[3,10,29,33,34,39,42,44],going:[0,4,15,21,28,31,32,42],gone:[17,42],goober:42,good:[0,15,21,24,28,30,35,42,47,48],got:42,gpl:[0,4],grab:42,grain:28,grant:[29,36,44,47],graphic:44,greater:42,gree:28,greet:[0,2,4,10,28,32],greetmsg:28,greetscript:28,grep:29,ground:35,group:[15,16,35,38,42],grown:0,gseen:[6,20],guarante:[17,32],guess:17,gui:46,guid:[2,3,28,30,31],gunzip:30,guppi:42,gzip:[11,42],had:[3,5,10,34,35,42,47],haha:4,halfop:[10,42,48],hand:[28,35,42],handi:30,handl:[28,29,33,35,41,44,46],handshak:42,hang:[6,14],happen:[28,30,33,35,42],hard:[28,35],harder:28,hardwar:[0,4],has:[0,1,2,4,5,10,14,15,17,21,28,29,30,31,32,33,34,35,36,37,41,42,44,46,47,48],hash:[2,5,19,30],hasn:21,hate:48,have:[0,1,3,4,5,6,9,10,12,15,17,18,19,21,22,24,27,28,29,30,31,32,33,34,35,36,37,39,41,42,44,45,46,47,48],haven:30,head:35,header:[2,4,27,28,31,44],heaven:3,held:46,hello:[17,21,29,30,35,36,42],help:[0,3,13,21,27,28,29,30,33,34,35,37,39,42,43,48],helper:3,henc:[7,27,42],here:[2,4,10,13,14,15,17,18,21,23,28,29,30,33,34,35,42,45,46],herself:4,hidden:[15,30,36],hide:[6,37,42],high:45,higher:[17,19,22,23,30,44],highest:42,highli:[3,21,30],highlight:48,him:1,himself:4,hint:28,his:[21,30],histor:[29,42],histori:46,hit:42,hold:[22,42],hole:35,home:[3,15,16,29,30,44],hook:27,hook_5minut:27,hook_backup:27,hook_daili:27,hook_di:27,hook_hourli:27,hook_idl:27,hook_load:27,hook_minut:27,hook_num:27,hook_pre_rehash:27,hook_read_userfil:27,hook_rehash:27,hook_secondli:27,hook_userfil:27,hope:[30,47],hopefulli:[3,42],hors:30,host:[0,2,4,10,16,21,24,28,33,34,35,44,46,48],hostmask:[28,29,33,34,36,41],hostnam:[6,10,14,29,35,37],hosttarget:[24,46],hour:[6,25,27,33,35,42],hourli:[18,27,35],how:[0,3,6,10,13,14,15,18,21,22,24,28,29,30,31,33,34,35,42,44,45,46,47],howev:[4,7,13,21,29,31,32,35,41,42,44,45],htgt:46,html:[4,37],http:[2,4,6,20,25,30,32,38],hub:[4,22,30,34,35,41,44],hubbot:31,hubcap:48,humor:29,hup:42,hurt:5,iconfig:[3,7,30],idea:[28,30,40],ideal:[41,47],ident:[2,6,7,17,21,29,35,37,41,42],identd:[16,30],identifi:[29,35,41,42,48],idl:[10,27,42],idx:27,ignor:[0,4,13,21,22,28,34,35,36,42,46],ill:42,imag:4,immedi:[21,30,32,41,42],imperson:16,implement:[6,7,16,31,32,35,38,40,41,42,47],implementatino:[],impli:[1,27],importantli:28,improv:[0,4],inact:[10,23],inc:1,incess:0,includ:[0,2,3,4,7,17,25,27,30,31,33,35,36,37,41,42,44,46,47],incom:[15,35,42],increas:[32,35,41],incred:[30,42],independ:7,indic:[21,27,30,42,46],infeas:[24,47],infin:35,infinit:15,info:[3,4,10,12,17,27,30,35],inform:[0,2,3,4,5,6,10,15,25,27,28,29,30,32,34,35,37,38,42,44],infrastructur:44,ing:[17,24,47],init:[21,35,42],init_serv:21,initi:[27,28,30,37,38,42,44],input:42,insecur:10,insensit:42,insert:[10,43],insid:[28,35],instal:[0,4,5,28,29,31,35],instanc:[10,32],instantli:21,instead:[1,4,5,10,15,16,17,22,24,30,35,41,42,44,45,47,48],instruct:[7,30,41],integ:[10,42],integr:2,intend:[3,33,42],intens:21,intent:[24,47],intention:28,interact:[3,4,6,16,17,35,42,44,47],intercept:42,interchang:[31,37],interest:4,interfac:[2,24,42,47],intern:[21,32,35,42,46],internet:[0,4,42,44],interpret:[3,37,42,43],interv:42,introduc:[4,30,42],invalid:42,invers:43,invit:[0,2,4,10,17,24,34,36,38,47],invite:42,invok:42,involv:29,invt:42,ipaddress:42,iptabl:16,ipv4:[30,35,37],ipv4address:42,ipv6:[2,30,35,36,42],ipv6address:42,irc:[0,4,6,15,16,21,24,28,29,30,32,33,34,35,36,37,38,39,42,43,45,46,48],ircawai:42,ircd:[17,21,42],ircii:[23,42],ircnet:[4,10,17,21],ircop:[10,17],ircu2:17,ircv3:[2,32,36,42,45],isn:[6,15,21,22,25,30,33,42],isol:34,isop:10,isoptest:10,isp:30,isset:32,issu:[4,5,16,24,30,32,35,40,42,44,46,47],issuer:44,issupport:32,istn:10,isupport:32,ital:42,item:42,its:[1,2,4,7,10,15,16,17,19,21,22,24,28,29,30,32,34,35,36,40,42,45,47],itself:[15,27,28,29,35,42],itsself:[],j9irk4vs28b0obz9easys4w2ystji3u:47,jan:[42,44],janitor:[15,48],januari:[1,8,9,12,18,20,23,25,42],jkp:30,job:[3,4,29,44],john:1,join:[2,6,10,12,17,18,24,28,30,31,33,35,36,38,39,42,46,47,48],jpk:35,jul:7,juli:0,jump:[21,34,44],jun:45,june:16,jupe:42,just:[0,3,4,5,6,14,15,17,19,22,27,29,30,32,34,35,39,41,42,45,46,47],karma:40,keep:[2,4,10,15,21,23,30,35,47],kei:[2,3,10,17,24,28,29,35,41,46,47],kept:[33,35],keyout:[29,44],keypair:[29,31],kick:[10,17,21,32,35,42,45,48],kicker:42,kiddi:35,kill:[30,42],killer:5,kilobyt:[15,35],kind:42,know:[17,18,21,24,27,28,32,33,34,35,42,45,47],knowledg:0,known:[21,29,35,41,42],kreativrauschen:[6,20],kvirc:44,lag:[35,39],lame:[10,17,34,35,42],lamer:35,lameshar:34,lamest:[10,30,34,35,43],lamestbot:[3,10,18,21,30,34,35,42,43],lang:45,languag:[28,35,36,45],larg:[2,15,17,21,35],larger:[28,41],last:[0,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,30,33,34,35,37,38,39,42,43,44,45,46,48],lastli:42,laston:42,late:42,later:[1,3,6,9,18,19,25,28,30,35,42,44],latest:[4,5,30],launch:30,layer:[29,31],lazi:17,leaf:[34,35,41,44],learn:[17,29,30,35,36,42],least:[4,17,27,30,33,35],leav:[10,21,30,35,39,42,47],left:[17,42],legal:[2,4],len:21,length:[17,21,27,41,42,44],less:[13,39,42],let:[4,6,10,14,18,27,28,30,34,35,36,42],letter:[4,35,48],level:[11,16,29,32,35,48],libera:[2,4,5,21,27,28,29,30],librari:[28,41,44],libssl:[4,30,31],licens:[0,1,4],lieu:42,life:[18,30],light:47,like:[0,1,4,6,9,10,13,15,17,19,27,28,29,30,35,36,37,39,40,41,42,44,46,47,48],limbo:35,limit:[2,6,10,15,17,21,34,37],lindex:42,line:[2,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,34,35,36,41,42,44,45,46,47],link:[0,2,3,4,5,6,7,15,22,23,27,35,36,38,41,44,45],linux:37,list:[0,4,6,10,14,15,19,21,22,24,25,27,28,29,30,31,32,34,35,36,38,39,44,46,47],listen:[29,30,34,35,37,44],liter:[27,42],littl:[3,5,15,24,30,34,45],llama:34,llamabot:[30,35],load:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,32,34,35,41,42,47],loadmodul:[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,35,41,47],lobster:41,local:[15,28,30,35,39,40,42,44],localfil:6,locat:[2,4,23,28,29,31,35,44],log:[0,2,4,10,19,24,27,30,32,40,41,42,47],logfil:[25,27,30,35,45],logfilenam:35,logflag:35,logic:42,login:[30,35,41,46],logmod:27,logsiz:35,longer:[3,5,15,17,19,27,30,31,42],look:[0,4,5,6,10,20,25,26,28,29,31,32,35,36,41,42,44,47],lookup:[14,35,37,42],lose:10,lost:42,lot:[5,17,28,30,32],low:[21,23],lower:21,lowercas:21,lsa:15,luck:[30,47],lurk:2,mac:37,machin:[3,4,16,30,35],macro:27,made:[0,1,3,4,5,10,22,40,42,44,47],magic:28,mai:[1,4,5,10,11,15,16,17,23,28,30,34,35,37,38,42,45,46,47],main:[7,28,30,31,32,39],maintain:[2,16,30,32,45,46],mainten:48,major:[27,30,42],make:[0,2,3,4,5,6,7,10,13,15,19,21,22,24,27,28,29,30,31,35,37,38,40,42,44,45,47],makefil:[3,27],making_modulenam:27,man:35,manag:[2,4,6,15,24,31,47],mandatori:42,mani:[4,5,10,14,15,17,21,27,29,30,31,34,35,42],manipul:[2,35],manpag:35,manual:[4,29,34,35,37,42,44,46],mar:37,march:[33,43,48],mark:[15,36,42,48],mask:[15,21,28,35,46],masquerad:35,master:[15,29,30,33,34,35,42,43,48],match:[1,2,10,15,17,27,28,33,35,41,44,46],math:42,matter:[1,14,28,29],max:[15,17,18,21,23,35],maxdepth:[],maxim:35,maximum:[10,14,15,17,18,21,23,35,41,42,44],maxsend:14,mayb:[28,35],mco:[35,42],mcobx:30,md5:[6,9],mean:[15,17,21,28,29,32,33,34,35,36,37,41,42,44,46],meaning:[24,42,47],meaningless:48,measur:21,mechan:29,meet:44,mem:42,member:[10,27,32],memberlist:42,memori:[27,42],mention:27,meridian:35,messag:[4,10,21,27,28,30,32,35,36,38,39,41,43,45,46],method:[4,6,9,16,17,19,24,28,30,31,41,45,47],midnight:35,might:[4,17,23,27,35,42,44],migrat:5,militari:35,milk:48,min:35,miniatur:39,minimum:[0,10,42,46],minor:[27,42],minu:10,minut:[4,10,17,23,27,29,30,33,35],mirc:[21,42],misc:[35,42],miscellan:2,misnom:42,miss:[4,30,32,42],mix:[10,17],mkcoblx:35,mkdir:6,mnnrrpp:42,mnot:22,mnt:30,moc:42,mod:[3,6,7,20,24,27,35,42,46],mode:[4,5,10,13,17,21,24,27,29,32,33,35,36,38,47],mode_proc:42,mode_proc_fix:42,modechang:42,moder:[24,29,46,47],modern:[16,41],modes_per_line_max:17,modif:[5,30,42],modifi:[2,6,14,17,28,32,35,42],modul:[0,2,4,30,32,34,36,41,47],modular:2,module_clos:[],module_depend:27,module_entri:27,module_expmem:[],module_find:27,module_load:27,module_nam:27,module_regist:27,module_renam:27,module_report:[],module_start:[],module_t:[],module_undepend:27,module_unload:27,modulenam:[7,27],moment:[17,30,31],monitor:[4,29,33,36,38],month:[35,42],moo:42,more:[3,4,5,6,13,15,17,20,27,28,29,30,31,34,35,36,38,40,41,42,44],moreov:35,most:[0,2,4,5,16,17,21,27,28,29,30,31,35,36,39,42,46,47],mostli:[24,42,47],motd:[35,43],mount:23,move:[3,4,15,21,30,42,47],mpj:42,mrlame:[30,35],mrslame:[30,35],msg:[4,6,17,20,21,29,30,35,36,39,41,46],msgid:46,msgm:[21,42],much:[2,3,24,27,30,39,42],multi:30,multipl:[0,2,4,16,28,30,34,35,36,42,46],must:[1,2,3,4,10,14,16,17,21,23,27,29,30,31,32,34,35,41,42,44,46],mydir:15,myownevent123:42,myproc:42,mytag:42,myvar:45,myword:17,name:[3,4,6,8,15,21,27,28,29,30,31,32,35,46],nano:30,nat:[16,35,37],natur:46,nearli:7,necessari:[10,31],necessarili:42,need:[0,3,4,10,14,16,17,21,27,28,29,30,31,32,34,35,37,41,42,44,46,47,48],needal:42,needop:42,neg:[14,35,42],negcach:14,negoti:[42,44],net:[1,3,17,21,24,30,32,38],netbsd:37,nethack:48,netsplit:[16,17,35,36,42],network:[0,2,4,17,21,35,42,43],never:[4,5,10,35,42],new_module_nam:27,newer:[5,30],newhandl:42,newidx:42,newnick:42,newus:[30,35],next:[5,10,15,21,27,28,30,31,35,42],nfree:27,nice:27,nicebot:30,nick:[10,17,21,25,28,29,30,35,48],nicknam:[6,21,28,29,30,32,35,43,45,46,48],nickserv:[2,44],nist256p:29,nkch:42,nmalloc:27,no_irc:[6,21],nobodi:[15,28],node:[29,44],nodesynch:10,noemail:4,non:[3,10,14,16,17,21,27,29,33,34,42,44,47],none:[8,9,10,12,14,18,19,20,21,23,26,42],noout:29,noqueu:42,nor:16,normal:[0,4,6,13,14,15,16,21,27,28,31,35,42,44,45,46,47],notabl:47,notat:35,notc:42,notcproc:42,note:[2,3,6,7,9,10,14,17,19,21,22,27,29,30,32,34,35,41,44,46,47],notebox:42,notefil:[18,42],notepad:30,noth:[27,35,42,47],notic:[2,13,15,28,34,35,42,47],notif:42,notifi:[18,21,30,35,36,38,42],nots:1,nov:34,novemb:[22,38],novic:[0,4],now:[3,5,15,16,17,28,29,30,31,34,35,37,41,42,46,48],ntik:42,number:[2,10,15,17,18,19,21,23,24,27,30,31,34,35,41,42,44,46,47,48],numer:[29,31,42],nxdomain:14,oauth:47,obtain:[2,31,44],obvious:[33,42],occur:[17,28,42],occurr:27,octal:35,octob:[10,19,21,35],off:[10,16,17,21,30,34,35,39,42],offer:[30,31,32,46,47],offici:[2,4],offlin:42,offset:35,often:[4,6,14,29,35,46],oident:16,oidentd:16,okai:35,old:[6,19,21,30],old_module_nam:27,older:[4,37,42],oldest:[2,42],oldhandl:42,omin:28,omit:[42,44],onc:[4,10,15,17,19,21,28,29,30,40,42],one:[4,10,15,16,17,21,27,28,29,30,31,33,34,35,36,39,40,41,42,44,45],ones:[14,22,34,37,42],onjoin:18,onli:[3,4,5,6,7,10,15,16,17,18,20,21,22,25,26,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],onlin:[6,15,18,29,32],opchar:17,open:[16,29,35,39,40,42,44],openbsd:37,openssl:[2,3,4,19,29,30,31,35,44],oper:[4,13,21,28,35,37,42,43],opped:[10,42,48],opping:[0,4],oppos:42,ops:[10,32,42,48],optim:[6,21],optino:38,option:[1,3,4,7,10,15,16,19,21,29,30,35,44,47],order:[4,14,28,32,35,41,42,44,46],ordinari:[42,44],org:[2,4,5,6,25,28,30,31,34,35,42],origin:[1,21,30,40,42],oss:16,other:[0,1,4,6,9,10,14,15,16,17,18,19,21,22,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48],otherdir:3,otherwis:[3,4,12,15,28,32,33,34,35,37,41,42,44,46],our:[30,34,42],ousterhout:1,out:[0,3,4,23,25,28,29,30,34,35,39,41,42,44],outform:29,outgo:[35,42,45],output:[2,3,27,29,31,41,43,45,46],outsid:[19,31,35],over:[15,21,24,27,28,30,35,37,42,44,45,47],overal:32,overhead:7,overrid:[22,37,44],overridden:17,overwrit:[16,30,42],overwritten:[5,35,42],own:[1,7,15,16,21,22,28,29,30,31,38,42,44,45,47],owner:[4,10,30,35,39,42,48],p_tcl_hash_list:27,packag:[1,3,4,30,31],pad:42,page:[30,40],pai:[5,32,42],pain:[23,30],pair:[29,31,32,42,44,46],paragraph:3,paramet:42,paranoid:[22,35],pars:42,part:[0,4,21,24,28,35,36,42,44,45,47],parti:[2,5,12,30,34,35,36,42,44,48],particular:[5,29,35],partproc:42,partylin:[2,4,6,12,30,31,32,34,35,37,41,42,44,45,46,47,48],pass:[28,29,30,32,37,39,41,46],passiv:34,passthru:35,password:[5,6,9,17,19,21,22,29,30,34,35,36,39,41,44,47],past:[1,4,27,35],patch:[2,37,42],path:[2,3,15,16,30,31,42,44],pathnam:42,patient:15,pbk:41,pbkdf2:[2,5,6,41],peer:[21,35,44],pem:[29,35],penalti:21,pend:[6,10],peopl:[4,10,15,16,17,18,21,22,28,30,35,36,39,42,43,48],per:[17,42,46],percent:43,perfect:32,perform:[0,3,4,5,10,30,42,48],perhap:30,period:[6,14,30,42],perm:35,perman:[10,33,35,42],permiss:[4,35,41],permit:42,perorm:2,persist:30,person:[4,28,30,35,42],phew:30,phrase:42,physic:34,pick:42,pictur:5,pid:[30,35,42],pidfil:35,piec:[3,28],ping:13,pipe:34,pl1:42,place:[1,3,5,7,10,15,17,28,30,33,35,42,44,47],plain:[29,35,44],plaintext:[29,42,44],plan:[4,28,42],platform:[0,4,24,42,47],pleas:[4,5,6,7,9,10,16,19,21,31,35,38,42],plu:[10,21,35,42,44],pmsg:28,point:[3,6,21,26,30,34,35,42],pointer:[1,3,4,36,43],popul:46,popular:[0,4,5,30,35],port:[1,5,14,16,21,22,29,30,31,34,35,37,44],portabl:42,portion:[3,7,10,42],portrang:35,posit:[27,35],posix:42,possibl:[3,10,13,15,21,29,31,35,37,38,39,42,44,46],potenti:[5,16,28,42,46],pour:40,power:[4,36],practic:[41,42],pre:[42,44],preced:[30,42,44],prefer:[35,37,44],prefix:[5,17,21,28,31,35,39,44,46,47],preinit:42,prematur:30,prepar:34,prepend:35,prerehash:42,prerequisit:2,prerestart:42,prerout:16,present:[2,6,28,29,32,37,42,46,47],preserv:30,pretend:47,pretendnet:31,pretti:[0,39],preval:29,prevent:[0,4,10,17,18,24,29,30,34,37,42,47],previou:[1,3,4,5,19,30,42,47],previous:[5,30,42],primari:[21,35],prime256v1:29,prime:35,printf:27,prior:[3,29,30,32,41,44],prioriti:42,privat:[18,22,28,29,30,31,35,39,42,44],privatekei:[29,31,35,44],privileg:[0,4,16,48],privmsg:[10,28,29,42],probabl:[21,29,30,31,42],problem:[30,35,37],proc:[21,27,28,46],proce:42,procedur:[2,22,32,46,48],process:[0,3,4,5,11,15,16,23,29,30,34,41,42,44],procnam:[28,42,46],produc:[35,42],program:[0,2,4,16,29,30],progress:15,prohibit:35,project:[2,40,47],prompt:[3,4,32],promptli:30,proper:[37,42],properli:[5,30,31,34,35],protect:[0,2,3,4,10,19,21,29,30,33,35,41,42,44,48],protectfriend:10,protecthalfop:10,protectop:10,protocol:[31,35,38,42,44],prove:30,provid:[0,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,20,21,22,23,24,27,29,30,35,37,38,40,42,44,46,47],pseudo:42,pub:[4,5,21,29,32,42],pubkei:29,publicli:25,publish:35,pubm:[21,42],pull:[4,40,41],punish:[10,42,48],purpos:[0,1,6,25,26,34,35,42],push:[40,42],put:[1,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,30,35,42,44],putlog:[21,27,28],putquick:21,putserv:[10,28,29],putti:29,pwd:[6,30],quakenet:[4,21],qualifi:35,quann:[6,20],queri:[14,16,32,37],question:[4,29],queu:[15,21,42],queue:[21,27],quick:[2,27,30,35],quicker:30,quickli:[2,35],quiet:[21,35,48],quit:[4,6,21,30,35,42],quot:[42,46],quota:35,raid:[24,47],rais:[10,21],ram:35,rand_max:42,random:[10,21,34,42],rang:[30,35],rate:21,rather:[5,42,44],raw:[32,35,44],rawt:42,rcvd:42,reach:[17,21,35],react:[28,32],read:[0,2,3,4,6,7,16,27,28,29,30,31,35,42,43,47],readabl:42,readm:[2,3],readonli:27,real:[21,27,29,42],realli:[28,30,35,45],realnam:[21,42],reason:[4,27,29,30,34,35],reboot:[16,29],receiv:[14,15,21,23,29,34,42,46],recent:[4,30,42,44],recev:[],recipi:42,recogn:[17,21,29,48],recom:[],recommend:[4,5,10,23,27,30,41,42,45,46],recompil:[17,30],reconnect:[22,42],record:[2,22,27,32,36,48],redirect:16,reduc:[27,46],refer:[27,28,31,35,42],refin:28,reflect:[5,42],refresh:[42,46],regardless:42,regist:[2,10,29],regular:[10,42,44],regularli:36,rehash:[7,27,28,29,35],reiniti:42,reject:[21,34,35],rejn:42,rejoin:[30,42],rel:[14,27,30,42],relai:[0,4,34,35],relat:[1,6,10,28,37,42],releas:[0,1,30,41,42],relev:[4,27,30],reli:[29,42],reliabl:[32,42,46],relink:34,relinquish:42,reload:29,rem_builtin:27,rem_tcl_command:27,rem_tcl_int:27,rem_tcl_str:27,remain:[10,33,42],remaind:[15,46],rememb:[10,28,29,30],remind:35,remot:[15,34,35,42,43],remotebotnam:42,remov:[5,10,15,19,27,29,30,33,36,37,41,45,46,47],renam:[2,15,27,30,35,42],render:[5,24,47],repeat:[4,32,42],replac:[10,21,27,29,35,42,43,47],repli:[6,13,14,16,17,32,35,42],replic:[46,47],repo:40,report:[6,15,25,27,30,45],repositori:[4,30],repres:[42,46],req:[29,35,44],request:[0,4,5,7,10,13,15,17,21,30,32,33,35,37,38,40,42,44,45,47],requir:[2,4,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,35,41,44,46],reread:42,resend:[14,42],reserv:[30,35,39],reset:42,resolut:35,resolv:[6,14,35,42],resourc:27,respect:[14,37,42,43],respond:[10,30,42],respons:[21,32,42],rest:[3,27,34,35,41,42,46],restart:[2,3,4,5,7,28,30,35],restrict:[1,15,16,21,35,42,43,47],result:[21,32,33,35,37,42],resum:42,resync:22,retain:42,retri:23,retriev:[6,18],retrydelai:14,reus:[5,42],reveng:10,revengebot:10,revers:[41,42],revert:42,review:[29,31],revis:[0,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,33,34,35,37,38,39,42,43,44,45,46,48],revok:[21,35],rfc1459:[38,42],rfc2812:38,rfc:[17,21,24,42,47],rfc_compliant:42,rich:[0,4,30],right:[6,15,16,26,28,30,42],rijndael:19,risk:[1,21],rizon:21,rmdir:6,rmst:46,robei:[1,3,4,36,43,48],robot:36,roomsstat:24,roomstat:[24,47],root:[15,16],round:[19,41],rout:[16,42],routin:[17,35,42],rsa:35,rule:30,run:[2,3,4,5,7,10,16,21,27,28,29,30,31,32,34,35,41,43,44,46],s_client:44,safe:[19,29,30,31,41,47],sai:[4,10,15,28,31,34,42],said:[28,34,42],sake:47,salt:[28,41],same:[0,3,4,5,7,10,11,16,17,27,28,30,32,34,35,38,41,42,43,44,45,46],sampl:[10,30,47],sane:21,sanitycheck:35,sasl:[2,30,36,38],save:[5,6,10,11,12,22,34,35,36,41],scan:30,scenario:[31,32,34],schat:[35,44],schedul:42,scheme:1,scope:31,screen:[4,40,43],script:[0,2,3,4,7,10,21,29,30,33,36,37,42,45,46,47,48],scripter:34,sdcc:44,sdebug:3,seamless:41,seamlessli:19,search:[27,29,42],sec:35,second:[4,10,13,14,17,21,23,27,28,35,45],secondli:42,secret:10,section:[5,10,17,21,24,28,30,34,35,42,47],secur:[0,2,4,6,9,19,29,30,34,35,36,41,42],see:[0,2,3,4,5,6,10,15,17,21,24,25,27,28,29,30,31,32,34,35,37,39,40,41,42,43,46],seen:[2,6,10,32,35,42],selecet:42,select:[4,30,35,36,40,42],self:[2,21,31,35,44],send:[4,6,11,15,17,18,21,22,23,27,28,30,32,34,37,42,45,46],sender:42,sens:[0,4],sensit:41,sent:[6,15,17,22,25,29,32,35,38,39,42,44,46,48],separ:[3,7,21,30,34,35,36,37,38,42,45,46],septemb:14,seri:[30,42,44],serv:35,server:[2,5,6,7,10,13,14,15,16,17,19,24,25,27,29,30,35,36,37,38,44,45,46,47],serverlist:42,serverop:10,serverror:21,servic:[6,10,16,24,29,32,42,44,47],servivc:42,session:[4,37,38],set:[0,1,2,3,4,5,6,10,11,12,13,14,15,16,17,18,19,21,22,23,24,27,28,31,32,33,34,36,38,39,41,43,45,46,47,48],setcap:16,setnam:[36,38],setup:[4,6,7,30,35],seven:[10,42],sever:[0,4,13,27,30,31,38,42,45],sexystuff:28,sha1:44,sha1sum:29,sha256:19,shall:35,share:[0,2,4,6,10,11,23,27,35,36,42],sharebot:[34,35,42],sharefail:23,she:42,shell:[0,3,4,16,29,30,35,42],shorter:10,should:[1,3,4,5,10,12,13,14,15,17,19,21,22,24,27,28,29,30,34,35,37,39,41,42,44,46,47],shouldn:16,show:[4,6,10,15,25,28,34,35,42],shown:[15,30,35],shutdown:42,shutdownreason:42,side:[35,42,44,47],sidenot:31,sighup:42,sigil:42,sigkil:42,sign:[21,29,31,35,42,43,44,47],signal:42,signific:[4,6],significantli:[32,46],signoff:42,sigquit:42,sigterm:42,silent:35,simialar:[],similar:[4,10,29,30,35,39,40,42,45],similarli:46,simpl:[4,27,28,29,30,42],simpli:[4,5,29,30,31,38,42,47],simplifi:42,simul:[35,42],simultan:[15,23,42],sinc:[0,3,5,17,30,34,35,36,37,42,44,45],singl:[16,17,29,42,46],sit:[0,4,10,35,41],site:[6,48],situat:[32,34],six:42,size:[15,23,27,35,42],skim:4,skip:[30,42],slash:[30,39],slave:34,slennox:30,slow:[15,30,35],slower:35,small:[3,23,34,45],smaller:3,smile:3,snapshot:[2,30],snowbot:15,snt:29,sock:[27,35],socket:[16,27,31,42,44],softwar:[0,1,2,4],solut:41,some:[0,4,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,30,32,33,34,35,36,37,38,42,44,45,47,48],someircnetwork:35,someon:[4,10,17,28,30,31,42,46],someth:[4,28,30,40,42,47],sometim:[4,21,30],somewher:[3,35],song:42,soon:[10,42],sort:[0,4,33],sound:28,sourc:[1,3,4,5,6,7,27,28,31,35,40,42,44,45],space:[0,23,35,38,42],spawn:0,spec:32,special:[34,42],specif:[6,10,14,16,17,19,21,24,30,34,37,38,42,44,46,47,48],specifi:[10,14,15,16,18,21,22,27,29,30,33,35,36,37,41,42,44,46],spectrum:[24,47],spent:[30,42],split:[10,17,37,39,42,43],splt:42,spoiler:47,spoken:42,spoof:16,spread:35,squar:37,squelch:21,src:[3,7,17,27],ssh:30,ssl:[2,3,4,5,21,29,30,31,36,42],sslcert:[3,31,35,44],sslinc:44,ssllib:44,sslport:44,sslsilent:[3,44],sssss:[],stabil:23,stabl:[2,4,30],stack:[17,37,42],stackabl:[],stage:27,stai:42,stall:42,stand:[0,4,30],standard:[14,16,17,23,27,28,38,42,44,47,48],start:[2,3,5,6,9,16,19,21,26,28,29,34,35,38,39,41,42,43,46,47],starttl:44,startup:[2,41,42],stat:6,state:[4,42],statement:42,statist:[6,15,25],statu:[0,2,4,10,24,27,31,35,45,46,47],status:32,statuslog:10,stb:21,stdio:27,stdlib:27,stdout:27,stealth:[30,35],step:[2,3,5,27,30,47],stick:33,sticki:[33,42],still:[1,4,5,10,15,22,30,31,32,35,36,42,47],stone:21,stop:[0,10,15,17,27,29,42,46],stopnethack:[10,48],storag:[6,12,41],store:[5,6,10,12,15,18,24,25,28,30,32,34,41,42,46,47],str_dir:27,str_protect:27,stream:[24,47],street:1,strftime:35,string:[2,17,27,28,29,35,41,46,47],strong:35,strongli:[2,4,30],stuff:[2,4,27,28,30,35,42],style:[33,42],sub:[15,42],subdirectori:[15,42],subject:44,sublist:42,submit:[2,42],subscrib:[46,47],subsequ:42,substitut:[2,35],succeed:42,success:[27,30,42],successfulli:[4,27,42,46],sudo:[16,30],suffic:28,suffici:31,suffix:[7,35],suggest:[5,27],suit:[16,30],suitabl:46,sum:28,summar:21,sun:35,sundai:42,supplant:42,supplementari:32,suppli:35,support:[0,2,3,4,5,6,8,10,11,14,16,17,18,21,22,23,29,30,31,33,35,36,42,45,47],sure:[4,10,27,28,30,31,34,35,42,47],symbol:[31,42],synchron:44,syntax:[5,29,35,44,48],sys:27,system:[2,3,7,14,15,16,27,30,35,36,37,42,43,44],systemctl:29,systemd:[3,4],tab:27,tabl:[27,38,42],tag:[15,36,38,46],tail:29,take:[3,4,5,6,15,19,21,25,28,30,35,41,42,44],taken:[27,42],takeov:17,talk:[28,31,32,36,39],talli:27,tar:[4,7,30],tarbal:[0,30],target:46,task:[0,2,4,34],tcl:[0,1,2,3,4,6,10,11,21,27,28,30,33,35,36,37,44,45,47],tcl_cmd:27,tcl_int:27,tcl_string:27,tclsh:4,tcltk:4,tcp:[2,16,37],team:[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,33,34,35,36,37,38,39,40,41,42,43,44,45,48],technic:47,techniqu:45,tell:[15,28,29,30,31,32,34,35,42,47],telnet:[2,29,30,34,36,37,39,41,42,43,44],temp:42,templat:40,temporari:[10,23,25,33,35],ten:29,term:[2,28,31,42],termin:[4,5,42],test:[28,30,48],text:[4,10,21,27,29,35,43,44,45,46,48],textfil:2,than:[4,10,13,15,17,30,31,35,41,42,44],thank:4,thee:[29,42],thei:[0,3,4,5,7,10,12,13,17,18,21,22,27,28,29,30,31,32,33,34,35,41,42,44,46],them:[0,1,3,4,5,7,10,12,13,14,15,17,18,21,22,23,27,28,29,30,31,34,35,36,37,38,41,42,45,47,48],themselv:[17,30,34,42,45],therebi:[45,47],therefor:[6,17,30,35,42],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,40,41,42,43,44,45,46,47,48],thing:[3,4,6,24,26,27,28,29,34,35,42,47],think:[40,48],third:[28,34],thorough:[27,29,31,47],those:[1,3,7,11,15,21,27,28,29,30,42,45,46,47],though:[15,21,28,30,42,44],thr:35,three:[21,29,32,33,34,35,42],through:[4,10,15,21,24,28,31,36,37,38,39,42,47,48],throughout:27,thse:[],thu:[16,28,32,37,41,42],tidi:27,ties:42,till:[],time:[0,3,4,10,14,15,16,17,19,22,23,28,29,30,31,32,33,34,35,36,38,39,41,43,44,45,47],timeout:[6,14,21,23,35,46],timestamp:[35,42],timezon:35,tip:[2,42],titl:48,tiwtch:6,tls:[42,44],tmi:46,tmp:[23,42],toctre:[],todai:42,togeth:[0,2,4,21,28,34,35,36,38,42],token:47,told:28,ton:24,too:[15,17,21,23,27,35,42],tool:[3,30],top:[3,4,28,40,42],topc:42,topic:47,total:[10,27,36,42],tout:42,toward:28,trace:21,track:[2,3,15,24,27,29,42,47],tradit:[24,37,45,46,47],tradition:16,traffic:[3,35,45],trail:27,transfer:[2,6,7,11,15,22,30,34,35,37,42,44,48],transit:[19,41,42],transmit:21,transpar:35,transport:31,treat:[42,47],tree:[0,4,30],tri:[27,35,42],trick:[28,45],trigger:[10,21,27,28,32,42,46],troubl:[14,35],troubleshoot:[4,30],truncat:46,trust:[4,35,48],ttl:14,turbo:[23,30],turn:[10,16,21,35,42],tutori:[2,31],twcmd:[24,47],twice:42,twitch:[2,6,36],twith:46,two:[4,6,17,22,28,30,32,33,34,35,41,42,44,45],type:[3,4,6,7,10,12,17,21,24,27,28,29,30,31,32,33,34,35,36,37,38,39,44],typic:[15,24,35,36,39,42,47],typo:42,ubuntu:31,ufl:42,ugli:15,uglyman:15,uhost:[28,42],uid:[35,44],umod:21,unabl:[17,30,34,37,42,47],unaccess:36,unavail:[21,35],unban:[10,35,42],unbind:[17,35,45,46],uncertainti:46,uncom:[29,31,35,41],under:[0,4,30,36,42],underli:42,underlin:[42,43],undernet:[4,17,21,42],understand:[35,42],understood:21,unexpect:42,unfortun:29,unhid:6,unimport:35,unintend:46,uniqu:[35,42,46],univers:35,unix:[0,3,15,16,30,36],unknown:42,unld:42,unless:[17,21,28,30,33,35,42],unlik:[3,36],unlimit:34,unlink:[23,35],unload:[27,42],unoffici:37,unpack:0,unreach:34,unrealircd:[17,42],unreli:[24,46,47],unrest:0,unset:42,unshar:[6,48],unstick:33,unsticki:33,unstuck:42,unsur:30,untar:5,until:[7,10,15,33,35,42],unzip:[5,30],updat:[4,5,19,27,30,32,35,36,41,42,46],upgrad:[2,41,44],uplink:42,upload:[15,30,36,42,45],upon:[0,4,46,48],upper:14,uptim:[2,6],url:[35,42],usa:1,usabl:[6,15,35],usag:[2,4,6,27,35,42],use:[0,1,3,4,5,6,7,9,10,12,13,14,15,16,17,19,21,22,23,27,28,29,30,31,33,34,35,37,39,41,42,43,44,45,46,47,48],used:[0,2,4,10,11,13,15,19,21,27,28,29,30,31,33,34,35,36,37,39,41,42,43,44,45,46,47,48],useful:[1,4,10,23,30,34,42,44,45],useless:[5,24,47],user:[0,2,3,4,5,6,7,9,10,11,12,13,16,17,18,19,20,21,22,23,24,27,28,30,31,32,33,35,36,37,39,40,41,43,44,45,46,47],userban:10,userexempt:10,userfil:[0,2,4,5,6,9,10,11,19,22,23,27,29,30,34,35,41,42,45],userflag:17,userhost:46,userinfo1:35,userinfo:[13,42],userinvit:10,userlist:[6,17,20,22],usernam:[16,29,30,35,46,47],usernotic:[24,46],userst:[24,47],uses:[3,6,17,21,23,27,28,29,30,31,33,35,41,42,44,47,48],using:[1,3,4,6,7,9,10,15,16,17,19,21,27,28,29,30,33,34,35,37,41,42,44,45,46,47],usrntc:46,usst:46,usual:[4,29,30,31,33,37,40,41,42,44,47],utc:35,util:3,utim:28,vagu:30,vali:42,valiant:[0,4],valid:[3,10,21,27,34,35,36,42,44],valis0:42,valu:[10,13,14,17,21,24,27,28,35,41,43,44,46,47],vari:[42,48],variabl:[2,5,10,11,12,13,14,15,16,17,18,19,21,22,23,27,28,32,35,37,43,46],variable_nam:27,varieti:[0,4],variou:[1,27,30,33,35,42],verbos:42,veri:[4,6,16,20,21,28,35],verif:[21,35,44],verifi:[21,29,35,44],version:[0,1,2,3,4,5,13,17,25,27,28,37,38,43,44,46],vertic:42,vhost4:[30,35,37],vhost6:[30,35,37],vhost:[30,35,37],via:[2,3,4,6,11,16,17,20,22,27,28,29,30,32,33,34,35,36,37,38,39,41,43,44,46,47],video:42,view:[5,7,19,29,30,36,42,46],viewer:46,vim:30,vip:[46,47],virtual:35,visibl:42,visit:[5,47],vista:37,voic:[0,2,4,10,29,42,48],wai:[1,3,16,21,24,27,28,29,30,31,32,33,34,35,39,41,42,44,47],wait:[6,14,15,17,21,23,30,32,35,42],walk:31,wall:42,wallop:[35,42],want:[0,3,4,6,10,12,14,15,17,18,21,23,27,28,29,30,34,35,37,42,44,45],war:0,warm:40,warn:[4,16,28,42],warranti:1,washalfop:48,wasn:42,wasop:[10,17,48],wasoptest:10,watch:[39,46],web:[2,6,24,35,46],webpag:2,websit:30,week:42,weekdai:42,welcom:28,well:[1,24,28,29,30,31,32,35,41,42,44,47],were:[1,16,17,30,33,34,35,37,41,42,47],west:35,wget:30,what:[0,1,2,5,6,10,15,17,21,25,28,29,30,35,38,39,41,42],whatev:[1,3,28,35,36,42,43],when:[3,4,6,7,9,10,12,15,16,17,21,22,27,28,29,30,32,33,35,37,39,41,42,44,46,47],whenev:[21,27,32,34,42,44],where:[4,6,10,14,15,18,21,27,28,29,30,31,32,35,36,41,42,44,46],wherea:42,wherev:37,whether:[35,37,42],whew:28,which:[3,5,6,10,12,14,15,16,21,22,27,28,29,30,32,33,34,35,37,39,41,42,43,44,45,46,48],whichev:33,whisper:[24,46],whitespac:42,who:[10,15,17,21,28,30,32,35,39,42,48],whoi:[29,35],whole:27,whose:[33,42],whox:[36,42],why:[28,30,42],wide:[39,44],width:43,wild:42,wildcard:[10,28,29,42,46],window:[2,29,37],wise:[4,35],wish:[3,5,7,16,17,25,27,30,33,34,35,42,46],within:[6,15,27,30,31,33,35,38,42],without:[0,2,4,5,6,9,10,13,19,27,28,29,30,31,34,35,36,38,41,42,44],wizard:31,won:[6,10,22,27,28,30,33,34,35,42,44,46],woobi:[2,3,6,27],word:[15,17,29,30,42,46,47],work:[3,5,6,10,13,15,19,20,22,27,28,29,30,33,34,35,37,38,40,41,42,44,45,46],workaround:[24,32],world:[0,2,4,31,35],worri:24,worth:3,would:[4,5,13,28,29,30,31,32,34,35,42,43,44,46,47],wouldn:35,write:[1,2,6,7,26,30,35,41,42,47],written:[0,27,30,42,47],wrote:28,wspm:46,wspr:46,wth:[],www:[2,4,6,20],x509:[29,35,44],xfer:[23,48],xtra:42,xvf:30,xxd:29,year:[0,4,30,35,42],yes:[28,31,42],yesterdai:35,yet:[4,21,30,35,42],yoru:29,you:[0,1,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,35,36,37,39,40,41,42,43,44,45,46,47,48],you_want_to_export:27,your:[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,34,35,36,37,39,40,41,42,44,47],yourbot:45,yourbranchnam:40,yourconfig:3,youreggdrop:29,youreggdropconfignameher:29,yourself:[7,29,30,40,41,44],yourusernam:40,yyyymmdd:35,zero:42,zip:30,zomg:[],zxvf:30},titles:["About Eggdrop","Boring legal stuff","Eggdrop, an open source IRC bot","Installing Eggdrop","README","Upgrading Eggdrop","Modules included with Eggdrop","Eggdrop Module Information","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","Writing an Eggdrop Module","Writing an Eggdrop Script","Common First Steps","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"],titleterms:{"default":45,"function":[27,47],"int":42,"new":42,"return":42,"short":30,"static":7,"super":30,Adding:34,DNS:14,TLS:[31,44],The:[30,39],Using:[32,34],about:[0,37,38,44],account2nick:42,account:[32,42],accounttrack:42,add:[29,42],addbot:42,addchanrec:42,addit:[27,31],address:42,addus:42,advanc:[35,45],api:24,arg1:42,arg2:42,arg:[42,46],argn:42,assign:29,assoc:[8,42],authent:[29,44],auto:4,automat:29,background:41,backup:42,ban:[33,42],banlist:42,banmask:42,base64:42,basic:35,best:32,bind:[42,46],block:42,blowfish:9,boot:42,bore:1,bot:[2,15,34,42],botattr:42,botflag:34,botishalfop:42,botisop:42,botisvoic:42,botlist:42,botnam:42,botnet:[5,31,34,35,44],botnick:42,botonchan:42,botport:42,bottre:34,callev:42,can:[2,7],cancel:15,cap:[38,42],capabl:[32,38],certif:44,chan:[42,46],chanban:42,chandname2nam:42,chanexempt:42,chanflag:42,chang:[5,42],chaninvit:42,chanlist:42,channame2dnam:42,channel:[10,15,29,42,46],chansettyp:42,charact:42,chat4:37,chat6:37,chat:37,chattr:42,check:32,chhandl:42,clear:15,clearqueu:42,cmd:46,command:[4,5,24,42,45,46],comment:42,common:29,commun:31,compil:7,compress:[11,42],compressfil:42,config:[5,15,30,42,45,47],configur:[29,30,31,41],configurearg:42,connect:[31,42],consol:[12,35,42],control:42,core:35,count:42,countus:42,creator:42,crontab:29,ctcp:[13,37],ctime:42,cygwin:3,dcc:[35,42,44],dccbroadcast:42,dccdumpfil:42,dcclist:42,dccputchan:42,dccsend:42,dccsimul:42,dccuse:42,decrypt:42,delchanrec:42,delhost:42,deludef:42,delus:42,desc:[15,42],descript:15,dest:15,destin:42,determin:32,develop:4,die:42,dir:[15,42],directori:[15,35,42],disclaim:47,dname:42,dnslookup:42,docker:4,document:[4,5],download:30,dst:15,dumpfil:42,durat:42,dynam:7,echo:42,edit:[30,47],effort:32,eggdrop:[0,2,3,4,5,6,7,27,28,29,30,31,32,35,36,40,42,46],enabl:[31,32,41,42],encpass:42,encrypt:[41,42],entri:42,erasenot:42,event:42,exampl:34,execut:35,exempt:[33,42],exemptlist:42,exemptmask:42,extend:32,extra:42,featur:36,file:[5,15,30,31,35,42,45,47],filemask:15,filenam:[15,42],filepath:15,fileresend:42,filesend:42,filesi:[15,42],filestat:15,find:2,findus:42,first:29,flag:[15,29,34,42,46,48],flushmod:42,formatstr:42,from:42,ftp:4,gener:31,get:[2,4,15,30,42],getaccount:42,getchan:42,getchanhost:42,getchanidl:42,getchaninfo:42,getchanjoin:42,getchanmod:42,getdccawai:42,getdccidl:42,getdesc:42,getdir:42,getfil:42,getfileq:42,getfilesendtim:42,getflag:42,getlink:42,getown:42,getpwd:42,getudef:42,getus:42,git:4,github:40,global:42,hand2idx:42,hand2nick:42,handl:42,handlen:42,handonchan:42,haschanrec:42,hash:41,help:[2,4],helpfil:42,hide:15,histori:30,host:[29,42],hostmask:42,hostnam:42,how:[2,4,5,7],hybrid:41,ident:16,idx2hand:42,idx:42,ignorelist:42,includ:6,info:42,inform:[7,31],instal:[2,3,7,30,37,44],interfac:41,invit:[33,42],invitelist:42,invitemask:42,ipv6:37,irc:[2,17,31,44,47],ircnick:42,ircv3:38,isawai:42,isban:42,isbansticki:42,isbotnick:42,ischanban:42,ischanexempt:42,ischaninvit:42,ischanjup:42,iscompress:42,isdynam:42,isexempt:42,isexemptsticki:42,ishalfop:42,isidentifi:42,isignor:42,isinvit:42,isinvitesticki:42,isircbot:42,isjup:42,islink:42,ismod:46,isop:42,ispermban:42,ispermexempt:42,isperminvit:42,isset:42,istl:42,isupport:42,isvip:46,isvoic:42,join:[29,32],jump:42,keep:45,kei:[31,42,44],keyword:42,killassoc:42,killban:42,killchanban:42,killchanexempt:42,killchaninvit:42,killdcc:42,killexempt:42,killignor:42,killinvit:42,killtim:42,killutim:42,languag:42,lastbind:42,legal:1,level:42,lifetim:42,limit:[24,42,47],line:[4,39],link:[34,42],list:42,listen:[31,42],listnot:42,loadchannel:42,loadhelp:42,loadmodul:[7,42],localfil:15,locat:30,log:[29,35,45],logfil:42,make:34,manipul:42,mask:42,maskhost:42,masktyp:42,match:42,matchaddr:42,matchattr:42,matchban:42,matchcidr:42,matchexempt:42,matchinvit:42,matchstr:42,md5:42,messag:42,method:29,minut:42,miscellan:42,mkdir:[15,42],mode:42,modifi:45,modul:[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,35,42],modular:45,module_clos:27,module_expmem:27,module_report:27,module_start:27,module_t:27,monitor:42,more:2,msg:42,must:5,myip:42,name:42,need:7,newban:42,newchanban:42,newchanexempt:42,newchaninvit:42,newer:29,newexempt:42,newignor:42,newinvit:42,newnam:42,nick2hand:42,nick:[42,46],nicknam:[15,42],nickserv:29,note:[18,42],notic:4,notifi:32,numberlist:42,numvers:42,obtain:4,old:[29,42],oldnam:42,onchan:42,onchansplit:42,onelin:42,onlin:42,open:2,optim:15,option:42,output:42,own:[],parti:39,partylin:[15,24,29],pass:42,passwdok:42,password:42,patch:40,path:35,pattern:42,pbkdf2:19,pend:15,permiss:29,port:42,pre:[2,4,31],prefix:42,prepar:31,prerequisit:30,proc:42,procedur:42,protect:31,pushmod:42,putallbot:42,putbot:42,putcmdlog:42,putdcc:42,puthelp:42,putkick:42,putlog:42,putloglev:42,putnow:42,putquick:42,putserv:42,putxferlog:42,pwd:15,queue:42,queuesiz:42,quick:[3,4],quit:15,rand:42,raw:42,read:5,readm:4,reason:42,record:[34,42],refreshchan:42,regist:47,rehash:42,reload:42,reloadhelp:42,remov:42,renam:45,renudef:42,req:42,requir:[3,27,32,42],requisit:[2,4,31],resetban:42,resetchan:42,resetchanidl:42,resetchanjoin:42,resetconsol:42,resetexempt:42,resetinvit:42,restart:[29,42],rfcequal:42,rmdir:[15,42],roomstat:46,sasl:29,save:42,savechannel:42,script:[5,28,32,35,44],second:42,secur:[31,44],seen:20,self:45,sendnot:42,server:[21,31,32,42],serveraddress:42,set:[29,30,35,37,42,44],setchan:42,setchaninfo:42,setdccawai:42,setdesc:42,setflag:42,setlink:42,setown:42,setpwd:42,setudef:42,setup:15,setus:42,share:[15,22,34],show:30,snapshot:4,socklist:42,solo:41,some:2,sourc:[2,15,30],src:42,ssl:[35,44],stackabl:42,start:[4,30],starttl:42,startup:[3,4],stat:15,statu:[32,42],step:29,stickban:42,stickexempt:42,stickinvit:42,still:7,storenot:42,str:42,strftime:42,string1:42,string2:42,string:[42,45],strip:42,stripcod:42,stuff:1,submit:40,substitut:43,support:[32,37,38,44],system:[4,29],systemd:29,tag:[32,42],tagmsg:42,target:42,tcl:[5,24,32,41,42,46],tcp:42,telnet:35,term:34,text:42,textfil:43,thing:2,time:42,timer:42,timerid:[],timernam:42,tip:45,tlsstatu:42,topic:42,track:32,traffic:42,transfer:23,twcmd:46,twitch:[24,46,47],twitchmod:46,twitchvip:46,type:[42,46],unam:42,unbind:42,uncompressfil:42,unhid:15,unixtim:42,unlink:42,unloadhelp:42,unloadmodul:42,unshar:15,unstickban:42,unstickexempt:42,unstickinvit:42,upgrad:[4,5],uptim:[25,42],usag:[15,37,38,41,44],use:[],user:[15,29,34,42,48],userlist:42,userport:42,userst:46,utim:42,validchan:42,valididx:42,validus:42,valu:42,variabl:[42,45],version:[30,42],via:[40,42],washalfop:42,wasop:42,web:47,what:[4,7,27,34],where:2,whom:42,whox:32,why:[],window:3,without:7,woobi:26,write:[27,28],you:2,your:45}}) \ No newline at end of file diff --git a/doc/html/tutorials/firstscript.html b/doc/html/tutorials/firstscript.html index 7ddc58f93..fb00cb559 100644 --- a/doc/html/tutorials/firstscript.html +++ b/doc/html/tutorials/firstscript.html @@ -261,7 +261,7 @@

        Writing an Eggdrop Script © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/tutorials/firststeps.html b/doc/html/tutorials/firststeps.html index 4a8c80084..902477ae6 100644 --- a/doc/html/tutorials/firststeps.html +++ b/doc/html/tutorials/firststeps.html @@ -215,9 +215,29 @@

        Systemd Method (Newer Systems)Note the output at the end of the script informing you of the command you can use to start/stop the Eggdrop in thee future

        +
      22. Note the output at the end of the script informing you of the command you can use to start/stop the Eggdrop in thee future. For example, to manually start the Eggdrop, use:

        +
        systemctl --user start <botname>.service
        +
        +
      +

      To stop Eggdrop, use:

      +
      systemctl --user stop <botname>.service
      +
      +
      +

      To rehash (not reload) Eggdrop, use:

      +
      systemctl --user reload <botname>.service
      +
      +
      +

      (Yes, we acknowledge the confusion that the systemd reload command will execute the Eggdrop ‘.rehash’ command, not the ‘.reload’ command. Unfortunately, systemd did not consult us when choosing its commands!)

      +

      To prevent Eggdrop from automatically running after a system start, use:

      +
      systemctl --user disable <botname>.service
      +
      +
      +

      To re-enable Eggdrop automatically starting after a system start, use:

      +
      systemctl --user enable <botname>.service
      +
      +
      diff --git a/doc/html/tutorials/setup.html b/doc/html/tutorials/setup.html index d9c1bd41d..43e995a17 100644 --- a/doc/html/tutorials/setup.html +++ b/doc/html/tutorials/setup.html @@ -289,7 +289,7 @@

      No show? © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/tutorials/tlssetup.html b/doc/html/tutorials/tlssetup.html index 13f99eab0..fe5a6bd35 100644 --- a/doc/html/tutorials/tlssetup.html +++ b/doc/html/tutorials/tlssetup.html @@ -142,7 +142,7 @@

      Protecting Botnet Communications

      Configuration File Preparation - Generating Keys

      -

      If an Eggdrop is going to listen/accept connections on a TLS port (more on that in a moment), it must have a public/private certificate pair generated and configured. For most users, a self-signed certificate is sufficient for encryption (a certificate signed by a certificate authority would be more secure, but obtaining one is outside the scope of this tutorial. However, the implementatino of a signed keypair is no different than a self-signed pair). To generate a self-signed key pair, enter the Eggdrop source directory (the directory you first compiled Eggdrop from, usually named eggdrop-X.Y.Z) and type:

      +

      If an Eggdrop is going to listen/accept connections on a TLS port (more on that in a moment), it must have a public/private certificate pair generated and configured. For most users, a self-signed certificate is sufficient for encryption (a certificate signed by a certificate authority would be more secure, but obtaining one is outside the scope of this tutorial. However, the implementation of a signed keypair is no different than a self-signed pair). To generate a self-signed key pair, enter the Eggdrop source directory (the directory you first compiled Eggdrop from, usually named eggdrop-X.Y.Z) and type:

      make sslcert
       
      @@ -198,7 +198,7 @@

      Additional Information © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/accounts.html b/doc/html/using/accounts.html index 635bbd06d..d69a1a67d 100644 --- a/doc/html/using/accounts.html +++ b/doc/html/using/accounts.html @@ -207,7 +207,7 @@

      Using Accounts with Tcl Scripts © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/bans.html b/doc/html/using/bans.html index bccb67da2..a6ee03996 100644 --- a/doc/html/using/bans.html +++ b/doc/html/using/bans.html @@ -202,7 +202,7 @@

      Bans, Invites, and Exempts © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/botnet.html b/doc/html/using/botnet.html index 9d6abcc86..c7c43f83b 100644 --- a/doc/html/using/botnet.html +++ b/doc/html/using/botnet.html @@ -429,7 +429,7 @@

      Making bots share user records © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/core.html b/doc/html/using/core.html index 9e00c138e..1a4e7cd63 100644 --- a/doc/html/using/core.html +++ b/doc/html/using/core.html @@ -788,7 +788,7 @@

      Scripts © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/features.html b/doc/html/using/features.html index bd4ac4294..6c55f0f14 100644 --- a/doc/html/using/features.html +++ b/doc/html/using/features.html @@ -171,7 +171,7 @@

      Eggdrop Features © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/ipv6.html b/doc/html/using/ipv6.html index 2722906a9..ab3185ee5 100644 --- a/doc/html/using/ipv6.html +++ b/doc/html/using/ipv6.html @@ -201,7 +201,7 @@

      Settings © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/ircv3.html b/doc/html/using/ircv3.html index aaf08ba28..b4e56185d 100644 --- a/doc/html/using/ircv3.html +++ b/doc/html/using/ircv3.html @@ -170,7 +170,7 @@

      Supported CAP capabilities © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/partyline.html b/doc/html/using/partyline.html index 93dc1ec45..86da6a12d 100644 --- a/doc/html/using/partyline.html +++ b/doc/html/using/partyline.html @@ -158,7 +158,7 @@

      The Party Line © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/patch.html b/doc/html/using/patch.html index 063847d69..29159db2a 100644 --- a/doc/html/using/patch.html +++ b/doc/html/using/patch.html @@ -168,7 +168,7 @@

      Submitting a patch via GitHub © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/pbkdf2info.html b/doc/html/using/pbkdf2info.html index af1b55ee0..0fccdb074 100644 --- a/doc/html/using/pbkdf2info.html +++ b/doc/html/using/pbkdf2info.html @@ -219,7 +219,7 @@

      Tcl Interface © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/tcl-commands.html b/doc/html/using/tcl-commands.html index fdb2ea9c2..e91d30b1e 100644 --- a/doc/html/using/tcl-commands.html +++ b/doc/html/using/tcl-commands.html @@ -461,7 +461,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>]]
      @@ -2866,7 +2866,7 @@ 

      Removing a bind

      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.

      +

      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:

      @@ -2929,7 +2929,7 @@

      Flag Masks|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a ‘*’ to skip processing, so as not to confuse a single “-” meaning “skip processing” with a preceding “-ov” which means “not these flags”.

      +

      As a side note, Tcl scripts historically have used a ‘-‘ to skip processing of a flag type (Example: -|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a ‘*’ to skip processing, so as not to confuse a single “-” meaning “skip processing” with a preceding “-ov” which means “not these flags”.

      diff --git a/doc/html/using/text-sub.html b/doc/html/using/text-sub.html index 2eb4ed8f4..a572b3cf6 100644 --- a/doc/html/using/text-sub.html +++ b/doc/html/using/text-sub.html @@ -234,7 +234,7 @@

      Textfile Substitutions © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5.

      diff --git a/doc/html/using/tls.html b/doc/html/using/tls.html index 09531799b..5d11e118d 100644 --- a/doc/html/using/tls.html +++ b/doc/html/using/tls.html @@ -326,7 +326,7 @@

      SSL/TLS Settings © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/tricks.html b/doc/html/using/tricks.html index a63929472..4d86301e0 100644 --- a/doc/html/using/tricks.html +++ b/doc/html/using/tricks.html @@ -175,7 +175,7 @@

      Variables in Your Config © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/twitch-tcl-commands.html b/doc/html/using/twitch-tcl-commands.html index c973faeb1..dde8df8f8 100644 --- a/doc/html/using/twitch-tcl-commands.html +++ b/doc/html/using/twitch-tcl-commands.html @@ -310,7 +310,7 @@

      Bind Types © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/twitchinfo.html b/doc/html/using/twitchinfo.html index 76ba167ed..1c3a2cca1 100644 --- a/doc/html/using/twitchinfo.html +++ b/doc/html/using/twitchinfo.html @@ -190,7 +190,7 @@

      Twitch IRC limitations © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/html/using/users.html b/doc/html/using/users.html index 174947f73..32c1fecc1 100644 --- a/doc/html/using/users.html +++ b/doc/html/using/users.html @@ -263,7 +263,7 @@

      Users and Flags © Copyright 2022, Eggheads. - Last updated on Nov 10, 2022. + Last updated on Dec 12, 2022. Created using Sphinx 1.8.5. diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 2f9132808..904867221 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -367,6 +367,8 @@ botattr [changes [channel]] Module: core +.. _matchattr: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ matchattr [channel] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -2890,7 +2892,7 @@ 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. +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". @@ -2932,7 +2934,7 @@ Some additional examples: | ||+b | Checks if the user has the bot flag b | +------------+-----------------------------------------------------------------+ -As a side note, Tcl scripts historically have used a '-' to skip processing of a flag type (Example: -|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a '*' to skip processing, so as not to confuse a single "-" meaning "skip processing" with a preceding "-ov" which means "not these flags". +As a side note, Tcl scripts historically have used a '-' to skip processing of a flag type (Example: -\|o). It is unknown where and why this practice started, but as a style tip, Eggdrop developers recommend using a '\*' to skip processing, so as not to confuse a single "-" meaning "skip processing" with a preceding "-ov" which means "not these flags". ^^^^^^^^^^ Bind Types diff --git a/doc/tcl-commands.doc b/doc/tcl-commands.doc index 8b73f3b70..3436a91ba 100644 --- a/doc/tcl-commands.doc +++ b/doc/tcl-commands.doc @@ -2994,12 +2994,13 @@ 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 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. +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". From 90e8347314ef116f325020797be38cbf288551d0 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 12 Dec 2022 17:46:05 -0500 Subject: [PATCH 27/92] dont forget this little guy --- doc/ACCOUNTS | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 doc/ACCOUNTS diff --git a/doc/ACCOUNTS b/doc/ACCOUNTS new file mode 100644 index 000000000..aecd84ad5 --- /dev/null +++ b/doc/ACCOUNTS @@ -0,0 +1,157 @@ +Account tracking in Eggdrop + +In Eggdrop 1.9.3, Eggdrop added the ability to associate nicknames with +the service accounts they are logged into. It is IMPORTANT to note that +Eggdrop's ability to do this is dependent on an IRC server's +implementation of three features- the IRCv3 extended-join capability, +the IRCv3 account-notify capability, and WHOX support. All three of +these features must be supported by the server and, in the case of +extended-join and account-notify, requested by Eggdrop in order for +Eggdrop to maintain "perfect" association between nicknames and account +statuses. + +REQUIRED SERVER CAPABILITIES + +You're going to see this repeated a lot- the IRC server must support +three features in order for Eggdrop to accurately associate accounts +with nicknames. These three features allow Eggdrop to always know the +current association between an account and a nickname by getting account +statuses of users already on a channel when it joins, new users joining +a channel, and users who authenticate while on a channel. + +extended-join + +extended-join is an IRCv3-defined capability that adds the account name +of a user to the JOIN message sent by the IRC server, alerting clients +that a new member has joined a channel. Enabling this capability allows +Eggdrop to immediately determine the account name associated with a user +joining a channel + +account-notify + +account-notify is an IRCv3-defined capability that sends a message to a +channel when a member of the channel either authenticates or +deauthenticates from their account. Enabling this capability allows +Eggdrop to immediately associate an account to a channel member when +they authenticate or deauthenticate. + +WHOX + +'WHOX `_ is a server feature +that allows a client to request custom fields to be returned in a WHO +response. If a server supports this capability, Eggdrop sends a WHOX +query to the server when it joins a channel, allowing it to immediately +determine accounts associated with channel members when Eggdrop joins a +channel. + +ENABLING EGGDROP ACCOUNT TRACKING + +By default, the Eggdrop config file will attempt to enable all the +capabilities required for account tracking. There are two settings to +pay attention to : + + # To request the account-notify feature via CAP, set this to 1 + set account-notify 1 + + # To request the extended-join feature via CAP, set this to 1 + set extended-join 1 + +The ability of a server to support WHOX queries is determined via a +server's ISUPPORT (005) reply. If a server supports WHOX queries, +Eggdrop will automatically enable this feature. + +CHECKING ACCOUNT-TRACKING STATUS + +While Eggdrop is running, join the partyline and type .status. If +account-tracking is enabled (both the server supports and Eggdrop has +requested), you'll see this line : + + Loaded module information: + #eggdroptest : (not on channel) + Channels: #eggdroptest (trying) + Account tracking: Enabled <--- This line + Online as: BeerBot (BeerBot) + +Otherwise, the prompt will tell you which required capability is +missing/not enabled : + + Loaded module information: + #eggdroptest : 2 members, enforcing "+tn" (greet) + Channels: #eggdroptest (need ops) + Account tracking: Best-effort (Missing capabilities: extended-join, see .status all for details) <---- This line + Online as: Eggdrop (Eggdrop) + +DETERMINING IF A SERVER SUPPORTS ACCOUNT CAPABILITIES + +A server announces the capabilities it supports via a CAP request. If +you have Tcl enabled on the partyline (or via a raw message from a +client), you can send .tcl cap ls and see if the extended-join and +account-notify capabilities are supported by the server. If they are not +listed, the server does not support it. + +A server announces if it supports WHOX via its ISUPPORT (005) +announcement. If you have Tcl enabled on the partyline, you can send +.tcl issupport isset WHOX and if it returns '1', WHOX is supported by +the server. + +BEST-EFFORT ACCOUNT TRACKING + +If a server only supports some, but not all, of the required +capabilities, Eggdrop will switch to 'best effort' account tracking. +This means Eggdrop will update account statuses whenever it sees account +information, but in this mode Eggdrop cannot guarantee that all account +associations are up to date. + +If a server does not support extended-join, Eggdrop will not be able to +determine the account associated with a user when they join. Eggdrop can +update this information by sending a WHOX to the server. + +If a server does not support account-notify, Eggdrop will not be able to +determine the account associated with a user if they +authenticate/deauthenticate from their account after joining a channel. +Eggdrop can update this information by sending a WHOX to the server. + +If a server does not support WHOX, Eggdrop will not be able to determine +the accounts associated with users already on a channel before Eggdrop +joined. There is no reliable way to update this information. + +One workaround to significantly increase the accuracy of account +tracking for scripts in a 'best effort' scenario would be to issue a +WHOX query (assuming the server supports it), wait for the reply from +the server, and then query for the account information. + +account-tag + +One supplementary capability that can assist a best-effort account +tracking scenario is the IRCv3-defined account-tag capability. The +account-tag capability attaches a tag with the account name associated +with the user sending a command. Enabling this capability allows Eggdrop +to update its account tracking every time a user talks in channel, sets +a mode, sends a kick, etc. While still not able to offer the same level +of accuracy as enabling the "main three" account tracking features, it +can increase the overall accuracy of the account list. Additionally, +binds that react to user activity (pub, kick, mode, etc) containing +account-tag will update the internal account list prior to executing the +associated callback, so looking up the account name in the callback can +be considered accurate. + +USING ACCOUNTS WITH TCL SCRIPTS + +The Eggdrop Tcl ACCOUNT bind is triggered whenever an existing account +record stored by Eggdrop is modified, such as a user de/authenticating +to their account while in a channel, or information such as an +account-tag being seen that updates an existing user. However, the +ACCOUNT bind will NOT be triggered for the creation of a new user +record, such as a user joining a channel. The bind is triggered for +every channel the user is seen on- this means if a user is present with +Eggdrop on four channels, the bind will be executed four times, each +time with a different channel variable being passed to the associated +Tcl procedure. Additionally, in a best-effort account tracking +situation, Eggdrop will update the account associated with a user on all +channels, not just the channel the event is seen on (and thus resulting +in a bind trigger for each channel the user is on). + +In order to trigger Tcl script events to cover all instances where a +user logs in, you need to pair an ACCOUNT bind with a JOIN bind. This +will allow you to execute account-based events when a user joins as well +as if they authenticate after joining. From 6f4309cdfb82cf0763c27d30a3db75dc96e4a8ab Mon Sep 17 00:00:00 2001 From: Geo Date: Wed, 14 Dec 2022 21:10:46 -0500 Subject: [PATCH 28/92] Roll patchlevel --- NEWS | 2 +- src/version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6dfe4de3d..6af6b7bac 100644 --- a/NEWS +++ b/NEWS @@ -35,7 +35,7 @@ Eggdrop v1.9.4: - None Tcl API changes: - - Moved the 'gotmsg' function back as a raw bind. It was inadvertantly + - Moved the 'gotmsg' function back as a raw bind. It was inadvertently moved to a rawt bind in 1.9.3, causing issuse with scripts attempting to unbind this internal reference Module changes: diff --git a/src/version.h b/src/version.h index 202b920d1..8d09a999b 100644 --- a/src/version.h +++ b/src/version.h @@ -27,5 +27,5 @@ */ #define EGG_STRINGVER "1.9.4" -#define EGG_NUMVER 1090400 -#define EGG_PATCH "alpha" +#define EGG_NUMVER 1090403 +#define EGG_PATCH "base" From a10f405bf7870dd15fbb859089d2d8f10a35ceb2 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 17 Dec 2022 16:51:12 +0000 Subject: [PATCH 29/92] Use IRC_CHANGINGSERV Found by: primalz Patch by: michaelortmann Fixes: #1327 --- src/mod/irc.mod/msgcmds.c | 2 +- src/mod/server.mod/cmdsserv.c | 2 +- src/mod/server.mod/tclserv.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/irc.mod/msgcmds.c b/src/mod/irc.mod/msgcmds.c index 4fa40e8a1..6f4e345f8 100644 --- a/src/mod/irc.mod/msgcmds.c +++ b/src/mod/irc.mod/msgcmds.c @@ -1101,7 +1101,7 @@ static int msg_jump(char *nick, char *host, struct userrec *u, char *par) putlog(LOG_CMDS, "*", "(%s!%s) !%s! JUMP", nick, host, u->handle); dprintf(-serv, "NOTICE %s :%s\n", nick, IRC_JUMP); cycle_time = 0; - nuke_server("changing servers"); + nuke_server(IRC_CHANGINGSERV); } else putlog(LOG_CMDS, "*", "(%s!%s) !%s! failed JUMP", nick, host, u->handle); return 1; diff --git a/src/mod/server.mod/cmdsserv.c b/src/mod/server.mod/cmdsserv.c index ae66204f7..1e5cbbaac 100644 --- a/src/mod/server.mod/cmdsserv.c +++ b/src/mod/server.mod/cmdsserv.c @@ -137,7 +137,7 @@ server, but Eggdrop was not compiled with SSL libraries. Skipping..."); putlog(LOG_CMDS, "*", "#%s# jump", dcc[idx].nick); dprintf(idx, "%s...\n", IRC_JUMP); cycle_time = 0; - nuke_server("changing servers"); + nuke_server(IRC_CHANGINGSERV); } static void cmd_clearqueue(struct userrec *u, int idx, char *par) diff --git a/src/mod/server.mod/tclserv.c b/src/mod/server.mod/tclserv.c index 30a6f96a0..5efbb056d 100644 --- a/src/mod/server.mod/tclserv.c +++ b/src/mod/server.mod/tclserv.c @@ -379,7 +379,7 @@ static int tcl_jump STDVAR } cycle_time = 0; - nuke_server("changing servers\n"); + nuke_server(IRC_CHANGINGSERV); return TCL_OK; } From 0e9c57ed6cb2d8f4a03b0c50377f60fef6600466 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 17 Dec 2022 16:52:28 +0000 Subject: [PATCH 30/92] Increase nouserfile output Found by: michaelortmann Patch by: michaelortmann --- src/chanprog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chanprog.c b/src/chanprog.c index 1256e9593..f5c5f6644 100644 --- a/src/chanprog.c +++ b/src/chanprog.c @@ -484,9 +484,9 @@ void chanprog() if (!readuserfile(userfile, &userlist)) { if (!make_userfile) { - char tmp[178]; + char tmp[256]; - egg_snprintf(tmp, sizeof tmp, MISC_NOUSERFILE, configfile); + snprintf(tmp, sizeof tmp, MISC_NOUSERFILE, configfile); fatal(tmp, 0); } printf("\n\n%s\n", MISC_NOUSERFILE2); From d2ac352f7d436315fb3aa4a5b14622ef2fc1d9ab Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 17 Dec 2022 16:56:11 +0000 Subject: [PATCH 31/92] Fix sasl logging Found by: michaelortmann Patch by: michaelortmann --- src/mod/server.mod/servmsg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index 9b029f22b..e1f4a84c1 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -1520,7 +1520,7 @@ static int tryauthenticate(char *from, char *msg) ret = ECDSA_sign(0, dst, olen, sig, &siglen, eckey); EC_KEY_free(eckey); if (!ret) { - printf("SASL: AUTHENTICATE: ECDSA_sign() SSL error = %s\n", + putlog(LOG_SERV, "*", "SASL: AUTHENTICATE: ECDSA_sign() SSL error = %s\n", ERR_error_string(ERR_get_error(), 0)); nfree(sig); return 1; @@ -1536,8 +1536,8 @@ static int tryauthenticate(char *from, char *msg) dprintf(DP_MODE, "AUTHENTICATE %s\n", dst); #endif /* HAVE_EVP_PKEY_GET1_EC_KEY */ #else /* TLS */ - dprintf(LOG_DEBUG, "*", "SASL: Received EC message, but no TLS EC libs " - "present. Try PLAIN method"); + putlog(LOG_SERV, "*", "SASL: Received EC message, but no TLS EC libs " + "present. Try PLAIN method"); return 1; #endif /* TLS */ } From aa214164bc14e1f9adc10734176235f2682b949e Mon Sep 17 00:00:00 2001 From: Geo Date: Sat, 17 Dec 2022 14:10:44 -0500 Subject: [PATCH 32/92] Update patchlevel 'logupdates' --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index 8d09a999b..5111478ae 100644 --- a/src/version.h +++ b/src/version.h @@ -27,5 +27,5 @@ */ #define EGG_STRINGVER "1.9.4" -#define EGG_NUMVER 1090403 -#define EGG_PATCH "base" +#define EGG_NUMVER 1090404 +#define EGG_PATCH "logupdates" From 6bec2d698c3c615dc5a1fca43a97affadc651cca Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sat, 17 Dec 2022 19:11:33 +0000 Subject: [PATCH 33/92] increase logfile length --- src/tclmisc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tclmisc.c b/src/tclmisc.c index 801ee4bce..f39e13322 100644 --- a/src/tclmisc.c +++ b/src/tclmisc.c @@ -73,7 +73,7 @@ int expmem_tclmisc() static int tcl_logfile STDVAR { int i; - char s[151]; + char s[256]; BADARGS(1, 4, " ?logModes channel logFile?"); @@ -81,7 +81,7 @@ static int tcl_logfile STDVAR /* They just want a list of the logfiles and modes */ for (i = 0; i < max_logs; i++) if (logs[i].filename != NULL) { - egg_snprintf(s, sizeof s, "%s %s %s", masktype(logs[i].mask), + snprintf(s, sizeof s, "%s %s %s", masktype(logs[i].mask), logs[i].chname, logs[i].filename); Tcl_AppendElement(interp, s); } From e3983abc36160237ba469478d52d567deb12147b Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:41:20 +0000 Subject: [PATCH 34/92] Fix some year 2038 problems Found by: michaelortmann Patch by: michaelortmann and thommey Fix time_t handling (buffer size, type and format specifier) POSIX requires time_t to be an integer type, but does not mandate that it be signed or unsigned. time_t to string conversion used buffersize 11, 10 chars + NULL-terminator, would overflow with unixtime >9999999999 (year 2286) --- src/botcmd.c | 4 ++-- src/dns.c | 2 +- src/main.c | 5 +++-- src/mod/blowfish.mod/blowfish.c | 2 +- src/mod/channels.mod/tclchan.c | 14 +++----------- src/mod/irc.mod/cmdsirc.c | 18 +++++++++--------- src/mod/irc.mod/tclirc.c | 4 ++-- src/mod/share.mod/share.c | 7 ++++--- src/tcldcc.c | 18 ++++++------------ src/tclmisc.c | 4 ++-- src/tcluser.c | 12 +++--------- src/userrec.c | 6 +++--- 12 files changed, 39 insertions(+), 57 deletions(-) diff --git a/src/botcmd.c b/src/botcmd.c index 2757026a1..60871b197 100644 --- a/src/botcmd.c +++ b/src/botcmd.c @@ -837,8 +837,8 @@ static void bot_traced(int idx, char *par) if (*c == ':') j++; } - dprintf(i, "%s -> %s (%lu secs, %d hop%s)\n", BOT_TRACERESULT, p, - now - t, j, (j != 1) ? "s" : ""); + dprintf(i, "%s -> %s (%" PRId64 " secs, %d hop%s)\n", BOT_TRACERESULT, + p, (int64_t) (now - t), j, (j != 1) ? "s" : ""); } else dprintf(i, "%s -> %s\n", BOT_TRACERESULT, p); } diff --git a/src/dns.c b/src/dns.c index 6d5c67f79..48454742b 100644 --- a/src/dns.c +++ b/src/dns.c @@ -86,7 +86,7 @@ static void eof_dcc_dnswait(int idx) static void display_dcc_dnswait(int idx, char *buf) { - sprintf(buf, "dns waited %lis", (long) (now - dcc[idx].timeval)); + sprintf(buf, "dns waited %" PRId64 "s", (int64_t) (now - dcc[idx].timeval)); } static int expmem_dcc_dnswait(void *x) diff --git a/src/main.c b/src/main.c index d4bee020c..7fff6c6fe 100644 --- a/src/main.c +++ b/src/main.c @@ -651,13 +651,14 @@ static void core_secondly() /* In case for some reason more than 1 min has passed: */ while (nowmins != lastmin) { /* Timer drift, dammit */ - debug1("timer: drift (%f seconds)", difftime(nowmins, lastmin)); + debug1("timer: drift (%" PRId64 " seconds)", (int64_t) (nowmins - lastmin)); i++; ++lastmin; call_hook(HOOK_MINUTELY); } if (i > 1) - putlog(LOG_MISC, "*", "(!) timer drift -- spun %f minutes", difftime(nowmins, lastmin)/60); + putlog(LOG_MISC, "*", "(!) timer drift -- spun %" PRId64 " minutes", + ((int64_t) (nowmins - lastmin)) / 60); miltime = (nowtm.tm_hour * 100) + (nowtm.tm_min); if (((int) (nowtm.tm_min / 5) * 5) == (nowtm.tm_min)) { /* 5 min */ call_hook(HOOK_5MINUTELY); diff --git a/src/mod/blowfish.mod/blowfish.c b/src/mod/blowfish.mod/blowfish.c index af03c8f1a..867efc30d 100644 --- a/src/mod/blowfish.mod/blowfish.c +++ b/src/mod/blowfish.mod/blowfish.c @@ -153,7 +153,7 @@ static void blowfish_report(int idx, int details) dprintf(idx, " %d of %d boxes in use:", tot, BOXES); for (i = 0; i < BOXES; i++) if (box[i].P != NULL) { - dprintf(idx, " (age: %f)", difftime(now, box[i].lastuse)); + dprintf(idx, " (age: %" PRId64 ")", (int64_t) (now - box[i].lastuse)); } dprintf(idx, "\n"); } diff --git a/src/mod/channels.mod/tclchan.c b/src/mod/channels.mod/tclchan.c index 06b33b8d3..7f13f6197 100644 --- a/src/mod/channels.mod/tclchan.c +++ b/src/mod/channels.mod/tclchan.c @@ -1720,25 +1720,17 @@ static int tcl_channel_modify(Tcl_Interp *irp, struct chanset_t *chan, static int tcl_do_masklist(maskrec *m, Tcl_Interp *irp) { char ts[21], ts1[21], ts2[21], *p; - long tv; EGG_CONST char *list[6]; for (; m; m = m->next) { list[0] = m->mask; list[1] = m->desc; - - tv = m->expire; - sprintf(ts, "%lu", tv); + snprintf(ts, sizeof ts, "%" PRId64, (int64_t) m->expire); list[2] = ts; - - tv = m->added; - sprintf(ts1, "%lu", tv); + snprintf(ts1, sizeof ts1, "%" PRId64, (int64_t) m->added); list[3] = ts1; - - tv = m->lastactive; - sprintf(ts2, "%lu", tv); + snprintf(ts2, sizeof ts2, "%" PRId64, (int64_t) m->lastactive); list[4] = ts2; - list[5] = m->user; p = Tcl_Merge(6, list); Tcl_AppendElement(irp, p); diff --git a/src/mod/irc.mod/cmdsirc.c b/src/mod/irc.mod/cmdsirc.c index 66179ba6d..ccbb75657 100644 --- a/src/mod/irc.mod/cmdsirc.c +++ b/src/mod/irc.mod/cmdsirc.c @@ -853,21 +853,21 @@ static void cmd_channel(struct userrec *u, int idx, char *par) else chanflag = ' '; if (chan_issplit(m)) { - dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- netsplit, %fs\n", - chanflag, maxnicklen, m->nick, maxhandlen, handle, maxnicklen, - m->account, s, atrflag, difftime(now, m->split)); + dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- netsplit, %" PRId64 "s\n", + chanflag, maxnicklen, m->nick, maxhandlen, handle, maxnicklen, + m->account, s, atrflag, (int64_t) (now - m->split)); } else if (!rfc_casecmp(m->nick, botname)) { - dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- it's me!\n", chanflag, - maxnicklen, m->nick, maxhandlen, handle, maxnicklen, m->account, - s, atrflag); + dprintf(idx, "%c%-*s %-*s %-*s %-6s %c <- it's me!\n", + chanflag, maxnicklen, m->nick, maxhandlen, handle, maxnicklen, + m->account, s, atrflag); } else { /* Determine idle time */ if (now - (m->last) > 86400) - egg_snprintf(s1, sizeof s1, "%2lud", ((now - (m->last)) / 86400)); + snprintf(s1, sizeof s1, "%2" PRId64 "d", ((int64_t) (now - m->last)) / 86400); else if (now - (m->last) > 3600) - egg_snprintf(s1, sizeof s1, "%2luh", ((now - (m->last)) / 3600)); + snprintf(s1, sizeof s1, "%2" PRId64 "h", ((int64_t) (now - m->last)) / 3600); else if (now - (m->last) > 180) - egg_snprintf(s1, sizeof s1, "%2lum", ((now - (m->last)) / 60)); + snprintf(s1, sizeof s1, "%2" PRId64 "m", ((int64_t) (now - m->last)) / 60); else strlcpy(s1, " ", sizeof s1); if (chan_ircaway(m)) { diff --git a/src/mod/irc.mod/tclirc.c b/src/mod/irc.mod/tclirc.c index ea5bef5fe..0b6abd416 100644 --- a/src/mod/irc.mod/tclirc.c +++ b/src/mod/irc.mod/tclirc.c @@ -690,13 +690,13 @@ static int tcl_getchanidle STDVAR static int tcl_chanmasks(masklist *m, Tcl_Interp *irp) { - char work[20], *p; + char work[21], *p; EGG_CONST char *list[3]; for (; m && m->mask && m->mask[0]; m = m->next) { list[0] = m->mask; list[1] = m->who; - simple_sprintf(work, "%d", now - m->timer); + snprintf(work, sizeof work, "%" PRId64, (int64_t) (now - m->timer)); list[2] = work; p = Tcl_Merge(3, list); Tcl_AppendElement(irp, p); diff --git a/src/mod/share.mod/share.c b/src/mod/share.mod/share.c index 57d4c3292..dc8a1f1c7 100644 --- a/src/mod/share.mod/share.c +++ b/src/mod/share.mod/share.c @@ -1232,7 +1232,8 @@ static void share_ufsend(int idx, char *par) int i, sock; FILE *f; - egg_snprintf(s, sizeof s, ".share.%s.%li.users", botnetnick, now); + snprintf(s, sizeof s, ".share.%s.%" PRId64 ".users", botnetnick, + (int64_t) now); if (!(b_status(idx) & STAT_SHARE)) { dprintf(idx, "s e You didn't ask; you just started sending.\n"); dprintf(idx, "s e Ask before sending the userfile.\n"); @@ -2038,8 +2039,8 @@ static void start_sending_users(int idx) struct chanset_t *cst; char s[EGG_INET_ADDRSTRLEN]; - egg_snprintf(share_file, sizeof share_file, ".share.%s.%lu", dcc[idx].nick, - now); + snprintf(share_file, sizeof share_file, ".share.%s.%" PRId64, dcc[idx].nick, + (int64_t) now); if (dcc[idx].u.bot->uff_flags & UFF_OVERRIDE) { debug1("NOTE: Sharing aggressively with %s, overriding its local bots.", dcc[idx].nick); diff --git a/src/tcldcc.c b/src/tcldcc.c index 6a7702b29..3fd96e0f0 100644 --- a/src/tcldcc.c +++ b/src/tcldcc.c @@ -702,9 +702,8 @@ static void build_sock_list(Tcl_Interp *irp, Tcl_Obj *masterlist, char *idxstr, /* Gather information for dcclist or socklist */ static void dccsocklist(Tcl_Interp *irp, int argc, char *type, int src) { int i; - char idxstr[10], timestamp[11], other[160]; + char idxstr[10], timestamp[21], other[160]; char portstring[7]; /* ssl + portmax + NULL */ - long tv; char s[EGG_INET_ADDRSTRLEN]; socklen_t namelen; struct sockaddr_storage ss; @@ -718,8 +717,7 @@ static void dccsocklist(Tcl_Interp *irp, int argc, char *type, int src) { if (argc == 1 || ((argc == 2) && (dcc[i].type && !strcasecmp(dcc[i].type->name, type)))) { egg_snprintf(idxstr, sizeof idxstr, "%ld", dcc[i].sock); - tv = dcc[i].timeval; - egg_snprintf(timestamp, sizeof timestamp, "%ld", tv); + snprintf(timestamp, sizeof timestamp, "%" PRId64, (int64_t) dcc[i].timeval); if (dcc[i].type && dcc[i].type->display) dcc[i].type->display(i, other); else { @@ -785,8 +783,7 @@ static int tcl_dcclist STDVAR static int tcl_whom STDVAR { int chan, i; - char c[2], idle[32], work[20], *p; - long tv = 0; + char c[2], idle[21], work[20], *p; EGG_CONST char *list[7]; BADARGS(2, 2, " chan"); @@ -815,8 +812,7 @@ static int tcl_whom STDVAR if (dcc[i].u.chat->channel == chan || chan == -1) { c[0] = geticon(i); c[1] = 0; - tv = (now - dcc[i].timeval) / 60; - egg_snprintf(idle, sizeof idle, "%li", tv); + snprintf(idle, sizeof idle, "%" PRId64, (int64_t) ((now - dcc[i].timeval) / 60)); list[0] = dcc[i].nick; list[1] = botnetnick; list[2] = dcc[i].host; @@ -838,10 +834,8 @@ static int tcl_whom STDVAR c[1] = 0; if (party[i].timer == 0L) strcpy(idle, "0"); - else { - tv = (now - party[i].timer) / 60; - egg_snprintf(idle, sizeof idle, "%li", tv); - } + else + snprintf(idle, sizeof idle, "%" PRId64, (int64_t) ((now - party[i].timer) / 60)); list[0] = party[i].nick; list[1] = party[i].bot; list[2] = party[i].from ? party[i].from : ""; diff --git a/src/tclmisc.c b/src/tclmisc.c index f39e13322..f1270bc8d 100644 --- a/src/tclmisc.c +++ b/src/tclmisc.c @@ -404,12 +404,12 @@ static int tcl_duration STDVAR static int tcl_unixtime STDVAR { - char s[11]; + char s[21]; time_t now2 = time(NULL); BADARGS(1, 1, ""); - egg_snprintf(s, sizeof s, "%li", (long) now2); + snprintf(s, sizeof s, "%" PRId64, (int64_t) now2); Tcl_AppendResult(irp, s, NULL); return TCL_OK; } diff --git a/src/tcluser.c b/src/tcluser.c index 987a0e6dc..e94334ded 100644 --- a/src/tcluser.c +++ b/src/tcluser.c @@ -611,8 +611,7 @@ static int tcl_killignore STDVAR static int tcl_ignorelist STDVAR { - char expire[11], added[11], *p; - long tv; + char expire[21], added[21], *p; EGG_CONST char *list[5]; struct igrec *i; @@ -621,15 +620,10 @@ static int tcl_ignorelist STDVAR for (i = global_ign; i; i = i->next) { list[0] = i->igmask; list[1] = i->msg; - - tv = i->expire; - egg_snprintf(expire, sizeof expire, "%lu", tv); + snprintf(expire, sizeof expire, "%" PRId64, (int64_t) i->expire); list[2] = expire; - - tv = i->added; - egg_snprintf(added, sizeof added, "%lu", tv); + snprintf(added, sizeof added, "%" PRId64, (int64_t) i->added); list[3] = added; - list[4] = i->user; p = Tcl_Merge(5, list); Tcl_AppendElement(irp, p); diff --git a/src/userrec.c b/src/userrec.c index 9a8f19f49..fce760230 100644 --- a/src/userrec.c +++ b/src/userrec.c @@ -656,7 +656,7 @@ struct userrec *adduser(struct userrec *bu, char *handle, char *host, struct userrec *u, *x; struct xtra_key *xk; int oldshare = noshare; - long tv; + time_t tv; noshare = 1; u = nmalloc(sizeof *u); @@ -680,9 +680,9 @@ struct userrec *adduser(struct userrec *bu, char *handle, char *host, xk->key = nmalloc(8); strcpy(xk->key, "created"); tv = now; - l = snprintf(NULL, 0, "%li", tv); + l = snprintf(NULL, 0, "%" PRId64, (int64_t) tv); xk->data = nmalloc(l + 1); - sprintf(xk->data, "%li", tv); + sprintf(xk->data, "%" PRId64, (int64_t) tv); set_user(&USERENTRY_XTRA, u, xk); } /* Strip out commas -- they're illegal */ From 5cec6dbed0d6c68ac157e1da78d76d9d2cf28941 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:43:19 +0000 Subject: [PATCH 35/92] Update BUG-REEPORT --- doc/BUG-REPORT | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/BUG-REPORT b/doc/BUG-REPORT index f1ceda1e8..3c279c599 100644 --- a/doc/BUG-REPORT +++ b/doc/BUG-REPORT @@ -26,7 +26,7 @@ DO NOT SEND HTML E-MAIL TO THE LISTS. 1) INFORMATION ABOUT YOUR EGGDROP 1.1) Eggdrop version: - 1.8.__ + 1.9._ 1.2) Make type: ( ) dynamic @@ -42,17 +42,13 @@ DO NOT SEND HTML E-MAIL TO THE LISTS. 2) INFORMATION ABOUT TCL 2.1) Tcl library version: - ( ) 8.3 - ( ) 8.4 - ( ) 8.5 - ( ) 8.6 + ( ) 8.3._ + ( ) 8.4._ + ( ) 8.5._ + ( ) 8.6._ ( ) Other - Which? ____ -2.2) Tcl library patchlevel: ___ - eg; p1, p2, etc for Tcl versions up to 8.0p2 - or the 3rd part of the version number for 8.0.3 and newer - -2.3) Tcl scripts used: +2.2) Tcl scripts used: [ ] alltools [ ] sentinel [ ] getops @@ -81,6 +77,7 @@ DO NOT SEND HTML E-MAIL TO THE LISTS. ( ) SINIX ( ) Solaris/SunOS/OpenIndiana ( ) Ultrix + ( ) Windows Subsystem for Linux (WSL) ( ) Other - Which? _____________ 3.2) OS Version/Release: _____________ @@ -110,8 +107,10 @@ DO NOT SEND HTML E-MAIL TO THE LISTS. useful if you could paste gdb's output during the following steps: First call gdb $ gdb eggdrop -c core + (systemd users could try coredumpctl) and then enter 'bt' on gdb's command line: (gdb) bt + (even more information could be obtained with 'bt full') Keep your core file for at least one week, so that the dev team can ask for further information if needed. However, don't send us the core file unless we ask for it. From 6eee0f54a7d53304321c42c506a6f58b7e69e376 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 19 Dec 2022 15:39:27 -0500 Subject: [PATCH 36/92] Only update bothost on own chghost Found by: Geo Patch by: Geo Eggdrop incorrectly updated its own internally-tracked hostname with any host in a CHGHOST, whether it was intended for Eggdrop or not. --- src/mod/server.mod/servmsg.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mod/server.mod/servmsg.c b/src/mod/server.mod/servmsg.c index e1f4a84c1..5bb4f31d2 100644 --- a/src/mod/server.mod/servmsg.c +++ b/src/mod/server.mod/servmsg.c @@ -1320,7 +1320,9 @@ static int got396orchghost(char *nick, char *user, char *uhost) m = ismember(chan, nick); if (m) { snprintf(m->userhost, sizeof m->userhost, "%s@%s", user, uhost); - strcpy(botuserhost, m->userhost); + if (!rfc_casecmp(m->nick, botname)) { + strcpy(botuserhost, m->userhost); + } } } return 0; From 22586b4dc9fd9fde5b5d0c97ec7d435a200937ae Mon Sep 17 00:00:00 2001 From: Simon Lyngshede Date: Fri, 30 Dec 2022 20:03:45 +0100 Subject: [PATCH 37/92] Fix doc links to binds Patch by: @slyngshede --- doc/html/tutorials/firstscript.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/html/tutorials/firstscript.html b/doc/html/tutorials/firstscript.html index fb00cb559..7097af445 100644 --- a/doc/html/tutorials/firstscript.html +++ b/doc/html/tutorials/firstscript.html @@ -113,7 +113,7 @@

      Writing an Eggdrop Scriptcore Tcl language commands, especially the string- and list-related commands, as well as Eggdrop’s own library of custom Tcl commands, located in tcl-commands.doc

      +get familiar with the core Tcl language commands, especially the string- and list-related commands, as well as Eggdrop’s own library of custom Tcl commands, located in tcl-commands.doc

      If you have the .tcl command enabled, you can load a script by typing ‘.tcl source script/file.tcl’ to load it. Otherwise, add it to your config file like normal (examples to do so are at the bottom of the config file) and @@ -176,7 +176,7 @@

      Writing an Eggdrop Script
      bind join - * greet
       
      -

      This is a bind. This sets up an action that Eggdrop will react to. You can read all the binds that Eggdrop uses here. Generally, we like to place all binds towards the top of the script so that they are together and easy to find. Now, let’s look at documentation of the bind join together.

      +

      This is a bind. This sets up an action that Eggdrop will react to. You can read all the binds that Eggdrop uses here. Generally, we like to place all binds towards the top of the script so that they are together and easy to find. Now, let’s look at documentation of the bind join together.

      @@ -270,4 +270,4 @@

      Writing an Eggdrop Script Date: Sun, 12 Feb 2023 14:11:49 -0500 Subject: [PATCH 40/92] Update Tcl repo Found by: @robert-scheck Fixes: #1379 Confirmed with Tcl devs that they no longer maintain the FTP; updating suggested download repo in configure. --- configure | 4 ++-- configure.ac | 2 +- src/mod/compress.mod/configure | 2 +- src/mod/dns.mod/configure | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configure b/configure index b7e1fb352..7372012d6 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 13ab0170. +# From configure.ac 533f882a. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop 1.9.4. # @@ -7985,7 +7985,7 @@ rm -f conftest.mmap conftest.txt # Tcl version to recommend if no Tcl is found, and the site where it can be # found for download. tclrecommendver="8.6.X" -tclrecommendsite="ftp://ftp.tcl.tk/pub/tcl/tcl8_6/" +tclrecommendsite="https://sourceforge.net/projects/tcl/files/Tcl/" # Tcl header filenames. tclheadernames="tcl.h" diff --git a/configure.ac b/configure.ac index f6c66bbae..c101fedf0 100644 --- a/configure.ac +++ b/configure.ac @@ -122,7 +122,7 @@ AC_FUNC_MMAP # Tcl version to recommend if no Tcl is found, and the site where it can be # found for download. tclrecommendver="8.6.X" -tclrecommendsite="ftp://ftp.tcl.tk/pub/tcl/tcl8_6/" +tclrecommendsite="https://sourceforge.net/projects/tcl/files/Tcl/" # Tcl header filenames. tclheadernames="tcl.h" diff --git a/src/mod/compress.mod/configure b/src/mod/compress.mod/configure index 29f9f2adc..3ea939674 100755 --- a/src/mod/compress.mod/configure +++ b/src/mod/compress.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 13ab0170. +# From configure.ac 533f882a. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop Compress Module 1.9.4. # diff --git a/src/mod/dns.mod/configure b/src/mod/dns.mod/configure index 00072f073..84e203692 100755 --- a/src/mod/dns.mod/configure +++ b/src/mod/dns.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 13ab0170. +# From configure.ac 533f882a. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop DNS Module 1.9.4. # From 0406c4b5ba42ac0a7e2a891b7267c845f1775fea Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 12 Feb 2023 14:12:47 -0500 Subject: [PATCH 41/92] Add TLS doc link to botnet doc Found by: @ZarTek-Creole Fixes: #1396 --- doc/sphinx_source/using/botnet.rst | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/sphinx_source/using/botnet.rst b/doc/sphinx_source/using/botnet.rst index 7dea0d324..6757598b5 100644 --- a/doc/sphinx_source/using/botnet.rst +++ b/doc/sphinx_source/using/botnet.rst @@ -1,5 +1,4 @@ Botnet Sharing and Linking -Last revised: Nov 09, 2017 ========================== Botnet Sharing and Linking @@ -150,6 +149,10 @@ Here is an example scenario: 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. +Secure (TLS) Links +^^^^^^^^^^^^^^^^^^ +Since Eggdrop 1.8.0, the ability to encrypt bot links using TLS is possible. On the hub bot you would prefix the port given in the `listen` command with a +, and when you add the hub bot to the leaf, you would prefix the port used in the `.+bot` command with a +. In other words, you would set `listen +5555` in the hub config and use `.+bot hubbot 1.2.3.4 +5555` on the leaf bot. These settings are explained more thoroughly in the `TLS botnet documentation. `_ + Using botflags -------------- @@ -315,4 +318,8 @@ Making bots share user records |-+beldin `-+Lameshare +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 intead of passwords for authentication. + Copyright (C) 1999 - 2022 Eggheads Development Team From 7c6905000b8e0d8cdb65a4951efaae1977d684e5 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 12 Feb 2023 19:15:00 +0000 Subject: [PATCH 42/92] Fix Twitch mod crash Found by: Lord255 Patch by: michaelortmann Fixes: #1380 --- src/mod/twitch.mod/twitch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mod/twitch.mod/twitch.c b/src/mod/twitch.mod/twitch.c index 7efc8cc71..542d5c3a9 100644 --- a/src/mod/twitch.mod/twitch.c +++ b/src/mod/twitch.mod/twitch.c @@ -843,6 +843,7 @@ static char *twitch_close() del_bind_table(H_rmst); del_bind_table(H_usst); del_bind_table(H_usrntc); + Tcl_UntraceVar(interp, "keep-nick", TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, traced_keepnick, NULL); module_undepend(MODULE_NAME); return NULL; } From 156c99d3bf7af1bec3291f12d1a6b20a23dad946 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 12 Feb 2023 19:18:39 +0000 Subject: [PATCH 43/92] Make init_threaddata() return void Patch by: michaelortmann --- src/main.c | 2 +- src/proto.h | 2 +- src/tcl.c | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index 7fff6c6fe..9ab60c6de 100644 --- a/src/main.c +++ b/src/main.c @@ -778,7 +778,7 @@ void check_static(char *, char *(*)()); #include "mod/static.h" #endif -int init_threaddata(int); +void init_threaddata(int); int init_mem(); int init_userent(); int init_misc(); diff --git a/src/proto.h b/src/proto.h index 054fe204d..f1940773b 100644 --- a/src/proto.h +++ b/src/proto.h @@ -302,7 +302,7 @@ void safe_write(int, const void *, size_t); /* tcl.c */ struct threaddata *threaddata(void); -int init_threaddata(int); +void init_threaddata(int); void protect_tcl(void); void unprotect_tcl(void); void do_tcl(char *, char *); diff --git a/src/tcl.c b/src/tcl.c index 770dbacbb..3e6265ae2 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -620,7 +620,7 @@ struct threaddata *threaddata() #endif /* REPLACE_NOTIFIER */ -int init_threaddata(int mainthread) +void init_threaddata(int mainthread) { struct threaddata *td = threaddata(); /* Nested evaluation (vwait/update) of the event loop only @@ -636,7 +636,6 @@ int init_threaddata(int mainthread) td->blocktime.tv_usec = 0; td->MAXSOCKS = 0; increase_socks_max(); - return 0; } /* Not going through Tcl's crazy main() system (what on earth was he From b06f20a951cbc1bd9d01bd737a85cac5314e4ba0 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 12 Feb 2023 19:19:07 +0000 Subject: [PATCH 44/92] Cleanup: unused but set variable Patch by: michaelortmann --- src/mod/channels.mod/tclchan.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mod/channels.mod/tclchan.c b/src/mod/channels.mod/tclchan.c index 7f13f6197..8f6b1c926 100644 --- a/src/mod/channels.mod/tclchan.c +++ b/src/mod/channels.mod/tclchan.c @@ -2282,7 +2282,7 @@ static int tcl_deludef STDVAR static int tcl_getudefs STDVAR { struct udef_struct *ul; - int type = 0, count = 0; + int type = 0; BADARGS(1, 2, " ?type?"); @@ -2302,7 +2302,6 @@ static int tcl_getudefs STDVAR for (ul = udef; ul; ul = ul->next) if (!type || (ul->type == type)) { Tcl_AppendElement(irp, ul->name); - count++; } return TCL_OK; From 45192be32c964c8aa5561014060e6ed1e40487f7 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Sun, 12 Feb 2023 20:21:20 +0100 Subject: [PATCH 45/92] Workaround for TCL_UTF_MAX==3 Found by: Empus Patch by: thommey Fixes: #1163 Ugly workaround that does not break current usage of emoji in the Tcl API. Our usage of the Tcl API is not correct because Eggdrop is encoding agnostic, and processes byte arrays only. Those however get passed to Tcl as strings, when they are not. The real solution is fairly complex (decode all bytes into strings with the proper encoding guess from/to the Tcl API). If users are unable to recompile Tcl with increased TCL_UTF_MAX and are stuck with 8.6 stable (8.7 is not released as stable at the time of this PR), this should be a suitable, albeit ugly and complex, workaround that keeps emoji support alive. We do not wish to break the currently working emoji usage however, which mostly works in the current state, except for a crash if passed to [string tolower/toupper/totitle], other problematic call sites aren't known. So we overwrite Tcl's string tolower/toupper/totitle with our own version that: detects utf-8 sequences that are 4 bytes converts them into utf-8 encoded surrogate pairs before Tcl's string functions are called those remain untouched by case changes in Tcl convert the surrogate pairs back in the result to the original utf-8 4-byte code sequences Side effect is that we also convert surrogate pairs if they were sent as such, which should not have a negative impact on existing scripts. Single-byte encodings being valid 4-byte emoji sequences or 6-byte surrogate pairs is hopefully highly unlikely. --- src/tcl.c | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) diff --git a/src/tcl.c b/src/tcl.c index 3e6265ae2..6e02af9e2 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -96,6 +96,17 @@ int handlen = HANDLEN; extern Tcl_VarTraceProc traced_myiphostname, traced_natip, traced_remove_pass; +/* Unicode workaround for Tcl versions that only support BMP characters (3 byte utf-8) */ +#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 5 && TCL_MINOR_VERSION <= 6 && TCL_UTF_MAX < 4 +# define TCL_WORKAROUND_UNICODESUP 1 +struct tcl_unicodesup_info { + const char *subcmd; + Tcl_Obj *cmd; +}; +#endif + + + int expmem_tcl() { return strtot; @@ -638,6 +649,267 @@ void init_threaddata(int mainthread) increase_socks_max(); } +/* workaround for Tcl that does not support unicode outside BMP (3 byte utf-8 characters) */ +#ifdef TCL_WORKAROUND_UNICODESUP + +/* Based on https://github.com/skeeto/branchless-utf8 which is released into the public domain */ +/* 0 means not utf-8, so the length is still 1 but we can distinguish that case, + * that's why len = len + !len is used, to convert 0 to 1 and leave the rest as-is + */ +static const char utf8lengths[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0 +}; + +/* quick check if tricks are needed, only if 4-byte utf-8 characters are used */ +int needs_unicodesup(const char *str) +{ + while (*str) { + int len = utf8lengths[((unsigned char)str[0]) >> 3] + !utf8lengths[((unsigned char)str[0]) >> 3]; + + if (len == 4) { + return 1; + } + while (len--) { + if (*str++ == '\0') { + break; + } + } + } + return 0; +} + +/* return a new Tcl_StringObj with 4-byte utf-8 characters replaced by surrogate pairs + * - decode 4-byte utf-8 into unicode codepoint c + * - calculate high and low surrogate unicode codepoints high/low + * - encode high/low as 3-byte utf-8 strings + * the length of the result could be len/4*6 bytes long, so + * to avoid frequent reallocation/string appending, a temporary buffer is used + * for long strings (>512 characters, which does not apply to IRC lines) and assembled to a Tcl_DString + * for short strings the 512 character buffer is enough + */ +Tcl_Obj *egg_string_unicodesup_surrogate(const char *oldstr, int len) +{ + int stridx = 0, bufidx = 0; + char buf[512]; + Tcl_DString ds; + Tcl_Obj *result; + + /* chunked */ + if (len > sizeof buf) { + Tcl_DStringInit(&ds); + } + + while (stridx < len) { + int charlen = utf8lengths[((unsigned char)oldstr[stridx]) >> 3] + !utf8lengths[((unsigned char)oldstr[stridx])>> 3]; + + if (charlen == 4 && stridx + 4 <= len) { + uint32_t c; + uint16_t high, low; + + /* decode 4-byte utf-8 into unicode codepoint */ + c = (uint32_t)(oldstr[stridx++] & 0x07) << 18; + c |= (uint32_t)(oldstr[stridx++] & 0x3f) << 12; + c |= (uint32_t)(oldstr[stridx++] & 0x3f) << 6; + c |= (uint32_t)(oldstr[stridx++] & 0x3f) << 0; + + /* calculate high and low surrogate unicode codepoints */ + c -= 0x10000; + high = 0xD800 + ((c & 0xffc00) >> 10); + low = 0xDC00 + (c & 0x3ff); + + /* encode high surrogate as utf-8 */ + buf[bufidx++] = 0xe0 | ((high >> 12) & 0xf); + buf[bufidx++] = 0x80 | ((high >> 6) & 0x3f); + buf[bufidx++] = 0x80 | ((high >> 0) & 0x3f); + + /* encode low surrogate as utf-8 */ + buf[bufidx++] = 0xe0 | ((low >> 12) & 0xf); + buf[bufidx++] = 0x80 | ((low >> 6) & 0x3f); + buf[bufidx++] = 0x80 | ((low >> 0) & 0x3f); + } else { + /* copy everything else verbatim */ + while (charlen-- && stridx < len) { + buf[bufidx++] = oldstr[stridx++]; + } + } + if (len > sizeof buf && bufidx > sizeof buf - 6) { + Tcl_DStringAppend(&ds, buf, bufidx); + bufidx = 0; + } + } + if (len > sizeof buf && bufidx) { + Tcl_DStringAppend(&ds, buf, bufidx); + result = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); + Tcl_DStringFree(&ds); + } else { + result = Tcl_NewStringObj(buf, bufidx); + } + return result; +} + +/* decode 2 utf-8 sequences that are 3 bytes long and check if they are surrogate pairs */ +int decode_surrogates(const char *str, uint32_t *high, uint32_t *low) +{ + *high = (*str++ & 0xf) << 12; + *high |= (*str++ & 0x3f) << 6; + *high |= (*str++ & 0x3f) << 0; + if (*high < 0xD800 || *high > 0xDBFF) { + return 0; + } + *low = (*str++ & 0xf) << 12; + *low |= (*str++ & 0x3f) << 6; + *low |= (*str++ & 0x3f) << 0; + if (*low < 0xDC00 || *low > 0xDFFF) { + return 0; + } + return 1; +} + +/* returns a new Tcl_StringObj by replacing surrogate pairs back into 4-byte utf-8 sequences + * - for every 3-byte utf-8 sequence, check if it's a surrogate pair + * - decode into high/low codepoints + * - calculate original codepoint and write back a 4-byte utf-8 sequence instead of 3-byte surrogate pairs + * the length of the result is guaranteed to be equal or shorter than the original, so malloc(len) is sufficient space + */ +Tcl_Obj *egg_string_unicodesup_desurrogate(const char *oldstr, int len) +{ + int stridx = 0, bufidx = 0; + char *buf = nmalloc(len); + + while (stridx < len) { + uint32_t low, high; + int charlen = utf8lengths[((unsigned char)oldstr[stridx]) >> 3] + !utf8lengths[((unsigned char)oldstr[stridx]) >> 3]; + + if (charlen == 3 && stridx + 6 <= len && utf8lengths[((unsigned char)oldstr[stridx + 3]) >> 3] == 3 && decode_surrogates(oldstr + stridx, &high, &low)) { + uint32_t c = 0x10000 + (high - 0xD800) * 0x400 + (low - 0xDC00); + + buf[bufidx++] = 0xF0 | ((c >> 18) & 0x07); + buf[bufidx++] = 0x80 | ((c >> 12) & 0x3f); + buf[bufidx++] = 0x80 | ((c >> 6) & 0x3f); + buf[bufidx++] = 0x80 | ((c >> 0) & 0x3f); + + stridx += 6; + } else { + while (charlen-- && stridx < len) { + buf[bufidx++] = oldstr[stridx++]; + } + } + } + return Tcl_NewStringObj(buf, bufidx); +} + +/* C function called for ::egg_tcl_tolower/toupper/totitle + * context (original Tcl function and which conversion to do) is in cd + */ +int egg_string_unicodesup(void *cd, Tcl_Interp *interp, int objc, Tcl_Obj *const orig_objv[]) +{ + struct tcl_unicodesup_info *info = cd; + Tcl_Obj **new_objv; + int i; + int ret; + + /* impossible? */ + if (objc == 0) { + return Tcl_EvalObjv(interp, objc, orig_objv, 0); + } + /* new arguments to original Tcl string tolower/toupper/totitle */ + new_objv = nmalloc(objc * sizeof *new_objv); + + for (i = 0; i < objc; i++) { + if (i == 0) { + /* overwrite command objv[0] with original Tcl command instead of this function */ + new_objv[i] = info->cmd; + } else if (i == 1 && needs_unicodesup(Tcl_GetString(orig_objv[1]))) { + int len; + const char *oldstr = Tcl_GetStringFromObj(orig_objv[1], &len); + + /* overwrite string argument by replacing 4-byet utf-8 sequences with surrogate pairs */ + new_objv[1] = egg_string_unicodesup_surrogate(oldstr, len); + } else { + /* copy other arguments, e.g. string tolower test 1 2 */ + new_objv[i] = orig_objv[i]; + } + /* ref count of new objects must be increased before eval and decreased after, orig_objv is read-only */ + Tcl_IncrRefCount(new_objv[i]); + } + + /* call original Tcl function */ + ret = Tcl_EvalObjv(interp, objc, new_objv, 0); + + /* decrease ref count of new arguments */ + for (i = 0; i < objc; i++) { + Tcl_DecrRefCount(new_objv[i]); + } + nfree(new_objv); + /* overwrite Tcl's result by replacing surrogates back to 4-byte utf-8 sequences*/ + if (ret == TCL_OK) { + int len; + Tcl_Obj *resultobj = Tcl_GetObjResult(interp); + const char *str = Tcl_GetStringFromObj(resultobj, &len); + + Tcl_SetObjResult(interp, egg_string_unicodesup_desurrogate(str, len)); + } + return ret; +} + +/* register a single workaround command, making the namespace ensemble string call ::egg_string_ instead + * original command names are ::tcl::string:: + */ +void init_unicodesup_cmd(Tcl_Obj *ensdict, const char *subcmd, int index) +{ + Tcl_Obj *orig_cmd; + static struct tcl_unicodesup_info info[3]; + char buf[64]; + + if (Tcl_DictObjGet(interp, ensdict, Tcl_NewStringObj(subcmd, -1), &orig_cmd) != TCL_OK || !orig_cmd) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup could not find string %s subcommand", subcmd); + return; + } + + info[index].subcmd = subcmd; + info[index].cmd = orig_cmd; + Tcl_IncrRefCount(orig_cmd); + + snprintf(buf, sizeof buf, "::egg_string_%s", subcmd); + Tcl_CreateObjCommand(interp, buf, egg_string_unicodesup, &info[index], NULL); + + if (Tcl_DictObjPut(interp, ensdict, Tcl_NewStringObj(subcmd, -1), Tcl_NewStringObj(buf, -1)) != TCL_OK) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup could not set dictionary redirect"); + return; + } +} + +/* register all workaround functions */ +void init_unicodesup(void) +{ + Tcl_Obj *ensdict; + Tcl_Command enscmd = Tcl_FindEnsemble(interp, Tcl_NewStringObj("string", -1), 0); + + if (!enscmd) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup could not find string command"); + return; + } + if (!Tcl_IsEnsemble(enscmd)) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup is not a namespace ensemble"); + return; + } + if (Tcl_GetEnsembleMappingDict(interp, enscmd, &ensdict) != TCL_OK || !ensdict) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup could not get namespace ensemble dictionary"); + return; + } + + init_unicodesup_cmd(ensdict, "tolower", 0); + init_unicodesup_cmd(ensdict, "toupper", 1); + init_unicodesup_cmd(ensdict, "totitle", 2); + + if (Tcl_SetEnsembleMappingDict(interp, enscmd, ensdict) != TCL_OK) { + putlog(LOG_MISC, "*", "ERROR: Tcl non-BMP unicodesup could not set namespace ensemble dictionary"); + return; + } +} +#endif /* TCL_WORKAROUND_UNICODESUP */ + /* Not going through Tcl's crazy main() system (what on earth was he * smoking?!) so we gotta initialize the Tcl interpreter */ @@ -768,6 +1040,9 @@ void init_tcl(int argc, char **argv) } Tcl_PkgProvide(interp, "eggdrop", pver); +#ifdef TCL_WORKAROUND_UNICODESUP + init_unicodesup(); +#endif /* Initialize binds and traces */ init_bind(); init_traces(); From aefed9945d8cb4d3fbad3884ee9807fec00bd4b1 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 12 Feb 2023 21:26:51 +0000 Subject: [PATCH 46/92] Add ssl header version to .status Found by: wheel Patch by: michaelortmann Fixes: #1322 --- src/chanprog.c | 12 ++++++------ src/lang.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/chanprog.c b/src/chanprog.c index f5c5f6644..f20b6981e 100644 --- a/src/chanprog.c +++ b/src/chanprog.c @@ -336,22 +336,22 @@ void tell_verbose_status(int idx) dprintf(idx, "%s %s (%s %s)\n", MISC_TCLVERSION, ((interp) && (Tcl_Eval(interp, "info patchlevel") == TCL_OK)) ? tcl_resultstring() : (Tcl_Eval(interp, "info tclversion") == TCL_OK) ? - tcl_resultstring() : "*unknown*", MISC_TCLHVERSION, TCL_PATCH_LEVEL); + tcl_resultstring() : "*unknown*", MISC_HEADERVERSION, TCL_PATCH_LEVEL); if (tcl_threaded()) dprintf(idx, "Tcl is threaded.\n"); #ifdef TLS dprintf(idx, "TLS support is enabled.\n" #if defined HAVE_EVP_PKEY_GET1_EC_KEY && defined HAVE_OPENSSL_MD5 - "TLS library: %s\n", + "TLS library: %s (%s " OPENSSL_VERSION_TEXT ")\n", #elif !defined HAVE_EVP_PKEY_GET1_EC_KEY && defined HAVE_OPENSSL_MD5 - "TLS library: %s\n (no elliptic curve support)\n", + "TLS library: %s (%s " OPENSSL_VERSION_TEXT ")\n (no elliptic curve support)\n", #elif defined HAVE_EVP_PKEY_GET1_EC_KEY && !defined HAVE_OPENSSL_MD5 - "TLS library: %s\n (no MD5 support)\n", + "TLS library: %s (%s " OPENSSL_VERSION_TEXT ")\n (no MD5 support)\n", #elif !defined HAVE_EVP_PKEY_GET1_EC_KEY && !defined HAVE_OPENSSL_MD5 - "TLS library: %s\n (no elliptic curve or MD5 support)\n", + "TLS library: %s (%s " OPENSSL_VERSION_TEXT ")\n (no elliptic curve or MD5 support)\n", #endif - SSLeay_version(SSLEAY_VERSION)); + SSLeay_version(SSLEAY_VERSION), MISC_HEADERVERSION); #else dprintf(idx, "TLS support is not available.\n"); #endif diff --git a/src/lang.h b/src/lang.h index 8ce117c6f..8f9e391ca 100644 --- a/src/lang.h +++ b/src/lang.h @@ -122,7 +122,7 @@ #define MISC_JUPED get_language(0x542) #define MISC_NOFREESOCK get_language(0x543) #define MISC_TCLVERSION get_language(0x544) -#define MISC_TCLHVERSION get_language(0x545) +#define MISC_HEADERVERSION get_language(0x545) /* IRC */ #define IRC_BANNED get_language(0x600) From 7e8080e752b9d9c4a945aa1e758a5ac42fefd86c Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Sun, 12 Feb 2023 21:30:55 +0000 Subject: [PATCH 47/92] strftime doc update Patch by: michaelortmann --- doc/sphinx_source/install/install.rst | 2 +- doc/sphinx_source/modules/mod/server.rst | 4 ++-- doc/sphinx_source/using/core.rst | 5 ++--- doc/sphinx_source/using/tcl-commands.rst | 4 ++-- eggdrop.conf | 8 +++----- help/set/cmds1.help | 5 ++--- scripts/help/msg/userinfo.help | 16 ++++++++-------- src/mod/seen.mod/seen.c | 4 ++-- 8 files changed, 22 insertions(+), 26 deletions(-) diff --git a/doc/sphinx_source/install/install.rst b/doc/sphinx_source/install/install.rst index 2a1679844..c1af33284 100644 --- a/doc/sphinx_source/install/install.rst +++ b/doc/sphinx_source/install/install.rst @@ -37,7 +37,7 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. and will enlarge the binary a bit, but it's worth it if you want to support Eggdrop development. -4. Eggdrop must be installed in a directory somewhere. This is +4. Eggdrop must be installed in a directory somewhere. This is accomplished by entering the UNIX command:: make install diff --git a/doc/sphinx_source/modules/mod/server.rst b/doc/sphinx_source/modules/mod/server.rst index 6cdd4a968..bb7f55c60 100644 --- a/doc/sphinx_source/modules/mod/server.rst +++ b/doc/sphinx_source/modules/mod/server.rst @@ -103,8 +103,8 @@ There are also some variables you can set in your config file: set msg-rate 2 Number of seconds to wait between transmitting queued lines to the - server. Lower this value at your own risk. ircd is known to start - flood control at 512 bytes/2 seconds. + server. Lower this value at your own risk. ircd is known to start flood + control at 512 bytes/2 seconds. set ssl-verify-servers 0 Control certificate verification for servers. You can set this by adding diff --git a/doc/sphinx_source/using/core.rst b/doc/sphinx_source/using/core.rst index 8da7b993d..802b0c696 100644 --- a/doc/sphinx_source/using/core.rst +++ b/doc/sphinx_source/using/core.rst @@ -193,7 +193,7 @@ logfile "logs/logfile" set timestamp-format "[%H:%M:%S]" Set the following to the timestamp for the logfile entries. Popular times might be "[%H:%M]" (hour, min), or "[%H:%M:%S]" (hour, min, sec). - Read 'man strftime' for more formatting options. Keep it below 32 chars. + Read 'man strftime' for more formatting options. Keep it below 32 chars. set keep-all-logs 0 If you want to keep your logfiles forever, turn this setting on. All @@ -218,8 +218,7 @@ logfile "logs/logfile" If keep-all-logs is 1, this setting will define the suffix of the logfiles. The default will result in a suffix like "04May2000". "%Y%m%d" will produce the often used yyyymmdd format. Read the strftime manpages - for more options. NOTE: On systems which don't support strftime, the - default format will always be used. + for more options. Console Settings ---------------- diff --git a/doc/sphinx_source/using/tcl-commands.rst b/doc/sphinx_source/using/tcl-commands.rst index 904867221..888683d68 100644 --- a/doc/sphinx_source/using/tcl-commands.rst +++ b/doc/sphinx_source/using/tcl-commands.rst @@ -1079,7 +1079,7 @@ isidentified [channel] isaway [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 w`` on a channel the user is on, which will refresh the current away status stored by Eggdrop for all users on the 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 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. @@ -2688,7 +2688,7 @@ matchcidr
      matchstr ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 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. + 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. diff --git a/eggdrop.conf b/eggdrop.conf index 81e35bfe9..ac0b8c297 100755 --- a/eggdrop.conf +++ b/eggdrop.conf @@ -188,7 +188,7 @@ set log-time 1 # Set the following to the timestamp for the logfile entries. Popular times # might be "[%H:%M]" (hour, min), or "[%H:%M:%S]" (hour, min, sec). -# Read `man strftime' for more formatting options. Keep it below 32 chars. +# Read `man strftime' for more formatting options. Keep it below 32 chars. set timestamp-format {[%H:%M:%S]} # If you want to keep your logfiles forever, turn this setting on. All @@ -200,8 +200,6 @@ set keep-all-logs 0 # If keep-all-logs is 1, this setting will define the suffix of the logfiles. # The default will result in a suffix like "04May2000". "%Y%m%d" will produce # the often used yyyymmdd format. Read the strftime manpages for more options. -# NOTE: On systems which don't support strftime, the default format will -# be used _always_. set logfile-suffix ".%d%b%Y" # You can specify when Eggdrop should switch logfiles and start fresh. You @@ -1184,8 +1182,8 @@ set extended-join 1 #### End of CAP features #### # Number of seconds to wait between transmitting queued lines to the server. -# Lower this value at your own risk. ircd is known to start flood control -# at 512 bytes/2 seconds. +# Lower this value at your own risk. ircd is known to start flood control at +# 512 bytes/2 seconds. set msg-rate 2 # This setting makes the bot try to get his original nickname back if its diff --git a/help/set/cmds1.help b/help/set/cmds1.help index 6f3a9addc..f6fead459 100644 --- a/help/set/cmds1.help +++ b/help/set/cmds1.help @@ -191,7 +191,7 @@ ### %bset timestamp-format%b Set the following to the timestamp for the logfile entries. Popular times might be "[%H:%M]" (hour,min), or "[%H:%M:%S]" (hour, min, sec). - Read `man strftime' for more formatting options. Keep it below 32 + Read `man strftime' for more formatting options. Keep it below 32 chars. %{help=set max-logsize}%{+n} ### %bset max-logsize%b @@ -211,8 +211,7 @@ If keep-all-logs is 1, this setting will define the suffix of the logfiles. The default will result in a suffix like "04May2000". "%Y%m%d" will produce the often used yyyymmdd format. Read the - strftime manpages for more options. NOTE: On systems which don't - support strftime, the default format will be used _always_. + strftime manpages for more options. %{help=set quiet-save}%{+n} ### %bset quiet-save%b <0/1/2/3> "Writing user file..." and "Writing channel file..." messages won't diff --git a/scripts/help/msg/userinfo.help b/scripts/help/msg/userinfo.help index ef1544314..51a0c4615 100644 --- a/scripts/help/msg/userinfo.help +++ b/scripts/help/msg/userinfo.help @@ -1,9 +1,9 @@ %{help=email} %b/MSG%b %B %bEMAIL%b - This will set your email address. It's shown when - someone does a WHOIS on you (see HELP WHOIS). If - you don't specify a email address, the bot will show - you the email address it currently has set for you (if any). + This will set your email address. It's shown when someone + does a WHOIS on you (see HELP WHOIS). If you don't specify a + email address, the bot will show you the email address it + currently has set for you (if any). %b/MSG%b %B %bEMAIL%b none This clears your email address. %{help=url} @@ -15,7 +15,7 @@ This clears your url address. %{help=bf} %b/MSG%b %B %bBF%b - This will set your boyfriend. some scripts (such as seen) + This will set your boyfriend. Some scripts (such as seen) use this information. If you don't specify a boyfriend, the bot will show you the boyfriend it currently has set for you (if any). @@ -23,7 +23,7 @@ This clears your boyfriend. %{help=gf} %b/MSG%b %B %bGF%b - This will set your girlfriend. some scripts (such as seen) + This will set your girlfriend. Some scripts (such as seen) use this information. If you don't specify a girlfriend, the bot will show you the girlfriend it currently has set for you (if any). @@ -31,14 +31,14 @@ This clears your girlfriend. %{help=irl} %b/MSG%b %B %bIRL%b - This will set your real name. just for the information + This will set your real name. Just for the information of others :). If you don't specify a real name, the bot will show you the real name it currently has set for you (if any). %b/MSG%b %B %bIRL%b none This clears your real name. %{help=dob} %b/MSG%b %B %bDOB%b - This will set your date of birth. now now, be honest :) + This will set your date of birth. Now, be honest :) If you don't specify a date of birth, the bot will show you the date of birth it currently has set for you (if any). %b/MSG%b %B %bDOB%b none diff --git a/src/mod/seen.mod/seen.c b/src/mod/seen.mod/seen.c index 66c834f8a..4e2182152 100644 --- a/src/mod/seen.mod/seen.c +++ b/src/mod/seen.mod/seen.c @@ -395,7 +395,7 @@ static void do_seen(int idx, char *prefix, char *nick, char *hand, prefix, whoredirect, whotarget); return; } - /* Target not on this channel. Check other channels */ + /* Target not on this channel. Check other channels */ chan = chanset; while (chan) { m = ismember(chan, whotarget); @@ -442,7 +442,7 @@ static void do_seen(int idx, char *prefix, char *nick, char *hand, } } } - /* Target known, but nowhere to be seen. Give last IRC and botnet time */ + /* Target known, but nowhere to be seen. Give last IRC and botnet time */ wordshift(word1, text); if (!strcasecmp(word1, "anywhere")) cr = NULL; From ac2c81a0222edb11c529b2165bbf1068a28e4bfc Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 12 Feb 2023 16:58:45 -0500 Subject: [PATCH 48/92] Revert bind char change ... but keep DCC output of * --- src/flags.c | 2 +- src/tclhash.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/flags.c b/src/flags.c index 26285fdbd..ce60b2e3d 100644 --- a/src/flags.c +++ b/src/flags.c @@ -1133,7 +1133,7 @@ static int flag2str(char *string, int bot, int udef) x++; } if (string == old) - *string++ = '*'; + *string++ = '-'; return string - old; } diff --git a/src/tclhash.c b/src/tclhash.c index 71d35f6c2..cb54cecdc 100644 --- a/src/tclhash.c +++ b/src/tclhash.c @@ -1316,6 +1316,10 @@ 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; From a602590e54a30dca0982c43411d1abefeb606a4b Mon Sep 17 00:00:00 2001 From: Geo Date: Sun, 12 Feb 2023 19:47:13 -0500 Subject: [PATCH 49/92] Update woobie mod docs --- doc/html/index.html | 24 +- doc/html/modules/internals.html | 396 ++++++++++++++++++++++++ doc/html/tutorials/module.html | 373 ++++++++++++++++++++++ doc/sphinx_source/index.rst | 2 + doc/sphinx_source/modules/internals.rst | 264 ++++++++++++++++ doc/sphinx_source/modules/writing.rst | 6 +- doc/sphinx_source/tutorials/module.rst | 235 ++++++++++++++ 7 files changed, 1297 insertions(+), 3 deletions(-) create mode 100644 doc/html/modules/internals.html create mode 100644 doc/html/tutorials/module.html create mode 100644 doc/sphinx_source/modules/internals.rst create mode 100644 doc/sphinx_source/tutorials/module.rst diff --git a/doc/html/index.html b/doc/html/index.html index 412af9939..31d1e7456 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -68,12 +68,14 @@

      Table of Contents

    3. Common First Steps
    4. Enabling TLS Security on Eggdrop
    5. Writing an Eggdrop Script
    6. +
    7. Writing an Eggdrop Module
    8. Eggdrop Modules

      About Eggdrop

      diff --git a/doc/html/modules/internals.html b/doc/html/modules/internals.html new file mode 100644 index 000000000..9faf08e66 --- /dev/null +++ b/doc/html/modules/internals.html @@ -0,0 +1,396 @@ + + + + + + + + Eggdrop Bind Internals — Eggdrop 1.9.4 documentation + + + + + + + + + + + + + +
      +
      + +
      + +
      +
      +
      + +
      +

      Eggdrop Bind Internals

      +

      This document is intended for C developers who want to understand how Eggdrop’s Tcl binds or C binds work.

      +

      For documentation purposes the “dcc” bind type is used as an example.

      +

      It already exists and is suitable to illustrate the details of bind handling in Eggdrop.

      +

      Note: All code snippets are altered for brevity and simplicity, see original source code for the full and current versions.

      +
      +

      Bind Table Creation

      +

      The bind table is added by calling, either at module initialization or startup:

      +
      /* Global symbol, available to other C files with
      + * extern p_tcl_bind_list H_dcc;
      + */
      +p_tcl_bind_list H_dcc;
      +
      +/* Creating the bind table:
      + * @param[in] const char *name Limited in length, see tclhash.h
      + * @param[in] int flags        HT_STACKABLE or 0
      + * @param[in] IntFunc          Function pointer to C handler
      + * @return    p_tcl_bind_list  aka (tcl_bind_list_t *)
      + */
      +H_dcc = add_bind_table("dcc", 0, builtin_dcc);
      +
      +
      +

      What the C handler does is explained later, because a lot happens before it is actually called. IntFunc is a generic function pointer that returns an int with arbitrary arguments.

      +

      H_dcc can be exported from core and imported into modules as any other variable or function. That should be explained in a separate document.

      +
      +
      +

      Stackable Binds: HT_STACKABLE

      +

      HT_STACKABLE means that multiple binds can exist for the same mask.

      +
      bind dcc - test proc1; # not stackable
      +bind dcc - test proc2; # overwrites the first one, only proc2 will be called
      +
      +
      +

      It does not automatically call multiple binds that match, see later in the Triggering any Bind section for details.

      +
      +
      +

      Tcl Binding

      +

      After the bind table is created with add_bind_table, Tcl procs can already be registered to this bind by calling:

      +
      bind dcc -|- test myproc
      +proc myproc {args} {
      +  putlog "myproc was called, argument list: '[join $args ',']'"
      +  return 0
      +}
      +
      +
      +

      Of course it is not clear so far:

      +
        +
      • If flags -|- matter for this bind at all and what they are checked against
      • +
      • If channel flags have a meaning or global/bot only
      • +
      • What test is matched against to see if the bind should trigger
      • +
      • Which arguments myproc receives, the example just accepts all arguments
      • +
      +
      +
      +

      Triggering the Bind

      +

      To trigger the bind and call it with the desired arguments, a function is created.

      +
      int check_tcl_dcc(const char *cmd, int idx, const char *args) {
      +  struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
      +  int x;
      +  char s[11];
      +
      +  get_user_flagrec(dcc[idx].user, &fr, dcc[idx].u.chat->con_chan);
      +  egg_snprintf(s, sizeof s, "%ld", dcc[idx].sock);
      +  Tcl_SetVar(interp, "_dcc1", (char *) dcc[idx].nick, 0);
      +  Tcl_SetVar(interp, "_dcc2", (char *) s, 0);
      +  Tcl_SetVar(interp, "_dcc3", (char *) args, 0);
      +  x = check_tcl_bind(H_dcc, cmd, &fr, " $_dcc1 $_dcc2 $_dcc3",
      +                  MATCH_PARTIAL | BIND_USE_ATTR | BIND_HAS_BUILTINS);
      +  /* snip ..., return code handling */
      +  return 0;
      +}
      +
      +
      +

      The global Tcl variables $_dcc1 $_dcc2 $_dcc3 are used as temporary string variables and passed as arguments to the registered Tcl proc.

      +

      This shows which arguments the callbacks in Tcl get:

      +
        +
      • the nickname of the DCC chat user (handle of the user)
      • +
      • the IDX (socket id) of the partyline so [putdcc] can respond back
      • +
      • another string argument that depends on the caller
      • +
      +

      The call to check_tcl_dcc can be found in the DCC parsing in src/dcc.c.

      +
      +
      +

      Triggering any Bind

      +

      check_tcl_bind is used by all binds and does the following:

      +
      /* Generic function to call one/all matching binds
      + * @param[in] tcl_bind_list_t *tl      Bind table (e.g. H_dcc)
      + * @param[in] const char *match        String to match the bind-masks against
      + * @param[in] struct flag_record *atr  Flags of the user calling the bind
      + * @param[in] const char *param        Arguments to add to the bind callback proc (e.g. " $_dcc1 $_dcc2 $_dcc3")
      + * @param[in] int match_type           Matchtype and various flags
      + * @returns   int                      Match result code
      + */
      +
      +/* Source code changed, only illustrative */
      +int check_tcl_bind(tcl_bind_list_t *tl, const char *match, struct flag_record *atr, const char *param, int match_type) {
      +  int x = BIND_NOMATCH;
      +  for (tm = tl->first; tm && !finish; tm_last = tm, tm = tm->next) {
      +    /* Check if bind mask matches */
      +    if (!check_bind_match(match, tm->mask, match_type))
      +      continue;
      +    for (tc = tm->first; tc; tc = tc->next) {
      +      /* Check if the provided flags suffice for this command. */
      +      if (check_bind_flags(&tc->flags, atr, match_type)) {
      +        tc->hits++;
      +        /* not much more than Tcl_Eval(interp, "<procname> <arguments>"); and grab the result */
      +        x = trigger_bind(tc->func_name, param, tm->mask);
      +      }
      +    }
      +  }
      +  return x;
      +}
      +
      +
      +

      The supplied flags to check_tcl_bind in check_tcl_dcc are what defines how matching is performed.

      +

      In the case of a DCC bind we had:

      +
        +
      • Matchtype MATCH_PARTIAL: Prefix-Matching if the command can be uniquely identified (e.g. dcc .help calls .help)
      • +
      • Additional flag BIND_USE_ATTR: Flags are checked
      • +
      • Additional flag BIND_HAS_BUILTINS: Something with flag matching, unsure
      • +
      +

      For details on the available match types (wildcard matching, exact matching, etc.) see src/tclegg.h. Additional flags are also described there as well as the return codes of check_tcl_bind (e.g. BIND_NOMATCH).

      +

      Note: For a bind type to be stackable it needs to be registered with HT_STACKABLE AND check_tcl_bind must be called with BIND_STACKABLE.

      +
      +
      +

      C Binding

      +

      To create a C function that is called by the bind, Eggdrop provides the add_builtins function.

      +
      /* Add a list of C function callbacks to a bind
      + * @param[in] tcl_bind_list_t *  the bind type (e.g. H_dcc)
      + * @param[in] cmd_t *            a NULL-terminated table of binds:
      + * cmd_t *mycmds = {
      + *   {char *name, char *flags, IntFunc function, char *tcl_name},
      + *   ...,
      + *   {NULL, NULL, NULL, NULL}
      + * };
      + */
      +void add_builtins(tcl_bind_list_t *tl, cmd_t *cc) {
      +  char p[1024];
      +  cd_tcl_cmd tclcmd;
      +
      +  tclcmd.name = p;
      +  tclcmd.callback = tl->func;
      +  for (i = 0; cc[i].name; i++) {
      +    /* Create Tcl command with automatic or given names *<bindtype>:<funcname>, e.g.
      +     * - H_raw {"324", "", got324, "irc:324"} => *raw:irc:324
      +     * - H_dcc {"boot", "t", cmd_boot, NULL} => *dcc:boot
      +     */
      +    egg_snprintf(p, sizeof p, "*%s:%s", tl->name, cc[i].funcname ? cc[i].funcname : cc[i].name);
      +    /* arbitrary void * can be included, we include C function pointer */
      +    tclcmd.cdata = (void *) cc[i].func;
      +    add_cd_tcl_cmd(tclcmd);
      +    bind_bind_entry(tl, cc[i].flags, cc[i].name, p);
      +  }
      +}
      +
      +
      +

      It automatically creates Tcl commands (e.g. *dcc:cmd_boot) that will call the C handler from add_bind_table in the first section Bind Table Creation and it gets a context (void *) argument with the C function it is supposed to call (e.g. cmd_boot()).

      +

      Now we can actually look at the C function handler for dcc as an example and what it has to implement.

      +
      +
      +

      C Handler

      +

      The example handler for DCC looks as follows:

      +
      /* Typical Tcl_Command arguments, just like e.g. tcl_putdcc is a Tcl/C command for [putdcc] */
      +static int builtin_dcc (ClientData cd, Tcl_Interp *irp, int argc, char *argv[]) {
      +  int idx;
      +  /* F: The C function we want to call, if the bind is okay, e.g. cmd_boot() */
      +  Function F = (Function) cd;
      +
      +  /* Task of C function: verify argument count and syntax as any Tcl command */
      +  BADARGS(4, 4, " hand idx param");
      +
      +  /* C Macro only used in C handlers for bind types, sanity checks the Tcl proc name
      +   * for *<bindtype>:<name> and that we are in the right C handler
      +   */
      +  CHECKVALIDITY(builtin_dcc);
      +
      +  idx = findidx(atoi(argv[2]));
      +  if (idx < 0) {
      +      Tcl_AppendResult(irp, "invalid idx", NULL);
      +      return TCL_ERROR;
      +  }
      +
      +  /* Call the desired C function, e.g. cmd_boot() with their arguments */
      +  F(dcc[idx].user, idx, argv[3]);
      +  Tcl_ResetResult(irp);
      +  Tcl_AppendResult(irp, "0", NULL);
      +  return TCL_OK;
      +}
      +
      +
      +

      This is finally the part where we see the arguments a C function gets for a DCC bind as opposed to a Tcl proc.

      +

      F(dcc[idx].user, idx, argv[3]):

      +
        +
      • User information as struct userrec *
      • +
      • IDX as int
      • +
      • The 3rd string argument from the Tcl call to *dcc:cmd_boot, which was $_dcc3 which was args to check_tcl_dcc which was everything after the dcc command
      • +
      +

      So this is how we register C callbacks for binds with the correct arguments:

      +
      /* We know the return value is ignored because the return value of F
      + * in builtin_dcc is ignored, so it can be void, but for other binds
      + * it could be something else and used in the C handler for the bind.
      + */
      +void cmd_boot(struct userrec *u, int idx, char *par) { /* snip */ }
      +
      +cmd_t *mycmds = {
      +  {"boot", "t", (IntFunc) cmd_boot, NULL /* automatic name: *dcc:boot */},
      +  {NULL, NULL, NULL, NULL}
      +};
      +add_builtins(H_dcc, mycmds);
      +
      +
      +
      +
      +

      Summary

      +

      In summary, this is how the dcc bind is called:

      +
        +
      • check_tcl_dcc() creates Tcl variables $_dcc1 $_dcc2 $_dcc3 and lets check_tcl_bind call the binds
      • +
      • Tcl binds are done at this point
      • +
      • C binds mean the Tcl command associated with the bind is *dcc:boot which calls builtin_dcc which gets cmd_boot as ClientData cd argument
      • +
      • buildin_dcc performs some sanity checking to avoid crashes and then calls cmd_boot() aka F() with the arguments it wants C callbacks to have
      • +
      +

      Example edited and annotated gdb backtrace in cmd_boot after doing .boot test on the partyline as user thommey with typical owner flags.

      +
      #0  cmd_boot (u=0x55e8bd8a49b0, idx=4, par=0x55e8be6a0010 "test") at cmds.c:614
      +    *u = {next = 0x55e8bd8aec90, handle = "thommey", flags = 8977024, flags_udef = 0, chanrec = 0x55e8bd8aeae0, entries = 0x55e8bd8a4a10}
      +#1  builtin_dcc (cd=0x55e8bbf002d0 <cmd_boot>, irp=0x55e8bd59b1c0, argc=4, argv=0x55e8bd7e3e00) at tclhash.c:678
      +    idx = 4
      +    argv = {0x55e8be642fa0 "*dcc:boot", 0x55e8be9f6bd0 "thommey", 0x55e8be7d9020 "4", 0x55e8be6a0010 "test", 0x0}
      +    F = 0x55e8bbf002d0 <cmd_boot>
      +#5  Tcl_Eval (interp=0x55e8bd59b1c0, script = "*dcc:boot $_dcc1 $_dcc2 $_dcc3") from /usr/lib/x86_64-linux-gnu/libtcl8.6.so
      +    Tcl: return $_dcc1 = "thommey"
      +    Tcl: return $_dcc2 = "4"
      +    Tcl: return $_dcc3 = "test"
      +    Tcl: return $lastbind = "boot" (set automatically by trigger_bind)
      +#8  trigger_bind (proc=proc@entry=0x55e8bd5efda0 "*dcc:boot", param=param@entry=0x55e8bbf4112b " $_dcc1 $_dcc2 $_dcc3", mask=mask@entry=0x55e8bd5efd40 "boot") at tclhash.c:742
      +#9  check_tcl_bind (tl=0x55e8bd5eecb0 <H_dcc>, match=match@entry=0x7ffcf3f9dac1 "boot", atr=atr@entry=0x7ffcf3f9d100, param=param@entry=0x55e8bbf4112b " $_dcc1 $_dcc2 $_dcc3", match_type=match_type@entry=80) at tclhash.c:942
      +    proc = 0x55e8bd5efda0 "*dcc:boot"
      +    mask = 0x55e8bd5efd40 "boot"
      +    brkt = 0x7ffcf3f9dac6 "test"
      +#10 check_tcl_dcc (cmd=cmd@entry=0x7ffcf3f9dac1 "boot", idx=idx@entry=4, args=0x7ffcf3f9dac6 "test") at tclhash.c:974
      +    fr = {match = 5, global = 8977024, udef_global = 0, bot = 0, chan = 0, udef_chan = 0}
      +#11 dcc_chat (idx=idx@entry=4, buf=<optimized out>, i=<optimized out>) at dcc.c:1068
      +    v = 0x7ffcf3f9dac1 "boot"
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/doc/html/tutorials/module.html b/doc/html/tutorials/module.html new file mode 100644 index 000000000..b750801ea --- /dev/null +++ b/doc/html/tutorials/module.html @@ -0,0 +1,373 @@ + + + + + + + + Writing an Eggdrop Module — Eggdrop 1.9.4 documentation + + + + + + + + + + + + + +
      +
      + +
      + +
      +
      +
      + +
      +

      Writing an Eggdrop Module

      +

      An Eggdrop module is a piece of C code that can be loaded (or unloaded) onto the core Eggdrop code. A module differs from a Tcl script in that modules must be compiled and then loaded, whereas scripts can be edited and loaded directly. Importantly, a module can be written to create new Eggdrop-specific Tcl commands and binds that a user can then use in a Tcl script. For example, the server module loaded by Eggdrop is what creates the “jump” Tcl command, which causes tells the Eggdrop to jump to the next server in its server list.

      +

      There are a few required functions a module must perform in order to properly work with Eggdrop

      +
      +

      Module Header

      +

      A module should include license information. This tells other open source users how they are allowed to use the code. Eggdrop uses GPL 2.0 licensing, and our license information looks like this:

      +
      /*
      +* 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.
      +*/
      +
      +
      +
      +
      +

      Required Code

      +

      For this section, you don’t necessarily need to understand what it is doing, but this code is required for a module to function.

      +

      You’ll next want to name your module:

      +
      #define MODULE_NAME "woobie"
      +
      +
      +

      Declare your own function tables (you don’t need to understand this part; you just need to copy/paste it):

      +
      #undef global
      +static Function *global = NULL, *server_funcs = NULL;
      +EXPORT_SCOPE char *woobie_start();
      +
      +
      +

      Next are two memory-related functions used by the core Eggdrop .status and .module commands:

      +
      static int woobie_expmem()
      +{
      +  int size = 0;
      +
      +  return size;
      +}
      +
      +static void woobie_report(int idx, int details)
      +{
      +  if (details) {
      +    int size = woobie_expmem();
      +
      +    dprintf(idx, "    Using %d byte%s of memory\n", size,
      +            (size != 1) ? "s" : "");
      +  }
      +}
      +
      +
      +

      This function is called when Eggdrop loads the module:

      +
      char *woobie_start(Function *global_funcs)
      +{
      +  global = global_funcs;
      +
      +  /* Register the module. */
      +  module_register(MODULE_NAME, woobie_table, 2, 1);
      +  /*                                            ^--- minor module version
      +   *                                         ^------ major module version
      +   *                           ^-------------------- module function table
      +   *              ^--------------------------------- module name
      +   */
      +
      +  if (!module_depend(MODULE_NAME, "eggdrop", 108, 0)) {
      +    module_undepend(MODULE_NAME);
      +    return "This module requires Eggdrop 1.8.0 or later.";
      +  }
      +
      +
      +

      This next function is used to unload the module:

      +
      static char *woobie_close()
      +{
      +  module_undepend(MODULE_NAME);
      +  return NULL;
      +}
      +
      +
      +

      This creates a function table that is exported to Eggdrop. In other words, these are commands that are made available to the Eggdrop core and other modules. At minimum, the following functions must be exported:

      +
      static Function woobie_table[] = {
      +  (Function) woobie_start,
      +  (Function) woobie_close,
      +  (Function) woobie_expmem,
      +  (Function) woobie_report,
      +};
      +
      +
      +

      At this point, you should have a module that compiles and can be loaded by Eggdrop- but dosen’t really do anything yet. We’ll change that in the next section!

      +
      +
      +

      Adding a Partyline Command

      +

      A partyline command function accepts three arguments- a pointer to the user record of the user that called the command; the idx the user was on when calling the command; and a pointer to the arguments appended to the command. A command should immediately log that it was called to the LOG_CMDS log level, and then run its desired code. This simple example prints “WOOBIE” to the partyline idx of the user that called it:

      +
      static int cmd_woobie(struct userrec *u, int idx, char *par)
      +{
      +  putlog(LOG_CMDS, "*", "#%s# woobie", dcc[idx].nick);
      +  dprintf(idx, "WOOBIE!\n");
      +  return 0;
      +}
      +
      +
      +

      If you add partyline commands, you need to create a table which links the new command name to the function it should call. This can be done like so:

      +
      static cmd_t mywoobie[] = {
      +  /* command  flags  function     tcl-name */
      +  {"woobie",  "",    cmd_woobie,  NULL},
      +  {NULL,      NULL,  NULL,        NULL}  /* Mark end. */
      +};
      +
      +
      +

      The tcl-name field can be a name for a Tcl command that will also call the partyline command, or it can be left as NULL.

      +
      +
      +

      Adding a Tcl Command

      +

      Eggdrop uses the Tcl C API library to interact with the Tcl interpreter. Learning this API is outside the scope of this tutorial, but this example Tcl command will echo the provided argument:

      +
      static int tcl_echome STDVAR {
      +  BADARGS(2, 2, " arg");
      +
      +  if (strcmp(argv[1], "llama") {
      +    Tcl_AppendResult(irp, "You said: ", argv[1], NULL);
      +    return TCL_OK;
      +  } else {
      +    Tcl_AppendResult(irp, "illegal word!");
      +    return TCL_ERROR;
      +  }
      +}
      +
      +A few notes on this example. BADARGS is a macro that checks the input provided to the Tcl command. The first argument BADARGS accepts is the minimum number of paramters the Tcl command must accept (including the command itself). The second argument is the maximum number of parameters that BADARGS will accept. The third argument is the help text that will be displayed if these boundaries are exceeded. For example, BADARGS(2, 4, " name ?date? ?place?") requires at least one argument to be passed, and a maximum of three arguments. Eggdrop code style is to enclose optional arguments between qusetion marks in the help text.
      +
      +
      +

      Similar to adding a partyline command, you also have to create a function table for a new Tcl command:

      +
      static tcl_cmds mytcl[] = {
      +  {"echome",           tcl_echome},
      +  {NULL,                   NULL}   /* Required to mark end of table */
      +};
      +
      +
      +

      And now the newly-created Tcl command ‘echome’ is available for use in a script!

      +
      +
      +

      Adding a Tcl Bind

      +

      A Tcl bind is a command that is activated when a certain condition is met. With Eggdrop, these are usually linked to receiving messages or other IRC events. To create a bind, you must first register the bind type with Eggdrop when the module is loaded (you added the woobie_start() and woobie_close functions earlier, you still need all that earlier code in here as well):

      +
      static p_tcl_bind_list H_woob;
      +
      +...
      +
      +char *woobie_start(Function *global_funcs)
      +{
      +  ...
      +  H_woob = add_bind_table("woobie", HT_STACKABLE, woobie_2char);
      +}
      +
      +
      +

      And then remove the binds when the module is unloaded:

      +
      static char *woobie_close()
      +{
      +  ...
      +  del_bind_table(H_woob);
      +}
      +
      +
      +

      Here, “woobie” is the name of the bind (similar to the PUB, MSG, JOIN types of binds you already see in tcl-commands.doc). HT_STACKABLE means you can have multiple binds of this type. “woobie_2char” defines how many arguments the bind will take, and we’ll talk about that next.

      +
      +

      Defining bind arguments

      +

      The following code example defines a bind that will take two arguments:

      +
      static int woobie_2char STDVAR
      +{
      +  Function F = (Function) cd;
      +
      +  BADARGS(3, 3, " nick chan");
      +
      +  CHECKVALIDITY(woobie_2char);
      +  F(argv[1], argv[2]);
      +  return TCL_OK;
      +}
      +
      +
      +

      And this example defines a bind that will take three arguments:

      +
      static int woobie_3char STDVAR
      +{
      +  Function F = (Function) cd;
      +
      +  BADARGS(4, 4, " foo bar moo");
      +
      +  CHECKVALIDITY(woobie_3char);
      +  F(argv[1], argv[2], argv[3]);
      +  return TCL_OK;
      +}
      +
      +
      +

      Like before, BADARGS still checks that the number of arguments passed is correct, and outputs help text if it is not. The rest is boilerplate code to pass the arguments when the bind is called.

      +
      +
      +

      Calling the Bind

      +

      To call the bind, Eggdrop coding style it to name that function “check_tcl_bindname”. So here, whenever we reach a point in code that should trigger the bind, we’ll call check_tcl_woobie() and pass the arguments we defined- in this case, two arguments that woobie_2char was created to handle. Here is some sample code:

      +
      check_tcl_woobie(chan, nick);
      +
      +
      +static int check_tcl_woobie(char *chan, char *nick, char *userhost) {
      +  int x;
      +  char mask[1024];
      +  struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
      +
      +  snprintf(mask, sizeof mask, "%s %s!%s",
      +                                chan, nick, userhost);
      +  Tcl_SetVar(interp, "_woob1", nick ? (char *) nick : "", 0);
      +  Tcl_SetVar(interp, "_woob2", chan, 0);
      +  x = check_tcl_bind(H_woob, mask, &fr, " $_woob1 $_woob2",
      +        MATCH_MASK | BIND_STACKABLE);
      +  return (x == BIND_EXEC_LOG);
      +}
      +
      +
      +

      Now that we have encountered a condition that triggers the bind, we need to check it against the binds the user has loaded in scripts and see if it matches those conditions. This is done with check_tcl_bind(), called with the bind type, the userhost of the user, the flag record of the user if it exists, the bind arguments, and bind options.

      +
      +
      +
      +

      Exporting the Bind

      +

      Do we need to do this?

      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/doc/sphinx_source/index.rst b/doc/sphinx_source/index.rst index dca64902a..5e0178241 100644 --- a/doc/sphinx_source/index.rst +++ b/doc/sphinx_source/index.rst @@ -78,6 +78,7 @@ The Eggheads development team can be found lurking on #eggdrop on the Libera net tutorials/firststeps tutorials/tlssetup tutorials/firstscript + tutorials/module.rst .. toctree:: :caption: Eggdrop Modules @@ -86,6 +87,7 @@ The Eggheads development team can be found lurking on #eggdrop on the Libera net modules/index modules/included modules/writing + modules/internals.rst .. toctree:: :caption: About Eggdrop diff --git a/doc/sphinx_source/modules/internals.rst b/doc/sphinx_source/modules/internals.rst new file mode 100644 index 000000000..5e026a391 --- /dev/null +++ b/doc/sphinx_source/modules/internals.rst @@ -0,0 +1,264 @@ +Eggdrop Bind Internals +====================== + +This document is intended for C developers who want to understand how Eggdrop’s Tcl binds or C binds work. + +For documentation purposes the “dcc” bind type is used as an example. + +It already exists and is suitable to illustrate the details of bind handling in Eggdrop. + +Note: All code snippets are altered for brevity and simplicity, see original source code for the full and current versions. + +Bind Table Creation +------------------- + +The bind table is added by calling, either at module initialization or startup:: + + /* Global symbol, available to other C files with + * extern p_tcl_bind_list H_dcc; + */ + p_tcl_bind_list H_dcc; + + /* Creating the bind table: + * @param[in] const char *name Limited in length, see tclhash.h + * @param[in] int flags HT_STACKABLE or 0 + * @param[in] IntFunc Function pointer to C handler + * @return p_tcl_bind_list aka (tcl_bind_list_t *) + */ + H_dcc = add_bind_table("dcc", 0, builtin_dcc); + +What the :code:`C handler` does is explained later, because a lot happens before it is actually called. :code:`IntFunc` is a generic function pointer that returns an :code:`int` with arbitrary arguments. + +:code:`H_dcc` can be exported from core and imported into modules as any other variable or function. That should be explained in a separate document. + +Stackable Binds: HT_STACKABLE +----------------------------- + +:code:`HT_STACKABLE` means that multiple binds can exist for the same mask. +:: + + bind dcc - test proc1; # not stackable + bind dcc - test proc2; # overwrites the first one, only proc2 will be called + +It does not automatically call multiple binds that match, see later in the `Triggering any Bind`_ section for details. + +Tcl Binding +----------- + +After the bind table is created with :code:`add_bind_table`, Tcl procs can already be registered to this bind by calling:: + + bind dcc -|- test myproc + proc myproc {args} { + putlog "myproc was called, argument list: '[join $args ',']'" + return 0 + } + +Of course it is not clear so far: + +* If flags :code:`-|-` matter for this bind at all and what they are checked against +* If channel flags have a meaning or global/bot only +* What :code:`test` is matched against to see if the bind should trigger +* Which arguments :code:`myproc` receives, the example just accepts all arguments + +Triggering the Bind +------------------- + +To trigger the bind and call it with the desired arguments, a function is created. +:: + + int check_tcl_dcc(const char *cmd, int idx, const char *args) { + struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; + int x; + char s[11]; + + get_user_flagrec(dcc[idx].user, &fr, dcc[idx].u.chat->con_chan); + egg_snprintf(s, sizeof s, "%ld", dcc[idx].sock); + Tcl_SetVar(interp, "_dcc1", (char *) dcc[idx].nick, 0); + Tcl_SetVar(interp, "_dcc2", (char *) s, 0); + Tcl_SetVar(interp, "_dcc3", (char *) args, 0); + x = check_tcl_bind(H_dcc, cmd, &fr, " $_dcc1 $_dcc2 $_dcc3", + MATCH_PARTIAL | BIND_USE_ATTR | BIND_HAS_BUILTINS); + /* snip ..., return code handling */ + return 0; + } + +The global Tcl variables :code:`$_dcc1 $_dcc2 $_dcc3` are used as temporary string variables and passed as arguments to the registered Tcl proc. + +This shows which arguments the callbacks in Tcl get: + +* the nickname of the DCC chat user (handle of the user) +* the IDX (socket id) of the partyline so :code:`[putdcc]` can respond back +* another string argument that depends on the caller + +The call to :code:`check_tcl_dcc` can be found in the DCC parsing in `src/dcc.c`. + +Triggering any Bind +------------------- + +`check_tcl_bind` is used by all binds and does the following:: + + /* Generic function to call one/all matching binds + * @param[in] tcl_bind_list_t *tl Bind table (e.g. H_dcc) + * @param[in] const char *match String to match the bind-masks against + * @param[in] struct flag_record *atr Flags of the user calling the bind + * @param[in] const char *param Arguments to add to the bind callback proc (e.g. " $_dcc1 $_dcc2 $_dcc3") + * @param[in] int match_type Matchtype and various flags + * @returns int Match result code + */ + + /* Source code changed, only illustrative */ + int check_tcl_bind(tcl_bind_list_t *tl, const char *match, struct flag_record *atr, const char *param, int match_type) { + int x = BIND_NOMATCH; + for (tm = tl->first; tm && !finish; tm_last = tm, tm = tm->next) { + /* Check if bind mask matches */ + if (!check_bind_match(match, tm->mask, match_type)) + continue; + for (tc = tm->first; tc; tc = tc->next) { + /* Check if the provided flags suffice for this command. */ + if (check_bind_flags(&tc->flags, atr, match_type)) { + tc->hits++; + /* not much more than Tcl_Eval(interp, " "); and grab the result */ + x = trigger_bind(tc->func_name, param, tm->mask); + } + } + } + return x; + } + +The supplied flags to :code:`check_tcl_bind` in `check_tcl_dcc` are what defines how matching is performed. + +In the case of a DCC bind we had: + +* Matchtype :code:`MATCH_PARTIAL`: Prefix-Matching if the command can be uniquely identified (e.g. dcc .help calls .help) +* Additional flag :code:`BIND_USE_ATTR`: Flags are checked +* Additional flag :code:`BIND_HAS_BUILTINS`: Something with flag matching, unsure + +For details on the available match types (wildcard matching, exact matching, etc.) see :code:`src/tclegg.h`. Additional flags are also described there as well as the return codes of :code:`check_tcl_bind` (e.g. :code:`BIND_NOMATCH`). + +Note: For a bind type to be stackable it needs to be registered with :code:`HT_STACKABLE` AND :code:`check_tcl_bind` must be called with :code:`BIND_STACKABLE`. + +C Binding +--------- + +To create a C function that is called by the bind, Eggdrop provides the :code:`add_builtins` function. +:: + + /* Add a list of C function callbacks to a bind + * @param[in] tcl_bind_list_t * the bind type (e.g. H_dcc) + * @param[in] cmd_t * a NULL-terminated table of binds: + * cmd_t *mycmds = { + * {char *name, char *flags, IntFunc function, char *tcl_name}, + * ..., + * {NULL, NULL, NULL, NULL} + * }; + */ + void add_builtins(tcl_bind_list_t *tl, cmd_t *cc) { + char p[1024]; + cd_tcl_cmd tclcmd; + + tclcmd.name = p; + tclcmd.callback = tl->func; + for (i = 0; cc[i].name; i++) { + /* Create Tcl command with automatic or given names *:, e.g. + * - H_raw {"324", "", got324, "irc:324"} => *raw:irc:324 + * - H_dcc {"boot", "t", cmd_boot, NULL} => *dcc:boot + */ + egg_snprintf(p, sizeof p, "*%s:%s", tl->name, cc[i].funcname ? cc[i].funcname : cc[i].name); + /* arbitrary void * can be included, we include C function pointer */ + tclcmd.cdata = (void *) cc[i].func; + add_cd_tcl_cmd(tclcmd); + bind_bind_entry(tl, cc[i].flags, cc[i].name, p); + } + } + +It automatically creates Tcl commands (e.g. :code:`*dcc:cmd_boot`) that will call the `C handler` from `add_bind_table` in the first section `Bind Table Creation`_ and it gets a context (void \*) argument with the C function it is supposed to call (e.g. `cmd_boot()`). + +Now we can actually look at the C function handler for dcc as an example and what it has to implement. + +C Handler +--------- + +The example handler for DCC looks as follows:: + + /* Typical Tcl_Command arguments, just like e.g. tcl_putdcc is a Tcl/C command for [putdcc] */ + static int builtin_dcc (ClientData cd, Tcl_Interp *irp, int argc, char *argv[]) { + int idx; + /* F: The C function we want to call, if the bind is okay, e.g. cmd_boot() */ + Function F = (Function) cd; + + /* Task of C function: verify argument count and syntax as any Tcl command */ + BADARGS(4, 4, " hand idx param"); + + /* C Macro only used in C handlers for bind types, sanity checks the Tcl proc name + * for *: and that we are in the right C handler + */ + CHECKVALIDITY(builtin_dcc); + + idx = findidx(atoi(argv[2])); + if (idx < 0) { + Tcl_AppendResult(irp, "invalid idx", NULL); + return TCL_ERROR; + } + + /* Call the desired C function, e.g. cmd_boot() with their arguments */ + F(dcc[idx].user, idx, argv[3]); + Tcl_ResetResult(irp); + Tcl_AppendResult(irp, "0", NULL); + return TCL_OK; + } + +This is finally the part where we see the arguments a C function gets for a DCC bind as opposed to a Tcl proc. + +code:`F(dcc[idx].user, idx, argv[3])`: + +* User information as struct userrec * +* IDX as int +* The 3rd string argument from the Tcl call to \*dcc:cmd_boot, which was :code:`$_dcc3` which was :code:`args` to :code:`check_tcl_dcc` which was everything after the dcc command + +So this is how we register C callbacks for binds with the correct arguments:: + + /* We know the return value is ignored because the return value of F + * in builtin_dcc is ignored, so it can be void, but for other binds + * it could be something else and used in the C handler for the bind. + */ + void cmd_boot(struct userrec *u, int idx, char *par) { /* snip */ } + + cmd_t *mycmds = { + {"boot", "t", (IntFunc) cmd_boot, NULL /* automatic name: *dcc:boot */}, + {NULL, NULL, NULL, NULL} + }; + add_builtins(H_dcc, mycmds); + +Summary +------- + +In summary, this is how the dcc bind is called: + +* :code:`check_tcl_dcc()` creates Tcl variables :code:`$_dcc1 $_dcc2 $_dcc3` and lets :code:`check_tcl_bind` call the binds +* Tcl binds are done at this point +* C binds mean the Tcl command associated with the bind is :code:`*dcc:boot` which calls :code:`builtin_dcc` which gets :code:`cmd_boot` as ClientData cd argument +* :code:`gbuildin_dcc` performs some sanity checking to avoid crashes and then calls :code:`cmd_boot()` aka :code:`F()` with the arguments it wants C callbacks to have + +Example edited and annotated gdb backtrace in :code::`cmd_boot` after doing :code:`.boot test` on the partyline as user :code:`thommey` with typical owner flags. +:: + + #0 cmd_boot (u=0x55e8bd8a49b0, idx=4, par=0x55e8be6a0010 "test") at cmds.c:614 + *u = {next = 0x55e8bd8aec90, handle = "thommey", flags = 8977024, flags_udef = 0, chanrec = 0x55e8bd8aeae0, entries = 0x55e8bd8a4a10} + #1 builtin_dcc (cd=0x55e8bbf002d0 , irp=0x55e8bd59b1c0, argc=4, argv=0x55e8bd7e3e00) at tclhash.c:678 + idx = 4 + argv = {0x55e8be642fa0 "*dcc:boot", 0x55e8be9f6bd0 "thommey", 0x55e8be7d9020 "4", 0x55e8be6a0010 "test", 0x0} + F = 0x55e8bbf002d0 + #5 Tcl_Eval (interp=0x55e8bd59b1c0, script = "*dcc:boot $_dcc1 $_dcc2 $_dcc3") from /usr/lib/x86_64-linux-gnu/libtcl8.6.so + Tcl: return $_dcc1 = "thommey" + Tcl: return $_dcc2 = "4" + Tcl: return $_dcc3 = "test" + Tcl: return $lastbind = "boot" (set automatically by trigger_bind) + #8 trigger_bind (proc=proc@entry=0x55e8bd5efda0 "*dcc:boot", param=param@entry=0x55e8bbf4112b " $_dcc1 $_dcc2 $_dcc3", mask=mask@entry=0x55e8bd5efd40 "boot") at tclhash.c:742 + #9 check_tcl_bind (tl=0x55e8bd5eecb0 , match=match@entry=0x7ffcf3f9dac1 "boot", atr=atr@entry=0x7ffcf3f9d100, param=param@entry=0x55e8bbf4112b " $_dcc1 $_dcc2 $_dcc3", match_type=match_type@entry=80) at tclhash.c:942 + proc = 0x55e8bd5efda0 "*dcc:boot" + mask = 0x55e8bd5efd40 "boot" + brkt = 0x7ffcf3f9dac6 "test" + #10 check_tcl_dcc (cmd=cmd@entry=0x7ffcf3f9dac1 "boot", idx=idx@entry=4, args=0x7ffcf3f9dac6 "test") at tclhash.c:974 + fr = {match = 5, global = 8977024, udef_global = 0, bot = 0, chan = 0, udef_chan = 0} + #11 dcc_chat (idx=idx@entry=4, buf=, i=) at dcc.c:1068 + v = 0x7ffcf3f9dac1 "boot" diff --git a/doc/sphinx_source/modules/writing.rst b/doc/sphinx_source/modules/writing.rst index da222fbe5..ceeabb4fe 100644 --- a/doc/sphinx_source/modules/writing.rst +++ b/doc/sphinx_source/modules/writing.rst @@ -1,5 +1,7 @@ -Writing an Eggdrop Module -========================= +.. _writing_module: + +How to Write an Eggdrop Module +============================== Note: This is for a simple module of 1 source file. diff --git a/doc/sphinx_source/tutorials/module.rst b/doc/sphinx_source/tutorials/module.rst new file mode 100644 index 000000000..b4743484f --- /dev/null +++ b/doc/sphinx_source/tutorials/module.rst @@ -0,0 +1,235 @@ +Writing a Basic Eggdrop Module +============================== + +An Eggdrop module is a piece of C code that can be loaded (or unloaded) onto the core Eggdrop code. A module differs from a Tcl script in that modules must be compiled and then loaded, whereas scripts can be edited and loaded directly. Importantly, a module can be written to create new Eggdrop-specific Tcl commands and binds that a user can then use in a Tcl script. For example, the server module loaded by Eggdrop is what creates the "jump" Tcl command, which causes tells the Eggdrop to jump to the next server in its server list. + +There are a few required functions a module must perform in order to properly work with Eggdrop + +Module Header +------------- + +A module should include license information. This tells other open source users how they are allowed to use the code. Eggdrop uses GPL 2.0 licensing, and our license information looks like this:: + + /* + * 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. + */ + +Required Code +------------- + +For this section, you don't necessarily need to understand what it is doing, but this code is required for a module to function. If you want to learn more about this, check out :ref:`writing_module` + +You'll next want to name your module:: + + #define MODULE_NAME "woobie" + +Declare your own function tables (again, you don't need to understand this part; you just need to copy/paste it):: + + #undef global + static Function *global = NULL, *server_funcs = NULL; + EXPORT_SCOPE char *woobie_start(); + +Next are two memory-related functions used by the core Eggdrop .status and .module commands:: + + static int woobie_expmem() + { + int size = 0; + + return size; + } + + static void woobie_report(int idx, int details) + { + if (details) { + int size = woobie_expmem(); + + dprintf(idx, " Using %d byte%s of memory\n", size, + (size != 1) ? "s" : ""); + } + } + +This function is called when Eggdrop loads the module:: + + char *woobie_start(Function *global_funcs) + { + global = global_funcs; + + /* Register the module. */ + module_register(MODULE_NAME, woobie_table, 2, 1); + /* ^--- minor module version + * ^------ major module version + * ^-------------------- module function table + * ^--------------------------------- module name + */ + + if (!module_depend(MODULE_NAME, "eggdrop", 108, 0)) { + module_undepend(MODULE_NAME); + return "This module requires Eggdrop 1.8.0 or later."; + } + +This next function is used to unload the module:: + + static char *woobie_close() + { + module_undepend(MODULE_NAME); + return NULL; + } + +This creates a function table that is exported to Eggdrop. In other words, these are commands that are made available to the Eggdrop core and other modules. At minimum, the following functions must be exported:: + + static Function woobie_table[] = { + (Function) woobie_start, + (Function) woobie_close, + (Function) woobie_expmem, + (Function) woobie_report, + }; + +At this point, you should have a module that compiles and can be loaded by Eggdrop- but dosen't really do anything yet. We'll change that in the next section! + +Adding a Partyline Command +-------------------------- + +A partyline command function accepts three arguments- a pointer to the user record of the user that called the command; the idx the user was on when calling the command; and a pointer to the arguments appended to the command. A command should immediately log that it was called to the LOG_CMDS log level, and then run its desired code. This simple example prints "WOOBIE" to the partyline idx of the user that called it:: + + static int cmd_woobie(struct userrec *u, int idx, char *par) + { + putlog(LOG_CMDS, "*", "#%s# woobie", dcc[idx].nick); + dprintf(idx, "WOOBIE!\n"); + return 0; + } + +If you add partyline commands, you need to create a table which links the new command name to the function it should call. This can be done like so:: + + static cmd_t mywoobie[] = { + /* command flags function tcl-name */ + {"woobie", "", cmd_woobie, NULL}, + {NULL, NULL, NULL, NULL} /* Mark end. */ + }; + +The tcl-name field can be a name for a Tcl command that will also call the partyline command, or it can be left as NULL. + +Adding a Tcl Command +-------------------- + +Eggdrop uses the Tcl C API library to interact with the Tcl interpreter. Learning this API is outside the scope of this tutorial, but this example Tcl command will echo the provided argument:: + + + static int tcl_echome STDVAR { + BADARGS(2, 2, " arg"); + + if (strcmp(argv[1], "llama") { + Tcl_AppendResult(irp, "You said: ", argv[1], NULL); + return TCL_OK; + } else { + Tcl_AppendResult(irp, "illegal word!"); + return TCL_ERROR; + } + } + + A few notes on this example. BADARGS is a macro that checks the input provided to the Tcl command. The first argument BADARGS accepts is the minimum number of paramters the Tcl command must accept (including the command itself). The second argument is the maximum number of parameters that BADARGS will accept. The third argument is the help text that will be displayed if these boundaries are exceeded. For example, BADARGS(2, 4, " name ?date? ?place?") requires at least one argument to be passed, and a maximum of three arguments. Eggdrop code style is to enclose optional arguments between qusetion marks in the help text. + +Similar to adding a partyline command, you also have to create a function table for a new Tcl command:: + + static tcl_cmds mytcl[] = { + {"echome", tcl_echome}, + {NULL, NULL} /* Required to mark end of table */ + }; + +And now the newly-created Tcl command 'echome' is available for use in a script! + +Adding a Tcl Bind +----------------- + +A Tcl bind is a command that is activated when a certain condition is met. With Eggdrop, these are usually linked to receiving messages or other IRC events. To create a bind, you must first register the bind type with Eggdrop when the module is loaded (you added the woobie_start() and woobie_close functions earlier, you still need all that earlier code in here as well):: + + static p_tcl_bind_list H_woob; + + ... + + char *woobie_start(Function *global_funcs) + { + ... + H_woob = add_bind_table("woobie", HT_STACKABLE, woobie_2char); + } + +And then remove the binds when the module is unloaded:: + + static char *woobie_close() + { + ... + del_bind_table(H_woob); + } + +Here, "woobie" is the name of the bind (similar to the PUB, MSG, JOIN types of binds you already see in tcl-commands.doc). HT_STACKABLE means you can have multiple binds of this type. "woobie_2char" defines how many arguments the bind will take, and we'll talk about that next. + +Defining bind arguments +^^^^^^^^^^^^^^^^^^^^^^^ + +The following code example defines a bind that will take two arguments:: + + static int woobie_2char STDVAR + { + Function F = (Function) cd; + + BADARGS(3, 3, " nick chan"); + + CHECKVALIDITY(woobie_2char); + F(argv[1], argv[2]); + return TCL_OK; + } + +And this example defines a bind that will take three arguments:: + + static int woobie_3char STDVAR + { + Function F = (Function) cd; + + BADARGS(4, 4, " foo bar moo"); + + CHECKVALIDITY(woobie_3char); + F(argv[1], argv[2], argv[3]); + return TCL_OK; + } + +Like before, BADARGS still checks that the number of arguments passed is correct, and outputs help text if it is not. The rest is boilerplate code to pass the arguments when the bind is called. + +Calling the Bind +^^^^^^^^^^^^^^^^ + +To call the bind, Eggdrop coding style it to name that function "check_tcl_bindname". So here, whenever we reach a point in code that should trigger the bind, we'll call check_tcl_woobie() and pass the arguments we defined- in this case, two arguments that woobie_2char was created to handle. Here is some sample code:: + + check_tcl_woobie(chan, nick); + + + static int check_tcl_woobie(char *chan, char *nick, char *userhost) { + int x; + char mask[1024]; + struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; + + snprintf(mask, sizeof mask, "%s %s!%s", + chan, nick, userhost); + Tcl_SetVar(interp, "_woob1", nick ? (char *) nick : "", 0); + Tcl_SetVar(interp, "_woob2", chan, 0); + x = check_tcl_bind(H_woob, mask, &fr, " $_woob1 $_woob2", + MATCH_MASK | BIND_STACKABLE); + return (x == BIND_EXEC_LOG); + } + +Now that we have encountered a condition that triggers the bind, we need to check it against the binds the user has loaded in scripts and see if it matches those conditions. This is done with check_tcl_bind(), called with the bind type, the userhost of the user, the flag record of the user if it exists, the bind arguments, and bind options. + +Exporting the Bind +------------------ + +Do we need to do this? From 23386ce96e1828c6b8f4dc5eee50467d8cf286ab Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Mon, 13 Feb 2023 00:50:05 +0000 Subject: [PATCH 50/92] Fix load of null pointer Found by: 0_o I am EMPTY, mister EMPTY, ZarTek-Creole Patch by: michaelortmann Fixes: #1389 --- src/net.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/net.c b/src/net.c index 7539500fe..30e1f4cb8 100644 --- a/src/net.c +++ b/src/net.c @@ -1700,6 +1700,12 @@ char *traced_natip(ClientData cd, Tcl_Interp *irp, EGG_CONST char *name1, int r; struct in_addr ia; + /* Recover trace in case of unset. */ + if (flags & TCL_TRACE_DESTROYED) { + Tcl_TraceVar2(irp, name1, name2, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, traced_natip, cd); + return NULL; + } + value = Tcl_GetVar2(irp, name1, name2, TCL_GLOBAL_ONLY); if (*value) { r = inet_pton(AF_INET, value, &ia); From ed12d430b88ff820eabdfa2fe6cdb081e13ff7d0 Mon Sep 17 00:00:00 2001 From: Thomas Sader Date: Mon, 13 Feb 2023 22:07:22 +0100 Subject: [PATCH 51/92] Raise Tcl requirement to 8.5 Found by: mortmann Patch by: thommey Fixes: #1403 Eggdrop will not compile with Tcl8.5 DictObj support since 1.9.0 (oops). --- aclocal.m4 | 14 ++------------ config.h.in | 4 ---- configure.ac | 1 - doc/BUG-REPORT | 2 -- src/main.c | 7 ------- src/main.h | 12 ++---------- src/tcl.c | 25 ++----------------------- 7 files changed, 6 insertions(+), 59 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index fc810bc45..4e8aab300 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1087,14 +1087,14 @@ dnl AC_DEFUN([EGG_TCL_CHECK_VERSION], [ - if test "x$TCL_MAJOR_VERSION" = x || test "x$TCL_MINOR_VERSION" = x || test $TCL_MAJOR_VERSION -lt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -lt 3; then + if test "x$TCL_MAJOR_VERSION" = x || test "x$TCL_MINOR_VERSION" = x || test $TCL_MAJOR_VERSION -lt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -lt 5; then cat << EOF >&2 configure: error: Your Tcl version is much too old for Eggdrop to use. You should download and compile a more recent version. The most reliable current version is $tclrecommendver and can be downloaded from - ${tclrecommendsite}. We require at least Tcl 8.3. + ${tclrecommendsite}. We require at least Tcl 8.5. See doc/COMPILE-GUIDE's 'Tcl Detection and Installation' section for more information. @@ -1114,16 +1114,6 @@ dnl AC_DEFUN([EGG_CACHE_UNSET], [unset $1]) -dnl EGG_TCL_CHECK_NOTIFIER_INIT -dnl -AC_DEFUN([EGG_TCL_CHECK_NOTIFIER_INIT], -[ - if test $TCL_MAJOR_VERSION -gt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -ge 4; then - AC_DEFINE(HAVE_TCL_NOTIFIER_INIT, 1, [Define for Tcl that has the Tcl_NotifierProcs struct member initNotifierProc (8.4 and later).]) - fi -]) - - dnl EGG_SUBST_EGGVERSION() dnl AC_DEFUN([EGG_SUBST_EGGVERSION], diff --git a/config.h.in b/config.h.in index a0f0bbfe1..4e56afd4a 100644 --- a/config.h.in +++ b/config.h.in @@ -296,10 +296,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H -/* Define for Tcl that has the Tcl_NotifierProcs struct member - initNotifierProc (8.4 and later). */ -#undef HAVE_TCL_NOTIFIER_INIT - /* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use `HAVE_STRUCT_TM_TM_ZONE' instead. */ #undef HAVE_TM_ZONE diff --git a/configure.ac b/configure.ac index c101fedf0..c90d97e56 100644 --- a/configure.ac +++ b/configure.ac @@ -136,7 +136,6 @@ EGG_TCL_WITH_TCLLIB EGG_TCL_WITH_TCLINC EGG_TCL_TCLCONFIG EGG_TCL_CHECK_VERSION -EGG_TCL_CHECK_NOTIFIER_INIT EGG_TCL_LUSH diff --git a/doc/BUG-REPORT b/doc/BUG-REPORT index 3c279c599..f60096f40 100644 --- a/doc/BUG-REPORT +++ b/doc/BUG-REPORT @@ -42,8 +42,6 @@ DO NOT SEND HTML E-MAIL TO THE LISTS. 2) INFORMATION ABOUT TCL 2.1) Tcl library version: - ( ) 8.3._ - ( ) 8.4._ ( ) 8.5._ ( ) 8.6._ ( ) Other - Which? ____ diff --git a/src/main.c b/src/main.c index 9ab60c6de..13976ae84 100644 --- a/src/main.c +++ b/src/main.c @@ -981,11 +981,7 @@ static void mainloop(int toplevel) if (!eggbusy) { /* Process all pending tcl events */ -# ifdef REPLACE_NOTIFIER Tcl_ServiceAll(); -# else - while (Tcl_DoOneEvent(TCL_DONT_WAIT | TCL_ALL_EVENTS)); -# endif /* REPLACE_NOTIFIER */ } } @@ -1119,9 +1115,6 @@ int main(int arg_c, char **arg_v) fatal("ERROR: Eggdrop will not run as root!", 0); #endif -#ifndef REPLACE_NOTIFIER - init_threaddata(1); -#endif init_userent(); init_misc(); init_bots(); diff --git a/src/main.h b/src/main.h index 2b11465d5..3dbe592f2 100644 --- a/src/main.h +++ b/src/main.h @@ -45,16 +45,8 @@ # define TCL_PATCH_LEVEL "*unknown*" #endif -#if defined(HAVE_TCL_NOTIFIER_INIT) -# define REPLACE_NOTIFIER -#endif - -#if (((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION >= 4)) || (TCL_MAJOR_VERSION > 8)) -# ifdef CONST -# define EGG_CONST CONST -# else -# define EGG_CONST -# endif +#ifdef CONST +# define EGG_CONST CONST #else # define EGG_CONST #endif diff --git a/src/tcl.c b/src/tcl.c index 6e02af9e2..ccc4cd8d0 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -96,8 +96,8 @@ int handlen = HANDLEN; extern Tcl_VarTraceProc traced_myiphostname, traced_natip, traced_remove_pass; -/* Unicode workaround for Tcl versions that only support BMP characters (3 byte utf-8) */ -#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 5 && TCL_MINOR_VERSION <= 6 && TCL_UTF_MAX < 4 +/* Unicode workaround for Tcl versions (8.5/8.6) that only support BMP characters (3 byte utf-8) */ +#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION <= 6 && TCL_UTF_MAX < 4 # define TCL_WORKAROUND_UNICODESUP 1 struct tcl_unicodesup_info { const char *subcmd; @@ -548,7 +548,6 @@ extern tcl_cmds tcluser_cmds[], tcldcc_cmds[], tclmisc_cmds[], extern tcl_cmds tcltls_cmds[]; #endif -#ifdef REPLACE_NOTIFIER /* The tickle_*() functions replace the Tcl Notifier * The tickle_*() functions can be called by Tcl threads */ @@ -619,18 +618,6 @@ struct threaddata *threaddata() return td; } -#else /* REPLACE_NOTIFIER */ - -int tclthreadmainloop() { return 0; } - -struct threaddata *threaddata() -{ - static struct threaddata tsd; - return &tsd; -} - -#endif /* REPLACE_NOTIFIER */ - void init_threaddata(int mainthread) { struct threaddata *td = threaddata(); @@ -915,15 +902,12 @@ void init_unicodesup(void) */ void init_tcl(int argc, char **argv) { -#ifdef REPLACE_NOTIFIER Tcl_NotifierProcs notifierprocs; -#endif /* REPLACE_NOTIFIER */ const char *encoding; int i, j; char *langEnv, pver[1024] = ""; -#ifdef REPLACE_NOTIFIER egg_bzero(¬ifierprocs, sizeof(notifierprocs)); notifierprocs.initNotifierProc = tickle_InitNotifier; notifierprocs.createFileHandlerProc = tickle_CreateFileHandler; @@ -934,7 +918,6 @@ void init_tcl(int argc, char **argv) notifierprocs.alertNotifierProc = tickle_AlertNotifier; Tcl_SetNotifier(¬ifierprocs); -#endif /* REPLACE_NOTIFIER */ /* This must be done *BEFORE* Tcl_SetSystemEncoding(), * or Tcl_SetSystemEncoding() will cause a segfault. @@ -1247,11 +1230,7 @@ int tcl_threaded() */ int fork_before_tcl() { -#ifndef REPLACE_NOTIFIER - return tcl_threaded(); -#else return 0; -#endif } time_t get_expire_time(Tcl_Interp * irp, const char *s) { From 98a53aa99121379bf4b7bf5f777666f153ee326f Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Tue, 14 Feb 2023 00:17:13 +0000 Subject: [PATCH 52/92] Fix tcl service mode crash Found by: MacinMan Patch by: michaelortmann Fixes: #1351 Fixes: #1352 Fix crash - add tcl service mode hook stub / enhance doc --- INSTALL | 6 ++++-- doc/COMPILE-GUIDE | 12 ++++++------ src/tcl.c | 13 +++++++++++-- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/INSTALL b/INSTALL index 1b355fd85..6304d2628 100644 --- a/INSTALL +++ b/INSTALL @@ -19,6 +19,8 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. correctly compile Eggdrop. It will also try to find Tcl, which is required to compile. + For macOS tcl and openssl see doc/COMPILE-GUIDE. + 2. Type either 'make config' or 'make iconfig' to determine which @@ -158,5 +160,5 @@ the README file. If not, then READ IT!&@#%@! Have fun with Eggdrop! - Copyright (C) 1997 Robey Pointer Copyright (C) 1999 - 2022 Eggheads - Development Team + Copyright (C) 1997 Robey Pointer + Copyright (C) 1999 - 2022 Eggheads Development Team diff --git a/doc/COMPILE-GUIDE b/doc/COMPILE-GUIDE index 54e98d32f..92ee2f4fb 100644 --- a/doc/COMPILE-GUIDE +++ b/doc/COMPILE-GUIDE @@ -1,5 +1,5 @@ Eggdrop Compile Guide and FAQ -Last revised: June 9, 2020 +Last revised: November 17, 2022 _____________________________________________________________________ Eggdrop Compile Guide and FAQ @@ -20,7 +20,7 @@ Last revised: June 9, 2020 A. Standard compile process (Linux, FreeBSD, NetBSD, OpenBSD, etc) B. HP-UX B.11.* C. Ultrix - D. Mac OS X + D. macOS (previously OS X and originally Mac OS X) E. AIX F. IRIX G. Solaris / SunOS @@ -187,7 +187,7 @@ Last revised: June 9, 2020 gmake install DEST=/home/user/otherdir - D. Mac OS X + D. macOS Follow the standard compile process in Section A. To compile dynamically (with module support), use 'make eggdrop' instead of 'make'. @@ -210,7 +210,7 @@ Last revised: June 9, 2020 If you notice a module that requires these changes, it would probably be a good idea to let the module's developer know, so it can be fixed. - Note that on Mac OS X, the DYLD_LIBRARY_PATH environment variable should + Note that on macOS, the DYLD_LIBRARY_PATH environment variable should be used instead of LD_LIBRARY_PATH. Install OpenSSL using homebrew: @@ -221,7 +221,7 @@ Last revised: June 9, 2020 Tell configure where to find tcl and openssl: - ./configure --with-tcl=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Tcl.framework/tclConfig.sh --with-sslinc=/usr/local/opt/openssl/include --with-ssllib=/usr/local/opt/openssl/lib + ./configure --with-tcl=/System/Volumes/Data/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk/System/Library/Frameworks/Tcl.framework/tclConfig.sh -with-sslinc=/usr/local/Cellar/openssl@3/3.0.7/include --with-ssllib=/usr/local/Cellar/openssl@3/3.0.7/lib E. AIX Follow the standard compile process in Section A. To compile dynamically @@ -581,4 +581,4 @@ Last revised: June 9, 2020 _____________________________________________________________________ Copyright (C) 1997 Robey Pointer - Copyright (C) 1999 - 2021 Eggheads Development Team + Copyright (C) 1999 - 2022 Eggheads Development Team diff --git a/src/tcl.c b/src/tcl.c index ccc4cd8d0..ac37316b0 100644 --- a/src/tcl.c +++ b/src/tcl.c @@ -600,8 +600,16 @@ ClientData tickle_InitNotifier() void tickle_AlertNotifier(ClientData cd) { - if (cd) - putlog(LOG_MISC, "*", "stub tickle_AlertNotifier"); + if (cd) { + fatal("Error calling Tcl_AlertNotifier", 0); + } +} + +void tickle_ServiceModeHook(int mode) +{ + if (mode != TCL_SERVICE_ALL) { + fatal("Tcl_ServiceModeHook called with unsupported mode", 0); + } } int tclthreadmainloop(int zero) @@ -916,6 +924,7 @@ void init_tcl(int argc, char **argv) notifierprocs.waitForEventProc = tickle_WaitForEvent; notifierprocs.finalizeNotifierProc = tickle_FinalizeNotifier; notifierprocs.alertNotifierProc = tickle_AlertNotifier; + notifierprocs.serviceModeHookProc = tickle_ServiceModeHook; Tcl_SetNotifier(¬ifierprocs); From de8c50be1a5475afe725e736c7019f9e432e2ba3 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Tue, 14 Feb 2023 00:19:06 +0000 Subject: [PATCH 53/92] Cleanup deprecated gethostbyname2 Replace deprecated / obsolete gethostbyname2() with POSIX.1-2001 getaddrinfo() --- aclocal.m4 | 1 - src/Makefile.in | 2 +- src/compat/Makefile.in | 16 +++------------ src/compat/compat.h | 1 - src/compat/gethostbyname2.c | 39 ------------------------------------- src/compat/gethostbyname2.h | 37 ----------------------------------- src/md5/Makefile.in | 2 +- src/net.c | 36 ++++++++++++++++++++++------------ src/tcldcc.c | 1 + 9 files changed, 30 insertions(+), 105 deletions(-) delete mode 100644 src/compat/gethostbyname2.c delete mode 100644 src/compat/gethostbyname2.h diff --git a/aclocal.m4 b/aclocal.m4 index 4e8aab300..1d8827d64 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1422,7 +1422,6 @@ dnl AC_DEFUN([EGG_IPV6_COMPAT], [ if test "$enable_ipv6" = "yes"; then - AC_CHECK_FUNCS([gethostbyname2]) AC_CHECK_TYPES([struct in6_addr], egg_cv_var_have_in6_addr="yes", egg_cv_var_have_in6_addr="no", [ #include #include diff --git a/src/Makefile.in b/src/Makefile.in index c9605a049..5ecc97d54 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -86,7 +86,7 @@ eggdrop.h: bg.o: bg.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/gethostbyname2.h \ + ../src/main.h compat/snprintf.h \ compat/explicit_bzero.h compat/strlcpy.h bg.h botcmd.o: botcmd.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 \ diff --git a/src/compat/Makefile.in b/src/compat/Makefile.in index e2617fb5f..87012d46d 100644 --- a/src/compat/Makefile.in +++ b/src/compat/Makefile.in @@ -17,8 +17,7 @@ STRIP = @STRIP@ CFLAGS = @CFLAGS@ -I../.. -I$(top_srcdir) -I$(top_srcdir)/src @SSL_INCLUDES@ @DEFS@ $(CFLGS) CPPFLAGS = @CPPFLAGS@ -OBJS = base64.o explicit_bzero.o gethostbyname2.o in6.o inet_aton.o snprintf.o \ - strlcpy.o +OBJS = base64.o explicit_bzero.o in6.o inet_aton.o snprintf.o strlcpy.o doofus: @echo "" @@ -43,15 +42,6 @@ compat: $(OBJS) #safety hash base64.o: base64.c ../../config.h explicit_bzero.o: explicit_bzero.c ../../config.h -gethostbyname2.o: gethostbyname2.c gethostbyname2.h ../../src/main.h \ - ../../config.h ../../eggint.h ../../lush.h ../../src/lang.h \ - ../../src/eggdrop.h ../../src/compat/in6.h ../../src/flags.h \ - ../../src/proto.h ../../src/misc_file.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/gethostbyname2.h ../../src/compat/explicit_bzero.h \ - ../../src/compat/strlcpy.h in6.o: in6.c in6.h inet_aton.o: inet_aton.c ../../src/main.h ../../config.h ../../eggint.h \ ../../lush.h ../../src/lang.h ../../src/eggdrop.h ../../src/compat/in6.h \ @@ -59,7 +49,7 @@ inet_aton.o: inet_aton.c ../../src/main.h ../../config.h ../../eggint.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/main.h \ - ../../src/compat/snprintf.h ../../src/compat/gethostbyname2.h \ + ../../src/compat/snprintf.h \ ../../src/compat/explicit_bzero.h ../../src/compat/strlcpy.h inet_aton.h snprintf.o: snprintf.c ../../src/main.h ../../config.h ../../eggint.h \ ../../lush.h ../../src/lang.h ../../src/eggdrop.h ../../src/compat/in6.h \ @@ -67,6 +57,6 @@ snprintf.o: snprintf.c ../../src/main.h ../../config.h ../../eggint.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/main.h \ - ../../src/compat/snprintf.h ../../src/compat/gethostbyname2.h \ + ../../src/compat/snprintf.h \ ../../src/compat/explicit_bzero.h ../../src/compat/strlcpy.h snprintf.h strlcpy.o: strlcpy.c ../../config.h diff --git a/src/compat/compat.h b/src/compat/compat.h index 75eb1753c..63b35ebc4 100644 --- a/src/compat/compat.h +++ b/src/compat/compat.h @@ -26,7 +26,6 @@ #include "base64.h" #include "inet_aton.h" #include "snprintf.h" -#include "gethostbyname2.h" #include "explicit_bzero.h" #include "strlcpy.h" diff --git a/src/compat/gethostbyname2.c b/src/compat/gethostbyname2.c deleted file mode 100644 index 6f1ec80d9..000000000 --- a/src/compat/gethostbyname2.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * gethostbyname2.c -- provide a dummy gethostbyname2 replacement - */ -/* - * Copyright (C) 2010 - 2022 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. - */ - -#include "gethostbyname2.h" - -#if defined IPV6 && !defined HAVE_GETHOSTBYNAME2 -struct hostent *gethostbyname2(const char *name, int af) -{ - struct hostent *h; - - h = gethostbyname(name); - if (!h) - return NULL; - if (h->h_addrtype != af) { - h_errno = NO_RECOVERY; - return NULL; - } - - return h; -} -#endif diff --git a/src/compat/gethostbyname2.h b/src/compat/gethostbyname2.h deleted file mode 100644 index 0f59f6e0e..000000000 --- a/src/compat/gethostbyname2.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * gethostbyname2.h - * prototypes for gethostbyname2.c - */ -/* - * Copyright (C) 2010 - 2022 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. - */ - -#ifndef _EGG_COMPAT_GETHOSTBYNAME2 -#define _EGG_COMPAT_GETHOSTBYNAME2 - -#include "src/main.h" - -#include -#ifdef HAVE_SYS_SOCKET_H -# include -#endif -#include - -#if defined IPV6 && !defined HAVE_GETHOSTBYNAME2 -struct hostent *gethostbyname2(const char *name, int af); -#endif -#endif /* _EGG_COMPAT_GETHOSTBYNAME2 */ diff --git a/src/md5/Makefile.in b/src/md5/Makefile.in index 4c9c670d3..7bf42c5c9 100644 --- a/src/md5/Makefile.in +++ b/src/md5/Makefile.in @@ -46,5 +46,5 @@ md5c.o: md5c.c md5.h ../../src/main.h ../../config.h ../../eggint.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/gethostbyname2.h ../../src/compat/explicit_bzero.h \ + ../../src/compat/explicit_bzero.h \ ../../src/compat/strlcpy.h diff --git a/src/net.c b/src/net.c index 30e1f4cb8..bb71aad6d 100644 --- a/src/net.c +++ b/src/net.c @@ -133,12 +133,14 @@ int setsockname(sockname_t *addr, char *src, int port, int allowres) char *endptr, *src2 = src;; long val; IP ip; - struct hostent *hp; volatile int af = AF_UNSPEC; char ip2[EGG_INET_ADDRSTRLEN]; #ifdef IPV6 volatile int pref; + struct addrinfo *res0 = NULL, *res; + int error; #else + struct hostent *hp; int i, count; #endif @@ -176,18 +178,28 @@ int setsockname(sockname_t *addr, char *src, int port, int allowres) /* src is a hostname. Attempt to resolve it.. */ if (!sigsetjmp(alarmret, 1)) { alarm(resolve_timeout); - hp = gethostbyname2(src, pref_af ? AF_INET6 : AF_INET); - if (!hp) - hp = gethostbyname2(src, pref_af ? AF_INET : AF_INET6); - alarm(0); - } else - hp = NULL; - if (hp) { - if (hp->h_addrtype == AF_INET) - memcpy(&addr->addr.s4.sin_addr, hp->h_addr_list[0], hp->h_length); + error = getaddrinfo(src, NULL, NULL, &res0); + if (!error) { + for (res = res0; res; res = res->ai_next) { + if (res == res0 || res->ai_family == (pref_af ? AF_INET6 : AF_INET)) { + af = res->ai_family; + memcpy(&addr->addr.sa, res->ai_addr, res->ai_addrlen); + if (res->ai_family == (pref_af ? AF_INET6 : AF_INET)) { + break; + } + } + } + if (res0) /* The behavior of freeadrinfo(NULL) is left unspecified by RFCs + * 2553 and 3493. Avoid to be compatible with all OSes. */ + freeaddrinfo(res0); + } + else if (error == EAI_NONAME) + debug1("net: setsockname(): getaddrinfo(): hostname %s not known", src); else - memcpy(&addr->addr.s6.sin6_addr, hp->h_addr_list[0], hp->h_length); - af = hp->h_addrtype; + debug1("net: setsockname(): getaddrinfo(): error = %s", gai_strerror(error)); + alarm(0); + } else { + debug1("net: setsockname(): getaddrinfo(): hostname %s resolve timeout", src); } } diff --git a/src/tcldcc.c b/src/tcldcc.c index 3fd96e0f0..3aba03757 100644 --- a/src/tcldcc.c +++ b/src/tcldcc.c @@ -22,6 +22,7 @@ */ #include "main.h" +#include #include "tandem.h" #include "modules.h" #include From 42916cee15222d20692569c161bc6ac3dec8ee19 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 13 Feb 2023 19:22:17 -0500 Subject: [PATCH 54/92] Run autotools/makedepend --- config.h.in | 3 - configure | 24 +------- src/Makefile.in | 97 +++++++++++++++----------------- src/compat/Makefile.in | 8 +-- src/md5/Makefile.in | 3 +- src/mod/assoc.mod/Makefile | 1 - src/mod/blowfish.mod/Makefile | 1 - src/mod/channels.mod/Makefile | 1 - src/mod/compress.mod/Makefile.in | 1 - src/mod/compress.mod/configure | 2 +- src/mod/console.mod/Makefile | 1 - src/mod/ctcp.mod/Makefile | 7 +-- src/mod/dns.mod/Makefile.in | 4 +- src/mod/dns.mod/configure | 2 +- src/mod/filesys.mod/Makefile | 1 - src/mod/ident.mod/Makefile | 1 - src/mod/irc.mod/Makefile | 1 - src/mod/notes.mod/Makefile | 1 - src/mod/pbkdf2.mod/Makefile | 10 +++- src/mod/seen.mod/Makefile | 1 - src/mod/server.mod/Makefile | 1 - src/mod/share.mod/Makefile | 1 - src/mod/transfer.mod/Makefile | 1 - src/mod/twitch.mod/Makefile | 1 - src/mod/uptime.mod/Makefile | 7 +-- src/mod/woobie.mod/Makefile | 6 +- 26 files changed, 73 insertions(+), 114 deletions(-) diff --git a/config.h.in b/config.h.in index 4e56afd4a..1a412d315 100644 --- a/config.h.in +++ b/config.h.in @@ -111,9 +111,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H -/* Define to 1 if you have the `gethostbyname2' function. */ -#undef HAVE_GETHOSTBYNAME2 - /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE diff --git a/configure b/configure index 7372012d6..494e63381 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 533f882a. +# From configure.ac de8c50be. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop 1.9.4. # @@ -8933,14 +8933,14 @@ $as_echo "$TCL_INCLUDE_SPEC" >&6; } - if test "x$TCL_MAJOR_VERSION" = x || test "x$TCL_MINOR_VERSION" = x || test $TCL_MAJOR_VERSION -lt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -lt 3; then + if test "x$TCL_MAJOR_VERSION" = x || test "x$TCL_MINOR_VERSION" = x || test $TCL_MAJOR_VERSION -lt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -lt 5; then cat << EOF >&2 configure: error: Your Tcl version is much too old for Eggdrop to use. You should download and compile a more recent version. The most reliable current version is $tclrecommendver and can be downloaded from - ${tclrecommendsite}. We require at least Tcl 8.3. + ${tclrecommendsite}. We require at least Tcl 8.5. See doc/COMPILE-GUIDE's 'Tcl Detection and Installation' section for more information. @@ -8951,13 +8951,6 @@ EOF - if test $TCL_MAJOR_VERSION -gt 8 || test $TCL_MAJOR_VERSION -eq 8 -a $TCL_MINOR_VERSION -ge 4; then - -$as_echo "#define HAVE_TCL_NOTIFIER_INIT 1" >>confdefs.h - - fi - - if test "x$TCLINCFN" != x; then egg_tclinc="\\\"$TCLINC/$TCLINCFN\\\"" else @@ -9335,17 +9328,6 @@ $as_echo "#define IPV6 1" >>confdefs.h if test "$enable_ipv6" = "yes"; then - for ac_func in gethostbyname2 -do : - ac_fn_c_check_func "$LINENO" "gethostbyname2" "ac_cv_func_gethostbyname2" -if test "x$ac_cv_func_gethostbyname2" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETHOSTBYNAME2 1 -_ACEOF - -fi -done - ac_fn_c_check_type "$LINENO" "struct in6_addr" "ac_cv_type_struct_in6_addr" " #include #include diff --git a/src/Makefile.in b/src/Makefile.in index 5ecc97d54..6fbce846f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -86,155 +86,146 @@ eggdrop.h: bg.o: bg.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 bg.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + bg.h botcmd.o: botcmd.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - tandem.h modules.h mod/modvals.h + compat/explicit_bzero.h compat/strlcpy.h tandem.h modules.h \ + mod/modvals.h botmsg.o: botmsg.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - tandem.h + compat/explicit_bzero.h compat/strlcpy.h tandem.h botnet.o: botnet.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - tandem.h + compat/explicit_bzero.h compat/strlcpy.h tandem.h chanprog.o: chanprog.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h cmds.o: cmds.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h tandem.h modules.h \ - mod/modvals.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + tandem.h modules.h mod/modvals.h dcc.o: dcc.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ - tandem.h md5/md5.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + modules.h mod/modvals.h tandem.h md5/md5.h dccutil.o: dccutil.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h tandem.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ + tandem.h dns.o: dns.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h dns.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + dns.h flags.o: flags.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h language.o: language.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h main.o: main.c ../config.h main.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h version.h modules.h \ - mod/modvals.h tandem.h bg.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + version.h modules.h mod/modvals.h tandem.h bg.h match.o: match.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h mem.o: mem.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h mod/modvals.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + mod/modvals.h misc.o: misc.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h tandem.h modules.h \ - mod/modvals.h stat.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h \ + tandem.h modules.h mod/modvals.h stat.h misc_file.o: misc_file.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h stat.h + compat/explicit_bzero.h compat/strlcpy.h stat.h modules.o: modules.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h tandem.h md5/md5.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ + tandem.h md5/md5.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/gethostbyname2.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 \ + mod/server.mod/server.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 \ compat/inet_aton.h ../src/main.h compat/snprintf.h \ - compat/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h tcl.o: tcl.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h tcldcc.o: tcldcc.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - tandem.h modules.h mod/modvals.h + compat/explicit_bzero.h compat/strlcpy.h tandem.h modules.h \ + mod/modvals.h tclhash.o: tclhash.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h tclmisc.o: tclmisc.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h tandem.h md5/md5.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ + tandem.h md5/md5.h tcluser.o: tcluser.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - tandem.h modules.h mod/modvals.h + compat/explicit_bzero.h compat/strlcpy.h tandem.h modules.h \ + mod/modvals.h tls.o: tls.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/gethostbyname2.h \ - compat/explicit_bzero.h compat/strlcpy.h + ../src/main.h compat/snprintf.h compat/explicit_bzero.h compat/strlcpy.h userent.o: userent.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h + compat/explicit_bzero.h compat/strlcpy.h userrec.o: userrec.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h tandem.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ + tandem.h users.o: users.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/gethostbyname2.h compat/explicit_bzero.h compat/strlcpy.h \ - modules.h mod/modvals.h tandem.h + compat/explicit_bzero.h compat/strlcpy.h modules.h mod/modvals.h \ + tandem.h diff --git a/src/compat/Makefile.in b/src/compat/Makefile.in index 87012d46d..c431ee491 100644 --- a/src/compat/Makefile.in +++ b/src/compat/Makefile.in @@ -49,14 +49,14 @@ inet_aton.o: inet_aton.c ../../src/main.h ../../config.h ../../eggint.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/main.h \ - ../../src/compat/snprintf.h \ - ../../src/compat/explicit_bzero.h ../../src/compat/strlcpy.h inet_aton.h + ../../src/compat/snprintf.h ../../src/compat/explicit_bzero.h \ + ../../src/compat/strlcpy.h inet_aton.h snprintf.o: snprintf.c ../../src/main.h ../../config.h ../../eggint.h \ ../../lush.h ../../src/lang.h ../../src/eggdrop.h ../../src/compat/in6.h \ ../../src/flags.h ../../src/proto.h ../../src/misc_file.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/main.h \ - ../../src/compat/snprintf.h \ - ../../src/compat/explicit_bzero.h ../../src/compat/strlcpy.h snprintf.h + ../../src/compat/snprintf.h ../../src/compat/explicit_bzero.h \ + ../../src/compat/strlcpy.h snprintf.h strlcpy.o: strlcpy.c ../../config.h diff --git a/src/md5/Makefile.in b/src/md5/Makefile.in index 7bf42c5c9..81fb52a98 100644 --- a/src/md5/Makefile.in +++ b/src/md5/Makefile.in @@ -46,5 +46,4 @@ md5c.o: md5c.c md5.h ../../src/main.h ../../config.h ../../eggint.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/compat/explicit_bzero.h ../../src/compat/strlcpy.h diff --git a/src/mod/assoc.mod/Makefile b/src/mod/assoc.mod/Makefile index 756870353..5bc160183 100644 --- a/src/mod/assoc.mod/Makefile +++ b/src/mod/assoc.mod/Makefile @@ -35,6 +35,5 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h .././assoc.mod/assoc.h diff --git a/src/mod/blowfish.mod/Makefile b/src/mod/blowfish.mod/Makefile index 4a448b5b1..64b1e7344 100644 --- a/src/mod/blowfish.mod/Makefile +++ b/src/mod/blowfish.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ .././blowfish.mod/blowfish.h .././blowfish.mod/bf_tab.h diff --git a/src/mod/channels.mod/Makefile b/src/mod/channels.mod/Makefile index 2e75492be..b53d568cd 100644 --- a/src/mod/channels.mod/Makefile +++ b/src/mod/channels.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ .././channels.mod/channels.h .././channels.mod/cmdschan.c \ diff --git a/src/mod/compress.mod/Makefile.in b/src/mod/compress.mod/Makefile.in index 552f38f15..6f91a3342 100644 --- a/src/mod/compress.mod/Makefile.in +++ b/src/mod/compress.mod/Makefile.in @@ -39,7 +39,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ ../../../src/mod/share.mod/share.h .././compress.mod/compress.h \ diff --git a/src/mod/compress.mod/configure b/src/mod/compress.mod/configure index 3ea939674..88d9e0815 100755 --- a/src/mod/compress.mod/configure +++ b/src/mod/compress.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 533f882a. +# From configure.ac de8c50be. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop Compress Module 1.9.4. # diff --git a/src/mod/console.mod/Makefile b/src/mod/console.mod/Makefile index e33c0b8e3..a678d1176 100644 --- a/src/mod/console.mod/Makefile +++ b/src/mod/console.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ .././console.mod/console.h diff --git a/src/mod/ctcp.mod/Makefile b/src/mod/ctcp.mod/Makefile index 8412533f0..dec8c9d97 100644 --- a/src/mod/ctcp.mod/Makefile +++ b/src/mod/ctcp.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ - ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ - ../../../src/mod/modvals.h ../../../src/tandem.h \ - ../../../src/mod/server.mod/server.h + ../../../src/compat/snprintf.h ../../../src/compat/explicit_bzero.h \ + ../../../src/compat/strlcpy.h ../../../src/mod/modvals.h \ + ../../../src/tandem.h ../../../src/mod/server.mod/server.h diff --git a/src/mod/dns.mod/Makefile.in b/src/mod/dns.mod/Makefile.in index bba72091b..b2508d6a9 100644 --- a/src/mod/dns.mod/Makefile.in +++ b/src/mod/dns.mod/Makefile.in @@ -40,7 +40,5 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ - ../../../src/mod/modvals.h ../../../src/tandem.h .././dns.mod/dns.h \ - .././dns.mod/coredns.c + ../../../src/mod/modvals.h ../../../src/tandem.h diff --git a/src/mod/dns.mod/configure b/src/mod/dns.mod/configure index 84e203692..5f03ba0b7 100755 --- a/src/mod/dns.mod/configure +++ b/src/mod/dns.mod/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac 533f882a. +# From configure.ac de8c50be. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Eggdrop DNS Module 1.9.4. # diff --git a/src/mod/filesys.mod/Makefile b/src/mod/filesys.mod/Makefile index c5bb3ac99..f1a7e1309 100644 --- a/src/mod/filesys.mod/Makefile +++ b/src/mod/filesys.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ .././filesys.mod/filedb3.h .././filesys.mod/filesys.h \ diff --git a/src/mod/ident.mod/Makefile b/src/mod/ident.mod/Makefile index eb261e1cd..071e7ef01 100644 --- a/src/mod/ident.mod/Makefile +++ b/src/mod/ident.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ ../../../src/mod/server.mod/server.h diff --git a/src/mod/irc.mod/Makefile b/src/mod/irc.mod/Makefile index 4fb07ab95..8a17bf80c 100644 --- a/src/mod/irc.mod/Makefile +++ b/src/mod/irc.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h .././irc.mod/irc.h \ ../../../src/mod/server.mod/server.h \ diff --git a/src/mod/notes.mod/Makefile b/src/mod/notes.mod/Makefile index 7c001acfb..0c3ce51a5 100644 --- a/src/mod/notes.mod/Makefile +++ b/src/mod/notes.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h .././notes.mod/notes.h \ .././notes.mod/cmdsnote.c diff --git a/src/mod/pbkdf2.mod/Makefile b/src/mod/pbkdf2.mod/Makefile index b28559065..8266ce14f 100644 --- a/src/mod/pbkdf2.mod/Makefile +++ b/src/mod/pbkdf2.mod/Makefile @@ -28,4 +28,12 @@ clean: distclean: clean #safety hash -../pbkdf2.o: .././pbkdf2.mod/pbkdf2.c +../pbkdf2.o: .././pbkdf2.mod/pbkdf2.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 diff --git a/src/mod/seen.mod/Makefile b/src/mod/seen.mod/Makefile index c61d32b5c..bcf2454c0 100644 --- a/src/mod/seen.mod/Makefile +++ b/src/mod/seen.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h ../../../src/users.h \ ../../../src/chan.h ../../../src/mod/channels.mod/channels.h diff --git a/src/mod/server.mod/Makefile b/src/mod/server.mod/Makefile index aaa8ee887..1b26a1043 100644 --- a/src/mod/server.mod/Makefile +++ b/src/mod/server.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ .././server.mod/server.h .././server.mod/isupport.c \ diff --git a/src/mod/share.mod/Makefile b/src/mod/share.mod/Makefile index e6f804367..5543e3570 100644 --- a/src/mod/share.mod/Makefile +++ b/src/mod/share.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h ../../../src/chan.h \ ../../../src/users.h ../../../src/mod/transfer.mod/transfer.h \ diff --git a/src/mod/transfer.mod/Makefile b/src/mod/transfer.mod/Makefile index 9cfb660bc..21de50e84 100644 --- a/src/mod/transfer.mod/Makefile +++ b/src/mod/transfer.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h ../../../src/users.h \ .././transfer.mod/transfer.h .././transfer.mod/transferfstat.c \ diff --git a/src/mod/twitch.mod/Makefile b/src/mod/twitch.mod/Makefile index bb81afa35..3477b6281 100644 --- a/src/mod/twitch.mod/Makefile +++ b/src/mod/twitch.mod/Makefile @@ -35,7 +35,6 @@ distclean: clean ../../../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/gethostbyname2.h \ ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ ../../../src/mod/modvals.h ../../../src/tandem.h \ ../../../src/mod/twitch.mod/twitch.h \ diff --git a/src/mod/uptime.mod/Makefile b/src/mod/uptime.mod/Makefile index ec120df9b..ff49761a4 100644 --- a/src/mod/uptime.mod/Makefile +++ b/src/mod/uptime.mod/Makefile @@ -34,7 +34,6 @@ distclean: clean ../../../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/gethostbyname2.h \ - ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ - .././uptime.mod/../modvals.h ../../../src/tandem.h \ - .././uptime.mod/../server.mod/server.h + ../../../src/compat/snprintf.h ../../../src/compat/explicit_bzero.h \ + ../../../src/compat/strlcpy.h .././uptime.mod/../modvals.h \ + ../../../src/tandem.h .././uptime.mod/../server.mod/server.h diff --git a/src/mod/woobie.mod/Makefile b/src/mod/woobie.mod/Makefile index 8b1a3417e..9ce22150a 100644 --- a/src/mod/woobie.mod/Makefile +++ b/src/mod/woobie.mod/Makefile @@ -34,6 +34,6 @@ distclean: clean ../../../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/gethostbyname2.h \ - ../../../src/compat/explicit_bzero.h ../../../src/compat/strlcpy.h \ - ../../../src/mod/modvals.h ../../../src/tandem.h + ../../../src/compat/snprintf.h ../../../src/compat/explicit_bzero.h \ + ../../../src/compat/strlcpy.h ../../../src/mod/modvals.h \ + ../../../src/tandem.h From d9bda49c2d6f3b4e43252b8119999b271a931e9c Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 13 Feb 2023 19:23:15 -0500 Subject: [PATCH 55/92] bump patchlevel --- src/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/version.h b/src/version.h index 5111478ae..36f59b15c 100644 --- a/src/version.h +++ b/src/version.h @@ -27,5 +27,5 @@ */ #define EGG_STRINGVER "1.9.4" -#define EGG_NUMVER 1090404 -#define EGG_PATCH "logupdates" +#define EGG_NUMVER 1090405 +#define EGG_PATCH "raisetcl" From 506f1405af21fa68652e0dae909d48a119cb3054 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 13 Feb 2023 21:14:40 -0500 Subject: [PATCH 56/92] Update THANKS --- THANKS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/THANKS b/THANKS index 1f3f5ba6f..53fe4a189 100644 --- a/THANKS +++ b/THANKS @@ -236,6 +236,7 @@ eelcohuininga Eelco Huininga Ehrenberg ejm Emmanuel Marty +Empus Erick- Erick Velez erick@erick.org eryg-kai Evo|ver @@ -509,6 +510,7 @@ Robby robby@chatbelgie.be Roger Yerramsetti Rok Papez romulus +rsc Robert Scheck Rufus S Wilcox S7reaM From c27143997de77af5f66c6278f02f86de24bba15d Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 13 Feb 2023 21:15:52 -0500 Subject: [PATCH 57/92] Update NEWS --- NEWS | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/NEWS b/NEWS index 6af6b7bac..a884e737a 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,35 @@ Last revised: December 4, 2021 _________________________________________________________________ +Eggdrop v1.9.5: + + General changes: + - Implemented a workaround for a Tcl issue parsing emojis that can cause a + crash + - Fixed an improper change to the display of bind flags that caused issues + with Tcl scripts that parse bind flags + - Added SSL header information to .status to help diagnose ./configure + mismatches + - Lots of under-the-hood bug fixes + + Botnet changes: + - None + + Tcl API changes: + - Tcl minimum required version is now 8.5! This actually happened in version + version 1.9.0; we just forgot to tell people. Oops! :) + + Module changes: + - Updated woobie.mod with additional example code + + Eggdrop config changes: + - None + + Documentation changes: + - Added additional documentation to help write modules + - Updated botnet docs to include reference to TLS docs for secure links + - Updated Tcl repo from unmaintained FTP to HTTP repository + Eggdrop v1.9.4: General changes: From ffb8c1814095966386f9891e43d10a67ed9ceec3 Mon Sep 17 00:00:00 2001 From: Geo Date: Mon, 13 Feb 2023 21:22:26 -0500 Subject: [PATCH 58/92] Update copyright --- AUTHORS | 2 +- CONTENTS | 2 +- FEATURES | 2 +- INSTALL | 6 +- NEWS | 4 +- aclocal.m4 | 2 +- config.h.in | 2 +- configure | 4 +- configure.ac | 4 +- doc/ABOUT | 2 +- doc/BANS | 2 +- doc/BOTNET | 27 +- doc/COMPILE-GUIDE | 2 +- doc/CONTENTS | 2 +- doc/FIRST-SCRIPT | 2 +- doc/IPV6 | 2 +- doc/IRCv3 | 2 +- doc/MODULES | 2 +- doc/PARTYLINE | 2 +- doc/PATCH-HOWTO | 2 +- doc/PBKDF2 | 2 +- doc/TLS | 2 +- doc/TRICKS | 2 +- doc/USERS | 2 +- doc/core.settings | 6 +- doc/html/_static/basic.css | 331 ++- doc/html/_static/doctools.js | 377 +-- doc/html/_static/documentation_options.js | 6 +- doc/html/_static/language_data.js | 106 +- doc/html/_static/pygments.css | 7 +- doc/html/_static/searchtools.js | 793 ++--- doc/html/_static/sphinx_highlight.js | 144 + doc/html/about/about.html | 72 +- doc/html/about/legal.html | 52 +- doc/html/index.html | 121 +- doc/html/install/install.html | 121 +- doc/html/install/readme.html | 201 +- doc/html/install/upgrading.html | 108 +- doc/html/modules/assoc.html | 2 +- doc/html/modules/blowfish.html | 2 +- doc/html/modules/channels.html | 2 +- doc/html/modules/compress.html | 2 +- doc/html/modules/console.html | 2 +- doc/html/modules/ctcp.html | 2 +- doc/html/modules/dns.html | 2 +- doc/html/modules/filesys.html | 2 +- doc/html/modules/ident.html | 2 +- doc/html/modules/included.html | 154 +- doc/html/modules/index.html | 106 +- doc/html/modules/internals.html | 166 +- doc/html/modules/irc.html | 2 +- doc/html/modules/mod/assoc.html | 54 +- doc/html/modules/mod/blowfish.html | 54 +- doc/html/modules/mod/channels.html | 467 ++- doc/html/modules/mod/compress.html | 68 +- doc/html/modules/mod/console.html | 74 +- doc/html/modules/mod/ctcp.html | 83 +- doc/html/modules/mod/dns.html | 86 +- doc/html/modules/mod/filesys.html | 325 ++- doc/html/modules/mod/ident.html | 91 +- doc/html/modules/mod/irc.html | 197 +- doc/html/modules/mod/notes.html | 88 +- doc/html/modules/mod/pbkdf2.html | 70 +- doc/html/modules/mod/seen.html | 54 +- doc/html/modules/mod/server.html | 278 +- doc/html/modules/mod/share.html | 92 +- doc/html/modules/mod/transfer.html | 86 +- doc/html/modules/mod/twitch.html | 93 +- doc/html/modules/mod/uptime.html | 60 +- doc/html/modules/mod/woobie.html | 54 +- doc/html/modules/notes.html | 2 +- doc/html/modules/pbkdf2.html | 2 +- doc/html/modules/seen.html | 2 +- doc/html/modules/server.html | 2 +- doc/html/modules/share.html | 2 +- doc/html/modules/transfer.html | 2 +- doc/html/modules/twitch.html | 2 +- doc/html/modules/uptime.html | 2 +- doc/html/modules/woobie.html | 2 +- doc/html/modules/writing.html | 136 +- doc/html/objects.inv | Bin 1319 -> 1395 bytes doc/html/search.html | 75 +- doc/html/searchindex.js | 2 +- doc/html/tutorials/firstscript.html | 96 +- doc/html/tutorials/firststeps.html | 150 +- doc/html/tutorials/module.html | 106 +- doc/html/tutorials/setup.html | 269 +- doc/html/tutorials/tlssetup.html | 96 +- doc/html/using/accounts.html | 112 +- doc/html/using/bans.html | 108 +- doc/html/using/botnet.html | 326 +-- doc/html/using/core.html | 693 +++-- doc/html/using/features.html | 98 +- doc/html/using/ipv6.html | 99 +- doc/html/using/ircv3.html | 104 +- doc/html/using/partyline.html | 56 +- doc/html/using/patch.html | 85 +- doc/html/using/pbkdf2.html | 2 +- doc/html/using/pbkdf2info.html | 130 +- doc/html/using/tcl-commands.html | 2858 +++++++++---------- doc/html/using/text-sub.html | 153 +- doc/html/using/tls.html | 177 +- doc/html/using/tricks.html | 90 +- doc/html/using/twitch-tcl-commands.html | 162 +- doc/html/using/twitchinfo.html | 110 +- doc/html/using/users.html | 228 +- doc/man1/eggdrop.1 | 4 +- doc/modules/mod.assoc | 2 +- doc/modules/mod.blowfish | 2 +- doc/modules/mod.channels | 2 +- doc/modules/mod.compress | 2 +- doc/modules/mod.console | 2 +- doc/modules/mod.ctcp | 2 +- doc/modules/mod.dns | 2 +- doc/modules/mod.filesys | 2 +- doc/modules/mod.ident | 2 +- doc/modules/mod.irc | 2 +- doc/modules/mod.notes | 2 +- doc/modules/mod.pbkdf2 | 2 +- doc/modules/mod.seen | 2 +- doc/modules/mod.server | 2 +- doc/modules/mod.share | 2 +- doc/modules/mod.transfer | 2 +- doc/modules/mod.twitch | 2 +- doc/modules/mod.uptime | 2 +- doc/modules/mod.woobie | 2 +- doc/modules/writing-modules | 2 +- doc/settings/CONTENTS | 2 +- doc/settings/core.settings | 2 +- doc/settings/mod.assoc | 2 +- doc/settings/mod.blowfish | 2 +- doc/settings/mod.channels | 2 +- doc/settings/mod.compress | 2 +- doc/settings/mod.console | 2 +- doc/settings/mod.ctcp | 2 +- doc/settings/mod.dns | 2 +- doc/settings/mod.filesys | 2 +- doc/settings/mod.ident | 2 +- doc/settings/mod.irc | 2 +- doc/settings/mod.notes | 2 +- doc/settings/mod.seen | 2 +- doc/settings/mod.server | 2 +- doc/settings/mod.share | 2 +- doc/settings/mod.transfer | 2 +- doc/settings/mod.uptime | 2 +- doc/settings/mod.woobie | 2 +- doc/sphinx_source/about/about.rst | 2 +- doc/sphinx_source/conf.py | 2 +- doc/sphinx_source/install/install.rst | 2 +- doc/sphinx_source/install/readme.rst | 2 +- doc/sphinx_source/modules/index.rst | 2 +- doc/sphinx_source/modules/mod/assoc.rst | 2 +- doc/sphinx_source/modules/mod/blowfish.rst | 2 +- doc/sphinx_source/modules/mod/channels.rst | 2 +- doc/sphinx_source/modules/mod/compress.rst | 2 +- doc/sphinx_source/modules/mod/console.rst | 2 +- doc/sphinx_source/modules/mod/ctcp.rst | 2 +- doc/sphinx_source/modules/mod/dns.rst | 2 +- doc/sphinx_source/modules/mod/filesys.rst | 2 +- doc/sphinx_source/modules/mod/ident.rst | 2 +- doc/sphinx_source/modules/mod/irc.rst | 2 +- doc/sphinx_source/modules/mod/notes.rst | 2 +- doc/sphinx_source/modules/mod/pbkdf2.rst | 2 +- doc/sphinx_source/modules/mod/seen.rst | 2 +- doc/sphinx_source/modules/mod/server.rst | 2 +- doc/sphinx_source/modules/mod/share.rst | 2 +- doc/sphinx_source/modules/mod/transfer.rst | 2 +- doc/sphinx_source/modules/mod/twitch.rst | 2 +- doc/sphinx_source/modules/mod/uptime.rst | 2 +- doc/sphinx_source/modules/mod/woobie.rst | 2 +- doc/sphinx_source/tutorials/firstscript.rst | 2 +- doc/sphinx_source/using/bans.rst | 2 +- doc/sphinx_source/using/botnet.rst | 2 +- doc/sphinx_source/using/core.rst | 2 +- doc/sphinx_source/using/features.rst | 2 +- doc/sphinx_source/using/ipv6.rst | 2 +- doc/sphinx_source/using/ircv3.rst | 2 +- doc/sphinx_source/using/partyline.rst | 2 +- doc/sphinx_source/using/patch.rst | 2 +- doc/sphinx_source/using/pbkdf2info.rst | 2 +- doc/sphinx_source/using/tcl-commands.rst | 2 +- doc/sphinx_source/using/text-sub.rst | 2 +- doc/sphinx_source/using/tls.rst | 2 +- doc/sphinx_source/using/tricks.rst | 2 +- doc/sphinx_source/using/users.rst | 2 +- doc/tcl-commands.doc | 2 +- logs/CONTENTS | 2 +- m4/tcl.m4 | 2 +- misc/genchanges | 2 +- misc/generatedocs | 2 +- misc/getcommit | 2 +- misc/killwhitespace | 2 +- misc/makedepend | 2 +- misc/modconfig | 2 +- misc/newversion | 2 +- misc/releaseprep | 2 +- misc/runautotools | 2 +- misc/setpatch | 4 +- misc/updatecopyright | 2 +- scripts/CONTENTS | 2 +- scripts/action.fix.tcl | 2 +- scripts/autobotchk | 6 +- scripts/compat.tcl | 2 +- scripts/ques5.tcl | 2 +- src/bg.c | 2 +- src/bg.h | 2 +- src/botcmd.c | 2 +- src/botmsg.c | 2 +- src/botnet.c | 2 +- src/chan.h | 2 +- src/chanprog.c | 2 +- src/cmds.c | 2 +- src/cmdt.h | 2 +- src/compat/base64.c | 2 +- src/compat/base64.h | 2 +- src/compat/compat.h | 2 +- src/compat/explicit_bzero.c | 2 +- src/compat/explicit_bzero.h | 2 +- src/compat/in6.h | 2 +- src/compat/inet_aton.c | 2 +- src/compat/inet_aton.h | 2 +- src/compat/snprintf.c | 2 +- src/compat/snprintf.h | 2 +- src/compat/strlcpy.c | 2 +- src/compat/strlcpy.h | 2 +- src/dcc.c | 2 +- src/dccutil.c | 2 +- src/dns.c | 2 +- src/dns.h | 2 +- src/eggdrop.h | 2 +- src/flags.c | 2 +- src/flags.h | 2 +- src/lang.h | 2 +- src/language.c | 2 +- src/main.c | 6 +- src/main.h | 2 +- src/mem.c | 2 +- src/misc.c | 2 +- src/misc_file.c | 2 +- src/misc_file.h | 2 +- src/mod/assoc.mod/assoc.c | 2 +- src/mod/assoc.mod/assoc.h | 2 +- src/mod/blowfish.mod/bf_tab.h | 2 +- src/mod/blowfish.mod/blowfish.c | 2 +- src/mod/blowfish.mod/blowfish.h | 2 +- src/mod/channels.mod/channels.c | 2 +- src/mod/channels.mod/channels.h | 2 +- src/mod/channels.mod/cmdschan.c | 2 +- src/mod/channels.mod/tclchan.c | 2 +- src/mod/channels.mod/udefchan.c | 2 +- src/mod/channels.mod/userchan.c | 2 +- src/mod/compress.mod/compress.c | 2 +- src/mod/compress.mod/compress.h | 2 +- src/mod/compress.mod/configure | 4 +- src/mod/compress.mod/configure.ac | 2 +- src/mod/compress.mod/tclcompress.c | 2 +- src/mod/console.mod/console.c | 2 +- src/mod/console.mod/console.h | 2 +- src/mod/ctcp.mod/ctcp.c | 2 +- src/mod/ctcp.mod/ctcp.h | 2 +- src/mod/dns.mod/configure | 4 +- src/mod/dns.mod/configure.ac | 2 +- src/mod/dns.mod/coredns.c | 2 +- src/mod/dns.mod/dns.c | 2 +- src/mod/dns.mod/dns.h | 2 +- src/mod/filesys.mod/dbcompat.c | 2 +- src/mod/filesys.mod/dbcompat.h | 2 +- src/mod/filesys.mod/filedb3.c | 2 +- src/mod/filesys.mod/filedb3.h | 2 +- src/mod/filesys.mod/filelist.c | 2 +- src/mod/filesys.mod/filelist.h | 2 +- src/mod/filesys.mod/files.c | 2 +- src/mod/filesys.mod/files.h | 2 +- src/mod/filesys.mod/filesys.c | 2 +- src/mod/filesys.mod/filesys.h | 2 +- src/mod/filesys.mod/tclfiles.c | 2 +- src/mod/ident.mod/ident.c | 2 +- src/mod/irc.mod/chan.c | 2 +- src/mod/irc.mod/cmdsirc.c | 2 +- src/mod/irc.mod/irc.c | 2 +- src/mod/irc.mod/irc.h | 2 +- src/mod/irc.mod/mode.c | 2 +- src/mod/irc.mod/msgcmds.c | 2 +- src/mod/irc.mod/tclirc.c | 2 +- src/mod/module.h | 2 +- src/mod/modvals.h | 2 +- src/mod/notes.mod/cmdsnote.c | 2 +- src/mod/notes.mod/notes.c | 2 +- src/mod/notes.mod/notes.h | 2 +- src/mod/pbkdf2.mod/pbkdf2.c | 2 +- src/mod/seen.mod/seen.c | 2 +- src/mod/server.mod/cmdsserv.c | 2 +- src/mod/server.mod/isupport.c | 2 +- src/mod/server.mod/server.c | 2 +- src/mod/server.mod/server.h | 2 +- src/mod/server.mod/servmsg.c | 2 +- src/mod/server.mod/tclisupport.c | 2 +- src/mod/server.mod/tclserv.c | 2 +- src/mod/share.mod/share.c | 2 +- src/mod/share.mod/share.h | 2 +- src/mod/share.mod/uf_features.c | 2 +- src/mod/transfer.mod/tcltransfer.c | 2 +- src/mod/transfer.mod/transfer.c | 2 +- src/mod/transfer.mod/transfer.h | 2 +- src/mod/transfer.mod/transferfstat.c | 2 +- src/mod/transfer.mod/transferqueue.c | 2 +- src/mod/twitch.mod/twitch.c | 2 +- src/mod/twitch.mod/twitch.h | 2 +- src/mod/uptime.mod/uptime.c | 2 +- src/mod/uptime.mod/uptime.h | 2 +- src/mod/woobie.mod/woobie.c | 2 +- src/modules.c | 2 +- src/modules.h | 2 +- src/net.c | 2 +- src/proto.h | 2 +- src/rfc1459.c | 2 +- src/stat.h | 2 +- src/tandem.h | 2 +- src/tcl.c | 2 +- src/tcldcc.c | 2 +- src/tclegg.h | 2 +- src/tclhash.c | 2 +- src/tclhash.h | 2 +- src/tclmisc.c | 2 +- src/tcluser.c | 2 +- src/tls.c | 2 +- src/userent.c | 2 +- src/userrec.c | 2 +- src/users.c | 2 +- src/users.h | 2 +- src/version.h | 2 +- text/CONTENTS | 2 +- text/banner | 2 +- 333 files changed, 6148 insertions(+), 6209 deletions(-) create mode 100644 doc/html/_static/sphinx_highlight.js diff --git a/AUTHORS b/AUTHORS index 0a0d78221..dc4275d08 100644 --- a/AUTHORS +++ b/AUTHORS @@ -104,4 +104,4 @@ See also: THANKS, doc/Versions, doc/Changes ------------------------------------------------------------------------------ Copyright (C) 1997 Robey Pointer -Copyright (C) 1999 - 2021 Eggheads Development Team +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/CONTENTS b/CONTENTS index ac9540049..6b5dbc606 100644 --- a/CONTENTS +++ b/CONTENTS @@ -82,4 +82,4 @@ Last revised: September 21, 2018 Contains information on upgrading from a 1.6 bot to a 1.8 bot. _____________________________________________________________________ - Copyright (C) 2003 - 2021 Eggheads Development Team + Copyright (C) 2003 - 2023 Eggheads Development Team diff --git a/FEATURES b/FEATURES index 5f8fafe56..4de630f7e 100644 --- a/FEATURES +++ b/FEATURES @@ -44,4 +44,4 @@ Eggdrop Features Copyright (C) 1997 Robey Pointer -Copyright (C) 2000 - 2022 Eggheads Development Team +Copyright (C) 2000 - 2023 Eggheads Development Team diff --git a/INSTALL b/INSTALL index 6304d2628..1b355fd85 100644 --- a/INSTALL +++ b/INSTALL @@ -19,8 +19,6 @@ Eggdrop uses the GNU autoconfigure scripts to make things easier. correctly compile Eggdrop. It will also try to find Tcl, which is required to compile. - For macOS tcl and openssl see doc/COMPILE-GUIDE. - 2. Type either 'make config' or 'make iconfig' to determine which @@ -160,5 +158,5 @@ the README file. If not, then READ IT!&@#%@! Have fun with Eggdrop! - Copyright (C) 1997 Robey Pointer - Copyright (C) 1999 - 2022 Eggheads Development Team + Copyright (C) 1997 Robey Pointer Copyright (C) 1999 - 2022 Eggheads + Development Team diff --git a/NEWS b/NEWS index a884e737a..fcb16e621 100644 --- a/NEWS +++ b/NEWS @@ -36,7 +36,7 @@ Eggdrop v1.9.5: Module changes: - Updated woobie.mod with additional example code - Eggdrop config changes: + Eggdrop config changes: - None Documentation changes: @@ -317,4 +317,4 @@ Eggdrop v1.9.0: ________________________________________________________________________ Copyright (C) 1997 Robey Pointer -Copyright (C) 1999 - 2021 Eggheads Development Team +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/aclocal.m4 b/aclocal.m4 index 1d8827d64..f0df8ce91 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ dnl aclocal.m4: macros autoconf uses when building configure from configure.ac dnl -dnl Copyright (C) 1999 - 2022 Eggheads Development Team +dnl Copyright (C) 1999 - 2023 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/config.h.in b/config.h.in index 1a412d315..cec70a8a3 100644 --- a/config.h.in +++ b/config.h.in @@ -2,7 +2,7 @@ /* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2022 Eggheads Development Team + * Copyright (C) 1999 - 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 diff --git a/configure b/configure index 494e63381..a66f50b10 100755 --- a/configure +++ b/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 - 2023 Eggheads Development Team ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## @@ -1518,7 +1518,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 - 2023 Eggheads Development Team _ACEOF exit fi diff --git a/configure.ac b/configure.ac index c90d97e56..3ae5947e2 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl configure.ac: this file is processed by autoconf to produce ./configure. AC_PREREQ(2.61) AC_INIT([Eggdrop],[1.9.4],[bugs@eggheads.org]) -AC_COPYRIGHT([Copyright (C) 1999 - 2022 Eggheads Development Team]) +AC_COPYRIGHT([Copyright (C) 1999 - 2023 Eggheads Development Team]) AC_LANG([C]) AC_REVISION([m4_esyscmd([misc/getcommit])]) AC_CONFIG_SRCDIR(src/eggdrop.h) @@ -14,7 +14,7 @@ AC_PRESERVE_HELP_ORDER dnl config.h stuff AH_TOP([/* * Copyright (C) 1997 Robey Pointer - * Copyright (C) 1999 - 2022 Eggheads Development Team + * Copyright (C) 1999 - 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 diff --git a/doc/ABOUT b/doc/ABOUT index 30fb3e7ff..dd7301edd 100644 --- a/doc/ABOUT +++ b/doc/ABOUT @@ -55,4 +55,4 @@ About Eggdrop - Tcl -- Eggdrop cannot compile without Tcl installed on your shell. - Copyright (C) 1999 - 2022 Eggheads Development Team + Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/BANS b/doc/BANS index 747f95ffa..0eb2ddfdb 100644 --- a/doc/BANS +++ b/doc/BANS @@ -75,4 +75,4 @@ Bans, Invites, and Exempts file) or until the channel goes -i again, whichever happens last. - Copyright (C) 1999 - 2022 Eggheads Development Team + Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/BOTNET b/doc/BOTNET index d3e700766..cef4b16ee 100644 --- a/doc/BOTNET +++ b/doc/BOTNET @@ -1,4 +1,4 @@ -Botnet Sharing and Linking Last revised: Nov 09, 2017 +Botnet Sharing and Linking Botnet Sharing and Linking @@ -171,6 +171,16 @@ At this point, you can link the two bots by typing '.link BotA' on BotB passwords which are not stored encrypted in the userfile. Note that you can link as many bots as you wish to your botnet. +Secure (TLS) Links + +Since Eggdrop 1.8.0, the ability to encrypt bot links using TLS is +possible. On the hub bot you would prefix the port given in the listen +command with a +, and when you add the hub bot to the leaf, you would +prefix the port used in the .+bot command with a +. In other words, you +would set listen +5555 in the hub config and use .+bot hubbot 1.2.3.4 ++5555 on the leaf bot. These settings are explained more thoroughly in +the TLS botnet documentation. + USING BOTFLAGS Botflags are needed to assign special functions and tasks to your bots. @@ -338,4 +348,17 @@ MAKING BOTS SHARE USER RECORDS |-+beldin `-+Lameshare -Copyright (C) 1999 - 2022 Eggheads Development Team +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 intead of passwords for +authentication. + +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/COMPILE-GUIDE b/doc/COMPILE-GUIDE index 92ee2f4fb..7e4322866 100644 --- a/doc/COMPILE-GUIDE +++ b/doc/COMPILE-GUIDE @@ -581,4 +581,4 @@ Last revised: November 17, 2022 _____________________________________________________________________ Copyright (C) 1997 Robey Pointer - Copyright (C) 1999 - 2022 Eggheads Development Team + Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/CONTENTS b/doc/CONTENTS index ba059a05e..a56d03cb4 100644 --- a/doc/CONTENTS +++ b/doc/CONTENTS @@ -72,4 +72,4 @@ Last revised: Nov 01, 2010 notes in reverse chronological order. _____________________________________________________________________ - Copyright (C) 2003 - 2021 Eggheads Development Team + Copyright (C) 2003 - 2023 Eggheads Development Team diff --git a/doc/FIRST-SCRIPT b/doc/FIRST-SCRIPT index c98d00674..919531af7 100644 --- a/doc/FIRST-SCRIPT +++ b/doc/FIRST-SCRIPT @@ -225,4 +225,4 @@ of salt!)
      -Copyright (C) 2003 - 2022 Eggheads Development Team +Copyright (C) 2003 - 2023 Eggheads Development Team diff --git a/doc/IPV6 b/doc/IPV6 index b088b8a8f..b181d3b14 100644 --- a/doc/IPV6 +++ b/doc/IPV6 @@ -77,4 +77,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 - 2022 Eggheads Development Team +Copyright (C) 2010 - 2023 Eggheads Development Team diff --git a/doc/IRCv3 b/doc/IRCv3 index e72536ff9..2199771ee 100644 --- a/doc/IRCv3 +++ b/doc/IRCv3 @@ -54,4 +54,4 @@ The following capabilities are supported by Eggdrop: - setname - +typing -Copyright (C) 2010 - 2022 Eggheads Development Team +Copyright (C) 2010 - 2023 Eggheads Development Team diff --git a/doc/MODULES b/doc/MODULES index 9e6aeba41..b61a69b4b 100644 --- a/doc/MODULES +++ b/doc/MODULES @@ -418,4 +418,4 @@ WHAT TO DO WITH A MODULE? the modules directory on ftp.eggheads.org. Don't forget to mention in your text file which version Eggdrop the module is written for. -Copyright (C) 1999 - 2021 Eggheads Development Team +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/PARTYLINE b/doc/PARTYLINE index 4b4a030c1..3d490e611 100644 --- a/doc/PARTYLINE +++ b/doc/PARTYLINE @@ -34,4 +34,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 - 2022 Eggheads Development Team +Copyright (C) 2002 - 2023 Eggheads Development Team diff --git a/doc/PATCH-HOWTO b/doc/PATCH-HOWTO index abfa9c012..411ef0adc 100644 --- a/doc/PATCH-HOWTO +++ b/doc/PATCH-HOWTO @@ -34,4 +34,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 - 2022 Eggheads Development Team +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/PBKDF2 b/doc/PBKDF2 index cbb4e5e81..7e60d55c7 100644 --- a/doc/PBKDF2 +++ b/doc/PBKDF2 @@ -138,4 +138,4 @@ where 'PBK method' is the method 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 - 2022 Eggheads Development Team +Copyright (C) 2000 - 2023 Eggheads Development Team diff --git a/doc/TLS b/doc/TLS index d4c9661d3..991217fd4 100644 --- a/doc/TLS +++ b/doc/TLS @@ -202,4 +202,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 - 2022 Eggheads Development Team +Copyright (C) 2010 - 2023 Eggheads Development Team diff --git a/doc/TRICKS b/doc/TRICKS index 157390db8..dfc5dbb6d 100644 --- a/doc/TRICKS +++ b/doc/TRICKS @@ -58,4 +58,4 @@ normal Tcl file. For example, you can set 'userfile' and 'chanfile' to set userfile "$myvar.user" set chanfile "$myvar.chan" -Copyright (C) 1999 - 2022 Eggheads Development Team +Copyright (C) 1999 - 2023 Eggheads Development Team diff --git a/doc/USERS b/doc/USERS index de72d3bf6..5e561135f 100644 --- a/doc/USERS +++ b/doc/USERS @@ -97,4 +97,4 @@ global flag applies to all channels. The standard global flags are: 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 - 2022 Eggheads Development Team +Copyright (C) 2002 - 2023 Eggheads Development Team diff --git a/doc/core.settings b/doc/core.settings index 236709f7f..28b090666 100644 --- a/doc/core.settings +++ b/doc/core.settings @@ -231,9 +231,7 @@ logfile "logs/logfile" set logfile-suffix ".%d%b%Y" If keep-all-logs is 1, this setting will define the suffix of the logfiles. The default will result in a suffix like "04May2000". "%Y%m%d" will produce the often used - yyyymmdd format. Read the strftime manpages for more options. NOTE: - On systems which don't support strftime, the default format will - always be used. + yyyymmdd format. Read the strftime manpages for more options. CONSOLE SETTINGS @@ -712,4 +710,4 @@ point. source scripts/alltools.tcl source scripts/action.fix.tcl -Copyright (C) 2000 - 2022 Eggheads Development Team +Copyright (C) 2000 - 2023 Eggheads Development Team diff --git a/doc/html/_static/basic.css b/doc/html/_static/basic.css index 9b49ca350..18255e5ae 100644 --- a/doc/html/_static/basic.css +++ b/doc/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,6 +15,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -124,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -216,7 +222,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -261,19 +267,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -287,30 +299,45 @@ img.align-center, .figure.align-center, object.align-center { text-align: center; } +.align-default { + text-align: center; +} + .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + padding: 7px; background-color: #ffe; width: 40%; float: right; + clear: right; + overflow-x: auto; } p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; - padding: 7px 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -332,10 +359,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -346,9 +369,34 @@ div.body p.centered { margin-top: 25px; } +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + /* -- tables ---------------------------------------------------------------- */ table.docutils { + margin-top: 10px; + margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -358,6 +406,11 @@ table.align-center { margin-right: auto; } +table.align-default { + margin-left: auto; + margin-right: auto; +} + table caption span.caption-number { font-style: italic; } @@ -373,10 +426,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -391,22 +440,34 @@ table.citation td { border-bottom: none; } +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -433,10 +494,71 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ +table.hlist { + margin: 1em 0; +} + table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -460,11 +582,81 @@ ol.upperroman { list-style: upper-roman; } +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + dl { margin-bottom: 15px; } -dd p { +dd > :first-child { margin-top: 0px; } @@ -478,6 +670,11 @@ dd { margin-left: 30px; } +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + dt:target, span.highlighted { background-color: #fbe54e; } @@ -491,14 +688,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -537,6 +726,13 @@ dl.glossary dt { font-style: oblique; } +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + abbr, acronym { border-bottom: dotted 1px; cursor: help; @@ -549,29 +745,69 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } +pre, div[class*="highlight-"] { + clear: both; +} + span.pre { -moz-hyphens: none; -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; } td.linenos pre { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; } div.code-block-caption { + margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -580,8 +816,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -593,21 +835,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -648,8 +876,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/doc/html/_static/doctools.js b/doc/html/_static/doctools.js index 344db17dd..d06a71d75 100644 --- a/doc/html/_static/doctools.js +++ b/doc/html/_static/doctools.js @@ -2,314 +2,155 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilities for all documentation. + * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var bbox = span.getBBox(); - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * helper function to focus on search bar */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * highlight the search words provided in the url in the text + * Initialise the domain index toggle buttons */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, + }; - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } + break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/doc/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js index c0721a95a..dbe4282de 100644 --- a/doc/html/_static/documentation_options.js +++ b/doc/html/_static/documentation_options.js @@ -1,10 +1,14 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '1.9.4', - LANGUAGE: 'None', + LANGUAGE: 'en', COLLAPSE_INDEX: false, + BUILDER: 'html', FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/doc/html/_static/language_data.js b/doc/html/_static/language_data.js index 5266fb19e..250f5665f 100644 --- a/doc/html/_static/language_data.js +++ b/doc/html/_static/language_data.js @@ -5,15 +5,16 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ -var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; -/* Non-minified version JS is _stemmer.js if file is provided */ +/* Non-minified version is copied as a separate JS file, is available */ + /** * Porter Stemmer */ @@ -196,102 +197,3 @@ var Stemmer = function() { } } - - - - -var splitChars = (function() { - var result = {}; - var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, - 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, - 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, - 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, - 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, - 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, - 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, - 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, - 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, - 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; - var i, j, start, end; - for (i = 0; i < singles.length; i++) { - result[singles[i]] = true; - } - var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], - [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], - [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], - [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], - [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], - [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], - [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], - [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], - [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], - [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], - [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], - [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], - [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], - [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], - [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], - [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], - [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], - [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], - [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], - [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], - [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], - [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], - [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], - [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], - [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], - [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], - [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], - [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], - [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], - [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], - [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], - [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], - [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], - [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], - [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], - [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], - [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], - [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], - [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], - [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], - [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], - [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], - [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], - [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], - [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], - [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], - [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], - [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], - [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; - for (i = 0; i < ranges.length; i++) { - start = ranges[i][0]; - end = ranges[i][1]; - for (j = start; j <= end; j++) { - result[j] = true; - } - } - return result; -})(); - -function splitQuery(query) { - var result = []; - var start = -1; - for (var i = 0; i < query.length; i++) { - if (splitChars[query.charCodeAt(i)]) { - if (start !== -1) { - result.push(query.slice(start, i)); - start = -1; - } - } else if (start === -1) { - start = i; - } - } - if (start !== -1) { - result.push(query.slice(start)); - } - return result; -} - - diff --git a/doc/html/_static/pygments.css b/doc/html/_static/pygments.css index 20c4814dc..691aeb82d 100644 --- a/doc/html/_static/pygments.css +++ b/doc/html/_static/pygments.css @@ -1,5 +1,10 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } +.highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ diff --git a/doc/html/_static/searchtools.js b/doc/html/_static/searchtools.js index 5ff318066..97d56a74d 100644 --- a/doc/html/_static/searchtools.js +++ b/doc/html/_static/searchtools.js @@ -4,22 +4,24 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ +"use strict"; -if (!Scorer) { - /** - * Simple result scoring code. - */ +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { var Scorer = { // Implement the following function to further tweak the score for each result - // The function takes a result array [filename, title, anchor, descr, score] + // The function takes a result array [docname, title, anchor, descr, score, filename] // and returns the new score. /* - score: function(result) { - return result[4]; + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score }, */ @@ -28,423 +30,508 @@ if (!Scorer) { // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, // Used when the priority is not in the mapping. objPrioDefault: 0, // query found in title title: 15, + partialTitle: 7, // query found in terms - term: 5 + term: 5, + partialTerm: 2, }; } -if (!splitQuery) { - function splitQuery(query) { - return query.split(/\s+/); +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings } /** * Search Module */ -var Search = { - - _index : null, - _queued_query : null, - _pulse_status : -1, - - init : function() { - var params = $.getQueryParameters(); - if (params.q) { - var query = params.q[0]; - $('input[name="q"]')[0].value = query; - this.performSearch(query); - } +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; }, - loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, - dataType: "script", cache: true, - complete: function(jqxhr, textstatus) { - if (textstatus != "success") { - document.getElementById("searchindexloader").src = url; - } - }}); + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); }, - setIndex : function(index) { - var q; - this._index = index; - if ((q = this._queued_query) !== null) { - this._queued_query = null; - Search.query(q); + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); } }, - hasIndex : function() { - return this._index !== null; - }, + hasIndex: () => Search._index !== null, - deferQuery : function(query) { - this._queued_query = query; - }, + deferQuery: (query) => (Search._queued_query = query), - stopPulse : function() { - this._pulse_status = 0; - }, + stopPulse: () => (Search._pulse_status = -1), - startPulse : function() { - if (this._pulse_status >= 0) - return; - function pulse() { - var i; + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { Search._pulse_status = (Search._pulse_status + 1) % 4; - var dotString = ''; - for (i = 0; i < Search._pulse_status; i++) - dotString += '.'; - Search.dots.text(dotString); - if (Search._pulse_status > -1) - window.setTimeout(pulse, 500); - } + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; pulse(); }, /** * perform a search for something (or wait until index is loaded) */ - performSearch : function(query) { + performSearch: (query) => { // create the required interface elements - this.out = $('#search-results'); - this.title = $('

      ' + _('Searching') + '

      ').appendTo(this.out); - this.dots = $('').appendTo(this.title); - this.status = $('

      ').appendTo(this.out); - this.output = $(' -

      Using Eggdrop

      +

      Using Eggdrop

      -

      Tutorials

      +

      Tutorials

      -

      Eggdrop Modules

      +

      Eggdrop Modules

      -

      About Eggdrop

      +

      About Eggdrop

      So this is how we register C callbacks for binds with the correct arguments:

      - -
      -

      Summary

      + +
      +

      Summary

      In summary, this is how the dcc bind is called:

        -
      • check_tcl_dcc() creates Tcl variables $_dcc1 $_dcc2 $_dcc3 and lets check_tcl_bind call the binds
      • -
      • Tcl binds are done at this point
      • -
      • C binds mean the Tcl command associated with the bind is *dcc:boot which calls builtin_dcc which gets cmd_boot as ClientData cd argument
      • -
      • buildin_dcc performs some sanity checking to avoid crashes and then calls cmd_boot() aka F() with the arguments it wants C callbacks to have
      • +
      • check_tcl_dcc() creates Tcl variables $_dcc1 $_dcc2 $_dcc3 and lets check_tcl_bind call the binds

      • +
      • Tcl binds are done at this point

      • +
      • C binds mean the Tcl command associated with the bind is *dcc:boot which calls builtin_dcc which gets cmd_boot as ClientData cd argument

      • +
      • gbuildin_dcc performs some sanity checking to avoid crashes and then calls cmd_boot() aka F() with the arguments it wants C callbacks to have

      -

      Example edited and annotated gdb backtrace in cmd_boot after doing .boot test on the partyline as user thommey with typical owner flags.

      +

      Example edited and annotated gdb backtrace in :code::cmd_boot after doing .boot test on the partyline as user thommey with typical owner flags.

      #0  cmd_boot (u=0x55e8bd8a49b0, idx=4, par=0x55e8be6a0010 "test") at cmds.c:614
           *u = {next = 0x55e8bd8aec90, handle = "thommey", flags = 8977024, flags_udef = 0, chanrec = 0x55e8bd8aeae0, entries = 0x55e8bd8a4a10}
       #1  builtin_dcc (cd=0x55e8bbf002d0 <cmd_boot>, irp=0x55e8bd59b1c0, argc=4, argv=0x55e8bd7e3e00) at tclhash.c:678
      @@ -355,10 +350,11 @@ 

      Summary

      @@ -371,7 +367,7 @@

      Summary
      - previous | next @@ -383,9 +379,9 @@

      Summary

      diff --git a/doc/html/modules/irc.html b/doc/html/modules/irc.html index f12063f7e..868377b61 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 - 2022 Eggheads Development Team

      +

      Copyright (C) 2000 - 2023 Eggheads Development Team

      diff --git a/doc/html/modules/mod/assoc.html b/doc/html/modules/mod/assoc.html index 546553921..39f962f04 100644 --- a/doc/html/modules/mod/assoc.html +++ b/doc/html/modules/mod/assoc.html @@ -1,28 +1,23 @@ - + - + - - + + + Assoc Module — Eggdrop 1.9.4 documentation - - - - - - - + + + + +

      ---- - - - +
      +
      0turn off
      + + + - - + + - - + + - - + + - - + + - - + + - + - - + + - +

      0

      turn off

      1isoptest (allow serverop if registered op)

      1

      isoptest (allow serverop if registered op)

      2wasoptest (allow serverop if user had op before split)

      2

      wasoptest (allow serverop if user had op before split)

      3allow serverop if isop or wasop

      3

      allow serverop if isop or wasop

      4allow serverop if isop and wasop.

      4

      allow serverop if isop and wasop.

      5If the channel is -bitch, see stopnethack-mode 3

      5

      If the channel is -bitch, see stopnethack-mode 3

      If the channel is +bitch, see stopnethack-mode 1

      If the channel is +bitch, see stopnethack-mode 1

      6If the channel is -bitch, see stopnethack-mode 2

      6

      If the channel is -bitch, see stopnethack-mode 2

      If the channel is +bitch, see stopnethack-mode 4

      If the channel is +bitch, see stopnethack-mode 4

      -
      revenge-mode 0
      -

      This settings defines how the bot should punish bad users when +

      revenge-mode 0

      This settings defines how the bot should punish bad users when revenging. There are four possible settings:

      -
      -
      ---- - - - +
      +
      0Deop the user.
      + + + - - + + - - + + - - + +

      0

      Deop the user.

      1Deop the user and give them the +d flag for the channel.

      1

      Deop the user and give them the +d flag for the channel.

      2Deop the user, give them the +d flag for the channel, and kick them.

      2

      Deop the user, give them the +d flag for the channel, and kick them.

      3Deop the user, give them the +d flag for the channel, kick, and ban them.

      3

      Deop the user, give them the +d flag for the channel, kick, and ban them.

      -
      ban-type 3
      -

      This setting defines what type of bans should eggdrop place for +

      ban-type 3

      This setting defines what type of bans should eggdrop place for +k users or when revenge-mode is 3. Available types are:

      -
      ---- - - +
      0 *!user@host
      + + - + - + - + - + - + - + - + - + - +

      0 *!user@host

      1 *!*user@host

      1 *!*user@host

      2 *!*@host

      2 *!*@host

      3 *!*user@*.host

      3 *!*user@*.host

      4 *!*@*.host

      4 *!*@*.host

      5 nick!user@host

      5 nick!user@host

      6 nick!*user@host

      6 nick!*user@host

      7 nick!*@host

      7 nick!*@host

      8 nick!*user@*.host

      8 nick!*user@*.host

      9 nick!*@*.host

      9 nick!*@*.host

      -

      You can also specify types from 10 to 19 which correspond to types +

      You can also specify types from 10 to 19 which correspond to types 0 to 9, but instead of using a * wildcard to replace portions of the host, only numbers in hostnames are replaced with the ‘?’ wildcard. Same is valid for types 20-29, but instead of ‘?’, the ‘*’ wildcard will be used. Types 30-39 set the host to ‘*’.

      -
      ban-time 120
      -
      Set here how long temporary bans will last (in minutes). If you -set this setting to 0, the bot will never remove them.
      -
      exempt-time 60
      -
      Set here how long temporary exempts will last (in minutes). If you set +
      ban-time 120

      Set here how long temporary bans will last (in minutes). If you +set this setting to 0, the bot will never remove them.

      +
      +
      exempt-time 60

      Set here how long temporary exempts will last (in minutes). If you set this setting to 0, the bot will never remove them. The bot will check the exempts every X minutes, but will not remove the exempt if a ban is set on the channel that matches that exempt. Once the ban is removed, then the exempt will be removed the next time the bot checks. Please -note that this is an IRCnet feature.

      -
      invite-time 60
      -
      Set here how long temporary invites will last (in minutes). If you set +note that this is an IRCnet feature.

      +
      +
      invite-time 60

      Set here how long temporary invites will last (in minutes). If you set this setting to 0, the bot will never remove them. The bot will check the invites every X minutes, but will not remove the invite if a channel is set to +i. Once the channel is -i then the invite will be removed the next time the bot checks. Please note that this is an -IRCnet feature.

      -
      aop-delay (minimum:maximum)
      -
      +IRCnet feature.

      +
      +
      aop-delay (minimum:maximum)

      This is used for autoop, autohalfop, autovoice. If an op or voice joins a channel while another op or voice is pending, the bot will attempt to put both modes on one line.

      -
      ---- - - - +
      aop-delay 0No delay is used.
      + + + - - + + - - + +

      aop-delay 0

      No delay is used.

      aop-delay XAn X second delay is used.

      aop-delay X

      An X second delay is used.

      aop-delay X:YA random delay between X and Y is used.

      aop-delay X:Y

      A random delay between X and Y is used.

      -
      -
      need-op { putserv “PRIVMSG #lamest :op me cos i’m lame!” }
      -
      This setting will make the bot run the script enclosed in braces +
      +
      need-op { putserv “PRIVMSG #lamest :op me cos i’m lame!” }

      This setting will make the bot run the script enclosed in braces if it does not have ops. This must be shorter than 120 characters. If you use scripts like getops.tcl or botnetop.tcl, you don’t need -to set this setting.

      -
      need-invite { putserv “PRIVMSG #lamest :let me in!” }
      -
      This setting will make the bot run the script enclosed in braces +to set this setting.

      +
      +
      need-invite { putserv “PRIVMSG #lamest :let me in!” }

      This setting will make the bot run the script enclosed in braces if it needs an invite to the channel. This must be shorter than 120 characters. If you use scripts like getops.tcl or botnetop.tcl, you -don’t need to set this setting.

      -
      need-key { putserv “PRIVMSG #lamest :let me in!” }
      -
      This setting will make the bot run the script enclosed in braces +don’t need to set this setting.

      +
      +
      need-key { putserv “PRIVMSG #lamest :let me in!” }

      This setting will make the bot run the script enclosed in braces if it needs the key to the channel. This must be shorter than 120 characters. If you use scripts like getops.tcl or botnetop.tcl, you -don’t need to set this setting.

      -
      need-unban { putserv “PRIVMSG #lamest :let me in!” }
      -
      This setting will make the bot run the script enclosed in braces +don’t need to set this setting.

      +
      +
      need-unban { putserv “PRIVMSG #lamest :let me in!” }

      This setting will make the bot run the script enclosed in braces if it needs to be unbanned on the channel. This must be shorter than 120 characters. If you use scripts like getops.tcl or botnetop.tcl, -you don’t need to set this setting.

      -
      need-limit { putserv “PRIVMSG #lamest :let me in!” }
      -
      This setting will make the bot run the script enclosed in braces +you don’t need to set this setting.

      +
      +
      need-limit { putserv “PRIVMSG #lamest :let me in!” }

      This setting will make the bot run the script enclosed in braces if it needs the limit to be raised on the channel. This must be shorter than 120 characters. If you use scripts like getops.tcl or -botnetop.tcl, you don’t need to set this setting.

      -
      flood-chan 15:60
      -
      Set here how many channel messages in how many seconds from one +botnetop.tcl, you don’t need to set this setting.

      +
      +
      flood-chan 15:60

      Set here how many channel messages in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables text -flood protection for the channel, where X is an integer >= 0.

      -
      flood-deop 3:10
      -
      Set here how many deops in how many seconds from one host constitutes +flood protection for the channel, where X is an integer >= 0.

      +
      +
      flood-deop 3:10

      Set here how many deops in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables deop flood protection for -the channel, where X is an integer >= 0.

      -
      flood-kick 3:10
      -
      Set here how many kicks in how many seconds from one host constitutes +the channel, where X is an integer >= 0.

      +
      +
      flood-kick 3:10

      Set here how many kicks in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables kick flood protection for -the channel, where X is an integer >= 0.

      -
      flood-join 5:60
      -
      Set here how many joins in how many seconds from one host constitutes +the channel, where X is an integer >= 0.

      +
      +
      flood-join 5:60

      Set here how many joins in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables join flood protection for -the channel, where X is an integer >= 0.

      -
      flood-ctcp 3:60
      -
      Set here how many channel ctcps in how many seconds from one host +the channel, where X is an integer >= 0.

      +
      +
      flood-ctcp 3:60

      Set here how many channel ctcps in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables ctcp flood -protection for the channel, where X is an integer >= 0.

      -
      flood-nick 5:60
      -
      Set here how many nick changes in how many seconds from one host +protection for the channel, where X is an integer >= 0.

      +
      +
      flood-nick 5:60

      Set here how many nick changes in how many seconds from one host constitutes a flood. Setting this to 0, 0:X or X:0 disables nick flood -protection for the channel, where X is an integer >= 0.

      +protection for the channel, where X is an integer >= 0.

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

      There are many different options for channels which you can define. +

      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.

      A complete list of all available channel settings:

      -
      -
      -
      enforcebans
      -
      When a ban is set, kick people who are on the channel and match -the ban?
      -
      dynamicbans
      -
      Only activate bans on the channel when necessary? This keeps the +
      +
      +
      enforcebans

      When a ban is set, kick people who are on the channel and match +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 remembers every ban, but it only activates a ban on the channel -when it sees someone join who matches that ban.

      -
      userbans
      -
      Allow bans to be made by users directly? If turned off, the bot will -require all bans to be made through the bot’s console.
      -
      dynamicexempts
      -
      Only activate exempts on the channel when necessary? This keeps the +when it sees someone join who matches that ban.

      +
      +
      userbans

      Allow bans to be made by users directly? If turned off, the bot will +require all bans to be made through the bot’s console.

      +
      +
      dynamicexempts

      Only activate exempts on the channel when necessary? This keeps the channel’s exempt list from getting excessively long. The bot still remembers every exempt, but it only activates a exempt on the channel when it sees a ban set that matches the exempt. The exempt remains -active on the channel for as long as the ban is still active.

      -
      userexempts
      -
      Allow exempts to be made by users directly? If turned off, the bot will -require all exempts to be made through the bot’s console.
      -
      dynamicinvites
      -
      Only activate invites on the channel when necessary? This keeps the +active on the channel for as long as the ban is still active.

      +
      +
      userexempts

      Allow exempts to be made by users directly? If turned off, the bot will +require all exempts to be made through the bot’s console.

      +
      +
      dynamicinvites

      Only activate invites on the channel when necessary? This keeps the channel’s invite list from getting excessively long. The bot still remembers every invite, but the invites are only activated when the channel is set to invite only and a user joins after requesting an -invite. Once set, the invite remains until the channel goes to -i.

      -
      userinvites
      -
      Allow invites to be made by users directly? If turned off, the bot -will require all invites to be made through the bot’s console.
      -
      autoop
      -
      Op users with the +o flag as soon as they join the channel? -This is insecure and not recommended.
      -
      autohalfop
      -
      Halfop users with the +l flag as soon as they join the channel? -This is insecure and not recommended.
      -
      bitch
      -
      Only let users with the +o flag have op on the channel?
      -
      greet
      -
      Say a user’s info line when they join the channel?
      -
      protectops
      -
      Re-op a user with the +o flag if they get deopped?
      -
      protecthalfops
      -
      Re-halfop a user with the +l flag if they get dehalfopped?
      -
      protectfriends
      -
      Re-op a user with the +f flag if they get deopped?
      -
      statuslog
      -

      Log the channel status line every 5 minutes? This shows the bot’s +invite. Once set, the invite remains until the channel goes to -i.

      +
      +
      userinvites

      Allow invites to be made by users directly? If turned off, the bot +will require all invites to be made through the bot’s console.

      +
      +
      autoop

      Op users with the +o flag as soon as they join the channel? +This is insecure and not recommended.

      +
      +
      autohalfop

      Halfop users with the +l flag as soon as they join the channel? +This is insecure and not recommended.

      +
      +
      bitch

      Only let users with the +o flag have op on the channel?

      +
      +
      greet

      Say a user’s info line when they join the channel?

      +
      +
      protectops

      Re-op a user with the +o flag if they get deopped?

      +
      +
      protecthalfops

      Re-halfop a user with the +l flag if they get dehalfopped?

      +
      +
      protectfriends

      Re-op a user with the +f flag if they get deopped?

      +
      +
      statuslog

      Log the channel status line every 5 minutes? This shows the bot’s status on the channel (op, voice, etc.), the channel’s modes, and the total number of members, ops, voices, regular users, and +b, +e, and +I modes on the channel. A sample status line follows:

      -
      -
      [01:40] @#lamest (+istn) : [m/1 o/1 v/4 n/7 b/1 e/5 I/7]
      -
      -
      revenge
      -
      Remember people who deop/kick/ban the bot, valid ops, or friends -and punish them? Users with the +f flag are exempt from revenge.
      -
      revengebot
      -
      This is similar to to the ‘revenge’ option, but it only triggers -if a bot gets deopped, kicked or banned.
      -
      autovoice
      -
      Voice users with the +v flag when they join the channel?
      -
      secret
      -
      Prevent this channel from being listed on the botnet?
      -
      shared
      -
      Share channel-related user info for this channel?
      -
      cycle
      -
      Cycle the channel when it has no ops?
      -
      dontkickops
      -
      Do you want the bot not to be able to kick users who have the +o +
      +

      [01:40] @#lamest (+istn) : [m/1 o/1 v/4 n/7 b/1 e/5 I/7]

      +
      +
      +
      revenge

      Remember people who deop/kick/ban the bot, valid ops, or friends +and punish them? Users with the +f flag are exempt from revenge.

      +
      +
      revengebot

      This is similar to to the ‘revenge’ option, but it only triggers +if a bot gets deopped, kicked or banned.

      +
      +
      autovoice

      Voice users with the +v flag when they join the channel?

      +
      +
      secret

      Prevent this channel from being listed on the botnet?

      +
      +
      shared

      Share channel-related user info for this channel?

      +
      +
      cycle

      Cycle the channel when it has no ops?

      +
      +
      dontkickops

      Do you want the bot not to be able to kick users who have the +o flag, letting them kick-flood for instance to protect the channel -against clone attacks?

      -
      inactive
      -
      This prevents the bot from joining the channel (or makes it leave the +against clone attacks?

      +
      +
      inactive

      This prevents the bot from joining the channel (or makes it leave the channel if it is already there). It can be useful to make the bot leave a channel without losing its settings, channel-specific user flags, -channel bans, and without affecting sharing.

      -
      seen
      -
      Respond to seen requests in the channel? The seen module must be -loaded for this to work.
      -
      nodesynch
      -
      Allow non-ops to perform channel modes? This can stop the bot from +channel bans, and without affecting sharing.

      +
      +
      seen

      Respond to seen requests in the channel? The seen module must be +loaded for this to work.

      +
      +
      nodesynch

      Allow non-ops to perform channel modes? This can stop the bot from fighting with services such as ChanServ, or from kicking IRCops when -setting channel modes without having ops.

      -
      static
      -
      Allow only permanent owners to remove the channel?
      +setting channel modes without having ops.

      +
      +
      static

      Allow only permanent owners to remove the channel?

      +
      @@ -475,9 +450,8 @@

      Search

      set default-ban-time 120

      set default-exempt-time 60

      set default-invite-time 60

      -
      -
      set default-chanset {
      -
      +
      +
      set default-chanset {
      -autoop
      -autovoice
      -bitch
      @@ -510,11 +484,12 @@

      Search

      }

      -

      Copyright (C) 2000 - 2022 Eggheads Development Team

      +

      Copyright (C) 2000 - 2023 Eggheads Development Team

      - + +
      @@ -539,9 +514,9 @@

      Search

      diff --git a/doc/html/modules/mod/compress.html b/doc/html/modules/mod/compress.html index 55b0f5e18..c5b4b2d30 100644 --- a/doc/html/modules/mod/compress.html +++ b/doc/html/modules/mod/compress.html @@ -1,28 +1,23 @@ - + - + - - + + + Compress Module — Eggdrop 1.9.4 documentation - - - - - - - + + + + +
      - -
      -

      Partyline usage

      -
      -

      .files

      + +
      +

      Partyline usage

      +
      +

      .files

      -
      Moves you into the file transfer sub-system, if it has been enabled on this +

      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 -transfers to download and upload.

      -
      -
      -

      .cancel <file> [file] …

      +transfers to download and upload.

      +
      + +
      +

      .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>

      +

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

      +
      + +
      +

      .cd <directory>

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

      .cp <source> <dst>

      +

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

      +
      + +
      +

      .cp <source> <dst>

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

      .desc <file> <description>

      +

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

      +
      + +
      +

      .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. @@ -198,20 +199,22 @@

      .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

      +

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

      +
      + +
      +

      .stats

      -
      Clears a users upload & download statistics.
      -
      -
      -

      .get <filename> [nickname]

      +

      Clears a users upload & download statistics.

      +
      + +
      +

      .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 @@ -226,15 +229,16 @@

      .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>

      +

      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>

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

      .ln <bot:filepath> <localfile> -

      .ls [filemask]

      +

      +
      +

      .ls [filemask]

      -
      Displays the files in the current directory. Subdirectories +

      Displays the files in the current directory. Subdirectories are shown with “<DIR>” next to them, and other files will display their size (typically in kilobytes), who uploaded them (and when), and how many times each file has been downloaded. If a description of the file exists, it is displayed below the filename. You can -restrict the file listing by specifying a mask, just like in unix.

      -
      -
      -

      .mkdir <dir> [flags [channel]]

      +restrict the file listing by specifying a mask, just like in unix.

      +
      + +
      +

      .mkdir <dir> [flags [channel]]

      -
      Creates a subdirectory from this one, with the given name. If +

      Creates a subdirectory from this one, with the given name. If flags are specified, then those flags are required to enter or even see the directory. You can even specify a channel that the flags are matched against. You can use the %b’mkdir’%b command again -to alter or remove those flags.

      - -
      -

      .mv <source> <dest>

      +to alter or remove those flags.

      +
      +
      +
      +

      .mv <source> <dest>

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

      .pending

      +

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

      +
      +
      +
      +

      .pending

      -
      Gives you a listing of every file you’ve requested which is +

      Gives you a listing of every file you’ve requested which is still waiting, queued, or in the process of transferring. It shows you the nickname on IRC that the file is being sent to, and, if the transfer is in progress, tells you how far -along the transfer is.

      - -
      -

      .pwd

      +along the transfer is.

      +
      +
      +
      +

      .pwd

      -
      Tells you what your current directory is.
      - -
      -

      .quit

      +

      Tells you what your current directory is.

      +
      +
      +
      +

      .quit

      -
      Exits the file system.
      - -
      -

      rm <file> [files] …

      +

      Exits the file system.

      +
      +
      +
      +

      rm <file> [files] …

      -
      Erase a file for good.
      - -
      -

      .rmdir <dir>

      +

      Erase a file for good.

      +
      +
      +
      +

      .rmdir <dir>

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

      .share <file> [files] …

      +

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

      +
      +
      +
      +

      .share <file> [files] …

      -
      Marks a file as shared. This means that other bots can get +

      Marks a file as shared. This means that other bots can get the file remotely for users on their file systems. By default, -files are marked as unshared.

      - -
      -

      .optimize

      +files are marked as unshared.

      +
      +
      +
      +

      .optimize

      -
      Cleans up the current directory’s database. If you have a large +

      Cleans up the current directory’s database. If you have a large directory with many files you may want to use this command if you experience slow-downs/delays over time. Normally, the db -should clean up itself though.

      - -
      -

      .unhide

      +should clean up itself though.

      +
      +
      +
      +

      .unhide

      -
      Makes a file be not hidden any more.
      - -
      -

      .unshare <file> [file] …

      +

      Makes a file be not hidden any more.

      +
      +
      +
      +

      .unshare <file> [file] …

      -
      Removes the shared tag from a file.
      - -
      -

      .filesys module

      +

      Removes the shared tag from a file.

      +
      +
      +
      +

      .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.

      The following commands are provided by the filesys module:

      -
      -
      For filesystem users:
      -
      files
      +
      +
      For filesystem users:

      files

      +
      -

      Copyright (C) 2000 - 2022 Eggheads Development Team

      - - - +

      Copyright (C) 2000 - 2023 Eggheads Development Team

      +
      + + +
      @@ -364,9 +381,9 @@

      .filesys module
      diff --git a/doc/html/modules/mod/ident.html b/doc/html/modules/mod/ident.html index 0fb9cf6a6..59c0266a9 100644 --- a/doc/html/modules/mod/ident.html +++ b/doc/html/modules/mod/ident.html @@ -1,28 +1,23 @@ - + - + - - + + + Ident Module — Eggdrop 1.9.4 documentation - - - - - - - + + + + + diff --git a/doc/html/modules/twitch.html b/doc/html/modules/twitch.html index f8dfb3c13..bc21cddcf 100644 --- a/doc/html/modules/twitch.html +++ b/doc/html/modules/twitch.html @@ -163,7 +163,7 @@

      Partyline commandsSearch

      loadmodule uptime
       
      -

      Copyright (C) 2001 - 2022 Eggheads Development Team

      +

      Copyright (C) 2001 - 2023 Eggheads Development Team

      diff --git a/doc/html/modules/woobie.html b/doc/html/modules/woobie.html index 1076d3c2b..02f5b6c8b 100644 --- a/doc/html/modules/woobie.html +++ b/doc/html/modules/woobie.html @@ -125,7 +125,7 @@

      Search

      loadmodule woobie
       
      -

      Copyright (C) 2000 - 2022 Eggheads Development Team

      +

      Copyright (C) 2000 - 2023 Eggheads Development Team

      diff --git a/doc/html/modules/writing.html b/doc/html/modules/writing.html index 4cd607b43..8eb8cb6ad 100644 --- a/doc/html/modules/writing.html +++ b/doc/html/modules/writing.html @@ -1,34 +1,29 @@ - + - + - - - Writing an Eggdrop Module — Eggdrop 1.9.4 documentation - - - - - - - + + + + How to Write an Eggdrop Module — Eggdrop 1.9.4 documentation + + + + + - +
      @@ -417,7 +413,7 @@

      What to do with a module? previous | - next
      @@ -427,9 +423,9 @@

      What to do with a module?

      diff --git a/doc/html/objects.inv b/doc/html/objects.inv index 3eeec3c4f2f64ba7cdec65c523bdfc5395e4a612..7703dd2ccaddb86169d3a44b8031aed2182828a4 100644 GIT binary patch delta 1288 zcmV+j1^4==3iAq(e1A=E+c*%t`&ST1kM$bu0()2#1@ego+Y~{aqK9Hp&=hS8kx7B1 z;`rb1@SBuI&R!C0-n=K08a@u`Mh<30?O&oz^LHZ|S$-fihyU1{Lq{%M#_ev`DA_MO z-0>alrYslstShNnu_G~Y*lrh8Ye=@Fj&68oX$RR19oH-PzkhPDBVW8DmoE3g!HZ2N zkK0!7=eaQ>(yt;TD6l;hf_HjeA!bB{>&S=-^3W@;&nbkAq!1ZNL1@|Wa{?|Q^L>7# z8`huU0-A_V*N>6ah%+MwFmi6bts`aI0)9F}3ki{W7xDvr$3-g|{#x^6)ECFS{kdox zF3kLE92{SA?|*W`E3$s5zCt?G>3c#2kv$hg%Rw{je!qWYRK{ zuvw`ydlSI)C14@LcQ{Z3+r}7G69)~tE5o`aY>5LEO@AttO!x%btLgY>@@d=Ao&HRI zg$?-c0^WxdP=8uRz%Py;Lnx&<)>g1?Xn0dD?iefSnk2@tHT$#}nKP=i3aBbB4`?eD zOth7vkTF~d8vJJ>6~J2V3SI$X0b5L*5|gTJv^G)9F6T5VJDr#*W}9J- zrP5v}=6{O#=)6$2*|EuvEp=8S+HGaFBX6A}N82q;7xC9QdTGC7^PTwToJcm;+FD1O zewH5mpmKu(7t-+A2{_Qxzqvd_px-<<+mCY!9`zEBSO47HeZ(|0xAu=KSj_X+HVb8| z7p~^{7L5un6VupJHCu-c3<@p}5ip7hy`3LM#DBfaQ_RMcz~9*HhWBVt@tKIm(3|!! zJ0Fk6lgniy8b>KN?W~4Jy~aYlbp3Gi~`i#?@DmLnYeJqxt!yoC6FH-5FV@$;lBP`3m zD1Z4GUMhOWEXzKZI!;Z+Zkc7dS0#>et0D*bxXjI9;IaXSBv_-;Ml;p+mGPkop~ylx z6&12}@I=+{UY`@ScsiR7@bT_!n5=EQ5c3nmg*-MI7`dXlW#jtIB+bpx<9ZH?#bKP> zk3RJ{InQ+Zj7mg9dm`w@^^H$o*PzM<7=P!9NRef;(coV*TaEpemDv;qgK`Ut0d8$F zzU!on$w8RvOVvndjr8gl!}553V* zKpMdfBH`lkmh5uuhVWI`kgu(<0}3Kc)(1$A*4^T@%?lqn4q(fv85Bom5s_NsE`LM= zz3pHAno?~v9Q}_LANpP@6Df+l{E2XEIQ0uQqhj?`nG@6$GSLKuqiN5<-ymdHi6{E# zU@OAGP3_O}t`jnxRkzTuBkY95vS;el+opc?h3b9&K;<=ODl@qRrNw??-Y6^*rTD8^ z>S2S(1SG5iJlQ6YtcQ&@E$mbnR(}%duwldo+-}->@r`QPGe&XouvwZHDj3|6p4vXW z$8Fr@8`GaAjaI>Le{3-vf`6Qhl^shU4sc2#Lvi8IoVX0T*Y51yb8&3DhEdh%|9g#n ya1{ra888pHpMgSdYEa)Q+8UtOjZNrUeisMBM5F9%F2chy5Z-8X{sT1dCjoH?WO&d3 delta 1211 zcmV;s1VsDu3a1K?e1F@H+cpq=_g4r=ALANLfj$&LfW4xNW`jlSAP+?m&=hSGE0Y3A z+3UaW@G4RoI(^y8oH<7%HFG#3TRE5&u|FGa+CN)Ko8@l}8NEgM^XK6>-4jt1g_RWdB_7 zmI+gTjDzDto_}0!c*Lk5sxOlcb^5*`qLDoljh2I=taPl|{nBD{&WOxrpVxVn|Q6+KEpt~}(TS7}5iGOHQsf>h=&|YoFJ~bbA9og$o z%|D?5|6RcIkOJy2%Lw?x@oNaB6xYfH?S_`M`Qc8noUWV1ICFDIhcR*{l~w>n#f=Nv zNd+6_QY>cnhDnv)S2`c&aW##?17{A1d0kDZ@WPoBVxCu3$~|%Bh=}>sg+_0jI^)y_ zs~XWG3x9{47-Eeay)t)7#1w1v+%u<+IWxVQ$mocrA5J>8N)Jt3v~Y$CX;^gw4)pXd zE)Nmtx3BH)LruY>UgG8U@B7COn1*K7vvCEBdH&jFp=@5 zxI9F_C?fQ(zKn=_nN7^bl)#i|wc$M)RD33)F@N-iAFKQEXuNJ*CZchca?7h49`zdE zeda{tthkw6c@rqGLmu4SrK>K++C=ZCu{zezn};`c?2V2B(gUm`OJk~P!OTAH0v>1PG@&EFTCWqfE^=dPz>2cL`sdv5Dj$RpZ=Ir zZ8Ti7FBTvAUMdqQik^N)I5wQ_W}8v4dZNq)Y6{tCg2FX$U|>fOvZurneR7Fp;eT)) z+duP99A{_q9c$6nisEJ!}z~ zfP_N*@DZ`$eR_^-+~rTU zKTn#Rf^UE9FdTxvoDs{XgFqbMQZzx9;=*ANa2dAO9_`23;>^3264mPe` + - + - - + + Search — Eggdrop 1.9.4 documentation - - + + - - - - - - + + + + + - - - +
      @@ -260,9 +254,9 @@

      Writing an Eggdrop Script

      @@ -270,4 +264,4 @@

      Writing an Eggdrop Script + - + - - + + + Common First Steps — Eggdrop 1.9.4 documentation - - - - - - - + + + + + @@ -309,9 +303,9 @@

      Setting up SASL authentication
      diff --git a/doc/html/tutorials/module.html b/doc/html/tutorials/module.html index b750801ea..53d400935 100644 --- a/doc/html/tutorials/module.html +++ b/doc/html/tutorials/module.html @@ -1,28 +1,23 @@ - + - + - - - Writing an Eggdrop Module — Eggdrop 1.9.4 documentation - - - - - - - + + + + Writing a Basic Eggdrop Module — Eggdrop 1.9.4 documentation + + + + +