About This File
# match.tcl
#
# This script was originally created to save clan matches in a file,
# to show all the saved matches and to be able to remove them from
# the file again. But it could be used for storing, showing and
# deleting arbitrary lines of text in a file.
#
# Usage:
# !addmatch match add match to the file/list.
# !showmatch show the saved matches.
# !delmatch number remove match with number (as shown
# by !showmatch) from the file/list.
# The numbers of remaining matches
# might change.
#
# The command names can be changed in the config section below.
#
# Enable for a channel with: .chanset #channel +match
# Disable for a channel with: .chanset #channel -match
#
# See https://github.com/hwipl/eggdrop-scripts for the latest version and
# additional information including the license (MIT).
# tested versions, might run on earlier versions
package require Tcl 8.6
package require eggdrop 1.8.4
# Config:
namespace eval ::match {
# channel flag for enabling/disabling
setudef flag match
# Name and/or path of the file you want to store the matches in and its
# backup file. Channel name will be prepended to file name
variable filename "matches.lst"
variable filenamebak "matches.lst.bak"
# Names of the commands for adding, deleting and showing
variable addcommand "!addmatch"
variable delcommand "!delmatch"
variable showcommand "!showmatch"
}
# End of Config
# this procedure shows the saved matches:
proc ::match::show {nick host hand chan arg} {
variable filename
# check channel flag if enabled in this channel
if {![channel get $chan match]} {
return 0
}
# check if file exists and contains matches
set mfile ${chan}.${filename}
set nomatches "No matches found."
if {![file exists $mfile] || [file size $mfile] == 0} {
puthelp "PRIVMSG $chan :$nomatches"
return 0
}
# read all matches from file
if {[catch {open $mfile r} input]} {
puthelp "PRIVMSG $nick :Error opening file: $input"
return 0
}
while {[gets $input line] >= 0} {
lappend matches $line
}
close $input
# show each match as a message in the channel
puthelp "PRIVMSG $chan :*** Match List ***"
for { set i 0 } { $i < [llength $matches] } { incr i } {
puthelp "PRIVMSG $chan :([expr $i +1]) [lindex $matches $i]"
}
puthelp "PRIVMSG $chan :*** End of Match List ***"
return 1
}
# this procedure deletes saved matches:
proc ::match::del {nick host hand chan arg} {
variable filename
variable filenamebak
# check channel flag if enabled in this channel
if {![channel get $chan match]} {
return 0
}
# arg containing the match id must be present
if {$arg == ""} {
return 0
}
# check if file exists and contains matches
set mfile ${chan}.${filename}
set mfilebak ${chan}.${filenamebak}
set noexist "Match does not exist."
if {![file exists $mfile] || [file size $mfile] == 0} {
puthelp "PRIVMSG $nick :$noexist"
return 0
}
# read all matches from file
if {[catch {open $mfile r} input]} {
puthelp "PRIVMSG $nick :Error opening file: $input"
return 0
}
while {[gets $input line] >= 0} {
lappend matches $line
}
close $input
# backup matches file
file copy -force $mfile $mfilebak
# write matches back to file
if {[catch {open $mfile w} output]} {
putshelp "PRIVMSG $nick :Error opening file: $output"
return 0
}
set deleted 0
for { set i 0 } { $i < [llength $matches] } { incr i } {
# omit the match that should be deleted
if {[expr $i +1] == $arg} {
set deleted 1
continue
}
puts $output "[lindex $matches $i]"
}
close $output
# send result back to caller
if {$deleted == 0} {
puthelp "PRIVMSG $nick :$noexist"
return 0
}
puthelp "NOTICE $nick :Match number $arg deleted."
return 1
}
# this procedure adds matches to the list:
proc ::match::add {nick host hand chan arg} {
variable filename
# check channel flag if enabled in this channel
if {![channel get $chan match]} {
return 0
}
# arg containing the match must be present
if {$arg == ""} {
return 0
}
# write match to file
set mfile ${chan}.${filename}
if {[catch {open $mfile a} output]} {
puthelp "PRIVMSG $nick :Error opening file: $output"
return 0
}
puts $output "$nick: $arg"
close $output
puthelp "NOTICE $nick :Match added."
return 1
}
namespace eval ::match {
bind pub - $showcommand ::match::show
bind pub - $addcommand ::match::add
# bind pub o|o $delcommand ::match::del
bind pub - $delcommand ::match::del
putlog "Loaded match.tcl"
}