Bladeren bron

HW js13 done

Ivar 2 jaren geleden
bovenliggende
commit
a42eba2c34
6 gewijzigde bestanden met toevoegingen van 323 en 29 verwijderingen
  1. 75 0
      js/13/chat_back/server.js
  2. 20 6
      js/13/chat_http/index.html
  3. 180 23
      js/13/chat_http/index.js
  4. 48 0
      js/13/chat_http/style.css
  5. 0 0
      js/14/gq req/app.js
  6. 0 0
      js/14/gq req/index.html

+ 75 - 0
js/13/chat_back/server.js

@@ -0,0 +1,75 @@
+http = require('http');
+
+var history = [];
+
+var errorMessages = {
+   "0": "All fine",
+   "-1": "No space left in DB",
+   "-2": "Wrong data",
+   "-3": "Apocalypse",
+   "-4": "REALLY Wrong data",
+};
+
+var RPCFuncs = {
+    getMessages: function(data){
+        var messageId = +data.messageId;
+        return history.slice(messageId);
+    },
+    addMessage:  function(data){
+        history.push(data);
+    }
+};
+
+server = http.createServer(function(req, res){
+    if (req.method == "POST"){
+        var body = '';
+        req.on('data', function (data) {
+                body += data;
+        });
+        req.on('end', function () {
+                console.log("Body: " + body);
+                try{
+                    var data = JSON.parse(body);
+                }
+                catch (e){
+                    console.log("wrong JSON");
+                    var errorCode = -4;
+                    res.end(JSON.stringify({errorCode: errorCode, errorMessage: errorMessages[errorCode]}));
+                    return;
+                }
+                var timestamp =(new Date()).getTime(); 
+                //var errorCode = 0 - Math.floor(Math.random()*4)
+                //res.end(JSON.stringify({errorCode: errorCode, errorMessage: errorMessages[errorCode]}));
+                if ("func" in data){
+                    if (data.func in RPCFuncs){
+                        var func = data.func;
+                        delete data.func;
+                        data.timestamp = timestamp;
+                        var result = {data: RPCFuncs[func](data), nextMessageId: history.length};
+                        console.log("answer on request:");
+                        console.log(JSON.stringify(result));
+                        res.end(JSON.stringify(result));
+                    }
+                    else {
+                        console.log("no func in functions array" + body);
+                    }
+                }
+                else {
+                    console.log("no func key in data:" + body);
+                }
+        });
+
+        res.setHeader('Access-Control-Allow-Origin', '*');
+        res.setHeader('Access-Control-Request-Method', '*');
+        res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET, POST');
+        res.setHeader('Access-Control-Allow-Headers', '*');
+        res.writeHead(200, {'Content-Type': 'text/json'});
+        //res.end('post received');
+    }
+});
+
+port = 8070;
+host = '164.138.30.21';
+server.listen(port, host);
+console.log("Listen...");
+

+ 20 - 6
js/13/chat_http/index.html

@@ -5,14 +5,28 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
+   <link rel="stylesheet" href="./style.css">
 </head>
 <body>
-   <div id="formContainer">
-      <input type="text" id="user"/>
-      <input type="text" id="msg"/>
-      <button id="btn"></button>
-      <div id="area"></div>
+   <div class="form_container" id="formContainer">
+
+      <div class="output_block username">
+         <label for="user">Ник</label>
+         <input type="text" id="user"/>
+      </div>
+
+      <div class="output_block message">
+         <label for="msg">Сообщение</label>
+         <textarea type="text" id="msg"></textarea>
+      </div>
+
+      <div class="output_block button">
+         <button id="btn">Отправить</button>
+      </div>
+
+      <div class="input_area" id="area"></div>
    </div>
    <script src="./index.js"></script>
 </body>
-</html>
+</html>
+

+ 180 - 23
js/13/chat_http/index.js

@@ -1,38 +1,195 @@
 
+// chatV1()
+function chatV1() {
 
-async function jsonPost(url, data)
-{
-    return new Promise((resolve, reject) => {
-        var x = new XMLHttpRequest();   
-        x.onerror = () => reject(new Error('jsonPost failed'))
-        //x.setRequestHeader('Content-Type', 'application/json');
-        x.open("POST", url, true);
-        x.send(JSON.stringify(data))
-
-        x.onreadystatechange = () => {
-            if (x.readyState == XMLHttpRequest.DONE && x.status == 200){
-                resolve(JSON.parse(x.responseText))
-            }
-            else if (x.status != 200){
-                reject(new Error('status is not 200'))
+    async function jsonPost(url, data) {
+        return new Promise((resolve, reject) => {
+            let x = new XMLHttpRequest() 
+            x.onerror = () => reject(new Error('jsonPost failed'))
+            x.open("POST", url, true)
+            // x.setRequestHeader('Content-Type', 'application/json')
+            x.send(JSON.stringify(data))
+    
+            x.onreadystatechange = () => {
+                if (x.readyState == XMLHttpRequest.DONE && x.status == 200){
+                    resolve(JSON.parse(x.responseText))
+                }
+                else if (x.status != 200){
+                    reject(new Error('status is not 200'))
+                }
             }
+        })
+    }
+    // jsonPost("http://students.a-level.com.ua:10012", {func: 'addMessage', nick: "ууу", message: 'УУУУУУУ'})
+    
+    function sendMessage(nick, message) {
+        let data    = {func: "addMessage", nick: nick, message: message, author: 'chat'}
+        jsonPost("http://students.a-level.com.ua:10012", data).then(res => console.log(res))
+    }
+
+    function cleanUp(text) {
+        if (typeof text !== 'string')
+            return text
+        if (text.match(/<script/i)){
+            let el = document.createElement('div')
+            el.innerText = text
+            return `<h1>НАС ЛОМАЮТ!!</h1><pre>${el.innerHTML}</pre>`
         }
+        return text
+    }
+    
+    let nextMessageId = 0
+    function getMessages() {
+        let data    = {func: "getMessages", messageId: nextMessageId, author: 'chat'}
+        jsonPost("http://students.a-level.com.ua:10012", data).then(result => {
+            // console.log(result.data)
+            for (const msg of result.data) {
+                const msgDiv = document.createElement('div')
+                msgDiv.innerHTML = `<b>${cleanUp(msg.nick)}</b>:${cleanUp(msg.message)}`    
+                area.prepend(msgDiv)
+            }
+            nextMessageId = result.nextMessageId  
+            // console.log(nextMessageId)
+        })  
+    }
+    getMessages()
+    
+    btn.addEventListener("click", () => {
+        sendMessage(user.value, msg.value)
+        getMessages()
     })
+    
+    setInterval(getMessages, 2000)
 }
-jsonPost("http://students.a-level.com.ua:10012", {func: 'addMessage', nick: "ууу", message: 'УУУУУУУ'})
-
 
 
 
+chatV2()
+function chatV2() {
 
+    async function jsonPost(url, data) {    
+        try {
+            let response = await fetch(url, {
+                method: 'POST',
+                // headers: {
+                // 'Content-Type': 'application/json'
+                // },
+                body: JSON.stringify(data)
+            })           
+            if (response.status === 200) {
+                return await response.json()
+            } else if (response.status != 200) {
+                return new Error('status is not 200')
+            }
+        } catch (err) {
+            return new Error('jsonPost failed')
+        }
+    }      
+    
+    async function sendMessage(nick, message) {
+        let data    = {func: "addMessage", nick: nick, message: message, author: 'chat'}
+        try {
+            let res = await jsonPost("http://students.a-level.com.ua:10012", data)
+            console.log(res)
+        } catch (err) {
+            console.log(err)        
+        }
+    }
+        
+    function cleanUp(text) {
+        if (typeof text !== 'string') {
+            return text
+        }
+        if (text.match(/<script/i)){
+            let el = document.createElement('div')
+            el.innerText = text
+            return `<h1>НАС ЛОМАЮТ!!</h1><pre>${el.innerHTML}</pre>`
+        }
+        return text
+    }
 
+    function decorateLinks(text) {
+        const linkRegEx = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/
+        const youtubeRegEx = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/
 
-htmlTree()
-function htmlTree() {
+        let matchLink = text.match(linkRegEx)
+        let matchYoutube = text.match(youtubeRegEx)
+        console.log(matchLink)
+        if (matchLink) {
+            let [link] = matchLink
+            if (link) {
+                let newLink = `<a href="${link}" style="color:blue">${link}</a>`
+                let newText = null
+                newText = text.replace(link, newLink)
+                if (matchYoutube) {
+                    let [, youtubeKey] = matchYoutube
+        
+                    if (youtubeKey) {
+                        return `${newText} <br/> <iframe width="560" height="315" 
+                        src="https://www.youtube.com/embed/${youtubeKey}" title="YouTube video player" 
+                        frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; 
+                        picture-in-picture" allowfullscreen></iframe>`
+                    } 
+                } else {
+                    return newText
+                }
+            }
 
-}
+        } else {
+            return text
+        }
+    }
+    
+    let nextMessageId = 0
+    async function getMessages() {
+        let data    = {func: "getMessages", messageId: nextMessageId, author: 'chat'}
+        try {
+            let result = await jsonPost("http://students.a-level.com.ua:10012", data)
+            for (const msg of result.data) {
+                const msgDiv = document.createElement('div')
+                msgDiv.className = 'input_message'
+                msgDiv.innerHTML = `<div class="message_content"><b>${cleanUp(msg.nick)}</b>:<br/>  ${decorateLinks(cleanUp(msg.message))}</div>`  
+                const timeDiv = document.createElement('div')
+                timeDiv.className = 'message_time'
+                let msgDate = new Date(msg.timestamp)
+                function addZero(str) {
+                    let string = String(str)
+                    if (string.length === 1) {
+                        let newStr = '0' + string
+                        return newStr
+                    } else {
+                        return string
+                    }
+                }
+                timeDiv.innerText = `${addZero(msgDate.getHours())}:${addZero(msgDate.getMinutes())}  ${addZero(msgDate.getDate())}.${addZero(msgDate.getMonth())}`
+                msgDiv.append(timeDiv)
+                area.prepend(msgDiv)
+            }
+            nextMessageId = result.nextMessageId  
+        } catch (err) {
+            console.log(err)        
+        }
+    }
 
-htmlTree()
-function htmlTree() {
+    async function sendAndCheck() {
+        await Promise.all([
+            sendMessage(user.value, msg.value),
+            getMessages()
+        ])
+    }    
+    
+    btn.addEventListener("click", () => {
+        sendAndCheck()
+    })
+    getMessages()
 
-}
+    async function checkLoop() {
+        let delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
+        let inf = true
+        while (inf) {
+            await delay(2000)
+            getMessages()
+        }
+    }
+    checkLoop()
+}

+ 48 - 0
js/13/chat_http/style.css

@@ -0,0 +1,48 @@
+.form_container {
+   margin: 1rem;
+}
+
+.output_block {
+   margin: 0.5rem 0;
+} 
+
+.output_block label {
+   display: block;
+   font-size: 1.3rem;
+}
+
+.output_block input {
+   height: 2rem;
+   width: 50rem;
+   font-size: 1.2rem;
+}
+
+.output_block textarea {
+   height: 6rem;
+   width: 50rem;
+   font-size: 1.2rem;
+}
+
+.output_block button {
+   height: 3rem;
+   width: 20rem;
+   font-size: 1.3rem;
+}
+
+.input_area .input_message {
+   margin: 1rem 0;
+}
+
+.input_area .input_message {
+   padding: 0.5rem 0;
+}
+
+.input_area .input_message .message_content {
+   font-size: 1.2rem;
+   margin-bottom: 0.5rem;
+}
+
+.input_area .input_message .message_time {
+   font-size: 0.9rem;
+   color: #555555;
+}

js/14/gq /app.js → js/14/gq req/app.js


js/14/gq /index.html → js/14/gq req/index.html