aboutsummaryrefslogtreecommitdiffstats
path: root/main/eggdrop/gseen.mod.patch
diff options
context:
space:
mode:
authorTBK <tbk@jjtc.eu>2020-03-09 10:47:41 +0100
committerLeo <thinkabit.ukim@gmail.com>2020-03-25 17:13:42 +0000
commitbe4e9928d9fbeb45a36b8601def0782732fb0a98 (patch)
tree0beb07b5796f84ca6351a659ff71633a4f259eb7 /main/eggdrop/gseen.mod.patch
parent936220e3a5ca223ed285e6b9ad8d37fd8c64218e (diff)
downloadaports-be4e9928d9fbeb45a36b8601def0782732fb0a98.tar.bz2
aports-be4e9928d9fbeb45a36b8601def0782732fb0a98.tar.xz
main/eggdrop: upgrade to 1.8.4
Diffstat (limited to 'main/eggdrop/gseen.mod.patch')
-rw-r--r--main/eggdrop/gseen.mod.patch1624
1 files changed, 817 insertions, 807 deletions
diff --git a/main/eggdrop/gseen.mod.patch b/main/eggdrop/gseen.mod.patch
index 9f3beda356..dd49248c65 100644
--- a/main/eggdrop/gseen.mod.patch
+++ b/main/eggdrop/gseen.mod.patch
@@ -1,326 +1,91 @@
-diff -Nur src/mod/gseen.mod/Makefile src/mod/gseen.mod/Makefile
---- ./src/mod/gseen.mod/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/Makefile 2002-10-26 13:17:44.000000000 +0200
-@@ -0,0 +1,28 @@
-+# Makefile for src/mod/gseen.mod/
-+
-+doofus:
-+ @echo ""
-+ @echo "Let's try this from the right directory..."
-+ @echo ""
-+ @cd ../../../; make
-+
-+clean:
-+ @rm -f *.o *.$(MOD_EXT) *~
-+
-+static: ../gseen.o
-+
-+modules: ../../../gseen.$(MOD_EXT)
-+
-+../gseen.o: ../module.h ../modvals.h ../../eggdrop.h datahandling.c \
-+ gseen.c sensors.c gseencmds.c gseencmds.c do_seen.c ai.c tclcmds.c \
-+ misc.c seentree.c generic_binary_tree.c slang_gseen_commands.c \
-+ slang.c slang_text.c slang_ids.c slang_chanlang.c seenlang.h \
-+ slang_multitext.c gseen.h
-+ $(CC) $(CFLAGS) $(CPPFLAGS) -DMAKING_MODS -c gseen.c
-+ rm -f ../gseen.o
-+ mv gseen.o ../
-+
-+../../../gseen.$(MOD_EXT): ../gseen.o
-+ $(LD) -o ../../../gseen.$(MOD_EXT) ../gseen.o $(XLIBS)
-+
-+#safety hash
-diff -Nur src/mod/gseen.mod/README src/mod/gseen.mod/README
---- ./src/mod/gseen.mod/README 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/README 2002-10-26 13:17:45.000000000 +0200
-@@ -0,0 +1,140 @@
-+Description:
-+------------
-+
-+gseen.mod is a seen module for eggdrop that tracks not only the users in the
-+bot's userfile, but everyone who enters one of the bots channels.
-+It does pretty much the same as the popular script bseen and has a few
-+additional features like AI-seen and seen-notification.
-+It's also way faster than any corresponding script because scripts are always
-+much slower than modules. Especially scripts that deal with large amount of
-+data often become incredible slow.
-+
-+Installation:
-+-------------
-+
-+gseen.mod is written for eggdrop1.6, but it should also work with eggdrop 1.4.
-+
-+You need the eggdrop source to compile the module.
-+
-+The following instructions assume, ~/eggdrop1.6.2/ is the directory
-+where you installed your eggdrop from. (of course, other source dirs
-+will work as well)
-+
-+Put gseen.mod.1.1.0.tar.gz in ~/eggdrop1.6.2/src/mod/,
-+and unpack it (tar xfz gseen.mod.1.1.0.tar.gz). Change directory
-+back to ~/eggdrop1.6.2/.
-+
-+Now just do what you've done when you compiled your bot:
-+"./configure"
-+"make config" (you can skip this command on eggdrop 1.4)
-+"make"
-+"make install"
-+
-+Don't forget to copy the langfiles from eggdrop1.6.2/src/mod/gseen.mod/ to
-+eggdrop/language.
-+
-+All settings can be found in ~/eggdrop1.6.2/src/mod/gseen.mod/gseen.conf
-+Copy it to your eggdrop directory, edit it to fit your needs and put
-+"source gseen.conf" at the end of your eggdrop config file. The last thing
-+to do is to .rehash your bot.
-+
-+
-+Public commands:
-+----------------
-+
-+!seen <nick>
-+ I think this command doesn't need an explanation. ^_^
-+!seen <mask>
-+ Searches the database for entries that match <mask>
-+ for example "!seen *!user@dialin-*.isp.com"
-+!seennick <nick>
-+ !seen also checks if a user was online later with a
-+ different nick. !seennick only seens for <nick>
-+!seenstats
-+ just a little report on how many nicks are tracked
-+
-+All commands are also accessible via /msg.
-+("/msg <bot> seen <nick>", for example)
-+
-+
-+AI seen:
-+--------
-+
-+This module has a simple built in AI routine.
-+A short example:
-+
-+<G`Quann> Argo: have you seen Fabian recently?
-+<|Argo|> G`Quann, fabian (~fabian@dns.gifs.de) was last seen quitting
-+from #eggdev 1 week 4 days 9 hours 40 minutes 56 seconds ago
-+(20.02. 01:39) stating ".....zzzzZZZzzZZZzZZZZZZZZZZzzz..".
-+
-+Well, it's not a very intelligent AI, it's rather brute-force. So don't
-+forget to use the ai-seen-ignore setting.
-+I know that's not coded very elegant, but if you configure it correctly,
-+the failure-rate is way lower than with other AI scripts...
-+
-+DCC commands:
-+-------------
-+
-+.seen
-+.seennick
-+.seenstats
-+ just the same as the public versions
-+.purgeseens
-+ deletes expired data (this also happens automatically once a day)
-+ (m)
-+
-+Channel Settings:
-+-----------------
-+
-+ +noseendata
-+ don't log any seen data in this channel
-+ +quietseens
-+ send answers directly via notice to the person who asked and
-+ don't bother the rest of the channel with the reply
-+ +quietaiseens
-+ same as +quietseens, but for AI seens
-+ +nopubseens
-+ ignore every seen-command in this channel
-+
-+TCL commands:
-+-------------
-+
-+There are no special tcl commands, only the usual bind procs.
-+
-+The only one that should be mentioned is:
-+
-+*pubm:seen <nick> <uhost> <hand> <chan> <text>
-+ triggers the AI seen
-+ returns: 1 if a reply was sent, 0 otherwise
-+
-+So if you're using another AI script on your bot, you can modify it to
-+use this proc and avoid doubled replies this way.
-+
-+Other:
-+------
-+
-+There is absolutely NO WARRANTY on this module. I do my best to make it
-+work properly, but if anything gets screwed up, I'm not responsible. Use
-+this module at your own risk.
-+
-+Feedback:
-+---------
-+
-+Feel free to send feedback and bugreports (I hope there won't be any<g>) to
-+gseen.mod@visions-of-fantasy.de
-+
-+The newest gseen version can always be found at:
-+http://www.visions-of-fantasy.de/gseen.mod/
-+
-+Thanks to:
-+----------
-+
-+- Fabian for teaching me plenty of things
-+- everyone who tested the many buggy development versions :)
-+- the eggdev team for developing eggdrop
-+
-+Most of all, I would like to thank Bass for writing bseen.tcl because alot
-+of the ideas for this module came from using that tcl script. It's still the
-+most powerful seen script, so if you want something that's easier to use than
-+a module, get a copy of bseen.tcl.
-diff -Nur src/mod/gseen.mod/UPDATES src/mod/gseen.mod/UPDATES
---- ./src/mod/gseen.mod/UPDATES 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/UPDATES 2002-10-26 13:17:46.000000000 +0200
-@@ -0,0 +1,55 @@
-+Changes in gseen.mod: (since v1.0.0)
-+--------------------
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl src/eggdrop-1.8.4/src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl
+--- ./src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl 1970-01-01 01:00:00.000000000 +0100
++++ ./src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,80 @@
++#####################################################################
++#
++# gseen.selectlang v1.0.0
++#
++# This is a simple script which selects a language based on the
++# user's host.
++#
++# It only works for /msg commands.
++#
++# If the user is in a channel which has a language defined, gseen's
++# internal functions will override this selection and use the language
++# of the channel instead.
++#
++#####################################################################
+
-+1.1.1
-+- fixed "no newline" compilation warnings that appeared on some systems.
-+- fixed uninitialized "li" variable in do_seen()
-+- fixed lacking compatibility to eggdrop1.4 (confirmation anyone?)
-+- new option: hide-secret-chans
+
-+1.1.0 (15.6.2001)
-+- added multilang support
-+- removed static buffers
-+- organized data in a binary search tree (much faster)
-+- optimized a few other things
-+- added settings:
-+ - fuzzy-search
-+ - max-matches
-+ - wildcard-search
++# Here you can define which language to use for which host.
++# The first part is the mask for the host, and the second part
++# is the language which should be used for this host.
+
-+1.0.8
-+- quiet-seens wasn't working for !seennick
-+- added quiet-ai-seens
-+- renamed nopub to nopubseens and nolog to noseendata and
-+ quietseen to quietseens
++set tld-langs {
++ {"*.de" "de"}
++ {"*.at" "de"}
++ {"*.ch" "de"}
++ {"*.t-dialin.net" "de"}
++ {"*.t-ipconnect.net" "de"}
++ {"*.pl" "pl"}
++ {"*.jp" "ja"}
++}
+
-+1.0.7
-+- added compatibility to !channels
-+- fixed a bug relating strict-host 0 had some strange effects on
-+ !seen requests for users with ~ in their ident
++#################################################
+
-+1.0.6
-+- fixed a very evil bug that allowed anyone to crash the bot, sorry
+
-+1.0.5
-+- quietseens wasn't working correctly
-+- added support for egg1.5's udef chansets
++proc selectlang:getlang {uhost} {
++ global tld-langs
++
++ foreach tld ${tld-langs} {
++ if {[string match [lindex $tld 0] $uhost]} {
++ return [lindex $tld 1]
++ }
++ }
++ return ""
++}
+
-+1.0.4
-+- added GPL stuff
-+- changed error msg that appears if no gseen file exists
++proc sl:rebind {oldtarget newtarget} {
++ foreach binding [binds msg] {
++ if {[lindex $binding 4] == $oldtarget} {
++ unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
++ bind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] $newtarget
++ }
++ }
++}
+
-+1.0.3
-+- readme updates
-+- fixed a grammatical error in do_seen
++proc sl:msg:trigger {nick uhost hand rest target} {
++ global default-slang
++
++ set lang [selectlang:getlang $uhost]
++ set old-slang ${default-slang}
++ if {$lang != ""} {
++ set default-slang $lang
++ putlog "using '$lang'..."
++ }
++ $target $nick $uhost $hand $rest
++ set default-slang ${old-slang}
++}
+
-+1.0.2
-+- bot wanted to free a NULL pointer sometimes
++sl:rebind *msg:seen sl:msg:seen
++proc sl:msg:seen {nick uhost hand rest} {
++ sl:msg:trigger $nick $uhost $hand $rest *msg:seen
++}
+
-+1.0.1
-+- !seen without parameter returned stupid results :)
-+- fixed little typo in .purgeseens
-+- "I found 1 matches..." -> "I found 1 match..."
++sl:rebind *msg:seenstats sl:msg:seenstats
++proc sl:msg:seenstats {nick uhost hand rest} {
++ sl:msg:trigger $nick $uhost $hand $rest *msg:seenstats
++}
+
-+1.0.0
-+- release :)
-diff -Nur src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl
---- ./src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/addons/gseen.selectlang.1.0.0.tcl 2002-10-26 13:18:14.000000000 +0200
-@@ -0,0 +1,80 @@
-+#####################################################################
-+#
-+# gseen.selectlang v1.0.0
-+#
-+# This is a simple script which selects a language based on the
-+# user's host.
-+#
-+# It only works for /msg commands.
-+#
-+# If the user is in a channel which has a language defined, gseen's
-+# internal functions will override this selection and use the language
-+# of the channel instead.
-+#
-+#####################################################################
-+
-+
-+# Here you can define which language to use for which host.
-+# The first part is the mask for the host, and the second part
-+# is the language which should be used for this host.
-+
-+set tld-langs {
-+ {"*.de" "de"}
-+ {"*.at" "de"}
-+ {"*.ch" "de"}
-+ {"*.t-dialin.net" "de"}
-+ {"*.t-ipconnect.net" "de"}
-+ {"*.pl" "pl"}
-+ {"*.jp" "ja"}
-+}
-+
-+#################################################
-+
-+
-+proc selectlang:getlang {uhost} {
-+ global tld-langs
-+
-+ foreach tld ${tld-langs} {
-+ if {[string match [lindex $tld 0] $uhost]} {
-+ return [lindex $tld 1]
-+ }
-+ }
-+ return ""
-+}
-+
-+proc sl:rebind {oldtarget newtarget} {
-+ foreach binding [binds msg] {
-+ if {[lindex $binding 4] == $oldtarget} {
-+ unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
-+ bind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] $newtarget
-+ }
-+ }
-+}
-+
-+proc sl:msg:trigger {nick uhost hand rest target} {
-+ global default-slang
-+
-+ set lang [selectlang:getlang $uhost]
-+ set old-slang ${default-slang}
-+ if {$lang != ""} {
-+ set default-slang $lang
-+ putlog "using '$lang'..."
-+ }
-+ $target $nick $uhost $hand $rest
-+ set default-slang ${old-slang}
-+}
-+
-+sl:rebind *msg:seen sl:msg:seen
-+proc sl:msg:seen {nick uhost hand rest} {
-+ sl:msg:trigger $nick $uhost $hand $rest *msg:seen
-+}
-+
-+sl:rebind *msg:seenstats sl:msg:seenstats
-+proc sl:msg:seenstats {nick uhost hand rest} {
-+ sl:msg:trigger $nick $uhost $hand $rest *msg:seenstats
-+}
-+
-+sl:rebind *msg:seennick sl:msg:seennick
-+proc sl:msg:seennick {nick uhost hand rest} {
-+ sl:msg:trigger $nick $uhost $hand $rest *msg:seennick
++sl:rebind *msg:seennick sl:msg:seennick
++proc sl:msg:seennick {nick uhost hand rest} {
++ sl:msg:trigger $nick $uhost $hand $rest *msg:seennick
+}
\ No newline at end of file
-diff -Nur src/mod/gseen.mod/ai.c src/mod/gseen.mod/ai.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/ai.c src/eggdrop-1.8.4/src/mod/gseen.mod/ai.c
--- ./src/mod/gseen.mod/ai.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/ai.c 2002-10-26 13:17:47.000000000 +0200
++++ ./src/mod/gseen.mod/ai.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -473,9 +238,9 @@ diff -Nur src/mod/gseen.mod/ai.c src/mod/gseen.mod/ai.c
+ return 1;
+ return 0;
+}
-diff -Nur src/mod/gseen.mod/datahandling.c src/mod/gseen.mod/datahandling.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/datahandling.c src/eggdrop-1.8.4/src/mod/gseen.mod/datahandling.c
--- ./src/mod/gseen.mod/datahandling.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/datahandling.c 2002-10-26 13:17:48.000000000 +0200
++++ ./src/mod/gseen.mod/datahandling.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -628,9 +393,9 @@ diff -Nur src/mod/gseen.mod/datahandling.c src/mod/gseen.mod/datahandling.c
+ }
+ }
+}
-diff -Nur src/mod/gseen.mod/do_seen.c src/mod/gseen.mod/do_seen.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/do_seen.c src/eggdrop-1.8.4/src/mod/gseen.mod/do_seen.c
--- ./src/mod/gseen.mod/do_seen.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/do_seen.c 2002-10-26 13:17:50.000000000 +0200
++++ ./src/mod/gseen.mod/do_seen.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,840 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -1472,9 +1237,9 @@ diff -Nur src/mod/gseen.mod/do_seen.c src/mod/gseen.mod/do_seen.c
+ glob_total_searchtime += glob_aftersearch - glob_presearch;
+ glob_total_queries++;
+}
-diff -Nur src/mod/gseen.mod/generic_binary_tree.c src/mod/gseen.mod/generic_binary_tree.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/generic_binary_tree.c src/eggdrop-1.8.4/src/mod/gseen.mod/generic_binary_tree.c
--- ./src/mod/gseen.mod/generic_binary_tree.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/generic_binary_tree.c 2002-10-26 13:17:51.000000000 +0200
++++ ./src/mod/gseen.mod/generic_binary_tree.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -1787,9 +1552,9 @@ diff -Nur src/mod/gseen.mod/generic_binary_tree.c src/mod/gseen.mod/generic_bina
+*/
+}
+#endif
-diff -Nur src/mod/gseen.mod/global_vars.c src/mod/gseen.mod/global_vars.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/global_vars.c src/eggdrop-1.8.4/src/mod/gseen.mod/global_vars.c
--- ./src/mod/gseen.mod/global_vars.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/global_vars.c 2002-10-26 13:18:09.000000000 +0200
++++ ./src/mod/gseen.mod/global_vars.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -1825,10 +1590,10 @@ diff -Nur src/mod/gseen.mod/global_vars.c src/mod/gseen.mod/global_vars.c
+ glob_seenrequest = NULL;
+ glob_seenrequests = glob_totalnicks = glob_totalbytes = 0;
+}
-diff -Nur src/mod/gseen.mod/gseen.c src/mod/gseen.mod/gseen.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseen.c src/eggdrop-1.8.4/src/mod/gseen.mod/gseen.c
--- ./src/mod/gseen.mod/gseen.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/gseen.c 2002-10-26 14:24:48.000000000 +0200
-@@ -0,0 +1,328 @@
++++ ./src/mod/gseen.mod/gseen.c 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
+ *
@@ -1849,7 +1614,7 @@ diff -Nur src/mod/gseen.mod/gseen.c src/mod/gseen.mod/gseen.c
+
+#define MAKING_GSEEN
+#define MODULE_NAME "gseen"
-+#define MODULE_VERSION "1.1.1 dev3"
++#define MODULE_VERSION "1.1.2"
+#define MODULE_NUMVERSION 10100
+#include "../module.h"
+#include "../irc.mod/irc.h"
@@ -1916,7 +1681,7 @@ diff -Nur src/mod/gseen.mod/gseen.c src/mod/gseen.mod/gseen.c
+static int wildcard_search = 1;// allow wildcard seaching? ("*!*@*.isp.de")
+static int max_matches = 500; // break if there are more than X matches
+static int hide_secret_chans = 1; // #chan (+secret) => [secret]
-+static int seen_nick_len = 32;
++static int seen_nick_len = 9;
+
+#include "global_vars.c"
+#define SLANG_NOTYPES 1
@@ -2096,12 +1861,14 @@ diff -Nur src/mod/gseen.mod/gseen.c src/mod/gseen.mod/gseen.c
+ return "You need the server module to use the gseen module.";
+ if (!(channels_funcs = module_depend(MODULE_NAME, "channels", 1, 0)))
+ return "You need the channels module to use the gseen module.";
-+ if (!module_depend(MODULE_NAME, "eggdrop", 107, 0)) {
-+ if (!module_depend(MODULE_NAME, "eggdrop", 106, 0)) {
-+ if (!module_depend(MODULE_NAME, "eggdrop", 105, 0)) {
-+ if (!module_depend(MODULE_NAME, "eggdrop", 104, 0)) {
-+ module_undepend(MODULE_NAME);
-+ return "This module requires eggdrop1.4.0 or later";
++ if (!module_depend(MODULE_NAME, "eggdrop", 108, 0)) {
++ if (!module_depend(MODULE_NAME, "eggdrop", 107, 0)) {
++ if (!module_depend(MODULE_NAME, "eggdrop", 106, 0)) {
++ if (!module_depend(MODULE_NAME, "eggdrop", 105, 0)) {
++ if (!module_depend(MODULE_NAME, "eggdrop", 104, 0)) {
++ module_undepend(MODULE_NAME);
++ return "This module requires eggdrop1.4.0 or later";
++ }
+ }
+ }
+ }
@@ -2157,10 +1924,434 @@ diff -Nur src/mod/gseen.mod/gseen.c src/mod/gseen.mod/gseen.c
+ putlog(LOG_MISC, "*", "gseen.mod v%s loaded.", MODULE_VERSION);
+ return NULL;
+}
-diff -Nur src/mod/gseen.mod/gseen.conf src/mod/gseen.mod/gseen.conf
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseencmds.c src/eggdrop-1.8.4/src/mod/gseen.mod/gseencmds.c
+--- ./src/mod/gseen.mod/gseencmds.c 1970-01-01 01:00:00.000000000 +0100
++++ ./src/mod/gseen.mod/gseencmds.c 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,420 @@
++/*
++ * Copyright (C) 2000,2001 Florian Sander
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#define PREFIX_LENGTH 20
++
++static char reply_prefix[PREFIX_LENGTH + 1];
++#define set_prefix(x) strncpy(reply_prefix, x, PREFIX_LENGTH); \
++ reply_prefix[PREFIX_LENGTH] = 0;
++
++static int seenflood()
++{
++ if (!maxseen_thr || !maxseen_time)
++ return 0;
++ if ((now - seenflood_time) > maxseen_time) {
++ seenflood_time = now;
++ seenflood_thr = 0;
++ }
++ seenflood_thr++;
++ if (seenflood_thr > maxseen_thr)
++ return 1;
++ else
++ return 0;
++}
++
++static int nopub(char *chan)
++{
++ char buf[121], *b;
++
++ Context;
++ strncpy(buf, no_pub, 120);
++ buf[120] = 0;
++ b = buf;
++ while (b[0])
++ if (!strcasecmp(chan, newsplit(&b)))
++ return 1;
++#if EGG_IS_MIN_VER(10503)
++ if (ngetudef("nopubseens", chan))
++ return 1;
++#endif
++ return 0;
++}
++
++static int quietseen(char *chan)
++{
++ char buf[121], *b;
++
++ Context;
++ strncpy(buf, quiet_seen, 120);
++ buf[120] = 0;
++ b = buf;
++ while (b[0])
++ if (!strcasecmp(chan, newsplit(&b)))
++ return 1;
++#if EGG_IS_MIN_VER(10503)
++ if (ngetudef("quietseens", chan))
++ return 1;
++#endif
++ return 0;
++}
++
++static int cmd_seen(struct userrec *u, int idx, char *par)
++{
++ char *query;
++
++ Context;
++ if (seenflood())
++ return 0;
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, default_slang);
++ glob_nick = dcc[idx].nick;
++ query = newsplit(&par);
++ glob_query = query;
++ set_prefix(SLDCCPREFIX);
++ putlog(LOG_CMDS, "*", "#%s# seen %s", dcc[idx].nick, par);
++ dprintf(idx, "%s%s\n", reply_prefix, do_seen(query, dcc[idx].nick,
++ dcc[idx].host, "[partyline]", botnet_seen));
++ return 0;
++}
++
++static int cmd_seenstats(struct userrec *u, int idx, char *par)
++{
++ Context;
++ if (seenflood())
++ return 0;
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, default_slang);
++ glob_nick = dcc[idx].nick;
++ set_prefix(SLDCCPREFIX);
++ putlog(LOG_CMDS, "*", "#%s# seenstats", dcc[idx].nick);
++ dprintf(idx, "%s%s\n", reply_prefix, do_seenstats());
++ return 0;
++}
++
++static int cmd_purgeseens(struct userrec *u, int idx, char *par)
++{
++ Context;
++ purge_seens();
++ putlog(LOG_CMDS, "*", "#%s# purgeseens", dcc[idx].nick);
++ return 0;
++}
++
++static int pub_seen(char *nick, char *host, char *hand,
++ char *channel, char *text)
++{
++ char *dest;
++#if EGG_IS_MIN_VER(10500)
++ struct chanset_t *chan;
++#endif
++
++ Context;
++ if (seenflood() || nopub(channel))
++ return 0;
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
++ glob_nick = nick;
++ putlog(LOG_CMDS, "*", "<<%s>> !%s! seen %s", nick, hand, text);
++ if (quietseen(channel)) {
++ set_prefix(SLNOTPREFIX);
++ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix,
++ do_seen(newsplit(&text), nick, host, channel, botnet_seen));
++ return 0;
++ }
++#if EGG_IS_MIN_VER(10500)
++ chan = findchan_by_dname(channel);
++ if (chan)
++ dest = chan->name;
++ else
++ dest = channel;
++#else
++ dest = channel;
++#endif
++ set_prefix(SLPUBPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix,
++ do_seen(newsplit(&text), nick, host, channel, botnet_seen));
++ return 0;
++}
++
++static int pub_seenstats(char *nick, char *host, char *hand,
++ char *channel, char *text)
++{
++ char *dest;
++#if EGG_IS_MIN_VER(10500)
++ struct chanset_t *chan;
++#endif
++
++ Context;
++ if (seenflood())
++ return 0;
++ if (nopub(channel))
++ return 0;
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
++ glob_nick = nick;
++ putlog(LOG_CMDS, "*", "<<%s>> !%s! seenstats", nick, hand);
++ if (quietseen(channel)) {
++ set_prefix(SLNOTPREFIX);
++ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seenstats());
++ return 0;
++ }
++#if EGG_IS_MIN_VER(10500)
++ chan = findchan_by_dname(channel);
++ if (chan)
++ dest = chan->name;
++ else
++ dest = channel;
++#else
++ dest = channel;
++#endif
++ set_prefix(SLPUBPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seenstats());
++ return 1;
++}
++
++static int msg_seen(char *nick, char *uhost, struct userrec *u, char *text)
++{
++ Context;
++ if (seenflood())
++ return 0;
++ reset_global_vars();
++ glob_slang = slang_getbynick(coreslangs, nick);
++ glob_nick = nick;
++ putlog(LOG_CMDS, "*", "(%s!%s) !%s! seen %s", nick, uhost, u ? u->handle : "*", text);
++ set_prefix(SLMSGPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix,
++ do_seen(newsplit(&text), nick, uhost, "[/msg]", botnet_seen));
++ return 1;
++}
++
++static int pub_seennick(char *nick, char *host, char *hand,
++ char *channel, char *text)
++{
++ seendat *l;
++ char *dest;
++#if EGG_IS_MIN_VER(10500)
++ struct chanset_t *chan;
++#endif
++
++ Context;
++ if (seenflood())
++ return 0;
++ if (nopub(channel))
++ return 0;
++ putlog(LOG_CMDS, "*", "<<%s>> !%s! seennick %s", nick, hand, text);
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
++ glob_nick = nick;
++#if EGG_IS_MIN_VER(10500)
++ chan = findchan_by_dname(channel);
++ if (chan)
++ dest = chan->name;
++ else
++ dest = channel;
++#else
++ dest = channel;
++#endif
++ text = newsplit(&text);
++ l = findseen(text);
++ if (!l) {
++ glob_query = text;
++ if (quietseen(channel)) {
++ set_prefix(SLNOTPREFIX);
++ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
++ } else {
++ set_prefix(SLPUBPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, SLNOTSEEN);
++ }
++ return 0;
++ }
++ if (quietseen(channel)) {
++ set_prefix(SLNOTPREFIX);
++ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seennick(l));
++ } else {
++ set_prefix(SLPUBPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seennick(l));
++ }
++ return 0;
++}
++
++static int msg_seennick(char *nick, char *uhost, struct userrec *u, char *text)
++{
++ seendat *l;
++
++ Context;
++ if (seenflood())
++ return 0;
++ putlog(LOG_CMDS, "*", "(%s!%s) !%s! seennick %s", nick, uhost, u ? u->handle : "*", text);
++ reset_global_vars();
++ glob_slang = slang_getbynick(coreslangs, nick);
++ glob_nick = nick;
++ set_prefix(SLMSGPREFIX);
++ text = newsplit(&text);
++ l = findseen(text);
++ if (!l) {
++ glob_query = text;
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
++ return 0;
++ }
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, do_seennick(l));
++ return 0;
++}
++
++static int cmd_seennick(struct userrec *u, int idx, char *text)
++{
++ seendat *l;
++
++ Context;
++ if (seenflood())
++ return 0;
++ putlog(LOG_CMDS, "*", "#%s# seennick %s", dcc[idx].nick, text);
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, default_slang);
++ glob_nick = dcc[idx].nick;
++ set_prefix(SLMSGPREFIX);
++ text = newsplit(&text);
++ l = findseen(text);
++ if (!l) {
++ glob_query = text;
++ dprintf(idx, "%s%s\n", reply_prefix, SLNOTSEEN);
++ return 0;
++ }
++ dprintf(idx, "%s%s\n", reply_prefix, do_seennick(l));
++ return 0;
++}
++
++static int bot_gseen_req(char *bot, char *code, char *par)
++{
++ char *mask, *nick, *uhost, *chan, *reply;
++ char tosend[256];
++ int i;
++
++ Context;
++ if (seenflood())
++ return 0;
++ i = nextbot(bot);
++ if (i < 0) {
++ debug1("Couldn't answer botnet-seen-request from %s: no such bot", bot);
++ return 0;
++ }
++ mask = newsplit(&par);
++ nick = newsplit(&par);
++ uhost = newsplit(&par);
++ chan = newsplit(&par);
++ reset_global_vars();
++ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
++ glob_nick = nick;
++ reply = do_seen(mask, nick, uhost, chan, -1);
++ if (!reply)
++ return 0;
++ if ((strlen(nick) + strlen(chan) + strlen(reply)) < 255) {
++ sprintf(tosend, "gseen_rep %s %s %s", nick, chan, reply);
++ botnet_send_zapf(i, botnetnick, bot, tosend);
++ }
++ return 0;
++}
++
++static int bot_gseen_rep(char *bot, char *code, char *par)
++{
++ char *nick, *chan, *reply;
++ int i;
++
++ Context;
++ if (seenflood())
++ return 0;
++ if (!bnsnick || !bnschan) {
++ if (bnsnick)
++ nfree(bnsnick);
++ if (bnschan)
++ nfree(bnschan);
++ bnsnick = bnschan = NULL;
++ return 0;
++ }
++ nick = newsplit(&par);
++ chan = newsplit(&par);
++ reset_global_vars();
++ glob_remotebot = bot;
++ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
++ glob_nick = nick;
++ reply = par;
++ if (strcmp(nick, bnsnick) || strcmp(chan, bnschan))
++ return 0; /* unwanted reply */
++ if (findchan(chan)) {
++ if (nopub(chan)) {
++ nfree(bnsnick);
++ nfree(bnschan);
++ bnsnick = bnschan = NULL;
++ debug1("%s is nopub, bns-reply dropped", chan);
++ return 0;
++ }
++ if (quietseen(chan)) {
++ set_prefix(SLNOTPREFIX);
++ dprintf(DP_HELP, "NOTICE %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
++ } else {
++ set_prefix(SLPUBPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", chan, reply_prefix, SLRBOTSAYS, reply);
++ }
++ } else if (!strcmp(chan, "[/msg]")) {
++ set_prefix(SLMSGPREFIX);
++ dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
++ } else if (!strcmp(chan, "[partyline]")) {
++ for (i = 0; i < dcc_total; i++) {
++ if ((!strcasecmp(nick, dcc[i].nick)) &&
++ (dcc[i].type->flags & DCT_SIMUL)) {
++ set_prefix(SLDCCPREFIX);
++ dprintf(i, "%s%s%s\n", reply_prefix, SLRBOTSAYS, reply);
++ break;
++ }
++ }
++ } else
++ debug1("Couldn't send received bns answer, no such chan %s", chan);
++ nfree(bnsnick);
++ nfree(bnschan);
++ bnsnick = bnschan = NULL;
++ return 0;
++}
++
++static cmd_t mydcc[] =
++{
++ {"seen", "-|-", cmd_seen, NULL},
++ {"seenstats", "-|-", cmd_seenstats, NULL},
++ {"purgeseens", "m", cmd_purgeseens, NULL},
++ {"seennick", "-|-", cmd_seennick, NULL},
++ {0, 0, 0, 0}
++};
++
++static cmd_t seen_pub[] =
++{
++ {"!seen", "", pub_seen, 0},
++ {"!seenstats", "", pub_seenstats, 0},
++ {"!seennick", "", pub_seennick, 0},
++ {0, 0, 0, 0}
++};
++
++static cmd_t seen_msg[] =
++{
++ {"seen", "", msg_seen, 0},
++ {"seennick", "", msg_seennick, 0},
++ {0, 0, 0, 0}
++};
++
++static cmd_t seen_bot[] =
++{
++ {"gseen_req", "", bot_gseen_req, 0},
++ {"gseen_rep", "", bot_gseen_rep, 0},
++ {0, 0, 0, 0}
++};
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseen.conf src/eggdrop-1.8.4/src/mod/gseen.mod/gseen.conf
--- ./src/mod/gseen.mod/gseen.conf 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/gseen.conf 2002-10-26 13:17:54.000000000 +0200
-@@ -0,0 +1,147 @@
++++ ./src/mod/gseen.mod/gseen.conf 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,151 @@
+
+######
+#####
@@ -2252,6 +2443,10 @@ diff -Nur src/mod/gseen.mod/gseen.conf src/mod/gseen.mod/gseen.conf
+#####
+######
+
++# Maximum length of requested nick that will still be processed.
++# (by default this is eggdrop's configured nick-length)
++set seen-nick-len ${nick-len}
++
+# if the user is known by the bot, log their handle instead of the nick
+# (not recommended, might cause confusion by the users)
+set use-handles 0
@@ -2308,28 +2503,28 @@ diff -Nur src/mod/gseen.mod/gseen.conf src/mod/gseen.mod/gseen.conf
+ bind pubm -|- "% [subst $mask]" *pub:!seenstats
+ }
+}
-diff -Nur src/mod/gseen.mod/language/gseen.de.lang src/mod/gseen.mod/language/gseen.de.lang
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseen.de.lang src/eggdrop-1.8.4/src/mod/gseen.mod/gseen.de.lang
--- ./src/mod/gseen.mod/language/gseen.de.lang 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/language/gseen.de.lang 2002-10-26 13:18:12.000000000 +0200
++++ ./src/mod/gseen.mod/language/gseen.de.lang 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,131 @@
+#####################################################################
+#
-+# Deutsche Sprachdatei für GSeen.Mod v1.1.0
++# Deutsche Sprachdatei f�r GSeen.Mod v1.1.0
+#
-+# Der Text in dieser Datei kann nach belieben verändert werden. Du
-+# kannst Tags hinzufügen oder entfernen, wie es Dir gefällt. Die Tags
-+# müssen nicht in einer bestimmten Reihenfolge oder Anzahl vorkommen.
++# Der Text in dieser Datei kann nach belieben ver�ndert werden. Du
++# kannst Tags hinzuf�gen oder entfernen, wie es Dir gef�llt. Die Tags
++# m�ssen nicht in einer bestimmten Reihenfolge oder Anzahl vorkommen.
+#
+# Wenn Du mehr als eine Zeile pro ID angibst, dann wird bei der
-+# Antwort per Zufall eine daraus ausgewählt. (das funktioniert nicht
++# Antwort per Zufall eine daraus ausgew�hlt. (das funktioniert nicht
+# bei den Zeiteinheiten)
+#
-+# Falls Du denkst, daß hier noch ein paar wichtige Tags fehlen, dann
-+# schick mir einfach eine email. Vielleicht füge ich sie dann in der
-+# nächsten Version hinzu.
++# Falls Du denkst, da� hier noch ein paar wichtige Tags fehlen, dann
++# schick mir einfach eine email. Vielleicht f�ge ich sie dann in der
++# n�chsten Version hinzu.
+#
-+# Eine komplette Liste der Verfügbaren Tags befindet sich am Ende von
-+# slang_gseen_commands.c (leider ohne Erklährungen)
++# Eine komplette Liste der Verf�gbaren Tags befindet sich am Ende von
++# slang_gseen_commands.c (leider ohne Erkl�hrungen)
+#
+#####################################################################
+
@@ -2350,44 +2545,44 @@ diff -Nur src/mod/gseen.mod/language/gseen.de.lang src/mod/gseen.mod/language/gs
+D 9 Minuten
+D 10 Sekunde
+D 11 Sekunden
-+# falls ein üngültiger Zeitwert angegeben war, dann wird dieser Text ausgegeben:
++# falls ein �ng�ltiger Zeitwert angegeben war, dann wird dieser Text ausgegeben:
+D 12 einiger Zeit
+
+
+#
-+## Präfixe
++## Pr�fixe
+#
+# Dieses Fragment wird jeweils vor eine Antwort gesetzt. Dadurch
-+# ist beispielsweise bei öffentlichen Anfragen ersichtlich, für
++# ist beispielsweise bei �ffentlichen Anfragen ersichtlich, f�r
+# wen die Antwort ist.
+# Achtung: Die Nummer muss auf jeden Fall definiert werden. Sie muss
+# zwar keinen Text beinhalten, aber wenn sie nicht vorhanden
+# ist, dann gibt es eine Fehlermeldung
+
-+# für Antworten, die in den Channel geschrieben werden:
++# f�r Antworten, die in den Channel geschrieben werden:
+10 <?nick/?>,
-+# für Antworten, die per NOTICE an den User geschickt werden:
++# f�r Antworten, die per NOTICE an den User geschickt werden:
+11
-+# für Antworten auf Anfragen, die per "/msg <bot> seen" erfolgt sind:
++# f�r Antworten auf Anfragen, die per "/msg <bot> seen" erfolgt sind:
+12
-+# und für Antworten auf der Partyline:
++# und f�r Antworten auf der Partyline:
+13
+
+#
+## Fehlermeldungen
+#
-+54 weißt Du was ein Parameter ist? ^_^
-+54 ich würde Dir ja gerne helfen, aber solange Du nicht sagst, nach wem Du suchst, kann ich nicht viel tun.
-+54 meinst Du nicht, es wäre geschickter zu sagen, nach wem Du überhaupt suchst?
++54 wei�t Du was ein Parameter ist? ^_^
++54 ich w�rde Dir ja gerne helfen, aber solange Du nicht sagst, nach wem Du suchst, kann ich nicht viel tun.
++54 meinst Du nicht, es w�re geschickter zu sagen, nach wem Du �berhaupt suchst?
+54 42.
+55 sehe ich etwa wie ein Spiegel aus? ^_^
+55 Spieglein, Spieglein an der Wand...
-+55 leidest Du etwa unter multiplen Persönlichkeiten? *eg*
++55 leidest Du etwa unter multiplen Pers�nlichkeiten? *eg*
+56 also wenn Du <?query/?> jetzt hier nicht sehen kannst, dann brauchst Du sicherlich eine neue Brille ^_^
+56 ich muss mir unbedingt mal die Tarnkappe von <?query/?> ausleihen. Scheint ja prima zu funktioneren.
+56 schau Dir bitte nochmal ganz genau an, wer grade alles im Channel ist.
+57 Tut mir leid, aber Wildcards ('?', oder '*') sind bei der Suche nicht erlaubt.
-+58 Öhm... naja... etwas arg lang, dieser Nick... :)
++58 �hm... naja... etwas arg lang, dieser Nick... :)
+
+#
+## Kein Ergebnis
@@ -2401,9 +2596,9 @@ diff -Nur src/mod/gseen.mod/language/gseen.de.lang src/mod/gseen.mod/language/gs
+
+73 <?query/?> ist grade unter dem Nick "<?othernick/?>" in diesem Channel zu finden.
+74 <?query/?> ist gerade in <?otherchan/?>.
-+75 Deine Anfrage führte zu genau einem Ergebnis:
++75 Deine Anfrage f�hrte zu genau einem Ergebnis:
+76 Immerhin <?numresults/?> Treffer ergab deine Anfrage:
-+77 Wow, auf deine Anfrage passen sogar <?numresults/?> Einträge in meiner Datenbank! Dies sind die 5 aktuellsten:
++77 Wow, auf deine Anfrage passen sogar <?numresults/?> Eintr�ge in meiner Datenbank! Dies sind die 5 aktuellsten:
+
+#
+## falls ein anderer Bot etwas gefunden hat:
@@ -2414,17 +2609,17 @@ diff -Nur src/mod/gseen.mod/language/gseen.de.lang src/mod/gseen.mod/language/gs
+## die eigentliche Information
+#
+101 Ich habe <?snick/?> (<?shost/?>) zuletzt <?schan/?> vor <?swhen/?> betreten sehen (<?stime/?>). <?snick/?> ist noch immer da.
-+121 Ich habe <?snick/?> (<?shost/?>) zuletzt <?schan/?> vor <?swhen/?> betreten sehen (<?stime/?>), aber <?snick/?> verschwand mysteriöserweise.
++121 Ich habe <?snick/?> (<?shost/?>) zuletzt <?schan/?> vor <?swhen/?> betreten sehen (<?stime/?>), aber <?snick/?> verschwand mysteri�serweise.
+102 Ich habe <?snick/?> (<?shost/?>) zuletzt <?schan/?> vor <?swhen/?> nach <?spent/?> verchatteter Zeit verlassen sehen (<?stime/?>)
-+103 Ich habe <?snick/?> (<?shost/?>) zuletzt in <?schan/?> gesehen, als er/sie vor <?swhen/?> (<?stime/?>) nach <?spent/?> das IRC verließ ("<?smsg/?>").
++103 Ich habe <?snick/?> (<?shost/?>) zuletzt in <?schan/?> gesehen, als er/sie vor <?swhen/?> (<?stime/?>) nach <?spent/?> das IRC verlie� ("<?smsg/?>").
+104 Zuletzt habe ich <?snick/?> (<?shost/?>) vor <?swhen/?> in <?schan/?> gesehen, den Nick zu <?snick2/?> wechselnd. <?snick2/?> ist noch immer dort.
+124 <?snick/?> (<?shost/?>) was last seen changing his/her nick to <?snick2/?> on <?schan/?> <?swhen/?> ago (<?stime/?>), but <?snick2/?> mysteriously dematerialized.
+105 Zuletzt habe ich <?snick/?> (<?shost/?>) vor <?swhen/?> in <?schan/?> gesehen, den Nick von <?snick2/?> wechselnd. <?snick/?> ist noch immer dort.
+125 <?snick/?> (<?shost/?>) was last seen changing his/her nick from <?snick2/?> on <?schan/?> <?swhen/?> ago (<?stime/?>), but <?snick/?> mysteriously dematerialized.
+106 Zuletzt habe ich <?snick/?> (<?shost/?>) gesehen, als er vor <?swhen/?> (<?stime/?>) von <?punisher/?> aus <?schan/?> gejagt wurde. (<?kickreason/?>)
+107 <?snick/?> (<?shost/?>) habe ich zuletzt vor <?swhen/?> gesehen, als er/sie von <?schan/?> aus in einem Netsplit verschwand.
-+108 <?snick/?> (<?shost/?>) habe ich zuletzt vor <?swhen/?> gesehen, als er/sie nach einem Netsplit in <?schan/?> zurück kam. <?snick/?> ist noch immer dort.
-+128 <?snick/?> (<?shost/?>) habe ich zuletzt vor <?swhen/?> gesehen, als er/sie nach einem Netsplit in <?schan/?> zurück kam. Allerdings konnte <?snick/?> dem Gott der Netsplits nicht endgültig entkommen und ist wieder verschollen...
++108 <?snick/?> (<?shost/?>) habe ich zuletzt vor <?swhen/?> gesehen, als er/sie nach einem Netsplit in <?schan/?> zur�ck kam. <?snick/?> ist noch immer dort.
++128 <?snick/?> (<?shost/?>) habe ich zuletzt vor <?swhen/?> gesehen, als er/sie nach einem Netsplit in <?schan/?> zur�ck kam. Allerdings konnte <?snick/?> dem Gott der Netsplits nicht endg�ltig entkommen und ist wieder verschollen...
+109 <?snick/?> was last seen joining the botnet channel <?schan/?> on <?bnbot/?> <?swhen/?> ago (<?stime/?>).
+129 <?snick/?> was last seen joining the partyline on <?bnbot/?> <?swhen/?> ago (<?stime/?>).
+110 <?snick/?> was last seen leaving the botnet channel <?schan/?> from <?bnbot/?> <?swhen/?> ago (<?stime/?>).
@@ -2443,9 +2638,9 @@ diff -Nur src/mod/gseen.mod/language/gseen.de.lang src/mod/gseen.mod/language/gs
+#
+180 Momentan sind <?totalnicks/?> Nicks in meiner Datenbank. Gesamter Speicherverbrauch: <?totalbytes/?> Bytes
+180 In meiner Datenbank befinden sich <?totalnicks/?> Nicks und verbrauchen <?totalbytes/?> Bytes Speicher.
-diff -Nur src/mod/gseen.mod/language/gseen.en.lang src/mod/gseen.mod/language/gseen.en.lang
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseen.en.lang src/eggdrop-1.8.4/src/mod/gseen.mod/gseen.en.lang
--- ./src/mod/gseen.mod/language/gseen.en.lang 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/language/gseen.en.lang 2002-10-26 13:18:13.000000000 +0200
++++ ./src/mod/gseen.mod/language/gseen.en.lang 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,131 @@
+#####################################################################
+#
@@ -2578,9 +2773,9 @@ diff -Nur src/mod/gseen.mod/language/gseen.en.lang src/mod/gseen.mod/language/gs
+## seen stats
+#
+180 I'm currently tracking <?totalnicks/?> nicks using <?totalbytes/?> bytes.
-diff -Nur src/mod/gseen.mod/gseen.h src/mod/gseen.mod/gseen.h
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/gseen.h src/eggdrop-1.8.4/src/mod/gseen.mod/gseen.h
--- ./src/mod/gseen.mod/gseen.h 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/gseen.h 2002-10-26 13:17:55.000000000 +0200
++++ ./src/mod/gseen.mod/gseen.h 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -2739,433 +2934,41 @@ diff -Nur src/mod/gseen.mod/gseen.h src/mod/gseen.mod/gseen.h
+#endif
+
+#endif
-diff -Nur src/mod/gseen.mod/gseencmds.c src/mod/gseen.mod/gseencmds.c
---- ./src/mod/gseen.mod/gseencmds.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/gseencmds.c 2002-10-26 13:17:56.000000000 +0200
-@@ -0,0 +1,420 @@
-+/*
-+ * Copyright (C) 2000,2001 Florian Sander
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version 2
-+ * of the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ */
-+
-+#define PREFIX_LENGTH 20
-+
-+static char reply_prefix[PREFIX_LENGTH + 1];
-+#define set_prefix(x) strncpy(reply_prefix, x, PREFIX_LENGTH); \
-+ reply_prefix[PREFIX_LENGTH] = 0;
-+
-+static int seenflood()
-+{
-+ if (!maxseen_thr || !maxseen_time)
-+ return 0;
-+ if ((now - seenflood_time) > maxseen_time) {
-+ seenflood_time = now;
-+ seenflood_thr = 0;
-+ }
-+ seenflood_thr++;
-+ if (seenflood_thr > maxseen_thr)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static int nopub(char *chan)
-+{
-+ char buf[121], *b;
-+
-+ Context;
-+ strncpy(buf, no_pub, 120);
-+ buf[120] = 0;
-+ b = buf;
-+ while (b[0])
-+ if (!strcasecmp(chan, newsplit(&b)))
-+ return 1;
-+#if EGG_IS_MIN_VER(10503)
-+ if (ngetudef("nopubseens", chan))
-+ return 1;
-+#endif
-+ return 0;
-+}
-+
-+static int quietseen(char *chan)
-+{
-+ char buf[121], *b;
-+
-+ Context;
-+ strncpy(buf, quiet_seen, 120);
-+ buf[120] = 0;
-+ b = buf;
-+ while (b[0])
-+ if (!strcasecmp(chan, newsplit(&b)))
-+ return 1;
-+#if EGG_IS_MIN_VER(10503)
-+ if (ngetudef("quietseens", chan))
-+ return 1;
-+#endif
-+ return 0;
-+}
-+
-+static int cmd_seen(struct userrec *u, int idx, char *par)
-+{
-+ char *query;
-+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, default_slang);
-+ glob_nick = dcc[idx].nick;
-+ query = newsplit(&par);
-+ glob_query = query;
-+ set_prefix(SLDCCPREFIX);
-+ putlog(LOG_CMDS, "*", "#%s# seen %s", dcc[idx].nick, par);
-+ dprintf(idx, "%s%s\n", reply_prefix, do_seen(query, dcc[idx].nick,
-+ dcc[idx].host, "[partyline]", botnet_seen));
-+ return 0;
-+}
-+
-+static int cmd_seenstats(struct userrec *u, int idx, char *par)
-+{
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, default_slang);
-+ glob_nick = dcc[idx].nick;
-+ set_prefix(SLDCCPREFIX);
-+ putlog(LOG_CMDS, "*", "#%s# seenstats", dcc[idx].nick);
-+ dprintf(idx, "%s%s\n", reply_prefix, do_seenstats());
-+ return 0;
-+}
-+
-+static int cmd_purgeseens(struct userrec *u, int idx, char *par)
-+{
-+ Context;
-+ purge_seens();
-+ putlog(LOG_CMDS, "*", "#%s# purgeseens", dcc[idx].nick);
-+ return 0;
-+}
-+
-+static int pub_seen(char *nick, char *host, char *hand,
-+ char *channel, char *text)
-+{
-+ char *dest;
-+#if EGG_IS_MIN_VER(10500)
-+ struct chanset_t *chan;
-+#endif
-+
-+ Context;
-+ if (seenflood() || nopub(channel))
-+ return 0;
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
-+ glob_nick = nick;
-+ putlog(LOG_CMDS, "*", "<<%s>> !%s! seen %s", nick, hand, text);
-+ if (quietseen(channel)) {
-+ set_prefix(SLNOTPREFIX);
-+ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix,
-+ do_seen(newsplit(&text), nick, host, channel, botnet_seen));
-+ return 0;
-+ }
-+#if EGG_IS_MIN_VER(10500)
-+ chan = findchan_by_dname(channel);
-+ if (chan)
-+ dest = chan->name;
-+ else
-+ dest = channel;
-+#else
-+ dest = channel;
-+#endif
-+ set_prefix(SLPUBPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix,
-+ do_seen(newsplit(&text), nick, host, channel, botnet_seen));
-+ return 0;
-+}
-+
-+static int pub_seenstats(char *nick, char *host, char *hand,
-+ char *channel, char *text)
-+{
-+ char *dest;
-+#if EGG_IS_MIN_VER(10500)
-+ struct chanset_t *chan;
-+#endif
-+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ if (nopub(channel))
-+ return 0;
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
-+ glob_nick = nick;
-+ putlog(LOG_CMDS, "*", "<<%s>> !%s! seenstats", nick, hand);
-+ if (quietseen(channel)) {
-+ set_prefix(SLNOTPREFIX);
-+ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seenstats());
-+ return 0;
-+ }
-+#if EGG_IS_MIN_VER(10500)
-+ chan = findchan_by_dname(channel);
-+ if (chan)
-+ dest = chan->name;
-+ else
-+ dest = channel;
-+#else
-+ dest = channel;
-+#endif
-+ set_prefix(SLPUBPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seenstats());
-+ return 1;
-+}
-+
-+static int msg_seen(char *nick, char *uhost, struct userrec *u, char *text)
-+{
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ reset_global_vars();
-+ glob_slang = slang_getbynick(coreslangs, nick);
-+ glob_nick = nick;
-+ putlog(LOG_CMDS, "*", "(%s!%s) !%s! seen %s", nick, uhost, u ? u->handle : "*", text);
-+ set_prefix(SLMSGPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix,
-+ do_seen(newsplit(&text), nick, uhost, "[/msg]", botnet_seen));
-+ return 1;
-+}
-+
-+static int pub_seennick(char *nick, char *host, char *hand,
-+ char *channel, char *text)
-+{
-+ seendat *l;
-+ char *dest;
-+#if EGG_IS_MIN_VER(10500)
-+ struct chanset_t *chan;
-+#endif
-+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ if (nopub(channel))
-+ return 0;
-+ putlog(LOG_CMDS, "*", "<<%s>> !%s! seennick %s", nick, hand, text);
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, channel));
-+ glob_nick = nick;
-+#if EGG_IS_MIN_VER(10500)
-+ chan = findchan_by_dname(channel);
-+ if (chan)
-+ dest = chan->name;
-+ else
-+ dest = channel;
-+#else
-+ dest = channel;
-+#endif
-+ text = newsplit(&text);
-+ l = findseen(text);
-+ if (!l) {
-+ glob_query = text;
-+ if (quietseen(channel)) {
-+ set_prefix(SLNOTPREFIX);
-+ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
-+ } else {
-+ set_prefix(SLPUBPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, SLNOTSEEN);
-+ }
-+ return 0;
-+ }
-+ if (quietseen(channel)) {
-+ set_prefix(SLNOTPREFIX);
-+ dprintf(DP_HELP, "NOTICE %s :%s%s\n", nick, reply_prefix, do_seennick(l));
-+ } else {
-+ set_prefix(SLPUBPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", dest, reply_prefix, do_seennick(l));
-+ }
-+ return 0;
-+}
-+
-+static int msg_seennick(char *nick, char *uhost, struct userrec *u, char *text)
-+{
-+ seendat *l;
-+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ putlog(LOG_CMDS, "*", "(%s!%s) !%s! seennick %s", nick, uhost, u ? u->handle : "*", text);
-+ reset_global_vars();
-+ glob_slang = slang_getbynick(coreslangs, nick);
-+ glob_nick = nick;
-+ set_prefix(SLMSGPREFIX);
-+ text = newsplit(&text);
-+ l = findseen(text);
-+ if (!l) {
-+ glob_query = text;
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, SLNOTSEEN);
-+ return 0;
-+ }
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s\n", nick, reply_prefix, do_seennick(l));
-+ return 0;
-+}
-+
-+static int cmd_seennick(struct userrec *u, int idx, char *text)
-+{
-+ seendat *l;
-+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ putlog(LOG_CMDS, "*", "#%s# seennick %s", dcc[idx].nick, text);
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, default_slang);
-+ glob_nick = dcc[idx].nick;
-+ set_prefix(SLMSGPREFIX);
-+ text = newsplit(&text);
-+ l = findseen(text);
-+ if (!l) {
-+ glob_query = text;
-+ dprintf(idx, "%s%s\n", reply_prefix, SLNOTSEEN);
-+ return 0;
-+ }
-+ dprintf(idx, "%s%s\n", reply_prefix, do_seennick(l));
-+ return 0;
-+}
-+
-+static int bot_gseen_req(char *bot, char *code, char *par)
-+{
-+ char *mask, *nick, *uhost, *chan, *reply;
-+ char tosend[256];
-+ int i;
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/Makefile src/eggdrop-1.8.4/src/mod/gseen.mod/Makefile
+--- ./src/mod/gseen.mod/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ ./src/mod/gseen.mod/Makefile 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,28 @@
++# Makefile for src/mod/gseen.mod/
+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ i = nextbot(bot);
-+ if (i < 0) {
-+ debug1("Couldn't answer botnet-seen-request from %s: no such bot", bot);
-+ return 0;
-+ }
-+ mask = newsplit(&par);
-+ nick = newsplit(&par);
-+ uhost = newsplit(&par);
-+ chan = newsplit(&par);
-+ reset_global_vars();
-+ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
-+ glob_nick = nick;
-+ reply = do_seen(mask, nick, uhost, chan, -1);
-+ if (!reply)
-+ return 0;
-+ if ((strlen(nick) + strlen(chan) + strlen(reply)) < 255) {
-+ sprintf(tosend, "gseen_rep %s %s %s", nick, chan, reply);
-+ botnet_send_zapf(i, botnetnick, bot, tosend);
-+ }
-+ return 0;
-+}
++doofus:
++ @echo ""
++ @echo "Let's try this from the right directory..."
++ @echo ""
++ @cd ../../../; make
+
-+static int bot_gseen_rep(char *bot, char *code, char *par)
-+{
-+ char *nick, *chan, *reply;
-+ int i;
++clean:
++ @rm -f *.o *.$(MOD_EXT) *~
+
-+ Context;
-+ if (seenflood())
-+ return 0;
-+ if (!bnsnick || !bnschan) {
-+ if (bnsnick)
-+ nfree(bnsnick);
-+ if (bnschan)
-+ nfree(bnschan);
-+ bnsnick = bnschan = NULL;
-+ return 0;
-+ }
-+ nick = newsplit(&par);
-+ chan = newsplit(&par);
-+ reset_global_vars();
-+ glob_remotebot = bot;
-+ glob_slang = slang_find(coreslangs, slang_chanlang_get(chanlangs, chan));
-+ glob_nick = nick;
-+ reply = par;
-+ if (strcmp(nick, bnsnick) || strcmp(chan, bnschan))
-+ return 0; /* unwanted reply */
-+ if (findchan(chan)) {
-+ if (nopub(chan)) {
-+ nfree(bnsnick);
-+ nfree(bnschan);
-+ bnsnick = bnschan = NULL;
-+ debug1("%s is nopub, bns-reply dropped", chan);
-+ return 0;
-+ }
-+ if (quietseen(chan)) {
-+ set_prefix(SLNOTPREFIX);
-+ dprintf(DP_HELP, "NOTICE %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
-+ } else {
-+ set_prefix(SLPUBPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", chan, reply_prefix, SLRBOTSAYS, reply);
-+ }
-+ } else if (!strcmp(chan, "[/msg]")) {
-+ set_prefix(SLMSGPREFIX);
-+ dprintf(DP_HELP, "PRIVMSG %s :%s%s%s\n", nick, reply_prefix, SLRBOTSAYS, reply);
-+ } else if (!strcmp(chan, "[partyline]")) {
-+ for (i = 0; i < dcc_total; i++) {
-+ if ((!strcasecmp(nick, dcc[i].nick)) &&
-+ (dcc[i].type->flags & DCT_SIMUL)) {
-+ set_prefix(SLDCCPREFIX);
-+ dprintf(i, "%s%s%s\n", reply_prefix, SLRBOTSAYS, reply);
-+ break;
-+ }
-+ }
-+ } else
-+ debug1("Couldn't send received bns answer, no such chan %s", chan);
-+ nfree(bnsnick);
-+ nfree(bnschan);
-+ bnsnick = bnschan = NULL;
-+ return 0;
-+}
++static: ../gseen.o
+
-+static cmd_t mydcc[] =
-+{
-+ {"seen", "-|-", cmd_seen, NULL},
-+ {"seenstats", "-|-", cmd_seenstats, NULL},
-+ {"purgeseens", "m", cmd_purgeseens, NULL},
-+ {"seennick", "-|-", cmd_seennick, NULL},
-+ {0, 0, 0, 0}
-+};
++modules: ../../../gseen.$(MOD_EXT)
+
-+static cmd_t seen_pub[] =
-+{
-+ {"!seen", "", pub_seen, 0},
-+ {"!seenstats", "", pub_seenstats, 0},
-+ {"!seennick", "", pub_seennick, 0},
-+ {0, 0, 0, 0}
-+};
++../gseen.o: ../module.h ../modvals.h ../../eggdrop.h datahandling.c \
++ gseen.c sensors.c gseencmds.c gseencmds.c do_seen.c ai.c tclcmds.c \
++ misc.c seentree.c generic_binary_tree.c slang_gseen_commands.c \
++ slang.c slang_text.c slang_ids.c slang_chanlang.c seenlang.h \
++ slang_multitext.c gseen.h
++ $(CC) $(CFLAGS) $(CPPFLAGS) -DMAKING_MODS -c gseen.c
++ rm -f ../gseen.o
++ mv gseen.o ../
+
-+static cmd_t seen_msg[] =
-+{
-+ {"seen", "", msg_seen, 0},
-+ {"seennick", "", msg_seennick, 0},
-+ {0, 0, 0, 0}
-+};
++../../../gseen.$(MOD_EXT): ../gseen.o
++ $(LD) -o ../../../gseen.$(MOD_EXT) ../gseen.o $(XLIBS)
+
-+static cmd_t seen_bot[] =
-+{
-+ {"gseen_req", "", bot_gseen_req, 0},
-+ {"gseen_rep", "", bot_gseen_rep, 0},
-+ {0, 0, 0, 0}
-+};
-diff -Nur src/mod/gseen.mod/misc.c src/mod/gseen.mod/misc.c
++#safety hash
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/misc.c src/eggdrop-1.8.4/src/mod/gseen.mod/misc.c
--- ./src/mod/gseen.mod/misc.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/misc.c 2002-10-26 13:17:57.000000000 +0200
++++ ./src/mod/gseen.mod/misc.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -3188,7 +2991,7 @@ diff -Nur src/mod/gseen.mod/misc.c src/mod/gseen.mod/misc.c
+/* maskstricthost():
+ * basically the same as maskhost() from src/misc.c, but _never_ stripts
+ * "~+-^=" off the host
-+ * maskhost() version: * $Id: misc.c,v 1.30 2000/10/27 19:27:32 fabian Exp $
++ * maskhost() version: * $Id: misc.c,v 1.1 2005/04/14 10:55:00 Administrator Exp $
+ */
+static void maskstricthost(const char *s, char *nw)
+{
@@ -3283,9 +3086,152 @@ diff -Nur src/mod/gseen.mod/misc.c src/mod/gseen.mod/misc.c
+ }
+ }
+}
-diff -Nur src/mod/gseen.mod/seenlang.h src/mod/gseen.mod/seenlang.h
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/README src/eggdrop-1.8.4/src/mod/gseen.mod/README
+--- ./src/mod/gseen.mod/README 1970-01-01 01:00:00.000000000 +0100
++++ ./src/mod/gseen.mod/README 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,139 @@
++Description:
++------------
++
++gseen.mod is a seen module for eggdrop that tracks not only the users in the
++bot's userfile, but everyone who enters one of the bots channels.
++It does pretty much the same as the popular script bseen and has a few
++additional features like AI-seen and seen-notification.
++It's also way faster than any corresponding script because scripts are always
++much slower than modules. Especially scripts that deal with large amount of
++data often become incredible slow.
++
++Installation:
++-------------
++
++gseen.mod is written for eggdrop1.6, but it should also work with eggdrop 1.4.
++It has been reported to work with eggdrop 1.8, but I did not test it
++myself on that version.
++
++You need the eggdrop source to compile the module.
++
++The following instructions assume, ~/eggdrop1.6.2/ is the directory
++where you installed your eggdrop from. (of course, other source dirs
++will work as well)
++
++Put gseen.mod.1.1.2.tar.gz in ~/eggdrop1.6.2/src/mod/,
++and unpack it (tar xfz gseen.mod.1.1.2.tar.gz). Change directory
++back to ~/eggdrop1.6.2/.
++
++Now just do what you've done when you compiled your bot:
++"./configure"
++"make config" (you can skip this command on eggdrop 1.4)
++"make"
++"make install"
++
++Don't forget to copy the langfiles from eggdrop1.6.2/src/mod/gseen.mod/ to
++eggdrop/language.
++
++All settings can be found in ~/eggdrop1.6.2/src/mod/gseen.mod/gseen.conf
++Copy it to your eggdrop directory, edit it to fit your needs and put
++"source gseen.conf" at the end of your eggdrop config file. The last thing
++to do is to .rehash your bot.
++
++
++Public commands:
++----------------
++
++!seen <nick>
++ I think this command doesn't need an explanation. ^_^
++!seen <mask>
++ Searches the database for entries that match <mask>
++ for example "!seen *!user@dialin-*.isp.com"
++!seennick <nick>
++ !seen also checks if a user was online later with a
++ different nick. !seennick only seens for <nick>
++!seenstats
++ just a little report on how many nicks are tracked
++
++All commands are also accessible via /msg.
++("/msg <bot> seen <nick>", for example)
++
++
++AI seen:
++--------
++
++This module has a simple built in AI routine.
++A short example:
++
++<G`Quann> Argo: have you seen Fabian recently?
++<|Argo|> G`Quann, fabian (~fabian@dns.gifs.de) was last seen quitting
++from #eggdev 1 week 4 days 9 hours 40 minutes 56 seconds ago
++(20.02. 01:39) stating ".....zzzzZZZzzZZZzZZZZZZZZZZzzz..".
++
++Well, it's not a very intelligent AI, it's rather brute-force. So don't
++forget to use the ai-seen-ignore setting.
++I know that's not coded very elegant, but if you configure it correctly,
++the failure-rate is way lower than with other AI scripts...
++
++DCC commands:
++-------------
++
++.seen
++.seennick
++.seenstats
++ just the same as the public versions
++.purgeseens
++ deletes expired data (this also happens automatically once a day)
++ (m)
++
++Channel Settings:
++-----------------
++
++ +noseendata
++ don't log any seen data in this channel
++ +quietseens
++ send answers directly via notice to the person who asked and
++ don't bother the rest of the channel with the reply
++ +quietaiseens
++ same as +quietseens, but for AI seens
++ +nopubseens
++ ignore every seen-command in this channel
++
++TCL commands:
++-------------
++
++There are no special tcl commands, only the usual bind procs.
++
++The only one that should be mentioned is:
++
++*pubm:seen <nick> <uhost> <hand> <chan> <text>
++ triggers the AI seen
++ returns: 1 if a reply was sent, 0 otherwise
++
++So if you're using another AI script on your bot, you can modify it to
++use this proc and avoid doubled replies this way.
++
++Other:
++------
++
++There is absolutely NO WARRANTY on this module. I do my best to make it
++work properly, but if anything gets screwed up, I'm not responsible. Use
++this module at your own risk.
++
++Homepage:
++---------
++
++The newest gseen version can always be found at:
++http://www.kreativrauschen.com/gseen.mod/
++
++Thanks to:
++----------
++
++- Fabian for teaching me plenty of things
++- everyone who tested the many buggy development versions :)
++- the eggdev team for developing eggdrop
++
++Most of all, I would like to thank Bass for writing bseen.tcl because alot
++of the ideas for this module came from using that tcl script. It's still the
++most powerful seen script, so if you want something that's easier to use than
++a module, get a copy of bseen.tcl.
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/seenlang.h src/eggdrop-1.8.4/src/mod/gseen.mod/seenlang.h
--- ./src/mod/gseen.mod/seenlang.h 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/seenlang.h 2002-10-26 13:17:58.000000000 +0200
++++ ./src/mod/gseen.mod/seenlang.h 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -3348,9 +3294,9 @@ diff -Nur src/mod/gseen.mod/seenlang.h src/mod/gseen.mod/seenlang.h
+#define SLLASTLOOK getslang(172)
+
+#define SLSEENSTATS getslang(180)
-diff -Nur src/mod/gseen.mod/seentree.c src/mod/gseen.mod/seentree.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/seentree.c src/eggdrop-1.8.4/src/mod/gseen.mod/seentree.c
--- ./src/mod/gseen.mod/seentree.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/seentree.c 2002-10-26 13:18:10.000000000 +0200
++++ ./src/mod/gseen.mod/seentree.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -3565,9 +3511,9 @@ diff -Nur src/mod/gseen.mod/seentree.c src/mod/gseen.mod/seentree.c
+ {"killseen", tcl_killseen},
+ {0, 0}
+};
-diff -Nur src/mod/gseen.mod/sensors.c src/mod/gseen.mod/sensors.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/sensors.c src/eggdrop-1.8.4/src/mod/gseen.mod/sensors.c
--- ./src/mod/gseen.mod/sensors.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/sensors.c 2002-10-26 13:18:00.000000000 +0200
++++ ./src/mod/gseen.mod/sensors.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -3842,9 +3788,9 @@ diff -Nur src/mod/gseen.mod/sensors.c src/mod/gseen.mod/sensors.c
+ {"*", "", (Function) gseen_rejn, "gseen"},
+ {0, 0, 0, 0}
+};
-diff -Nur src/mod/gseen.mod/slang.c src/mod/gseen.mod/slang.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang.c
--- ./src/mod/gseen.mod/slang.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang.c 2002-10-26 13:18:03.000000000 +0200
++++ ./src/mod/gseen.mod/slang.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -4155,9 +4101,9 @@ diff -Nur src/mod/gseen.mod/slang.c src/mod/gseen.mod/slang.c
+ return slang_id_get_next();
+}
+#endif
-diff -Nur src/mod/gseen.mod/slang_chanlang.c src/mod/gseen.mod/slang_chanlang.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_chanlang.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_chanlang.c
--- ./src/mod/gseen.mod/slang_chanlang.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_chanlang.c 2002-10-26 13:18:02.000000000 +0200
++++ ./src/mod/gseen.mod/slang_chanlang.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -4272,9 +4218,9 @@ diff -Nur src/mod/gseen.mod/slang_chanlang.c src/mod/gseen.mod/slang_chanlang.c
+#endif
+ return slang_find(where, default_slang);
+}
-diff -Nur src/mod/gseen.mod/slang_duration.c src/mod/gseen.mod/slang_duration.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_duration.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_duration.c
--- ./src/mod/gseen.mod/slang_duration.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_duration.c 2002-10-26 13:18:01.000000000 +0200
++++ ./src/mod/gseen.mod/slang_duration.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -4358,9 +4304,9 @@ diff -Nur src/mod/gseen.mod/slang_duration.c src/mod/gseen.mod/slang_duration.c
+ }
+ return where->durs[idx];
+}
-diff -Nur src/mod/gseen.mod/slang_gseen_commands.c src/mod/gseen.mod/slang_gseen_commands.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_gseen_commands.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_gseen_commands.c
--- ./src/mod/gseen.mod/slang_gseen_commands.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_gseen_commands.c 2002-10-26 13:18:06.000000000 +0200
++++ ./src/mod/gseen.mod/slang_gseen_commands.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,235 @@
+static void slang_send_botnick()
+{
@@ -4597,9 +4543,9 @@ diff -Nur src/mod/gseen.mod/slang_gseen_commands.c src/mod/gseen.mod/slang_gseen
+ {"nick", slang_send_nick},
+ {0, 0}
+};
-diff -Nur src/mod/gseen.mod/slang_ids.c src/mod/gseen.mod/slang_ids.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_ids.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_ids.c
--- ./src/mod/gseen.mod/slang_ids.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_ids.c 2002-10-26 13:18:04.000000000 +0200
++++ ./src/mod/gseen.mod/slang_ids.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -4705,9 +4651,9 @@ diff -Nur src/mod/gseen.mod/slang_ids.c src/mod/gseen.mod/slang_ids.c
+ return slang_multitext_get_next();
+}
+#endif
-diff -Nur src/mod/gseen.mod/slang_multitext.c src/mod/gseen.mod/slang_multitext.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_multitext.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_multitext.c
--- ./src/mod/gseen.mod/slang_multitext.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_multitext.c 2002-10-26 13:18:05.000000000 +0200
++++ ./src/mod/gseen.mod/slang_multitext.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -4860,9 +4806,9 @@ diff -Nur src/mod/gseen.mod/slang_multitext.c src/mod/gseen.mod/slang_multitext.
+ return NULL;
+}
+#endif
-diff -Nur src/mod/gseen.mod/slang_text.c src/mod/gseen.mod/slang_text.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/slang_text.c src/eggdrop-1.8.4/src/mod/gseen.mod/slang_text.c
--- ./src/mod/gseen.mod/slang_text.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/slang_text.c 2002-10-26 13:18:07.000000000 +0200
++++ ./src/mod/gseen.mod/slang_text.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -5064,9 +5010,9 @@ diff -Nur src/mod/gseen.mod/slang_text.c src/mod/gseen.mod/slang_text.c
+ }
+ putlog(LOG_MISC, "*", "ERROR! Unknown slang-command: '%s'", cmd);
+}
-diff -Nur src/mod/gseen.mod/tclcmds.c src/mod/gseen.mod/tclcmds.c
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/tclcmds.c src/eggdrop-1.8.4/src/mod/gseen.mod/tclcmds.c
--- ./src/mod/gseen.mod/tclcmds.c 1970-01-01 01:00:00.000000000 +0100
-+++ ./src/mod/gseen.mod/tclcmds.c 2002-10-26 13:18:08.000000000 +0200
++++ ./src/mod/gseen.mod/tclcmds.c 2017-01-02 22:30:47.000000000 +0100
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2000,2001 Florian Sander
@@ -5121,3 +5067,67 @@ diff -Nur src/mod/gseen.mod/tclcmds.c src/mod/gseen.mod/tclcmds.c
+ {"setchanseenlang", tcl_setchanseenlang},
+ {0, 0}
+};
+diff -urpN src-orig/eggdrop-1.8.4/src/mod/gseen.mod/UPDATES src/eggdrop-1.8.4/src/mod/gseen.mod/UPDATES
+--- ./src/mod/gseen.mod/UPDATES 1970-01-01 01:00:00.000000000 +0100
++++ ./src/mod/gseen.mod/UPDATES 2017-01-02 22:30:47.000000000 +0100
+@@ -0,0 +1,60 @@
++Changes in gseen.mod: (since v1.0.0)
++--------------------
++
++1.1.2 (2017-01-02)
++- compatibility to eggdrop 1.8
++
++
++1.1.1
++- fixed "no newline" compilation warnings that appeared on some systems.
++- fixed uninitialized "li" variable in do_seen()
++- fixed lacking compatibility to eggdrop1.4 (confirmation anyone?)
++- new option: hide-secret-chans
++- new option: seen-nick-len
++
++1.1.0 (15.6.2001)
++- added multilang support
++- removed static buffers
++- organized data in a binary search tree (much faster)
++- optimized a few other things
++- added settings:
++ - fuzzy-search
++ - max-matches
++ - wildcard-search
++
++1.0.8
++- quiet-seens wasn't working for !seennick
++- added quiet-ai-seens
++- renamed nopub to nopubseens and nolog to noseendata and
++ quietseen to quietseens
++
++1.0.7
++- added compatibility to !channels
++- fixed a bug relating strict-host 0 had some strange effects on
++ !seen requests for users with ~ in their ident
++
++1.0.6
++- fixed a very evil bug that allowed anyone to crash the bot, sorry
++
++1.0.5
++- quietseens wasn't working correctly
++- added support for egg1.5's udef chansets
++
++1.0.4
++- added GPL stuff
++- changed error msg that appears if no gseen file exists
++
++1.0.3
++- readme updates
++- fixed a grammatical error in do_seen
++
++1.0.2
++- bot wanted to free a NULL pointer sometimes
++
++1.0.1
++- !seen without parameter returned stupid results :)
++- fixed little typo in .purgeseens
++- "I found 1 matches..." -> "I found 1 match..."
++
++1.0.0
++- release :)