# Description: Adds support for halfop user mode (% / +h) procs raw_353 raw_MODE DeleteUser ishalfop proc raw_353 {header line} { global names info last set chan [string tolower [lindex $header end]] if {[info exists info(window,$chan)]} { if {$last != "353"} {array unset names [globescape $chan],*} foreach nick [split $line] { if {$nick == ""} {continue} if {[string match {@*} $nick]} { set nick [string trimleft $nick @] set names($chan,[string tolower $nick],o) $nick } elseif {[string match {+*} $nick]} { set nick [string trimleft $nick +] set names($chan,[string tolower $nick],v) $nick } elseif {[string match {%*} $nick]} { set nick [string trimleft $nick %] set names($chan,[string tolower $nick],h) $nick } else { set names($chan,[string tolower $nick],n) $nick } lappend names($chan,[string tolower $nick],a) $nick } } else { Echo .0 "( 353 ) $chan: $line" numeric } } proc raw_MODE {header line} { global info me names if {[string equal -nocase $me [lindex $header 2]]} { Echo .0 "\[ mode \] $me sets umode $line" {mode default} Send "MODE $me" foreach mchar [split $line {}] { if {[string match {[-+]} $mchar]} {set dir $mchar; continue} lappend mode $dir$mchar } Event umode "mode mode" return } lappend header $line set channel [string tolower [lindex $header 2]] if {![winfo exists $info(window,$channel)]} {return} set nick [lindex [split [lindex $header 0] !] 0] set address [lindex [split [lindex $header 0] !] 1] set mode [lindex $header 3] set line [lrange $header 4 end] Echo $info(window,$channel) "\[ mode \] $nick sets mode $mode [join $line]" {mode default} if {![string match *.* $nick]} {ialadd $channel $nick $address} set i 0 set do {} foreach mchar [split $mode {}] { if {[string match {[-+]} $mchar]} {set dir $mchar; continue} lappend newmode $dir$mchar if {[string match {[ohvbekl]} $mchar]} { if {$mchar == "l" && $dir == "-"} {continue} lappend do $dir$mchar [lindex $line $i] incr i } } set key {} set limit {} foreach {mchar arg} $do { switch -glob -- $mchar { {?[ovh]} { if {[ListChange $info(window,$channel) $channel $arg $arg $mchar]} { Event [string map {+ {} - de o op v voice h halfop} $mchar] "nick nick address address channel channel arg tnick" $channel $nick!$address $arg } } ?b {Event [string map {+ {} - un} $mchar]ban "nick nick address address channel channel arg ban" $channel $nick!$address} ?e {Event [string map {+ {} - un} $mchar]exception "nick nick address address channel channel arg exception" $channel $nick!$address} ?k {set key $arg} ?l {set limit $arg} } } if {![regexp {^[ohvbe+-]+$} $mode]} { after cancel [list Send "MODE $channel"] after 350 [list Send "MODE $channel"] Event mode "nick nick address address channel channel newmode mode key key limit limit" $channel $nick!$address } if {[string match -nocase *$me* [join $line]]} {UpdateTitle $info(window,$channel)} } proc DeleteUser {chan nick} { global names info set nick2 [string tolower $nick] set win $info(window,$chan) unset -nocomplain names($chan,$nick2,a) names($chan,$nick2,v) names($chan,$nick2,o) names($chan,$nick2,h) $win.middle.right.nicks.list delete [ListFind $win $nick] ListUpdateLabel $win ialdel $chan $nick } proc ishalfop {channel nick} { global names info return [expr {[info exists info(window,$channel)] && [info exists names($channel,[string tolower $nick],h)]}] }