Lots of changes
|
|
@ -1074,7 +1074,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "lupt"
|
||||
version = "0.1.0"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"actix",
|
||||
"actix-broker",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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!")
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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)]
|
||||
|
|
|
|||
102
src/ws_sansad.rs
|
|
@ -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,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%;
|
||||
}
|
||||
}
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
After Width: | Height: | Size: 19 KiB |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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>
|
||||
|
|
|
|||
575
static/js/app.js
|
|
@ -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();
|
||||
}
|
||||