Kleiner Chat wenn alle üblichen Möglichkeiten gesperrt sind

  • Moin liebe Community! Also ich bin ganz neu bei AutoIt und muss mich erst noch mal reinfuchsen, aber naja aber wird schon...
    Ich hab jetzt erst mal einen Versuch mit einem Chat in Angriff genommen.

    Also ich wollte mal einen Chat realisieren in Umgebungen wo Mailslot, NetBIOS (netsend) and Messenger Service gesperrt sind, aber man Netzwerkordner hat mit Schreib- und Lesezugriff.

    Hab mal kurz das hier geschrieben, so als erste schnelle Idee:

    Spoiler anzeigen
    [autoit]


    ;include files
    #include <GuiConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>
    #Include <File.au3>
    #Include <WinAPI.au3>
    #include <Date.au3>
    #NoTrayIcon

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

    ;path of DB
    $chatfile = "\\NETZWERKORDNER\chat.txt"
    Dim $line = ""
    Dim $chatmessage = ""
    Dim $displaymessage = ""

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

    ;username

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

    $username = InputBox("Shared Folder Chat","Please enter your username.")
    If $username = "" Then
    MsgBox(16,"Error","A username must be entered.")
    Exit
    EndIf

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

    ;GUIcreation
    $chatwindow = GUICreate("Shared Folder Chat", 300, 700)
    $GUIedit = GUICtrlCreateEdit("",5,25,290,640,BitOR($ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL,$ES_AUTOVSCROLL))
    $GUIinput = GUICtrlCreateInput("",5,670,290,25,BitOR($ES_NOHIDESEL,$ES_CENTER,$ES_AUTOHSCROLL))
    GUISetState()

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

    ;###################################
    ; MAIN #############################
    _onlinenotification()
    _history()
    $countlines = _FileCountLines($chatfile)

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

    Do
    _MySleep(30)
    $msg = GUIGetMsg()
    $countlinesneu = _FileCountLines($chatfile)

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

    Select
    Case $countlines <> $countlinesneu
    receivemessage()

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

    Case $msg = $GUIinput
    Sendmessage()

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

    EndSelect
    ;~ EndIf
    Until $msg = $GUI_EVENT_CLOSE;To be able to close the Window!
    _offlinenotification()
    Exit

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

    ;#################################################################################################################################
    ; FUNCTIONS
    ;#################################################################################################################################

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

    Func Sendmessage()

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

    $chatmessage = GUICtrlRead($GUIinput)
    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    $displaymessage = @HOUR & ":" & @MIN & ":" & @SEC & " <"&$username&">: "&$chatmessage
    FileWriteLine($file, $displaymessage)
    FileClose($file)
    GUICtrlSetData($GUIinput,"")

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func receivemessage()

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

    $file = FileOpen($chatfile, 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    $line = FileReadLine($chatfile, -1)
    print($line)
    ;~ If GUICtrlGetState($GUIcheckbox) = 3 Then
    If $line <> $displaymessage Then
    _WinAPI_FlashWindowEx($chatwindow, 2, 10)
    EndIf

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

    FileClose($chatfile)

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

    $countlines = $countlinesneu

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func _MySleep($SL_Time)
    Local $SL_Timer = TimerInit()
    While TimerDiff($SL_Timer) < $SL_Time
    Sleep(10)
    WEnd
    EndFunc

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

    ;#################################################################################################################################

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

    Func Print($line)
    _GUICtrlEdit_AppendText($GUIedit,@CRLF&$line)
    EndFunc ;==> Print

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

    ;#################################################################################################################################

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

    Func _onlinenotification()

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

    ;notification who is going online

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

    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    FileWriteLine($file, ">>> "&$username&" is now online. <<<")
    FileClose($file)

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

    EndFunc

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

    ;#################################################################################################################################
    Func _offlinenotification()

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

    ;notification who is going offline

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

    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    FileWriteLine($file, ">>> "&$username&" is now offline. <<<")
    FileClose($file)

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func _history()

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

    $file = FileOpen($chatfile, 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    $history = FileRead($chatfile)
    print($history)

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

    FileClose($file)
    EndFunc

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

    ;#################################################################################################################################

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

    Eigentlich funzt der auch, aber dabei gibt es einen Bug wo ich nicht weiter weiß.
    Wenn man gerade am tippen ist und der Chatpartner schickt gerade eine Nachricht, dann wird das wo ich gerade am tippen bin sofort gesendet, sprich es kommen immer halb fertige Nachrichten an.

    Außerdem weiß ich gar nicht ob denn das überhaupt viel Traffic verursacht im Netzwerk?
    Wenn die txt-Datei klein bleibt, dann sollte es doch ok sein, oder?
    Dachte man könnte vielleicht beim schließen oder so alles löschen bis auf die letzten 20 Zeilen. Naja wäre ne Idee muss ich dann mal versuchen einzubauen...

    3 Mal editiert, zuletzt von klausdiemaus (7. Juli 2011 um 22:24)

  • Also ich habs jetzt nicht getestet, aber ein paar Sachen sind mir aufgefallen:

    1. deine mysleep Funktion macht irgendwie keinen Sinn, statt diese Funktion aufzurufen könntest du genausogut ein sleep(30) oben in deiner gui Schleif einbauen.
    2. da ich es nicht getestet habe bin ich unsicher, jedoch schaut es für mich so aus, als ob du prinzipiell bei jeder Eingabe in das Feld etwas in die Datei schreibst. Wäre ein sendbutton da nicht sinnvoller, damit nur etwas geschickt wird wenn du fertig mit schreiben bist?
    3. Das ganze System wird Probleme machen, da es nicht möglich ist zeitgleich in eine Datei zu schreiben. Es wäre vermutlich besser jedem Teilnehmer eine eigene Datei zuzuweisen, dann kommt es auch nicht zu Zugriffsproblemen/überschneidungen.
    4. Noch besser wäre aber eine TCP basierte Verbindung ohne Dateien, das könnte aber je nach System an Sicherheitseinstellungen und Berechtigungen scheitern.
    5. die Funktion deletehistory fehlt.

  • Zitat

    3. Das ganze System wird Probleme machen, da es nicht möglich ist zeitgleich in eine Datei zu schreiben. Es wäre vermutlich besser jedem Teilnehmer eine eigene Datei zuzuweisen, dann kommt es auch nicht zu Zugriffsproblemen/überschneidungen.

    Doch, Lesen braucht auch Zugriff!

    Zitat

    4. Noch besser wäre aber eine TCP basierte Verbindung ohne Dateien, das könnte aber je nach System an Sicherheitseinstellungen und Berechtigungen scheitern.


    Das netzwerk müsste über LAN /WLAN /DLAN ... sein, wenn beim Server einmal auf "Nicht Blocken" geklickt wurde, sollte die Kommunikation klappen. Außerdem hat es auch den Vorteil das mehr als 2 Leute connecten können, wenn man das einbaut. Bei den Dateien wird es dann langsam schwierig.

    [autoit]


    TCPStartup
    TCPListen
    TCPAccept
    TCPConnect
    TCPNameToIp
    TCPSend
    TCPRecv
    TCPCloseSocket
    TCPShutdown

    [/autoit]


    Multi-Chat

  • Zitat

    wenn beim Server einmal auf "Nicht Blocken" geklickt wurde, sollte die Kommunikation klappen.

    Nur wenn du über ausreichende Berechtigungen verfügst. Für mich hörten sich die Schilderungen aber eher nach einer Workstation (Schule/Firma ?) an auf welcher man selbst in der Regel nur sehr eingeschränkte Rechte hat.

  • Vielen Dank für eure Antworten!

    Nur wenn du über ausreichende Berechtigungen verfügst. Für mich hörten sich die Schilderungen aber eher nach einer Workstation (Schule/Firma ?) an auf welcher man selbst in der Regel nur sehr eingeschränkte Rechte hat.

    Richtig! Darum geht es.
    Also wird es leider nichts mit TCP etc.

    Zitat

    3. Das ganze System wird Probleme machen, da es nicht möglich ist zeitgleich in eine Datei zu schreiben. Es wäre vermutlich besser jedem Teilnehmer eine eigene Datei zuzuweisen, dann kommt es auch nicht zu Zugriffsproblemen/überschneidungen.

    hmmm ok dann müsste ich ja für jeden Nutzer eine angepasste Version machen...

    Also Nutzer 1 schreibt in die 1.txt und liest aus der 2.txt
    und Nutzer 2 schreibt in die 2.txt und liest aus der 1.txt

    Aber dann hätte ich ja auch gleichzeitigen Schreib- und Lesezugriff, also Nutzer 1 schreibt gerade in die 1.txt und Nutzer 2 liest gerade aus der 1.txt

    Ja das mit dem Send-Button wäre eine Möglichkeit... Aber ich fand die Lösung mit ENTER bequemer.
    Aber vielleicht müsste ich für den ENTER-Button dann einen Hotkey machen?
    Oder wie würdet ihr das machen?

    5. die Funktion deletehistory fehlt.

    Ja stimmt die Funktion fehlt.
    Ich hab aus dem Code mal ein paar Sachen rausgenommen um es für euch übersichtlicher zu machen.
    Und dabei hab ich wohl die eine Zeile vergessen... sorry

  • Also um das Problem mit den Dateizugriffen zu minimieren kann man auch etwas anders vorgehen wie du das machst.

    Man könnte zum Beispiel für jede Nachricht eine Textdatei verwenden, welche nach dem lesen gelöscht wird. Um die Nachrichten aller Teilnehmer auseinanderhalten zu können sollte jeder Nutzer des Programmes einen Nick verwenden können.

    Eine Nachricht wird dann zum Beispiel immer nach diesem Schema benannt Msg_Nickname.txt
    Beide Teilnehmer überwachen permanent das Verzeichnis auf neue msg Dateien und berücksichtigen dabei nur die Dateien die nicht dem eigenen Nick entsprechen. Wird eine gefunden wartet man einige ms um sicherzustellen, dass der Schreibvorgang des anderen Teilnehmers abgeschlossen ist, liest diese Datei dann, fügt den Inhalt ins ProgrammEdit Feld ein und löscht sie im Anschluss.

    Beim versenden prüft man zunächst ob die zuvor abgeschickte Nachricht bereits gelesen wurde also die Datei nicht mehr existiert und erstellt erst dann eine neue msg Datei wenn die alte gelöscht wurde.
    So sollte zumindestens bei 2 Teilnehmern kein Problem auftreten. Bei mehreren Teilnehmern wird es etwas schwieriger. Hier sollte eine gefundene msg Datei erst nach einer ausreichenden Pause gelöscht werden, damit alle beteilligten genug Zeit zum lesen der Datei hatten. Zeitgleiche lese Vorgänge sollten btw kein Problem sein.

    Zu deiner Frage wegen dem Hotkey... ja das wäre vermutlich am besten, habe aber wie gesagt nicht getestet ob das bei dir jetzt nicht auch schon funktioniert.

  • Zu deiner Frage wegen dem Hotkey... ja das wäre vermutlich am besten, habe aber wie gesagt nicht getestet ob das bei dir jetzt nicht auch schon funktioniert.

    Ja das mit dem Hotkey funktioniert wunderbar! Gerade probiert.
    Damit wäre der Bug weg.
    EDIT: doch nicht ... Der Hotkey ist ja global und nicht lokal wie ich dachte...

    Dein Ansatz hört sich gut an!

    Ich habe es gerade mal versucht einzubauen, aber es gibt noch einen Bug
    Jetzt mal ein laufendes Minimal-Beispiel von dem Bereich der Fehler liegt, aber ich weiß nicht wie ich es wegbekomme. Lösung hatte ich hier gefunden: [ offen ] Verzeichnis überwachen
    Aber der ruft alle Nachrichten halt nicht nur einmal ab, sondern immer und immer wieder....

    Spoiler anzeigen


    Mein Minimal-Beispiel der Orderüberwachung:

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

    #include <File.au3>
    #include <array.au3>

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

    Global $aFiles, $sPath = "\\FOLDER\"

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

    AdlibRegister("_receivemessage", 10000)

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

    While True
    Sleep(5000)
    WEnd

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

    Func _receivemessage()
    AdlibUnRegister("_receivemessage") ;_searchFiles deregistrieren
    $aFiles = _FileListToArray($sPath, "*", 1) ;alle File im Pfad in ein Array einlesen
    If IsArray($aFiles) Then ;wenn Array
    For $i = 1 To $aFiles[0] ;Schleifenbegin für alle Files im Array
    $file = FileOpen($aFiles[$i], 0)
    MsgBox(0, "test", $aFiles[$i])
    FileClose($aFiles[$i])
    Next
    EndIf
    AdlibRegister("_receivemessage", 1000)
    EndFunc

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

    Einmal editiert, zuletzt von klausdiemaus (21. Juni 2011 um 18:13)

  • Ja natürlich zeigt er dir immer und immer wieder den Inhalt dieser gefundenen Datei an. Du musst die Datei in deiner For-Schleife löschen nachdem sie ausgelesen wurde, damit sie beim erneuten Funktionsaufruf/Verzeichnischeck nicht mehr von filelisttoarray gefunden werden kann. Du liest den Inhalt, gibst ihn aus (jetzt in deinem Beispiel per msgbox, ansonsten wohl eher indem du den Inhalt ins Editfeld schreibst), danach brauchst du die Datei nicht mehr und entfernst diese mit filedelete(). Sofern du kein seperates Verzeichnis nur für diese msg Datei verwendest und sich dort auch noch andere Dateien befinden sollten würde ich einen Suchfilter für filelisttoarray verwenden, also z.B. "*.txt"

    In der For Schleife muss ausserdem geprüft werden ob es sich um deine eigene msg Datei handelt die du eventuell gerade erstellt hast oder ob es sich um eine von einem anderen Teilnehmer handelt. Das kannst du zum Beispiel mit stringinstr() machen, also du durchsuchst den Dateinamen aus dem Array nach deinem eigenen Nick. wird dieser gefunden ignorierst du die msg Datei, wird dieser nicht gefunden liest und löscht du die msg Datei.

    Für flüssigeres chatten würde ich die Verzeichnisüberwachung aber mit einem kleineren Intervall machen, also eher 100-500ms für das adlibregister. Vor deiner For Schleife sollte noch ein sehr kurzes sleep(20) rein, damit sichergestellt ist, dass die Textdatei komplett ist bevor du diese ausliest.


    Hier mal eine überarbeitete Fassung des Testscripts:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <array.au3>

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

    $mynick = InputBox("Hallo","Bitte Nick eingeben","Nick_" & Random(1000,9999,1)) ; Nickeingabe am Programmanfang, default ist ein random nick

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

    Global $aFiles, $sPath = @ScriptDir & "\" ; zum testen geändert... Achtung: Alle txt Dateien im scriptdir werden später gelöscht !!!

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

    AdlibRegister("_receivemessage", 500) ; timier verkürzt

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

    While True
    Sleep(10) ; pause verkürzt
    WEnd

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

    Func _receivemessage()
    AdlibUnRegister("_receivemessage") ;_searchFiles deregistrieren
    $aFiles = _FileListToArray($sPath, "*.txt", 1) ; alle txt Files im Pfad in ein Array einlesen
    If IsArray($aFiles) Then
    Sleep(20) ; Pause, falls Datei noch beschrieben werden sollte
    For $i = 1 To $aFiles[0] ;Schleifenbegin für alle Files im Array
    if StringInStr($aFiles[$i],$mynick,1) = 0 Then ; Nachricht von jemand anderem, also alle Dateien, die nicht $mynick.txt heissen
    $file = FileOpen($aFiles[$i], 0)
    MsgBox(0, "test", FileRead($file)) ; hier lass ich nun den Dateiinhalt ausgeben, stattdessen wohl dann eher Inhalt zum Edit hinzufügen
    FileClose($file) ; hier hattest du einen fehler, das handle muss angegeben werden, nicht der dateiname
    FileDelete($aFiles[$i]) ; löscht die Datei nach dem lesen
    EndIf
    Next
    EndIf
    AdlibRegister("_receivemessage", 500) ;timer verkürzt
    EndFunc

    [/autoit]

    Zum testen einfach beliebige txt-Dateien in das Scriptdir kopieren. Dateien die deinem Nick entsprechen sollten nicht angezeigt werden, alle anderen Dateien müssen angezeigt und anschliessend gelöscht werden.

    Einmal editiert, zuletzt von misterspeed (20. Juni 2011 um 01:50)

  • Vielen Dank misterspeed für deine Erläuterungen.
    Bin leider noch nicht zu gekommen weiter zu machen... Aber ich werde es morgen mal in Angriff nehmen und euch dann auf dem Laufenden halten!

    Nochmal zum Hotkey:
    Ich habe gemerkt, dass das ja Schwachsinn ist, weil das ja mit Hotkeyset ein globaler Hotkey wird. Und wenn der halt ENTER ist, ist das ziemlich doof ;)

    Naja ich hab es jetzt halt so gelöst (gekürzte Version):

    [autoit]


    Select
    Case $countlines <> $countlinesneu
    receivemessage()
    $countlines = $countlinesneu
    Case BitAND(_IsPressed('0D'), GUICtrlRead($GUIinput) <> "")
    Sendmessage()
    EndSelect

    [/autoit]

    Falls sich jemand für die komplette Version interessiert (aber halt noch ohne die Verbesserungen mit der Ordnerüberwachung / kommt morgen oder übermorgen):

    Spoiler anzeigen

    Huch irgendwie hat er die meisten Einrückungen rausgenommen. hmmm

    [autoit]


    ;include files
    #include <GuiConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>
    #include <File.au3>
    #include <WinAPI.au3>
    #include <Date.au3>
    #include <Misc.au3>
    #include <StaticConstants.au3>

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

    ;path of DB
    Dim $chatfile = "\\FOLDER\chat.txt"
    Dim $line = ""
    Dim $chatmessage = ""
    Dim $displaymessage = ""
    Global $version = "0.3"
    Dim $flashing = 1

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

    ;update (version check)
    $versionfile = FileOpen("\\FOLDER\chatversion.txt", 0)
    ; Check if file opened for reading OK
    If $versionfile = -1 Then
    MsgBox(0, "Error", "Unable to check for updates.")
    EndIf

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

    If $versionfile <> -1 Then
    $versionline = FileReadLine($versionfile, 1)
    If $versionline <> $version Then
    $updatebox = MsgBox(1, "Update available", "Please update now.")
    If $updatebox = 1 Then
    Run(@ScriptDir & "\sfcfiles\updater.exe", @ScriptDir)
    Exit
    EndIf
    EndIf
    EndIf
    FileClose($versionfile)

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

    ;username
    $username = InputBox("Shared Folder Chat","Please enter your username.")
    If $username = "" Then
    MsgBox(16,"Error","A username must be entered.")
    Exit
    EndIf

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

    ;GUIcreation
    $chatwindow = GUICreate("Shared Folder Chat", 300, 700)
    $GUIedit = GUICtrlCreateEdit("",5,5,290,640,BitOR($ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL,$ES_AUTOVSCROLL))
    $GUIinput = GUICtrlCreateInput("",5,650,290,25,BitOR($ES_NOHIDESEL,$ES_CENTER,$ES_AUTOHSCROLL))
    $optionmenu = GUICtrlCreateMenu("Options")
    $optionmenuflashing = GUICtrlCreateMenuItem("Flashing", $optionmenu)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUISetState()

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

    ;###################################
    ; MAIN #############################
    ;###################################
    _onlinenotification()
    _history()
    $countlines = _FileCountLines($chatfile)

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

    Do
    Sleep(40)
    $msg = GUIGetMsg()
    $countlinesneu = _FileCountLines($chatfile)

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

    Select
    Case $countlines <> $countlinesneu
    receivemessage()
    $countlines = $countlinesneu
    Case BitAND(_IsPressed('0D'), GUICtrlRead($GUIinput) <> "")
    Sendmessage()
    Case $msg = $optionmenuflashing
    If BitAND(GUICtrlRead($optionmenuflashing), $GUI_CHECKED) = $GUI_CHECKED Then
    GUICtrlSetState($optionmenuflashing, $GUI_UNCHECKED)
    $flashing = 0
    Else
    GUICtrlSetState($optionmenuflashing, $GUI_CHECKED)
    $flashing = 1
    EndIf

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

    EndSelect

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

    Until $msg = $GUI_EVENT_CLOSE;To be able to close the Window!
    _offlinenotification()
    Exit

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

    #################################################################################################################################
    ; FUNCTIONS
    ;#################################################################################################################################

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

    Func Sendmessage()

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

    $chatmessage = GUICtrlRead($GUIinput)
    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    $displaymessage = @HOUR & ":" & @MIN & ":" & @SEC & " <"&$username&">: "&$chatmessage
    FileWriteLine($file, $displaymessage)
    FileClose($file)
    GUICtrlSetData($GUIinput,"")

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func receivemessage()

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

    $file = FileOpen($chatfile, 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    $line = FileReadLine($chatfile, -1)
    print($line)
    ;~ If GUICtrlGetState($GUIcheckbox) = 3 Then
    If $line <> $displaymessage Then
    If $flashing = 1 Then
    _WinAPI_FlashWindowEx($chatwindow, 2, 1)
    EndIf
    EndIf

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

    FileClose($file)

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

    $countlines = $countlinesneu

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func Print($line)
    _GUICtrlEdit_AppendText($GUIedit,@CRLF&$line)
    EndFunc ;==> Print

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

    ;#################################################################################################################################

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

    Func _onlinenotification()

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

    ;notification who is going online

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

    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    FileWriteLine($file, @CRLF & ">>> " & @HOUR & ":" & @MIN & ":" & @SEC & " <<< " &$username&" is now online.")
    FileClose($file)

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func _offlinenotification()

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

    ;notification who is going offline

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

    $file = FileOpen($chatfile, 1) ;DB-File
    If $file = -1 Then;If unable to open file, then error message
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;Message to DB
    FileWriteLine($file, @CRLF & ">>> " & @HOUR & ":" & @MIN & ":" & @SEC & " <<< " &$username&" is now offline.")
    FileClose($file)

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

    EndFunc

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

    ;#################################################################################################################################

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

    Func _history()

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

    $file = FileOpen($chatfile, 0)

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

    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

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

    $history = FileRead($chatfile)
    print($history)

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

    FileClose($file)
    EndFunc

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

    ;#################################################################################################################################

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

    Sleep(50)
    $StringPos = StringInStr ( @ScriptDir, "\" ,0 , -1)
    $path = StringTrimRight ( @ScriptDir ,StringLen ( @ScriptDir ) - $StringPos)
    FileCopy("\\FOLDER\SFC.exe", $path, 1)
    Run($path&"\SFC.exe")
    Exit

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

    4 Mal editiert, zuletzt von klausdiemaus (21. Juni 2011 um 20:33)

  • Natürlich kann man das über TCP.
    Was denkst du denn, wie du auch ein Netztwerklaufwerk zugreifst.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ja? TCP geht?
    Hmmm was das angeht hab ich ehrlich gesagt keine Ahnung :(

    Hmm ich hab da 4 Chats ausprobiert die über TCP laufen sollten, aber keins hat funktioniert...
    Darum bin ich einfach davon ausgegangen bin, dass es nicht geht.

    Ich werde es morgen nochmal selber probieren.

  • Du kannst über TCP aber nur dann kommunizieren, wenn die Firewall das auch zulässt. Auf den Workstations bei uns in der Schule war es nichteinmal möglich eine Verbindung zu einem externen FTP oder Web Server herzustellen, wenn dieser nicht auf dem Standardport 21 bzw 80 erreichar war, an den Betrieb einer eigenen Server Anwendung die von anderen erreichbar ist war erst garnicht zu denken. Dass ein TCP basierter Chat natürlich die bessere und eigentlich auch einzig sinnvollste Lösung ist wird hier aber sicher niemand bestreiten wollen, nur benötigt man dafür eben auch die Berechtigung.

  • Ganz einpach port 80 nutzen. Wenn man ins Internet kommt, ist dieser Port auch frei.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Stimmt.. Port 80.
    Wird morgen gleich mal versucht :thumbup:

    Wenn ich das richtig sehe sollte das Problem an meinem Ansatz sein, dass es viele Schreib- und Lesezugriffe (gleichzeitig gibt) und ein höheres Datenaufkommen? Und natürlich kann man mit TCP auch noch mehr Dinge einfacher realisieren?

    OT:
    Wen es interessiert: Es ist keine Schule, arbeite gerade als Externer an einem Projekt in einem Konzern.
    Naja und irgendwie hatte ich ein bisschen Zeit zu überbrücken, weil die Mühlen langsam mahlen und ich auf Sachen auf die ich angewiesen war lange warten musste. Dann bin ich halt über dieses Problemchen gestolpert...

    @all: Danke, dass ihr so viel Geduld mit mir mitbringt. Ist halt die erste Sache die ich mit AutoIt mache.

  • Ganz einpach port 80 nutzen. Wenn man ins Internet kommt, ist dieser Port auch frei.

    Nein nicht unbedingt. Firewalls können den Netzwerkzugriff auch auf einzelne Programme beschränken. Ausserdem gibt es einen unterschied zwischen eingehenden Anfragen und ausgehenden. Nur weil du selbst eine Verbindung zu einer Anwendung die auf Port 80 lauscht aufbauen kannst bedeutet das nicht, dass du auch auf Anfragen von anderen auf deinem lokalen Port 80 warten kannst. Das bedeutet, ein Betrieb eines Clients kann möglich sein, ein Betrieb eines Servers hingegen nicht.

    Wenn man sich in fremden Netzen bewegt sollte man ausserdem grundsätzlich solche Einschränkungen auch akzeptieren und nicht versuchen sie zu umgehen. Das kann im Falle einer Firma durchaus unangenehm für einen werden.

  • Wenn man sich in fremden Netzen bewegt sollte man ausserdem grundsätzlich solche Einschränkungen auch akzeptieren und nicht versuchen sie zu umgehen. Das kann im Falle einer Firma durchaus unangenehm für einen werden.


    Haha ja ich weiß!
    Aber hätte es die Einschränkung nicht gegeben hätte ich es nie versucht ein Chatprogramm zu schreiben.
    Irgendwie reizt mich so was immer, ich weiß auch nicht warum ich dann immer so ein Drang verspüre das zu umgehen.
    Habt ihr das nicht?

    Ich werde es morgen erstmal mit Port 80 versuchen und wenn nicht mit der Ordnerüberwachnung...