+++ /dev/null
-diff -burN eggdrop1.6.15/doc/USERS eggdrop1.6.15-multilevel_sharing/doc/USERS
---- eggdrop1.6.15/doc/USERS Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/doc/USERS Fri May 9 18:44:33 2003
-@@ -75,6 +75,11 @@
-
- u (unshared) user record is not sent to other bots.
-
-+ s (protected) is working similar like u flag, but changes can be made
-+ only from bot that is aggressively sharing with us (Hub).
-+ User cannot be changed by bot that is connected below
-+ this bot. (This flag can be useful in multilevel sharing)
-+
- h (highlight) use bold text in help/text files.
-
- All global flags other then u, h, b, c, x, j, and p are also
-diff -burN eggdrop1.6.15/doc/tcl-commands.doc eggdrop1.6.15-multilevel_sharing/doc/tcl-commands.doc
---- eggdrop1.6.15/doc/tcl-commands.doc Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/doc/tcl-commands.doc Fri May 9 18:44:33 2003
-@@ -1245,6 +1245,17 @@
- Module: filesys
-
-
-+
-+***### SHARE MODULE COMMANDS ###***
-+
-+ noshare <command> [<arg1> <arg2> ...]
-+ Description: executes command with setting noshare = 1 in code,
-+ that means, if you i.e. do chattr using this command,
-+ bot will make changes on his userlist, but won't send changes
-+ to other bots. This is useful in some situations.
-+ Returns: whatever is returned by <command>
-+ Module: share
-+
- *** MISCELLANEOUS COMMANDS ***
-
- bind <type> <flags> <keyword/mask> [proc-name]
-diff -burN eggdrop1.6.15/eggdrop.conf eggdrop1.6.15-multilevel_sharing/eggdrop.conf
---- eggdrop1.6.15/eggdrop.conf Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/eggdrop.conf Fri May 9 18:44:33 2003
-@@ -1139,11 +1139,21 @@
- # changes from other bots should be ignored?
- #set private-globals "mnot"
-
-+# When sharing user lists, which channel flags changes from other bots
-+# should be ignored?
-+#set private-chanflags "mn"
-+
- # When sharing user lists, don't accept ANY userfile changes from other
- # bots? Paranoid people should use this feature on their hub bot. This
- # will force all userlist changes to be made via the hub.
- #set private-user 0
-
-+# When you have multilevel botnet, this option permits hub, to make changes,
-+# even when private-global, private-chanflags and/or private-user are set.
-+# NOTE: this option doesn't permit hub to force flags filtered by
-+# private-globals
-+#set permit-hub 1
-+
- # This setting makes the bot discard its own bot records in favor of
- # the ones sent by the hub.
- # NOTE: No passwords or botflags are shared, only ports and
-diff -burN eggdrop1.6.15/help/cmds2.help eggdrop1.6.15-multilevel_sharing/help/cmds2.help
---- eggdrop1.6.15/help/cmds2.help Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/help/cmds2.help Fri May 9 18:44:33 2003
-@@ -336,6 +336,7 @@
- p party-line (user has access to the partyline)
- q global quiet (user does not get voice on +autovoice channels.)
- r global dehalfop (user cannot gain halfops on any of the bot's channels)
-+ s protected (when sharing changes can be made only by hub)
- t botnet master (user has access to all features dealing with the botnet.)
- u unshared (user record is not sent to other bots.)
- v global voice (user get +v automatically on +autovoice channels)
-diff -burN eggdrop1.6.15/src/cmds.c eggdrop1.6.15-multilevel_sharing/src/cmds.c
---- eggdrop1.6.15/src/cmds.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/cmds.c Fri May 9 18:46:00 2003
-@@ -1556,8 +1556,8 @@
- mns.chan &= ~(BOT_SHARE);
- }
- if (!glob_owner(user)) {
-- pls.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED);
-- mns.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED);
-+ pls.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED | USER_PROTECTED);
-+ mns.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED | USER_PROTECTED);
-
- if (chan) {
- pls.chan &= ~USER_OWNER;
-diff -burN eggdrop1.6.15/src/flags.h eggdrop1.6.15-multilevel_sharing/src/flags.h
---- eggdrop1.6.15/src/flags.h Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/flags.h Fri May 9 18:48:57 2003
-@@ -44,8 +44,8 @@
-
- /*
- * userflags:
-- * abcdefgh?jklmnopqr?tuvwxyz + user defined A-Z
-- * unused letters: is
-+ * abcdefgh?jklmnopqrstuvwxyz + user defined A-Z
-+ * unused letters: i
- *
- * botflags:
- * 0123456789ab????ghi??l???p?rs???????
-@@ -55,7 +55,7 @@
- * a??defg???klmno?qr??uv??yz + user defined A-Z
- * unused letters: bchijpstwx
- */
--#define USER_VALID 0x03fbfeff /* Sum of all USER_ flags */
-+#define USER_VALID 0x03fffeff /* Sum of all USER_ flags */
- #define CHAN_VALID 0x03777c79 /* Sum of all CHAN_ flags */
- #define BOT_VALID 0x7fe689C1 /* Sum of all BOT_ flags */
-
-@@ -78,7 +78,7 @@
- #define USER_PARTY 0x00008000 /* p user has party line access */
- #define USER_QUIET 0x00010000 /* q user is global de-voice */
- #define USER_DEHALFOP 0x00020000 /* r user is global de-halfop */
--#define USER_S 0x00040000 /* s unused */
-+#define USER_PROTECTED 0x00040000 /* s user is protected (cannot be removed/changed by downlinks */
- #define USER_BOTMAST 0x00080000 /* t user is botnet master */
- #define USER_UNSHARED 0x00100000 /* u not shared with sharebots */
- #define USER_VOICE 0x00200000 /* v user is +v on all channels */
-@@ -166,6 +166,7 @@
- #define glob_hilite(x) ((x).global & USER_HIGHLITE)
- #define chan_exempt(x) ((x).chan & USER_EXEMPT)
- #define glob_exempt(x) ((x).global & USER_EXEMPT)
-+#define glob_protected(x) ((x).global & USER_PROTECTED)
-
- #define bot_global(x) ((x).bot & BOT_GLOBAL)
- #define bot_chan(x) ((x).chan & BOT_AGGRESSIVE)
-diff -burN eggdrop1.6.15/src/mod/share.mod/Makefile eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/Makefile
---- eggdrop1.6.15/src/mod/share.mod/Makefile Mon May 5 00:05:33 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/Makefile Fri May 9 18:49:41 2003
-@@ -20,7 +20,7 @@
- mv share.o ../
-
- ../../../share.$(MOD_EXT): ../share.o
-- $(LD) -o ../../../share.$(MOD_EXT) ../share.o
-+ $(LD) -o ../../../share.$(MOD_EXT) ../share.o ${XLIBS}
- $(STRIP) ../../../share.$(MOD_EXT)
-
- depend:
-diff -burN eggdrop1.6.15/src/mod/share.mod/share.c eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/share.c
---- eggdrop1.6.15/src/mod/share.mod/share.c Mon May 5 00:05:33 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/share.c Fri May 9 19:10:34 2003
-@@ -50,11 +50,14 @@
- static int private_global = 0;
- static int private_user = 0;
- static char private_globals[50];
-+static char private_chanflags[50];
- static int allow_resync = 0;
- static struct flag_record fr = { 0, 0, 0, 0, 0, 0 };
- static int resync_time = 900;
- static int overr_local_bots = 0; /* Override local bots? */
-
-+static int permit_hub = 0; /* Permit hub to do changes even, when we use private_*, */
-+ /* but not private_globals (this have a reason) */
-
- struct delay_mode {
- struct delay_mode *next;
-@@ -93,6 +96,7 @@
- static void q_resync(char *, struct chanset_t *);
- static void cancel_user_xfer(int, void *);
- static int private_globals_bitmask();
-+static int private_chanflags_bitmask();
-
- #include "share.h"
-
-@@ -307,7 +311,7 @@
- char *hand;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- u = get_user_by_handle(userlist, hand);
- if (u && !(u->flags & USER_UNSHARED)) {
-@@ -329,26 +333,33 @@
- int bfl, ofl;
- module_entry *me;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- u = get_user_by_handle(userlist, hand);
-- if (u && !(u->flags & USER_UNSHARED)) {
-+ if (u && !(u->flags & USER_UNSHARED) && !IS_USER_PROTECTED(u, idx)) {
- atr = newsplit(&par);
- cst = findchan_by_dname(par);
- if (!par[0] || (cst && channel_shared(cst))) {
-- if (!(dcc[idx].status & STAT_GETTING) && (cst || !private_global))
-- shareout_but(cst, idx, "a %s %s %s\n", hand, atr, par);
- noshare = 1;
- if (par[0] && cst) {
-+ int pchbm = 0;
-+ if (!PERMIT_HUB(idx))
-+ pchbm = private_chanflags_bitmask();
- fr.match = (FR_CHAN | FR_BOT);
-+ /* bot's sharing flags */
- get_user_flagrec(dcc[idx].user, &fr, par);
- if (bot_chan(fr) || bot_global(fr)) {
- fr.match = FR_CHAN;
- fr2.match = FR_CHAN;
- break_down_flags(atr, &fr, 0);
- get_user_flagrec(u, &fr2, par);
-- fr.chan = (fr2.chan & BOT_AGGRESSIVE) |
-- (fr.chan & ~BOT_AGGRESSIVE);
-+ fr.chan = (fr2.chan & BOT_AGGRESSIVE) | (fr.chan & ~BOT_AGGRESSIVE);
-+ /* Checking for forced flags */
-+ if ( (pchbm & USER_OWNER) && chan_owner(fr) && !chan_owner(fr2))
-+ fr.chan &= ~(USER_MASTER | USER_OP);
-+ else if ( (pchbm & USER_MASTER) && chan_master(fr) && !chan_master(fr2))
-+ fr.chan &= ~USER_OP;
-+ fr.chan = (fr2.chan & pchbm) | (fr.chan & ~pchbm);
- set_user_flagrec(u, &fr, par);
- check_dcc_chanattrs(u, par, fr.chan, fr2.chan);
- noshare = 0;
-@@ -365,7 +376,7 @@
- putlog(LOG_CMDS, "*",
- "Rejected flags for unshared channel %s from %s",
- par, dcc[idx].nick);
-- } else if (!private_global) {
-+ } else if (!private_global || PERMIT_HUB(idx)) {
- int pgbm = private_globals_bitmask();
-
- /* Don't let bot flags be altered */
-@@ -384,15 +395,17 @@
- if (!(dcc[idx].status & STAT_GETTING))
- putlog(LOG_CMDS, "*", "%s: chattr %s %s", dcc[idx].nick, hand, s);
- if ((me = module_find("irc", 0, 0))) {
-+ struct chanset_t *tmpcst;
- Function *func = me->funcs;
--
-- for (cst = chanset; cst; cst = cst->next)
-- (func[IRC_RECHECK_CHANNEL]) (cst, 0);
-+ for (tmpcst = chanset; tmpcst; tmpcst = tmpcst->next)
-+ (func[IRC_RECHECK_CHANNEL]) (tmpcst, 0);
- }
- } else
- putlog(LOG_CMDS, "*", "Rejected global flags for %s from %s",
- hand, dcc[idx].nick);
- noshare = 0;
-+ if (!(dcc[idx].status & STAT_GETTING) && (cst || !private_global || PERMIT_HUB(idx)))
-+ shareout_but(cst, idx, "a %s %s %s\n", hand, s, par);
- }
- }
- }
-@@ -404,7 +417,7 @@
- struct chanset_t *chan;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- user = newsplit(&par);
- if ((u = get_user_by_handle(userlist, user))) {
- chan = findchan_by_dname(par);
-@@ -433,7 +446,7 @@
- struct chanset_t *chan;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- user = newsplit(&par);
- if ((u = get_user_by_handle(userlist, user))) {
- chan = findchan_by_dname(par);
-@@ -459,13 +472,13 @@
- char *nick, *host, *pass, s[100];
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- nick = newsplit(&par);
- host = newsplit(&par);
- pass = newsplit(&par);
-
- if (!(u = get_user_by_handle(userlist, nick)) ||
-- !(u->flags & USER_UNSHARED)) {
-+ !((u->flags & USER_UNSHARED) || IS_USER_PROTECTED(u, idx))) {
- fr.global = 0;
-
- fr.match = FR_GLOBAL;
-@@ -510,9 +523,9 @@
- struct userrec *u;
-
- /* If user is a share bot, ignore command */
-- if ((dcc[idx].status & STAT_SHARE) && !private_user &&
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx)) &&
- (u = get_user_by_handle(userlist, par)) &&
-- !(u->flags & USER_UNSHARED) &&
-+ !(u->flags & USER_UNSHARED) && !IS_USER_PROTECTED(u, idx) &&
- !((u->flags & USER_BOT) && (bot_flags(u) & BOT_SHARE))) {
- noshare = 1;
- if (deluser(par)) {
-@@ -528,10 +541,10 @@
- char *hand;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- if ((u = get_user_by_handle(userlist, hand)) &&
-- !(u->flags & USER_UNSHARED)) {
-+ !(u->flags & USER_UNSHARED) && !IS_USER_PROTECTED(u, idx)) {
- shareout_but(NULL, idx, "+h %s %s\n", hand, par);
- set_user(&USERENTRY_HOSTS, u, par);
- putlog(LOG_CMDS, "*", "%s: +host %s %s", dcc[idx].nick, hand, par);
-@@ -544,10 +557,10 @@
- char *hand, p[32];
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- if (!(u = get_user_by_handle(userlist, hand)) ||
-- !(u->flags & USER_UNSHARED)) {
-+ !((u->flags & USER_UNSHARED) || IS_USER_PROTECTED(u, idx))) {
- if (!(dcc[idx].status & STAT_GETTING))
- shareout_but(NULL, idx, "+bh %s %s\n", hand, par);
- /* Add bot to userlist if not there */
-@@ -570,10 +583,10 @@
- char *hand;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- if ((u = get_user_by_handle(userlist, hand)) &&
-- !(u->flags & USER_UNSHARED)) {
-+ !(u->flags & USER_UNSHARED) && !IS_USER_PROTECTED(u, idx)) {
- shareout_but(NULL, idx, "-h %s %s\n", hand, par);
- noshare = 1;
- delhost_by_handle(hand, par);
-@@ -590,11 +603,11 @@
- struct user_entry_type *uet;
- struct user_entry *e;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- key = newsplit(&par);
- hand = newsplit(&par);
- if (!(u = get_user_by_handle(userlist, hand)) ||
-- !(u->flags & USER_UNSHARED)) {
-+ !((u->flags & USER_UNSHARED) || IS_USER_PROTECTED(u,idx))) {
- if (!(uet = find_entry_type(key)))
- /* If it's not a supported type, forget it */
- debug2("Ignore ch %s from %s (unknown type)", key, dcc[idx].nick);
-@@ -638,10 +651,10 @@
- struct chanset_t *cst;
- struct userrec *u;
-
-- if ((dcc[idx].status & STAT_SHARE) && !private_user) {
-+ if ((dcc[idx].status & STAT_SHARE) && (!private_user || PERMIT_HUB(idx))) {
- hand = newsplit(&par);
- if ((u = get_user_by_handle(userlist, hand)) &&
-- !(u->flags & USER_UNSHARED) && share_greet) {
-+ !(u->flags & USER_UNSHARED) && !IS_USER_PROTECTED(u, idx) && share_greet) {
- chan = newsplit(&par);
- cst = findchan_by_dname(chan);
- fr.match = (FR_CHAN | FR_BOT);
-@@ -2033,11 +2046,13 @@
- {"private-global", &private_global},
- {"private-user", &private_user},
- {"override-bots", &overr_local_bots},
-+ {"permit-hub", &permit_hub},
- {NULL, NULL}
- };
-
- static tcl_strings my_strings[] = {
- {"private-globals", private_globals, 50, 0},
-+ {"private-chanflags", private_chanflags, 50, 0},
- {NULL, NULL, 0, 0}
- };
-
-@@ -2056,6 +2071,39 @@
- {NULL, NULL, NULL, NULL}
- };
-
-+static int tcl_noshare STDVAR
-+{
-+ int res;
-+ char *x;
-+
-+ if (argc < 2) {
-+ Tcl_AppendResult(irp, "wrong # args: should be \"",
-+ argv[0], " arg ?arg ...?\"", NULL);
-+ return TCL_ERROR;
-+ }
-+
-+ Context;
-+
-+ noshare = 1;
-+
-+ x = Tcl_Merge(argc - 1, argv + 1);
-+ res = Tcl_Eval(irp, x);
-+ Tcl_Free((char *) x);
-+
-+ noshare = 0;
-+
-+ Context;
-+ return res;
-+}
-+
-+
-+static tcl_cmds my_tclcmds[] =
-+{
-+ {"noshare", tcl_noshare},
-+ {NULL, NULL}
-+};
-+
-+
- static char *share_close()
- {
- int i;
-@@ -2088,6 +2136,7 @@
- delay_free_mem();
- rem_tcl_ints(my_ints);
- rem_tcl_strings(my_strings);
-+ rem_tcl_commands(my_tclcmds);
- rem_builtins(H_dcc, my_cmds);
- rem_help_reference("share.help");
- return NULL;
-@@ -2207,6 +2256,7 @@
- DCC_BOT.kill = cancel_user_xfer;
- add_tcl_ints(my_ints);
- add_tcl_strings(my_strings);
-+ add_tcl_commands(my_tclcmds);
- add_builtins(H_dcc, my_cmds);
- uff_init();
- uff_addtable(internal_uff_table);
-@@ -2220,3 +2270,11 @@
- break_down_flags(private_globals, &fr, 0);
- return fr.global;
- }
-+
-+int private_chanflags_bitmask()
-+{
-+ struct flag_record fr = {FR_CHAN, 0, 0, 0, 0, 0};
-+
-+ break_down_flags(private_chanflags, &fr, 0);
-+ return fr.chan;
-+}
-diff -burN eggdrop1.6.15/src/mod/share.mod/share.h eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/share.h
---- eggdrop1.6.15/src/mod/share.mod/share.h Mon May 5 00:05:33 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/mod/share.mod/share.h Fri May 9 19:11:25 2003
-@@ -52,6 +52,11 @@
- * `priority'. */
- } uff_table_t;
-
-+/* Do we allow hub to change user value <TaKeDa> */
-+#define PERMIT_HUB(x) (permit_hub && (dcc[x].status & STAT_AGGRESSIVE))
-+/* Is user protected and if he is do we allow changes? <TaKeDa> */
-+#define IS_USER_PROTECTED(user,idx) (!(dcc[idx].status & STAT_AGGRESSIVE) && (user->flags & USER_PROTECTED))
-+
- #ifndef MAKING_SHARE
- /* 4 - 7 */
- #define finish_share ((void (*) (int))share_funcs[4])
-diff -burN eggdrop1.6.15/src/patch.h eggdrop1.6.15-multilevel_sharing/src/patch.h
---- eggdrop1.6.15/src/patch.h Mon May 5 00:08:01 2003
-+++ eggdrop1.6.15-multilevel_sharing/src/patch.h Fri May 9 19:11:50 2003
-@@ -36,7 +36,7 @@
- *
- *
- */
--/* PATCH GOES HERE */
-+patch("multilevel_sharing");
- /*
- *
- *
+++ /dev/null
-diff -urN eggdrop1.6.15/src/chan.h eggdrop1.6.15-topicprot/src/chan.h
---- eggdrop1.6.15/src/chan.h Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/chan.h Wed May 7 10:51:30 2003
-@@ -185,6 +185,7 @@
- int mode_mns_prot; /* modes to reject */
- int limit_prot; /* desired limit */
- char key_prot[121]; /* desired password */
-+ char topic_prot[501]; /* desired topic */
- char pls[21]; /* positive mode changes */
- char mns[21]; /* negative mode changes */
- char *key; /* new key to set */
-diff -urN eggdrop1.6.15/src/chanprog.c eggdrop1.6.15-topicprot/src/chanprog.c
---- eggdrop1.6.15/src/chanprog.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/chanprog.c Wed May 7 10:53:11 2003
-@@ -680,3 +680,23 @@
- pa = pb;
- }
- }
-+
-+/* If we have a protected topic and the bot is opped, halfoped,
-+ * or the channel is -t, change the topic. (Sup 11May2001)
-+ */
-+void check_topic(struct chanset_t *chan)
-+{
-+ memberlist *m = NULL;
-+
-+ if (chan->topic_prot[0]) {
-+ m = ismember(chan, botname);
-+ if (!m)
-+ return;
-+ if (chan->channel.topic) {
-+ if (!egg_strcasecmp(chan->topic_prot, chan->channel.topic))
-+ return;
-+ }
-+ if (chan_hasop(m) || !channel_optopic(chan) || chan_hashalfop(m))
-+ dprintf(DP_SERVER, "TOPIC %s :%s\n", chan->name, chan->topic_prot);
-+ }
-+}
-diff -urN eggdrop1.6.15/src/mod/channels.mod/channels.c eggdrop1.6.15-topicprot/src/mod/channels.mod/channels.c
---- eggdrop1.6.15/src/mod/channels.mod/channels.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/channels.mod/channels.c Wed May 7 11:07:16 2003
-@@ -364,6 +364,7 @@
- FILE *f;
- char s[121], w[1024], w2[1024], name[163];
- char need1[242], need2[242], need3[242], need4[242], need5[242];
-+ char topic[1002];
- struct chanset_t *chan;
- struct udef_struct *ul;
-
-@@ -384,13 +385,14 @@
- convert_element(chan->dname, name);
- get_mode_protect(chan, w);
- convert_element(w, w2);
-+ convert_element(chan->topic_prot, topic);
- convert_element(chan->need_op, need1);
- convert_element(chan->need_invite, need2);
- convert_element(chan->need_key, need3);
- convert_element(chan->need_unban, need4);
- convert_element(chan->need_limit, need5);
- fprintf(f,
-- "channel %s %s%schanmode %s idle-kick %d stopnethack-mode %d \
-+ "channel %s %s%schanmode %s topic %s idle-kick %d stopnethack-mode %d \
- revenge-mode %d need-op %s need-invite %s need-key %s \
- need-unban %s need-limit %s flood-chan %d:%d flood-ctcp %d:%d \
- flood-join %d:%d flood-kick %d:%d flood-deop %d:%d \
-@@ -402,7 +404,7 @@
- %cdynamicexempts %cuserexempts %cdynamicinvites \
- %cuserinvites %cnodesynch ",
- channel_static(chan) ? "set" : "add", name, channel_static(chan) ?
-- " " : " { ", w2, chan->idle_kick, chan->stopnethack_mode,
-+ " " : " { ", w2, topic, chan->idle_kick, chan->stopnethack_mode,
- chan->revenge_mode, need1, need2, need3, need4, need5,
- chan->flood_pub_thr, chan->flood_pub_time,
- chan->flood_ctcp_thr, chan->flood_ctcp_time,
-diff -urN eggdrop1.6.15/src/mod/channels.mod/cmdschan.c eggdrop1.6.15-topicprot/src/mod/channels.mod/cmdschan.c
---- eggdrop1.6.15/src/mod/channels.mod/cmdschan.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/channels.mod/cmdschan.c Wed May 7 11:09:01 2003
-@@ -1241,6 +1241,7 @@
- channel_static(chan) ? "static" : "dynamic", chan->dname);
- get_mode_protect(chan, work);
- dprintf(idx, "Protect modes (chanmode): %s\n", work[0] ? work : "None");
-+ dprintf(idx, "Protect topic: %s\n", chan->topic_prot[0] ? chan->topic_prot : "None");
- if (chan->idle_kick)
- dprintf(idx, "Idle Kick after (idle-kick): %d\n", chan->idle_kick);
- else
-diff -urN eggdrop1.6.15/src/mod/channels.mod/help/chaninfo.help eggdrop1.6.15-topicprot/src/mod/channels.mod/help/chaninfo.help
---- eggdrop1.6.15/src/mod/channels.mod/help/chaninfo.help Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/channels.mod/help/chaninfo.help Wed May 7 11:09:44 2003
-@@ -4,6 +4,7 @@
- It shows any of the following:
- %bchanmode%b These modes are enforced on the channel. Both + and -
- modes can be enforced.
-+ %btopic%b which topic is enforced on the channel
- %bidle-kick%b Kick idle users that are not +f or above on the channel
- after how many minutes (set this to 0 to disable).
- %{+n}
-diff -urN eggdrop1.6.15/src/mod/channels.mod/tclchan.c eggdrop1.6.15-topicprot/src/mod/channels.mod/tclchan.c
---- eggdrop1.6.15/src/mod/channels.mod/tclchan.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/channels.mod/tclchan.c Wed May 7 11:10:59 2003
-@@ -1223,6 +1223,15 @@
- return TCL_ERROR;
- }
- chan->invite_time = atoi(item[i]);
-+ } else if (!strcmp(item[i], "topic")) {
-+ i++;
-+ if (i >= items) {
-+ if (irp)
-+ Tcl_AppendResult(irp, "channel topic needs argument", NULL);
-+ return TCL_ERROR;
-+ }
-+ strncpyz(chan->topic_prot, item[i], sizeof(chan->topic_prot));
-+ check_topic(chan);
- } else if (!strcmp(item[i], "+enforcebans"))
- chan->status |= CHAN_ENFORCEBANS;
- else if (!strcmp(item[i], "-enforcebans"))
-diff -urN eggdrop1.6.15/src/mod/irc.mod/chan.c eggdrop1.6.15-topicprot/src/mod/irc.mod/chan.c
---- eggdrop1.6.15/src/mod/irc.mod/chan.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/irc.mod/chan.c Wed May 7 11:13:46 2003
-@@ -1473,12 +1473,14 @@
- memberlist *m;
- struct chanset_t *chan;
- struct userrec *u;
-+ struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
-
- chname = newsplit(&msg);
- fixcolon(msg);
- u = get_user_by_host(from);
- nick = splitnick(&from);
- chan = findchan(chname);
-+ get_user_flagrec(u, &fr, chname);
- if (chan) {
- putlog(LOG_JOIN, chan->dname, "Topic changed on %s by %s!%s: %s",
- chan->dname, nick, from, msg);
-@@ -1487,6 +1489,8 @@
- m->last = now;
- set_topic(chan, msg);
- check_tcl_topc(nick, from, u, chan->dname, msg);
-+ if (egg_strcasecmp(botname, nick) && !glob_master(fr) && !chan_master(fr))
-+ check_topic(chan);
- }
- return 0;
- }
-@@ -1505,6 +1509,7 @@
- if (chan) {
- set_topic(chan, NULL);
- check_tcl_topc("*", "*", NULL, chan->dname, "");
-+ check_topic(chan);
- }
- return 0;
- }
-@@ -1524,6 +1529,7 @@
- fixcolon(msg);
- set_topic(chan, msg);
- check_tcl_topc("*", "*", NULL, chan->dname, msg);
-+ check_topic(chan);
- }
- return 0;
- }
-diff -urN eggdrop1.6.15/src/mod/irc.mod/cmdsirc.c eggdrop1.6.15-topicprot/src/mod/irc.mod/cmdsirc.c
---- eggdrop1.6.15/src/mod/irc.mod/cmdsirc.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/irc.mod/cmdsirc.c Wed May 7 11:15:35 2003
-@@ -895,6 +895,7 @@
- static void cmd_topic(struct userrec *u, int idx, char *par)
- {
- struct chanset_t *chan;
-+ struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
-
- if (par[0] && (strchr(CHANMETA, par[0]) != NULL)) {
- char *chname = newsplit(&par);
-@@ -920,6 +921,13 @@
- dprintf(idx, "I'm not a channel op or halfop on %s and the channel is "
- "+t.\n", chan->dname);
- else {
-+ if (chan->topic_prot[0]) {
-+ get_user_flagrec(u, &fr, chan->dname);
-+ if (!glob_master(fr) && !chan_master(fr)) {
-+ dprintf(idx, "The topic of %s is protected.\n", chan->dname);
-+ return;
-+ }
-+ }
- dprintf(DP_SERVER, "TOPIC %s :%s\n", chan->name, par);
- dprintf(idx, "Changing topic...\n");
- putlog(LOG_CMDS, "*", "#%s# (%s) topic %s", dcc[idx].nick,
-diff -urN eggdrop1.6.15/src/mod/irc.mod/mode.c eggdrop1.6.15-topicprot/src/mod/irc.mod/mode.c
---- eggdrop1.6.15/src/mod/irc.mod/mode.c Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/irc.mod/mode.c Wed May 7 11:18:41 2003
-@@ -460,8 +460,10 @@
- }
- }
- m->flags |= WASOP;
-- if (check_chan)
-+ if (check_chan) {
- recheck_channel(chan, 1);
-+ check_topic(chan);
-+ }
- }
-
- static void got_halfop(struct chanset_t *chan, char *nick, char *from,
-@@ -549,8 +551,10 @@
- }
- }
- m->flags |= WASHALFOP;
-- if (check_chan)
-+ if (check_chan) {
- recheck_channel(chan, 1);
-+ check_topic(chan);
-+ }
- }
-
- static void got_deop(struct chanset_t *chan, char *nick, char *from,
-@@ -1223,6 +1227,8 @@
- (chan->mode_mns_prot & todo)))
- add_mode(chan, ms2[0] == '+' ? '-' : '+', *chg, "");
- }
-+ if ((ms2[0] == '-') && ((*chg == 't') || (*chg == 'h')))
-+ check_topic(chan);
- }
- chg++;
- }
-diff -urN eggdrop1.6.15/src/mod/module.h eggdrop1.6.15-topicprot/src/mod/module.h
---- eggdrop1.6.15/src/mod/module.h Mon May 5 00:05:32 2003
-+++ eggdrop1.6.15-topicprot/src/mod/module.h Wed May 7 11:19:36 2003
-@@ -368,7 +368,7 @@
- #define rem_tcl_coups ((void (*) (tcl_coups *))global[210])
- #define botname ((char *)(global[211]))
- /* 212 - 215 */
--/* 212: remove_gunk() -- UNUSED (drummer) */
-+#define check_topic ((void (*)(struct chanset_t *))global[212])
- #define check_tcl_chjn ((void (*) (const char *,const char *,int,char,int,const char *))global[213])
- #define sanitycheck_dcc ((int (*)(char *, char *, char *, char *))global[214])
- #define isowner ((int (*)(char *))global[215])
-diff -urN eggdrop1.6.15/src/modules.c eggdrop1.6.15-topicprot/src/modules.c
---- eggdrop1.6.15/src/modules.c Mon May 5 00:05:33 2003
-+++ eggdrop1.6.15-topicprot/src/modules.c Wed May 7 11:20:12 2003
-@@ -461,7 +461,7 @@
- (Function) rem_tcl_coups,
- (Function) botname,
- /* 212 - 215 */
-- (Function) 0, /* remove_gunk() -- UNUSED! (drummer) */
-+ (Function) check_topic,
- (Function) check_tcl_chjn,
- (Function) sanitycheck_dcc,
- (Function) isowner,
-diff -urN eggdrop1.6.15/src/patch.h eggdrop1.6.15-topicprot/src/patch.h
---- eggdrop1.6.15/src/patch.h Mon May 5 00:08:01 2003
-+++ eggdrop1.6.15-topicprot/src/patch.h Wed May 7 11:21:14 2003
-@@ -36,7 +36,7 @@
- *
- *
- */
--/* PATCH GOES HERE */
-+patch("topicprot");
- /*
- *
- *
-diff -urN eggdrop1.6.15/src/proto.h eggdrop1.6.15-topicprot/src/proto.h
---- eggdrop1.6.15/src/proto.h Mon May 5 00:05:33 2003
-+++ eggdrop1.6.15-topicprot/src/proto.h Wed May 7 11:21:48 2003
-@@ -116,6 +116,7 @@
- void set_chanlist(const char *host, struct userrec *rec);
- void clear_chanlist(void);
- void clear_chanlist_member(const char *nick);
-+void check_topic(struct chanset_t *);
-
- /* cmds.c */
- int check_dcc_attrs(struct userrec *, int);