block load
{
  es_xdoblock daggermod/repeat/repeat_register
}

block unload
{
  keygroupremove dmod_repeat
}

block repeat_register
{
  // variables used by dmod_repeat
  es_xset _repeat_argc 0
  es_xset _repeat_arg1 0
  es_xset _repeat_arg2 0
  es_xset _repeat_arg3 0
  es_xset _repeat_arg4 0
  es_xset _repeat_format 0
  es_xset _repeat_status 0
  es_xset _repeat_interval 0
  es_xset _repeat_limit 0
  es_xset _repeat_count 0
  es_xset _repeat_command 0
  es_xset _repeat_name 0
  es_xset _repeat_id 0
  es_xset _repeat_init 0
  es_xset _repeat_temp1 0
  // check to see if dmod_repeat exists
  es_xexists _exists command dmod_repeat
  if (server_var(_exists) = 0) do
  {
    es_xregcmd dmod_repeat daggermod/repeat/repeat "Creates a pausable loop, with a set interval and command execution limit"
  }
  es_xexists _exists keygroup dmod_repeat
  if (server_var(_exists) = 0) do
  {
    es_xkeygroupcreate dmod_repeat
  }
}

block repeat
{
  es_xgetargv _repeat_arg1 1
  es_xformatv _repeat_format "daggermod/repeat/%1" _repeat_arg1
  es_exists _exists block server_var(_repeat_format)
  ifx true(_exists) do
  {
    es_doblock server_var(_repeat_format)
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Invalid subcommand
  }
}

block create
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 3) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_keygetvalue _repeat_temp1 dmod_repeat server_var(_repeat_arg2) id
      es dmod_repeat delete server_var(_repeat_arg2)
    }
    else do
    {
      es_xset _repeat_temp1 0
    }
    es_xgetargv _repeat_arg3 3
    es_keycreate dmod_repeat server_var(_repeat_arg2)
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) command server_var(_repeat_arg3)
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) interval 0
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) limit 0
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) count 0
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) status 1
    es_keysetvalue dmod_repeat server_var(_repeat_arg2) id server_var(_repeat_temp1)
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments. Syntax: dmod_repeat create <name> <command>
  }
}

block start
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 3) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_xgetargv _repeat_arg3 3
      es_xgetargv _repeat_arg4 4
      es_keygetvalue _repeat_status dmod_repeat server_var(_repeat_arg2) status
      if (server_var(_repeat_status) >= 2) do
      {
        es dmod_repeat stop server_var(_repeat_arg2)
      }
      es_keysetvalue dmod_repeat server_var(_repeat_arg2) interval server_var(_repeat_arg3)
      es_keysetvalue dmod_repeat server_var(_repeat_arg2) limit server_var(_repeat_arg4)
      es_keysetvalue dmod_repeat server_var(_repeat_arg2) count 0
      es_keysetvalue dmod_repeat server_var(_repeat_arg2) status 2
      es_keygetvalue _repeat_id dmod_repeat server_var(_repeat_arg2) id
      es_xmath _repeat_id + 1
      es_keysetvalue dmod_repeat server_var(_repeat_arg2) id server_var(_repeat_id)
      es_xcopy _repeat_name _repeat_arg2
      es_xset _repeat_init 1
      es_xdoblock daggermod/repeat/repeat_loop
    }
    else do
    {
      es_dbgmsg 0 dmod_repeat start: Doesn't exist: server_var(_repeat_arg2)
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat start. Syntax: dmod_repeat start <name> <interval> [number-of-times]
  }
}

block pause
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 2) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_keygetvalue _repeat_status dmod_repeat server_var(_repeat_arg2) status
      if (server_var(_repeat_status) = 2) do
      {
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) status 3
        es_keygetvalue _repeat_id dmod_repeat server_var(_repeat_arg2) id
        es_xformatv _repeat_id "_repeat_%1_%2" _repeat_arg2 _repeat_id
        es alias server_var(_repeat_id) ""
      }
    }
    else do
    {
      es_dbgmsg 0 dmod_repeat pause: Doesn't exist: server_var(_repeat_arg2)
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat pause. Syntax: dmod_repeat pause <name>
  }
}

block resume
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 2) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_keygetvalue _repeat_status dmod_repeat server_var(_repeat_arg2) status
      if (server_var(_repeat_status) = 3) do
      {
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) status 2
        es_keygetvalue _repeat_id dmod_repeat server_var(_repeat_arg2) id
        es_xmath _repeat_id + 1
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) id server_var(_repeat_id)
        es_xcopy _repeat_name _repeat_arg2
        es_xset _repeat_init 1
        es_xdoblock daggermod/repeat/repeat_loop
      }
    }
    else do
    {
      es_dbgmsg 0 dmod_repeat resume: Doesn't exist: server_var(_repeat_arg2)
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat resume. Syntax: dmod_repeat resume <name>
  }
}

block stop
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 2) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_keygetvalue _repeat_status dmod_repeat server_var(_repeat_arg2) status
      if (server_var(_repeat_status) >= 2) do
      {
        es_keygetvalue _repeat_id dmod_repeat server_var(_repeat_arg2) id
        es_xformatv _repeat_format "_repeat_%1_%2" _repeat_arg2 _repeat_id
        es alias server_var(_repeat_format) ""
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) interval 0
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) limit 0
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) count 0
        es_keysetvalue dmod_repeat server_var(_repeat_arg2) status 1
      }
      else do
      {
        if (server_var(_repeat_status) = 1) do
        {
          es_dbgmsg 0 dmod_repeat stop: Not running: server_var(_repeat_arg2)
        }
      }
    }
    else do
    {
      es_dbgmsg 0 dmod_repeat stop: Doesn't exist: server_var(_repeat_arg2)
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat stop. Syntax: dmod_repeat stop <name>
  }
}

block delete
{
  es_xgetargc _repeat_argc
  if (server_var(_repeat_argc) > 2) do
  {
    es_xgetargv _repeat_arg2 2
    es_exists _exists key dmod_repeat server_var(_repeat_arg2)
    ifx true(_exists) do
    {
      es_keygetvalue _repeat_status dmod_repeat server_var(_repeat_arg2) status
      if (server_var(_repeat_status) >= 2) do
      {
        es dmod_repeat stop server_var(_repeat_arg2)
      }
      es_keydelete dmod_repeat server_var(_repeat_arg2)
    }
    else do
    {
      es_dbgmsg 0 dmod_repeat delete: Doesn't exist: server_var(_repeat_arg2)
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat delete. Syntax: dmod_repeat delete <name>
  }
}

block status
{
  es_xgetargc _repeat_count
  if (server_var(_repeat_count) > 3) do
  {
    es_xgetargv _repeat_arg2 2
    es_xgetargv _repeat_arg3 3
    es_exists _exists key dmod_repeat server_var(_repeat_arg3)
    ifx true(_exists) do
    {
      es_keygetvalue server_var(_repeat_arg2) dmod_repeat server_var(_repeat_arg3) status
    }
    else do
    {
      es_set server_var(_repeat_arg2) 0
    }
  }
  else do
  {
    es_xdbgmsg 0 dmod_repeat: Not enough arguments supplied to dmod_repeat status. Syntax: dmod_repeat status <var> <name>
  }
}

block repeat_loop
{
  es_exists _exists key dmod_repeat server_var(_repeat_name)
  ifx true(_exists) do
  {
    es_keygetvalue _repeat_interval dmod_repeat server_var(_repeat_name) interval
    es_keygetvalue _repeat_command dmod_repeat server_var(_repeat_name) command
    es_keygetvalue _repeat_limit dmod_repeat server_var(_repeat_name) limit
    es_keygetvalue _repeat_count dmod_repeat server_var(_repeat_name) count
    es_keygetvalue _repeat_id dmod_repeat server_var(_repeat_name) id
    ifx true(_repeat_limit) do
    {
      es_xmath _repeat_count + 1
      es_keysetvalue dmod_repeat server_var(_repeat_name) count server_var(_repeat_count)
    }
    ifx true(_repeat_init) do
    {
      es_xset _repeat_count 0
      es_keysetvalue dmod_repeat server_var(_repeat_name) count 0
    }
    ifx false(_repeat_limit) do
    {
      es_xset _repeat_count -1
    }
    if (server_var(_repeat_count) < server_var(_repeat_limit)) do
    {
      es_xformatv _repeat_format "_repeat_%1_%2" _repeat_name _repeat_id
      es alias server_var(_repeat_format) "es_xset _repeat_init 0;es_xdoblock daggermod/repeat/repeat_loop"
      ifx true(_repeat_interval) do
      {
        es_delayed server_var(_repeat_interval) es_xset _repeat_name server_var(_repeat_name)
        es_delayed server_var(_repeat_interval) server_var(_repeat_format)
      }
      else do
      {
        es server_var(_repeat_format)
      }
    }
    ifx false(_repeat_init) do
    {
      es alias _repeat_command_alias server_var(_repeat_command)
      _repeat_command_alias
    }
    if (server_var(_repeat_count) >= server_var(_repeat_limit)) do
    {
      es dmod_repeat status _exists server_var(_repeat_name)
      ifx true(_exists) do
      {
        es dmod_repeat stop server_var(_repeat_name)
      }
    }
  }
}
