Ошибка конфигурации бота - PullRequest
1 голос
/ 08 декабря 2010

Я работаю над ботом GTalk.Я не закончил с этим, но пока мой бот работает нормально.Есть одна вещь, которая раздражает меня с тех пор, как я впервые запустил бот.Когда я отправляю IM-сообщение своему боту gtalk, он всегда отвечает сообщением «Ошибка конфигурации бота».Я не могу понять, почему это так.Даже после того, как я получу сообщение об ошибке конфигурации, оно все равно будет работать как обычно и работает нормально.Если я отправлю другое сообщение через несколько секунд после получения сообщения об ошибке, я не получу ответ об ошибке конфигурации бота.Если я подожду несколько минут, чтобы позволить ему "сбросить".После «сброса» бота, если я снова отправлю ему еще одно мгновенное сообщение.Я получу ответ об ошибке конфигурации.Я понятия не имею, почему я продолжаю получать эти сообщения об ошибках.У меня даже нет строки "Ошибка конфигурации бота" в моем коде.Это должно быть из Smack API или с сервера GTalk или еще чего-нибудь.

Вот фрагмент моего кода:

import java.io.IOException;

import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.*;
import org.jivesoftware.smack.filter.*;
import org.apache.log4j.*;

public class GtalkBot {
    private static final String username = "test@test.com"; // fake login info
    private static final String password = "testpassword"; // fake password
    private static final String domain = "gmail.com";
    private static final int MAX_SLEEP_COUNT = 8;
    private int sleepCount = 0;
    private int sleepSec = 1000;

    private XMPPConnection conn;
    private GChatBufferProcessor chatProcessor;
    private Presence presence;
    private static final Logger logger = LoggerFactory.make();


    public GtalkBot(){
        presence = null;

        ConnectionConfiguration connConfig = new ConnectionConfiguration("talk.google.com", 5222, domain);
        //ConnectionConfiguration connConfig = new ConnectionConfiguration("talk.google.com", 5222);
        connConfig.setReconnectionAllowed(true);
        conn = new XMPPConnection(connConfig);

        chatProcessor = new GChatBufferProcessor(conn);
        logger.info(this.getClass().getSimpleName()+" created");
    } /* Gtalkbot */


    public void run() {
        while(true){
            try {
                login();
            } catch (XMPPException xe){
                logger.error("failed to connect to "+conn.getHost(), xe);
                this.incrementalNap();
                continue; // skip the rest of the loop and retry from the top
            }

            // start the chat message processor thread
            chatProcessor.start();

            // create gtalk chat listener
            this.createChatListener();

            while(conn.isConnected()){
                /* stuck in this loop while connected, not sure if 
                this is the right way to do it. */
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e){
                    //e.printStackTrace();
                }
            }

            logger.warn("Lost connection, retrying the login process...");
        }
    } /* run */


    public void login() throws XMPPException {
        // connect to gtalk server
        conn.connect();
        logger.info("connected to "+conn.getHost());

        // login to gtalk server
        conn.login(username, password);
        logger.info("logged in as: "+conn.getUser());

        // set the presence status
        presence = new Presence(Presence.Type.available);
        logger.info("Set presence as: "+Presence.Type.available);
        conn.sendPacket(presence);
    } /* login */


    public void createChatListener(){
        GtalkMessageListener msgListener = new GtalkMessageListener();
        //PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        PacketFilter filter = new PacketTypeFilter(Message.class);
        conn.addPacketListener(msgListener, filter);
    } /* createChatListener */


    public void incrementalNap(){
        if(sleepCount < MAX_SLEEP_COUNT){
            sleepSec = sleepSec << 1; // multiply by 2
            sleepCount++;
        }

        logger.debug("Sleeping for "+(sleepSec/1000)+" seconds ...");

        try {
            Thread.sleep(sleepSec);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    } /*  incrementalNap */

}

Заранее спасибо, ребята.

...