Ich habe ein Greymonkey-Skript, das einige Elemente von Twitch.tv nach Flüsternachrichten von einem Chat-Bot auf einem bestimmten Twitch-Kanal anpasst. Mein Ziel ist es, den Flüsterchat zu beobachten, jede neue Whipser-Nachricht zu lesen, entsprechende Anpassungen vorzunehmen und anschließend das Chat-Fenster zu schließen, so dass ich nicht sehe, dass ich geflüstert wurde.Twitch-Whisper-Nachrichten mit Greasemonkey lesen
Ich bin nicht so vertraut mit Greasemonkey, HMTL oder Javascript im Allgemeinen. Der einzige Weg, ich weiß, dies zu tun ist observeDOM
auf eine Klasse zu verwenden, die alle flüstern Fenster enthält (conversation-manager
):
// Observe twitch whisper chat
var whisperArea = document.getElementsByClassName('conversations-manager')[0];
observeDOM(whisperArea ,function(){
NewWhisperMessage();
});
Soweit ich die Beobachtung sagen kann zuverlässig funktioniert. Nun zu dem Teil, der das nicht tut: Meine Methode NewWhisperMessage
selbst.
Zunächst möchte ich meinen ersten Ansatz beschreiben. Am Anfang habe ich versucht, alles neue Flüstern zu finden. Wenn ein Flüstern empfangen wird, öffnet sich das Flüsterfenster. Das Flüstern Fenster selbst hat Mutliple Nachricht Zeilen wie diese aufbauen:
<div class="ember-view conversation-chat-line incoming" title="Sat Jul 09 2016 11:52:38 GMT+0200" id="ember2564">
<span style="" class="from">NameOfMessageWriter</span>
<span class="colon">:</span>
<span style="" class="message">
Here is the message!
</span>
</div>
in diesem Moment Generell würde ich das letzte Element der Klasse nehmen nur conversation-chat-line
von
var allChatMessages = document.getElementsByClassName("conversation-chat-line");
var newestChatMessage = allChatMessages[allChatMessages.length - 1];
Das funktioniert somtimes aber ist eine Art unzuverlässig, da es scheint, dass manchmal mehrere Nachrichten in einem DOM-Update ankommen (macht das Sinn?). Als ich das bemerkte, kam ich auf eine kompliziertere Idee, die zuverlässiger funktioniert, aber immer noch oft scheitert.
Mein Ansatz funktioniert grob in 4 Schritten:
1) Wenn dies die ersten neuen Flüstern dieser Sitzung ist (LastWhisperTitle
ist noch leer), dann ein Ausgangspunkt gefunden werden muss. Dazu versuche ich das seperator Element im Twitch Chat Fenster für die neuen Flüsternachrichten (der Klasse new-message-divider
) zu finden. Von da an versuche ich die Chat Nachricht direkt davor zu bekommen und das title
Attribut und den Nachrichtentext dieser Nachricht zu speichern Identifiziere die Nachricht eindeutig (ich kann das Attribut id
nicht verwenden, da es sich ändert, wenn das Flüsterfenster geschlossen und wieder geöffnet wird.) Dieser Schritt wird nur einmal ausgeführt.
2) Jetzt iteriere ich rückwärts über alle Chatnachrichten, bis ich die Letzteres wird durch die zwei Variablen (Titel und Nachrichtentext) identifiziert. Um alle Chatnachrichten zu erhalten, verwende ich getElementsByClassName
. Ich speichere den Index dieser neuesten Nachricht und beginne mit Schritt 3).
3) Mit dem Index der ersten neuen Chat-Nachricht fange ich an, vorwärts zu iterieren und jede Nachricht in Reihenfolge zu analysieren.
4) Schließen Sie das Flüsterfenster, wenn eine neue Nachricht gelesen wurde. (Die bedingte erlaubt nur das Flüstern Fenster manuell öffnen, wenn keine neue Nachricht eingetroffen)
Und hier ist der letzte Mehtod:
var LastWhisperTitle = "";
var LastWhisperMessage = "";
var ChannelName = "NameOfChatBot"
function NewWhisperMessage(){
if(LastWhisperTitle == "") {
// New Session: Find first new whisper
// Find new message divider
var newMessageDividerArray = document.getElementsByClassName("new-message-divider");
var newMessageDivider = newMessageDividerArray[newMessageDividerArray.length - 1];
// Find newest message already read
var sibling = newMessageDivider.previousSibling;
while(sibling) {
if(sibling.nodeType == 1) {
if(sibling.className != "undefined"){
if(sibling.className.indexOf("conversation-chat-line") > -1) {
break;
}
}
}
sibling = sibling.previousSibling;
}
if(!sibling){
return;
}
// Store this message as last read whisper
LastWhisperTitle = sibling.title;
LastWhisperMessage = sibling.getElementsByClassName("message")[0].textContent.trim();
}
// Get all messages
var whisperMessageArray = document.getElementsByClassName("conversation-chat-line");
var foundNewMessage = false;
// Find index in array of the first new message
var firstNewMessageIndex = 0;
for(i = whisperMessageArray.length - 1; i >= 0; i--){
var currentWhisper = whisperMessageArray[i];
var currentTitle = currentWhisper.title;
var currentMessage = currentWhisper.getElementsByClassName("message")[0].textContent.trim()
if(currentTitle == LastWhisperTitle && currentMessage == LastWhisperMessage){
// This message was already read -> the message with the previous index is new
if(i == whisperMessageArray.length - 1) {
// No new message
return;
} else {
firstNewMessageIndex = i+1;
break;
}
}
}
if(firstNewMessageIndex == 0){
// No new message
return;
}
// Parse all messages from index to newest message
for(i = firstNewMessageIndex; i < whisperMessageArray.length; i++){
var currentWhisper = whisperMessageArray[i];
var writer = currentWhisper.getElementsByClassName("from")[0].textContent;
var message = currentWhisper.getElementsByClassName("message")[0].textContent.trim();
if(writer == ChannelName){
ParseWhisperMessage(message);
foundNewMessage = true;
}
LastWhisperTitle = currentWhisper.title;
LastWhisperMessage = message;
}
if(foundNewMessage){
// Close Chat Window
CloseWhisperWindow();
}
}
ich immer noch die Probleme haben, die nur einige oder keine flüstern Nachrichten überhaupt gelesen werden . Was könnte das Problem mit meinem Ansatz sein?
Es ist schwer ohne Live-Beispiel zu sagen. Kannst du uns sagen, wie man diesen Flüsterton auf Twitch öffnet? – wOxxOm
Wir hatten eine Menge Probleme bei der Implementierung von Änderungen an Flüstern in BetterTTV wegen der Art, wie Twitch es in Ember implementierte. Ich bin mir nicht sicher, was Sie hier versuchen, aber wenn Sie das Flüstern im DOM ändern müssen, werden Sie keine gute Zeit haben. Wir haben festgestellt, dass selbst kleine Änderungen das Ganze zum Absturz gebracht haben. – Teak