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 ClassOis 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 ClassTestaa. 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.