almost finalised just image left

This commit is contained in:
Piyush मिश्रः 2021-02-21 20:58:37 +05:30
parent c5d81fb30d
commit b5c0bd6740
11 changed files with 406 additions and 77 deletions

View File

@ -4,7 +4,6 @@ use std::{collections::HashMap, vec};
use actix::prelude::*;
use actix_broker::BrokerSubscribe;
use ms::Resp;
use crate::{ws_sansad, messages as ms};
@ -51,12 +50,12 @@ impl Actor for ChatPinnd {
/// Join grih
impl Handler<ms::JoinGrih> for ChatPinnd {
type Result = Resp;
type Result = ms::Resp;
fn handle(&mut self, msg: ms::JoinGrih, _: &mut Self::Context) -> Self::Result {
// check if user exist
if let Some(_) = self.vyaktigat_waitlist.iter().position(|vk| vk.kunjika == msg.kunjika) {
return Resp::Err("Kunjika already exist".to_owned());
return ms::Resp::Err("Kunjika already exist".to_owned());
}
if let Some(_) = self.grih.iter().position(|(_,g)| {
@ -65,7 +64,7 @@ impl Handler<ms::JoinGrih> for ChatPinnd {
None => false
}
}) {
return Resp::Err("Kunjika already exist".to_owned());
return ms::Resp::Err("Kunjika already exist".to_owned());
}
// check if grih exist and add user
@ -74,7 +73,7 @@ impl Handler<ms::JoinGrih> for ChatPinnd {
// check if grih have no space left
if let Some(n) = grih.length {
if grih.loog.len() >= n {
return Resp::Err("Grih have no space".to_owned());
return ms::Resp::Err("Grih have no space".to_owned());
}
}
@ -101,7 +100,7 @@ impl Handler<ms::JoinGrih> for ChatPinnd {
}
}
Resp::Ok
ms::Resp::Ok
}
}
@ -110,11 +109,11 @@ impl Handler<ms::JoinGrih> for ChatPinnd {
/// Check if watchlist is empty, if yes add the kunjika andaddr to watchlist
/// if watchlist have people get 0th person an connect it
impl Handler<ms::JoinRandom> for ChatPinnd {
type Result = Resp;
type Result = ms::Resp;
fn handle(&mut self, msg: ms::JoinRandom, _: &mut Self::Context) -> Self::Result {
// check if user exist
if let Some(_) = self.vyaktigat_waitlist.iter().position(|vk| vk.kunjika == msg.kunjika) {
return Resp::Err("Kunjika already exist".to_owned());
return ms::Resp::Err("Kunjika already exist".to_owned());
}
if let Some(_) = self.grih.iter().position(|(_,g)| {
@ -123,7 +122,7 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
None => false
}
}) {
return Resp::Err("Kunjika already exist".to_owned());
return ms::Resp::Err("Kunjika already exist".to_owned());
}
// Check if watch list is empty
@ -134,7 +133,7 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
name: msg.name,
tags: msg.tags
});
return Resp::None;
return ms::Resp::None;
}
// connect person with tag
@ -153,7 +152,7 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
name: msg.name,
tags: msg.tags
});
return Resp::None;
return ms::Resp::None;
}
}
} else { 0 };
@ -178,13 +177,13 @@ impl Handler<ms::JoinRandom> for ChatPinnd {
grih_kunjika: group_kunjika
});
Resp::Ok
ms::Resp::Ok
}
}
/// Next Random user
impl Handler<ms::JoinRandomNext> for ChatPinnd {
type Result = Resp;
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();
@ -195,10 +194,10 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
let tags;
{
let loog = grih.loog.get(0).unwrap();
let loog = grih.loog.get(loog_i).unwrap();
if let None = loog.tags {
return Resp::Err("You are not a randome vyakti!".to_owned());
return ms::Resp::Err("You are not a randome vyakti!".to_owned());
}
addr = loog.addr.clone();
@ -206,6 +205,15 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
tags = loog.tags.clone().unwrap();
}
// remove from old grih
grih.loog.remove(loog_i);
grih.loog.iter().for_each(|a| {
a.addr.do_send(ms::WsDisconnected {
kunjika: msg.kunjika.to_owned(),
name: name.to_owned()
})
});
// Check if watch list is empty
if self.vyaktigat_waitlist.len() == 0 {
self.vyaktigat_waitlist.push(VyaktiWatchlist {
@ -214,38 +222,31 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
name,
tags
});
return Resp::None;
return ms::Resp::None;
}
// connect person with tag or to zero
let tags = tags.clone();
let pos = match self.vyaktigat_waitlist.iter().position(|vk| {
match vk.tags.iter().position(|t| tags.contains(t)) {
Some(_) => true,
None => false
let pos = if tags.len() > 0 {
match self.vyaktigat_waitlist.iter().position(|vk| {
match vk.tags.iter().position(|t| tags.contains(t)) {
Some(_) => true,
None => false
}
}) {
Some(i) => i,
None => {
self.vyaktigat_waitlist.push(VyaktiWatchlist {
kunjika: msg.kunjika,
addr,
name,
tags
});
return ms::Resp::None;
}
}
}) {
Some(i) => i,
None => {
self.vyaktigat_waitlist.push(VyaktiWatchlist {
kunjika: msg.kunjika,
addr,
name,
tags
});
return Resp::None;
}
};
} else { 0 };
let vayakti_watchlist = self.vyaktigat_waitlist.remove(pos);
let group_kunjika = format!("gupt_{}>{}",msg.kunjika.to_owned(), vayakti_watchlist.kunjika);
grih.loog.remove(loog_i);
grih.loog.iter().for_each(|a| {
a.addr.do_send(ms::WsDisconnected {
kunjika: msg.kunjika.to_owned(),
name: name.to_owned()
})
});
let log_count = grih.loog.len();
drop(grih);
if log_count == 0 {
@ -256,7 +257,6 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
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()))]
});
// notify about connection
addr.do_send(ms::WsConnectedRandom {
name: vayakti_watchlist.name,
@ -270,7 +270,7 @@ impl Handler<ms::JoinRandomNext> for ChatPinnd {
grih_kunjika: group_kunjika
});
Resp::Ok
ms::Resp::Ok
}
}

View File

@ -128,6 +128,7 @@ pub struct WsConnectedRandom {
pub grih_kunjika: String
}
//################################################## Helper ##################################################
#[derive(Debug)]
pub enum Resp {
Ok,
Err(String),

View File

@ -13,11 +13,16 @@ const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(5);
/// How long before lack of client response causes a timeout
const CLIENT_TIMEOUT: Duration = Duration::from_secs(10);
// for phones if browser kept websocket on
const SPECIAL_HEARTBEAT_INTERVAL: Duration = Duration::from_secs(5*60);
const SPECIAL_CLIENT_TIMEOUT: Duration = Duration::from_secs(6*60);
pub struct WsSansad {
kunjika: String,
isthiti: Isthiti,
addr: Option<Addr<Self>>,
hb: Instant
hb: Instant,
special_hb: Instant
}
#[derive(Debug)]
@ -33,6 +38,7 @@ impl Actor for WsSansad {
fn started(&mut self, ctx: &mut Self::Context) {
self.addr = Some(ctx.address().clone()); // own addr
self.hb(ctx);
self.special_hb(ctx);
}
fn stopping(&mut self, _: &mut Self::Context) -> Running {
@ -51,6 +57,7 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WsSansad {
}, Ok(ws::Message::Pong(_)) => {
self.hb = Instant::now();
}, Ok(ws::Message::Text(msg)) => {
self.special_hb = Instant::now();
futures::executor::block_on(self.parse_text_handle(msg));
}, Ok(ws::Message::Close(msg)) => {
ctx.close(msg);
@ -160,7 +167,8 @@ impl WsSansad {
kunjika: String::new(),
isthiti: Isthiti::None,
addr: None,
hb: Instant::now()
hb: Instant::now(),
special_hb: Instant::now()
}
}
@ -184,6 +192,24 @@ impl WsSansad {
});
}
/// helper method that sends ping to client every second.
///
/// also this method checks heartbeats from client
fn special_hb(&self, ctx: &mut <Self as Actor>::Context) {
ctx.run_interval(SPECIAL_HEARTBEAT_INTERVAL, |act, ctx| {
// check client heartbeats
if Instant::now().duration_since(act.special_hb) > SPECIAL_CLIENT_TIMEOUT {
// heartbeat timed out
// stop actor
ctx.stop();
// don't try to send a ping
return;
}
});
}
/// 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) {
@ -300,7 +326,7 @@ impl WsSansad {
};
// request
let result: Resp = ChatPinnd::from_registry().send(ms::JoinRandomNext{
let result: Resp = ChatPinnd::from_registry().send(ms::JoinRandomNext {
kunjika: self.kunjika.to_owned(),
grih_kunjika: grih_kunjika.to_owned(),
}).await.unwrap();

View File

@ -21,6 +21,7 @@ textarea {
height: 10px !important;
position: fixed;
top: 0; left: 0; right: 0;
z-index: 99999;
}
.cover-screen {

95
static/img/back.svg Normal file
View File

@ -0,0 +1,95 @@
<?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="Capa_1"
x="0px"
y="0px"
viewBox="0 0 477.175 477.175"
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
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
id="defs39" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="738"
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:window-maximized="0"
inkscape:current-layer="Capa_1" />
<g
id="g4"
style="fill:#f9f9f9">
<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" />
</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="g34">
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

95
static/img/next.svg Normal file
View File

@ -0,0 +1,95 @@
<?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="Capa_1"
x="0px"
y="0px"
viewBox="0 0 477.175 477.175"
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
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
id="defs39" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="738"
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:window-maximized="0"
inkscape:current-layer="Capa_1" />
<g
id="g4"
style="fill:#f9f9f9">
<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" />
</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="g34">
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -15,7 +15,7 @@
<!-- Connect Screen -->
<div id="connect_panel" class="siimple-content siimple-content--extra-small">
<div class="siimple--px-5 siimple--py-5">
<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>
@ -74,9 +74,12 @@
</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>
</div>
<div class="siimple-footer" align="center">
Made with ❤️️ by <a href="http://github.com/PiyushXCoder" class="siimple-link">Piyush Mishra</a>
Made with ❤️️ by <a href="https://gitlab.com/PiyushXCoder" class="siimple-link">Piyush Mishra</a>
</div>
</div>
@ -85,11 +88,11 @@
<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">&leftarrow; Back</a>
<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 &rightarrow;</a>
<a id="next_btn" onclick="connect_next()" class="siimple-navbar-item">Next <img src="img/next.svg" alt="" height="12px"> </a>
</div>
</div>
<div id="message_area_scroll" style="height: calc(100% - 2*44px - 2*5px); padding: 5px; overflow-y: scroll;" class="siimple--bg-light">
@ -130,7 +133,7 @@
<!-- Action Clip -->
<div id="action_clip" class="clip-win action-clip siimple--bg-white hidden">
<div class="siimple--my-1">
<div class="siimple--my-1 hidden">
<div class="siimple-btn siimple-btn--light">
<img src="img/image.svg" alt="Image" width="50" class="siimple--py-2 siimple--px-2">
<div>send image</div>

View File

@ -39,7 +39,7 @@ $(document).ready(() => {
timeout = setTimeout(function() {
send_typing = false;
sendTypingEnd();
},3000);
},2000);
});
$('#send_box').keypress(function(e) {
if(e.originalEvent.charCode == 13 && !e.shiftKey) {
@ -99,7 +99,7 @@ var no_name_message = false;
// Connection opened
socket.addEventListener('open', function (event) {
$('#progressbar').toggleClass('hidden');
$('#progressbar').addClass('hidden');
});
// Listen for messages
@ -127,10 +127,9 @@ socket.addEventListener('message', function (event) {
case 'random':
callbacks[0]();
callbacks = [];
no_name_message = true;
$('#next_btn').removeClass('hidden');
no_name_message = true;
pushStatus('Say hi to '+j.name);
vayakti[j.kunjika] = j.name;
break;
case 'status':
if(j.status == "typing") {
@ -153,6 +152,15 @@ socket.addEventListener('message', function (event) {
delete vayakti[j.kunjika];
pushStatus('Vyakti '+j.name+' disconnected as '+j.kunjika+' at '+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 = '';
break;
case 'list':
JSON.parse(j.vayakti).forEach(function(usr) {
vayakti[usr[0]] = usr[1];
@ -187,6 +195,7 @@ function connect(frm) {
myinfo.name = data.name;
no_name_message = false;
joining = false;
vayakti = [];
pushStatus('Connected at '+currentTime());
socket.send(JSON.stringify({cmd: 'list'}));
});
@ -205,15 +214,18 @@ function connect_next() {
$('[name="error_msg"]').addClass('hidden');
$('#chat_panel').removeClass('hidden');
$('#send_box').focus();
$('#next_btn').addClass('hidden');
joining = false;
vayakti = [];
pushStatus('Connected at '+currentTime());
socket.send(JSON.stringify({cmd: 'list'}));
});
socket.send(JSON.stringify({ cmd: 'randnext' }));
}
function leave() {
callbacks = [];
callbacks.push(() => {
$('#progressbar').addClass('hidden');
$('#chat_panel').addClass('hidden');
$('#reply_clip').addClass('hidden');
$('#selected_clip').addClass('hidden');
@ -221,6 +233,7 @@ function leave() {
$('#connect_panel').removeClass('hidden');
myinfo.kunjika = '';
myinfo.name = '';
joining = false;
});
socket.send(JSON.stringify({
cmd: 'leave'

61
static/policy.html Normal file
View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="css/siimple.min.css">
<link rel="stylesheet" href="css/style.css">
<title>Lupt Chat</title>
</head>
<body>
<!-- Connect Screen -->
<div id="connect_panel" class="siimple-content siimple-content--medium">
<div class="siimple-content siimple-content--fluid">
<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%; max-width: 500px; height: auto;"></div>
<div class="siimple-jumbotron-detail">Chat in group or to strangers</div>
<div class="siimple-jumbotron-title">Privacy Policy</div>
</div>
<pre>
<b>Who am I?</b>
lupt is operated by a hobbist
<b>INTRODUCTION</b>
I strongly believe in protecting the privacy of individuals who visit our website and use our products and services (collectively, the “Terms of Service”). This Policy explains how I collect, use, disclose, and protect information that applies to our Service, and your choices about the collection and use of your personal and other information.
For purposes of this Policy, personal information means information relating to an identified or identifiable natural person. An identifiable person is one who can be identified, directly or indirectly, in particular by reference to an identifier such as a name, an identification number, location data, and online identifier or to one or more factors specific to his/her physical, physiological, genetic, mental, economic, cultural or social identity.
<b>1. Shares your data</b>
lupt never shares you data with third parties.
<b>2. Storing data</b>
lupt stores only the data it needs to function properly.
No personal information is stored on our servers.
All the messages are self-destructing.
<b>3. Not intended for use by children</b>
lupt is not directed at children who are under thirteen (13) years of age and I do not knowingly collect personal or other information from such children. If you are younger than thirteen (13) years of age, you should not use Our application and if you are between the ages of thirteen (13) and eighteen (18) you must have parental consent and you should not provide any personal identifiable information while using lupt without said parental consent.
<b>3. Cookies policy</b>
I collect information by placing cookies on your computer or mobile. A cookie is a piece of text stored on your computer or mobile by your web browser. They are basically a tool that stores information about website visits, and ensures site functionality and enables us to provide the services our members request.
When you visit the publicly available sections of lupt, a session ID cookie is placed on your computer that only lasts while you're visiting.
You may set your browser and your mobile settings to block cookies and local storage devices.
lupt's use of cookies and local storage devices basically falls into the following categories:
• cookies related to the performance of lupt's site, such as analytics that help us determine how our site is performing and ensuring a smooth and trouble free experience for our members and visitors;
• application-related data such as current opponent id which is removed right after conversation is over.
<b>4. Changes to our Policy</b>
I may modify or update this Privacy Policy from time to time to reflect the changes in our business and practices, and so you should review this page periodically. When I change the Policy in a material manner I will update the last modified date at the bottom of this page. Your continued use of the Service constitutes your agreement to be bound by such changes to this Policy. Your only remedy, if you do not accept the terms of this Policy, is to discontinue use of the Service.
This privacy policy was last modified on (शुक्ल पक्ष, नवमी, २०७७ विक्रम सम्वत्) Sukla paskha, navmi, 2077 as per <a class="siimple-link" href="https://bharatdiscovery.org/india/%E0%A4%B5%E0%A4%BF%E0%A4%95%E0%A5%8D%E0%A4%B0%E0%A4%AE_%E0%A4%B8%E0%A4%82%E0%A4%B5%E0%A4%A4">Vikram Samvat</a>
</pre>
</div>
<div class="siimple-footer" align="center">
Made with ❤️️ by <a href="https://gitlab.com/PiyushXCoder" class="siimple-link">Piyush Mishra</a>
</div>
</div>
<script src="js/jquery-3.5.1.min.js"></script>
</body>
</html>

53
static/terms.html Normal file
View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="css/siimple.min.css">
<link rel="stylesheet" href="css/style.css">
<title>Lupt Chat</title>
</head>
<body>
<!-- Connect Screen -->
<div id="connect_panel" class="siimple-content siimple-content--medium">
<div class="siimple-content siimple-content--fluid">
<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%; max-width: 500px; height: auto;"></div>
<div class="siimple-jumbotron-detail">Chat in group or to strangers</div>
<div class="siimple-jumbotron-title">Terms of service</div>
</div>
<pre>
This Terms of Service Agreement (hereinafter "Agreement") sets forth the terms and conditions by which I provide the lupt Application Services to site visitors, users. By visiting our site, using any of the tools and services provided via our site, you thereby agree to be bound by each of the terms and conditions of this Agreement.
I may automatically amend this Agreement at any time by informing you of the amended terms. For user to lupt it is their responsibility to read this Terms of Service each time they access any portion of our site. Any usage of this site by you, including merely viewing our home page or any page published on our site, as an unregistered lupt's user, means that you agree to be bound by each and every one of the terms and conditions of this Terms of Service Agreement.
<b>1. General</b>
lupt is always striving to improve the Service and bring you additional functionality that you will find engaging and useful. This means I may add new product features or enhancements from time to time as well as remove some features, and if these actions do not materially affect your rights or obligations, I may not provide you with notice before taking them.
<b>2. Privacy vs Violations</b>
No third parties can access the content you share in the app.
Despite the fact that this space is anonymous and secure, users are obliged to follow the rules. I will never support terrorism, pedophilia, violence, underaged users, pornography, bullying or other restrictive behavior.
<b>3. Community Rules.</b>
By using the Service, you agree that you will not:
use the Service for any purpose that is illegal or prohibited by this Agreement.
use the Service for any harmful or nefarious purpose.
use the Service in order to damage lupt.
spam, solicit money from or defraud any users.
impersonate any person or entity or post any images of another person without his or her permission.
bully, “stalk,” intimidate, assault, harass, mistreat or defame any person.
post any Content that violates or infringes anyones rights, including rights of publicity, privacy, copyright, trademark or other intellectual property or contract right.
post any Content that is hate speech, threatening, sexually explicit or pornographic; incites violence; or contains nudity or graphic or gratuitous violence.
post any Content that promotes racism, bigotry, hatred or physical harm of any kind against any group or individual.
</pre>
</div>
<div class="siimple-footer" align="center">
Made with ❤️️ by <a href="https://gitlab.com/PiyushXCoder" class="siimple-link">Piyush Mishra</a>
</div>
</div>
<script src="js/jquery-3.5.1.min.js"></script>
</body>
</html>

View File

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/siimple@3.3.1/dist/siimple.min.css">
<title>Document</title>
</head>
<body>
<div class="siimple-navbar">
<a class="siimple-navbar-title">Title</a>
<div class="siimple--float-right">
<a class="siimple-navbar-item">Link 1</a>
<a class="siimple-navbar-item">Link 2</a>
</div>
</div>
</body>
</html>