Twitch like Chat mit Emotes

10/15/2016 15:28 .Barone#1
Heyho Epvpler.
Ich schreibe gerade einen Chat für meine Webseite und bin mir gerade unschlüssig wie ich Emotes einbinden soll. Der Chat soll in etwa so funktionieren wie der von Twitch.
Wenn zb diese Nachricht geschrieben wird "Heyho ihr nudeln Kappa",
Dann soll die Nachricht aufgeteilt werden, nach emotes durchsucht und an der richtigen stelle eingebunden werden.

Ich dachte daran einfach die nachricht per explode() zu teilen, mit file_exists() zu checken ob ein bild mit dem Emote-Namen vorhanden ist und dann einfach wieder zusammen zu packen.

Gibts ne bessere Lösung für das ganze?
Die Chat-nachrichten selbst werden in einer Datenbank gespeichert.

Gruß
10/15/2016 16:11 RatexIndex#2
Code:
$message = htmlentities(strip_tags($_POST['message']));
Code:
$message = str_replace('Kappa', '<img src="/img/chaticons/kappa.png" alt="Kappa" style="width:25px;height:25px;" />', $message);
10/15/2016 22:26 .Barone#3
^ Danke. Ich weiß nicht wieso, aber ich denke manchmal zu kompliziert.
Ich stehe hier bei dem ganzen nur vor einem Problem, da ich Twig zuvor noch nie genutzt habe.


Edit: Ich war gestern Abend einfach zu müde! ;)
Funktioniert jetzt alles wunderbar.
Danke.
10/17/2016 18:18 .Barone#4
Irgendwie scheitere ich gerade wieder.

Ich würde gerne aus der Tabelle "emotes" alle Emotes laden und schauen ob diese in der Nachricht vorkommen, wenn ja, dann sollen diese ersetzt werden.

PHP Code:
  $msg = array();
            
$emotes $pdo->prepare("SELECT * FROM emotes");
            
$emotes->execute();
            
$emote $emotes->fetch(PDO::FETCH_ASSOC);
            while (
$result $stmt->fetch(PDO::FETCH_ASSOC)){
                
$message str_replace($emote['name'], '<img src="'.$emote['link'].'" alt="$emote[name]" style="width:30px;height:30px;" />'$result['message']);
                
$msg[] = array('name' => $result['name'], 'message' => $message);
            } 
Ist der aktuelle Code. Das erste Emote von jeder Nachricht wird ersetzt, sonst keins.

Zudem habe ich das Problem, dass der Chat von oben nach unten geht und nicht von unten nach oben, zb wie bei Twitch und mir da gerade keine Lösung einfällt.
10/18/2016 03:50 lnqlorlouz#5
Quote:
Originally Posted by .Barone View Post
Irgendwie scheitere ich gerade wieder.

Ich würde gerne aus der Tabelle "emotes" alle Emotes laden und schauen ob diese in der Nachricht vorkommen, wenn ja, dann sollen diese ersetzt werden.

PHP Code:
  $msg = array();
            
$emotes $pdo->prepare("SELECT * FROM emotes");
            
$emotes->execute();
            
$emote $emotes->fetch(PDO::FETCH_ASSOC);
            while (
$result $stmt->fetch(PDO::FETCH_ASSOC)){
                
$message str_replace($emote['name'], '<img src="'.$emote['link'].'" alt="$emote[name]" style="width:30px;height:30px;" />'$result['message']);
                
$msg[] = array('name' => $result['name'], 'message' => $message);
            } 
Ist der aktuelle Code. Das erste Emote von jeder Nachricht wird ersetzt, sonst keins.

Zudem habe ich das Problem, dass der Chat von oben nach unten geht und nicht von unten nach oben, zb wie bei Twitch und mir da gerade keine Lösung einfällt.
Wenn du den Chatverlauf ändern möchtest, dann einfach bei deinem sql-Statement "sort by id DESC oder sort by id ASC" einfügen oder wenn du eine Zeit hast, dann die richtige Spalte von der Zeit einfügen. Ich hoffe du benutzt dafür eine auto_increment id-Spalte.
10/18/2016 13:47 .Barone#6
Edit:
Die vorherigen Probleme sind gelöst.
Das einzige, was mir noch fehlt, ist das ALLE emotes in der Nachricht ersetzt werden, nicht nur das erste.
PHP Code:
 $stmt $pdo->prepare("SELECT * FROM chat_en ORDER BY time DESC LIMIT 30");
            
$stmt->execute();
            
$msg = array();
            
$emotes $pdo->prepare("SELECT * FROM emotes");
            
$emotes->execute();
            
$emote $emotes->fetch(PDO::FETCH_ASSOC);
            for (
$x 0$x <= 29$x++) {
            
$result $stmt->fetch(PDO::FETCH_ASSOC);
                foreach(
$emote as $emo) {
                    
$message str_replace($emote['name'], '<img src="' $emote['link'] . '" alt="$emote[name]" />'$result['message']);
                }
                
$msg[] = array('name' => $result['name'], 'message' => $message);
            }

            echo 
json_encode($msg); 
10/19/2016 10:58 Devsome#7
Du kannst sowas machen.
Nur wird da nicht auf Groß-/Kleinschreibung geachtet.

PHP Code:
<?php

function twitchEmotes$str ) {
  
$emotes = array(
      
'Kappa' => ':Kappa:',
      
'fbm' => ':FeelsBadMan:'
  
);

  return 
str_replacearray_keys$emotes ), array_values$emotes ), $str );
}

$str 'This is just a simple Message Kappa, but it fbm to hear that.';
echo 
twitchEmotes(  $str  );
10/19/2016 16:01 .Barone#8
Naja, im Grunde wäre es ja nicht genau das was ich will. Die Groß-kleinschreibung ist mir da irgendwie doch schon wichtig.

Um das nochmal kurz zu fassen:
$emotes = Alle Emotes aus der Datenbank.[name,link]
$message = user nachricht.
Jedes vorkommen von ALLEN emotes aus der Datenbank soll ersetzt werden mit dem emote link.
Ich hab jetzt gerade wieder ne Stunde geschaut mit welchen Schleifen bzw loops es am sinnvollsten ist und ich bin zu keinem Ergebnis gekommen.

Folgendes gibt immer NUR das letzte Emote aus der Datenbank aus:
PHP Code:
 $msg = array();
            
$emotes $pdo->prepare("SELECT * FROM emotes");
            
$emotes->execute();
            
$emotes $emotes->fetchAll();
            for (
$x 0$x <= 29$x++) {
            
$result $stmt->fetch(PDO::FETCH_ASSOC);
                foreach(
$emotes as $emo) {
                    
$message str_replace($emo['name'], '<img src="' $emo['link'] . '" alt="$emo[name]" />'$result['message']);
                }
                
$msg[] = array('name' => $result['name'], 'message' => $message);
            }

            echo 
json_encode($msg); 
Folgendes gibt immer NUR das erste Emote aus:
PHP Code:
 $msg = array();
            
$emotes $pdo->prepare("SELECT * FROM emotes");
            
$emotes->execute();
            
$emote $emotes->fetch(PDO::FETCH_ASSOC);
            for (
$x 0$x <= 29$x++) {
            
$result $stmt->fetch(PDO::FETCH_ASSOC);
                foreach(
$emote as $emo) {
                    
$message str_replace($emote['name'], '<img src="' $emote['link'] . '" alt="$emote[name]" />'$result['message']);
                }
                
$msg[] = array('name' => $result['name'], 'message' => $message);
            }

            echo 
json_encode($msg); 
10/19/2016 17:13 Devsome#9
Dann mach es doch so
PHP Code:
<?php


$str 
'This is just a simple Message KaPPa, but it fbm to hear that. Kappa fbm';

$emotes = array(
    
'Kappa' => ':Kappa:',
    
'fbm' => ':FeelsBadMan:'
);

foreach (
$emotes as $key => $value) {
  
$str str_ireplace($key$value$str);
}
echo 
$str;
// Output:
// This is just a simple Message :Kappa:, but it :FeelsBadMan: to hear that. :Kappa: :FeelsBadMan:
Sollte ja einfach sein dein Datenbank output in einem array zu speichern. Machst einfach eine Abfrage welche Emotes es alles gibt, fertig.
10/19/2016 19:24 .Barone#10
Quote:
Originally Posted by Devsome View Post
Dann mach es doch so
PHP Code:
<?php


$str 
'This is just a simple Message KaPPa, but it fbm to hear that. Kappa fbm';

$emotes = array(
    
'Kappa' => ':Kappa:',
    
'fbm' => ':FeelsBadMan:'
);

foreach (
$emotes as $key => $value) {
  
$str str_ireplace($key$value$str);
}
echo 
$str;
// Output:
// This is just a simple Message :Kappa:, but it :FeelsBadMan: to hear that. :Kappa: :FeelsBadMan:
Sollte ja einfach sein dein Datenbank output in einem array zu speichern. Machst einfach eine Abfrage welche Emotes es alles gibt, fertig.
Das sieht doch schonmal besser aus. Selbst, wenn ich deins Kopiere und bei mir einfüge, wird nur fbm ausgetauscht, das Kappa nicht!

Mein Code sieht wie folgt aus:
Nur das letzte Emote wird ausgetauscht bzw angezeigt..
10/19/2016 19:29 Devsome#11
[Only registered and activated users can see links. Click Here To Register...]
Mach doch einfach nur eine Abfrage fetchAll() und du hast das Array.
Da brauchst du keine while mehr, lass dir dein Array ausgeben und schau wie es aufgebaut ist.

Ggf. kann ich morgen auf der Arbeit oder heute Abend mal nachschauen.
Zeig mir dann auch mal den Aufbau deiner Tabelle wo die Emotes alle drin sind.
10/19/2016 19:45 .Barone#12
Ich kriegs trotzdem nicht gebacken.. ohman.

Datenbank:
id,name,link
int,varchar,varchar
10/19/2016 19:59 Devsome#13
Bitte sehr.
Habe nur einen sql Server auf dem Heimrechner, daher sql.

Tabelle sieht so aus:
name|img

Inhalt:
kappa|kappa.img
fbm|feelsbadman.img

PHP Code:
<?php
    $cInfo
['Host'] ="localhost\SQLEXPRESS";
    
$cInfo['User'] = "sa";
    
$cInfo['Pass'] = "";
    include(
'SQL.php');
    
    
define('database1''tb_Emotes');

    
$sql = new SQL($cInfotrue);
    
    
$db database1;

    
    
$sq $sql->Query("SELECT * FROM [$db]..[emote]");
    
$arrayEmotes = [];

    while (
$row $sql->getQueryFetch_Array($sq)) {
        
$arrayEmotes[$row['name']] = $row['img'];
    }

    
// Nachricht
    
$str 'This is just a simple Message KaPPa, but it fbm to hear that. Kappa fbm';
    
    foreach (
$arrayEmotes as $key => $value) {
      
$str str_ireplace($key$value$str);
    }
    
// Ausgeben der Nachricht
    
echo $str;

    
    
// Funktion getQueryFetch_Array()
    /*
        function getQueryFetch_Array($resource){
            $data = sqlsrv_fetch_array($resource, SQLSRV_FETCH_ASSOC);
            if ( $data === false ) {
                die("This Insert Query does have any errors, please tell that any Admin. [ErrorCode: 5]");
            }
            return $data;
        }
    */
10/19/2016 20:32 .Barone#14
Erstmal danke für deine mühe und hilfe.
Ich habe einfach irgendwie nen Problem damit, das mysqli immer direkt nen array ausgegeben hatt und bei pdo es halt ein assoziatives array ist.
Oder ich mache etwas komplett falsch.
Ich habe heute nun auf 10 verschiedene arten die Emotes ausgegeben, auch erfolgreich, aber jedesmal nur das dritte. Vielleicht liegts auch an der Datenbank, was ich aber eigentlich bezweifel..
Ich schaue morgen früh nochmal dabei.

Weiter habe ich aktuell nicht gemacht, gibt aber auch nur das letzte Emote aus:

10/20/2016 10:12 Devsome#15
Also wenn du es hiermit nicht packst, weiß ich leider auch nicht.

Aufbau der Tabelle:
id|name|img

Inhalt der Tabelle:
1|kappa|/dist/kappa.png
2|fbm|/dist/feelsbadman.png
3|salty|/dist/salty.png
PHP Code:
$str 'This is just a simple Message KaPPa, but it fbm to hear that. Kappa saLTY';
$arrayEmotes = [];
$row $this->app['db']->fetchAll('SELECT * FROM tb_emotes');
foreach (
$row as $emote) {
    
$arrayEmotes[$emote['name']] = $emote['img'];
}
foreach (
$arrayEmotes as $key => $value) {
    
$str str_ireplace($key$value$str);
}
var_dump$str );
exit; 

// Update: Vielleicht liegt es daran, dass dieser Query in einer Schleife ist und die Ausgabe deiner Nachricht einfach überschreibt...