1

着信メッセージに応答し、マルチユーザー チャットの招待を受け入れる SMACK xmmp ライブラリを使用する単純な Java コードがいくつかあります。このクロージュアを変換しようとしています。ボットはログインしますが、メッセージに応答しません。

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))
4

2 に答える 2

0

あなたが求めているものではありませんが、これにはライブラリを使用することをお勧めします。

恥知らずなプラグインです。clj-xmpp があり ます。これは、おそらくあなたのニーズを満たすhttps://github.com/slipset/xmpp-clj/をフォークしました。

于 2016-05-14T20:09:11.987 に答える
0

(def ...)必要がない場合は、グローバル状態を維持するために使用しないことを強くお勧めします。これは常に一種の裏目に出ます。しかし、それはある種の個人的な好みかもしれません。

Clojure のレコードは Bean として使用されるため、インターフェイスにメソッドを実装するために使用できないと確信しています。定義は次のとおりです。 はメソッド名ではなく、フィールド名のリストです(defrecord name [& fields] & opts+specs)fields

Java インターフェイスまたは Clojure プロトコルをインスタンス化するには、reify. マクロは、proxy抽象クラスを拡張したり、クラスの関数をオーバーライドしたりするために使用する必要があります。しかしMessageListener、 とChatManagerListenerはインターフェースにすぎないので、私の観点からは、 をreify第一選択にすべきです。

ソースの私のバージョンを添付しましたが、適切にテストできなかったので、注意して扱ってください。

 (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] ))

 (defn connect [host username password]
   (doto (XMPPConnection. "chat.hipchat.com")
    (.login username password "bot")))

 (defn add-listener [connection callback]
   (let [chat-manager (.getChatManager connection)
         message-listener (reify
           MessageListener
             (processMessage [_ chat message] (callback chat message))
           )
         chat-listener (reify 
           ChatManagerListener 
             (chatCreated [_ chat _]
               (.addMessageListner chat message-listener)))
     ]
      (.addChatListener chat-manager chat-listener)      
      connection
   ))

 (def -main [& args]
   (let [con (connect "chat.hipchat.com" "username" "pwd")]
     (println (.isAuthenticated con))
     (add-listener con (fn [_ message] (println "Received Message:" message)))

      (Thread/sleep 10000)))

Clojure の一般的なパターンは、コールバック関数をリスナーとして渡すことです。これをadd-listener関数に対して行いました。これにより、優れたデカップリングが提供され、すべての厄介な OO が隠されます。

于 2015-09-17T12:14:28.507 に答える