SHOW:
|
|
- or go back to the newest paste.
1 | (ns IRC-Client.core | |
2 | (:use [seesaw.core]) | |
3 | (:require [seesaw.selector :as selector]) | |
4 | (:import (java.net Socket) | |
5 | - | root) |
5 | + | (java.io PrintWriter InputStreamReader BufferedReader) |
6 | (panels SettingsFrame ChatWindow))) | |
7 | ||
8 | (defn identify [root] | |
9 | (doseq [w (select root [:*])] | |
10 | (if-let [n (.getName w)] | |
11 | (selector/id-of! w (keyword n)))) | |
12 | root) | |
13 | ||
14 | (def defaults | |
15 | { :Nickname "IRC-Client-Test" | |
16 | :Server "irc.freenode.net" | |
17 | :Port 6667 | |
18 | :Channel "#clojurehu"}) | |
19 | ||
20 | (def textbox (text :multi-line? false :border 5 :margin 0)) | |
21 | (def textboxoutput (text :multi-line? true :border 5 :margin 0 )) | |
22 | (def namesList (text :multi-line? true :border 5 :margin 0 )) | |
23 | ||
24 | (defn login-form [] | |
25 | (let [form (identify (SettingsFrame.))] | |
26 | form) | |
27 | ) | |
28 | ||
29 | (defn chatform [] | |
30 | (let [form (identify (ChatWindow.))] | |
31 | form) | |
32 | ) | |
33 | ||
34 | (listen (select chatform [:#btnSend]) | |
35 | :action (fn [e] print("YO"))) | |
36 | ||
37 | ||
38 | (declare conn-handler) | |
39 | ||
40 | (defn make-connection[server port] | |
41 | (let [socket (Socket. server port) | |
42 | in (BufferedReader. (InputStreamReader. (.getInputStream socket))) | |
43 | out (PrintWriter. (.getOutputStream socket))] | |
44 | (atom {:in in :out out}) | |
45 | ) | |
46 | ) | |
47 | ||
48 | (defn write [conn msg] | |
49 | (doto (:out @conn) | |
50 | (.println (str msg "\r")) | |
51 | (.flush) | |
52 | ) | |
53 | (value! textboxoutput (str(value textboxoutput)\newline msg)) | |
54 | ) | |
55 | ||
56 | (defn make-namesList [msg] | |
57 | (value! namesList (str (value namesList) (re-find #" :.*" msg))) | |
58 | ) | |
59 | ||
60 | (defn conn-handler [conn] | |
61 | (while (nil? (:exit @conn)) | |
62 | (let [msg (.readLine (:in @conn))] | |
63 | (println msg) | |
64 | (value! textboxoutput (str(value textboxoutput)\newline msg)) | |
65 | (cond | |
66 | (re-find #"^ERROR :Closing Link:" msg) | |
67 | (dosync (alter conn merge {:exit true})) | |
68 | (re-find #"^PING" msg) | |
69 | (write conn (str "PONG " (re-find #":.*" msg))) | |
70 | (re-find #"^.*= #" msg) | |
71 | (make-namesList msg) | |
72 | (re-find #"^.*JOIN #" msg) | |
73 | (value! namesList (str (value namesList) (clojure.string/replace | |
74 | (clojure.string/replace(re-find #":.*!" msg) ":" "")"!" "")) | |
75 | ) | |
76 | (re-find #"^.*QUIT" msg) | |
77 | (value! namesList (clojure.string/replace(value namesList) (clojure.string/replace | |
78 | (clojure.string/replace(re-find #":.*!" msg) ":" "")"!" "") "") | |
79 | ) | |
80 | ) | |
81 | ) | |
82 | ) | |
83 | ) | |
84 | ||
85 | (defn login! | |
86 | [conn user] | |
87 | (doto (Thread. #(conn-handler conn)) (.start)) | |
88 | (write conn (str "NICK " user)) | |
89 | (write conn (str "USER " user " 0 * :" user)) | |
90 | ) | |
91 | ||
92 | (defn irc-speak! [conn channel message] | |
93 | (write conn (str "PRIVMSG " channel " :" message)) | |
94 | ) | |
95 | ||
96 | (defn irc-command! [conn message] | |
97 | (write conn message) | |
98 | ) | |
99 | ||
100 | (defn chat-form[conn] | |
101 | (frame :content (vertical-panel | |
102 | :items [(scrollable textboxoutput) | |
103 | :separator | |
104 | textbox | |
105 | :separator | |
106 | (scrollable namesList) | |
107 | (button :text "send" :listen [:action (fn[e] (do | |
108 | (irc-speak! conn "#clojurehu" (value textbox)) | |
109 | (value! textbox "")))]) | |
110 | ]) :width 800 :height 600)) | |
111 | ||
112 | ||
113 | (defn join! [conn channel] | |
114 | (write conn (str "join " channel)) | |
115 | (let [form (-> (chat-form conn) show!) | |
116 | ]) | |
117 | ) | |
118 | ||
119 | ||
120 | ||
121 | ||
122 | (defn -main [& args] | |
123 | (invoke-later | |
124 | (let [form (value! (login-form) defaults) | |
125 | result (-> (dialog :content form :option-type :ok-cancel) pack! show!)] | |
126 | (if (= :success result) | |
127 | (do | |
128 | (def irc(make-connection (get-in (value form )[:Server]) (Integer/parseInt(get-in (value form )[ :Port])))) | |
129 | (login! irc(get-in (value form )[:Nickname])) | |
130 | (join! irc (get-in (value form )[:Channel])) ) | |
131 | (println "User canceled"))))) |