index.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // 1 stage
  2. let messageIdSave = 0;
  3. let errorText = document.createElement("span");
  4. errorText.style.color = "red";
  5. async function sendMessage(nickName, message) {
  6. await jsonPost("http://students.a-level.com.ua:10012", {
  7. func: "addMessage",
  8. nick: nickName,
  9. message: message,
  10. });
  11. }
  12. sendBtn.onclick = () => {
  13. if (nickname.value.length < 3) {
  14. errorText.innerText = "Nickname must be at least 3 characters";
  15. errorBox.append(errorText);
  16. } else if (message.value.length < 1) {
  17. errorText.innerText = "Message must be at least 1 character";
  18. errorBox.append(errorText);
  19. } else {
  20. errorText.innerText = "";
  21. sendAndCheck(nickname.value, message.value, messageIdSave);
  22. }
  23. };
  24. // 2, 3 stages
  25. async function getMessages(nextMessageId) {
  26. let youtubeRE =
  27. /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/;
  28. let imageRE = /\.(gif|jpg|jpeg|tiff|png)$/i;
  29. let object = await jsonPost("http://students.a-level.com.ua:10012", {
  30. func: "getMessages",
  31. messageId: nextMessageId,
  32. });
  33. object.data.map((t) => {
  34. let container = document.createElement("div");
  35. container.classList.add("container");
  36. let nickname = document.createElement("span");
  37. nickname.classList.add("nickname");
  38. let message = document.createElement("p");
  39. message.classList.add("message");
  40. nickname.innerText = `${new Date().toLocaleString()} ${t.nick}:`;
  41. if (youtubeRE.test(t.message)) {
  42. message.innerHTML = `<iframe width="500vw" height="300px" src="https://www.youtube.com/embed/${
  43. t.message.match(youtubeRE)[1]
  44. }" title="YouTube video player"
  45. frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  46. allowfullscreen></iframe>`;
  47. } else if (imageRE.test(t.message)) {
  48. message.innerHTML = `<img src="${t.message}" alt="" width="250px">`;
  49. } else {
  50. message.innerText = t.message;
  51. }
  52. container.append(nickname);
  53. container.append(message);
  54. historyChat.prepend(container);
  55. });
  56. messageIdSave = object.nextMessageId;
  57. }
  58. // 4 stage
  59. // setInterval(async () => getMessages(messageIdSave), 4000);
  60. // 5 stage
  61. async function sendAndCheck(nickName, message, nextMessageId) {
  62. await Promise.all([
  63. sendMessage(nickName, message),
  64. getNewMessage(nextMessageId),
  65. ]);
  66. }
  67. async function checkLoop() {
  68. const delay = (ms) => new Promise((ok) => setTimeout(() => ok(ms), ms));
  69. while (true) {
  70. await delay(4000);
  71. getMessages(messageIdSave);
  72. }
  73. }
  74. checkLoop();
  75. // 6 stage
  76. async function jsonPost(url, data) {
  77. let response = await fetch(url, {
  78. method: "POST",
  79. body: JSON.stringify(data),
  80. });
  81. return await response.json();
  82. }