Lots of changes

This commit is contained in:
Piyush मिश्रः 2021-05-06 21:33:43 +05:30
parent 3088dec7b5
commit 900d45b540
21 changed files with 982 additions and 699 deletions

2
Cargo.lock generated
View File

@ -1074,7 +1074,7 @@ dependencies = [
[[package]]
name = "lupt"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"actix",
"actix-broker",

View File

@ -1,6 +1,6 @@
[package]
name = "lupt"
version = "0.1.0"
version = "0.2.0"
description = "Chat app for lupt(लुप्त) users!"
authors = ["Piyush Raj <piyush.raj.kit@gmail.com>"]
edition = "2018"

View File

@ -9,11 +9,11 @@ use crate::{ws_sansad, messages as ms};
#[allow(dead_code)]
pub struct ChatPinnd {
grih: HashMap<String, Grih>, // kunjika, Grih
kaksh: HashMap<String, Kaksh>, // kunjika, Kaksh
vyaktigat_waitlist: Vec<VyaktiWatchlist>,
}
pub struct Grih {
pub struct Kaksh {
length: Option<usize>,
loog: Vec<Loog>
}
@ -48,17 +48,17 @@ impl Actor for ChatPinnd {
}
}
/// Join grih
impl Handler<ms::JoinGrih> for ChatPinnd {
/// Join kaksh
impl Handler<ms::JoinKaksh> for ChatPinnd {
type Result = ms::Resp;
fn handle(&mut self, msg: ms::JoinGrih, _: &mut Self::Context) -> Self::Result {
fn handle(&mut self, msg: ms::JoinKaksh, _: &mut Self::Context) -> Self::Result {
// check if user exist
if let Some(_) = self.vyaktigat_waitlist.iter().position(|vk| vk.kunjika == msg.kunjika) {
return ms::Resp::Err("Kunjika already exist".to_owned());
}
if let Some(_) = self.grih.iter().position(|(_,g)| {
if let Some(_) = self.kaksh.iter().position(|(_,g)| {
match g.loog.iter().position(|a| a.kunjika == msg.kunjika) {
Some(_) => true,
None => false
@ -67,33 +67,33 @@ impl Handler<ms::JoinGrih> for ChatPinnd {
return ms::Resp::Err("Kunjika already exist".to_owned());
}
// check if grih exist and add user
match self.grih.get_mut(&msg.grih_kunjika) {
Some(grih) =>{ // exist
// check if grih have no space left
if let Some(n) = grih.length {
if grih.loog.len() >= n {
return ms::Resp::Err("Grih have no space".to_owned());
// check if kaksh exist and add user
match self.kaksh.get_mut(&msg.kaksh_kunjika) {
Some(kaksh) =>{ // exist
// check if kaksh have no space left
if let Some(n) = kaksh.length {
if kaksh.loog.len() >= n {
return ms::Resp::Err("Kaksh have no space".to_owned());
}
}
grih.loog.iter().for_each(|a: &Loog| {
kaksh.loog.iter().for_each(|a: &Loog| {
a.addr.do_send(ms::WsConnected {
name: msg.name.to_owned(),
kunjika: msg.kunjika.to_owned()
})
});
grih.loog.push(Loog::new(msg.addr, msg.kunjika,msg.name, None));
kaksh.loog.push(Loog::new(msg.addr, msg.kunjika,msg.name, None));
}, None => { // don't exist
// add grih and notify
// add kaksh and notify
msg.addr.do_send(ms::WsConnected {
name: msg.name.to_owned(),
kunjika: msg.kunjika.to_owned()
});
self.grih.insert(msg.grih_kunjika, Grih {
self.kaksh.insert(msg.kaksh_kunjika, Kaksh {
length: msg.length,
loog: vec![Loog::new(msg.addr,msg.kunjika,msg.name, None)]
});
@ -116,7 +116,7 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
return ms::Resp::Err("Kunjika already exist".to_owned());
}
if let Some(_) = self.grih.iter().position(|(_,g)| {
if let Some(_) = self.kaksh.iter().position(|(_,g)| {
match g.loog.iter().position(|a| a.kunjika == msg.kunjika) {
Some(_) => true,
None => false
@ -159,7 +159,7 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
let vayakti_watchlist = self.vyaktigat_waitlist.remove(pos);
let group_kunjika = format!("gupt_{}>{}",msg.kunjika.to_owned(), vayakti_watchlist.kunjika);
self.grih.insert(group_kunjika.to_owned(), Grih {
self.kaksh.insert(group_kunjika.to_owned(), Kaksh {
length: Some(2),
loog: vec![Loog::new(msg.addr.clone(), msg.kunjika.to_owned(), msg.name.to_owned(), Some(msg.tags.clone())),
Loog::new(vayakti_watchlist.addr.clone(), vayakti_watchlist.kunjika.to_owned(), vayakti_watchlist.name.to_owned(), Some(vayakti_watchlist.tags.clone()))]
@ -169,12 +169,12 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
msg.addr.do_send(ms::WsConnectedRandom {
name: vayakti_watchlist.name,
kunjika: vayakti_watchlist.kunjika,
grih_kunjika: group_kunjika.to_owned()
kaksh_kunjika: group_kunjika.to_owned()
});
vayakti_watchlist.addr.do_send(ms::WsConnectedRandom {
name: msg.name,
kunjika: msg.kunjika.to_owned(),
grih_kunjika: group_kunjika
kaksh_kunjika: group_kunjika
});
ms::Resp::Ok
@ -185,16 +185,25 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
impl Handler<ms::JoinRandomNext> for ChatPinnd {
type Result = ms::Resp;
fn handle(&mut self, msg: ms::JoinRandomNext, _: &mut Self::Context) -> Self::Result {
let grih = self.grih.get_mut(&msg.grih_kunjika).unwrap();
let kaksh = match self.kaksh.get_mut(&msg.kaksh_kunjika) {
Some(v) => v,
None => return ms::Resp::Err("Failed to join, check entries!".to_owned())
};
let loog_i = grih.loog.iter().position(|a| a.kunjika == msg.kunjika).unwrap();
let loog_i = match kaksh.loog.iter().position(|a| a.kunjika == msg.kunjika) {
Some(v) => v,
None => return ms::Resp::Err("Failed to join, check entries!".to_owned())
};
let addr;
let name;
let tags;
{
let loog = grih.loog.get(loog_i).unwrap();
let loog = match kaksh.loog.get(loog_i) {
Some(v) => v,
None => return ms::Resp::Err("Failed to join, check entries!".to_owned())
};
if let None = loog.tags {
return ms::Resp::Err("You are not a randome vyakti!".to_owned());
@ -202,12 +211,15 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
addr = loog.addr.clone();
name = loog.name.to_owned();
tags = loog.tags.clone().unwrap();
tags = match loog.tags.clone() {
Some(v) => v,
None => return ms::Resp::Err("Failed to join, check entries!".to_owned())
};
}
// remove from old grih
grih.loog.remove(loog_i);
grih.loog.iter().for_each(|a| {
// remove from old kaksh
kaksh.loog.remove(loog_i);
kaksh.loog.iter().for_each(|a| {
a.addr.do_send(ms::WsDisconnected {
kunjika: msg.kunjika.to_owned(),
name: name.to_owned()
@ -247,12 +259,12 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
let vayakti_watchlist = self.vyaktigat_waitlist.remove(pos);
let group_kunjika = format!("gupt_{}>{}",msg.kunjika.to_owned(), vayakti_watchlist.kunjika);
let log_count = grih.loog.len();
drop(grih);
let log_count = kaksh.loog.len();
drop(kaksh);
if log_count == 0 {
self.grih.remove(&msg.grih_kunjika);
self.kaksh.remove(&msg.kaksh_kunjika);
}
self.grih.insert(group_kunjika.to_owned(), Grih {
self.kaksh.insert(group_kunjika.to_owned(), Kaksh {
length: Some(2),
loog: vec![Loog::new(addr.clone(), msg.kunjika.to_owned(), name.to_owned(), Some(tags.clone())),
Loog::new(vayakti_watchlist.addr.clone(), vayakti_watchlist.kunjika.to_owned(), vayakti_watchlist.name.to_owned(), Some(vayakti_watchlist.tags.clone()))]
@ -261,13 +273,13 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
addr.do_send(ms::WsConnectedRandom {
name: vayakti_watchlist.name,
kunjika: vayakti_watchlist.kunjika,
grih_kunjika: group_kunjika.to_owned()
kaksh_kunjika: group_kunjika.to_owned()
});
vayakti_watchlist.addr.do_send(ms::WsConnectedRandom {
name,
kunjika: msg.kunjika.to_owned(),
grih_kunjika: group_kunjika
kaksh_kunjika: group_kunjika
});
ms::Resp::Ok
@ -279,8 +291,8 @@ impl Handler<ms::SendText> for ChatPinnd {
type Result = ();
fn handle(&mut self, msg: ms::SendText, _: &mut Self::Context) -> Self::Result {
if let Some(grih) = self.grih.get(&msg.grih_kunjika) {
grih.loog.iter().for_each(|c| {
if let Some(kaksh) = self.kaksh.get(&msg.kaksh_kunjika) {
kaksh.loog.iter().for_each(|c| {
c.addr.do_send(ms::WsText {
sender_kunjika: msg.kunjika.to_owned(),
text: msg.text.to_owned(),
@ -296,8 +308,8 @@ impl Handler<ms::SendStatus> for ChatPinnd {
type Result = ();
fn handle(&mut self, msg: ms::SendStatus, _: &mut Self::Context) -> Self::Result {
if let Some(grih) = self.grih.get(&msg.grih_kunjika) {
grih.loog.iter().for_each(|c| {
if let Some(kaksh) = self.kaksh.get(&msg.kaksh_kunjika) {
kaksh.loog.iter().for_each(|c| {
if c.kunjika == msg.kunjika {
return;
}
@ -315,9 +327,9 @@ impl Handler<ms::List> for ChatPinnd {
type Result = String;
fn handle(&mut self, msg: ms::List, _: &mut Self::Context) -> Self::Result {
if let Some(grih) = self.grih.get(&msg.grih_kunjika) {
if let Some(kaksh) = self.kaksh.get(&msg.kaksh_kunjika) {
let mut list = Vec::new();
for x in grih.loog.iter() {
for x in kaksh.loog.iter() {
list.push((x.kunjika.to_owned(),x.name.to_owned()));
}
serde_json::json!(list).to_string()
@ -327,21 +339,21 @@ impl Handler<ms::List> for ChatPinnd {
}
}
/// Notifiy a user disconnected and trim grih
/// Notifiy a user disconnected and trim kaksh
impl Handler<ms::LeaveUser> for ChatPinnd {
type Result = ();
fn handle(&mut self, msg: ms::LeaveUser, _: &mut Self::Context) -> Self::Result {
if let Some(grih_kunjika) = &msg.grih_kunjika {
if let Some(grih) = self.grih.get_mut(grih_kunjika) {
let name = if let Some(i) = grih.loog.iter().position(|x| x.addr == msg.addr) {
grih.loog.remove(i).name
if let Some(kaksh_kunjika) = &msg.kaksh_kunjika {
if let Some(kaksh) = self.kaksh.get_mut(kaksh_kunjika) {
let name = if let Some(i) = kaksh.loog.iter().position(|x| x.addr == msg.addr) {
kaksh.loog.remove(i).name
} else { "".to_owned() };
if grih.loog.len() == 0 {
self.grih.remove(grih_kunjika);
if kaksh.loog.len() == 0 {
self.kaksh.remove(kaksh_kunjika);
} else {
grih.loog.iter().for_each(|a| {
kaksh.loog.iter().for_each(|a| {
a.addr.do_send(ms::WsDisconnected {
kunjika: msg.kunjika.to_owned(),
name: name.to_owned()
@ -360,7 +372,7 @@ impl Handler<ms::LeaveUser> for ChatPinnd {
impl Default for ChatPinnd {
fn default() -> Self {
ChatPinnd {
grih: HashMap::new(),
kaksh: HashMap::new(),
vyaktigat_waitlist: Vec::new()
}
}

View File

@ -1,8 +1,8 @@
use std::fmt;
#[derive(Debug, Clone)]
pub struct GrihFullError;
pub struct KakshFullError;
impl fmt::Display for GrihFullError {
impl fmt::Display for KakshFullError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "No space left for more user!")
}

View File

@ -1,5 +1,5 @@
mod grih_full_error;
mod kaksh_full_error;
mod user_kunjika_error;
pub use grih_full_error::GrihFullError;
pub use kaksh_full_error::KakshFullError;
pub use user_kunjika_error::AlreadyExistError;

View File

@ -7,11 +7,11 @@ use crate::ws_sansad::WsSansad;
//################################################## For ChatPinnd ##################################################
/// Request to change information of vayakti to list of vayakti im ChatPind
/// Request to Grih with its kunjika
/// Request to Kaksh with its kunjika
#[derive(Clone, Message)]
#[rtype(result = "Resp")]
pub struct JoinGrih {
pub grih_kunjika: String,
pub struct JoinKaksh {
pub kaksh_kunjika: String,
pub length: Option<usize>,
pub addr: Addr<WsSansad>,
pub kunjika: String,
@ -31,7 +31,7 @@ pub struct JoinRandom {
#[derive(Clone, Message)]
#[rtype(result = "Resp")]
pub struct JoinRandomNext {
pub grih_kunjika: String,
pub kaksh_kunjika: String,
pub kunjika: String
}
@ -39,7 +39,7 @@ pub struct JoinRandomNext {
#[derive(Clone, Message)]
#[rtype(result = "()")]
pub struct SendText {
pub grih_kunjika: String,
pub kaksh_kunjika: String,
pub kunjika: String,
pub text: String,
pub reply: Option<String>,
@ -49,7 +49,7 @@ pub struct SendText {
#[derive(Clone, Message)]
#[rtype(result = "()")]
pub struct SendStatus {
pub grih_kunjika: String,
pub kaksh_kunjika: String,
pub kunjika: String,
pub status: String
}
@ -58,14 +58,14 @@ pub struct SendStatus {
#[derive(Clone, Message)]
#[rtype(result = "String")]
pub struct List {
pub grih_kunjika: String
pub kaksh_kunjika: String
}
/// Request to leave grih
/// Request to leave kaksh
#[derive(Clone, Message)]
#[rtype(result = "()")]
pub struct LeaveUser {
pub grih_kunjika: Option<String>,
pub kaksh_kunjika: Option<String>,
pub kunjika: String,
pub addr: Addr<WsSansad>
}
@ -125,7 +125,7 @@ pub struct WsResponse {
pub struct WsConnectedRandom {
pub name: String,
pub kunjika: String,
pub grih_kunjika: String
pub kaksh_kunjika: String
}
//################################################## Helper ##################################################
#[derive(Debug)]

View File

@ -28,7 +28,7 @@ pub struct WsSansad {
#[derive(Debug)]
enum Isthiti {
None,
Grih(String),
Kaksh(String),
VraktigatWaitlist
}
@ -42,7 +42,7 @@ impl Actor for WsSansad {
}
fn stopping(&mut self, _: &mut Self::Context) -> Running {
futures::executor::block_on(self.leave_grih()); // notify leaving
futures::executor::block_on(self.leave_kaksh()); // notify leaving
Running::Stop
}
}
@ -151,7 +151,7 @@ impl Handler<ms::WsDisconnected> for WsSansad {
impl Handler<ms::WsConnectedRandom> for WsSansad {
type Result = ();
fn handle(&mut self, msg: ms::WsConnectedRandom, ctx: &mut Self::Context) -> Self::Result {
self.isthiti = Isthiti::Grih(msg.grih_kunjika);
self.isthiti = Isthiti::Kaksh(msg.kaksh_kunjika);
let json = json!({
"cmd": "random",
"name": msg.name,
@ -182,7 +182,7 @@ impl WsSansad {
// heartbeat timed out
// stop actor
futures::executor::block_on(act.leave_grih()); // notify leaving
futures::executor::block_on(act.leave_kaksh()); // notify leaving
ctx.stop();
// don't try to send a ping
return;
@ -202,7 +202,7 @@ impl WsSansad {
// heartbeat timed out
// stop actor
futures::executor::block_on(act.leave_grih()); // notify leaving
futures::executor::block_on(act.leave_kaksh()); // notify leaving
ctx.stop();
// don't try to send a ping
@ -214,14 +214,23 @@ 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::<Value>(&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_grih(val).await },
"join" => { self.join_kaksh(val).await },
"rand" => { self.join_random(val).await },
"randnext" => { self.join_random_next().await },
"text" => { self.send_text(val).await },
"status" => { self.send_status(val).await },
"list" => { self.list().await },
"leave" => { self.leave_grih().await },
"leave" => { self.leave_kaksh().await },
_ => ()
}
}
@ -250,7 +259,7 @@ impl WsSansad {
Isthiti::VraktigatWaitlist => {
self.send_ok_response("watchlist");
return;
}, Isthiti::Grih(_) => return
}, Isthiti::Kaksh(_) => return
}
let kunjika = match val.get("kunjika") {
@ -314,12 +323,12 @@ impl WsSansad {
/// Request for joining to random person
async fn join_random_next(&mut self) {
// Check is already joined
let grih_kunjika = match &self.isthiti {
let kaksh_kunjika = match &self.isthiti {
Isthiti::VraktigatWaitlist => {
self.send_ok_response("watchlist");
return;
},
Isthiti::Grih(grih_kunjika) => grih_kunjika,
Isthiti::Kaksh(kaksh_kunjika) => kaksh_kunjika,
Isthiti::None => {
self.send_ok_response("Not allowed");
return;
@ -329,7 +338,7 @@ impl WsSansad {
// request
let result: Resp = ChatPinnd::from_registry().send(ms::JoinRandomNext {
kunjika: self.kunjika.to_owned(),
grih_kunjika: grih_kunjika.to_owned(),
kaksh_kunjika: kaksh_kunjika.to_owned(),
}).await.unwrap();
match result {
@ -346,8 +355,8 @@ impl WsSansad {
}
}
/// Request to join to grih
async fn join_grih(&mut self, val: Value) {
/// Request to join to kaksh
async fn join_kaksh(&mut self, val: Value) {
// Check is already joined
match self.isthiti {
Isthiti::None => (),
@ -374,7 +383,7 @@ impl WsSansad {
return;
}
};
let grih_kunjika = match val.get("grih_kunjika") {
let kaksh_kunjika = match val.get("kaksh_kunjika") {
Some(val ) => val.as_str().unwrap().to_owned(),
None => {
self.send_err_response("Invalid request");
@ -391,7 +400,7 @@ impl WsSansad {
// Validate
if let Some(val ) = validate(vec![vl::NonEmpty, vl::NoGupt, vl::NoSpace], &grih_kunjika, "Grih Kunjika") {
if let Some(val ) = validate(vec![vl::NonEmpty, vl::NoGupt, vl::NoSpace], &kaksh_kunjika, "Kaksh Kunjika") {
self.send_err_response(&val);
return;
} else if let Some(val ) = validate(vec![vl::NonEmpty, vl::NoSpace, vl::NoHashtag], &kunjika, "Kunjika") {
@ -403,8 +412,8 @@ impl WsSansad {
}
// request
let result: Resp = ChatPinnd::from_registry().send(ms::JoinGrih {
grih_kunjika: grih_kunjika.to_owned(),
let result: Resp = ChatPinnd::from_registry().send(ms::JoinKaksh {
kaksh_kunjika: kaksh_kunjika.to_owned(),
length,
addr: self.addr.clone().unwrap(),
kunjika: kunjika.to_owned(),
@ -415,7 +424,7 @@ impl WsSansad {
match result {
Resp::Err(err) => self.send_err_response(&err),
Resp::Ok => {
self.isthiti = Isthiti::Grih(grih_kunjika);
self.isthiti = Isthiti::Kaksh(kaksh_kunjika);
self.kunjika = kunjika;
self.send_ok_response("joined")
}
@ -423,19 +432,19 @@ impl WsSansad {
}
}
/// Request to join to grih
/// Request to join to kaksh
async fn list(&mut self) {
// check if vayakti exist
if let Isthiti::None = self.isthiti {
self.send_err_response("Not in any Grih");
self.send_err_response("Not in any Kaksh");
return;
}
// check if connected to any grih
// check if connected to any kaksh
match &self.isthiti {
Isthiti::Grih(kunjika) => {
Isthiti::Kaksh(kunjika) => {
let json: String = ChatPinnd::from_registry().send(ms::List {
grih_kunjika: kunjika.to_owned()
kaksh_kunjika: kunjika.to_owned()
}).await.unwrap();
self.addr.clone().unwrap().do_send(ms::WsList {
@ -443,25 +452,25 @@ impl WsSansad {
})
},
_ => {
self.send_err_response("Grih not connected");
self.send_err_response("Kaksh not connected");
return;
}
}
}
/// send text to vayakti in grih
/// send text to vayakti in kaksh
async fn send_text(&mut self, val: Value) {
// check if vayakti exist
if let Isthiti::None = self.isthiti {
self.send_err_response("Not in any Grih");
self.send_err_response("Not in any Kaksh");
return;
}
// check if connected to any grih
// check if connected to any kaksh
match self.isthiti {
Isthiti::Grih(_) => (),
Isthiti::Kaksh(_) => (),
_ => {
self.send_err_response("Grih not connected");
self.send_err_response("Kaksh not connected");
return;
}
}
@ -480,34 +489,34 @@ impl WsSansad {
None => None
};
let grih_kunjika = match &self.isthiti {
Isthiti::Grih(grih_kunjika) => {
grih_kunjika.to_owned()
let kaksh_kunjika = match &self.isthiti {
Isthiti::Kaksh(kaksh_kunjika) => {
kaksh_kunjika.to_owned()
}, _ => {
return;
}
};
Broker::<SystemBroker>::issue_async(ms::SendText {
grih_kunjika,
kaksh_kunjika,
kunjika: self.kunjika.to_owned(),
text,
reply
});
}
/// send status to vayakti in grih
/// send status to vayakti in kaksh
async fn send_status(&mut self, val: Value) {
// check if vayakti exist
if let Isthiti::None = self.isthiti {
self.send_err_response("Not in any Grih");
self.send_err_response("Not in any Kaksh");
return;
}
// check if connected to any grih
// check if connected to any kaksh
match self.isthiti {
Isthiti::Grih(_) => (),
Isthiti::Kaksh(_) => (),
_ => {
self.send_err_response("Grih not connected");
self.send_err_response("Kaksh not connected");
return;
}
}
@ -520,34 +529,33 @@ impl WsSansad {
return;
}
}.as_str().unwrap().to_owned();
let grih_kunjika = match &self.isthiti {
Isthiti::Grih(grih_kunjika) => {
grih_kunjika.to_owned()
let kaksh_kunjika = match &self.isthiti {
Isthiti::Kaksh(kaksh_kunjika) => {
kaksh_kunjika.to_owned()
}, _ => {
return;
}
};
Broker::<SystemBroker>::issue_async(ms::SendStatus {
grih_kunjika,
kaksh_kunjika,
kunjika: self.kunjika.to_owned(),
status
});
}
/// notify leaving
async fn leave_grih(&mut self) {
let grih_kunjika = match &self.isthiti {
Isthiti::Grih(val) => Some(val.to_owned()),
async fn leave_kaksh(&mut self) {
let kaksh_kunjika = match &self.isthiti {
Isthiti::Kaksh(val) => Some(val.to_owned()),
_ => None
};
Broker::<SystemBroker>::issue_async(ms::LeaveUser {
grih_kunjika,
kaksh_kunjika,
kunjika: self.kunjika.to_owned(),
addr: self.addr.clone().unwrap()
});
self.isthiti = Isthiti::None;
self.send_ok_response("left");
}

1
static/css/chota.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,44 @@
@import url(chota.min.css);
@font-face {
font-family: "Itim";
src: url("../img/Itim-Regular.ttf");
}
:root {
--bg-color: #ffffff;
--bg-secondary-color: #f3f3f6;
--color-primary: #14854F;
--color-lightGrey: #d2d6dd;
--color-grey: #747681;
--color-darkGrey: #3f4144;
--color-error: #d43939;
--color-success: #28bd14;
--grid-maxWidth: 120rem;
--grid-gutter: 2rem;
--font-size: 1.8rem;
--font-color: #333333;
--font-family-sans: "Itim";
--font-family-mono: monaco, "Consolas", "Lucida Console", monospace;
}
body > .container {
max-width: 720px;
}
form > div {
padding: 5px;
}
pre {
font-family: Arial, Helvetica, sans-serif;
font-family: Itim;
font-size: 0.9em;
margin-top: 0;
margin-bottom: 0;
white-space: pre-wrap;
background: none;
padding: 0.1rem;
}
textarea {
@ -13,15 +48,8 @@ textarea {
margin-bottom: 0;
}
.hidden {
display: none;
}
.siimple-progress.progress-bar {
height: 10px !important;
position: fixed;
top: 0; left: 0; right: 0;
z-index: 99999;
.bg-white {
background-color: white;
}
.cover-screen {
@ -31,34 +59,68 @@ textarea {
}
.chatpanel {
display: flex;
justify-content: center;
width: 100%;
height: 44px;
background-image: url(../img/pattern.svg);
background-size: 30px;
}
.chatpanel-left {
position: fixed;
display: inline;
width: 34px;
bottom: 0;
left: 0;
.chatpanel-top {
width: 100%;
height: 50px;
text-align: center;
}
.chatpanel-mid {
position: fixed;
display: inline;
width: calc(100% - 54px - 34px);
bottom: 3px;
left: 34px;
height: calc(100% - 2*50px);
padding: 5px;
overflow-y: scroll;
}
.chatpanel-right {
.chatpanel-bot {
width: 100%;
height: 50px;
text-align: center;
}
.chatpanel-top-l {
height: 50px;
position: fixed;
left: 0;
top: 0;
}
.chatpanel-top-m {
margin-top: 5px;
}
.chatpanel-top-r {
height: 50px;
float: right;
position: fixed;
right: 0;
top: 0;
}
.chatpanel-bot-l {
height: 50px;
width: 50px;
float: left;
padding: 1rem;
margin: 0px;
}
.chatpanel-bot-m {
width: calc(100% - 100px);
position: fixed;
display: inline;
width: 44px;
bottom: 5px;
right: 5px;
left: 50px;
}
.chatpanel-bot-r {
height: 50px;
width: 50px;
float: right;
padding: 0.2rem;
margin: 0px;
}
#send_box {
@ -97,7 +159,7 @@ textarea {
}
.message .message-by {
font-size: 0.7rem;
font-size: 1.3rem;
font-style: italic;
text-decoration: underline;
padding-bottom: 1px;
@ -116,23 +178,25 @@ textarea {
.clip-win {
position: fixed;
z-index: 9999;
padding: 8px;
padding: 6px;
margin: 5px;
bottom: 44px;
bottom: 50px;
border: 1px dashed #1E86D7;
}
.clip-win.reply-clip {
width: calc(100% - 2*8px - 3*5px);
max-width: 720px;
height: 1.5em;
height: 2em;
padding: 2px;
border-left: 5px solid #1E86D7;
border-radius: 0px 30px 30px 0px;
}
.clip-win.selected-clip {
width: fit-content;
height: 34px;
min-width: 250px;
height: fit-content;
left: 50%;
transform: translateX(-50%);
border-radius: 15px;
@ -143,3 +207,9 @@ textarea {
width: calc(100% - 2*8px - 3*5px);
max-width: 720px;
}
@media screen and (max-width: 600px) {
div[name="error_msg"] {
width: 100%;
}
}

BIN
static/img/Itim-Regular.ttf Normal file

Binary file not shown.

View File

@ -15,7 +15,7 @@
style="enable-background:new 0 0 477.175 477.175;"
xml:space="preserve"
sodipodi:docname="back.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"><metadata
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata
id="metadata41"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
@ -28,24 +28,25 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="738"
inkscape:window-height="480"
inkscape:window-width="903"
inkscape:window-height="453"
id="namedview37"
showgrid="false"
inkscape:zoom="1.7582648"
inkscape:cx="238.58749"
inkscape:cy="238.58749"
inkscape:zoom="1.243281"
inkscape:cx="246.24387"
inkscape:cy="236.82063"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-y="54"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1" />
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g4"
style="fill:#f9f9f9">
style="fill:#1a1a1a">
<path
d="M145.188,238.575l215.5-215.5c5.3-5.3,5.3-13.8,0-19.1s-13.8-5.3-19.1,0l-225.1,225.1c-5.3,5.3-5.3,13.8,0,19.1l225.1,225 c2.6,2.6,6.1,4,9.5,4s6.9-1.3,9.5-4c5.3-5.3,5.3-13.8,0-19.1L145.188,238.575z"
id="path2"
style="fill:#f9f9f9" />
style="fill:#1a1a1a" />
</g>
<g
id="g6">

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

102
static/img/close.svg Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 330 330"
style="enable-background:new 0 0 330 330;"
xml:space="preserve"
sodipodi:docname="close.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata
id="metadata39"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs37" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="832"
inkscape:window-height="480"
id="namedview35"
showgrid="false"
inkscape:zoom="2.5909091"
inkscape:cx="165"
inkscape:cy="165"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" />
<g
id="XMLID_28_"
style="fill:#ff2a2a">
<path
id="XMLID_29_"
d="M 165,0 C 120.926,0 79.492,17.163 48.328,48.327 -16.006,112.66 -16.006,217.338 48.326,281.672 79.49,312.837 120.926,330 165,330 c 44.072,0 85.508,-17.163 116.672,-48.328 64.334,-64.334 64.334,-169.012 0,-233.345 C 250.508,17.163 209.072,0 165,0 Z m 74.246,239.245 c -2.93,2.929 -6.768,4.394 -10.607,4.394 -3.838,0 -7.678,-1.465 -10.605,-4.394 L 165,186.213 111.967,239.246 c -2.93,2.929 -6.768,4.394 -10.607,4.394 -3.838,0 -7.678,-1.465 -10.605,-4.394 -5.859,-5.857 -5.859,-15.355 0,-21.213 L 143.787,165 90.754,111.967 c -5.859,-5.857 -5.859,-15.355 0,-21.213 5.857,-5.857 15.355,-5.857 21.213,0 L 165,143.787 218.031,90.754 c 5.857,-5.857 15.355,-5.857 21.213,0 5.859,5.857 5.859,15.355 0,21.213 L 186.213,165 l 53.033,53.032 c 5.858,5.858 5.858,15.356 0,21.213 z"
style="fill:#ff2a2a" />
</g>
<g
id="g4">
</g>
<g
id="g6">
</g>
<g
id="g8">
</g>
<g
id="g10">
</g>
<g
id="g12">
</g>
<g
id="g14">
</g>
<g
id="g16">
</g>
<g
id="g18">
</g>
<g
id="g20">
</g>
<g
id="g22">
</g>
<g
id="g24">
</g>
<g
id="g26">
</g>
<g
id="g28">
</g>
<g
id="g30">
</g>
<g
id="g32">
</g>
<g
id="g43"
style="fill:#ff2a2a">
<path
id="path41"
d="M 165,0 C 120.926,0 79.492,17.163 48.328,48.327 -16.006,112.66 -16.006,217.338 48.326,281.672 79.49,312.837 120.926,330 165,330 c 44.072,0 85.508,-17.163 116.672,-48.328 64.334,-64.334 64.334,-169.012 0,-233.345 C 250.508,17.163 209.072,0 165,0 Z m 74.246,239.245 c -2.93,2.929 -6.768,4.394 -10.607,4.394 -3.838,0 -7.678,-1.465 -10.605,-4.394 L 165,186.213 111.967,239.246 c -2.93,2.929 -6.768,4.394 -10.607,4.394 -3.838,0 -7.678,-1.465 -10.605,-4.394 -5.859,-5.857 -5.859,-15.355 0,-21.213 L 143.787,165 90.754,111.967 c -5.859,-5.857 -5.859,-15.355 0,-21.213 5.857,-5.857 15.355,-5.857 21.213,0 L 165,143.787 218.031,90.754 c 5.857,-5.857 15.355,-5.857 21.213,0 5.859,5.857 5.859,15.355 0,21.213 L 186.213,165 l 53.033,53.032 c 5.858,5.858 5.858,15.356 0,21.213 z"
style="fill:#ff2a2a" />
</g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="710"
height="260"
viewBox="0 0 710 260.00001"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
sodipodi:docname="label-l.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="641.86295"
inkscape:cy="202.32654"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1496"
inkscape:window-height="1026"
inkscape:window-x="128"
inkscape:window-y="27"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:96px;line-height:1.25;font-family:sans-serif;fill:#d7f4ee;fill-opacity:1;stroke:none;"
x="268.32236"
y="211.30991"
id="text52"><tspan
sodipodi:role="line"
id="tspan50"
x="268.32236"
y="211.30991"
style="font-size:96px;fill:#d7f4ee;">Lupt Chat </tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:96px;line-height:1.25;font-family:sans-serif;fill:#aaccff;fill-opacity:1;stroke:none;"
x="281.27032"
y="102.09531"
id="text56"><tspan
sodipodi:role="line"
id="tspan54"
x="281.27032"
y="102.09531">लुप्त चैट</tspan></text>
<g
style="fill:#5fd3bc"
id="g49"
transform="matrix(-12.364986,0,0,12.637333,279.67091,-13.563207)">
<path
d="M 8,9.50004 C 7.30964,9.50004 6.75,10.0597 6.75,10.75 6.75,11.4404 7.30964,12 8,12 8.69036,12 9.25,11.4404 9.25,10.75 9.25,10.0597 8.69036,9.50004 8,9.50004 Z"
fill="#000000"
id="path29"
style="fill:#5fd3bc" />
<path
d="m 12,9.50004 c -0.6904,0 -1.25,0.55966 -1.25,1.24996 0,0.6904 0.5596,1.25 1.25,1.25 0.6904,0 1.25,-0.5596 1.25,-1.25 0,-0.6903 -0.5596,-1.24996 -1.25,-1.24996 z"
fill="#000000"
id="path31"
style="fill:#5fd3bc" />
<path
d="m 14.75,10.75 c 0,-0.6903 0.5596,-1.24996 1.25,-1.24996 0.6904,0 1.25,0.55966 1.25,1.24996 0,0.6904 -0.5596,1.25 -1.25,1.25 -0.6904,0 -1.25,-0.5596 -1.25,-1.25 z"
fill="#000000"
id="path33"
style="fill:#5fd3bc" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M 16.1007,4.59283 C 13.4065,4.36307 10.6983,4.34974 8.00194,4.55296 L 7.80871,4.56752 C 5.23741,4.76132 3.25,6.90415 3.25,9.48275 V 18 c 0,0.2639 0.13867,0.5084 0.36515,0.6438 0.22648,0.1354 0.50746,0.1418 0.73989,0.0169 L 8.26583,16.559 C 8.44774,16.4612 8.65104,16.41 8.85756,16.41 H 17.834 c 1.1321,0 2.1022,-0.8094 2.3052,-1.9231 0.4113,-2.2572 0.4437,-4.5672 0.0961,-6.83511 L 20.1329,6.98346 C 19.9464,5.76671 18.951,4.8359 17.7245,4.7313 Z M 8.11468,6.04871 C 10.731,5.85152 13.359,5.86446 15.9733,6.0874 l 1.6237,0.13848 c 0.5364,0.04574 0.9716,0.45277 1.0532,0.98485 l 0.1024,0.66833 C 19.075,9.98234 19.0449,12.1246 18.6635,14.218 18.5904,14.6188 18.2413,14.91 17.834,14.91 H 8.85756 c -0.45434,0 -0.9016,0.1126 -1.30181,0.3277 L 4.75,16.7455 V 9.48275 C 4.75,7.68884 6.13262,6.1981 7.92144,6.06328 Z"
fill="#000000"
id="path35"
style="fill:#5fd3bc" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

BIN
static/img/label.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -12,29 +12,29 @@
viewBox="0 0 710 260.00001"
version="1.1"
id="svg8"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"
sodipodi:docname="label.svg">
<defs
id="defs2" />
<sodipodi:namedview
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="411.10748"
inkscape:cy="261.91995"
inkscape:zoom="0.98994949"
inkscape:cx="358.08713"
inkscape:cy="34.196821"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1496"
inkscape:window-height="1026"
inkscape:window-x="128"
inkscape:window-y="27"
inkscape:window-height="1019"
inkscape:window-x="342"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
@ -54,51 +54,53 @@
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:96px;line-height:1.25;font-family:sans-serif;fill:#217867;fill-opacity:1;stroke:none"
x="268.32236"
y="211.30991"
style="font-style:normal;font-weight:normal;font-size:96px;line-height:1.25;font-family:sans-serif;fill:#216778;fill-opacity:1;stroke:none;"
x="152.76921"
y="232.96042"
id="text52"><tspan
sodipodi:role="line"
id="tspan50"
x="268.32236"
y="211.30991"
style="font-size:96px;fill:#217867">Lupt Chat </tspan></text>
x="152.76921"
y="232.96042"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;font-family:Itim;-inkscape-font-specification:Itim;fill:#216778;">Lupt Chat </tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:96px;line-height:1.25;font-family:sans-serif;fill:#535d6c;fill-opacity:1;stroke:none;"
x="281.27032"
y="102.09531"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:133.333px;line-height:1.25;font-family:Teko;-inkscape-font-specification:Teko;fill:#374548;fill-opacity:1;stroke:none"
x="268.19843"
y="130.02667"
id="text56"><tspan
sodipodi:role="line"
id="tspan54"
x="281.27032"
y="102.09531">लुप्त चैट</tspan></text>
x="268.19843"
y="130.02667"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:133.333px;font-family:Rajdhani;-inkscape-font-specification:'Rajdhani Medium';fill:#374548">लुप्त चैट</tspan></text>
<g
style="fill:#d45500"
style="fill:#d45500;stroke:#005544;stroke-width:0.385726;stroke-miterlimit:4;stroke-dasharray:none"
id="g49"
transform="matrix(-12.364986,0,0,12.637333,279.67091,-13.563207)">
transform="matrix(-10.249207,0,0,10.492348,280.41862,-26.401894)">
<path
d="M 8,9.50004 C 7.30964,9.50004 6.75,10.0597 6.75,10.75 6.75,11.4404 7.30964,12 8,12 8.69036,12 9.25,11.4404 9.25,10.75 9.25,10.0597 8.69036,9.50004 8,9.50004 Z"
fill="#000000"
id="path29"
style="fill:#d45500" />
style="fill:none;stroke:#005544;stroke-width:0.385726;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 12,9.50004 c -0.6904,0 -1.25,0.55966 -1.25,1.24996 0,0.6904 0.5596,1.25 1.25,1.25 0.6904,0 1.25,-0.5596 1.25,-1.25 0,-0.6903 -0.5596,-1.24996 -1.25,-1.24996 z"
fill="#000000"
id="path31"
style="fill:#d45500" />
style="fill:none;stroke:#005544;stroke-width:0.385726;stroke-miterlimit:4;stroke-dasharray:none" />
<path
d="m 14.75,10.75 c 0,-0.6903 0.5596,-1.24996 1.25,-1.24996 0.6904,0 1.25,0.55966 1.25,1.24996 0,0.6904 -0.5596,1.25 -1.25,1.25 -0.6904,0 -1.25,-0.5596 -1.25,-1.25 z"
fill="#000000"
id="path33"
style="fill:#d45500" />
style="fill:none;stroke:#005544;stroke-width:0.385726;stroke-miterlimit:4;stroke-dasharray:none" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M 16.1007,4.59283 C 13.4065,4.36307 10.6983,4.34974 8.00194,4.55296 L 7.80871,4.56752 C 5.23741,4.76132 3.25,6.90415 3.25,9.48275 V 18 c 0,0.2639 0.13867,0.5084 0.36515,0.6438 0.22648,0.1354 0.50746,0.1418 0.73989,0.0169 L 8.26583,16.559 C 8.44774,16.4612 8.65104,16.41 8.85756,16.41 H 17.834 c 1.1321,0 2.1022,-0.8094 2.3052,-1.9231 0.4113,-2.2572 0.4437,-4.5672 0.0961,-6.83511 L 20.1329,6.98346 C 19.9464,5.76671 18.951,4.8359 17.7245,4.7313 Z M 8.11468,6.04871 C 10.731,5.85152 13.359,5.86446 15.9733,6.0874 l 1.6237,0.13848 c 0.5364,0.04574 0.9716,0.45277 1.0532,0.98485 l 0.1024,0.66833 C 19.075,9.98234 19.0449,12.1246 18.6635,14.218 18.5904,14.6188 18.2413,14.91 17.834,14.91 H 8.85756 c -0.45434,0 -0.9016,0.1126 -1.30181,0.3277 L 4.75,16.7455 V 9.48275 C 4.75,7.68884 6.13262,6.1981 7.92144,6.06328 Z"
d="M 16.1007,4.59283 C 13.4065,4.36307 10.6983,4.34974 8.00194,4.55296 L 7.80871,4.56752 C 5.23741,4.76132 3.25,6.90415 3.25,9.48275 V 18 c 0,0.2639 0.13867,0.5084 0.36515,0.6438 0.22648,0.1354 0.50746,0.1418 0.73989,0.0169 L 8.26583,16.559 C 8.44774,16.4612 8.65104,16.41 8.85756,16.41 H 17.834 c 1.1321,0 2.1022,-0.8094 2.3052,-1.9231 0.4113,-2.2572 0.4437,-4.5672 0.0961,-6.83511 L 20.1329,6.98346 C 19.9464,5.76671 18.951,4.8359 17.7245,4.7313 Z"
fill="#000000"
id="path35"
style="fill:#d45500" />
style="fill:none;stroke:#005544;stroke-width:0.385726;stroke-miterlimit:4;stroke-dasharray:none"
sodipodi:nodetypes="cccsssccssccccc" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

15
static/img/loading.svg Normal file
View File

@ -0,0 +1,15 @@
<svg version="1.1" id="L3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve">
<circle fill="none" stroke="#000" stroke-width="4" cx="50" cy="50" r="44" style="opacity:0.5;"/>
<circle fill="#fff" stroke="#008066" stroke-width="3" cx="8" cy="54" r="6" >
<animateTransform
attributeName="transform"
dur="2s"
type="rotate"
from="0 50 48"
to="360 50 52"
repeatCount="indefinite" />
</circle>
</svg>

After

Width:  |  Height:  |  Size: 593 B

View File

@ -15,7 +15,7 @@
style="enable-background:new 0 0 477.175 477.175;"
xml:space="preserve"
sodipodi:docname="next.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"><metadata
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata
id="metadata41"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
@ -28,24 +28,25 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="738"
inkscape:window-width="903"
inkscape:window-height="480"
id="namedview37"
showgrid="false"
inkscape:zoom="1.7582648"
inkscape:cx="238.58749"
inkscape:cy="238.58749"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:zoom="0.4395662"
inkscape:cx="323.57023"
inkscape:cy="216.28028"
inkscape:window-x="595"
inkscape:window-y="132"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1" />
inkscape:current-layer="Capa_1"
inkscape:document-rotation="0" />
<g
id="g4"
style="fill:#f9f9f9">
style="fill:#1a1a1a">
<path
d="M360.731,229.075l-225.1-225.1c-5.3-5.3-13.8-5.3-19.1,0s-5.3,13.8,0,19.1l215.5,215.5l-215.5,215.5 c-5.3,5.3-5.3,13.8,0,19.1c2.6,2.6,6.1,4,9.5,4c3.4,0,6.9-1.3,9.5-4l225.1-225.1C365.931,242.875,365.931,234.275,360.731,229.075z "
id="path2"
style="fill:#f9f9f9" />
style="fill:#1a1a1a" />
</g>
<g
id="g6">

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

100
static/img/pattern.svg Normal file
View File

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512.001 512.001"
style="enable-background:new 0 0 512.001 512.001;"
xml:space="preserve"
sodipodi:docname="pattern.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"><metadata
id="metadata43"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs41" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1721"
inkscape:window-height="1019"
id="namedview39"
showgrid="false"
inkscape:zoom="0.20873984"
inkscape:cx="-1382.0481"
inkscape:cy="-167.56932"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1"
inkscape:document-rotation="0" />
<g
id="g6"
style="fill:#f0efeb;fill-opacity:1">
<g
id="g4"
style="fill:#f0efeb;fill-opacity:1">
<path
d="m 503.032,394.775 h -76.738 l 82.927,-82.624 c 1.686,-1.681 2.636,-3.963 2.638,-6.346 0.002,-2.382 -0.941,-4.665 -2.625,-6.35 l -43.004,-43.03 43.01,-43.108 c 3.496,-3.504 3.492,-9.177 -0.008,-12.678 l -83.372,-83.362 77.179,-0.056 c 4.95,0 8.961,-4.016 8.961,-8.966 V 9.443 c 0,-4.955 -4.015,-8.969 -8.969,-8.969 h -98.812 c -4.955,0 -8.969,4.015 -8.969,8.969 V 86.676 L 311.664,3.1 c -1.681,-1.681 -3.963,-2.627 -6.344,-2.626 -2.379,0.001 -4.661,0.946 -6.343,2.63 L 255.976,46.141 212.935,3.1 c -1.683,-1.681 -3.963,-2.626 -6.343,-2.626 -2.38,0 -4.66,0.946 -6.343,2.627 L 116.752,86.633 V 9.443 c 0,-4.955 -4.016,-8.969 -8.969,-8.969 H 8.969 C 4.016,0.474 0,4.488 0,9.443 v 98.812 c 0,4.955 4.016,8.969 8.969,8.969 H 86.171 L 2.626,200.801 C 0.944,202.485 0,204.766 0,207.145 c 0,2.379 0.947,4.66 2.63,6.343 l 43.061,43.028 -43.065,43.098 c -1.684,1.685 -2.629,3.972 -2.625,6.354 0.004,2.382 0.954,4.665 2.643,6.347 l 82.891,82.462 H 8.969 C 4.016,394.777 0,398.792 0,403.746 v 98.812 c 0,4.955 4.016,8.969 8.969,8.969 h 98.812 c 4.953,0 8.969,-4.015 8.969,-8.969 v -76.726 l 83.517,83.085 c 1.75,1.74 4.037,2.611 6.326,2.611 2.294,0 4.589,-0.874 6.34,-2.624 l 43.085,-43.048 43.046,43.046 c 1.752,1.751 4.047,2.626 6.343,2.626 2.29,0 4.58,-0.872 6.331,-2.615 l 83.512,-83.207 v 76.852 c 0,4.955 4.015,8.969 8.969,8.969 h 98.812 c 4.955,0 8.969,-4.015 8.969,-8.969 v -98.812 c 10e-4,-4.956 -4.013,-8.971 -8.968,-8.971 z m -12.837,-88.991 -77.007,76.725 v -72.92 l 40.372,-40.464 z m 0.017,-98.791 -36.662,36.746 -40.361,-40.386 V 129.979 Z M 413.188,18.411 h 80.874 v 80.882 l -80.874,0.057 z m -107.862,3.718 77.221,77.213 -73.422,-0.053 -40.464,-40.465 z m 89.923,95.161 v 80.808 H 314.375 V 117.233 Z M 206.595,22.128 243.298,58.831 202.877,99.286 h -73.409 z m -89.844,95.096 h 80.874 v 80.874 H 116.751 Z M 17.939,99.286 V 18.412 h 80.874 v 80.874 z m 3.715,107.853 77.158,-77.187 v 73.401 L 58.37,243.827 Z m 77.158,286.45 H 17.939 v -80.874 h 80.874 v 80.874 z m 0,-110.908 -77.145,-76.745 36.712,-36.74 40.433,40.402 z m 107.769,107.211 -77.579,-77.177 h 73.876 l 40.455,40.455 z m -89.83,-95.115 V 314.85 l 80.869,-0.001 h 0.005 v 79.928 z m 188.667,95.108 -36.71,-36.71 40.413,-40.38 73.73,-0.062 z m 89.831,-95.1 -80.874,0.068 v -80.002 h 80.874 z m 5.249,-97.874 h -95.092 c -4.955,0 -8.969,4.015 -8.969,8.969 v 94.232 l -40.413,40.379 -40.461,-40.46 V 305.88 c 0,-2.379 -0.945,-4.659 -2.627,-6.343 -1.683,-1.681 -3.963,-2.626 -6.342,-2.626 l -95.099,10e-4 -40.435,-40.404 40.44,-40.471 h 95.095 c 4.953,0 8.969,-4.015 8.969,-8.969 v -95.1 l 40.418,-40.452 40.455,40.455 v 95.097 c 0,4.955 4.015,8.969 8.969,8.969 h 95.095 l 40.378,40.401 z m 93.563,196.678 h -80.874 v -80.874 h 80.874 z"
id="path2"
style="fill:#f0efeb;fill-opacity:1" />
</g>
</g>
<g
id="g8">
</g>
<g
id="g10">
</g>
<g
id="g12">
</g>
<g
id="g14">
</g>
<g
id="g16">
</g>
<g
id="g18">
</g>
<g
id="g20">
</g>
<g
id="g22">
</g>
<g
id="g24">
</g>
<g
id="g26">
</g>
<g
id="g28">
</g>
<g
id="g30">
</g>
<g
id="g32">
</g>
<g
id="g34">
</g>
<g
id="g36">
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -13,8 +13,8 @@
fill="none"
version="1.1"
id="svg4"
sodipodi:docname="send2.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
sodipodi:docname="send.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)">
<metadata
id="metadata10">
<rdf:RDF>
@ -41,16 +41,17 @@
inkscape:window-height="810"
id="namedview6"
showgrid="false"
inkscape:zoom="17.479167"
inkscape:cx="10.309773"
inkscape:cy="11.868146"
inkscape:zoom="15.22"
inkscape:cx="10.195351"
inkscape:cy="15.765659"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="svg4" />
inkscape:current-layer="svg4"
inkscape:document-rotation="0" />
<path
d="M 7.7577801,6.14799 C 6.84443,5.77187 6.0833001,5.45843 5.49196,5.30702 4.91915,5.16036 4.18085,5.07761 3.63766,5.62862 3.09447,6.17962 3.18776,6.91666 3.34259,7.48732 3.50242,8.0764399 3.8267,8.83302 4.21583,9.7409 L 4.86259,11.25 H 10 c 0.4142,0 0.75,0.3358 0.75,0.75 0,0.4142 -0.3358,0.75 -0.75,0.75 H 4.8626 l -0.64677,1.5091 c -0.38913,0.9079 -0.71341,1.6645 -0.87324,2.2536 -0.15483,0.5706 -0.24812,1.3077 0.29507,1.8587 0.54319,0.551 1.28149,0.4682 1.8543,0.3216 0.5913401,-0.1514 1.35247,-0.4649 2.2658102,-0.841 L 19.1997,13.1406 c 0.2056,-0.0845 0.4282,-0.1761 0.5944,-0.2736 0.1499,-0.088 0.5493,-0.3478 0.5493,-0.867 0,-0.5192 -0.3994,-0.779 -0.5493,-0.867 -0.1662,-0.0975 -0.3888,-0.1891 -0.5944,-0.2736 z"
fill="black"
id="path2"
style="fill:#f9f9f9;stroke-width:1" />
style="fill:#2ca089;stroke-width:1" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -3,176 +3,197 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/siimple.min.css">
<link rel="stylesheet" href="css/style.css">
<title>Lupt Chat</title>
</head>
<body>
<div id="progressbar" class="siimple-progress siimple-progress--primary siimple-progress--striped progress-bar">
<span style="width:100%;"></span>
<div id="progress" class="bg-white" style="z-index: 9999; position: fixed; top: 0; bottom: 0;width: 100%; height: 100%;">
<div style="top: 50%;
left: 50%;
width:10em;
height:10em;
margin-top: -5em; /*set to a negative number 1/2 of your height*/
margin-left: -5em; /*set to a negative number 1/2 of your width*/
position:fixed;
text-align: center;
">
<img src="img/loading.svg" style="height: 100%;">
<button class="button" onclick="leave()">Close</button>
</div>
</div>
<!-- Connect Screen -->
<div id="connect_panel" class="siimple-content siimple-content--extra-small">
<div class="siimple--px-5 siimple--py-0">
<tabs>
<div class="siimple-jumbotron siimple--text-center siimple--py-4">
<div class="siimple-jumbotron-title"><img src="img/label.svg" alt="Lupt Chat" style="width: 100%; height: auto;"></div>
<div class="siimple-jumbotron-detail">Chat in group or to strangers</div>
</div>
<div class="siimple-tabs">
<div for="grih_sec" class="siimple-tabs-item siimple-tabs-tab--selected">Grih</div>
<div for="stranger_sec" class="siimple-tabs-item">Stranger</div>
</div>
<form name="grih_sec" cmd="join" class="siimple-form">
<div name="error_area" class="siimple-content siimple--py-1 siimple--text-small siimple--color-primary siimple-content--fluid"></div>
<div class="siimple-form-detail">Connect Grih(home) with kunjika(id).</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Grih kunjika(home id)</div>
<input name="grih_kunjika" type="text" class="siimple-input siimple-input--fluid" placeholder="Grih kunjika">
<div class="siimple-form-field-helper">New grih is created if no such grih exists</div>
</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Your kunjika(id)</div>
<input name="kunjika" type="text" class="siimple-input siimple-input--fluid" placeholder="Your kunjika">
</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Your name</div>
<input name="name" type="text" class="siimple-input siimple-input--fluid" placeholder="Your name">
</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Size of Grih</div>
<input name="length" type="number" class="siimple-input siimple-input--fluid" placeholder="Size">
<div class="siimple-form-field-helper">Number of perople allowed in grih. Leave empty for infinite</div>
</div>
<div class="siimple-form-field siimple--text-right" style="width: 100%;">
<div><span name="error_msg" class="siimple-tag siimple-tag--error siimple--my-2 hidden"></span></div>
<div name="connect" class="siimple-btn siimple-btn--success">Connect</div>
</div>
</form>
<form name="stranger_sec" cmd="rand" class="siimple-form hidden">
<div class="siimple-form-detail">Connect random stranger</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Your kunjika(id)</div>
<input name="kunjika" type="text" class="siimple-input siimple-input--fluid" placeholder="Your kunjika">
</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Your name</div>
<input name="name" type="text" class="siimple-input siimple-input--fluid" placeholder="Your name">
</div>
<div class="siimple-form-field">
<div class="siimple-form-field-label">Tags</div>
<input name="tags" type="text" class="siimple-input siimple-input--fluid" placeholder="Tags">
<div class="siimple-form-field-helper">Seperated by space. Leave empty to connect anyone. Its recommended to try without tags if you don't get anyone</div>
</div>
<div class="siimple-form-field siimple--text-right" style="width: 100%;">
<div><span name="error_msg" class="siimple-tag siimple-tag--error siimple--my-2 hidden"></span></div>
<div name="connect" class="siimple-btn siimple-btn--success">Connect</div>
</div>
</form>
</tabs>
<div class="siimple-content siimple-content--fluid siimple--text-center siimple--py-1">
<div class="siimple-form-field-helper">By tapping "Connect" button I agree with <a class="siimple-link" href="/terms.html">Terms of Service</a> and <a class="siimple-link" href="policy.html">Privacy Policy</a></div>
<div id="connect_panel" class="container">
<div class="logo is-center" style="padding-top: 20px;">
<img src="img/label.png" alt="Lupt Chat" width="400">
</div>
<tabs>
<div class="tabs is-center">
<a name="kaksh_sec" class="active">Kaksh(Room)</a>
<a name="stranger_sec">Stranger</a>
</div>
<form name="kaksh_sec" cmd="join">
<div class="is-center">
Connect Kaksh(room) with kunjika(id)
</div>
<div>
<label>Kaksh kunjika(room id)</label>
<input name="kaksh_kunjika" type="text" placeholder="Kaksh kunjika">
<small class="text-grey">Pick a random id to create new kaksh</small>
</div>
<div>
<label>Your kunjika(your id)</label>
<input name="kunjika" type="text" placeholder="Your kunjika">
<small class="text-grey">Pick a random kunjika(id)</small>
</div>
<div>
<label>Your name</label>
<input name="name" type="text" placeholder="Your name">
</div>
<div>
<label>Size of kaksh(<i>Optional</i>)</label>
<input name="length" type="number" placeholder="Size">
<small class="text-grey">Number of perople allowed in kaksh.</small>
</div>
<div class="row">
<div class="col is-vertical-align text-right"><div name="error_msg" class="text-error is-hidden"></div></div>
<div class="col is-right">
<a name="connect" class="button outline primary">Connect</a>
</div>
</div>
</form>
<form name="stranger_sec" cmd="rand" class="is-hidden">
<div class="is-center">
Connect random stranger
</div>
<div>
<label>Your kunjika(your id)</label>
<input name="kunjika" type="text" placeholder="Your kunjika">
<small class="text-grey">Pick a random kunjika(id)</small>
</div>
<div>
<label>Your name</label>
<input name="name" type="text" placeholder="Your name">
</div>
<div>
<label>Tags</label>
<input name="tags" type="text" placeholder="Tags">
<small class="text-grey text-center">
Seperated by space. Leave empty to connect anyone.
Its recommended to try without tags if you don't get anyone.
</small>
</div>
<div class="row">
<div class="col is-vertical-align text-right"><div name="error_msg" class="text-error is-hidden"></div></div>
<div class="col is-right">
<a name="connect" class="button outline primary">Connect</a>
</div>
</div>
</form>
</tabs>
<div class="is-center text-center">
<small>
By tapping "Connect" button I agree with
<a href="/terms.html">Terms of Service</a> and
<a href="policy.html">Privacy Policy</a>
</small>
</div>
<div class="siimple-footer" align="center">
Made with ❤️️ by <a href="https://gitlab.com/PiyushXCoder" class="siimple-link">Piyush Mishra</a>
</div>
<footer class="is-center" style="padding: 60px;">
<small>Made with ❤️️ by <a href="https://gitlab.com/PiyushXCoder" >Piyush Mishra</a></small>
</footer>
</div>
<!-- Chat Screen -->
<div id="chat_panel" class="cover-screen siimple--bg-white hidden">
<div class="siimple-navbar siimple--py-1 siimple-navbar--dark">
<div class="siimple--float-left">
<a onclick="leave()" class="siimple-navbar-item"><img src="img/back.svg" alt="" height="12px"> Back</a>
</div>
<a class="siimple-navbar-title"><img src="img/label-l.svg" alt="Lupt Chat" height="34px"></a>
<div class="siimple--float-right">
<a id="next_btn" onclick="connect_next()" class="siimple-navbar-item">Next <img src="img/next.svg" alt="" height="12px"> </a>
</div>
<div id="chat_panel" class="cover-screen chatpanel is-hidden">
<div class="chatpanel-top bg-light">
<button onclick="leave()" class="button chatpanel-top-l">
<img src="img/back.svg" alt="" height="12px"> Back
</button>
<img src="img/label.png" alt="Lupt Chat" height="40px" class="chatpanel-top-m">
<button id="next_btn" onclick="connect_next()" class="button chatpanel-top-r is-hidden">
Next <img src="img/next.svg" alt="" height="12px">
</button>
</div>
<div id="message_area_scroll" style="height: calc(100% - 2*44px - 2*5px); padding: 5px; overflow-y: scroll;" class="siimple--bg-light">
<div id="message_area" class="siimple--my-1">
<div id="message_area_scroll" class="chatpanel-mid">
<div id="message_area">
</div>
<div id="status_area" class="siimple--my-1">
<div id="status_area">
</div>
</div>
<div class="siimple--bg-light chatpanel">
<div class="chatpanel-left">
<div onclick="$('#action_clip').toggleClass('hidden')" class="siimple-btn siimple-btn--grey siimple--px-1"><img src="img/clip.svg" alt="send" width="24"></div>
</div>
<div class="chatpanel-mid">
<textarea id="send_box" class="siimple-textarea"></textarea>
</div>
<div class="chatpanel-right">
<div onclick="send()" class="siimple-btn siimple-btn--blue siimple-btn--rounded siimple--px-2" style="height: 24px;"><img src="img/send.svg" alt="Send" width="24"></div>
<div class="chatpanel-bot bg-light">
<button onclick="$('#action_clip').toggleClass('is-hidden')" class="button chatpanel-bot-l">
<img src="img/clip.svg" alt="send" width="24">
</button>
<div class="chatpanel-bot-m">
<textarea id="send_box" rows="1"></textarea>
</div>
<button onclick="send()" class="button chatpanel-bot-r">
<img src="img/send.svg" alt="Send" width="50">
</button>
</div>
</div>
<!-- Reply Clip -->
<div id="reply_clip" class="clip-win reply-clip siimple--bg-white hidden">
<span></span>
<div onclick="$('#reply_clip > span').text(''); $('#reply_clip').addClass('hidden');" class="siimple-close siimple--float-right"></div>
<div id="reply_clip" class="clip-win reply-clip bg-white is-hidden">
<span>sss</span>
<a onclick="$('#reply_clip > span').text(''); $('#reply_clip').addClass('hidden');" style="float: right; padding: 3px 6px;">
<img src="img/close.svg" alt="X" style="height: 1.8rem; width: auto; cursor: pointer;">
</a>
</div>
<!-- Selected Clip -->
<div id="selected_clip" class="clip-win selected-clip siimple--bg-white hidden">
<div class="siimple-btn-group">
<div onclick="copyMessagesToClipboard()" class="siimple-btn siimple-btn--blue siimple--px-2" style="height: 24px;">Copy</div>
<div onclick="prepareReply()" class="siimple-btn siimple-btn--blue siimple--px-2" style="height: 24px;">Reply</div>
<div id="selected_clip" class="clip-win selected-clip bg-white is-hidden">
<div style="padding: 4px;">
<div onclick="copyMessagesToClipboard()" class="button outline primary">Copy</div>
<div onclick="prepareReply()" class="button outline primary">Reply</div>
<a onclick="Messages.unselectAll()" style="float: right; padding: 6px 2px 6px 8px;">
<img src="img/close.svg" alt="X" style="height: 1.8rem; width: auto; cursor: pointer;">
</a>
</div>
<div class="siimple-close siimple--float-right siimple--my-1 siimple--ml-2"></div>
</div>
<!-- Action Clip -->
<div id="action_clip" class="clip-win action-clip siimple--bg-white hidden">
<div class="siimple--my-1 hidden">
<div class="siimple-btn siimple-btn--light">
<div id="action_clip" class="clip-win action-clip is-hidden bg-white">
<div class="is-hidden">
<button class="button">
<img src="img/image.svg" alt="Image" width="50" class="siimple--py-2 siimple--px-2">
<div>send image</div>
</div>
</button>
</div>
<div>
<a onclick="cleanMessage()" class="siimple-btn siimple-btn--blue">Clear</a>
<a onclick="vayaktiList()" class="siimple-btn siimple-btn--blue">List Vyakti(Users)</a>
<button onclick="Messages.cleanMessage()" class="button">Clear</button>
<button onclick="vayaktiList()" class="button">List Vyakti(Users)</button>
</div>
</div>
<!-- Vyakti List -->
<div id="vayakti_model" class="siimple-modal siimple-modal--large hidden" style="z-index: 9999;" id="modal">
<div class="siimple-modal-content">
<div class="siimple-modal-header">
<div class="siimple-modal-header-title">List Vyakti(Users)</div>
<div onclick="$('#vayakti_model').addClass('hidden')" class="siimple-modal-header-close" id="modal-close"></div>
</div>
<div class="siimple-modal-body siimple--px-0">
<div class="siimple-table siimple--px-3">
<div class="siimple-table-header">
<div class="siimple-table-row">
<div class="siimple-table-cell">Name</div>
<div class="siimple-table-cell">Kunjika</div>
</div>
</div>
<div id="vayakti_list" class="siimple-table-body">
<div class="siimple-table-row">
<div class="siimple-table-cell">a</div>
<div class="siimple-table-cell">a</div>
</div>
</div>
</div>
</div>
<div class="siimple-modal-footer siimple--py-2">
<a onclick="$('#vayakti_model').addClass('hidden'); $('#vayakti_list').empty()" class="siimple-btn siimple-btn--blue">Close</a>
</div>
<!-- vayakti -->
<div id="vayakti_model" class="card is-hidden" style="position: fixed; top: 50px; bottom: 50px; right: 0; z-index: 9999; width: 100%; max-width: 500px;">
<header>
<h4>
List Vyakti(Users)
<button onclick="$('#vayakti_model').addClass('is-hidden'); $('#vayakti_list').empty()" class="button bg-red" style="float: right;"><img src="img/close.svg" alt="X" style="height: 1.8rem; width: auto; cursor: pointer;"></button>
</h4>
</header>
<div style="overflow-y: scroll; max-height: calc(100% - 40px);">
<table>
<thead>
<th>Name</th>
<th>Kunjika</th>
</thead>
<tbody id="vayakti_list">
<tr>
<td>1</td>
<td>2</td>
</tr>
</tbody>
</table>
</div>
</div>
<script src="js/jquery-3.5.1.min.js"></script>
<script src="js/app.js"></script>
</body>

View File

@ -1,98 +1,256 @@
$(document).ready(() => {
$(".siimple-tabs-item").click(function() {
var t = $(this);
var tab = $(t.parents('tabs').first());
tab.find('form').each((i,elm) => {
var elm = $(elm);
if(elm.attr('name') == t.attr('for'))
elm.removeClass('hidden');
let State = class {
static login() {
$('#connect_panel').removeClass('is-hidden');
$('#chat_panel').addClass('is-hidden');
$('#reply_clip').addClass('is-hidden');
$('#selected_clip').addClass('is-hidden');
$('#action_clip').addClass('is-hidden');
$('#vayakti_model').addClass('is-hidden');
$('[name="error_msg"]').addClass('is-hidden');
}
static chat() {
$('#chat_panel').removeClass('is-hidden');
$('#connect_panel').addClass('is-hidden');
$('#reply_clip').addClass('is-hidden');
$('#selected_clip').addClass('is-hidden');
$('#action_clip').addClass('is-hidden');
$('#vayakti_model').addClass('is-hidden');
$('#next_btn').addClass('is-hidden');
$('#send_box').focus();
}
static showProgress() {
$('#progress').removeClass('is-hidden');
}
static hideProgress() {
$('#progress').addClass('is-hidden');
}
};
let Messages = class {
static pick(elm) {
var elm = $(elm);
elm.toggleClass('active');
if($('.active').length == 0)
$('#selected_clip').addClass('is-hidden');
else
$('#selected_clip').removeClass('is-hidden');
}
static unselectAll(msg) {
$('.active').each(function() {
$(this).removeClass('active');
});
$('#selected_clip').addClass('is-hidden');
}
static setupTyping() {
var send_typing = false;
var timeout = null;
$('#send_box').keydown(function(e) {
if (!send_typing) {
sendTyping();
send_typing = true;
return;
}
clearTimeout(timeout);
timeout = setTimeout(function() {
send_typing = false;
sendTypingEnd();
},2000);
});
$('#send_box').keypress(function(e) {
if(e.originalEvent.charCode == 13 && !e.shiftKey) {
send();
e.preventDefault();
clearTimeout(timeout);
send_typing = false;
sendTypingEnd()
return
}
});
}
static pushTypingStatus() {
var elm = $('#status_area > #typing');
if(elm.length > 0) elm.remove();
if(typing.length == 0) return;
var text = '';
typing.forEach((val) => {
text += val + ','
})
text = text.substr(0, text.length-1);
text += ' is typing...'
$('#status_area').append($('<div>', { id: 'typing',
class:'siimple-label siimple--mx-2 siimple--my-0' }).append(text));
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
static pushMessage(sender, text, reply = null) {
var isMe = myinfo.kunjika == sender;
var area = $('#message_area');
var elm = $('<div>', {class: 'message '+(isMe?'message-me':'message-other')});
if(!no_name_message) {
if(sender == myinfo.kunjika)
elm.append($('<div>', {class: 'message-by'}).append('me'))
else
elm.addClass('hidden');
elm.append($('<div>', {class: 'message-by'}).append(vayakti[sender]+'('+sender+')'))
} else {
elm.addClass('siimple--py-1');
}
if(reply != null && reply.length > 0) {
elm.append(
$('<div>', {class: 'message message-reply'})
.append($('<pre>', {class: 'siimple--my-0 siimple--pt-1'}).append(reply))
);
}
elm.append($('<pre>').append(text));
elm.click(function() {
selectMessage(this);
});
area.append(elm);
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
// in message area
static pushStatus(text) {
var area = $('#message_area');
var elm = $('<div>', {class: 'status'});
elm.append($('<small>', {class: 'tag bg-light'}).append(text));
area.append(elm);
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
static selectedMessageToText() {
var text = "";
$('.active').each(function() {
$(this).find('pre').each(function() {
text += $(this).text() + '\n'
});
});
t.parent().find('.siimple-tabs-item').each((i, elm) => {
return text.trim();
}
static prepareReply() {
var text = this.selectedMessageToText();
var el = $('#reply_clip');
el.removeClass('is-hidden');
el.attr('msg', text);
$('#reply_clip > span').text(text.substr(0, 15)+ '...');
unselectMessages();
}
static copyMessagesToClipboard() {
var $temp = $("<textarea>");
$("body").append($temp);
$temp.val(this.selectedMessageToText()).select();
document.execCommand("copy");
$temp.remove();
unselectMessages();
}
static cleanMessage() {
$('#message_area').empty();
$('#status_area').empty();
$('#action_clip').addClass('is-hidden');
}
static currentTime() {
var today = new Date();
return today.getHours()+':'+today.getMinutes();
}
}
class Actions {
actions = []; // [[id, func]]
execute() {
if(this.actions.length <= 0) return;
var act = this.actions[0];
this.actions.shift();
act[1]();
}
clear() {
this.actions = [];
}
clear_key(ac) {
this.actions = this.actions.filter(function (arr) {
return arr[0] != ac
});
}
has_key(ac) {
var out = this.actions.find(function (arr) {
return arr[0] == ac
});
return out != undefined;
}
add(id, func) {
this.actions.push([id, func]);
}
}
var actions = new Actions();
$(document).ready(() => {
$(".tabs > a").click(function() {
var t = $(this);
$(t.parents('tabs').first()).find('form').each(function(i,elm) {
var elm = $(elm);
if(elm.attr('for') === t.attr('for'))
elm.addClass('siimple-tabs-tab--selected');
else
elm.removeClass('siimple-tabs-tab--selected');
if(elm.attr('name') == t.attr('name'))
elm.removeClass('is-hidden');
else elm.addClass('is-hidden');
});
$(".tabs > a").each(function(i,elm) {
var elm = $(elm);
if(elm.attr('name') != t.attr('name'))
elm.removeClass('active');
else elm.addClass('active');
});
});
$('.message-me, .message-other').click(function() {
selectMessage(this);
Messages.select();
});
$('#selected_clip > .siimple-close').click(function() {
unselectMessages();
});
var send_typing = false;
var timeout = null;
$('#send_box').keydown(function(e) {
if (!send_typing) {
sendTyping();
send_typing = true;
return;
}
clearTimeout(timeout);
timeout = setTimeout(function() {
send_typing = false;
sendTypingEnd();
},2000);
});
$('#send_box').keypress(function(e) {
if(e.originalEvent.charCode == 13 && !e.shiftKey) {
send();
e.preventDefault();
clearTimeout(timeout);
send_typing = false;
sendTypingEnd()
return
}
});
$('#send_box').bind('input propertychange keyup', function() {
var height = ($(window).height()*0.0165).toFixed(0)*20;
var sheight = this.scrollHeight;
if(sheight < height) {
$(this).height(0);
height = this.scrollHeight;
$(this).height(height - 20);
$('#reply_clip').css('bottom', (this.scrollHeight + 10) + 'px');
$('#selected_clip').css('bottom', (this.scrollHeight + 10) + 'px');
}
});
Messages.setupTyping();
$('[name=connect]').click(function () {
State.showProgress();
connect($(this).parents('form').first());
});
var textarea = $('#send_box')[0];
textarea.addEventListener('keydown', autosize);
function autosize(){
var el = this;
setTimeout(function(){
el.style.cssText = 'height:auto; padding:0';
el.style.cssText = 'height:' + el.scrollHeight + 'px';
},0);
}
});
function sendTyping() {
socket.send(JSON.stringify({
cmd: 'status',
status: "typing"
}));
}
function sendTypingEnd() {
socket.send(JSON.stringify({
cmd: 'status',
status: "typing_end"
}));
}
function calcHeight(value) {
let numberOfLineBreaks = (value.match(/\n/g) || []).length;
// min-height + lines x line-height + padding + border
let newHeight = 20 + numberOfLineBreaks * 20 + 12 + 2;
return newHeight;
}
// Create WebSocket connection.
const socket = new WebSocket('ws://'+window.location.host+'/ws/');
var callbacks = [];
var myinfo = {
kunjika: "",
name: ""
@ -103,7 +261,20 @@ var no_name_message = false;
// Connection opened
socket.addEventListener('open', function (event) {
$('#progressbar').addClass('hidden');
var params = window.location.search;
params = params.substr(1,params.length).split('&');
if(params.length < 3) {
State.hideProgress();
return;
}
var frm = $('form[name=kaksh_sec]');
frm.find('[name=kaksh_kunjika]').val(params[0]);
frm.find('[name=kunjika]').val(params[1]);
frm.find('[name=name]').val(params[2]);
connect(frm);
});
// Listen for messages
@ -112,58 +283,52 @@ socket.addEventListener('message', function (event) {
switch(j.cmd) {
case 'resp':
if(j.result == 'Err') {
if($('#chat_panel').hasClass('hidden')) {
if($('#chat_panel').hasClass('is-hidden')) {
$('[name="error_msg"]').text(j.message);
$('[name="error_msg"]').removeClass('hidden');
$('#progressbar').addClass('hidden');
joining = false;
callbacks = [];
$('[name="error_msg"]').removeClass('is-hidden');
State.hideProgress();
actions.clear_key('join');
} else {
pushStatus(j.message);
Messages.pushStatus(j.message);
}
} else if(j.result == 'Ok'){
if(callbacks.length > 0) {
callbacks[0]();
callbacks.shift();
}
actions.execute();
}
break;
case 'random':
callbacks[0]();
callbacks = [];
$('#next_btn').removeClass('hidden');
actions.execute();
actions.clear_key('join');
$('#next_btn').removeClass('is-hidden');
no_name_message = true;
pushStatus('Say hi to '+j.name);
Messages.pushStatus('Say hi to '+j.name);
break;
case 'status':
if(j.status == "typing") {
typing.push(j.kunjika);
pushTypingStatus();
Messages.pushTypingStatus();
} else if(j.status == "typing_end") {
const index = typing.indexOf(j.kunjika);
if (index > -1) typing.splice(index, 1);
pushTypingStatus();
Messages.pushTypingStatus();
}
break;
case 'text':
pushMessage(j.kunjika, j.text, j.reply);
Messages.pushMessage(j.kunjika, j.text, j.reply);
break;
case 'connected':
vayakti[j.kunjika] = j.name;
pushStatus('Vyakti '+j.name+' connected as '+j.kunjika+' at '+currentTime());
if(!$('#vayakti_model').hasClass('.is-hidden')) refreshVayaktiList();
Messages.pushStatus('Vyakti '+j.name+' connected as '+j.kunjika+' at '+Messages.currentTime());
break;
case 'disconnected':
delete vayakti[j.kunjika];
pushStatus('Vyakti '+j.name+' disconnected as '+j.kunjika+' at '+currentTime());
if(!$('#vayakti_model').hasClass('.is-hidden')) refreshVayaktiList();
Messages.pushStatus('Vyakti '+j.name+' disconnected as '+j.kunjika+' at '+Messages.currentTime());
break;
case 'left':
$('#chat_panel').addClass('hidden');
$('#reply_clip').addClass('hidden');
$('#selected_clip').addClass('hidden');
$('#action_clip').addClass('hidden');
$('#connect_panel').removeClass('hidden');
myinfo.kunjika = '';
myinfo.name = '';
State.login();
break;
case 'list':
JSON.parse(j.vayakti).forEach(function(usr) {
@ -173,12 +338,9 @@ socket.addEventListener('message', function (event) {
}
});
var joining = false;
function connect(frm) {
if(joining) return;
joining = true;
if(actions.has_key('join') || actions.has_key('leave')) return;
var frm = $(frm);
$('#progressbar').removeClass('hidden');
var data = {};
frm.serializeArray().forEach(el => {
if(typeof el.value == 'string')
@ -186,162 +348,68 @@ function connect(frm) {
else
data[el.name] = el.value;
});
if(data['length'] !== undefined) {
data['length'] = parseInt(data['length']);
}
callbacks.push(() => {
cleanMessage();
$('#progressbar').addClass('hidden');
$('#send_box').text('');
$('#connect_panel').addClass('hidden');
$('[name="error_msg"]').addClass('hidden');
$('#chat_panel').removeClass('hidden');
$('#send_box').focus();
$('#next_btn').addClass('hidden');
actions.add('join', function() {
Messages.cleanMessage();
myinfo.kunjika = data.kunjika;
myinfo.name = data.name;
no_name_message = false;
joining = false;
vayakti = [];
pushStatus('Connected at '+currentTime());
typing = [];
State.chat();
State.hideProgress();
Messages.pushStatus('Connected at '+Messages.currentTime());
socket.send(JSON.stringify({cmd: 'list'}));
});
socket.send(JSON.stringify(Object.assign({cmd: frm.attr('cmd')}, data)));
})
data = Object.assign({cmd: frm.attr('cmd')}, data);
socket.send(JSON.stringify(data));
}
function connect_next() {
if(joining) return;
joining = true;
$('#progressbar').removeClass('hidden');
callbacks.push(() => {
cleanMessage();
$('#progressbar').addClass('hidden');
$('#send_box').text('');
$('#connect_panel').addClass('hidden');
$('[name="error_msg"]').addClass('hidden');
$('#chat_panel').removeClass('hidden');
$('#send_box').focus();
joining = false;
if(actions.has_key('join') || actions.has_key('leave')) return;
State.showProgress();
actions.add('join', function() {
Messages.cleanMessage();
State.chat();
vayakti = [];
pushStatus('Connected at '+currentTime());
typing = [];
State.hideProgress();
Messages.pushStatus('Connected at '+Messages.currentTime());
socket.send(JSON.stringify({cmd: 'list'}));
});
socket.send(JSON.stringify({ cmd: 'randnext' }));
}
var leaving = false;
function leave() {
if(leaving) return;
leaving = true;
callbacks = [];
callbacks.push(() => {
$('#progressbar').addClass('hidden');
$('#chat_panel').addClass('hidden');
$('#reply_clip').addClass('hidden');
$('#selected_clip').addClass('hidden');
$('#action_clip').addClass('hidden');
$('#connect_panel').removeClass('hidden');
if(actions.has_key('leave')) return;
actions.clear();
actions.add('leave', function() {
myinfo.kunjika = '';
myinfo.name = '';
joining = false;
leaving = false;
State.login();
State.hideProgress();
});
socket.send(JSON.stringify({cmd: 'leave'}));
}
function sendTyping() {
socket.send(JSON.stringify({
cmd: 'leave'
cmd: 'status',
status: 'typing'
}));
}
function pushTypingStatus() {
var elm = $('#status_area > #typing');
if(elm.length > 0) elm.remove();
if(typing.length == 0) return;
var text = '';
typing.forEach((val) => {
text += val + ','
})
text = text.substr(0, text.length-1);
text += ' is typing...'
$('#status_area').append($('<div>', { id: 'typing',
class:'siimple-label siimple--mx-2 siimple--my-0' }).append(text));
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
function pushMessage(sender, text, reply = null) {
var isMe = myinfo.kunjika == sender;
var area = $('#message_area');
var elm = $('<div>', {class: 'message '+(isMe?'message-me':'message-other')});
if(!no_name_message) {
if(sender == myinfo.kunjika)
elm.append($('<div>', {class: 'message-by'}).append('me'))
else
elm.append($('<div>', {class: 'message-by'}).append(vayakti[sender]+'('+sender+')'))
} else {
elm.addClass('siimple--py-1');
}
if(reply != null && reply.length > 0) {
elm.append(
$('<div>', {class: 'message message-reply'})
.append($('<pre>', {class: 'siimple--my-0 siimple--pt-1'}).append(reply))
);
}
elm.append($('<pre>').append(text));
elm.click(function() {
selectMessage(this);
});
area.append(elm);
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
// in message area
function pushStatus(text) {
var area = $('#message_area');
var elm = $('<div>', {class: 'status'});
elm.append($('<span>', {class: 'siimple-tag siimple-tag--dark'}).append(text));
area.append(elm);
var scroll = $("#message_area_scroll");
scroll.scrollTop(scroll[0].scrollHeight);
}
function unselectMessages() {
$('.active').each(function() {
$(this).removeClass('active');
});
$('#selected_clip').addClass('hidden');
}
function selectMessage(t) {
var t = $(t);
t.toggleClass('active');
if($('.active').length == 0)
$('#selected_clip').addClass('hidden');
else
$('#selected_clip').removeClass('hidden');
}
function selectedMessageToText() {
var text = "";
$('.active').each(function() {
$(this).find('pre').each(function() {
text += $(this).text() + '\n'
});
});
return text.trim();
}
function prepareReply() {
var text = selectedMessageToText();
var el = $('#reply_clip');
el.removeClass('hidden');
el.attr('msg', text);
$('#reply_clip > span').text(text.substr(0, 15)+ '...');
unselectMessages();
function sendTypingEnd() {
socket.send(JSON.stringify({
cmd: 'status',
status: 'typing_end'
}));
}
function send() {
@ -354,37 +422,22 @@ function send() {
}));
$('#send_box').val('');
$('#reply_clip').attr('msg', '');
$('#reply_clip').addClass('hidden');
$('#reply_clip').addClass('is-hidden');
$('#reply_clip > span').text('');
}
function copyMessagesToClipboard() {
var $temp = $("<textarea>");
$("body").append($temp);
$temp.val(selectedMessageToText()).select();
document.execCommand("copy");
$temp.remove();
unselectMessages();
}
function cleanMessage() {
$('#message_area').empty();
$('#action_clip').addClass('hidden');
}
function vayaktiList() {
refreshVayaktiList();
$('#vayakti_model').removeClass('is-hidden');
$('#action_clip').addClass('is-hidden');
}
function refreshVayaktiList() {
var v = $('#vayakti_list');
v.empty();
Object.keys(vayakti).forEach((key) => {
v.append($('<div>', {class: 'siimple-table-row'})
.append($('<div>', {class: 'siimple-table-cell'}).append(key))
.append($('<div>', {class: 'siimple-table-cell'}).append(vayakti[key])));
v.append($('<tr>')
.append($('<td>').append(key))
.append($('<td>').append(vayakti[key])));
});
$('#vayakti_model').removeClass('hidden');
$('#action_clip').addClass('hidden');
}
function currentTime() {
var today = new Date();
return today.getHours()+':'+today.getMinutes();
}