#by wiebe @ Quakenet



#help clearmode pub
bind pubm mn|mn "% ${botnet-nick} help clearmode" c_clearmode:help:pub

proc c_clearmode:help:pub { nick uhost handle chan text } {
  lappend output "Usage: clearmode <modes>"
  lappend output "Clears the given modes from the channel. -all can be used to clear all modes."
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putloglev c $chan "[lindex [split $text] 1]: $nick $uhost $handle $chan [join [lrange [split $text] 2 end]]"
}



#help clearmode msg
bind msgm mn|mn "help clearmode" c_clearmode:help:msg

proc c_clearmode:help:msg { nick uhost handle text } {
  lappend output "Usage: clearmode <channel> <modes>"
  lappend output "Clears the given modes from the given channel. -all can be used to clear all modes."
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putcmdlog "($nick!$uhost) !$handle! $text"
}



#clearmode pub
bind pubm mn|mn "% ${botnet-nick} clearmode" c_clearmode:pub
bind pubm mn|mn "% ${botnet-nick} clearmode *" c_clearmode:pub

proc c_clearmode:pub { nick uhost handle chan text } {
  set clearmode [lindex [split $text] 2]
  if { ![botisop $chan] && ![botishalfop $chan] } {
    lappend output "I am not a channel operator on $chan"
  } elseif { [string equal $clearmode ""] } {
    lappend output "Usage: clearmode <channel> <modes>"
  } elseif { ![c_clearmode:parse $handle $chan $clearmode] } {
    lappend output "Failed to clear any modes on $chan"
  } else {
    lappend output "Cleared modes $clearmode on $chan"
  }
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putloglev c $chan "[lindex [split $text] 1]: $nick $uhost $handle $chan [join [lrange [split $text] 2 end]]"
}



#clearmode msg
bind msg mn|mn clearmode c_clearmode:msg

proc c_clearmode:msg { nick uhost handle text } {
  set chan [lindex [split $text] 0]
  set clearmode [lindex [split $text] 1]
  if { ![validchan $chan] && ![string equal $chan ""] } {
    lappend output "No access or unknown channel $chan"
  } elseif { [string equal $chan ""] || [string equal $clearmode ""] } {
    lappend output "Usage: clearmode <channel> <modes>"
  } elseif { ![matchattr $handle mn|mn $chan] } {
    lappend output "No access or unknown channel $chan"
  } elseif { ![botisop $chan] && ![botishalfop $chan] } {
    lappend output "I am not a channel operator on $chan"  } elseif { ![c_clearmode:parse $handle $chan $clearmode] } {
    lappend output "Failed to clear any modes on $chan"
  } else {
    lappend output "Cleared modes $clearmode on $chan"
  }
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  return 1
}



#parse modes
proc c_clearmode:parse { handle chan clearmode } {

  set s 0
  set f 0

  if { [string equal -nocase $clearmode -all] } {
    set clearmode [lindex [split [getchanmode $chan]] 0]bohv
  }

#clear bans
  if { [string match *b* $clearmode] && ![string equal [chanbans $chan] ""] } {
    putserv "MODE $chan +b-b * *"
    set s 1
  }

#key
  if { [string match *k* $clearmode] && [string match *k* [lindex [split [getchanmode $chan]] 0]] } {
    set k 1
    foreach n [split [lindex [split [getchanmode $chan]] 0] ""] {
      if { [string equal $n k] } { break }
      if { [string equal $n l] } { incr k 1 }
    }
    set key [lindex [split [getchanmode $chan]] $k]
    if { ![string equal $key ""] } {
      pushmode $chan -k $key
      set f 1
    }
  }

#other modes
  foreach m [split $clearmode ""] {
   if { [string match {[imnpstrDcCNul]} $m] && [string match *$m* [lindex [split [getchanmode $chan]] 0]] } {
      pushmode $chan -$m
      set f 1
    }
  }

#user modes
  if { [regexp {[ohv]} $clearmode] && [matchattr $handle mn|mn $chan] } {
#check all users
    foreach nick [chanlist $chan] {
#op
      if { [string match *o* $clearmode] && [isop $nick $chan] && ![isbotnick $nick] && ![matchattr [nick2hand $nick] bmn|mn $chan] && [botisop $chan] } {
        pushmode $chan -o $nick
        set f 1
      }
#halfop
      if { [string match *h* $clearmode] && [ishalfop $nick $chan] && [botisop $chan] } {
        pushmode $chan -h $nick
        set f 1
      }
#voice
      if { [string match *v* $clearmode] && [isvoice $nick $chan] } {
        pushmode $chan -v $nick
        set f 1
      }
    }
  }
  if { $f } { flushmode $chan }
  if { $f || $s } { return 1 } else { return 0 }
}

