从 IRC 服务器输入中清除不需要的文本
Posted
技术标签:
【中文标题】从 IRC 服务器输入中清除不需要的文本【英文标题】:Clearing needless text from IRC Server input 【发布时间】:2011-02-21 14:48:27 【问题描述】:我正在为自己制作一个简单的 IRC 客户端,因为我真的不认为需要很多 mIRC 的功能,但是我在清理来自服务器的输入时遇到了问题。
现在,在连接时,我得到以下信息:
[16:37] :young.home.net NOTICE AUTH :** 查找您的主机名... :young.home.net NOTICE AUTH :** 找到你的主机名 平 :DE7AED31 [16:37]:DE7AED31!nospoof@young.home.net PRIVMSG 洛根:版本 :young.home.net 451 PING :你还没有注册 [16:37] :young.home.net 001 Logan :欢迎来到 YoungNet IRC 网络 Logan!lyoung@127.0.0.1 :young.home.net 002 Logan :你的主机是young.home.net,运行版本Unreal3.2.8.1 :young.home.net 003 Logan :此服务器创建于 2009 年 4 月 12 日星期日 14:47:33
我正在尝试将其清理为如下所示:
[16:37] -young.home.net- ** 查找您的主机名... [16:37] -young.home.net- ** 找到您的主机名 [16:37] [洛根] 版本 [16:37] 你还没有注册 欢迎来到 YoungNet IRC 网络 Logan!lyoung@127.0.0.1 你的主机是young.home.net,运行版本Unreal3.2.8.1 此服务器创建于 2009 年 4 月 12 日星期日 14:47:33
我已阅读 IRCP (RFC 1459) 并且了解服务器输入的格式,但我似乎无法删除不需要的内容...一位朋友建议将输入加载到数组中并处理每个项目单独,但我似乎无法使其工作。我试过了,但似乎没有什么区别......这是我的代码
Public Function recv() As String
Dim mail As String
Try
Dim Data(4096) As Byte
sock.Receive(Data, 4096, Net.Sockets.SocketFlags.None)
mail = System.Text.ASCIIEncoding.UTF8.GetString(Data)
If mail.Contains(" ") Then
If mail.Contains("PING") Then
Dim pserv As String = mail.Substring(mail.IndexOf(":"), mail.Length - mail.IndexOf(":"))
pserv = pserv.TrimEnd(Chr(0))
'MsgBox("pserv: " & pserv)
send("PONG " & pserv)
ElseIf mail.Substring(mail.IndexOf(" ") + 1, 7) = "PRIVMSG" Then
Dim tmparr() As String = Nothing
Dim rnick, rmsg As String
mail = mail.Remove(0, 1)
tmparr = mail.Split("!")
rnick = tmparr(0)
tmparr = mail.Split(":")
rmsg = tmparr(1)
mail = "<" & rnick & "> " & rmsg
ElseIf mail.Substring(mail.IndexOf(" ") + 1, 6) = "NOTICE" Then
Dim tmparr() As String = Nothing
Dim rnick, rmsg As String
mail = mail.Remove(0, 1)
tmparr = mail.Split("!")
rnick = tmparr(0)
tmparr = mail.Split(":")
rmsg = tmparr(1)
mail = "-" & rnick & "- " & rmsg
Else
Dim tmparr() As String = Nothing
Dim rnick, rmsg As String
tmparr = mail.Split(" ")
rnick = tmparr(0)
tmparr = mail.Split(":")
rmsg = tmparr(1)
mail = rmsg
End If
End If
mail = g.Timestamp & mail
Catch ex As Exception
MsgBox(ex.ToString)
mail = "ERROR: " & ex.Message & vbCrLf
End Try
Return mail
End Function
这里的任何指针将不胜感激。
【问题讨论】:
【参考方案1】:好的,在这里找到解决方案后我太忙了,我完全忘记了***......
[http://www.mirc.net/raws/][1]
[1]:http://www.mirc.net/raws/ 包含一个原始数字代码列表,这些代码将服务器输出整齐地分类到客户端应用程序。
不过,在您可以使用原始数字之前,需要进行一些拆分。见下文:
' This function takes the raw input from the server as a parameter.
' NOTE: No modification has been done before this point.
Private Function Clean(ByVal Target As String) As String
' Get each line
Dim temp() As String = Target.Split(vbCrLf)
Dim back As String = Nothing
' For each line in the current string
For i As Integer = 0 To temp.Length - 1
' Split the line
Dim result() As String = temp(i).Split(New String() " :", StringSplitOptions.None)
Dim j As Integer = Nothing
Try
' NOTICE AUTH messages aren't covered in raw format, so this cleans those up
If result(0).Contains("NOTICE AUTH") Then
If Left(result(0), 1) <> ":" Then
' g.Timestamp = "[" & Now.Hour & ":" & Now.Minute & "]"
back += g.Timestamp & " (" & result(0).Substring(2, result(0).IndexOf(" ") - 2) & ") " & result(1) & vbCrLf
Else
back += g.Timestamp & " (" & result(0).Substring(1, result(0).IndexOf(" ") - 1) & ") " & result(1) & vbCrLf
g.host = result(0).Substring(1, result(0).IndexOf(" ") - 1)
End If
End If
If Integer.TryParse(result(0).Substring(result(0).IndexOf(" ") + 1, 3), j) Then
Select Case result(0).Substring(result(0).IndexOf(" ") + 1, 3)
' For each code, modify the input here, this is just an example of what I've done...
Case "001" : back += ":=:" & vbCrLf & g.Timestamp & result(1) & vbCrLf
End Select
End If
Catch ex As Exception
End Try
Next
' More stuff goes here (handling PING? PONG! events and such)
Return back
End Function
【讨论】:
以上是关于从 IRC 服务器输入中清除不需要的文本的主要内容,如果未能解决你的问题,请参考以下文章