From 9b25c0a5e86e7d434832c275c121fb730b96bb0e Mon Sep 17 00:00:00 2001 From: Aleteoryx Date: Sat, 3 Aug 2024 23:44:51 +0100 Subject: [PATCH] meta management --- irc.tcl | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/irc.tcl b/irc.tcl index 170f121..f7e1c6d 100755 --- a/irc.tcl +++ b/irc.tcl @@ -140,6 +140,41 @@ namespace eval ::irc { } } + proc ::irc::meta {subcommand chan args} { + switch -- $subcommand { + exists { + if {[llength $args] != 1} { return -code error "wrong # args: should be \"irc::meta exists chan key\"" } + + dict exists [set chan.handlers($chan)] {*}$args + } + remove { + if {[llength $args] != 1} { return -code error "wrong # args: should be \"irc::meta remove chan key\"" } + + dict remove chan.handlers($chan) {*}$args + } + get { + if {[llength $args] ni {0 1}} { return -code error "wrong # args: should be \"irc::meta get chan ?key?\"" } + + if [catch { dict get [set chan.handlers($chan)] {*}$args } result options] { + return -options options [regsub {dictionary$} $result "channel meta"] + } else { + return -options options $result + } + } + set { + if {[llength $args] != 2} { return -code error "wrong # args: should be \"irc::meta set chan key value\"" } + + dict set chan.handlers($chan) {*}$args + } + read { + if [llength $args] { return -code error "wrong # args: should be \"irc::meta read chan\"" } + + set chan.handlers($chan) + } + default { return -code error "unknown subcommand \"$subcommand\": must be exists, get, remove, or set" } + } + } + # nodoc proc ::irc::int-setaliases {interp} { $interp alias irc::is @@ -152,6 +187,7 @@ namespace eval ::irc { $interp alias irc::src $interp alias irc::tags $interp alias irc::patlist + $interp alias irc::meta } # nodoc @@ -175,9 +211,9 @@ namespace eval ::irc { srctype $srctype \ srcparts $srcparts \ cmd $cmd \ - params $params \ - meta [set chan.meta($chan)]] + params $params] + set matchedany false foreach handler [set chan.handlers($chan)] { set rest [lassign $handler patlist type id] @@ -199,6 +235,7 @@ namespace eval ::irc { } if !$matched { continue } + set matchedany true switch -- $type { chan { lassign $rest writer interp @@ -225,6 +262,9 @@ namespace eval ::irc { } } } + if !$matchedany { + puts stderr "irc warning: unmatched command on channel \"$chan\": $msg" + } } # documented @@ -647,10 +687,17 @@ namespace eval ::irc { } } -set chan [irc::connect localhost 8000 0] +set chan [irc::connect irc.libera.chat 6697 1] puts $chan irc::listen on $chan -lassign [chan pipe] ichan ochan -irc::extern add $chan * $ochan $ichan +#lassign [chan pipe] ichan ochan +irc::extern add $chan * stdout stdin + +#fileevent stdin readable { set input [gets stdin] } -vwait foo +set input "" + +while 1 { + vwait input + eval $input +} -- 2.43.4