Broadcast message in IRC Client (chatbot) C#

406
24 января 2017, 21:15

Здравствуйте, пишу IRC клиент, для общения с внутренним сервером IRC твича и столкнулся с такой проблемой: не работает запрос к серверу с многострочным сообщением(список команд), т.к StreamWriter при использовании метода Flush(), отправляет данные Tcp клиенту не пачкой, а кусками ИЛИ сам tcpClient отсылает запрос кусками, не суть. Вообщем запрос делится на куски:(. В результате в случае построчной записи списка команд в поток, сообщение вообще не выводится.

Пробовал отправлять запрос с сообщением одной строкой с "\n" в нужных местах - обрезает все что после первой строки команды (выводит первую строку списка команд в чат)

Вопрос: можно ли отправить irc серверу запрос с многострочным сообщением или нет? Если да, то как? Код прикрепляю:

    public void sendChatMessage(string message)
    {
        sendIrcMessage(":" + userName + "!" + userName + "@" + userName + "twi.twitch.tv PRIVMSG #" + channel + " :@" + senderName + " " + message);
    }
    public void sendChatBroadcastChatMessage(string message)
    {
        sendIrcMessage(":" + userName + "!" + userName + "@" + userName + "twi.twitch.tv PRIVMSG #" + channel + " : " + message);
    }
    public void sendChatBroadcastChatMessage(List<string> messages)
    {
        messages.Insert(0, ":" + userName + "!" + userName + "@" + userName + "twi.twitch.tv PRIVMSG #" + channel + " : ");
        sendIrcMessage(messages);
    }

userName - имя бота, channel - название канала

    private void sendIrcMessage(List<string> messages)
    {
        try
        {
            if (outputStream == null)
                throw new Exception("Output stream is empty...");
            foreach (var item in messages)
            {
                outputStream.WriteLine(item);
            }
            outputStream.Flush();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadLine();
            return;
        }
    }

messages в данном случае - список команд:

        "!hi - приветствие",
        "!date - дата и время сервера",
        "!commands - список команд"

Итак, вызывается sendChatBroadcastChatMessage(messages). В нем в начало сообщения добавляется запрос и вызывается метод sendIrcMessage(messages) с обновленным списком. Надеюсь рассказал достаточно подробно...

Ответ сервера:

Спасибо!

Answer 1

На en-so говорят, что протокол IRC запрещает многострочные ссобщения, ссылаясь на RFC 1459.

См. тут: http://stackoverflow.com/questions/13898584/insert-line-breaks-into-an-irc-message

Открываем RFC: https://rfc2.ru/1459.rfc/print

IRC-сообщения всегда выглядят как строки символов, заканчивающихся парой символов CR-LF (Carriage Return - Line Feed. Возврат Каретки - Перевод Строки) и длиной строки, не превышающей 512 символов (в эти 512 входят и CR-LF). Так что, максимальная длина строки для команд и параметров - 510 символов. Перенос строки невозможен. Для более подробной информации смотрите раздел 7.

Так что, увы, видимо нет:

можно ли отправить irc серверу запрос с многострочным сообщением или нет? Если да, то как?

Надо ещё посмореть, не было с тех пор новых стандартов, переопределяющих этот RFC.

Вот список стандартов для начала просмотра:

READ ALSO
Возникли вопросы по Metadata в MEF

Возникли вопросы по Metadata в MEF

Немного не понял, как работает Metadata в MEF

351
Конфигурирование плагина MEF

Конфигурирование плагина MEF

Подскажите, может ли хост при загрузке плагина передать в него какую-то информацию или при создании используется только конструктор по умолчанию?

386
Как стиль ContextMenuMy установить к MenuItem из кода?

Как стиль ContextMenuMy установить к MenuItem из кода?

Как стиль ContextMenuMy установить к MenuItem из кода?

312
Многопоточное программирование c# [требует правки]

Многопоточное программирование c# [требует правки]

задача такая: запускается поток в консоли он ждет ввода данных от пользователяКак пользователь вводит данные поток закрывается

278