IRC消息解析器无法处理URL

时间:2016-05-18 19:23:23

标签: c# irc

我在解析IRC数据时遇到问题。我有工作代码,但是当用户在邮件中包含一个URL时,它会搞砸,我无法找到解决方法。这是我目前的代码。

string message = inputStream.ReadLine();
if (message.Contains("PRIVMSG"))
{
    string[] parms = message.Split(':');
    string userMessage = parms[2];
    return userMessage;
}

示例

:*****!*****@*****.tmi.twitch.tv PRIVMSG #***** :http://www.twitch.tv/

由于http://部分,它无法获取完整的消息。

3 个答案:

答案 0 :(得分:1)

根据Internet Relay Chat Protocol (RFC 1459),您的消息(开头的控制部分)始终以:开头,您的参数也是如此(如果您有任何 - 例如聊天消息)。

最简单的方法是通过简单地查找不在行开头的第一个冒号来分隔这两个组件。

string example = @":*****!*****@*****.tmi.twitch.tv PRIVMSG #***** :http://www.twitch.tv/";
int indexOfColon = example.IndexOf(':', 1);
if (indexOfColon > 0)
{
    string command = example.SubString(0,indexOfColon);
    string message = example.SubString(indexOfColon +1);
}

演示:https://dotnetfiddle.net/wBoKlC

使用相同的概念,您可以解析该行的任何部分。例如,您可以通过了解协议结构并且不需要和不需要:PRIVMSG和{!*****来提取命令(@*****.tmi.twitch.tv),用户名(Split)和主机(Join)。 {1}}甚至RegEx

因此,您应该解析每一行并决定以后如何处理它,而不是寻找PRIVMSG。这条线可能很麻烦:

if (message.Contains("PRIVMSG"))

想象一下,任何其他命令都包含该字符串(用户名,频道或常规消息)。它会彻底破坏你的代码。

Btw:IRC的'伪'BNF是:

<message>  ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
<prefix>   ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
<command>  ::= <letter> { <letter> } | <number> <number> <number>
<SPACE>    ::= ' ' { ' ' }
<params>   ::= <SPACE> [ ':' <trailing> | <middle> <params> ]

<middle>   ::= <Any *non-empty* sequence of octets not including SPACE
               or NUL or CR or LF, the first of which may not be ':'>
<trailing> ::= <Any, possibly *empty*, sequence of octets not including
                 NUL or CR or LF>

<crlf>     ::= CR LF

答案 1 :(得分:0)

试试这个:

if (message.Contains("PRIVMSG"))
{
    string[] parms = message.Split(':');
    string userMessage = string.Join(":", parms.Skip(2));
    return userMessage;
}

答案 2 :(得分:0)

您可以按照SO answer

使用正则表达式
:(?<nick>[^ ]+?)\!(?<user>[^ ]+?)@(?<host>[^ ]+?) PRIVMSG (?<target>[^ ]+?) :(?<message>.*)

群组消息将包含以下链接:

enter image description here

使用群组:

   var match = Regex.Match(@":*****!*****@*****.tmi.twitch.tv PRIVMSG #***** :http://www.twitch.tv/",
            @":(?<nick>[^ ]+?)\!(?<user>[^ ]+?)@(?<host>[^ ]+?) PRIVMSG (?<target>[^ ]+?) :(?<message>.*)");
        if (match.Success)
        {
            var message = match.Groups["message"].Value;
        }
    }