- Home»
- Cod sursa: brain.tcl
brain.tcl
brain.tcl
Eggdrop TCL that can learn from users and the information is stored in brain.db, a separate file. Brain.tcl tested on eggdrop1.4
| Postat de | Copyright | Categorie | Review user | Vizualizari | Data |
|---|---|---|---|---|---|
| btc | Gehirn | games | Cod netestat | 481 | 2023-12-24 23:24:21 |
# Wer diesen text loescht oder veraendert ist lame :-)
#
# script by: IrAl^KbK
# update by: Puchalke
#
# email: iral_kbk@web.de ; iral_kbk@gmx.de ; kotmann@gmx.de
#
# Brain.tcl tested on eggdrop1.4
#
# ein kleines labber-script, ich habe nicht vor weitere verbesserte versionen
# davon herauszugeben, wenn ihr dazu lust habt, wuerde es mich freuen
# wenn ihr mir euren code senden wuerdet, weil mich diese art KI
# sehr interessiert.
#
# dieses script ist fuer deutsche sprache ausgelegt, sollte aber in
# englisch auch funktionieren.
#
# gruesse zum erschaffer des 3xBot.tcl, dem ich zu verdanken hab, das ich
# das letzte problem mit einem befehl aus seinem script loesen konnte...
# auf den waere ich ohne dem script wahrscheinlich erst nach einem halben
# jahr gekommen :-)
### variablen ###
# hier den path von der brain-file eingeben (wird beim ersten wort erstellt)
# das verzeichniss muss gegebenfalls angelegt werden.
######!WICHTIG!######
set brain_brain_url "./brain.db"
# dient dazu, dass der bot nicht saetze, in denen sein eigener name vorkommt, lernt
set botsnick [string range $botname 0 [expr [string last ! $botname]-1]]
# von folgenden usern wird nichts gelernt. hier keine wildcards benutzen!
set dont_learn_from "user1 user2"
# auf folgende user wird nicht reagiert
set dont_react_to "user3"
# Hier die Channels eingeben auf denen der Bot reden soll.
# "*" fuer alle Channels
set add_chan "#channel1"
# Hier die Channels eingeben auf denen der Bot saetze sammeln soll.
# "*" fuer alle Channels
set add_shan "#channel1 #channel2 #channel3"
# die trefferquote ( je hoeher die zahl, desto mehr redet der bot, aber
# die cpu muss drunter leiden :-)
# der wert 10550 war bei meinem bot (linux-kernel 2.2.16 500mhz-cpu) kein
# problem, um den bot gegen floods zu schuetzen sollte man es nicht ueber
# 500 setzen schaetze ich mal *g*
# 150 ist der standartwert, wenn der bot nicht sofort loslabbert sollte
# man sich nicht wundern, weil er erstmal saetze sammeln muss. ab 16000
# zeilen sollte es schon ganz gut gehen
set brain_treffer 200
# ein paar feineinstellungen, keine von den zahlen darf den
# in $brain_treffer gesetzten wert ueberschreiten
# je kleiner der wert,desto besser. man sollte aber nicht uebertreiben,
# weil die cpu auslastung hochgeht. am besten einfach so lassen :-)
# moeglichst viele woerter treffen. je groesser der wert, desto eher aufgabe
set b_subbbbb 0
# weniger woerter treffen
set b_sub [expr $brain_treffer * 0.1]
# noch weniger
set b_subbb [expr $brain_treffer * 0.5]
# nach einzelnen woertern suchen
set b_subbbb [expr $brain_treffer * 0.9]
#################
##################### do not edit anything below ###############################
### binds ###
bind pubm - * brain_add
bind pubm - * brain_readfiles
#############
#######################
#### woerter adden ####
#######################
# returns:
# 0: satz gelernt
# 1: aus diesem channel soll nichts gelernt werden
# 2: satz nicht gelernt, da botname drin vorkam
# 3: satz nicht gelernt, da von nick nichts gelernt werden darf
# 4: satz bereits im hirn vorhanden
proc brain_add { nick uhost hand chan arg } {
global brain_brain_url add_shan botsnick dont_learn_from
if {([lsearch -exact $add_shan $chan] == -1) && ($add_shan != "*")} {return 1}
set arg_low [join [string tolower [lindex $arg 0]]]
if { ([string match *$botsnick* $arg_low] > 0)
|| ([lsearch -exact $arg_low \#] >= 0)
|| ([lsearch -exact $arg_low ign] >= 0) } {
return 2
}
if { ([lsearch -exact $dont_learn_from $nick] >= 0)} {
return 3
}
set msg [lrange $arg 0 end]
set tmpfile [open $brain_brain_url a+]
regsub -all -- Ä $msg Ae msg
regsub -all -- Ü $msg Ue msg
regsub -all -- Ö $msg Oe msg
regsub -all -- ä $msg ae msg
regsub -all -- ü $msg ue msg
regsub -all -- ö $msg oe msg
regsub -all -- ß $msg ss msg
regsub -all -- \\\\ $msg \\\\\\\\ msg
regsub -all -- \\\[ $msg \\\\\[ msg
regsub -all -- \\\] $msg \\\\\] msg
regsub -all -- \\\} $msg \\\\\} msg
regsub -all -- \\\{ $msg \\\\\{ msg
regsub -all -- \\\" $msg \\\\\" msg
set sentence [join $msg]
puts $tmpfile $sentence
close $tmpfile
return 0
}
###############################################
#### woerter zufällig aus den files suchen ####
###############################################
# returns:
# 0: es wurde was gesagt
# 1: nichts gesagt
# 2: auf nick durfte nicht geantwortet werden
# 3: satz nur ein wort lang, deshalb nicht reagiert
# 4: channel ist nicht zur antwort freigegeben
proc brain_readfiles { nick uhost hand chan arg } {
global brain_brain_url brain_treffer b_sub b_subbb b_subbbb b_subbbbb add_chan dont_react_to
if { ([lsearch -exact $dont_react_to $nick] >= 0)} {
return 2
}
if {[llength [split $arg " "]] == "1"} { return 3 }
if {([lsearch -exact $add_chan $chan] == -1) && ($add_chan != "*")} { return 4 }
regsub -all -- \\\\ $arg \\\\\\\\ arg
regsub -all -- \\\[ $arg \\\\\[ arg
regsub -all -- \\\] $arg \\\\\] arg
regsub -all -- \\\} $arg \\\\\} arg
regsub -all -- \\\{ $arg \\\\\{ arg
regsub -all -- \\\" $arg \\\\\" arg
regsub -all -- Ä $arg Ae arg
regsub -all -- Ü $arg Ue arg
regsub -all -- Ö $arg Oe arg
regsub -all -- ä $arg ae arg
regsub -all -- ü $arg ue arg
regsub -all -- ö $arg oe arg
regsub -all -- ß $arg ss arg
set sentence_in [join $arg]
set brain_tmp_nr [rand [llength [split $arg " "]]]
set x_zz 1
while {$x_zz < 150} {
incr x_zz
set brain_tmp_nz [rand [llength [split $arg " "]]]
if {($brain_tmp_nz != $brain_tmp_nr)} {
break
}
}
set x_yx 1
while {$x_yx < 150} {
incr x_yx
set brain_tmp_nu [rand [llength [split $arg " "]]]
if {($brain_tmp_nu != $brain_tmp_nr) && ($brain_tmp_nz != $brain_tmp_nu)} {
break
}
}
set brain_tmp [lindex $arg [rand 2]]
set brain_tmp_zwo [lindex $arg $brain_tmp_nu]
set brain_tmp_drei [lindex $arg $brain_tmp_nz]
if {$brain_tmp == "ich"} { regsub -- ich $brain_tmp du brain_tmp }
if {$brain_tmp == "du"} { regsub -- du $brain_tmp ich brain_tmp }
if {$brain_tmp == "ihr"} { regsub -- ihr $brain_tmp ich brain_tmp }
if {$brain_tmp == "wir"} { regsub -- wir $brain_tmp ihr brain_tmp }
if {$brain_tmp == "mir"} { regsub -- mir $brain_tmp dir brain_tmp }
if {$brain_tmp == "dir"} { regsub -- dir $brain_tmp mir brain_tmp }
if {$brain_tmp == "euch"} { regsub -- euch $brain_tmp mir brain_tmp }
if {$brain_tmp == "uns"} { regsub -- uns $brain_tmp euch brain_tmp }
if {$brain_tmp == "mein"} { regsub -- mein $brain_tmp dein brain_tmp }
if {$brain_tmp == "dein"} { regsub -- dein $brain_tmp mein brain_tmp }
if {$brain_tmp == "euer"} { regsub -- euer $brain_tmp mein brain_tmp }
if {$brain_tmp == "unser"} { regsub -- unser $brain_tmp euer brain_tmp }
if {$brain_tmp == "meinem"} { regsub -- meinem $brain_tmp deinem brain_tmp }
if {$brain_tmp == "deinem"} { regsub -- deinem $brain_tmp meinem brain_tmp }
if {$brain_tmp == "eurem"} { regsub -- eurem $brain_tmp meinem brain_tmp }
if {$brain_tmp == "unserm"} { regsub -- unserm $brain_tmp eurem brain_tmp }
if {$brain_tmp == "unserem"} { regsub -- unserem $brain_tmp eurem brain_tmp }
if {$brain_tmp == "meinen"} { regsub -- meinen $brain_tmp deinen brain_tmp }
if {$brain_tmp == "deinen"} { regsub -- deinen $brain_tmp meinen brain_tmp }
if {$brain_tmp == "euren"} { regsub -- euren $brain_tmp meinen brain_tmp }
if {$brain_tmp == "unsern"} { regsub -- unsern $brain_tmp euren brain_tmp }
if {$brain_tmp == "unseren"} { regsub -- unseren $brain_tmp euren brain_tmp }
if {$brain_tmp == "meiner"} { regsub -- meiner $brain_tmp deiner brain_tmp }
if {$brain_tmp == "deiner"} { regsub -- deiner $brain_tmp meiner brain_tmp }
if {$brain_tmp == "will"} { regsub -- will $brain_tmp willst brain_tmp }
if {$brain_tmp == "willst"} { regsub -- willst $brain_tmp will brain_tmp }
if {$brain_tmp == "wollt"} { regsub -- wollt $brain_tmp will brain_tmp }
if {$brain_tmp == "wollen"} { regsub -- wollen $brain_tmp wollt brain_tmp }
if {$brain_tmp == "habe"} { regsub -- habe $brain_tmp hast brain_tmp }
if {$brain_tmp == "hast"} { regsub -- hast $brain_tmp hab brain_tmp }
if {$brain_tmp == "habt"} { regsub -- habt $brain_tmp hab brain_tmp }
if {$brain_tmp == "haben"} { regsub -- haben $brain_tmp habt brain_tmp }
if {$brain_tmp == "bin"} { regsub -- bin $brain_tmp bist brain_tmp }
if {$brain_tmp == "bist"} { regsub -- bist $brain_tmp bin brain_tmp }
if {$brain_tmp == "seid"} { regsub -- seid $brain_tmp bin brain_tmp }
if {$brain_tmp == "sind"} { regsub -- sind $brain_tmp seid brain_tmp }
if {$brain_tmp_zwo == "ich"} { regsub -- ich $brain_tmp_zwo du brain_tmp_zwo }
if {$brain_tmp_zwo == "du"} { regsub -- du $brain_tmp_zwo ich brain_tmp_zwo }
if {$brain_tmp_zwo == "ihr"} { regsub -- ihr $brain_tmp_zwo ich brain_tmp_zwo }
if {$brain_tmp_zwo == "wir"} { regsub -- wir $brain_tmp_zwo ihr brain_tmp_zwo }
if {$brain_tmp_zwo == "mir"} { regsub -- mir $brain_tmp_zwo dir brain_tmp_zwo }
if {$brain_tmp_zwo == "dir"} { regsub -- mir $brain_tmp_zwo mir brain_tmp_zwo }
if {$brain_tmp_zwo == "euch"} { regsub -- euch $brain_tmp_zwo mir brain_tmp_zwo }
if {$brain_tmp_zwo == "uns"} { regsub -- uns $brain_tmp_zwo euch brain_tmp_zwo }
if {$brain_tmp_zwo == "mein"} { regsub -- mein $brain_tmp_zwo dein brain_tmp_zwo }
if {$brain_tmp_zwo == "dein"} { regsub -- dein $brain_tmp_zwo mein brain_tmp_zwo }
if {$brain_tmp_zwo == "euer"} { regsub -- euer $brain_tmp_zwo mein brain_tmp_zwo }
if {$brain_tmp_zwo == "unser"} { regsub -- unser $brain_tmp_zwo euer brain_tmp_zwo }
if {$brain_tmp_zwo == "meinem"} { regsub -- meinem $brain_tmp_zwo deinem brain_tmp_zwo }
if {$brain_tmp_zwo == "deinem"} { regsub -- deinem $brain_tmp_zwo meinem brain_tmp_zwo }
if {$brain_tmp_zwo == "euren"} { regsub -- euren $brain_tmp_zwo meinen brain_tmp_zwo }
if {$brain_tmp_zwo == "unsern"} { regsub -- unsern $brain_tmp_zwo euren brain_tmp_zwo }
if {$brain_tmp_zwo == "unseren"} { regsub -- unseren $brain_tmp_zwo euren brain_tmp_zwo }
if {$brain_tmp_zwo == "meiner"} { regsub -- meiner $brain_tmp_zwo deiner brain_tmp_zwo }
if {$brain_tmp_zwo == "deiner"} { regsub -- deiner $brain_tmp_zwo meiner brain_tmp_zwo }
if {$brain_tmp_zwo == "will"} { regsub -- will $brain_tmp_zwo willst brain_tmp_zwo }
if {$brain_tmp_zwo == "willst"} { regsub -- willst $brain_tmp_zwo will brain_tmp_zwo }
if {$brain_tmp_zwo == "wollt"} { regsub -- wollt $brain_tmp_zwo will brain_tmp_zwo }
if {$brain_tmp_zwo == "wollen"} { regsub -- wollen $brain_tmp_zwo wollt brain_tmp_zwo }
if {$brain_tmp_drei == "ich"} { regsub -- ich $brain_tmp_drei du brain_tmp_drei }
if {$brain_tmp_drei == "du"} { regsub -- du $brain_tmp_drei ich brain_tmp_drei }
if {$brain_tmp_drei == "ihr"} { regsub -- ihr $brain_tmp_drei ich brain_tmp_drei }
if {$brain_tmp_drei == "wir"} { regsub -- wir $brain_tmp_drei ihr brain_tmp_drei }
if {$brain_tmp_drei == "mir"} { regsub -- mir $brain_tmp_drei dir brain_tmp_drei }
if {$brain_tmp_drei == "dir"} { regsub -- mir $brain_tmp_drei mir brain_tmp_drei }
if {$brain_tmp_drei == "euch"} { regsub -- euch $brain_tmp_drei mir brain_tmp_drei }
if {$brain_tmp_drei == "uns"} { regsub -- uns $brain_tmp_drei euch brain_tmp_drei }
if {$brain_tmp_drei == "meinem"} { regsub -- meinem $brain_tmp_drei deinem brain_tmp_drei }
if {$brain_tmp_drei == "deinem"} { regsub -- deinem $brain_tmp_drei meinem brain_tmp_drei }
if {$brain_tmp_drei == "euren"} { regsub -- euren $brain_tmp_drei meinen brain_tmp_drei }
if {$brain_tmp_drei == "unsern"} { regsub -- unsern $brain_tmp_drei euren brain_tmp_drei }
if {$brain_tmp_drei == "unseren"} { regsub -- unseren $brain_tmp_drei euren brain_tmp_drei }
if {$brain_tmp_drei == "meiner"} { regsub -- meiner $brain_tmp_drei deiner brain_tmp_drei }
if {$brain_tmp_drei == "deiner"} { regsub -- deiner $brain_tmp_drei meiner brain_tmp_drei }
if {$brain_tmp_drei == "mein"} { regsub -- mein $brain_tmp_drei dein brain_tmp_drei }
if {$brain_tmp_drei == "dein"} { regsub -- dein $brain_tmp_drei mein brain_tmp_drei }
if {$brain_tmp_drei == "euer"} { regsub -- euer $brain_tmp_drei mein brain_tmp_drei }
if {$brain_tmp_drei == "unser"} { regsub -- unser $brain_tmp_drei euer brain_tmp_drei }
set tmpfile [open $brain_brain_url r]
set output [split [read $tmpfile] "\r\n"]
close $tmpfile
set output_vurb [lindex $output [rand [llength $output]]]
set x_xx 1
set treffer_eins [expr $brain_treffer - $b_subbbbb]
while {$x_xx < $treffer_eins} {
incr x_xx
set sentence_out [join $output_vurb]
if {([lsearch -exact $output_vurb $brain_tmp] >-1)
&& ([lsearch -exact $output_vurb $brain_tmp_zwo] >-1)
&& ([lsearch -exact $output_vurb $brain_tmp_drei] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
break
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set x_xx 1
set treffer_eins [expr $brain_treffer - $b_sub]
while {$x_xx < $treffer_eins} {
incr x_xx
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp] >-1)
&& ([lsearch $output_vurb $brain_tmp_zwo] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set z_rq 1
set treffer_eins [expr $brain_treffer - $b_subbb]
while {$z_rq < $treffer_eins} {
incr z_rq
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp] >-1)
&& ([lsearch $output_vurb $brain_tmp_drei] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set y_rq 1
set treffer_eins [expr $brain_treffer - $b_subbb]
while {$y_rq < $treffer_eins} {
incr y_rq
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp_zwo] >-1)
&& ([lsearch $output_vurb $brain_tmp_drei] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set y_rq 1
set treffer_eins [expr $brain_treffer - $b_subbbb]
while {$y_rq < $treffer_eins} {
incr y_rq
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp_zwo] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set y_rq 1
while {$y_rq < $treffer_eins} {
incr y_rq
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp_drei] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
set y_rq 1
while {$y_rq < $treffer_eins} {
incr y_rq
set sentence_out [join $output_vurb]
if {([lsearch $output_vurb $brain_tmp] >-1)
&& ([string compare $sentence_out $sentence_in] != 0)} {
utimer [expr [llength $output_vurb]/2] [putserv "privmsg $chan :$sentence_out"]
return 0
} else {
set output_vurb [lindex $output [rand [llength $output]]]
}
}
return 1
}
putlog "*** $botsnick's Gehirn erfolgreich initialisiert. *** (brain.tcl)"
IRC Snippets