Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Irc-botti VB .NETillä

Schizo [24.12.2004 02:03:28]

#

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

Cc [27.12.2004 01:24:31]

#

Ois aika mukavaa jos joku tämän vielä tavalliselle vb:lle kääntäisi...

Bill Keltanen [27.12.2004 08:42:09]

#

Ei olis, vb:lle se nyt on ihan helppo tehä

efteri [27.12.2004 11:12:46]

#

Bill Keltanen kirjoitti:

Ei olis, vb:lle se nyt on ihan helppo tehä

No teeppä sitten jos se niin helppoa on :))

Juice [27.12.2004 20:45:14]

#

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ä.

Schizo [28.12.2004 03:10:11]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta