Chat-Queue

Previous topic - Next topic

trucidare

Kann mir jemand helfen so eine Chat-Queue zu erstellen?

ich bekomme meine daten ( als string ) und möchte die nun in einer schlange anzeigen, bei der die neuste nachrichten ganz unten steht und die älteren bei jeder neuen weiter nach oben wandern.

für eine schnell hilfe bin ich euch sehr dankbar
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Quentin

könntest deine Nachrichten in einem Stringfeld speichern

Code (glbasic) Select
DIM Message$[1]

// wenn eine Nachricht reinkommt als String, dann diese einfügen

DIMPUSH Message$[], newMessage$

// in einem bestimmten Bildschirmbereich könntest du dann z.B. immer die letzen 10
// Nachrichten darstellen

last_message = BOUNDS(Message$[], 0)

FOR i = last_message - 10 TO lastmessage
   PRINT Message$[i], 0, i * 30
NEXT
meintest du so etwas in der Art? Nicht hauen, wenn Fehler drin sind, hab zur Zeit kein GLBasic zur Hand zum probieren.

Kitty Hello

Exact. Und wenn die Schlange nur 10 Dinge haben soll:
Code (glbasic) Select
IF BOUNDS(Message$[], 0)  > 10
   DIMDEL Message$[], 0
ENDIF
...wow, sind die neuen DIMPUSH/DIMDEL Befehle klasse :D

Übrigens, ihr kennt schon:
Code (glbasic) Select
FOREACH msg$ IN Messages$[]
   PRINT msg$, 0, y
   y=y+font_size_y
NEXT
FOREACH ist (ok, hier bisserl ein Schmarrn) viel schneller als FOR i= .., weil ich intern nur den Zeiger inkrementiere statt eine Feldabfrage, die ja eine Multiplikation braucht.

Sorry, das hat hier gar nix mit dem Thema zu tun...

Quentin

ein kleines Beispiel für einen Chat:

Code (glbasic) Select
LOCAL Message$[]                                     // die gesammelen Nachrichten
LOCAL newmsg$                                        // die aktuelle Eingabe
LOCAL aktuell, fontx, fonty

GETFONTSIZE fontx, fonty                             // die Höhe des Zeichensatzes wird noch gebraucht

WHILE TRUE

  FILLRECT 0, 0, 640, 460, RGB(0, 0, 255)            // Bereich für die Ausgabe
  FILLRECT 0, 465, 640, 480, RGB(255, 255, 0)        // Bereich für die Eingabe

  IF KEY(14)                                         // Backspace gedrückt, dann das letzte Zeichen löschen
    IF LEN(newmsg$)
      newmsg$ = MID$(newmsg$, 0, LEN(newmsg$) - 1)
      WHILE KEY(14); WEND                            // Tastaturpuffer leeren
    ENDIF
  ELSEIF KEY(28)                                     // Enter gedrückt, dann Eingabe in Ausgabe schieben
    DIMPUSH Message$[], newmsg$
    newmsg$ = ""                                     // und Eingabefeld löschen
    WHILE KEY(28); WEND                              // Tastaturpuffer leeren
  ELSE
    a$ = INKEY$()                                    // eigentliche Zeicheneingabe
    IF a$ <> "" THEN newmsg$ = newmsg$ + a$
  ENDIF

  aktuell = BOUNDS(Message$[], 0)                    // Anzahl der bereits getätigten Eingaben
  starty = 460 - fonty                               // Startpunkt für die Ausgabe
  WHILE aktuell AND starty > 0                       // jetzt solange die eingegebenen Texte ausgeben
    PRINT Message$[aktuell-1], 0, starty             // bis entweder keine weiteren Zeilen vorhanden sind
    DEC starty, fonty + 2                            // oder über den oberen Bildschirmrand geschrieben würde
    DEC aktuell, 1
  WEND

  PRINT newmsg$, 0, 467                              // jetzt noch Eingabefeld aktualisieren

  SHOWSCREEN                                         // und anzeigen

WEND

END                                                  // fäddisch
@Gernot
FOREACH ist ja schön ;), aber ich denke in dem Fall nur dann hilfreich, wenn man wirklich nur eine bestimmte Anzahl an Zeilen speichert, es sei denn, du bringst noch einen Zusatz rein, daß man das Feld von hinten nach vorne durchlaufen kann :)

Schranz0r

Wow Quentin, bin überrascht!

Nice Work !
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

trucidare

ich glaub ich hab ne blockade :(

ich geb euch mal meinen code in der main schleife:

Code (glbasic) Select
WHILE TRUE
DRAWLINE 0, 570, 800, 570, RGB(255,255,255)
DRAWLINE 620, 0, 620, 570, RGB(255,255,255)

PRINT ty, 0,0


num = SPLITSTR(ausgabe$, text$[], "\r\n")
FOR i = 0 TO num-1
nick_position = INSTR(text$[i], "!")
nick_text$ = MID$(text$[i], 1, nick_position-1)
position = INSTR(text$[i], "PRIVMSG #Hiro :")
length = LEN(text$[i])
test$ = MID$(text$[i], position+15, (length-position))


IF position > -1

los$ = "|11:49:59| "+nick_text$+": "+test$
DIMPUSH Message$[], los$
los$ = ""


aktuell = BOUNDS(Message$[], 0)                    // Anzahl der bereits getätigten Eingaben
  starty = 540 - fonty                               // Startpunkt für die Ausgabe
  WHILE aktuell AND starty > 0                       // jetzt solange die eingegebenen Texte ausgeben
    PRINT Message$[aktuell-1], 0, starty             // bis entweder keine weiteren Zeilen vorhanden sind
    DEC starty, ty + 2                            // oder über den oberen Bildschirmrand geschrieben würde
    DEC aktuell, 1
  WEND


ENDIF
NEXT

IF Active() = 1 THEN InputX(0,580)
SHOWSCREEN
WEND
SDL_Quit_GL()
wenn ich jetzt einen txt bekomme in dem die oben genannten kretierien drin sind füllt der damit die ganze queue :(

irgendwelche vorschläge?
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Quentin

hmmm, was steht denn in Ausgabe$ drin? Ist das die komplette Queue als ein langer String oder nur die akutell eingegebene Zeile eines Benutzers?

trucidare

ausgabe hat den kompletten satz der vom server kommt.
der wird getrennt nach zeilen enden. dann wird die position des nicknames gesucht und gespeichert und dann den text dazu.

heraus kommt nick_text$ und test$. die pack ich mit  los$ = "|11:49:59| "+nick_text$+": "+test$ in die perfekte zeile.

und die will ich ausgeben in einer queue
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Du musst, wenn Du fertig bist Ausgabe$ wieder löschen, falls keine neue NAchricht vorliegt, oder?

trucidare

wenn ich ausgabe leere dann verschwindet auch der text sofort... irgendwo muss da noch einbug drin sein. :(
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Quentin

mit Trockenübungen tue ich mich immer ein wenig schwer, aber versuch doch mal die WHILE - WEND - Schleife für die Ausgabe des Textes außerhalb der FOR - NEXT - Schleife, in der dein Text aufbereitet wird, zu setzen.

trucidare

Bringt leider auch nichts quentin... trotzdem danke euch allen.
ich muss mir wohl ne neue zerflück methode einfallen lassen
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Dein code ist:
Code (glbasic) Select
Ausgabe$="ein Text"
WHILE TRUE
    SPLITSTR(Ausgabe$, feld$[], "\r\n")
    FROEACH a$ IN feld$[]
       ...
    NEXT
WEND
Aber!: Bei dem WEND hat Ausgabe$ immer noch den gleichen Wert wie vorher. Den musst Du also vorher löschen, oder wieder neu vom Server laden. Aber zus Sicherheit würde ich vor dem WEND ein: Ausgabe$="" machen.

trucidare

dein code versteh ich nicht Gernot. hab noch nie mit foreeach gearbeitet. magst du mir vielleicht damit helfen?
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

Ja, OK. Aber Du hast FOR i = 0 TO num-1. Das Problem ist, dass nach dieser Schleife die Variable "Ausgabe$" immer noch den gleichen Wert hat. Und dann bei WHILE/WEND eben immer wieder das gleiche passiert.