Suche ansatz für Filebasierten Chat
Moderator: jNizM
Suche ansatz für Filebasierten Chat
Hallo zusammen,
was ich zur verfügung habe ist ein Netzlaufwerk. Was ich machen will ist ein Chatsystem das 50 User nutzen werden. Dabei soll es Gruppen und PrivatChat unterstützen. Das alles nur auf Dateibasis.
Ich würde gerne die RichEdit Classe von just me dazu nutzen. Ich hoffe das dies möglich ist.
Zur Dateierstellung würde ich dann den Gruppen oder Usernamen plus Timestamp nehmen? Ist das so Sinnvoll?
Wie würdet ihr sowas realisieren?
MfG
fump
was ich zur verfügung habe ist ein Netzlaufwerk. Was ich machen will ist ein Chatsystem das 50 User nutzen werden. Dabei soll es Gruppen und PrivatChat unterstützen. Das alles nur auf Dateibasis.
Ich würde gerne die RichEdit Classe von just me dazu nutzen. Ich hoffe das dies möglich ist.
Zur Dateierstellung würde ich dann den Gruppen oder Usernamen plus Timestamp nehmen? Ist das so Sinnvoll?
Wie würdet ihr sowas realisieren?
MfG
fump
Re: Suche ansatz für Filebasierten Chat
Ansatz:
Es gibt einen Server, der analysiert die Dateien, die neu hinzukommen, allerdings nur wenn sie ein bestimmtes Kriterium erfüllen.
Dieses Kriterium sollte möglichst dann erfüllt sein wenn die Datei fertig ist mit hochladen.
Dieser Server fügt dann die Dateien zu einem Chat zusammen.
Über diese Methode könnte man auch Dateien öffentlich zugänglich machen.
Die Clients lesen aus einer Text Datei einfach aus ob es einen neueren "Chatverlauf" gibt und ob und wo sie diese neuere Datei herunterladen können.
Es gibt einen Server, der analysiert die Dateien, die neu hinzukommen, allerdings nur wenn sie ein bestimmtes Kriterium erfüllen.
Dieses Kriterium sollte möglichst dann erfüllt sein wenn die Datei fertig ist mit hochladen.
Dieser Server fügt dann die Dateien zu einem Chat zusammen.
Über diese Methode könnte man auch Dateien öffentlich zugänglich machen.
Die Clients lesen aus einer Text Datei einfach aus ob es einen neueren "Chatverlauf" gibt und ob und wo sie diese neuere Datei herunterladen können.
Recommends AHK Studio
Re: Suche ansatz für Filebasierten Chat
Das würde bedeuten, man brauch eine Serveranwendung. Das möchte ich vermeiden. Ich will den Chat nicht davon abhängig machen ob jemand den Server startet oder nicht.
Aber ich denke ich verstehe wie du das meinst.
Was ich nicht ganz weiß ist, wie man einen Gruppenchat so sichert das nicht der eine den anderen überschreibt bzw. blockiert... mal angenommen 2 User senden gleichzeitig text...
Aber ich denke ich verstehe wie du das meinst.
Was ich nicht ganz weiß ist, wie man einen Gruppenchat so sichert das nicht der eine den anderen überschreibt bzw. blockiert... mal angenommen 2 User senden gleichzeitig text...
Re: Suche ansatz für Filebasierten Chat
OK da es Dateien sind würde ich folgendes vorschlagen:
Jede Nachricht ist eine Datei.
Jede Datei bekommt eine ID bestehend aus Name der Person die die Daten gesendet hat, die Uhrzeit (A_TickCount)
und die fin flag.
Die fin flag ist einfach die Dateiendung .fin, die die Datei angehängt bekommt, sobald der Client fertig ist mit hochladen.
Jede Nachricht ist eine Datei.
Jede Datei bekommt eine ID bestehend aus Name der Person die die Daten gesendet hat, die Uhrzeit (A_TickCount)
und die fin flag.
Die fin flag ist einfach die Dateiendung .fin, die die Datei angehängt bekommt, sobald der Client fertig ist mit hochladen.
Recommends AHK Studio
Re: Suche ansatz für Filebasierten Chat
Ungetestet.
Jeder user hat ne datei user (mit schreibzugriff).
Nachricht senden von User1 an User2 ist sowas wie fileappend oder ähnliches,
Dann würde ich HotkeyIts watchdirectory (name ähnlich) testen obs in deinem Fall anwendbar ist, ansonsten kann man den Ordner per settimer auf neuen Inhalt überwachen (filetimemodified).
Wenn neuer Inhalt im Ordner, dann den chat-eingang von User1 aktualisieren, iwie so
chat_in kann dann iwie als User1-Chat-Log dargestellt werden.
Das wäre (in Grundzügen) mein person-to-person protokoll (naja, ich würde eher udp oder tcp nutzen).
Bevor du auch auch nur GUI denkst, solltest du planen was das Ding unter der Haube können muss.
-Sicherheit
Der Einfachheit halber wurde hier Lese-Zugriff auf alle Kommunikation angenommen (offene Kommunikation): User1-Chat-Client kann sehen was User2 zu User3 schickt.
Wenn das nicht erwünscht ist, kann man User2 einen Ordner geben (oder Verschlüsselung nutzen). Die Datei User2\User3 enthält dann die Nachrichten von User2 an User3 und nur User3-Chat-Client braucht Lese-Zugriff auf User2\User3. Das Protokoll wird etwas komplizierter, bleibt aber im Grunde gleich.
-dynamische Gruppen/User
ginge auch ohne grosse Änderungen
-dynamische Gruppen/User UND Sicherheit
mit so einem Protokoll bräuchte man dynamische Datei-Zugriffs-Verwaltung (lieber nicht) oder Verschlüsselung. Btw, selbst wenn die Datei User2 verschlüsselt ist, könnte u.U. User1-Chat-Client lesen wann User2s letzte Kommunikation war und schlechte Verschlüsselungen geben noch mehr Preis.
Also _mit Ausnahme des letzten Punktes_ ist sowas einigermaßen vernünftig machbar, aber macht nur Sinn wenn man z.B. wirklich keinen Port für sowas nutzen kann.
Jeder user hat ne datei user (mit schreibzugriff).
Nachricht senden von User1 an User2 ist sowas wie fileappend oder ähnliches,
Code: Select all
fileappend,% "[User2][" . timestamp . "]" . msg . "`n", User1
Wenn neuer Inhalt im Ordner, dann den chat-eingang von User1 aktualisieren, iwie so
Code: Select all
timestamp0 := chat_in.maxindex()
loop,% dein_Ordner . "\*"
if (a_loopfiletimemodified > timestamp0)
loop, read,% a_loopfilefullpath
if (regexmatch(a_loopreadline, "^\[User1]\[([^]]+)](.*)", m))
chat_in[m1, a_loopfilename] := m2
; entspricht chat_in[timestamp, user] := msg
; HotkeyIts watchdirectory würde dir hier wohl genau sagen welche Datei sich geändert hat, was dir die file-loop (und timestamp-Vergleich) ersparen würde.
Das wäre (in Grundzügen) mein person-to-person protokoll (naja, ich würde eher udp oder tcp nutzen).
Bevor du auch auch nur GUI denkst, solltest du planen was das Ding unter der Haube können muss.
-Sicherheit
Der Einfachheit halber wurde hier Lese-Zugriff auf alle Kommunikation angenommen (offene Kommunikation): User1-Chat-Client kann sehen was User2 zu User3 schickt.
Wenn das nicht erwünscht ist, kann man User2 einen Ordner geben (oder Verschlüsselung nutzen). Die Datei User2\User3 enthält dann die Nachrichten von User2 an User3 und nur User3-Chat-Client braucht Lese-Zugriff auf User2\User3. Das Protokoll wird etwas komplizierter, bleibt aber im Grunde gleich.
-dynamische Gruppen/User
ginge auch ohne grosse Änderungen
-dynamische Gruppen/User UND Sicherheit
mit so einem Protokoll bräuchte man dynamische Datei-Zugriffs-Verwaltung (lieber nicht) oder Verschlüsselung. Btw, selbst wenn die Datei User2 verschlüsselt ist, könnte u.U. User1-Chat-Client lesen wann User2s letzte Kommunikation war und schlechte Verschlüsselungen geben noch mehr Preis.
Also _mit Ausnahme des letzten Punktes_ ist sowas einigermaßen vernünftig machbar, aber macht nur Sinn wenn man z.B. wirklich keinen Port für sowas nutzen kann.
Re: Suche ansatz für Filebasierten Chat
Da gibt es halt nur die Möglichkeit eines Servers.
Recommends AHK Studio
Re: Suche ansatz für Filebasierten Chat
Ja, ein Server wär flexibler.
Soweit ich das sehe, kann man aber "Sicherheit UND dynamische Gruppen" Datei-basiert ohne riesen Aufriss realisieren. Also man verzichtet weiterhin auf dynamische User, was verkraftbar erscheint.
(1) User1 hat Schreibzugriff auf den Ordner User1 und schreibt in die Datei User1\User2 die Nachrichten, die an User2 gerichtet sind. User2 hat Lesezugriff auf diese Datei. (wie oben)
(2) User2 sucht und tut parsen aktualisierte Dateien der Form *\User2. (wie oben)
(3) Das Protokoll muss aufgebohrt werden. So müssen z.B. Gruppen-Einladungen verschickt werden können, z.B.
(4) Der chat_log-Parser muss auch ein bisschen erweitert werden, z.B. sollte eine [invitation] einen "Annehmen-Dialog" öffnen und bei Annahme sowas passieren:
(5) Der Client sollte mindestens die Objekte users, groups, chat_log ansprechen und darstellen können.
Soweit ich das sehe, kann man aber "Sicherheit UND dynamische Gruppen" Datei-basiert ohne riesen Aufriss realisieren. Also man verzichtet weiterhin auf dynamische User, was verkraftbar erscheint.
(1) User1 hat Schreibzugriff auf den Ordner User1 und schreibt in die Datei User1\User2 die Nachrichten, die an User2 gerichtet sind. User2 hat Lesezugriff auf diese Datei. (wie oben)
(2) User2 sucht und tut parsen aktualisierte Dateien der Form *\User2. (wie oben)
(3) Das Protokoll muss aufgebohrt werden. So müssen z.B. Gruppen-Einladungen verschickt werden können, z.B.
Code: Select all
; User1:
groups := {group1 : ["User2", "User3"]}
; Einladung an Mitglieder der Gruppe group1@User1:
for each, member in groups.group1
fileappend, [group1][timestamp][invitation]User2`,User3, User1\%member%
; einfache nachricht:
fileappend, [][timestamp][message]Hallo User2!, User1\User2
; nachricht innerhalb group1:
for each, member in groups.group1
fileappend, [group1][timestamp][message]Hallo group1!, User1\%member%
Code: Select all
; User2:
groups["group1@User1"] := ["User1", "User3"]
for each, member in groups["group1@User1"]
fileappend, [group1@User1][timestamp][message]User2 ist beigetreten., User2\%member%
Re: Suche ansatz für Filebasierten Chat
Dazu muss man aber IT-Admin Rechte haben.
Soweit ich weiß hast du die ja noch nicht oder fump?
Soweit ich weiß hast du die ja noch nicht oder fump?
Recommends AHK Studio
Re: Suche ansatz für Filebasierten Chat
Japp, die Rechte müssten einmalig vergeben werden und wieder, wenn neue User hinzukommen. Das kann man (Admin) mit einer kleinen .bat machen, bei 2500 Objekten muss man es automatisieren. Nun bin ich aber angefixt und versuche mich demnächst mal an einem kleinen (nicht dateibasiertem) Konsolen-Chat-Programm.
Re: Suche ansatz für Filebasierten Chat
Ich habe keine Ahnung ob sowas machbar ist, aber ich poste einfach mal meine Idee:
Wenn man große Text-Dateien als Chat benutzt (mehrere wegen der Performance), und diese Zeit-/Größenabhängig neu erstellt, dann wäre das übersichtlicher als wenn man für jeden Eintrag eine eigene Datei erstellen würde.
Nun würde hier ja das Problem bestehen dass mehrere User gleichzeitig schreiben und wenn einer gerade etwas geschrieben hat is die Datei geöffnet und kann während dieser Zeit nicht von jemand anderen beschrieben werden.
Das müsste sich dann aber eigentlich in einer ErrorMessage finden lassen, wenn der Schreibvorgang fehlgeschlagen ist. In diesem Fall kann man immer noch eine eigene Datei erstellen.
Nun müsste halt immer geschaut werden welche Datei die neuste ist, und in dieser wird dann der Chat fortgesetzt. Somit würde immer dann die Chat-Datei gesplittet wenn mehrere User gleichzeitig schreiben, was aufgrund der kurzen Zeit in der die Datei nicht beschreibbar ist recht selten vorkommen dürfte.
Ist nur so eine Idee...
Wenn man große Text-Dateien als Chat benutzt (mehrere wegen der Performance), und diese Zeit-/Größenabhängig neu erstellt, dann wäre das übersichtlicher als wenn man für jeden Eintrag eine eigene Datei erstellen würde.
Nun würde hier ja das Problem bestehen dass mehrere User gleichzeitig schreiben und wenn einer gerade etwas geschrieben hat is die Datei geöffnet und kann während dieser Zeit nicht von jemand anderen beschrieben werden.
Das müsste sich dann aber eigentlich in einer ErrorMessage finden lassen, wenn der Schreibvorgang fehlgeschlagen ist. In diesem Fall kann man immer noch eine eigene Datei erstellen.
Nun müsste halt immer geschaut werden welche Datei die neuste ist, und in dieser wird dann der Chat fortgesetzt. Somit würde immer dann die Chat-Datei gesplittet wenn mehrere User gleichzeitig schreiben, was aufgrund der kurzen Zeit in der die Datei nicht beschreibbar ist recht selten vorkommen dürfte.
Ist nur so eine Idee...
Re: Suche ansatz für Filebasierten Chat
Danke erstmal für eure Kommentare dazu
Den Ansatz von nnnik find ich so bisher am besten und werd mich daran versuchen. Mal schauen wie weit ich komme.
Admin-Rechte habe ich da leider nicht. Ich werde auch ohne auskommen müssen. Ich muss darauf vertrauen, dass die erwachsenen Menschen die es nutzen werden da keinen Mist machen
Den Ansatz von nnnik find ich so bisher am besten und werd mich daran versuchen. Mal schauen wie weit ich komme.
Admin-Rechte habe ich da leider nicht. Ich werde auch ohne auskommen müssen. Ich muss darauf vertrauen, dass die erwachsenen Menschen die es nutzen werden da keinen Mist machen
Re: Suche ansatz für Filebasierten Chat
Hallo,
mein Vorschlag (ähnlich nnniks):
Pro Nachricht eine Datei mit folgendem Namen: A_Now.Sender.Empfänger.msg
An A_Now kannst Du auch noch die Millisekunden (A_MSec) anhängen, wenn Du willst. (A_TickCount ist meiner Meinung nach keine gute Idee, weil der Wert vom Startzeitpunkt des Rechners abhängig ist). Sender ist der Username, Empfänger ist ein Username, ein Gruppenname oder "Alle".
Die Clienten können anhand des Zeitstempels erkennen, ob sie eine Nachricht schon gelesen haben (Problem: Die Uhren der beteiligten Rechner müssen synchron laufen).
Wenn Du etwas Privatsphäre einbauen willst, kannst Du die User- und/oder Gruppennachrichten mit einem "gesalzenen" Hash (das "Salz" sollte ein Geheimnis des Chatprogramms bleiben) des Empfängernamens verschlüsseln.
mein Vorschlag (ähnlich nnniks):
Pro Nachricht eine Datei mit folgendem Namen: A_Now.Sender.Empfänger.msg
An A_Now kannst Du auch noch die Millisekunden (A_MSec) anhängen, wenn Du willst. (A_TickCount ist meiner Meinung nach keine gute Idee, weil der Wert vom Startzeitpunkt des Rechners abhängig ist). Sender ist der Username, Empfänger ist ein Username, ein Gruppenname oder "Alle".
Die Clienten können anhand des Zeitstempels erkennen, ob sie eine Nachricht schon gelesen haben (Problem: Die Uhren der beteiligten Rechner müssen synchron laufen).
Wenn Du etwas Privatsphäre einbauen willst, kannst Du die User- und/oder Gruppennachrichten mit einem "gesalzenen" Hash (das "Salz" sollte ein Geheimnis des Chatprogramms bleiben) des Empfängernamens verschlüsseln.
Re: Suche ansatz für Filebasierten Chat
Das klingt super. So werd ich es angehen. Ich denke ich bekomms hin mit dem Wissen das ich habe.
Schaun wa mal bisher hab ich ein solches System weder hier noch im anderen Forum gefunden.
Schaun wa mal bisher hab ich ein solches System weder hier noch im anderen Forum gefunden.
Re: Suche ansatz für Filebasierten Chat
Also ich denke es gibt noch Sachen die wir erstmal klären müssten.
Chat als Nachricht oder Chat als Chat?
Also es geht bei der Frage darum wie häufig der client nach neuen Nachrichten sucht und diese anzeigt.
Ist es eher so wie eine Mail oder eher so wie halt Chats z.B. Whatsapp.
Wenn es ein Chat ist und die PCs sehr häufig nach neuen Updates schauen kann es dazu kommen, dass - besonders bei hoher Zugriffszahl - eine Nachricht hochgeladen wird, sie aber schon gleichzeitig runtergeladen wird.
Du musst die Datei also äußerlich Irgendwie makieren, sobald sie fertig hochgeladen ist.
Chat als Nachricht oder Chat als Chat?
Also es geht bei der Frage darum wie häufig der client nach neuen Nachrichten sucht und diese anzeigt.
Ist es eher so wie eine Mail oder eher so wie halt Chats z.B. Whatsapp.
Wenn es ein Chat ist und die PCs sehr häufig nach neuen Updates schauen kann es dazu kommen, dass - besonders bei hoher Zugriffszahl - eine Nachricht hochgeladen wird, sie aber schon gleichzeitig runtergeladen wird.
Du musst die Datei also äußerlich Irgendwie makieren, sobald sie fertig hochgeladen ist.
Recommends AHK Studio
Re: Suche ansatz für Filebasierten Chat
Wenn es dieses Problem tatsächlich gibt, kann es durch passende 'Sharing mode flags' im FileOpen gelöst werden. Es ist ja kein Upload, sondern ein Schreib/Lesezugriff auf ein Netzlaufwerk mit einzelnen Dateien pro Nachricht (KISS Konzept).nnnik wrote:Wenn es ein Chat ist und die PCs sehr häufig nach neuen Updates schauen kann es dazu kommen, dass - besonders bei hoher Zugriffszahl - eine Nachricht hochgeladen wird, sie aber schon gleichzeitig runtergeladen wird.