Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure新手-将Java代码重写为Clojure_Clojure_Clojure Java Interop - Fatal编程技术网

Clojure新手-将Java代码重写为Clojure

Clojure新手-将Java代码重写为Clojure,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我有一些简单的java代码,它使用SMACK xmmp库来响应传入的消息并接受多用户聊天邀请。我正试图改变这个clojure。bot登录但不响应消息 public class bot { public static void main(String[] args) { System.out.println("Starting session..."); try { String server = "chat.hipchat.com";

我有一些简单的java代码,它使用SMACK xmmp库来响应传入的消息并接受多用户聊天邀请。我正试图改变这个clojure。bot登录但不响应消息

public class bot {

public static void main(String[] args) {

    System.out.println("Starting session...");
    try {
        String server = "chat.hipchat.com";         
        XMPPConnection con = new XMPPConnection(server);
        con.connect();
        String username = "username";
        String password = "password";
        con.login(username, password,"bot");
        System.out.println("Connected");

        ChatManager chatManager = con.getChatManager();
        final MyMessageListener messageListener = new MyMessageListener();

        ChatManagerListener  chatManagerListener = new ChatManagerListener() {
            public void chatCreated(Chat chat, boolean createdLocally) {
                chat.addMessageListener(messageListener);
            }
        };
        chatManager.addChatListener(chatManagerListener);


        MultiUserChat.addInvitationListener(con, new InvitationListener() {

            public void invitationReceived(XMPPConnection con,
                    String room, String arg2, String arg3, String arg4,
                    Message arg5) {

                MultiUserChat muc2 = new MultiUserChat(con, room);
                  try {
                    muc2.join("Bot");
                } catch (XMPPException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        // Thread.currentThread();
        Thread.sleep(10000);
        // Disconnect from the server
        con.disconnect();
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Ended session...");
}
}

public class MyMessageListener implements MessageListener {

public void processMessage(Chat chat, Message message) {
    System.out.println("Received message: " + message.getBody());
    try {
        chat.sendMessage("Smack> Message sent via API.");
    } catch (XMPPException e) {
        e.printStackTrace();
    }
}

}


(ns mybot.core
(:import [org.jivesoftware.smack
        Chat ChatManager MessageListener ChatManagerListener XMPPConnection XMPPException]
       [org.jivesoftware.smack.packet
        Message Presence]
       [org.jivesoftware.smackx.muc InvitationListener MultiUserChat] ))

(def con (XMPPConnection. "chat.hipchat.com"))


(defrecord MyMessageListener []
   MessageListener
   (processMessage [this chat message] ( println "Received Message" )))


 (def myMessageListner ( MyMessageListener. ))



 (defn add-chatManagerListener
  [connection]
  (println "Adding a chat manager lister")
  (.addChatListener (.getChatManager connection)
                (proxy [ChatManagerListener] []
                  (chatCreated [chat locally]
                    (.addMessageListner chat myMessageListner )
                    )
                  )))




(defn -main [& args]
  (println "Starting bot")
  (.connect con)
  (.login con "username" "pwd" "bot")
 (println (.isAuthenticated con))
 (add-chatManagerListener con))

如果不需要,我强烈建议不要使用
(def…
来维护全局状态。这总是会适得其反。但也许这是某种个人品味

Clojure中的记录被用作bean,我非常确定您不能使用它在接口上实现方法。定义是:
(defred name[&fields]&opts+specs)
,其中
字段是字段名列表,而不是方法名

要实例化Java接口或Clojure协议,您应该使用
reify
proxy
宏应用于扩展抽象类或重写类上的函数。但是
MessageListener
ChatManagerListener
是唯一的接口,所以在我看来
reify
应该是首选

我附上了你的源代码的我的版本,但我无法正确测试,所以小心处理

(ns mybot.core)
(:import[org.jivesoftware.smack
聊天室管理器消息侦听器聊天室管理器侦听器XMPPConnection XMPPException]
[org.jivesoftware.smack.packet]
信息状态]
[org.jivesoftware.smackx.muc InvitationListener多用户聊天])
(defn connect[主机用户名密码]
(doto(XMPPConnection.“chat.hipchat.com”)
(.登录用户名密码“bot”))
(defn添加侦听器[连接回调]
(让[chat manager(.getChatManager连接)
消息侦听器(具体化)
消息监听器
(processMessage[;聊天信息](回调聊天信息))
)
聊天侦听器(具体化)
查特利斯腾纳
(聊天室已创建
(.addMessageListner聊天信息侦听器)))
]
(.addChatListener聊天管理器聊天侦听器)
联系
))
(def-主[&参数]
(让[con(连接“chat.hipchat.com”“用户名”“pwd”)]
(println(.isAuthenticated con))
(添加侦听器con(fn[; message](println“Received message:”message)))
(线程/睡眠10000)))

一种常见的Clojure模式是将回调函数作为侦听器传递,这是我为
addlistener
函数所做的。这提供了很好的解耦,并隐藏了所有讨厌的OO内容。

虽然不是您想要的,但我建议使用库来实现这一点

一个无耻的插头,有clj xmpp,我做了一个叉子
这可能满足了您的需要。

您所说的“机器人登录但不响应消息”是什么意思?MultiUserChat.addInvitationListener是否有重要作用?我在clojure里看不到这一点code@G_AMultiUserChat.addInvitationListener是接受聊天室邀请的Listener。我没有在clojure代码中添加这一点,因为我无法获得一对一列表器本身working@Chiron(println(.isAuthenticated con))打印true,但bot本身没有响应消息。我的意思是,当我发送一条消息时,如果我希望打印“Received Message”,则不会打印任何内容。我注意到Java代码在终止之前休眠了10秒钟。Clojure版本立即存在。