@@ -1933,8 +2235,8 @@ function addMessageBubble(
${userVoice}
-
- ${message}
+
+ ${message}
${translatedMessageHTML}
@@ -1947,6 +2249,8 @@ function addMessageBubble(
`;
+ //document.getElementById(`message-message-message-id${messageID}`).innerText = message;
+
con.liveChatUIContainer.scrollTop = con.liveChatUIContainer.scrollHeight;
}
@@ -2024,6 +2328,7 @@ function onButtonClick(button, argument, event) {
} else if (button == "SpeakNext") {
ttsBan(con.channel, "!ttsban " + argument, true);
} else if (button == "DontSpeak") {
+ onGiftSub();
window.audioPlayer.SkipByID(argument);
console.log(argument);
if (parseInt(argument) > 0) {
@@ -2031,9 +2336,7 @@ function onButtonClick(button, argument, event) {
"message-user-id" + argument
);
messageElement.style.backgroundColor = "#8B0000";
- messageElement = document.getElementById(
- "message-message-id" + argument
- );
+ messageElement = document.getElementById("message-message-id" + argument);
messageElement.style.backgroundColor = "#8B0000";
}
//event.target.disabled = true;
@@ -2085,12 +2388,12 @@ function runChatCommand(channel, username, message, mod) {
chatters[username] = {};
}
- console.log("channel:" + channel + ":" + username + ":");
+ console.log("channel:",channel,"username:",username,"message:",message);
if (message.startsWith("!setvoice")) {
parts = message.split(" ");
- var voice = "justin";
- var voice_option = "standard";
+ var voice = localStorage.getItem("defaultChatterVoice");
+ var voice_option = localStorage.getItem("defaultChatterVoiceOption");
if (parts.length < 2) {
return;
@@ -2110,7 +2413,7 @@ function runChatCommand(channel, username, message, mod) {
voice = voice.toLowerCase();
if (!voices.hasOwnProperty(voice)) {
- voice = "justin";
+ voice = localStorage.getItem("defaultChatterVoice");
}
if (!voices[voice].voiceOptions.includes(voice_option)) {
@@ -2178,6 +2481,11 @@ function ttsBan(channel, message, ban) {
if (parts.length > 1) {
var user = parts[1].toLowerCase();
user = user.replace("@", "");
+ if (!chatters.hasOwnProperty(user)) {
+ console.log("Chatter not loaded");
+ //loadVoice({"username":user});
+ }
+
if (ban) {
window.audioPlayer.DumpByUser(user);
}
@@ -2213,6 +2521,84 @@ function ttsUnbanByUser(channel, user) {
*/
}
+async function getModerators(channel_id) {
+ (async () => {
+ try {
+ const response = await fetch(
+ `https://api.twitch.tv/helix/moderation/moderators?broadcaster_id=${channel_id}&first=100`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ "Client-Id": "dan71ek0pct1u7b8ht5u4h55zlcxvq",
+ Authorization: `Bearer ${access_token}`,
+ },
+ }
+ );
+
+ if (response.ok) {
+ moderators = await response.json();
+ } else {
+ console.error("Could not get moderators.", response);
+ }
+ } catch (error) {
+ console.error("Error fetching moderators.", error);
+ }
+ })();
+}
+
+async function getTwitchUserID(login) {
+ //console.log("getTwitchUserID() ",login);
+ try {
+ const response = await fetch(
+ `https://api.twitch.tv/helix/users?login=${login}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ "Client-Id": "dan71ek0pct1u7b8ht5u4h55zlcxvq",
+ Authorization: `Bearer ${access_token}`,
+ },
+ }
+ );
+
+ if (response.ok) {
+ let body = await response.json();
+ return body.data[0].id;
+ } else {
+ console.error("Could not get user id.", response);
+ }
+ } catch (error) {
+ console.error("Error fetching user.", error);
+ }
+}
+
+async function isModerator(user_id, channel_id) {
+ try {
+ const response = await fetch(
+ `https://api.twitch.tv/helix/moderation/moderators?broadcaster_id=${channel_id}&user_id=${user_id}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ "Client-Id": "dan71ek0pct1u7b8ht5u4h55zlcxvq",
+ Authorization: `Bearer ${access_token}`,
+ },
+ }
+ );
+
+ if (response.ok) {
+ let body = await response.json();
+ console.log("user mod info:", body.data);
+ return body.data.length > 0;
+ } else {
+ console.error("Could not get moderators.", response);
+ }
+ } catch (error) {
+ console.error("Error fetching moderators.", error);
+ }
+}
+
async function deleteTwitchChatMessage(channel_id, message_id) {
(async () => {
try {
@@ -2239,6 +2625,51 @@ async function deleteTwitchChatMessage(channel_id, message_id) {
})();
}
+async function shoutoutUser(channel_id, login) {
+ console.log("channel_id:", twitch_id, "login:", login);
+ let login_id_to_shoutout = null;
+
+ await $.ajax({
+ url: "https://api.twitch.tv/helix/users?login=" + login,
+ type: "GET",
+ headers: {
+ "client-id": "dan71ek0pct1u7b8ht5u4h55zlcxvq",
+ Authorization: "Bearer " + access_token,
+ },
+ success: function (response) {
+ console.log(response);
+ login_id_to_shoutout = response.data[0].id;
+ console.log("shoutoutUser() got login_id:", login_id_to_shoutout);
+ },
+ error: function (response) {
+ console.log("unable to lookup", login, "for shoutout");
+ },
+ });
+
+ if (login_id_to_shoutout) {
+ console.log(
+ "url:",
+ `https://api.twitch.tv/helix/chat/shoutouts?from_broadcaster_id=${channel_id}&to_broadcaster_id=${login_id_to_shoutout}&moderator_id=${channel_id}`
+ );
+ await $.ajax({
+ url: `https://api.twitch.tv/helix/chat/shoutouts?from_broadcaster_id=${channel_id}&to_broadcaster_id=${login_id_to_shoutout}&moderator_id=${channel_id}`,
+ type: "POST",
+ dataType: "json",
+ contentType: "application/json",
+ headers: {
+ "Client-ID": "dan71ek0pct1u7b8ht5u4h55zlcxvq",
+ Authorization: `Bearer ${access_token}`,
+ },
+ success: function (response) {
+ console.log("User shoutout successful:", response);
+ },
+ error: function (error) {
+ console.error("Error shouting out user:", error);
+ },
+ });
+ }
+}
+
async function banUser(channel_id, login, reason) {
if (!reason) {
reason = "no reason specified";
@@ -2351,6 +2782,7 @@ async function saveTTSConfig(channel, username) {
data.voice_option = sanitize(chatters[username].voice_option);
data.spoken_name = sanitize(chatters[username].spoken_name);
data.ttsBanned = chatters[username].ttsBanned;
+ data.platform = chatters[username].platform;
data.access_token = access_token;
request.data = [];
request.data.push(data);
@@ -2406,6 +2838,9 @@ async function buildVoiceLookup() {
voices[lcvoice].engine = voicesDesc.Voices[i].SupportedEngines[0];
voices[lcvoice].voiceOptions = voicesDesc.Voices[i].SupportedEngines;
voices[lcvoice].name = idvoice;
+ voices[lcvoice].gender = voicesDesc.Voices[i].Gender;
+ voices[lcvoice].languageCode = voicesDesc.Voices[i].LanguageCode;
+ voices[lcvoice].languageName = voicesDesc.Voices[i].LanguageName;
}
voicesDesc.Voices.sort(function (a, b) {
if (a.LanguageCode === b.LanguageCode) {
@@ -2468,53 +2903,74 @@ async function loadVoice(lvuserstate) {
chatters[username].voice = "brian";
chatters[username].voice_option = "standard";
chatters[username].display_name = lvuserstate["display-name"];
+ chatters[username].soken_name = lvuserstate["display-name"];
chatters[username].color = lvuserstate.color;
},
});
if (!hasLocalChannelConfig) {
//console.log("Does not have local config.");
- await $.ajax({
- url: "https://api.tts.bot/tts/all/" + username,
- success: function (response) {
- //console.log("Data from all for:", response);
- if (response.hasOwnProperty("Item")) {
- //console.log('loadVoice(global): ' + response.Item.voice.toLowerCase() + ' from DynamoDB');
- chatters[username] = {};
- chatters[username].voice = response.Item.voice.toLowerCase();
- chatters[username].voice_option = response.Item.voice_option;
- chatters[username].spoken_name = response.Item.spoken_name;
- chatters[username].ttsBanned = response.Item.ttsBanned;
- chatters[username].display_name = response.Item.display_name;
- chatters[username].color = lvuserstate.color;
- } else if (chatters[username].hasOwnProperty("voice")) {
- //console.log('loadVoice() chatters[' + username + '].voice: ' + chatters[username].voice);
- chatters[username].voice = "justin";
- chatters[username].voice_option = "standard";
- chatters[username].spoken_name = username;
- chatters[username].ttsBanned = false;
- chatters[username].display_name = lvuserstate["display-name"];
- } else {
- //console.log('loadVoice() catchall: using Justin for ' + username);
- chatters[username].voice = "justin";
+ chatters[username] = {};
+
+ try {
+ await $.ajax({
+ url: "https://api.tts.bot/tts/all/" + username,
+ success: function (response) {
+ //console.log("Data from all for:", response);
+
+ if (response.hasOwnProperty("Item")) {
+ //console.log('loadVoice(global): ' + response.Item.voice.toLowerCase() + ' from DynamoDB');
+ chatters[username].voice = response.Item.voice.toLowerCase();
+ chatters[username].voice_option = response.Item.voice_option;
+ chatters[username].spoken_name = response.Item.spoken_name;
+ chatters[username].ttsBanned = response.Item.ttsBanned;
+ chatters[username].display_name = response.Item.display_name;
+ chatters[username].color = lvuserstate.color;
+ } else if (chatters[username].hasOwnProperty("voice")) {
+ //console.log('loadVoice() chatters[' + username + '].voice: ' + chatters[username].voice);
+ chatters[username].voice = localStorage.getItem(
+ "defaultChatterVoice"
+ );
+ chatters[username].voice_option = localStorage.getItem(
+ "defaultChatterVoiceOption"
+ );
+ chatters[username].spoken_name = username;
+ chatters[username].ttsBanned = false;
+ chatters[username].display_name = lvuserstate["display-name"];
+ } else {
+ //console.log('loadVoice() catchall: using default voice for ' + username);
+ chatters[username].voice = localStorage.getItem(
+ "defaultChatterVoice"
+ );
+ chatters[username].voice_option = localStorage.getItem(
+ "defaultChatterVoiceOption"
+ );
+ chatters[username].spoken_name = username;
+ chatters[username].ttsBanned = false;
+ chatters[username].display_name = lvuserstate["display-name"];
+ chatters[username].color = lvuserstate.color;
+ }
+ },
+ error: function (request, status, error) {
+ console.log("loadVoice(global) error: using Brian");
+ chatters[username].voice = "brian";
chatters[username].voice_option = "standard";
- chatters[username].spoken_name = username;
chatters[username].ttsBanned = false;
chatters[username].display_name = lvuserstate["display-name"];
+ chatters[username].spoken_name = lvuserstate["display-name"];
chatters[username].color = lvuserstate.color;
- }
- },
- error: function (request, status, error) {
- console.log("loadVoice(global) error: using Brian");
- chatters[username].voice = "brian";
- chatters[username].voice_option = "standard";
- chatters[username].ttsBanned = false;
- chatters[username].display_name = lvuserstate["display-name"];
- chatters[username].color = lvuserstate.color;
- },
- });
+ },
+ });
+ } catch (err) {
+ console.log(err);
+ }
}
- }
+ } else {
+ console.log("loadVoice(global) backend disabled: using Brian");
+ chatters[username].voice = "justin";
+ chatters[username].voice_option = "standard";
+ chatters[username].ttsBanned = false;
+ }
}
function getSpokenName(username) {
@@ -2543,7 +2999,7 @@ function sendMessage() {
var params = {
Text: con.sendMessage.value,
SourceLanguageCode: "auto",
- TargetLanguageCode: targetLanguage
+ TargetLanguageCode: targetLanguage,
};
window.translator.translateText(
@@ -2553,11 +3009,12 @@ function sendMessage() {
console.log("Error calling Translate. " + err.message + err.stack);
}
if (data) {
-
var translatedMessage = data.TranslatedText;
- console.log("M: " + message);
- console.log("T: " + translatedMessage);
+ if(DEBUG) {
+ console.log("Message:",message);
+ console.log("Translation:",translatedMessage);
+ }
//Send message to chat
window.client.say(con.channel, translatedMessage);
@@ -2567,8 +3024,16 @@ function sendMessage() {
let username = document.getElementById("twitch_username").value;
- addMessageBubble(username, message, translatedMessage, true, "Local send", ++messageID, "Local");
-
+ addMessageBubble(
+ username,
+ message,
+ translatedMessage,
+ true,
+ "Local send",
+ ++messageID,
+ "Local"
+ );
+
/*window.audioPlayer.Speak(
"",
//"