SmartIRC4Net не подключается / не показывает активности - PullRequest
1 голос
/ 14 августа 2011

Я создаю бота на c #, использую библиотеку SmartIRC4Net (http://www.meebey.net/projects/smartirc4net/). Если вы не знакомы с этой библиотекой, не стесняйтесь сказать мне альтернативу.

Я использовал его, потому что это самая поддерживаемая библиотека, которую я мог найти. Я прочитал пример «тестового» бота и попытался сократить его до основ, удалив ввод запросов и ответов.

Я запрограммировал его, чтобы попытаться подключиться к их веб-каналу из-за отсутствия лучшего тестового канала, а он, похоже, не подключается. На моем клиенте ничего не появляется, когда я отлаживаю бота (я сейчас на их канале). Консоль также не показывает сообщение об ошибке IRC или исключение, только паузу, которую я поставил в конце. Код:

public static IrcClient irc = new IrcClient();

public static void Main(string[] args)
{

        //Setup
        irc.Encoding = System.Text.Encoding.UTF8;
        irc.SendDelay = 200;
        irc.ActiveChannelSyncing = true;

        //Event Handlers
        irc.OnError += new ErrorEventHandler(irc_OnError);
        irc.OnConnected += new EventHandler(irc_OnConnected);
        irc.OnRawMessage += new IrcEventHandler(irc_OnRawMessage);

        try
        {
            //Connect, log in, join channel
            irc.Connect("irc.freenode.org", 6667);
            irc.Login("HGPBot", "HGP Bot");
            irc.RfcJoin("#smartirc");
        }
        catch (Exception e)
        {
            Console.WriteLine("Could not connect, exception:" + Environment.NewLine
                + e.Message + Environment.NewLine
                + e.ToString());
        }

        //pause
        Console.WriteLine("Press any key to continue");
        Console.ReadKey(true);

        //Disconnect
        irc.Disconnect();

        //Exit
        Environment.Exit(0);
    }

    static void irc_OnRawMessage(object sender, IrcEventArgs e)
    {
        Console.WriteLine("irc_OnRawMessage initiated");
    }

    static void irc_OnConnected(object sender, EventArgs e)
    {
        Console.WriteLine("Connected");
        irc.SendMessage(SendType.Message, "#smartirc", "Connected");
    }

    static void irc_OnError(object sender, ErrorEventArgs e)
    {
        Console.WriteLine("IRC Error: " + e.ErrorMessage);
    }

[Обновление: добавлено событие irc_OnConnected в соответствии с предложением @Russ C. Событие инициировано, и на консоли записано «Подключено». Тем не менее, ничего не происходит на канале. Я добавлю строку sendmessage и посмотрю, что произойдет.]

[Update2: добавлены события SendMessage и OnRawMessage. На канале не отображаются выходные данные, а текст в событии OnRawMessage не записывается в консоль. (Использую ли я правильное событие для OnMessage? Событие "OnMessage" не существует, и тестовый бот сообщает, что OnMessage "получит все сообщения IRC".)]

1 Ответ

1 голос
/ 14 августа 2011

Ok; Как и вся логика, основанная на событиях (см. здесь «Асинхронная логика»), вам необходимо подписаться на событие, чтобы библиотека уведомляла вас, когда нужно что-то сделать. Поскольку ваш тестовый код не подписывается / не присоединяется к каким-либо событиям из библиотеки SmartIRC, библиотека просто бездействует, ничего не делая.

Вы делаете часть этого с помощью строки irc.OnError, но вам также необходимо добавить следующие методы:

irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);
irc.OnRawMessage += new IrcEventHandler(OnRawMessage);

Тогда пара методов:

// this method we will use to analyse queries (also known as private messages)
public static void OnQueryMessage(object sender, IrcEventArgs e)
{
    switch (e.Data.MessageArray[0]) {
        case "hello":
           // this is where you decipher private messages posted to the bot.
           // if someone does "/privmsg HGPBot hello" this will reply "Hello!"
           irc.SendMessage(SendType.Message, "HGPBot, "Hello!");
           break;
        default:
           break;
    }
}

// this method will get all IRC messages
public static void OnRawMessage(object sender, IrcEventArgs e)
{
    System.Console.WriteLine("Received: "+e.Data.RawMessage);
}

Если вы поставите точку останова в этой строке System.Console, вы должны начать видеть вещи, поступающие от бота. Если это не помогло, попробуйте создать собственный канал на IRC-сервере.

Кроме того, не забывайте: пользователь может подключаться к IRC, не находясь в канале, если вы уверены, что имя пользователя, которое использует ваш бот, уникально и работает (то есть вы можете войти в него самостоятельно через mirc или что-то еще) просто пытаюсь отправить команду / privmsg вашему боту, как только программа оказывается подключенной.

edit: Кроме того, я только что заметил, что в вашей программе нет цикла. Вам нужно добавить irc.Listen (); до вашего заявления паузы. Это переведет бот irc в режим прослушивания и станет блокирующим циклом, поэтому единственный способ выйти из вашей программы на этом этапе - завершить задачу, но, по крайней мере, покажет, что она работает.

Редактировать 2: заставить бота слушать:

// here we tell the IRC API to go into a receive mode, all events
// will be triggered by _this_ thread (main thread in this case)
// Listen() blocks by default, you can also use ListenOnce() if you
// need that does one IRC operation and then returns, so you need then 
// an own loop 
irc.Listen();
//pause
Console.WriteLine("Press any key to continue");
Console.ReadKey(true);
...