#by wiebe @ QuakeNet


#channel info chan returns these (some nameless) options first:
#chanmode idle-kick stopnethack-mode revenge-mode need-op need-invite need-key need-unban need-limit flood-chan flood-ctcp flood-join flood-kick flood-deop flood-nick aop-delay ban-time exempt-time invite-time



#help chaninfo pub
bind pubm omn|omn "% ${botnet-nick} help chaninfo" c_chaninfo:help:pub

proc c_chaninfo:help:pub { nick uhost handle chan text } {
  lappend output "Usage: chaninfo \[<setting>\]"
  lappend output "Shows the current channel settings. Without parameter, shows eggdrop's default channel settings. When using a setting name or a wildcardmatch it will be matched against custom flags."
  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 chaninfo msg
bind msgm omn|omn "help chaninfo" c_chaninfo:help:msg

proc c_chaninfo:help:msg { nick uhost handle text } {
  lappend output "Usage: chaninfo <channel> \[<setting>\]"
  lappend output "Shows the current channel settings. Without parameter, shows eggdrop's default channel settings. When using a setting name or a wildcardmatch it will be matched against custom flags."
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putcmdlog "($nick!$uhost) !$handle! $text"
}



#chaninfo pub
bind pubm omn|omn "% ${botnet-nick} chaninfo" c_chaninfo:pub
bind pubm omn|omn "% ${botnet-nick} chaninfo *" c_chaninfo:pub

proc c_chaninfo:pub { nick uhost handle chan text } {
  set match [join [lrange [split $text] 2 end]]
  set results [c_chaninfo:get $chan $match]
  set output2 ""
  if { ![string equal $results ""] } {
    foreach result [split $results] {
      if { [string length $output2] > "400" } {
        lappend output $output2
        set output2 ""
      }
      lappend output2 $result
    }
    if { ![string equal $output2 ""] } {
      lappend output $output2
    }
      if { [string equal $match ""] } {
        lappend output "End of list for default flags on $chan"
      } else {
        lappend output "End of list for settings matching $match on $chan"
      }
  } else {
    lappend output "No matching settings found for $match 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]]"
}



#chaninfo msg
bind msg omn|omn chaninfo commands:msg:chaninfo

proc commands:msg:chaninfo { nick uhost handle text } {
  set chan [lindex [split $text] 0]
  set match [join [lrange [split $text] 1 end]]
  if { [string equal $chan ""] } {
    lappend output "chaninfo <channel> \[<setting>\]"
  } elseif { (![validchan $chan] && ![string equal $chan ""]) || (![matchattr $handle omn|omn $chan]) } {
    lappend output "No access or unknown channel $chan"
  } else {
    set results [c_chaninfo:get $chan $match]
    set output2 ""
    if { ![string equal $results ""] } {
      foreach result $results {
        if { [string length $output2] > "400" } {
          lappend output $output2
          set output2 ""
        }
        lappend output2 $result
      }
      if { ![string equal $output2 ""] } {
        lappend output $output2
      }
      if { [string equal $match ""] } {
        lappend output "End of list for default flags on $chan"
      } else {
        lappend output "End of list for settings matching $match on $chan"
      }
    } else {
      lappend output "No matching settings found for $match on $chan"
    }
  }
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  return 1
}



#this gets the channel info
proc c_chaninfo:get { chan {match ""} } {
  set output ""
  if { ![validchan $chan] } { return }
  if { [string equal $match ""] } {
    set settings "chanmode idle-kick aop-delay revenge-mode ban-time exempt-time invite-time flood-chan flood-ctcp flood-join flood-kick flood-deop flood-nick"
    foreach setting $settings {
      set value [channel get $chan $setting]
      lappend output "\002$setting\002=$value"
    }
    set settings "inactive greet protectops bitch enforcebans protecthalfops dynamicexempts statuslog seen protectfriends autoop dynamicbans secret cycle revenge autovoice userbans dynamicinvites shared dontkickops revengebot nodesynch autohalfop userinvites"
    foreach setting [lsort $settings] {
      if { [channel get $chan $setting] } {
        lappend output \002+$setting\002
      } else {
        lappend output -$setting
      }
    }
  } else {
    set settings [channel info $chan]
    set settings [lrange $settings 43 end]
    set settings [lsort $settings]
    foreach setting $settings {
      regsub -all {\[} $match {\\[} match
      regsub -all {\]} $match {\\]} match
      regsub -all {\\} $match {\\\\} match
      if { [string match -nocase $match [lindex [split $setting] 0]] } {
        if { [string match +* $setting] } {
          lappend output \002$setting\002
        } elseif { [string match -* $setting] } {
          lappend output $setting
        } else {
          lappend output "     [lindex $setting 0]=[join [lrange $setting 1 end]]"
        }
      }
    }
  }
  return [join $output]
}

