Browse Source

Group: change group event type

pull/18/head
Sun 4 years ago
parent
commit
2de84011fa
  1. 4
      lib/session.dart
  2. 48
      src/apps/group/layer.rs
  3. 7
      src/apps/group/models/group.rs
  4. 2
      src/apps/group/rpc.rs
  5. 7
      src/rpc.rs
  6. 29
      src/session.rs

4
lib/session.dart

@ -182,7 +182,9 @@ class Session { @@ -182,7 +182,9 @@ class Session {
}
update(List params) {
this.addr = params[1];
if (params[1].length > 2) {
this.addr = params[1];
}
this.name = params[2];
this.isTop = params[3];
}

48
src/apps/group/layer.rs

@ -13,7 +13,10 @@ use tdn_did::Proof; @@ -13,7 +13,10 @@ use tdn_did::Proof;
use crate::apps::chat::Friend;
use crate::layer::{Layer, Online};
use crate::rpc::{session_close, session_connect, session_last, session_lost, session_suspend};
use crate::rpc::{
session_close, session_connect, session_last, session_lost, session_suspend,
session_update_name,
};
use crate::session::{connect_session, Session, SessionType};
use crate::storage::{chat_db, delete_avatar, group_db, session_db, write_avatar_sync};
@ -78,9 +81,10 @@ async fn handle_server_connect( @@ -78,9 +81,10 @@ async fn handle_server_connect(
let (ogid, height, id) = layer.read().await.running(&gcd)?.owner_height_id();
// check is member.
let db = group_db(&layer.read().await.base, &ogid)?;
let g = GroupChat::get(&db, &id)?;
let mdid = Member::get_id(&db, &id, &fgid)?;
let res = LayerResult(gcd, height);
let res = LayerResult(gcd, g.g_name, height);
let data = bincode::serialize(&res).unwrap_or(vec![]);
let s = SendType::Result(0, addr.clone(), true, false, data);
add_server_layer(results, fgid, s);
@ -164,7 +168,7 @@ fn handle_connect( @@ -164,7 +168,7 @@ fn handle_connect(
results: &mut HandleResult,
) -> Result<()> {
// 0. deserialize result.
let LayerResult(gcd, height) = bincode::deserialize(&data)?;
let LayerResult(gcd, gname, height) = bincode::deserialize(&data)?;
// 1. check group.
let db = group_db(layer.base(), &ogid)?;
@ -175,6 +179,8 @@ fn handle_connect( @@ -175,6 +179,8 @@ fn handle_connect(
return Err(anyhow!("invalid group chat address."));
}
let _ = GroupChat::update_name(&db, &group.id, &gname);
// 1.1 get session.
let session_some = connect_session(
layer.base(),
@ -188,6 +194,9 @@ fn handle_connect( @@ -188,6 +194,9 @@ fn handle_connect(
}
let sid = session_some.unwrap().id;
let _ = Session::update_name(&session_db(layer.base(), &ogid)?, &sid, &gname);
results.rpcs.push(session_update_name(ogid, &sid, &gname));
// 1.2 online this group.
layer
.running_mut(&ogid)?
@ -243,6 +252,17 @@ async fn handle_server_event( @@ -243,6 +252,17 @@ async fn handle_server_event(
// 3. broadcast offline event.
broadcast(&LayerEvent::MemberOffline(gcd, fgid), layer, &gcd, results).await?;
}
LayerEvent::GroupName(_gcd, name) => {
let _ = GroupChat::update_name(&db, &id, &name)?;
if let Ok(sid) = Session::update_name_by_id(
&session_db(&base, &ogid)?,
&id,
&SessionType::Group,
&name,
) {
results.rpcs.push(session_update_name(ogid, &sid, &name));
}
}
LayerEvent::Sync(gcd, _, event) => {
match event {
Event::MemberJoin(mgid, maddr, mname, mavatar) => {
@ -304,7 +324,6 @@ async fn handle_server_event( @@ -304,7 +324,6 @@ async fn handle_server_event(
// UPDATE SESSION.
update_session(&base, &ogid, &id, &msg, results);
}
_ => error!("group server handle close nerver here"),
}
}
LayerEvent::MemberOnlineSync(gcd) => {
@ -411,19 +430,20 @@ async fn handle_peer_event( @@ -411,19 +430,20 @@ async fn handle_peer_event(
}
}
}
LayerEvent::Sync(gcd, height, event) => {
LayerEvent::GroupName(_gcd, name) => {
let _ = GroupChat::update_name(&db, &id, &name)?;
let _ = Session::update_name(&session_db(&base, &ogid)?, &sid, &name);
results.rpcs.push(session_update_name(ogid, &sid, &name));
}
LayerEvent::GroupClose(_gcd) => {
let group = GroupChat::close(&db, &gcd)?;
let sid = Session::close(&session_db(&base, &ogid)?, &group.id, &SessionType::Group)?;
results.rpcs.push(session_close(ogid, &sid));
}
LayerEvent::Sync(_gcd, height, event) => {
debug!("Sync: handle height: {}", height);
match event {
Event::GroupTransfer(_addr) => {
// TOOD transfer.
}
Event::GroupClose => {
let group = GroupChat::close(&db, &gcd)?;
let sid =
Session::close(&session_db(&base, &ogid)?, &group.id, &SessionType::Group)?;
results.rpcs.push(session_close(ogid, &sid));
}
Event::MemberJoin(mgid, maddr, mname, mavatar) => {
let mdid_res = Member::get_id(&db, &id, &mgid);
if let Ok(mdid) = mdid_res {

7
src/apps/group/models/group.rs

@ -178,7 +178,12 @@ impl GroupChat { @@ -178,7 +178,12 @@ impl GroupChat {
}
pub fn add_height(db: &DStorage, id: i64, height: i64) -> Result<usize> {
let sql = format!("UPDATE groups SET height={} WHERE id = {}", height, id,);
let sql = format!("UPDATE groups SET height={} WHERE id = {}", height, id);
db.update(&sql)
}
pub fn update_name(db: &DStorage, id: &i64, name: &str) -> Result<usize> {
let sql = format!("UPDATE groups SET name='{}' WHERE id = {}", name, id);
db.update(&sql)
}

2
src/apps/group/rpc.rs

@ -300,7 +300,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -300,7 +300,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
if group.g_addr == addr {
// dissolve group.
let data = bincode::serialize(&LayerEvent::Sync(gcd, 0, Event::GroupClose))?;
let data = bincode::serialize(&LayerEvent::GroupClose(gcd))?;
for (mgid, maddr) in state.layer.read().await.running(&gcd)?.onlines() {
let s = SendType::Event(0, *maddr, data.clone());
add_server_layer(&mut results, *mgid, s);

7
src/rpc.rs

@ -92,7 +92,12 @@ pub(crate) fn notice_menu(mgid: GroupId, t: &SessionType) -> RpcParam { @@ -92,7 +92,12 @@ pub(crate) fn notice_menu(mgid: GroupId, t: &SessionType) -> RpcParam {
}
#[inline]
pub(crate) fn _session_update(
pub(crate) fn session_update_name(mgid: GroupId, id: &i64, name: &str) -> RpcParam {
rpc_response(0, "session-update", json!([id, "", name, false]), mgid)
}
#[inline]
pub(crate) fn session_update(
mgid: GroupId,
id: &i64,
addr: &PeerId,

29
src/session.rs

@ -170,6 +170,35 @@ impl Session { @@ -170,6 +170,35 @@ impl Session {
))
}
pub fn update_name(db: &DStorage, id: &i64, name: &str) -> Result<usize> {
db.update(&format!(
"UPDATE sessions SET name='{}' WHERE id = {}",
name, id
))
}
pub fn update_name_by_id(
db: &DStorage,
fid: &i64,
s_type: &SessionType,
name: &str,
) -> Result<i64> {
let sql = format!(
"SELECT id from sessions WHERE fid = {} AND s_type = {}",
fid,
s_type.to_int()
);
let mut matrix = db.query(&sql)?;
if let Some(mut values) = matrix.pop() {
let id = values.pop().unwrap().as_i64(); // safe unwrap.
let s = format!("UPDATE sessions SET name = '{}' WHERE id = {}", name, id);
db.update(&s)?;
Ok(id)
} else {
Err(anyhow!("session missing"))
}
}
pub fn delete(db: &DStorage, fid: &i64, s_type: &SessionType) -> Result<i64> {
let sql = format!(
"SELECT id from sessions WHERE fid = {} AND s_type = {}",

Loading…
Cancel
Save