#by wiebe @ QuakeNet



#help voice pub
bind pubm vlomn|vlomn "% ${botnet-nick} help voice" c_voice:help:pub

proc c_voice:help:pub { nick uhost handle chan text } {
  lappend output "Usage: voice \[<nick1> <nick2> .. <nickN>\]"
  lappend output "Voices you on the channel. Flag +m or +n is needed to voice other users."
  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 voice msg
bind msgm vlomn|vlomn "help voice" c_voice:help:msg

proc c_voice:help:msg { nick uhost handle text } {
  lappend output "Usage: voice <channel> \[<nick1> <nick2> .. <nickN>\]"
  lappend output "Voices you on the channel. Flag +m or +n is needed to voice other users."
  lappend output "Usage: voice \[<channel1> <channel2> .. <channelN>\]"
  lappend output "Voices you on all or the given channels."
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  putcmdlog "($nick!$uhost) !$handle! $text"
}



#voice self
bind pubm vlomn|vlomn "% ${botnet-nick} voice" c_voice:pub:self

proc c_voice:pub:self { nick uhost handle chan text } {
  if { ![botisop $chan] } {
    lappend output "I am not a channel operator on $chan"
  } elseif { [matchattr $handle q|q $chan] } {
    lappend output "You can not gain voice on $chan"
  } elseif { [isvoice $nick $chan] } {
    lappend output "You are already voiced on $chan"
  } elseif { [ishalfop $nick $chan] } {
    lappend output "You are already halfopped on $chan"
  } elseif { [isop $nick $chan] } {
    lappend output "You are already opped on $chan"
  } else {
    lappend output "Voiced you on $chan"
    pushmode $chan +v $nick
  }
  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]]"
}



#voice other
bind pubm vlomn|vlomn "% ${botnet-nick} voice *" c_voice:pub:voiceother

proc c_voice:pub:voiceother { nick uhost handle chan text } {
  set targets [lrange [split $text] 2 end]
  if { ![botisop $chan] } {
    lappend output "I am not a channel operator on $chan"
  } elseif { [matchattr $handle vlo|vlo $chan] && ![matchattr $handle mn|mn $chan] } {
    lappend output "No access to voice other users on $chan (need +m or +n flag)."
  } elseif { [string equal $targets ""] } {
    lappend output "Usage: voice \[<nick1> <nick2> .. <nickN>\]"
  } else {
    set output [c_voice:voice:others $chan $targets]
  }
  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]]"
}



#voice msg
bind msg vlomn|vlomn voice c_voice:msg

proc c_voice:msg { nick uhost handle text } {
  set chan [lindex [split $text] 0]
  set targets [lrange [split $text] 1 end]

#nothing giving, or invalid chan, or no access, other check
  if { [string equal $text ""] || ![validchan $chan] || ![matchattr $handle mn|mn $chan] || [c_voice:nickorchan "$text"] } {
    if { [string equal $text ""] } { set text [channels] }
    set output [c_voice:voice:self $nick $handle "$text"]
  } elseif { ![botisop $chan] } {
     lappend output "I am not a channel operator on $chan"
  } elseif { ![string equal $targets ""] && [matchattr $handle mn|mn $chan] } {
    set output [c_voice:voice:others $chan $targets]
  }
  if { [catch {set x [cnotice $nick $output]} error] || !$x } {
    foreach t $output { puthelp "NOTICE $nick :$t" }
  }
  return 1
}



#voice user one all or given channels
proc c_voice:voice:self { nick handle channels } {
  set voicechan ""
  foreach chan [split $channels] {
    if { [validchan $chan] && [botisop $chan] && ![isvoice $nick $chan] && ![ishalfop $nick $chan] && ![isop $nick $chan] && [matchattr $handle vlomn|vlomn $chan] && ![matchattr $handle q|q $chan] } {
      lappend voicechan $chan
      pushmode $chan +v $nick
    }
  }
  if { [string equal $voicechan ""] } {
    lappend output "Found no channels to voice you on."
  } else {
    lappend output "Voiced you on: [join $voicechan]"
  }
  return $output
}



#voice targets
proc c_voice:voice:others { chan targets } {
  foreach t [split $targets] {
    if { ![isvoice $t $chan] && ![ishalfop $t $chan] && ![isop $t $chan] && ![matchattr [nick2hand $t] q|q $chan] } {
      pushmode $chan +v $t
    }
  }
  lappend output "Voiced targets on $chan"
  return $output
}



#returns if "chan1 chan2 chanN" is used or "chan nick1 nick2 nickN", returns 1 for chans
proc c_voice:nickorchan { targets } {
  if { [string equal $targets ""] } { return 1 }
  if { [string equal [llength $targets] 1] } { return 1 }
  set chanc 0; set nickc 0
  set chan [lindex [split $targets] 0]
  set targets [join [lrange [split $targets] 1 end]]
  foreach t [split $targets] {
    if { [validchan $t] || ![onchan $t $chan] || [isvoice $t $chan] || [ishalfop $t $chan] || [isop $t $chan] || [string match {[#&]*} $t] } {
      incr chanc 1
    } elseif { [onchan $t $chan] } { incr nickc 1 }
  }
  if { $chanc >= $nickc } { return 1 } else { return 0 }
}

