Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns IRC-Client.core
- (:use [seesaw.core])
- (:require [seesaw.selector :as selector])
- (:import (java.net Socket)
- (java.io PrintWriter InputStreamReader BufferedReader)
- (panels SettingsFrame ChatWindow)))
- (defn identify [root]
- (doseq [w (select root [:*])]
- (if-let [n (.getName w)]
- (selector/id-of! w (keyword n))))
- root)
- (def defaults
- { :Nickname "IRC-Client-Test"
- :Server "irc.freenode.net"
- :Port 6667
- :Channel "#clojurehu"})
- (def textbox (text :multi-line? false :border 5 :margin 0))
- (def textboxoutput (text :multi-line? true :border 5 :margin 0 ))
- (def namesList (text :multi-line? true :border 5 :margin 0 ))
- (defn login-form []
- (let [form (identify (SettingsFrame.))]
- form)
- )
- (defn chatform []
- (let [form (identify (ChatWindow.))]
- form)
- )
- (listen (select chatform [:#btnSend])
- :action (fn [e] print("YO")))
- (declare conn-handler)
- (defn make-connection[server port]
- (let [socket (Socket. server port)
- in (BufferedReader. (InputStreamReader. (.getInputStream socket)))
- out (PrintWriter. (.getOutputStream socket))]
- (atom {:in in :out out})
- )
- )
- (defn write [conn msg]
- (doto (:out @conn)
- (.println (str msg "\r"))
- (.flush)
- )
- (value! textboxoutput (str(value textboxoutput)\newline msg))
- )
- (defn make-namesList [msg]
- (value! namesList (str (value namesList) (re-find #" :.*" msg)))
- )
- (defn conn-handler [conn]
- (while (nil? (:exit @conn))
- (let [msg (.readLine (:in @conn))]
- (println msg)
- (value! textboxoutput (str(value textboxoutput)\newline msg))
- (cond
- (re-find #"^ERROR :Closing Link:" msg)
- (dosync (alter conn merge {:exit true}))
- (re-find #"^PING" msg)
- (write conn (str "PONG " (re-find #":.*" msg)))
- (re-find #"^.*= #" msg)
- (make-namesList msg)
- (re-find #"^.*JOIN #" msg)
- (value! namesList (str (value namesList) (clojure.string/replace
- (clojure.string/replace(re-find #":.*!" msg) ":" "")"!" ""))
- )
- (re-find #"^.*QUIT" msg)
- (value! namesList (clojure.string/replace(value namesList) (clojure.string/replace
- (clojure.string/replace(re-find #":.*!" msg) ":" "")"!" "") "")
- )
- )
- )
- )
- )
- (defn login!
- [conn user]
- (doto (Thread. #(conn-handler conn)) (.start))
- (write conn (str "NICK " user))
- (write conn (str "USER " user " 0 * :" user))
- )
- (defn irc-speak! [conn channel message]
- (write conn (str "PRIVMSG " channel " :" message))
- )
- (defn irc-command! [conn message]
- (write conn message)
- )
- (defn chat-form[conn]
- (frame :content (vertical-panel
- :items [(scrollable textboxoutput)
- :separator
- textbox
- :separator
- (scrollable namesList)
- (button :text "send" :listen [:action (fn[e] (do
- (irc-speak! conn "#clojurehu" (value textbox))
- (value! textbox "")))])
- ]) :width 800 :height 600))
- (defn join! [conn channel]
- (write conn (str "join " channel))
- (let [form (-> (chat-form conn) show!)
- ])
- )
- (defn -main [& args]
- (invoke-later
- (let [form (value! (login-form) defaults)
- result (-> (dialog :content form :option-type :ok-cancel) pack! show!)]
- (if (= :success result)
- (do
- (def irc(make-connection (get-in (value form )[:Server]) (Integer/parseInt(get-in (value form )[ :Port]))))
- (login! irc(get-in (value form )[:Nickname]))
- (join! irc (get-in (value form )[:Channel])) )
- (println "User canceled")))))
Add Comment
Please, Sign In to add comment