; Written by TEttinger (tommy dot ettinger at gmail)
; Licensed under the EPL
(ns lazybot.plugins.nest
(:use [lazybot registry info]
[clojure.string :only [join trim split]]
[clojure.pprint :only [pprint]])
(:import java.io.PrintWriter
java.io.StringWriter))
(defplugin
(:cmd
"Calls two nested commands."
#{"`" "!" "nest"}
(fn [{:keys [com bot nick args channel] :as com-m}]
(let [ sw (StringWriter.)
com-2 (assoc com-m
:com (ref (assoc-in @(get com-m :com) [:connection :sockout] (PrintWriter. sw))))
get-inner #(re-find #"\[\s*(\S+)\s+([^\]]+)\]" (join " " (rest %)))]
(if (and (seq args)
(find-command (:modules @bot) (first args))
(seq (get-inner args))
(find-command (:modules @bot) (nth (get-inner args) 1)))
(do
(let [inside-args (nth (get-inner args) 2)
com-2 (assoc com-2
:com (ref (assoc @(get com-2 :com) :args (split inside-args #"\s"))))]
((:fn (find-command (:modules @bot) (nth (get-inner args) 1))) com-2 )
(.flush (get-in @(get com-2 :com) [:connection :sockout]))
(.close (get-in @(get com-2 :com) [:connection :sockout]))
(let [new-args (.toString sw ) ; (get-in @com-2 [:com :connection :sockout]))
com-a (assoc com-m
:com (ref (assoc @(get com-m :com) :args (split new-args #"\s"))))]
((:fn (find-command (:modules @bot) (first args))) com-a )
))))))))