#by wiebe @ QuakeNet
#support * as target



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

proc c_chanset:help:pub { nick uhost handle chan text } {
  lappend output "Usage: chanset <setting> \[<setting> .. <setting>\]"
  lappend output "Sets channel options, such as +autoop +autovoice etc. Use space seperate list for multiple settings."
  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 chanset msg
bind msgm mn|mn "help chanset" c_chanset:help:msg

proc c_chanset:help:msg { nick uhost handle text } {
  lappend output "Usage: chanset <channel> <setting> \[<setting> .. <setting>\]"
  lappend output "Sets channel options, such as +autoop +autovoice etc. Use space seperate list for multiple settings."
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putcmdlog "($nick!$uhost) !$handle! $text"
}



#chanset pub
bind pubm mn|mn "% ${botnet-nick} chanset" c_chanset:pub
bind pubm mn|mn "% ${botnet-nick} chanset *" c_chanset:pub

proc c_chanset:pub { nick uhost handle chan text } {
  set settings [join [lrange [split $text] 2 end]]
  if { ![string equal $settings ""] } {
    set output [c_chanset:set $chan $settings]
  } else { lappend output "Usage: chanset <setting> \[<setting> .. <setting>\]" }
  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]]"
}



#chanset msg
bind msg mn|mn chanset commands:msg:chanset

proc commands:msg:chanset { nick uhost handle text } {
  set chan [lindex [split $text] 0]
  set settings [join [lrange [split $text] 1 end]]
  if { (![validchan $chan] && ![string equal $chan ""]) || (![matchattr $handle mn|mn $chan]) } {
    lappend output "No access or unknown channel $chan"
  } elseif { [string equal $settings ""] || [string equal $chan ""] } {
    lappend output "Usage: chanset <channel> <setting> \[<setting> .. <setting>\]"
  } else { set output [c_chanset:set $chan $settings] }
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  return 1
}



#this makes the actual changes and returns the results, like the .chanset command
#disallow need-* modes
proc c_chanset:set { chan settings } {
  set p 0; set s ""; set r ""
  foreach setting [split $settings] {
    incr p 1
    if { [string match -* $setting] || [string match +* $setting] } {
      if { [catch {channel set $chan $setting} error] } {
        lappend r "Error trying to set $setting for $chan, invalid mode."
      } else { lappend s "$setting" }
    } elseif { ![string equal [lsearch "need-op need-invite need-key need-unban need-limit" [string tolower $setting]] -1] } {
      lappend r "Not allowed to set need-op, need-invite, need-key, need-unban, or need-limit modes."
      break
    } else {
      set param [join [lrange [split $settings] $p end]]
      if { [catch {channel set $chan $setting $param} error] } {
        lappend r "Error trying to set $setting for $chan, invalid option."
      } else { lappend s "$setting \{ $param \}" }
      break
    }
  }
  if { ![string equal $s ""] } { lappend r "Successfully set modes \{ [join $s] \} on $chan" }  return $r
}

