Wünsch dir was: Chatserver

  • Hi!

    Ich schreib nebenbei immer an meinem Chatserver. Ich wollte mal ein paar Vorschläge hören für Befehle und Features. Das Ganze ist so ähnlich wie IRC.

    Momentan:

    • Posten
    • Whispern
    • Actions
    • Unterscheidung zwischen Team und Usern
    • Kick / Bann

    Was wünscht Ihr euch noch von einem Chat?

  • Vielleicht ein Paar integrierte Bots (Quiz-Bot; einen, der Nachrichten zensiert; ...)
    Auf jeden Fall würde ich mir aber ein sehr einfaches Protokoll wünschen.

    MfG, James

  • OK auf die Liste kommen:

    • Ein universeller Bot (James der Bottler :rofl: )
    • Bann nach Hardware ID
    • Bad Words

    Ein einfaches Protokoll ist es sowieso :D

  • Trifft sich gut, ich bin gerade an einem sehr ähnlichen "Nebenher-Projekt"... ^^ Also was auch sehr praktisch sein kann, ist ein wahlweise aktivierbarer Passwortschutz für 'eigene'/selbst erstellte/bestehende Chatrooms. Auch sollte es natürlich möglich sein, neben dem 'whispern' auch einen richtigen Chat zwischen 2 oder eventuell auch mehr Usern beginnen zu können, in dem man für sich ist...

    LG
    Christoph :)

  • Hab da nochwas. Vielleicht brauchst du es.

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iListen1 = 0
    Global $iListen2 = 0
    Global $iCountClient = 0
    Global $sData, $iIndex, $iAccept1, $iAccept2
    Global $iMaxClients = 3
    Global $aClient[$iMaxClients]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICreate("Multi-Server", 400, 600, 50, 50, -1, $WS_EX_TOPMOST)
    $cMemo = GUICtrlCreateEdit("", 10, 10, 380, 580, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $iListen1 = TCPListen(@IPAddress1, 8080)
    If $iListen1 = -1 Then _Exit()

    [/autoit] [autoit][/autoit] [autoit]

    $iListen2 = TCPListen("127.0.0.1", 8080)
    If $iListen2 = -1 Then _Exit()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $iAccept1 = TCPAccept($iListen1)
    $iAccept2 = TCPAccept($iListen2)
    If $iAccept1 >= 0 Or $iAccept2 >= 0 Then
    If $iCountClient < $iMaxClients Then
    If $iAccept1 >= 0 Then $aClient[$iCountClient] = $iAccept1
    If $iAccept2 >= 0 Then $aClient[$iCountClient] = $iAccept2
    _GUICtrlEdit_AppendText($cMemo, "New client connected - ID: " & $aClient[$iCountClient] & @CRLF)
    TCPSend($aClient[$iCountClient], "Hello:" & String($aClient[$iCountClient]))
    $iCountClient += 1
    Else
    If $iAccept1 >= 0 Then TCPSend($iAccept1, "Full")
    If $iAccept2 >= 0 Then TCPSend($iAccept2, "Full")
    TCPCloseSocket($iAccept1)
    TCPCloseSocket($iAccept2)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $iCountClient > 0 Then
    For $i = 0 To $iCountClient - 1
    $sData = TCPRecv($aClient[$i], 1024)
    If $sData <> "" Then
    If $sData = "Quit" Then
    _GUICtrlEdit_AppendText($cMemo, $aClient[$i] & " Disconnected" & @CRLF)
    $aClient[$i] = 0
    Else
    If $sData <> "Alive" Then
    _GUICtrlEdit_AppendText($cMemo, $sData & @CRLF)
    For $k = 0 To $iCountClient - 1
    TCPSend($aClient[$k], $sData)
    Next
    EndIf
    EndIf
    EndIf
    Next
    $iIndex = 0
    Do
    If $aClient[$iIndex] > 0 Then
    $iIndex += 1
    Else
    TCPCloseSocket($aClient[$iIndex])
    _ArrayDelete($aClient, $iIndex)
    _ArrayAdd($aClient, "")
    $iCountClient -= 1
    If $iIndex > 0 Then $iIndex -= 1
    EndIf
    Until $iIndex = $iCountClient
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    If $iCountClient > 0 Then
    For $i = 0 To $iCountClient - 1
    TCPCloseSocket($aClient[$i])
    Next
    EndIf
    TCPCloseSocket($iListen1)
    TCPCloseSocket($iListen2)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=Client.exe
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GuiEdit.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iConnect, $sData, $hGui, $aAccelKeys[1][2]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("Client", 400, 200)
    $cMemo = GUICtrlCreateEdit("", 10, 10, 380, 150, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    $cMsg = GUICtrlCreateInput("", 10, 170, 300, 20)
    $cSend = GUICtrlCreateButton("Senden", 320, 170, 70, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlSetOnEvent($cSend, "_Send")

    [/autoit] [autoit][/autoit] [autoit]

    $aAccelKeys[0][0] = "{ENTER}"
    $aAccelKeys[0][1] = $cSend
    GUISetAccelerators($aAccelKeys)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $iConnect = TCPConnect(TCPNameToIP("server.dyndns.org"), 8080)
    ;~ $iConnect = TCPConnect("127.0.0.1", 8082)
    If $iConnect = -1 Then
    MsgBox(16, "Fehler", "Konnte nicht verbinden.")
    _Exit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $sData = TCPRecv($iConnect, 1024)
    If $sData <> "" Then
    ConsoleWrite($sData & @CRLF)
    $aSS = StringSplit($sData, ":")
    Switch $aSS[1]
    Case "Full"
    MsgBox(16, "Fehler", "Server akzeptiert keine Verbindungen mehr.")
    _Exit()
    Case "Hello"
    $sID = $aSS[2]
    WinSetTitle($hGui, "", "Client " & $aSS[2])
    AdlibRegister("_KeepAlive", 500)
    Case Else
    If $aSS[0] > 1 Then
    $sData = ""
    For $i = 2 To $aSS[0]
    $sData &= $aSS[$i] & ":"
    Next
    $sData = StringTrimRight($sData, 1)
    If $aSS[1] = $sID Then
    _GUICtrlEdit_AppendText($cMemo, "Ich: " & $sData & @CRLF)
    Else
    _GUICtrlEdit_AppendText($cMemo, $aSS[1] & ": " & $sData & @CRLF)
    EndIf
    EndIf
    EndSwitch
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _KeepAlive()
    TCPSend($iConnect, "Alive")
    If @error Then
    MsgBox(16, WinGetTitle($hGui) & " - Fehler", "Senden fehlgeschlagen.")
    _Exit()
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Send()
    If GUICtrlRead($cMsg) = "" Then Return
    TCPSend($iConnect, $sID & ":" & GUICtrlRead($cMsg))
    GUICtrlSetData($cMsg, "")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    AdlibUnRegister()
    TCPSend($iConnect, "Quit")
    TCPCloseSocket($iConnect)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]
  • Es gibt bereits Rooms (#room) auf dem Server. Registrieren kann man einen neuen Room auch schon. Alles natürlich mit Passwörtern. Das mit dem separaten Whisper ist ja eine Sache des Clients, nicht des Servers. ;)

  • Die Dateiübertragung läuft Binär ab über TCP. Da wirst du keine Probleme bekommen bei mehreren.

  • In dem Deutschen Chat Knuddels gibt es schon einen Bot der heißt James ^^

    Wollt ich nur mal so erwähnt haben löl


    |> Kannst ja auch eine *Würfel Funktion* einbauen. Nur so ne Idee ^^

  • So eure Wünsche werden fast alle erfüllt. In ca. einer Woche steht dann der Server, und dann gibts den Client ;)

    Dauert, gibt Probleme mit der hardware.

    Einmal editiert, zuletzt von minx (24. August 2012 um 16:18)

  • Heyho ,

    Ich möchte nicht nerven , aber sollte der server nicht in einer Woche fertig sein ? :S

  • Haste schon Smileys? Vlt. Sone "Erzählen sie, was sie gerade machen"-Zeile wie bei Skype ( aber ich denke, dass ist eher Client bezogen :/ ).

    Ansonsten: Öffentlicher und Privater Chat.
    Also öffentlich sind halt Bereiche vo so 20 Leute rein können und reden können ( ähnlich wie hier die Shoutbox ) und Private chats sind halt nur für Freunde ( mit einladung ) und so.

    Wäre so meine Idee, ist aber glaub ich ein wenig sehr aufwendig.

    mfg
    Hauke