Browse Source

update bool in database & add block member in group chat

pull/18/head
Sun 4 years ago
parent
commit
c99cf79b10
  1. 2
      lib/apps/group_chat/models.dart
  2. 31
      src/apps/chat/models.rs
  3. 61
      src/apps/group_chat/models.rs
  4. 1
      src/migrate/group_chat.rs
  5. 10
      src/session.rs

2
lib/apps/group_chat/models.dart

@ -155,6 +155,7 @@ class Member {
String addr; String addr;
String name; String name;
bool isManager; bool isManager;
bool isBlock;
bool online = false; bool online = false;
Member.fromList(List params) { Member.fromList(List params) {
@ -164,6 +165,7 @@ class Member {
this.addr = params[3]; this.addr = params[3];
this.name = params[4]; this.name = params[4];
this.isManager = params[5]; this.isManager = params[5];
this.isBlock = params[6];
} }
Avatar showAvatar({double width = 45.0, colorSurface = true}) { Avatar showAvatar({double width = 45.0, colorSurface = true}) {

31
src/apps/chat/models.rs

@ -356,7 +356,7 @@ impl Friend {
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
self.remark, self.remark,
if self.is_closed { 1 } else { 0 }, self.is_closed,
self.datetime, self.datetime,
); );
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
@ -369,8 +369,8 @@ impl Friend {
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
self.remark, self.remark,
if self.is_closed { 1 } else { 0 }, self.is_closed,
if self.is_deleted { 1 } else { 0 }, self.is_deleted,
self.id self.id
); );
db.update(&sql) db.update(&sql)
@ -541,10 +541,10 @@ impl Request {
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
self.remark, self.remark,
if self.is_me { 1 } else { 0 }, self.is_me,
if self.is_ok { 1 } else { 0 }, self.is_ok,
if self.is_over { 1 } else { 0 }, self.is_over,
if self.is_delivery { 1 } else { 0 }, self.is_delivery,
self.datetime, self.datetime,
); );
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
@ -558,12 +558,12 @@ impl Request {
self.addr.to_hex(), self.addr.to_hex(),
self.name, self.name,
self.remark, self.remark,
if self.is_me { 1 } else { 0 }, self.is_me,
if self.is_ok { 1 } else { 0 }, self.is_ok,
if self.is_over { 1 } else { 0 }, self.is_over,
if self.is_delivery { 1 } else { 0 }, self.is_delivery,
self.datetime, self.datetime,
if self.is_deleted { 1 } else { 0 }, self.is_deleted,
self.id, self.id,
); );
db.update(&sql) db.update(&sql)
@ -722,10 +722,10 @@ impl Message {
"INSERT INTO messages (hash, fid, is_me, m_type, content, is_delivery, datetime, is_deleted) VALUES ('{}',{},{},{},'{}',{},{},false)", "INSERT INTO messages (hash, fid, is_me, m_type, content, is_delivery, datetime, is_deleted) VALUES ('{}',{},{},{},'{}',{},{},false)",
self.hash.to_hex(), self.hash.to_hex(),
self.fid, self.fid,
if self.is_me { 1 } else { 0 }, self.is_me,
self.m_type.to_int(), self.m_type.to_int(),
self.content, self.content,
if self.is_delivery { 1 } else { 0 }, self.is_delivery,
self.datetime, self.datetime,
); );
self.id = db.insert(&sql)?; self.id = db.insert(&sql)?;
@ -735,8 +735,7 @@ impl Message {
pub fn delivery(db: &DStorage, id: i64, is_delivery: bool) -> Result<usize> { pub fn delivery(db: &DStorage, id: i64, is_delivery: bool) -> Result<usize> {
let sql = format!( let sql = format!(
"UPDATE messages SET is_delivery={} WHERE id = {}", "UPDATE messages SET is_delivery={} WHERE id = {}",
if is_delivery { 1 } else { 0 }, is_delivery, id,
id,
); );
db.update(&sql) db.update(&sql)
} }

61
src/apps/group_chat/models.rs

@ -316,9 +316,9 @@ impl GroupChat {
self.g_addr.to_hex(), self.g_addr.to_hex(),
self.g_name, self.g_name,
self.g_bio, self.g_bio,
if self.is_ok { 1 } else { 0 }, self.is_ok,
if self.is_need_agree { 1 } else { 0 }, self.is_need_agree,
if self.is_closed { 1 } else { 0 }, self.is_closed,
self.key.to_hex(), self.key.to_hex(),
self.datetime, self.datetime,
); );
@ -465,11 +465,10 @@ impl Request {
self.name, self.name,
self.remark, self.remark,
self.key.to_hex(), self.key.to_hex(),
if self.is_ok { 1 } else { 0 }, self.is_ok,
if self.is_over { 1 } else { 0 }, self.is_over,
self.datetime, self.datetime,
); );
println!("{}", sql);
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
self.id = id; self.id = id;
Ok(()) Ok(())
@ -490,7 +489,7 @@ impl Request {
let sql = format!( let sql = format!(
"UPDATE requests SET is_ok={}, is_over=1 WHERE gid = '{}' AND is_over = 0", "UPDATE requests SET is_ok={}, is_over=1 WHERE gid = '{}' AND is_over = 0",
if is_ok { 1 } else { 0 }, is_ok,
gcd.to_hex(), gcd.to_hex(),
); );
db.update(&sql)?; db.update(&sql)?;
@ -517,6 +516,8 @@ pub(crate) struct Member {
m_name: String, m_name: String,
/// is group chat manager. /// is group chat manager.
is_manager: bool, is_manager: bool,
/// is member is block by me.
is_block: bool,
/// member's joined time. /// member's joined time.
datetime: i64, datetime: i64,
/// member is leave or delete. /// member is leave or delete.
@ -540,6 +541,7 @@ impl Member {
is_manager, is_manager,
datetime, datetime,
id: 0, id: 0,
is_block: false,
is_deleted: false, is_deleted: false,
} }
} }
@ -552,6 +554,7 @@ impl Member {
self.m_addr.to_hex(), self.m_addr.to_hex(),
self.m_name, self.m_name,
self.is_manager, self.is_manager,
self.is_block,
]) ])
} }
@ -565,6 +568,7 @@ impl Member {
Self { Self {
is_deleted, is_deleted,
datetime: v.pop().unwrap().as_i64(), datetime: v.pop().unwrap().as_i64(),
is_block: v.pop().unwrap().as_bool(),
is_manager: v.pop().unwrap().as_bool(), is_manager: v.pop().unwrap().as_bool(),
m_name: v.pop().unwrap().as_string(), m_name: v.pop().unwrap().as_string(),
m_addr: PeerAddr::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()), m_addr: PeerAddr::from_hex(v.pop().unwrap().as_string()).unwrap_or(Default::default()),
@ -576,7 +580,7 @@ impl Member {
pub fn all(db: &DStorage, fid: &i64) -> Result<Vec<Member>> { pub fn all(db: &DStorage, fid: &i64) -> Result<Vec<Member>> {
let matrix = db.query(&format!( let matrix = db.query(&format!(
"SELECT id, fid, mid, addr, name, is_manager, datetime FROM members WHERE is_deleted = false AND fid = {}", fid))?; "SELECT id, fid, mid, addr, name, is_manager, is_block, datetime FROM members WHERE is_deleted = false AND fid = {}", fid))?;
let mut groups = vec![]; let mut groups = vec![];
for values in matrix { for values in matrix {
groups.push(Member::from_values(values, false)); groups.push(Member::from_values(values, false));
@ -585,12 +589,13 @@ impl Member {
} }
pub fn insert(&mut self, db: &DStorage) -> Result<()> { pub fn insert(&mut self, db: &DStorage) -> Result<()> {
let sql = format!("INSERT INTO members (fid, mid, addr, name, is_manager, datetime, is_deleted) VALUES ({}, '{}', '{}', '{}', {}, {}, false)", let sql = format!("INSERT INTO members (fid, mid, addr, name, is_manager, is_block, datetime, is_deleted) VALUES ({}, '{}', '{}', '{}', {}, {}, {}, false)",
self.fid, self.fid,
self.m_id.to_hex(), self.m_id.to_hex(),
self.m_addr.to_hex(), self.m_addr.to_hex(),
self.m_name, self.m_name,
if self.is_manager { 1 } else { 0 }, self.is_manager,
self.is_block,
self.datetime, self.datetime,
); );
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
@ -611,6 +616,20 @@ impl Member {
} }
} }
/// get member not deleted, not blocked.
pub fn get_ok(db: &DStorage, fid: &i64, mid: &GroupId) -> Result<i64> {
let mut matrix = db.query(&format!(
"SELECT id FROM members WHERE is_deleted = false AND is_block = false AND fid = {} AND mid = '{}'",
fid,
mid.to_hex()
))?;
if matrix.len() > 0 {
Ok(matrix.pop().unwrap().pop().unwrap().as_i64()) // safe unwrap.
} else {
Err(new_io_error("missing member"))
}
}
pub fn update(db: &DStorage, id: &i64, addr: &PeerAddr, name: &str) -> Result<usize> { pub fn update(db: &DStorage, id: &i64, addr: &PeerAddr, name: &str) -> Result<usize> {
let sql = format!( let sql = format!(
"UPDATE members SET addr='{}', name='{}' WHERE id = {}", "UPDATE members SET addr='{}', name='{}' WHERE id = {}",
@ -642,8 +661,6 @@ pub(crate) struct Message {
is_delivery: bool, is_delivery: bool,
/// message created time. /// message created time.
pub datetime: i64, pub datetime: i64,
/// message is deteled
is_deleted: bool,
} }
impl Message { impl Message {
@ -664,7 +681,6 @@ impl Message {
datetime, datetime,
height, height,
is_me, is_me,
is_deleted: false,
is_delivery: true, is_delivery: true,
id: 0, id: 0,
} }
@ -686,15 +702,8 @@ impl Message {
Self::new_with_time(height, fid, mid, is_me, m_type, content, datetime) Self::new_with_time(height, fid, mid, is_me, m_type, content, datetime)
} }
/// here is zero-copy and unwrap is safe. checked. /// here is zero-copy and unwrap is safe. checked.
fn from_values(mut v: Vec<DsValue>, contains_deleted: bool) -> Message { fn from_values(mut v: Vec<DsValue>) -> Message {
let is_deleted = if contains_deleted {
v.pop().unwrap().as_bool()
} else {
false
};
Message { Message {
is_deleted,
datetime: v.pop().unwrap().as_i64(), datetime: v.pop().unwrap().as_i64(),
is_delivery: v.pop().unwrap().as_bool(), is_delivery: v.pop().unwrap().as_bool(),
content: v.pop().unwrap().as_string(), content: v.pop().unwrap().as_string(),
@ -725,7 +734,7 @@ impl Message {
let matrix = db.query(&format!("SELECT id, height, fid, mid, is_me, m_type, content, is_delivery, datetime FROM messages WHERE is_deleted = false AND fid = {}", fid))?; let matrix = db.query(&format!("SELECT id, height, fid, mid, is_me, m_type, content, is_delivery, datetime FROM messages WHERE is_deleted = false AND fid = {}", fid))?;
let mut groups = vec![]; let mut groups = vec![];
for values in matrix { for values in matrix {
groups.push(Message::from_values(values, false)); groups.push(Message::from_values(values));
} }
Ok(groups) Ok(groups)
} }
@ -735,10 +744,10 @@ impl Message {
self.height, self.height,
self.fid, self.fid,
self.mid, self.mid,
if self.is_me { 1 } else { 0 }, self.is_me,
self.m_type.to_int(), self.m_type.to_int(),
self.content, self.content,
if self.is_delivery { 1 } else { 0 }, self.is_delivery,
self.datetime, self.datetime,
); );
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
@ -770,7 +779,7 @@ pub(super) fn from_network_message(
base: &PathBuf, base: &PathBuf,
) -> Result<Message> { ) -> Result<Message> {
let db = group_chat_db(base, mgid)?; let db = group_chat_db(base, mgid)?;
let mdid = Member::get_id(&db, &gdid, &mid)?; let mdid = Member::get_ok(&db, &gdid, &mid)?;
let is_me = &mid == mgid; let is_me = &mid == mgid;
// handle event. // handle event.
@ -821,7 +830,5 @@ pub(super) fn from_network_message(
let mut msg = Message::new_with_time(height, gdid, mdid, is_me, m_type, raw, datetime); let mut msg = Message::new_with_time(height, gdid, mdid, is_me, m_type, raw, datetime);
msg.insert(&db)?; msg.insert(&db)?;
// TODO SESSION UPDATE.
Ok(msg) Ok(msg)
} }

1
src/migrate/group_chat.rs

@ -34,6 +34,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [
addr TEXT NOT NULL, addr TEXT NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,
is_manager INTEGER NOT NULL, is_manager INTEGER NOT NULL,
is_block INTEGER NOT NULL,
datetime INTEGER NOT NULL, datetime INTEGER NOT NULL,
is_deleted INTEGER NOT NULL);", is_deleted INTEGER NOT NULL);",
"CREATE TABLE IF NOT EXISTS messages( "CREATE TABLE IF NOT EXISTS messages(

10
src/session.rs

@ -122,11 +122,11 @@ impl Session {
self.addr.to_hex(), self.addr.to_hex(),
self.s_type.to_int(), self.s_type.to_int(),
self.name, self.name,
if self.is_top { 1 } else { 0 }, self.is_top,
if self.is_close { 1 } else { 0 }, self.is_close,
self.last_datetime, self.last_datetime,
self.last_content, self.last_content,
if self.last_readed { 1 } else { 0 }, self.last_readed,
); );
let id = db.insert(&sql)?; let id = db.insert(&sql)?;
self.id = id; self.id = id;
@ -155,9 +155,7 @@ impl Session {
pub fn update(db: &DStorage, id: &i64, is_top: bool, is_close: bool) -> Result<usize> { pub fn update(db: &DStorage, id: &i64, is_top: bool, is_close: bool) -> Result<usize> {
db.update(&format!( db.update(&format!(
"UPDATE sessions SET is_top = {}, is_close = {} WHERE id = {}", "UPDATE sessions SET is_top = {}, is_close = {} WHERE id = {}",
if is_top { 1 } else { 0 }, is_top, is_close, id
if is_close { 1 } else { 0 },
id
)) ))
} }

Loading…
Cancel
Save