Suche ansatz für Filebasierten Chat

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Suche ansatz für Filebasierten Chat

Post by fump2000 » 14 Jan 2014, 16:30

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
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by nnnik » 14 Jan 2014, 16:41

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.
Recommends AHK Studio
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Suche ansatz für Filebasierten Chat

Post by fump2000 » 15 Jan 2014, 05:48

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...
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by nnnik » 15 Jan 2014, 06:09

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.
Recommends AHK Studio
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Suche ansatz für Filebasierten Chat

Post by strobo » 15 Jan 2014, 19:58

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

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.
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.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by nnnik » 16 Jan 2014, 02:44

Da gibt es halt nur die Möglichkeit eines Servers.
Recommends AHK Studio
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Suche ansatz für Filebasierten Chat

Post by strobo » 16 Jan 2014, 14:40

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.

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%
(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:

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%
(5) Der Client sollte mindestens die Objekte users, groups, chat_log ansprechen und darstellen können.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by nnnik » 16 Jan 2014, 16:36

Dazu muss man aber IT-Admin Rechte haben.
Soweit ich weiß hast du die ja noch nicht oder fump?
Recommends AHK Studio
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Suche ansatz für Filebasierten Chat

Post by strobo » 17 Jan 2014, 00:12

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.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Suche ansatz für Filebasierten Chat

Post by Holle » 18 Jan 2014, 05:17

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...
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Suche ansatz für Filebasierten Chat

Post by fump2000 » 20 Jan 2014, 08:55

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 :)
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by just me » 21 Jan 2014, 00:58

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.
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Suche ansatz für Filebasierten Chat

Post by fump2000 » 21 Jan 2014, 09:44

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.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by nnnik » 21 Jan 2014, 11:04

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.
Recommends AHK Studio
just me
Posts: 9451
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Suche ansatz für Filebasierten Chat

Post by just me » 22 Jan 2014, 01:52

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.
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).
Post Reply

Return to “Ich brauche Hilfe”