diff --git a/src/broker_messages/pind.rs b/src/broker_messages/pind.rs index 7f035c8..ed94408 100644 --- a/src/broker_messages/pind.rs +++ b/src/broker_messages/pind.rs @@ -42,14 +42,14 @@ pub struct SendText { pub text: String, pub reply: Option, } -/// Request to send image t + +/// Request to send image #[derive(Clone, Message)] #[rtype(result = "()")] pub struct SendImage { pub kaksh_kunjika: String, pub kunjika: String, - pub part: String, - pub image_id: i32 + pub src: String } // Request to send text t diff --git a/src/broker_messages/sansad.rs b/src/broker_messages/sansad.rs index 525ac13..2a00047 100644 --- a/src/broker_messages/sansad.rs +++ b/src/broker_messages/sansad.rs @@ -18,13 +18,14 @@ pub struct WsText { pub sender_kunjika: String, pub msg_id: u128 } + // Request to send transfer text #[derive(Clone, Message)] #[rtype(result = "()")] pub struct WsImage { - pub text: String, - pub reply: Option, - pub sender_kunjika: String + pub src: String, + pub sender_kunjika: String, + pub msg_id: u128 } // Request to send transfer text diff --git a/src/chat_pinnd/message.rs b/src/chat_pinnd/message.rs index 0a913f4..a5432bc 100644 --- a/src/chat_pinnd/message.rs +++ b/src/chat_pinnd/message.rs @@ -21,6 +21,25 @@ impl Handler for ChatPinnd { } } +/// send image to everyone +impl Handler for ChatPinnd { + type Result = (); + + fn handle(&mut self, msg: ms::pind::SendImage, _: &mut Self::Context) -> Self::Result { + if let Some(kaksh) = self.kaksh.get_mut(&msg.kaksh_kunjika) { + kaksh.last_message_id += 1; + let msg_id = kaksh.last_message_id; + kaksh.loog.iter().for_each(|c| { + c.addr.do_send(ms::sansad::WsImage { + sender_kunjika: msg.kunjika.to_owned(), + src: msg.src.to_owned(), + msg_id + }); + }); + } + } +} + /// send status to everyone impl Handler for ChatPinnd { type Result = (); diff --git a/src/chat_pinnd/mod.rs b/src/chat_pinnd/mod.rs index fcf3e2a..e25a099 100644 --- a/src/chat_pinnd/mod.rs +++ b/src/chat_pinnd/mod.rs @@ -47,6 +47,7 @@ impl Actor for ChatPinnd { fn started(&mut self, ctx: &mut Self::Context) { // for actix broker self.subscribe_system_async::(ctx); + self.subscribe_system_async::(ctx); self.subscribe_system_async::(ctx); self.subscribe_system_async::(ctx); } diff --git a/src/ws_sansad/handlers.rs b/src/ws_sansad/handlers.rs index c0a9cae..c03e74b 100644 --- a/src/ws_sansad/handlers.rs +++ b/src/ws_sansad/handlers.rs @@ -16,6 +16,20 @@ impl Handler for WsSansad { } } +/// send text message +impl Handler for WsSansad { + type Result = (); + fn handle(&mut self, msg: ms::sansad::WsImage, ctx: &mut Self::Context) -> Self::Result { + let json = json!({ + "cmd": "img", + "src": msg.src, + "kunjika": msg.sender_kunjika, // Sender's kunjuka + "msg_id": msg.msg_id.to_string() + }); + ctx.text(json.to_string()); + } +} + /// send text status impl Handler for WsSansad { diff --git a/src/ws_sansad/messages.rs b/src/ws_sansad/messages.rs index cd8101a..da270c0 100644 --- a/src/ws_sansad/messages.rs +++ b/src/ws_sansad/messages.rs @@ -86,4 +86,44 @@ impl WsSansad { status }); } + + /// send text to vayakti in kaksh + pub async fn send_image(&mut self, val: Value) { + // check if vayakti exist + if let Isthiti::None = self.isthiti { + self.send_err_response("Not in any Kaksh"); + return; + } + + // check if connected to any kaksh + match self.isthiti { + Isthiti::Kaksh(_) => (), + _ => { + self.send_err_response("Kaksh not connected"); + return; + } + } + + // image src + let src = match val.get("src") { + Some(val) => val, + None => { + self.send_err_response("Invalid request"); + return; + } + }.as_str().unwrap().to_owned(); + + let kaksh_kunjika = match &self.isthiti { + Isthiti::Kaksh(kaksh_kunjika) => { + kaksh_kunjika.to_owned() + }, _ => { + return; + } + }; + Broker::::issue_async(ms::pind::SendImage { + kaksh_kunjika, + kunjika: self.kunjika.to_owned(), + src + }); + } } \ No newline at end of file diff --git a/src/ws_sansad/mod.rs b/src/ws_sansad/mod.rs index 66c0c6e..13ee233 100644 --- a/src/ws_sansad/mod.rs +++ b/src/ws_sansad/mod.rs @@ -101,20 +101,12 @@ impl WsSansad { /// parse the request text from client async fn parse_text_handle(&mut self, msg: String) { if let Ok(val) = serde_json::from_str::(&msg) { - // let cmd = match val.get("cmd") { - // Some(v) => v, - // None => return - // }; - // let cmd = match cmd.as_str() { - // Some(v) => v, - // None => return - // }; - match val.get("cmd").unwrap().as_str().unwrap() { "join" => { self.join_kaksh(val).await }, "rand" => { self.join_random(val).await }, "randnext" => { self.join_random_next().await }, "text" => { self.send_text(val).await }, + "img" => { self.send_image(val).await }, "status" => { self.send_status(val).await }, "list" => { self.list().await }, "leave" => { self.leave_kaksh().await }, diff --git a/static/index.html b/static/index.html index 08e4ea3..8b6d520 100644 --- a/static/index.html +++ b/static/index.html @@ -163,10 +163,11 @@ + + diff --git a/static/js/app.js b/static/js/app.js index 65c04cb..2edb6bd 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -76,6 +76,9 @@ socket.addEventListener('message', function (event) { case 'text': Messages.pushMessage(j.kunjika, j.text, j.reply, j.msg_id); break; + case 'img': + Messages.pushImage(j.kunjika, j.src, j.msg_id); + break; case 'connected': vayakti[j.kunjika] = j.name; if(!$('#vayakti_model').hasClass('.is-hidden')) refreshVayaktiList(); @@ -215,31 +218,4 @@ function autosize(el){ $('#reply_clip').css('bottom', (el.scrollHeight + 10) + 'px'); $('#selected_clip').css('bottom', (el.scrollHeight + 10) + 'px'); },0); -} - -// Camera -var video = $('#videoElement')[0]; -if (navigator.mediaDevices.getUserMedia) { -navigator.mediaDevices.getUserMedia({ video: true, width: {max: 100} }) - .then(function (stream) { - video.srcObject = stream; - }) - .catch(function (error) { - console.log('Something went wrong!'); - }); -} - -var resultb64=''; -function capture() { - var canvas = $('')[0]; - var video = $('#videoElement')[0]; - canvas.width = 200; - canvas.height = 200; - canvas.getContext('2d').drawImage(video, 0, 0, 120,120); - resultb64=canvas.toDataURL(); - socket.send(JSON.stringify({ - cmd: 'text', - text: resultb64, - reply: '' - })); -} +} \ No newline at end of file diff --git a/static/js/camera.js b/static/js/camera.js new file mode 100644 index 0000000..5793982 --- /dev/null +++ b/static/js/camera.js @@ -0,0 +1,38 @@ +var Camera = class { + static setupCamera() { + $('#file-input')[0].addEventListener('change', (e) => { + const file = e.target.files[0]; + if (!file) { + return; + } + this.compressImage(file, 0.1, 'image/webp'); + }); + } + + static compressImage(file, qual, mime) { + new Compressor(file, { + quality: qual, + width: 320, + mimeType: mime, + success(result) { + var reader = new FileReader(); + reader.readAsDataURL(result); + reader.onloadend = function() { + var base64data = reader.result; + if(base64data.length > 63000 && mime != 'image/jpeg') { + base64data = null; + result = null; + Camera.compressImage(file, 0.7, 'image/jpeg'); + return; + } + + socket.send(JSON.stringify({ + cmd: "img", + src: base64data + })); + $('#action_clip').addClass('is-hidden'); + } + }, + }); + } +} \ No newline at end of file diff --git a/static/js/compressor.min.js b/static/js/compressor.min.js new file mode 100644 index 0000000..2dfb18a --- /dev/null +++ b/static/js/compressor.min.js @@ -0,0 +1,10 @@ +/*! + * Compressor.js v1.0.7 + * https://fengyuanchen.github.io/compressorjs + * + * Copyright 2018-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2020-11-28T07:13:17.754Z + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Compressor=t()}(this,function(){"use strict";function n(e,t){for(var r=0;rf.convertSize&&"image/png"===f.mimeType&&(v="#fff",f.mimeType="image/jpeg"),m.fillStyle=v,m.fillRect(0,0,o,e),f.beforeDraw&&f.beforeDraw.call(this,m,d),this.aborted||(m.save(),m.translate(o/2,e/2),m.rotate(i*Math.PI/180),m.scale(l,c),m.drawImage(h,w,g,n,y),m.restore(),f.drew&&f.drew.call(this,m,d),this.aborted||(m=function(e){t.aborted||t.done({naturalWidth:r,naturalHeight:a,result:e})},d.toBlob?d.toBlob(m,f.mimeType,f.quality):m(U(d.toDataURL(f.mimeType,f.quality)))))}},{key:"done",value:function(e){var t=e.naturalWidth,r=e.naturalHeight,a=e.result,n=this.file,i=this.image,e=this.options;g&&!e.checkOrientation&&g.revokeObjectURL(i.src),!a||e.strict&&a.size>n.size&&e.mimeType===n.type&&!(e.width>t||e.height>r||e.minWidth>t||e.minHeight>r)?a=n:(r=new Date,a.lastModified=r.getTime(),a.lastModifiedDate=r,a.name=n.name,a.name&&a.type!==n.type&&(a.name=a.name.replace(y,("jpeg"===(n=B(n=a.type)?n.substr(6):"")&&(n="jpg"),".".concat(n))))),this.result=a,e.success&&e.success.call(this,a)}},{key:"fail",value:function(e){var t=this.options;if(!t.error)throw e;t.error.call(this,e)}},{key:"abort",value:function(){this.aborted||(this.aborted=!0,this.reader?this.reader.abort():this.image.complete?this.fail(new Error("The compression process has been aborted.")):(this.image.onload=null,this.image.onabort()))}}])&&n(e.prototype,t),a&&n(e,a),r}()}); \ No newline at end of file diff --git a/static/js/message.js b/static/js/message.js index d8073f2..957eb0d 100644 --- a/static/js/message.js +++ b/static/js/message.js @@ -88,6 +88,26 @@ let Messages = class { scroll.scrollTop(scroll[0].scrollHeight); } + static pushImage(sender, src, msg_id) { + var isMe = myinfo.kunjika == sender; + var area = $('#message_area'); + var elm = $('
', {class: 'message '+(isMe?'message-me':'message-other'), msgid: msg_id}); + if(!no_name_message) { + if(sender == myinfo.kunjika) + elm.append($('
', {class: 'message-by'}).append('me')) + else + elm.append($('
', {class: 'message-by'}).append(vayakti[sender]+'('+sender.substr(0, 8)+')')) + } + elm.append($('', {src: src})); + elm.click(function() { + Messages.pick(this); + }); + area.append(elm); + + var scroll = $("#message_area_scroll"); + scroll.scrollTop(scroll[0].scrollHeight); + } + // in message area static pushStatus(text) { var area = $('#message_area'); diff --git a/static/js/onload.js b/static/js/onload.js index 705e986..2a474c3 100644 --- a/static/js/onload.js +++ b/static/js/onload.js @@ -44,4 +44,6 @@ $(document).ready(() => { evt.preventDefault(); send(); }); + + Camera.setupCamera(); }); \ No newline at end of file