САМЫЙ ЛУЧШИЙ ФОРУМ ДЛЯ ОБЩЕНИЯ ПОДРОСТКОВ ДЕТЙ И ВЗРОСЛЫХ ФОРУМ ДЛЯ ВСЕХ И КАЖДОГО

Объявление

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Зачитать сообщение | Зачитать все сообщения

Сообщений 1 страница 41 из 41

1

Как насчёт функции для особо ленивых?) Вот набросал код.

В HTML-верх:

Код:
<!-- Зачитать сообщение | Зачитать все сообщения -->
<script type="text/javascript">
let synth = window.speechSynthesis;

function readMessage(event) {
    let postContent = event.currentTarget.parentElement.parentElement.parentElement.getElementsByClassName("post-content")[0];
    
    let utterThis = new SpeechSynthesisUtterance(postContent.innerText);
    synth.speak(utterThis);
}
function readAllMessages() {
    for (const post of posts) {
        let postContent = post.getElementsByClassName("post-content")[0];
        let author = post.getElementsByClassName("pa-author")[0].getElementsByTagName("a")[0].innerText;
        
        let utterThis = new SpeechSynthesisUtterance(author + "пишет: " + postContent.innerText);
        synth.speak(utterThis);
    }
}

const posts = document.getElementsByClassName("post");

document.addEventListener("DOMContentLoaded", function () {
    const post = posts[0];
    
    const header = post.getElementsByTagName("h3")[0].getElementsByTagName("span")[0];
        
    let speaklink = document.createElement("a");
    speaklink.innerHTML = "Зачитать всё";
    speaklink.style.cursor = "pointer";
    speaklink.style.float = "right";
    speaklink.style.margin = "0px 25px 0px 0px";
    speaklink.addEventListener("click", readAllMessages);
        
    header.childNodes[1].after(speaklink);
    
    for (const post of posts) {
        const header = post.getElementsByTagName("h3")[0].getElementsByTagName("span")[0];
        
        let speaklink = document.createElement("a");
        speaklink.innerHTML = "Зачитать";
        speaklink.style.cursor = "pointer";
        speaklink.style.float = "right";
        speaklink.addEventListener("click", readMessage);
        
        header.childNodes[1].after(speaklink);
    }
});
</script>
<!-- Сделано GulgDev -->

Отредактировано Еремей (2021-07-19 10:19:28)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

2

Код для голосового ввода сообщения (HTML-верх):

Код:
<!-- Голосовой ввод -->
<script type="text/javascript>
let recognition;
try {
    recognition = new SpeechRecognition();
} catch {
    recognition = new webkitSpeechRecognition();
}
recognition.onresult = function(event) {
    icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
    let result = event.results[0][0].transcript;
    document.getElementById("main-reply").value += result.charAt(0).toUpperCase() + result.substr(1) + ". ";
}
recognition.onspeechend = function() {
    recognition.stop();
}

recognition.onstart = function () {
    icon.src = "https://forumupload.ru/uploads/0015/15/60/615/316127.png";
}
recognition.onend = function () {
    icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
}
recognition.onerror = function () {
    icon.src = "https://forumupload.ru/uploads/0015/15/60/615/128230.png";
}
recognition.onnomatch = function () {
    icon.src = "https://forumupload.ru/uploads/0015/15/60/615/128230.png";
}

function voiceInput() {
    try {
        recognition.start();
    } catch {
        recognition.stop();
    }
}

let button = document.createElement("td");
button.id = "button-voice-input";
button.title = "Голосовой ввод";

let icon = document.createElement("img");
icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
icon.style.width = "15px";
icon.style.height = "15px";
icon.addEventListener("click", voiceInput);

document.addEventListener("DOMContentLoaded", function () {
    let btns = document.getElementById("form-buttons").getElementsByTagName("tr")[0];
    button.appendChild(icon);
    btns.insertBefore(button, btns.firstChild);
});
</script>
<!-- Сделано GulgDev -->

Отредактировано Еремей (2021-07-19 11:57:37)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

3

Ого, голосовые были бы актуальны!
А ты уверен что будет работать?

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

4

Да  https://s020.radikal.ru/i711/1509/46/8410405a3850.jpg

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

5

Я только в соц сетях по ним и общаюсь. Удобно че)

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

6

Dimitriy Gerasimov написал(а):

Ого, голосовые были бы актуальны!

Надеюсь, ты правильно понял. Это не совсем голосовые, а голосовой ввод. Если надо, могу переделать под голосовые, но нужен сервер, куда загружать сообщения.

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

7

че, пробуем?

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

8

Dimitriy Gerasimov написал(а):

че, пробуем?

угу)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

9

Еремей написал(а):

Надеюсь, ты правильно понял. Это не совсем голосовые, а голосовой ввод. Если надо, могу переделать под голосовые, но нужен сервер, куда загружать сообщения.

Не, ну как в ВК? Или просто загружать голосовые? Я правда наверн немного не понял

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

10

Dimitriy Gerasimov написал(а):

Не, ну как в ВК? Или просто загружать голосовые? Я правда наверн немного не понял

Речь преобразовывается в текстовое сообщение.

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

11

Аа, типа не печатать а голос Робота?

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

12

Но могу попробовать сделать как в ВК или Ватсапп

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

13

Еремей написал(а):

Речь преобразовывается в текстовое сообщение.

давай)

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

14

Dimitriy Gerasimov написал(а):

Аа, типа не печатать а голос Робота?

Смотри, допустим я говорю слова, но для остальных это просто текст, написанный без знаков препинания (робот не очень умный, но я - "граматей", добавил разделение предложений).

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

15

Dimitriy Gerasimov написал(а):

давай)

Еремей написал(а):

но нужен сервер, куда загружать сообщения.

Отредактировано Еремей (2021-07-19 20:08:51)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

16

Еремей написал(а):

Смотри, допустим я говорю слова, но для остальных это просто текст, написанный без знаков препинания (робот не очень умный, но я - "граматей", добавил разделение предложений).

я уже разместил вверх твой скрипт

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

17

Dimitriy Gerasimov
По хорошему нужно добавить в разрешённые для загрузки пользователями файлы расширение аудио (.mp3)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

18

Dimitriy Gerasimov написал(а):

я уже разместил вверх твой скрипт

https://s009.radikal.ru/i308/1505/50/58ddcbf3b1d3.jpg

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

19

Dimitriy Gerasimov написал(а):

я уже разместил вверх твой скрипт

Ну что, работает? У меня замечательно.

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

20

Еремей написал(а):

Dimitriy Gerasimov
По хорошему нужно добавить в разрешённые для загрузки пользователями файлы расширение аудио (.mp3)

скажи, он у тебя совсем сырой? Мы нечего не сломаем так то?

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

21

Еремей написал(а):

Ну что, работает? У меня замечательно.

дай пж инструкцию как это работать должно

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

22

Dimitriy Gerasimov написал(а):

скажи, он у тебя совсем сырой? Мы нечего не сломаем так то?

Не беспокойся, не сломаем. Вообще, можно найти внешний сервер, но он может закрыться и все сообщения сотрутся.

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

23

Dimitriy Gerasimov написал(а):

дай пж инструкцию как это работать должно

ты про голосовые сообщения или про зачитывание текста. (два разных скрипта)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

24

Еремей написал(а):

Не беспокойся, не сломаем. Вообще, можно найти внешний сервер, но он может закрыться и все сообщения сотрутся.

у меня еще мгновенные уведомления перестали работать. А я их покупал. Пишет, типа у вас неправильные настройки или что то со временем.

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

25

Это не ко мне. Мой скрипт ничего не делает. Даже если он был бы вирусный, он влияет только на внешний вид, сервер он не может достать (потому то и трудности с голосовыми).

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

26

ну перввый скрипт, зачитать сообщения. А в голосовые, если хош айда в вк или в телегу

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

27

Еремей написал(а):

Это не ко мне. Мой скрипт ничего не делает. Даже если он был бы вирусный, он влияет только на внешний вид, сервер он не может достать (потому то и трудности с голосовыми).

инструкция как им пользоваться)

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

28

Чтобы зачитать сообщение, нажми "Зачитать" на нужном посте. Робот воспроизведёт весь текст сообщения, время последнего редактирования и подпись автора.
Чтобы зачитать все сообщения на странице нажми "Зачитать всё" на первом посте. Робот воспроизведёт текст каждого сообщения, время его последнего редактирования, подпись автора, а так же имя отправителя.

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

29

Dimitriy Gerasimov написал(а):

в вк

давай

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

30

вк плохо умею пользоваться, сообщение написать не могу

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

31

Еремей написал(а):

вк плохо умею пользоваться, сообщение написать не могу

Я попзже зайду, мне пора, выгоняют гулять(
Там просто есть голосовое а сообщение вот тут. И спасиб что помогаешь

https://i.imgur.com/6YGthRC.png

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

32

ну я потом вряд-ли смогу - у меня ночь глубокая, мама спать говорит. если надо прям сейчас могу настроить часть, только мне админка нужна, или можно завтра

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

33

Еремей написал(а):

ну я потом вряд-ли смогу - у меня ночь глубокая, мама спать говорит. если надо прям сейчас могу настроить часть, только мне админка нужна, или можно завтра

Ок, давай Это было бы здорово. Можно потом и твои проекты сюда прикрутить  :cool:

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

34

Ок!

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

35

Всёёёё!!!! Я понял!!! Сейчас сделаю!

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

36

НЕ ВСТАВЛЯТЬ! Пока черновик.
В HTML-верх:

Код:
<!-- Система голосовых сообщений -->
<script async defer src="https://apis.google.com/js/api.js" onload="this.onload=function(){};handleClientLoad()" onreadystatechange="if (this.readyState === 'complete') this.onload()"></script>
<script type="text/javascript">
let CLIENT_ID = '295266302477-velmnkko5g2i3gti78c7bbglvnt0c455.apps.googleusercontent.com';
let API_KEY = 'AIzaSyCRY2IguMGuNTi6FyohnTXC_7hDn3fB2FU';
let SCOPES = 'https://www.googleapis.com/auth/drive.file';

gapi.client.init({
    apiKey: API_KEY,
    clientId: CLIENT_ID,
    discoveryDocs: DISCOVERY_DOCS,
    scope: SCOPES
});

gapi.auth2.getAuthInstance().signIn();

window.onbeforeunload = function () {
    gapi.auth2.getAuthInstance().signOut();
};


let recording = true;

function voiceMessage() {
    if (recording) {
        recording = false;
        stopRecording();
    } else {
        recording = true;
        startRecording();
    }
}

function startRecording() {
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    navigator.getUserMedia(
        {
            audio: true
        },
        function (e) {
            window.AudioContext = window.AudioContext || window.webkitAudioContext;
            context = new AudioContext();

            mediaStream = context.createMediaStreamSource(e);

            let bufferSize = 2048;
            let numberOfInputChannels = 2;
            let numberOfOutputChannels = 2;
            if (context.createScriptProcessor) {
                recorder = context.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels);
            } else {
                recorder = context.createJavaScriptNode(bufferSize, numberOfInputChannels, numberOfOutputChannels);
            }

            recorder.onaudioprocess = function (e) {
                leftchannel.push(new Float32Array(e.inputBuffer.getChannelData(0)));
                rightchannel.push(new Float32Array(e.inputBuffer.getChannelData(1)));
                recordingLength += bufferSize;
            }

            mediaStream.connect(recorder);
            recorder.connect(context.destination);
        },
        function (e) {
            console.error(e);
        }
    );
}
function stopRecording() {
    recorder.disconnect(context.destination);
    mediaStream.disconnect(recorder);

    let leftBuffer = flattenArray(leftchannel, recordingLength);
    let rightBuffer = flattenArray(rightchannel, recordingLength);
    let interleaved = interleave(leftBuffer, rightBuffer);

    let buffer = new ArrayBuffer(44 + interleaved.length * 2);
    let view = new DataView(buffer);

    writeUTFBytes(view, 0, 'RIFF');
    view.setUint32(4, 44 + interleaved.length * 2, true);
    writeUTFBytes(view, 8, 'WAVE');
    writeUTFBytes(view, 12, 'fmt ');
    view.setUint32(16, 16, true);
    view.setUint16(20, 1, true);
    view.setUint16(22, 2, true);
    view.setUint32(24, sampleRate, true);
    view.setUint32(28, sampleRate * 4, true);
    view.setUint16(32, 4, true);
    view.setUint16(34, 16, true);
    writeUTFBytes(view, 36, 'data');
    view.setUint32(40, interleaved.length * 2, true);

    let index = 44;
    let volume = 1;
    for (var i = 0; i < interleaved.length; i++) {
        view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);
        index += 2;
    }

    gapi.client.drive.files.create({
        resource: {
            'name': 'message.mp3'
        }
        media: {
            mimeType: 'audio/mp3',
            body: view,
        }
        fields: 'id'
    }, function (e, f) {
        if (e) {
            console.error(e);
        } else {
            document.getElementById("main-reply").value += "[voice]" + f.id + "[/voice]"
        }
    });
}

let button = document.createElement("td");
button.id = "button-voice-input";
button.title = "Голосовоt сообщение";

let icon = document.createElement("img");
icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
icon.style.width = "15px";
icon.style.height = "15px";
icon.addEventListener("click", voiceMessage);

document.addEventListener("DOMContentLoaded", function () {
    let btns = document.getElementById("form-buttons").getElementsByTagName("tr")[0];
    button.appendChild(icon);
    btns.insertBefore(button, btns.firstChild);
});
</script>
<!-- Сделано GulgDevs -->

&del&

Отредактировано Еремей (2021-07-20 12:29:07)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

37

В HTML-верх:

Код:
<!-- Система голосовых сообщений -->
<script type="text/javascript">
function uploadMessage(view) {
    let formData = new FormData();
    formData.append("file", new Blob([view], {type: "audio/mp3"}), "voice.mp3");
    
    let xhr = new XMLHttpRequest();
    xhr.open("POST", "https://green-island-backend.000webhostapp.com/upload.php");
    xhr.send(formData);

    xhr.onload = () => document.getElementById("main-reply").value += "[voice]" + xhr.response + "[/voice]";
}

function loadMessages() {
    for (let post of document.getElementsByClassName("post")) {
        let uid = post.getAttribute("data-user-id");

        post.innerHTML = post.innerHTML.replace(/(\[voice\](\d+)\[\/voice\])|(?:<div class="code-box">[^<>]*<\/div>)/g, "<audio class='voice-message' controls src='https://green-island-backend.000webhostapp.com/data/voice-messages/$2'></audio>"); // /\[voice\](.+)\[\/voice\]/g
    }
}
document.addEventListener("DOMContentLoaded", loadMessages);
document.addEventListener("DOMContentLoaded", () => document.getElementsByClassName("submit")[0].addEventListener("click", loadMessages));


function flattenArray(channelBuffer, recordingLength) {
    let result = new Float32Array(recordingLength);
    let offset = 0;
    for (let i = 0; i < channelBuffer.length; i++) {
        let buffer = channelBuffer[i];
        result.set(buffer, offset);
        offset += buffer.length;
    }
    return result;
}

function interleave(leftChannel, rightChannel) {
    let length = leftChannel.length + rightChannel.length;
    let result = new Float32Array(length);

    let inputIndex = 0;

    for (let index = 0; index < length;) {
        result[index++] = leftChannel[inputIndex];
        result[index++] = rightChannel[inputIndex];
        inputIndex++;
    }
    return result;
}

function writeUTFBytes(view, offset, string) {
    for (let i = 0; i < string.length; i++) {
        view.setUint8(offset + i, string.charCodeAt(i));
    }
}

let leftchannel = [];
let rightchannel = [];

let recordingLength = 0;

let recorder;
let recording = false;

let sampleRate = 44100;

function voiceMessage() {
    if (recording) {
        recording = false;
        icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
        stopRecording();
    } else {
        recording = true;
        icon.src = "https://forumupload.ru/uploads/0015/15/60/615/316127.png";
        startRecording();
    }
}

function startRecording() {
    navigator.mediaDevices.getUserMedia(
        {
            audio: true
        },
    ).then(function(e) {
        window.AudioContext = window.AudioContext || window.webkitAudioContext;
        context = new AudioContext();

        mediaStream = context.createMediaStreamSource(e);

        let bufferSize = 2048;
        let numberOfInputChannels = 2;
        let numberOfOutputChannels = 2;
        if (context.createScriptProcessor) {
            recorder = context.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels);
        } else {
            recorder = context.createJavaScriptNode(bufferSize, numberOfInputChannels, numberOfOutputChannels);
        }

        recorder.onaudioprocess = function (e) {
            leftchannel.push(new Float32Array(e.inputBuffer.getChannelData(0)));
            rightchannel.push(new Float32Array(e.inputBuffer.getChannelData(1)));
            recordingLength += bufferSize;
        }

        mediaStream.connect(recorder);
        recorder.connect(context.destination);
    }).catch(function (e) {
        console.error(e);
    });
}
function stopRecording() {
    recorder.disconnect(context.destination);
    mediaStream.disconnect(recorder);

    let leftBuffer = flattenArray(leftchannel, recordingLength);
    let rightBuffer = flattenArray(rightchannel, recordingLength);
    let interleaved = interleave(leftBuffer, rightBuffer);

    let buffer = new ArrayBuffer(44 + interleaved.length * 2);
    let view = new DataView(buffer);

    writeUTFBytes(view, 0, 'RIFF');
    view.setUint32(4, 44 + interleaved.length * 2, true);
    writeUTFBytes(view, 8, 'WAVE');
    writeUTFBytes(view, 12, 'fmt ');
    view.setUint32(16, 16, true);
    view.setUint16(20, 1, true);
    view.setUint16(22, 2, true);
    view.setUint32(24, sampleRate, true);
    view.setUint32(28, sampleRate * 4, true);
    view.setUint16(32, 4, true);
    view.setUint16(34, 16, true);
    writeUTFBytes(view, 36, 'data');
    view.setUint32(40, interleaved.length * 2, true);

    let index = 44;
    let volume = 1;
    for (var i = 0; i < interleaved.length; i++) {
        view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);
        index += 2;
    }

    uploadMessage(view);
}

let button = document.createElement("td");
button.id = "button-voice-input";
button.title = "Голосовоt сообщение";

let icon = document.createElement("img");
icon.src = "https://forumupload.ru/uploads/0015/15/60/615/655001.png";
icon.style.width = "15px";
icon.style.height = "15px";
icon.addEventListener("click", voiceMessage);

document.addEventListener("DOMContentLoaded", function () {
    let btns = document.getElementById("form-buttons").getElementsByTagName("tr")[0];
    button.appendChild(icon);
    btns.insertBefore(button, btns.firstChild);
});
</script>
<!-- Сделано GulgDevs -->

Отредактировано Еремей (2021-07-20 17:30:02)

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

38

Обновлённый код зачитывания сообщений:

Код:
<!-- Зачитать сообщение | Зачитать все сообщения -->
<script type="text/javascript">
let synth = window.speechSynthesis;

function readMessage(event) {
    let postContent = event.currentTarget.parentElement.parentElement.parentElement.getElementsByClassName("post-content")[0];

    let tmp = document.createElement("div");
    tmp.innerHTML = postContent.innerHTML;
    
    for (elm of tmp.getElementsByClassName("code-box"))
        elm.outerHTML = "(Код)";    

    let utterThis = new SpeechSynthesisUtterance(tmp.innerText);
    synth.speak(utterThis);
}
function readAllMessages() {
    for (const post of posts) {
        let postContent = post.getElementsByClassName("post-content")[0];
        let author = post.getElementsByClassName("pa-author")[0].getElementsByTagName("a")[0].innerText;

        let tmp = document.createElement("div");
        tmp.innerHTML = postContent.innerHTML;
    
        for (elm of tmp.getElementsByClassName("code-box"))
            elm.outerHTML = "(Код)";        

        let utterThis = new SpeechSynthesisUtterance(author + "пишет: " + tmp.innerText);
        synth.speak(utterThis);
    }
}

const posts = document.getElementsByClassName("post");

document.addEventListener("DOMContentLoaded", function () {
    const post = posts[0];
    
    const header = post.getElementsByTagName("h3")[0].getElementsByTagName("span")[0];
        
    let speaklink = document.createElement("a");
    speaklink.innerHTML = "Зачитать всё";
    speaklink.style.cursor = "pointer";
    speaklink.style.float = "right";
    speaklink.style.margin = "0px 25px 0px 0px";
    speaklink.addEventListener("click", readAllMessages);
        
    header.childNodes[1].after(speaklink);
    
    for (const post of posts) {
        const header = post.getElementsByTagName("h3")[0].getElementsByTagName("span")[0];
        
        let speaklink = document.createElement("a");
        speaklink.innerHTML = "Зачитать";
        speaklink.style.cursor = "pointer";
        speaklink.style.float = "right";
        speaklink.addEventListener("click", readMessage);
        
        header.childNodes[1].after(speaklink);
    }
});
</script>
<!-- Сделано GulgDev -->
Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

39

[voice]1[/voice]

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0

40

Давай админ, пробуй свои силы. Ну пжж, аккуратнее  :tomato:

Подпись автора

https://i013.radikal.ru/1606/d9/04ba207139ee.gifhttps://smailiki.ucoz.net/_ph/53/2/545773567.gifhttps://smail1.ucoz.net/_ph/7/2/454533062.gif
По всем вопросам, касаемо работы форума, пишите в тему без регистрации или в чат

0

41

Dimitriy Gerasimov написал(а):

Давай админ, пробуй свои силы. Ну пжж, аккуратнее

Не бойся, я ничего не сломаю!

Подпись автора

[script]UserLogin ? "Привет, " + GroupUserTitle.toLowerCase() + " " + UserName + "!" : "Привет, гость! <a href=\"/login.php\" rel=\"nofollow\">Войди</a> или <a href=\"/register.php\" rel=\"nofollow\">зарегистрируйся</a>."[/script]

0