|
You last visited: Today at 04:27
Advertisement
Twitch like Chat mit Emotes
Discussion on Twitch like Chat mit Emotes within the Web Development forum part of the Coders Den category.
10/20/2016, 11:48
|
#16
|
elite*gold: 0
Join Date: Dec 2014
Posts: 276
Received Thanks: 84
|
Danke nochmal für deine Hilfe
PHP Code:
$e = $pdo->prepare("SELECT * FROM emotes"); $e->execute(); $stmt = $pdo->prepare("SELECT * FROM chat_en ORDER BY time DESC LIMIT 30"); $stmt->execute(); $msg = array(); $row = $e->fetchAll(PDO::FETCH_ASSOC); $emotes = []; foreach($row as $emo) { $emotes[$emo['name']] = $emo['link']; } for ($x = 0; $x <= 29; $x++) { $result = $stmt->fetch(PDO::FETCH_ASSOC); foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $result['message']); } $msg[] = array('name' => $result['name'], 'message' => $message); }
echo json_encode($msg);
Ich gehe davon aus, das du meintest das die emote() funktion in der for schleife ausgeführt wurde?
Jetzt, nachdem ich die funktion da rausgenommen habe, auch nur das letzte emote angezeigt... merkwürdig.
Bild:
EDIT:
Mir fällt gerade auf das ich das emote-austauschen ja wieder in die schleife gepackt hab, haha. Nur wie setze ich das dann richtig um?
Egal ob ich While, Foreach oder For nehme, das Ergebnis ist das selbe: Nur das letzte Emote wird angezeigt.
PHP Code:
$e = $pdo->prepare("SELECT * FROM emotes"); $e->execute(); $stmt = $pdo->prepare("SELECT * FROM chat_en ORDER BY time DESC LIMIT 30"); $stmt->execute(); $msg = array(); $row = $e->fetchAll(PDO::FETCH_ASSOC); $emotes = []; foreach($row as $emo) { $emotes[$emo['name']] = $emo['link']; } $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($result as $data){ foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $data['message']); } $msg[] = array('name' => $data['name'], 'message' => $message); }
|
|
|
10/20/2016, 13:13
|
#17
|
dotCom
elite*gold: 10102
Join Date: Mar 2009
Posts: 17,006
Received Thanks: 4,715
|
Dann weiß ich auch nicht, ich will ungern alles 1:1 nach reproduzieren.
Du könntest auch einfach mit socket.io arbeiten und einen livechat aufbauen, da braucht man keine Datenbank für (was eh viel sexier ist). Bei Twitch ist es glaube ich ja nicht anders, stell dir vor es wird ein Twitchchat-raid gemacht, da rappelt deine Datenbank dann ganz schön.
Oder mit Ajax arbeiten und die neusten Sachen holen und ersetzen.
Denke aber, dass du eigentlich einen guten Grundstein nun hast für dein Problem.
Notfalls einfach überall debuggen und dir ausgeben welche Variablen etc. zu grade hast.
Step by Step var_dump(); oder die($var);
|
|
|
10/20/2016, 13:58
|
#18
|
elite*gold: 0
Join Date: Dec 2014
Posts: 276
Received Thanks: 84
|
Quote:
Originally Posted by Devsome
Dann weiß ich auch nicht, ich will ungern alles 1:1 nach reproduzieren.
Du könntest auch einfach mit socket.io arbeiten und einen livechat aufbauen, da braucht man keine Datenbank für (was eh viel sexier ist). Bei Twitch ist es glaube ich ja nicht anders, stell dir vor es wird ein Twitchchat-raid gemacht, da rappelt deine Datenbank dann ganz schön.
Oder mit Ajax arbeiten und die neusten Sachen holen und ersetzen.
Denke aber, dass du eigentlich einen guten Grundstein nun hast für dein Problem.
Notfalls einfach überall debuggen und dir ausgeben welche Variablen etc. zu grade hast.
Step by Step var_dump(); oder die($var);
|
Jeah, ich kapiere echt nicht was da schief läuft und das ganze jetzt zu debuggen und blah ist mir zu doof.
Der Chat ist ja nicht mit Twitch verbunden sondern ein "standalone" chat, den ich halt auf meiner Webseite nutzen will. Massenweiße Nachrichten werden da nicht verschickt.
Ich hatte schonmal von socket.io gehört und wollte es auch nutzen aber auch nachdem ich mir jetzt nochmal die docs usw durch gelesen habe, glaube ich, das man dafür node.js benötigt sowie das express framework? Kann ich das ganze so überhaupt bei einer normalen Webseite mit php/js einbinden?
Edit:
Ich hab mal socket.io eingebunden, aber es funktioniert nicht wirklich..
indexjs
PHP Code:
var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http);
app.get('../twig/pages/index.html', function(req, res){ res.sendfile('../twig/pages/index.html'); });
io.on('connection', function(socket){ socket.on('chat message', function(msg){ io.emit('chat message', msg); }); });
http.listen(3000, function(){ console.log('listening on *:3000'); });
index html
PHP Code:
<script src="https://cdn.socket.io/socket.io-1.0.0.js"></script> <script> var socket = io.connect('http://localhost'); $('#chat_message_form').submit(function(){ socket.emit('chat message', $('#chat_message').val()); $('#chat_message').val(''); return false; }); socket.on('chat message', function(msg){ $('#chat').append($('<li>').text(msg)); }); </script> </head>
nodejs "hört" zwar auf port 3000, schreibt aber nix in die console.
laut console vom browser ist alles korrekt geladen und es gibt viele localhost ~ "anfragen?" von socketio
|
|
|
10/20/2016, 20:55
|
#19
|
elite*gold: 0
Join Date: Sep 2008
Posts: 526
Received Thanks: 82
|
Du musst dem Browser auch den Port mitteilen auf dem er zum Socket connecten soll. Und lass dir am besten immer an jeder stelle wo du glaubst das es nicht geht eine Ausgabe von den jeweiligen variablen geben, dann siehst du immer ob und was fehlt.
|
|
|
10/21/2016, 11:26
|
#20
|
elite*gold: 0
Join Date: Dec 2014
Posts: 276
Received Thanks: 84
|
Nun, ansich gefällt mir socket.io echt super. Aber ich glaube in diesem Falle ists sinnvoller wenn ich den Chat so weiter schreibe, wie ich ihn aktuell habe. Da mir sonst ein paar Funktionen fehlen.
Ich habe eben mit dem Debuggen begonnen.
Ich hab mal das array $emotes ausgegeben:
PHP Code:
array(3) { ["Kappa"]=> string(31) "../twig/images/emotes/Kappa.png" ["PogChamp"]=> string(34) "../twig/images/emotes/PogChamp.png" ["OpieOp"]=> string(32) "../twig/images/emotes/OpieOP.png" }
Die Emotes sind alle im Array drin.
Wenn ich mir den $key ausgeben lasse, ist er nur
PHP Code:
["OpieOp"]=> string(32) "../twig/images/emotes/OpieOP.png"
Nun, wenn ich mich jetzt nicht irre, dann liegt es an:
PHP Code:
foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $result['message']); }
genau diesen Zeilen.
|
|
|
10/21/2016, 13:18
|
#21
|
dotCom
elite*gold: 10102
Join Date: Mar 2009
Posts: 17,006
Received Thanks: 4,715
|
Mein Array ist auch so aufgebaut.
Code:
foreach ($row as $emote) {
$arrayEmotes[$emote['name']] = $emote['img'];
}
daher funktioniert die foreach auch
Code:
foreach ($arrayEmotes as $key => $value) {
$str = str_ireplace($key, $value, $str);
}
Hau doch einfach mal ein echo oder var_dump in die foreach und gebe dir alles aus. Dann wirst du schlauer.
|
|
|
10/21/2016, 13:48
|
#22
|
elite*gold: 0
Join Date: Dec 2014
Posts: 276
Received Thanks: 84
|
var_dump($key);
PHP Code:
string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa" string(8) "PogChamp" string(6) "OpieOp" string(5) "Kappa"
var_dump($value);
PHP Code:
string(31) "../twig/images/emotes/Kappa.png" string(34) "../twig/images/emotes/PogChamp.png" string(32) "../twig/images/emotes/OpieOP.png" string(31) "../twig/images/emotes/Kappa.png" string(34) "../twig/images/emotes/PogChamp.png" string(32) "../twig/images/emotes/OpieOP.png"
var_dump(message);
PHP Code:
string(31) "../twig/images/emotes/Kappa.png" string(34) "../twig/images/emotes/PogChamp.png" string(32) "../twig/images/emotes/OpieOP.png" string(31) "../twig/images/emotes/Kappa.png" string(34) "../twig/images/emotes/PogChamp.png" string(32) "../twig/images/emotes/OpieOP.png"
Also anscheinend wird das richtig ausgetauscht aber warum zum teufel steht es dann anders im Chat?
|
|
|
10/21/2016, 13:54
|
#23
|
dotCom
elite*gold: 10102
Join Date: Mar 2009
Posts: 17,006
Received Thanks: 4,715
|
Also werden rein theoretisch alle Nachrichten richtig ersetzt, wie du anhand var_dump($message); siehst.
Dann liegt es vll wirklich nur daran, wie du die Nachricht in deinen Chat einfügst.
Ohne viel Code können wir leider nicht viel machen.
Habe dir eine Funktionierende Funktion geschrieben
|
|
|
10/21/2016, 14:02
|
#24
|
elite*gold: 0
Join Date: Dec 2014
Posts: 276
Received Thanks: 84
|
PHP Code:
foreach($result as $data){ foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $data['message']); }
$msg[] = array('name' => $data['name'], 'message' => $message); echo var_dump($msg); }
Wenn ich dann "Kappa" in den chat schreibe, ist es ein String(6) "Kappa"
PHP Code:
foreach($result as $data){ foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $data['message']); echo var_dump($message); } $msg[] = array('name' => $data['name'], 'message' => $message); }
Dann ist es string(31) "../twig/images/emotes/Kappa.png"
O.o
Das ganze wird per JS ausgegeben, hatte ich glaube vorher auch schonmal geschrieben? (hoffe ich)
PHP Code:
function updateChat(){ $.ajax({ type: "POST", url: "../twig/handler/Chat", data: { 'function': 'update' }, dataType: "json", success: function(data){ $('#chat').empty(); $("#chat_message").val(''); for (i = data.length -1; i > -1; i--) { $('#chat').append($("<span><p class='chat_line'><span class='badge_admin'></span>" + data[i].name + ': ' + data[i].message + "</p></span>")); } $("#chat").animate({scrollTop: $("#chat").height() + $("#chat").height()}); } }); }
Edit:
So gehts:
PHP Code:
$e = $pdo->prepare("SELECT * FROM emotes"); $e->execute(); $stmt = $pdo->prepare("SELECT * FROM chat_en ORDER BY time DESC LIMIT 30"); $stmt->execute(); $msg = array(); $row = $e->fetchAll(PDO::FETCH_ASSOC); $emotes = []; foreach($row as $emo) { $emotes[$emo['name']] = $emo['link']; } $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($result as $data){ foreach ($emotes as $key => $value) { $message = str_ireplace($key, $value, $data['message']); $msg[] = array('name' => $data['name'], 'message' => $message); }
} echo json_encode($msg);
Gibt aber dennoch zuviele Nachrichten aus, mehr wie 30.
Ich habe nun eine Lösung für das Problem gefunden.
PHP Code:
$e = $pdo->prepare("SELECT * FROM emotes"); $e->execute(); $stmt = $pdo->prepare("SELECT * FROM chat_en ORDER BY time DESC LIMIT 30"); $stmt->execute(); $msg = array(); $row = $e->fetchAll(PDO::FETCH_ASSOC); $emotes = []; foreach($row as $emo) { $emotes[$emo['name']] = $emo['link']; } $replace = array(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($emotes as $key => $value) { array_push($replace, '<img src="'.$value.'" alt="'.$key.'" />'); } foreach($result as $data){ $message = str_replace(array_keys($emotes), $replace, $data['message']);
$msg[] = array('name' => $data['name'], 'message' => $message);
} echo json_encode($msg);
Kann nun geclosed werden.
|
|
|
10/22/2016, 15:26
|
#25
|
dotCom
elite*gold: 10102
Join Date: Mar 2009
Posts: 17,006
Received Thanks: 4,715
|
#closed da gelöst
|
|
|
All times are GMT +2. The time now is 04:27.
|
|