Code: Select all
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # #
# avl (autovoicelist) - Script v1.0 by stylus740 #
# # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
###############################################################################
# History: #
# 1.0 Erstes Release #
###############################################################################
##
# verwaltet eine Liste von Nicks, die im Channel autovoice erhalten
##
# In welchen Channels soll das Script aktiv sein?
# Die Definition erfolgt durch Setzen von +avl in der Partyline im Bot
#
# .chanset #channel +avl
# Definition des Datenfiles für berechtigte User
set avl_ni(datafile) "scripts/avl.dat"
###############################################################################
# Mögliche Befehle in der Partyline: #
# #
# .chanset #chan +avl Aktivierung des scripts in Channel #chan #
# .chanset #chan -avl Deaktivierung des scripts in Channel #chan #
# .avlhelp Hilfen zur Bedienung #
# .addvoice nick User zur Liste hinzufügen #
# .delvoice nick User von Liste löschen #
# .listvoice Einträge anzeigen #
###############################################################################
### Ab hier nur editieren, wenn man genau weiß, was man tut. Beginn des Codes ###
setudef flag avl ;# Zur Aktivierung der userdefined flags
set avl_ni(version) v1.0 ;# Variable für Version setzten
bind dcc n|n addvoice add_users ;# User hinzufügen
bind dcc n|n delvoice del_users ;# User hinzufügen
bind dcc n|n listvoice list_users ;# User anzeigen
bind dcc n|n avlhelp help_users ;# Hilfe anzeigen
bind msg n|n addvoice m_add_users ;# User hinzufügen
bind msg n|n delvoice m_del_users ;# User hinzufügen
bind msg n|n listvoice m_list_users ;# User anzeigen
bind msg n|n avlhelp m_help_users ;# Hilfe anzeigen
bind join - * join:avl_check
bind nick - * nick:avl_check
proc help_users {handle idx args} {
putlog "avl ermöglicht es Usern, die von einer berechtigten Person in einer Liste gespeichert sind"
putlog "auto-voice durch den Bot erteilen zu lassen. (Nützlich in Support Channels, wo oft User nicht"
putlog "registriert sind."
putlog "Die Steuerung von avl erfolgt über die Partyline mit den folgenden Befehlen:"
putlog " "
putlog ".addvoice <nick> <chan> Nick mit Channel hinzufügen oder ändern"
putlog ".delvoice <nick> <chan> Den angegebenen Nick löschen"
putlog ".listvoice Sämtliche berechtigten User-Einträge anzeigen"
putlog ".avlhelp Diese Hilfemeldung anzeigen"
}
proc m_help_users {nick host hand args} {
puthelp "PRIVMSG $nick :avl ermöglicht es Usern, die von einer berechtigten Person in einer Liste gespeichert sind"
puthelp "PRIVMSG $nick :auto-voice durch den Bot erteilen zu lassen. (Nützlich in Support Channels, wo oft User nicht"
puthelp "PRIVMSG $nick :registriert sind."
puthelp "PRIVMSG $nick :Die Steuerung von avl erfolgt über ein Query mit dem Bot mit den folgenden Befehlen:"
puthelp "PRIVMSG $nick : "
puthelp "PRIVMSG $nick :/msg <bot> addvoice <nick> <chan> Nick mit Channel hinzufügen oder ändern"
puthelp "PRIVMSG $nick :/msg <bot> delvoice <nick> <chan> Den angegebenen Nick löschen"
puthelp "PRIVMSG $nick :/msg <bot> listvoice Sämtliche berechtigten User-Einträge anzeigen"
puthelp "PRIVMSG $nick :/msg <bot> avlhelp Diese Hilfemeldung anzeigen"
}
proc init_users {} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
if {[file exists $avl_ni(datafile)]} { ;# Falls File vorhanden
putlog "Laden Userdaten aus $avl_ni(datafile)" ;# Lademeldung
set in [open $avl_ni(datafile) r] ;# Datenfile im read modus öffnen
while {![eof $in]} { ;# solange kein EOF
set vline [gets $in] ;# Zeile holen
if {[eof $in]} {break} ;# Falls EOF, Ende von while
set inick [lindex [split $vline] 0] ;# Nick extrahieren
set ichan [join [lrange [split $vline] 1 end]] ;# Channel extrahieren
set ientry "$inick&$ichan" ;# Kombination Nick&Chan bauen
set avl_nick($ientry) $ientry ;# Array Datenfeld belegen
} ;# End while
close $in ;# Datei schließen
} ;# End If (dataexist)
} ;# End Procedure
init_users
proc list_users {handle idx args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
if {[info exists avl_nick]} { ;# Falls Felder definiert sind
putlog "Eingetragene Nick für avl:" ;# Überschrift anzeigen
foreach search [array names avl_nick] { ;# Für jeden Eintrag
if {$search != 0} { ;# wenn kein leerer Eintrag
set acmd [split $search "&"] ;# Eintrag bei "&" aufsplitten
set inick [lindex $acmd 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
putlog "$inick $ichan" ;# Zeile anzeigen
} ;# End if (search)
} ;# End foreach
} else { ;# Falls keine Struktur vorhanden
putlog "Keine Daten gespeichert" ;# Fehler anzeigen
} ;# End if
} ;# End Procedure
proc add_users {handle idx args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
set acmd [lindex $args 0] ;# Befehlszeile extrahieren
set inick [lindex [split $acmd] 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
set ientry "$inick&$ichan" ;# Kombination Nick&Chan bauen
set avl_nick($ientry) $ientry ;# Array Datenfeld (neu) belegen
writefile ;# Datei schreiben
putlog "User $inick mit Chan $ichan in $avl_ni(datafile) hinzugefügt"
if {[onchan $inick $ichan]} {
pushmode $ichan +v $inick ;# direkt +v setzen
}
} ;# End Procedure
proc del_users {handle idx args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
set acmd [lindex $args 0] ;# Befehlszeile extrahieren
set inick [lindex [split $acmd] 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
set ientry "$inick&$ichan" ;# Eintrag nick&chan montieren
if {([info exists avl_nick($ientry)])} { ;# wenn der Eintrag existiert
unset avl_nick($ientry) ;# Array Datenfeld freigeben
writefile
putlog "Eintrag $ientry aus $avl_ni(datafile) gelöscht" ;# Löschmeldung
} else { ;# Falls Nick nicht vorhanden
putlog "Eintrag $ientry ist nicht gespeichert!" ;# Infomeldung
} ;# End if (info)
if {[onchan $inick $ichan]} {
pushmode $ichan -v $inick ;# direkt -v setzen
}
} ;# End Procedure
proc m_list_users {nick host hand args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
if {[info exists avl_nick]} { ;# Falls Felder definiert sind
puthelp "PRIVMSG $nick :Eingetragene Nick für avl:" ;# Überschrift anzeigen
foreach search [array names avl_nick] { ;# Für jeden Eintrag
if {$search != 0} { ;# wenn kein leerer Eintrag
set acmd [split $search "&"] ;# Eintrag bei "&" aufsplitten
set inick [lindex [split $acmd] 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
puthelp "PRIVMSG $nick :$inick $ichan" ;# Zeile anzeigen
} ;# End if (search)
} ;# End foreach
} else { ;# Falls keine Struktur vorhanden
puthelp "PRIVMSG $nick :Keine Daten gespeichert" ;# Fehler anzeigen
} ;# End if
} ;# End Procedure
proc m_add_users {nick host hand args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
set acmd [lindex $args 0] ;# Befehlszeile extrahieren
set inick [lindex [split $acmd] 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
set ientry "$inick&$ichan" ;# Kombination Nick&Chan bauen
set avl_nick($ientry) $ientry ;# Array Datenfeld (neu) belegen
writefile ;# Datei schreiben
puthelp "PRIVMSG $nick :User $inick mit Chan $ichan in $avl_ni(datafile) hinzugefügt"
if {[onchan $inick $ichan]} {
pushmode $ichan +v $inick ;# direkt +v setzen
}
} ;# End Procedure
proc m_del_users {nick host hand args} {
global avl_nick avl_ni ;# Datenstrukturen public definieren
set acmd [lindex $args 0] ;# Befehlszeile extrahieren
set inick [lindex [split $acmd] 0] ;# erstes Argument ist Nick
set inick [form $inick] ;# Nick formatieren
set ichan [join [lrange [split $acmd] 1 end]] ;# Der gesamte Rest ist der Channel
set ichan [form $ichan] ;# Chan formatieren
set ientry "$inick&$ichan" ;# Eintrag nick&chan montieren
if {([info exists avl_nick($ientry)])} { ;# wenn der Eintrag existiert
unset avl_nick($ientry) ;# Array Datenfeld freigeben
writefile
puthelp "PRIVMSG $nick :Eintrag $ientry aus $avl_ni(datafile) gelöscht" ;# Löschmeldung
} else { ;# Falls Nick nicht vorhanden
puthelp "PRIVMSG $nick :Eintrag $ientry ist nicht gespeichert!" ;# Infomeldung
} ;# End if (info)
if {[onchan $inick $ichan]} {
pushmode $ichan +v $inick ;# direkt -v setzen
}
} ;# End Procedure
### Bei einem Join wird dann Voice gegeben, wenn der Nick im Datenfile steht
proc join:avl_check {nick uhost handle chan} {
global botnick avl_nick
if {![avl:active $chan]} { return 0 } ;# falscher Channel: nix machen
set chan [string tolower $chan] ;# Channel in Kleinschreibung
if ([isop $botnick $chan]) { ;# Wenn Bot im Channel Op hat
foreach search [array names avl_nick] { ;# Liste aller Einträge durchlaufen
if {$search != 0} { ;# wenn kein leerer Eintrag
set ientry [string tolower $avl_nick($search)] ;# Eintrag (nick&#chan) extrahieren
set parts [split $ientry "&"]
set inick [lindex $parts 0] ;# Nick extrahieren
set ichan [lindex $parts 1] ;# Chan extrahieren
if {($nick == $inick) && ($chan == $ichan)} {
pushmode $chan +v $nick ;# +v setzen
}
} ;# end if search
} ;# end for eache
} else { ;# bot hat gar kein op
putlog "Habe kein op op und hole es mir neu" ;# Meldung "kein op"
putserv "chanserv op $chan $botnick"
} ;# end if (botisop)
} ;# end procedure
proc nick:avl_check {nick uhost handle chan newnick} {
global botnick avl_nick
if {![avl:active $chan]} { return 0 } ;# falscher Channel: nix machen
set chan [string tolower $chan] ;# Channel in Kleinschreibung
if ([isop $botnick $chan]) { ;# Wenn Bot im Channel Op hat
foreach search [array names avl_nick] { ;# Liste aller Einträge durchlaufen
if {$search != 0} { ;# wenn kein leerer Eintrag
set ientry [string tolower $avl_nick($search)] ;# Eintrag (nick&#chan) extrahieren
set parts [split $ientry "&"]
set inick [lindex $parts 0] ;# Nick extrahieren
set ichan [lindex $parts 1] ;# Chan extrahieren
if {($nick == $inick) && ($chan == $ichan)} {
pushmode $chan +v $newnick ;# +v setzen
}
} ;# end if search
} ;# end foreach
} else { ;# bot hat gar kein op
putlog "Habe kein op op und hole es mir neu" ;# Meldung "kein op"
putserv "chanserv op $chan $botnick"
} ;# end if (botisop)
} ;# end procedure
proc form {formtext} { ;# Formatierung String
set t [string trimleft $formtext] ;# führende Leerzeichen entfernen
set t [string trimright $t] ;# folgende Leerzeichen entfernen
return $t ;# formatierten String zurückliefern
}
proc writefile {} {
global avl_nick avl_ni
set out [open $avl_ni(datafile) w] ;# Datenfile im w modus öffnen (überschreiben)
foreach search [array names avl_nick] { ;# durchlaufen der Daten arrays
if {$search != 0} { ;# wenn keine leere Zeile
set parts [split $search "&"] ;# Eintrag bei "&" aufsplitten
set inick [lindex $parts 0] ;# Nick extrahieren
set ichan [lindex $parts 1] ;# Channel extrahieren
set output "$inick $ichan" ;# Output montieren
puts $out $output ;# Zeile schreiben
} ;# End if (search)
} ;# End Foreach
close $out ;# Datei schließen
} ;# End procedure
proc avl:active {chan} {
foreach setting [channel info $chan] { ;# "channel info" ist ein TCL Befehl!
if {[regexp -- {^[\+-]} $setting]} {
if {$setting == "+avl"} { return 1 }
}
}
return 0
}
putlog "avl (autovoicelist) von stylus740 geladen. (Stand 12.02.05)"
putlog "Eingabe von \.avlhelp bzw. \/msg $botnick avlhelp zeigt Bedienungshinweise an"