diff --git a/lib/apps/group_chat/models.dart b/lib/apps/group_chat/models.dart index e1557d5..609c304 100644 --- a/lib/apps/group_chat/models.dart +++ b/lib/apps/group_chat/models.dart @@ -155,6 +155,7 @@ class Member { String addr; String name; bool isManager; + bool isBlock; bool online = false; Member.fromList(List params) { @@ -164,6 +165,7 @@ class Member { this.addr = params[3]; this.name = params[4]; this.isManager = params[5]; + this.isBlock = params[6]; } Avatar showAvatar({double width = 45.0, colorSurface = true}) { diff --git a/src/apps/chat/models.rs b/src/apps/chat/models.rs index fca03fb..4df01fb 100644 --- a/src/apps/chat/models.rs +++ b/src/apps/chat/models.rs @@ -356,7 +356,7 @@ impl Friend { self.addr.to_hex(), self.name, self.remark, - if self.is_closed { 1 } else { 0 }, + self.is_closed, self.datetime, ); let id = db.insert(&sql)?; @@ -369,8 +369,8 @@ impl Friend { self.addr.to_hex(), self.name, self.remark, - if self.is_closed { 1 } else { 0 }, - if self.is_deleted { 1 } else { 0 }, + self.is_closed, + self.is_deleted, self.id ); db.update(&sql) @@ -541,10 +541,10 @@ impl Request { self.addr.to_hex(), self.name, self.remark, - if self.is_me { 1 } else { 0 }, - if self.is_ok { 1 } else { 0 }, - if self.is_over { 1 } else { 0 }, - if self.is_delivery { 1 } else { 0 }, + self.is_me, + self.is_ok, + self.is_over, + self.is_delivery, self.datetime, ); let id = db.insert(&sql)?; @@ -558,12 +558,12 @@ impl Request { self.addr.to_hex(), self.name, self.remark, - if self.is_me { 1 } else { 0 }, - if self.is_ok { 1 } else { 0 }, - if self.is_over { 1 } else { 0 }, - if self.is_delivery { 1 } else { 0 }, + self.is_me, + self.is_ok, + self.is_over, + self.is_delivery, self.datetime, - if self.is_deleted { 1 } else { 0 }, + self.is_deleted, self.id, ); 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)", self.hash.to_hex(), self.fid, - if self.is_me { 1 } else { 0 }, + self.is_me, self.m_type.to_int(), self.content, - if self.is_delivery { 1 } else { 0 }, + self.is_delivery, self.datetime, ); self.id = db.insert(&sql)?; @@ -735,8 +735,7 @@ impl Message { pub fn delivery(db: &DStorage, id: i64, is_delivery: bool) -> Result { let sql = format!( "UPDATE messages SET is_delivery={} WHERE id = {}", - if is_delivery { 1 } else { 0 }, - id, + is_delivery, id, ); db.update(&sql) } diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index 980f104..d8bcbdd 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -316,9 +316,9 @@ impl GroupChat { self.g_addr.to_hex(), self.g_name, self.g_bio, - if self.is_ok { 1 } else { 0 }, - if self.is_need_agree { 1 } else { 0 }, - if self.is_closed { 1 } else { 0 }, + self.is_ok, + self.is_need_agree, + self.is_closed, self.key.to_hex(), self.datetime, ); @@ -465,11 +465,10 @@ impl Request { self.name, self.remark, self.key.to_hex(), - if self.is_ok { 1 } else { 0 }, - if self.is_over { 1 } else { 0 }, + self.is_ok, + self.is_over, self.datetime, ); - println!("{}", sql); let id = db.insert(&sql)?; self.id = id; Ok(()) @@ -490,7 +489,7 @@ impl Request { let sql = format!( "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(), ); db.update(&sql)?; @@ -517,6 +516,8 @@ pub(crate) struct Member { m_name: String, /// is group chat manager. is_manager: bool, + /// is member is block by me. + is_block: bool, /// member's joined time. datetime: i64, /// member is leave or delete. @@ -540,6 +541,7 @@ impl Member { is_manager, datetime, id: 0, + is_block: false, is_deleted: false, } } @@ -552,6 +554,7 @@ impl Member { self.m_addr.to_hex(), self.m_name, self.is_manager, + self.is_block, ]) } @@ -565,6 +568,7 @@ impl Member { Self { is_deleted, datetime: v.pop().unwrap().as_i64(), + is_block: v.pop().unwrap().as_bool(), is_manager: v.pop().unwrap().as_bool(), m_name: v.pop().unwrap().as_string(), 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> { 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![]; for values in matrix { groups.push(Member::from_values(values, false)); @@ -585,12 +589,13 @@ impl Member { } 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.m_id.to_hex(), self.m_addr.to_hex(), self.m_name, - if self.is_manager { 1 } else { 0 }, + self.is_manager, + self.is_block, self.datetime, ); 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 { + 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 { let sql = format!( "UPDATE members SET addr='{}', name='{}' WHERE id = {}", @@ -642,8 +661,6 @@ pub(crate) struct Message { is_delivery: bool, /// message created time. pub datetime: i64, - /// message is deteled - is_deleted: bool, } impl Message { @@ -664,7 +681,6 @@ impl Message { datetime, height, is_me, - is_deleted: false, is_delivery: true, id: 0, } @@ -686,15 +702,8 @@ impl Message { Self::new_with_time(height, fid, mid, is_me, m_type, content, datetime) } /// here is zero-copy and unwrap is safe. checked. - fn from_values(mut v: Vec, contains_deleted: bool) -> Message { - let is_deleted = if contains_deleted { - v.pop().unwrap().as_bool() - } else { - false - }; - + fn from_values(mut v: Vec) -> Message { Message { - is_deleted, datetime: v.pop().unwrap().as_i64(), is_delivery: v.pop().unwrap().as_bool(), 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 mut groups = vec![]; for values in matrix { - groups.push(Message::from_values(values, false)); + groups.push(Message::from_values(values)); } Ok(groups) } @@ -735,10 +744,10 @@ impl Message { self.height, self.fid, self.mid, - if self.is_me { 1 } else { 0 }, + self.is_me, self.m_type.to_int(), self.content, - if self.is_delivery { 1 } else { 0 }, + self.is_delivery, self.datetime, ); let id = db.insert(&sql)?; @@ -770,7 +779,7 @@ pub(super) fn from_network_message( base: &PathBuf, ) -> Result { 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; // 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); msg.insert(&db)?; - // TODO SESSION UPDATE. - Ok(msg) } diff --git a/src/migrate/group_chat.rs b/src/migrate/group_chat.rs index 80c8d84..54b28c6 100644 --- a/src/migrate/group_chat.rs +++ b/src/migrate/group_chat.rs @@ -34,6 +34,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [ addr TEXT NOT NULL, name TEXT NOT NULL, is_manager INTEGER NOT NULL, + is_block INTEGER NOT NULL, datetime INTEGER NOT NULL, is_deleted INTEGER NOT NULL);", "CREATE TABLE IF NOT EXISTS messages( diff --git a/src/session.rs b/src/session.rs index d1725a1..7778cdf 100644 --- a/src/session.rs +++ b/src/session.rs @@ -122,11 +122,11 @@ impl Session { self.addr.to_hex(), self.s_type.to_int(), self.name, - if self.is_top { 1 } else { 0 }, - if self.is_close { 1 } else { 0 }, + self.is_top, + self.is_close, self.last_datetime, self.last_content, - if self.last_readed { 1 } else { 0 }, + self.last_readed, ); let id = db.insert(&sql)?; self.id = id; @@ -155,9 +155,7 @@ impl Session { pub fn update(db: &DStorage, id: &i64, is_top: bool, is_close: bool) -> Result { db.update(&format!( "UPDATE sessions SET is_top = {}, is_close = {} WHERE id = {}", - if is_top { 1 } else { 0 }, - if is_close { 1 } else { 0 }, - id + is_top, is_close, id )) }