####################################################
# by wiebe @ QuakeNet
#
#
# script sets the desired usermodes on connect/oper
#
# [umode] returns current usermodes
# umode +-modes, sets usermodes
#
# .umode [-+modes] can be used on the partyline
#
####################################################

# set here the usermodes to set on connect
set usermode(connect) "+ix-dwR"

# set here the usermodes to set after /oper
set usermode(oper) "+gws"

# set here the usermodes to set after setting umode -o/O
set usermode(deoper) "-gws"

####################################################
# usermode:evnt
####################################################
bind evnt -|- init-server usermode:evnt
proc usermode:evnt { type } {
  global botnick usermode
  if {[info exists usermode(connect)] && ![string equal $usermode(connect) ""]} {
    putquick "MODE $botnick $usermode(connect)"
  }
  putquick "MODE $botnick"
}


####################################################
# umodeis
#
# numeric: 221    RPL_UMODEIS
# format: <source> 221 <target> +[<user_modes>]
# info: returned when requesting your usermodes with the MODE command
# example: irc.quakenet.org 221 woobie +ix
####################################################
bind raw -|- "221" usermode:umodeis

proc usermode:umodeis { server numeric text } {
  global usermode
  set usermode(umodeis) [join [lrange [split $text] 1 end]]
}


####################################################
# usermode:mode
####################################################
bind raw -|- "MODE" usermode:mode
proc usermode:mode { server numeric text } {
  if {![isbotnick [lindex [split $text] 0]]} { return 0 }
  global botnick usermode
  if {![info exists usermode(umodeis)]} { set usermode(umodeis) "" }
  set modes [lindex [split $text] 1]; set add ""; set del ""
  putloglev d * "usermode: $modes"
  regexp {\+([^-]+)} $modes add add
  regexp {\-([^+]+)} $modes del del
  foreach m [split $add ""] {
    append usermode(umodeis) $m
    if {![string equal -nocase $m "o"]} { continue }
    if {![info exists usermode(oper)]} { continue }
    if {[string equal $usermode(oper) ""]} { continue }
    putquick "MODE $botnick $usermode(oper)"
  }
  foreach m [split $del ""] {
    set usermode(umodeis) [string map "$m \"\"" $usermode(umodeis)]
    if {![string equal -nocase $m "o"]} { continue }
    if {![info exists usermode(deoper)]} { continue }
    if {[string equal $usermode(deoper) ""]} { continue }
    putquick "MODE $botnick $usermode(deoper)"
  }
  return 0
}


####################################################
# umode
####################################################
proc umode { {mode ""} } {
  global usermode server botnick
  if {[string equal $mode ""]} {
    if {![info exists usermode(umodeis)] || [string equal $usermode(umodeis) ""]} {
      set usermode(umodeis) "+"
    }
    return $usermode(umodeis)
  } elseif {![string equal $server ""]} { puthelp "MODE $botnick $mode" }
}


####################################################
# usermode:dcc
####################################################
bind dcc mn umode usermode:dcc
proc usermode:dcc { handle idx text } {
  if {[string equal $text ""]} {
    putidx $idx "Current usermodes are: [umode]"
  } else { puthelp "MODE $::botnick $text" }
}


set scriptdb(usermode) {
  "sets and collects the usermodes the bot has set"
}

