Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: Irc simulaattori

Niko [21.06.2004 22:02:40]

#

Simuloi irc kanavaa. Sisältää joinit, quitit, potkut ja viestit, käyttää xml-tiedostoa tai array:ita.
Koodi on aika huonoa ja käytää threadeja (säikeitä)

Hyödyllinen koodi, mitä se on?

Module 1

Imports System.IO
Module Module1
    Dim a As String
    Public topic As String
    Dim Threada As System.Threading.Thread
    Dim Threadb As System.Threading.Thread
    Dim Threadc As System.Threading.Thread
    Dim Threadd As System.Threading.Thread
    Dim Threade As System.Threading.Thread
    Public file As System.IO.StreamWriter
    Public data_file As System.IO.StreamReader
    Sub Main()
        logit = False
        tulosta("Tervetuloa!")
        tulosta("Voit sulkea simulaattorin seuraavasti:")
        tulosta("Heitä koneesi järveen")
        tulosta("Tai lyö näppäimistösi enter nappia kirveelle")
        tulosta("Sorsa Media ei korvaa hajonneita koneita - tai näppäimistöjä")
        tulosta("Luetaan nickit,viestit sun muut")
        tulosta("Haluatko logitus tilaan? (k/e) ", 0)
        Do
            logi = Console.ReadLine '' Otetaan vastaus
        Loop While Not logi = "k" And Not logi = "e"
        If logi = "k" Then
            tulosta("Anna tiedoston nimi: ")
            logi = Environment.CurrentDirectory + "\" & Console.ReadLine & ".log"
            logit = True
        End If
        If Right(Environment.CommandLine(), 8) = "-xml=off" Then
            tulosta("Käytetään sisäisiä tietoja")
            alusta()
            xml = False
        ElseIf Right(Environment.CommandLine(), 7) = "-xml=on" Then
            tulosta("Käytetään data.xml tiedostoa")
            Alusta_xml()
            xml = True
        Else
            tulosta("Käytetään data.xml tiedostoa")
            Alusta_xml()
            xml = True
        End If
        arvo_tilat()
        topic = RandomTopic()
        tulosta("* Now Talking in #sorsa-media")
        tulosta_tilat()
        tulosta("* Topic is '" + topic + "'")
        Threada = New System.Threading.Thread(AddressOf thread)  '' Annetaan säikeille ali ohjelmat
        Threadb = New System.Threading.Thread(AddressOf thread2)
        Threadc = New System.Threading.Thread(AddressOf thread3)
        Threadd = New System.Threading.Thread(AddressOf thread4)
        Threade = New System.Threading.Thread(AddressOf thread5)
        Threada.Start()
        Threadb.Start() '' Käynnistetään säikeet
        Threadc.Start()
        Threadd.Start()
        Threade.Start()
    End Sub

    Sub thread()
        Do
            Randomize()
            Dim temp(2) As String
            temp = RandomNick()
            If (temp(2) = 1) Then
                Dim msgtemp As String = RandomMsg(temp(0))
                If Not msgtemp = "" Then
                    tulosta("<" & temp(1) & temp(0) & "> " & msgtemp)
                End If
            End If
            Threada.Sleep(Int((3000 - 0 + 1) * Rnd() + 1)) '' Odotetaan seuraavaan viestiin
        Loop
    End Sub

    Sub thread2()
        Do
            Randomize()
            Threadb.Sleep(Int((40000 - 0 + 1) * Rnd() + 1)) '' Odotetaan seuraavaan vaihtoon eikä vaihdeta heti
            Dim temp(2) As String
            temp = RandomNick()
            If (temp(2) = 1) Then '' Vaihdetaan vain jos on paikalla
                If (temp(1) = "@") Or (temp(1) = "%") Then '' Ja on op lisää aikaa vaihtojen välillä
                    tulosta("* " + temp(1) + temp(0) + " changes topic to '" + RandomTopic() + "'")
                End If
            End If

        Loop
    End Sub

    Sub thread3()
        Do
            a = Console.ReadLine
            If a = "/quit" Then '' Halutaan lopettaa
                tulosta("* Disconnected")
                database.AcceptChanges() '' Hyväksytään muutoksen
                Dim rs As New System.IO.FileStream(Environment.CurrentDirectory + "\data.xml", System.IO.FileMode.Open)
                database.WriteXml(rs) '' Tallennetaan tietokantaan (miksi ihmeessä)?
                tulosta("*** Quiting")
                End
            ElseIf a = "/names" Then '' Näytetään kanavalla olijat
                tulosta_tilat()
            ElseIf a = "/topic" Then '' Näytetään topic
                tulosta("* Topic is '" + topic + "'")
            End If
        Loop
    End Sub

    Sub thread4()
        Do
            Randomize()
            If xml = False Then
                Dim num As Integer
                num = Int((UBound(nicks) - LBound(nicks) + 1) * Rnd() + LBound(nicks))
                Threadd.Sleep(Int((50000 - 0 + 1) * Rnd() + 1))
                If (nicks(num, 2) = 0) Then '' Liittyy tai poistuu kanavalta
                    nicks(num, 2) = 1
                    nicks(num, 1) = ""
                    tulosta("* " + nicks(num, 0) + " has joined #sorsa-media")
                Else
                    nicks(num, 2) = 0
                    nicks(num, 1) = ""
                    Dim quitmess As String
                    quitmess = nicks(num, 0) ' Oma nick
                    tulosta("* " + nicks(num, 0) + " has quit irc (" + quitmess + ")")
                End If
            Else '' Xml
                Dim num As Integer
                num = Int(((database.Tables("nick").Rows.Count - 1) - 0 + 1) * Rnd() + 0)
                Threadd.Sleep(Int((50000 - 0 + 1) * Rnd() + 1)) ' Odotetaan

                If (database.Tables("nick").Rows(num).Item("paikalla") = 0) Then '' Liittyy tai poistuu kanavalta
                    database.Tables("nick").Rows(num).Item("paikalla") = 1
                    database.Tables("nick").Rows(num).Item("tila") = tilat(0)
                    tulosta("* " + database.Tables("nick").Rows(num).Item("nickname") + " has joined #sorsa-media")
                Else
                    database.Tables("nick").Rows(num).Item("paikalla") = 0
                    database.Tables("nick").Rows(num).Item("tila") = tilat(0)
                    Dim quitmess As String
                    quitmess = database.Tables("nick").Rows(num).Item("nickname") '' Oma nick
                    tulosta("* " + database.Tables("nick").Rows(num).Item("nickname") + " has quit irc (" + quitmess + ")")
                End If
            End If
            database.AcceptChanges() '' Tallennetaan taas kun on tilat vaihtunut jos on
            Dim rs As New System.IO.FileStream(Environment.CurrentDirectory + "\data.xml", System.IO.FileMode.Open)
            database.WriteXml(rs)
            rs.Close()
        Loop
    End Sub

    Sub thread5()
        Do
            If xml = False Then '' Ei xml
                Randomize()
                Threadb.Sleep(Int((66000 - 0 + 1) * Rnd() + 1))
                Dim temp(2) As String
                Dim num As Integer = Int((UBound(nicks) - LBound(nicks) + 1) * Rnd() + LBound(nicks))
                temp = RandomNick()
                If (temp(2) = 1) Then
                    If (temp(1) = "@") Or (temp(1) = "%") Then
                        tulosta("* " & nicks(num, 0) & " was kicked by " & temp(0) & " (" & "" & ")")
                        nicks(num, 1) = ""
                        nicks(num, 2) = 0
                    End If
                End If
            Else '' Xml
                Randomize()
                Threadb.Sleep(Int((66000 - 0 + 1) * Rnd() + 1))
                Dim temp(2) As String
                Dim num As Integer = Int(((database.Tables("nick").Rows.Count - 1) - 0 + 1) * Rnd() + 0) '' Tarvitan id
                temp = RandomNick() '' Otetaan potkasija
                If (temp(2) = 1) Then
                    If (temp(1) = "@") Or (temp(1) = "%") Then
                        tulosta("* " & database.Tables("nick").Rows(num).Item("nickname") & " was kicked by " & temp(0) & " (" & temp(0) & ")")
                        database.Tables("nick").Rows(num).Item("tila") = " "
                        database.Tables("nick").Rows(num).Item("paikalla") = 0
                    End If
                End If
            End If
        Loop
    End Sub
End Module

Module 2

Module Module2
    Public database As New DataSet("Database") '' Uusi dataset Database
    Public topics(0) As String
    Public nicks(0, 2) As String '' Jos haluat käyttää ei xml ei tartte muokata
    Public msgs(0) As String
    Public tilat(3) As String
    Public logi As String
    Public logit As Boolean
    Public xml As Boolean
    Sub alusta() '' Normaali alustus
        tilat(0) = " " ' Mahdolliset tilat
        tilat(1) = "+"
        tilat(2) = "%"
        tilat(3) = "@"
        topics(0) = "käytä xml tilaa"
        nicks(0, 0) = "käytä xml tilaa"
        msgs(0) = "käytä xml tilaa" '' Tähän voi lisätä
    End Sub

    Sub Alusta_xml() '' Xml alustus
        tulosta("Luetaan... data.xml")
        tilat(0) = " "
        tilat(1) = "+"
        tilat(2) = "%"
        tilat(3) = "@"
        If System.IO.File.Exists(Environment.CurrentDirectory + "\data.xml") Then
            Dim rs As New System.IO.FileStream(Environment.CurrentDirectory + "\data.xml", System.IO.FileMode.Open)
            Dim xml_reader_database As New System.Xml.XmlTextReader(rs)
            database.ReadXml(xml_reader_database) '' Luetaan
            tulosta("data.xml luettu")
            xml_reader_database.Close() '' Suljetaan xml lukija
            tulosta("Käsitellään...")
        Else
            tulosta("data.xml ei löytynyt", False)
            Console.ReadLine() '' Jotta näkee virheen
            End
        End If
    End Sub

    Function RandomTopic()
        Randomize()
        If xml = False Then
            Return topics(Int((UBound(topics) - LBound(topics) + 1) * Rnd() + LBound(topics)))
        Else
            Return database.Tables("aiheet").Rows(((Int(((database.Tables("aiheet").Rows.Count - 1) - 0 + 1) * Rnd() + 0)))).Item(0)
        End If
    End Function

    Function RandomNick()
        Randomize()
        If xml = False Then '' Ei xml
            Dim temp(2) As String
            Dim num As Integer
            num = Int((UBound(nicks) - LBound(nicks) + 1) * Rnd() + LBound(nicks))
            temp(0) = nicks(num, 0)
            temp(1) = nicks(num, 1)
            temp(2) = nicks(num, 2)
            Return temp
        Else '' Xml
            Dim temp(2) As String
            Dim num As Integer
            num = Int(((database.Tables("nick").Rows.Count - 1) - 0 + 1) * Rnd())
            temp(0) = database.Tables("nick").Rows(num).Item(0)
            temp(1) = database.Tables("nick").Rows(num).Item(1)
            temp(2) = database.Tables("nick").Rows(num).Item(2)
            Return temp
        End If
    End Function

    Function RandomMsg(ByVal msgnick As String)
        Randomize()
        If xml = False Then '' Ei xml
            Dim temp As String = msgs(Int((UBound(msgs) - LBound(msgs) + 1) * Rnd() + LBound(msgs)))
            Return temp
        Else '' Xml
            Dim temp As String
            Dim temp2 As String
            Dim num As Integer '' Ainut ero ei xml versioon jokaisella voi olla omat viestit (0 = kaikkien)
            num = Int(((database.Tables("viestit").Rows.Count - 1) - 0 + 1) * Rnd())
            temp = database.Tables("viestit").Rows(num).Item("nickname")
            If temp = msgnick Or temp = "0" Then '' Vain jos on oma tai kaikkien (hidastaa)
                Return database.Tables("viestit").Rows(num).Item("viesti")
            End If
        End If
    End Function
    Function TimeStamp() As String
        Return "[" + TimeString + "] " ' Annetaan timestamp
    End Function

    Function tulosta(ByVal viesti As String, Optional ByVal vaihda_rivi As Boolean = 1, Optional ByVal ts As Boolean = 1)
        If vaihda_rivi = False Then
            If ts = False Then
                Console.Write(viesti) '' Ei TimeStamppia tai rivin vaihtoa
            Else
                Console.Write(TimeStamp() & viesti) '' Time stamp ei rivi vaihtoa
            End If
        Else
            If ts = False Then
                Console.WriteLine(viesti) '' Rivi vaihto ei timestamp
            Else
                Console.WriteLine(TimeStamp() & viesti) '' Rivi vaihto ja TimeStamp oletus
            End If
        End If
        If logit = True Then
            file = New System.IO.StreamWriter(logi, True) '' Avataan
            file.WriteLine(TimeStamp() & viesti) '' Kirjoitetaan tiedostoon
            file.Close() '' Tallennetaan ja suljetaan jotta näkyisi muutokset heti
        End If
    End Function

    Function arvo_tilat()
        If xml = False Then
            Dim i As Integer
            For i = LBound(nicks) To UBound(nicks)
                Randomize()
                nicks(i, 1) = tilat(Int((UBound(tilat) - LBound(tilat) + 1) * Rnd() + LBound(tilat)))
                Randomize()
                nicks(i, 2) = (Int((1 - 0 + 1) * Rnd() + 0))
            Next
        Else
            Dim i As Integer
            For i = 0 To database.Tables("nick").Rows.Count - 1
                Randomize()
                database.Tables("nick").Rows(i).Item("tila") = tilat(Int((UBound(tilat) - LBound(tilat) + 1) * Rnd() + LBound(tilat)))
                database.Tables("nick").Rows(i).Item("paikalla") = (Int((1 - 0 + 1) * Rnd() + 0))
            Next
        End If
    End Function

    Function tulosta_tilat()
        Dim i As Integer
        tulosta("#sorsa-media ", 0)
        For i = LBound(nicks) To UBound(nicks) Step 4
            On Error Resume Next
            If (nicks(i, 2) = 1) Then
                Console.Write(nicks(i, 1) & nicks(i, 0))
            End If
            If (nicks(i + 1, 2) = 1) Then
                Console.Write(" " & nicks(i + 1, 1) & nicks(i + 1, 0))
            End If
            If (nicks(i + 2, 2) = 1) Then
                Console.Write(" " & nicks(i + 2, 1) & nicks(i + 2, 0))
            End If
            If (nicks(i + 3, 2) = 1) Then
                Console.Write(" " & nicks(i + 3, 1) & nicks(i + 3, 0))
            End If
            Console.Write(vbNewLine & TimeStamp() & "             ")
        Next
        tulosta(vbNewLine & TimeStamp() & "#sorsa-media End of NAMES list.", , 0)
    End Function
End Module

data.xml

<ircsimu>
  <nick>
    <nickname>Tyyppi1</nickname>
    <tila>0</tila>
    <paikalla>0</paikalla>
  </nick>
  <nick>
    <nickname>Tyyppi2</nickname>
    <tila>0</tila>
    <paikalla>0</paikalla>
  </nick>
  <viestit>
    <nickname>Tyyppi1</nickname>
    <viesti>Olen Tyyppi1</viesti>
  </viestit>
  <viestit>
    <nickname>Tyyppi2</nickname>
    <viesti>Olen Tyyppi2</viesti>
  </viestit>
  <viestit>
    <nickname>0</nickname>
    <viesti>Testi</viesti>
  </viestit>
  <aiheet>
    <aihe>Hyvää iltapäivää</aihe>
  </aiheet>
  <aiheet>
    <aihe>Moi.</aihe>
  </aiheet>
</ircsimu>

Vastaus

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

Tietoa sivustosta