Elikkäs olis pientä probleemaa. Yritän tässä portata mureakuhasta löydettyä C#-irc-bottia Visual Basic .netille, mutta en saa ohjelmaa toimimaan. Kääntäjä väittää että "Ei voida kirjoittaa suljettuun TextWriter-kohteeseen", joten uskoisin että ongelmana on noiden writer- ja reader-streamien ennenaikainen sulkeminen, mutta nämä nettijutut eivät ole vahvinta alaani, ja tarttisin hieman asiantuntevampaa avustusta. Itse koodi tässä, ja alkuperäinen Pasi Havian C#-ohjelma löytyy http://mureakuha.com/koodikirjasto/153 .
***Ircbot.vb Imports System Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Threading ' Ohjelma konnektaa irc-servuun, tulee kanavalle ja morottaa kaikkia kutka sinne joinivat. ' Koodi alunperin Pasi Havian C#:aa, portattu mureakuha.comista. Public Class Ircbot ' Serveri, jonne yhistetään. Public Shared SERVER As String = "irc.quakenet.org" ' Serverin portti, 6667 defaulttina. Private Const PORT As Integer = 6667 ' Käyttäjäinfoa, joka lähetetään irc-servulle. Private Const USER As String = "USER VBBot 8 * :Irc Bot" Private Const NICK As String = "VBBot" Private Const CHANNEL As String = "#testi_kanava" Public Shared writer As StreamWriter Shared Sub Main() Dim stream As NetworkStream Dim irc As TcpClient Dim inputLine As String Dim reader As StreamReader Dim nickname As String Try irc = New TcpClient(SERVER, PORT) stream = irc.GetStream reader = New StreamReader(stream) writer = New StreamWriter(stream) Dim ping As PingSender ping = New PingSender ping.Start() writer.WriteLine(USER) writer.Flush() writer.WriteLine("NICK " + NICK) writer.Flush() writer.WriteLine("JOIN " + CHANNEL) writer.Flush() While (True) While ((inputLine = reader.ReadLine()) <> Nothing) If (inputLine.EndsWith("JOIN :" & CHANNEL)) Then ' Kattotaan kuka tuli. nickname = inputLine.Substring(1, inputLine.IndexOf("!") - 1) ' Ja morotetaan hyötä. writer.WriteLine("NOTICE " + nickname + " :Hi " + nickname + _ " and welcome to " + CHANNEL + " channel!") writer.Flush() Thread.Sleep(2000) End If End While writer.Close() reader.Close() irc.Close() End While Catch ex As Exception Console.WriteLine(ex.ToString) Thread.Sleep(10000) Main() End Try End Sub End Class ***PingSender.vb Imports System Imports System.Threading ' Luokka pingin lähettämiseen servulle 15 sekunnin välein. Public Class PingSender Private Const PING As String = "PING :" Private pingSender As Thread Public Sub New() pingSender = New Thread(New ThreadStart(AddressOf Me.Run)) End Sub Public Sub Start() pingSender.Start() End Sub Public Sub Run() While (True) ' Tästä rivistä kääntäjä älähtää. ' Ei voi kirjoittaa suljettuun TextWriter-kohteeseen. Ircbot.writer.WriteLine(PING + Ircbot.SERVER) Ircbot.writer.Flush() Thread.Sleep(15000) End While End Sub End Class
Ois aika mukavaa jos joku tämän vielä tavalliselle vb:lle kääntäisi...
Ei olis, vb:lle se nyt on ihan helppo tehä
Bill Keltanen kirjoitti:
Ei olis, vb:lle se nyt on ihan helppo tehä
No teeppä sitten jos se niin helppoa on :))
Ircbot-luokka "korjattuna":
Public Class Ircbot ' Serveri, jonne yhistetään. Public Shared SERVER As String = "irc.quakenet.org" ' Serverin portti, 6667 defaulttina. Private Const PORT As Integer = 6667 ' Käyttäjäinfoa, joka lähetetään irc-servulle. Private Const USER As String = "USER VBBot 8 * :Irc Bot" Private Const NICK As String = "VBBot" Private Const CHANNEL As String = "#testi_kanava" Public Shared writer As StreamWriter Shared Sub Main() Dim stream As NetworkStream Dim irc As TcpClient Dim inputLine As String Dim reader As StreamReader Dim nickname As String Try irc = New TcpClient(SERVER, PORT) stream = irc.GetStream reader = New StreamReader(stream) writer = New StreamWriter(stream) Dim ping As PingSender ping = New PingSender ping.Start() writer.WriteLine(USER) writer.Flush() writer.WriteLine("NICK " + NICK) writer.Flush() writer.WriteLine("JOIN " + CHANNEL) writer.Flush() While (True) While ((inputLine = reader.ReadLine()) <> Nothing) If (inputLine.EndsWith("JOIN :" & CHANNEL)) Then ' Kattotaan kuka tuli. nickname = inputLine.Substring(1, inputLine.IndexOf("!") - 1) ' Ja morotetaan hyötä. writer.WriteLine("NOTICE " + nickname + " :Hi " + nickname + _ " and welcome to " + CHANNEL + " channel!") writer.Flush() Thread.Sleep(2000) End If End While End While irc.Close() writer.Close() reader.Close() Catch ex As Exception Console.WriteLine(ex.ToString) Thread.Sleep(10000) Main() End Try End Sub End Class
Testaa. Itselläni toimi jotenkuten.
Vikana on/oli kuitenkin se, että ensin kirjoitetaan, sitten suljetaan ja sitten aloitetaan ikuinen looppi alusta kirjoittamalla, sitten taas suljetaan jne., eli sulkemiskäskyjen laittaminen silmukan ulkopuolelle, järkevämpään kohtaan auttaa. Loogista. Eiköhän se tästä.
Kiits avusta, mutta ei oikein suostu connektaamaan tuo botti. Kokeilin antaa tuon yhdistää pitkän aikaa, mutta eipä bottia näkynyt channulle ilmestyvän, tosin eipä antanut virheilmoitustakaan. Kyllähän tuo pitäisi irc-clientillä huomata? Ja yhdessä vaiheessa kääntäjä älähti rivistä
If (inputLine.EndsWith("JOIN :" & CHANNEL)) Then, mutta ei ole se koommin virheilmoituksia antanut. Tokihan konnektaamisvika voi piillä myös serverissä, mutta empähän vain usko. Noh, kokeilen värkätä jotain.
Aihe on jo aika vanha, joten et voi enää vastata siihen.