TeamTalk 添加修改群组名功能
此为信令扩展部分 关键部分如下
1定义群组CMD
pb/IM.BaseDefine.proto
CID_GROUP_CHANGE_NAME_REQUEST = 0x040c,//群组名修改请求CID_GROUP_CHANGE_NAME_RESPONSE = 0x040d,//响应CID_GROUP_CHANGE_NAME_NOTIFY = 0x040e,//通知
2定义群组协议修改群名 req rsp notify
pb/IM.Group.proto
message IMGroupChangeGroupNameReq{//cmd id: 0x040crequired uint32 user_id = 1;required uint32 group_id = 2;required string group_name = 3;optional bytes attach_data = 20;
}message IMGroupChangeGroupNameRsp{//cmd id: 0x040drequired uint32 user_id = 1;required uint32 group_id = 2;required uint32 result_code = 3;optional bytes attach_data = 20;repeated uint32 cur_user_id_list = 4; //notify stick
}message IMGroupChangeGroupNameNotifyRsp{//cmd id: 0x040drequired uint32 user_id = 1;required uint32 group_id = 2;required string group_name = 3;repeated uint32 cur_user_id_list = 4; //现有的成员idoptional bytes attach_data = 20;
}
3生成协议
cd pb
./create.sh
./sync.sh
4注册Db HandlerMap接口
dg/business/GroupAction.h
#include "ImPduBase.h"namespace DB_PROXY {void createGroup(CImPdu* pPdu, uint32_t conn_uuid);...void changeGroupName(CImPdu* pPdu, uint32_t conn_uuid);};
// groupm_handler_map.insert(make_pair(uint32_t(CID_GROUP_NORMAL_LIST_REQUEST),
...
....m_handler_map.insert(make_pair(uint32_t(CID_GROUP_CHANGE_NAME_REQUEST), DB_PROXY::changeGroupName));
GroupAction.cpp 添加实现
/*** modify group name ** @param pPdu 收到的packet包指针* @param conn_uuid 该包过来的socket 描述符*/void changeGroupName(CImPdu *pPdu, uint32_t conn_uuid){IM::Group::IMGroupChangeGroupNameReq msg;IM::Group::IMGroupChangeGroupNameRsp msgResp;if (msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength())){uint32_t nUserId = msg.user_id();uint32_t nGroupId = msg.group_id();string strGroupName = msg.group_name();if (CGroupModel::getInstance()->isValidateGroupId(nGroupId)){CImPdu *pPduRes = new CImPdu;log("change group name uid = %d group_id = %d name = %s", nUserId, nGroupId, strGroupName.c_str());bool bRet = CGroupModel::getInstance()->changeGroupName(nUserId,nGroupId, strGroupName);msgResp.set_user_id(nUserId);msgResp.set_group_id(nGroupId);msgResp.set_result_code(bRet ? 0 : 1);//query all users in group and notifylist<uint32_t> lsCurUserId;CGroupModel::getInstance()->getGroupUser(nGroupId, lsCurUserId);for (auto it = lsCurUserId.begin(); it != lsCurUserId.end(); ++it){msgResp.add_cur_user_id_list(*it);}//responsemsgResp.set_attach_data(msg.attach_data());pPduRes->SetPBMsg(&msgResp);pPduRes->SetSeqNum(pPdu->GetSeqNum());pPduRes->SetServiceId(IM::BaseDefine::SID_GROUP);pPduRes->SetCommandId(IM::BaseDefine::CID_GROUP_CHANGE_NAME_RESPONSE);CProxyConn::AddResponsePdu(conn_uuid, pPduRes);}else{log("invalid groupModifyType or groupId. userId=%u, groupId=%u", nUserId, nGroupId);}}else{log("parse pb failed");}}
}
5 添加数据库修改群名接口 同时更新 update字段
GroupModel.cpp
bool CGroupModel::changeGroupName(uint32_t nUserId, uint32_t nGroupId, const string &strGroupName)
{bool bRet = false;if (hasModifyPermission(nUserId, nGroupId)){bRet = updateGroupName(nGroupId, strGroupName);//if modify group member success, need to inc the group version and clear the user count;if (bRet){incGroupVersion(nGroupId);}}else{log("user:%u has no permission to modify group:%u", nUserId, nGroupId);}return bRet;
}bool CGroupModel::updateGroupName(uint32_t nGroupId, const string &strGroupName)
{bool bRet = false;CDBManager *pDBManager = CDBManager::getInstance();CDBConn *pDBConn = pDBManager->GetDBConn("teamtalk_master");if (pDBConn){uint32_t nNow = (uint32_t)time(NULL);// string strSql = "update IMGroup set name= " + strGroupName + " where id=" + int2string(nGroupId);// string strSql = "update IMGroup set `name`='" + strGroupName + "' ,' updated'=" + int2string(nNow) + " where id=" + int2string(nGroupId);string strSql = "update IMGroup set `name`='" + strGroupName + "', `updated`=" + int2string(nNow) + " where id="+int2string(nGroupId);log("updateGroupName,%s ", strSql.c_str());bRet = pDBConn->ExecuteUpdate(strSql.c_str());pDBManager->RelDBConn(pDBConn);}else{log("no db connection for teamtalk_master");}return bRet;
}
6添加MSG_server req HandleGroupNameResponse HandleGroupNameNotify 接口
msg_server处理请求
MsgConn.cpp
void CMsgConn::HandlePdu(CImPdu* pPdu)
{// request authorization checkif (pPdu->GetCommandId() != CID_LOGIN_REQ_USERLOGIN && !IsOpen() && IsKickOff()) {log("HandlePdu, wrong msg. ");throw CPduException(pPdu->GetServiceId(), pPdu->GetCommandId(), ERROR_CODE_WRONG_SERVICE_ID, "HandlePdu error, user not login. ");return;}switch (pPdu->GetCommandId()) {case CID_OTHER_HEARTBEAT:...case CID_GROUP_CHANGE_NAME_REQUEST:s_group_chat->HandleClientGroupChangeNameRequest(pPdu, this);break;default:log("wrong msg, cmd id=%d, user id=%u. ", pPdu->GetCommandId(), GetUserId());break;}
}
groupchat.h
void HandleClientGroupChangeNameRequest(CImPdu* pPdu, CMsgConn* pFromConn);void HandleGroupChangeNameResponse(CImPdu* pPdu);void HandleGroupChangeNameBroadcast(CImPdu* pPdu);
groupchat.cpp
void CGroupChat::HandleClientGroupChangeNameRequest(CImPdu* pPdu, CMsgConn* pFromConn)
{IM::Group::IMGroupChangeGroupNameReq msg;CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()));uint32_t req_user_id = pFromConn->GetUserId();uint32_t group_id = msg.group_id();string group_name = msg.group_name();log("HandleClientChangeNameReq, req_id=%u, group_id=%u,",req_user_id, group_id);CDBServConn* pDbConn = get_db_serv_conn();if (pDbConn) {CDbAttachData attach_data(ATTACH_TYPE_HANDLE, pFromConn->GetHandle(), 0);msg.set_user_id(req_user_id);msg.set_attach_data(attach_data.GetBuffer(), attach_data.GetLength());pPdu->SetPBMsg(&msg);pDbConn->SendPdu(pPdu);} else {log("no DB connection ");IM::Group::IMGroupChangeGroupNameRsp msg2;msg2.set_user_id(req_user_id);msg2.set_result_code(1);msg2.set_group_id(group_id);CImPdu pdu;pdu.SetPBMsg(&msg2);pdu.SetServiceId(SID_GROUP);pdu.SetCommandId(CID_GROUP_CHANGE_NAME_RESPONSE);pdu.SetSeqNum(pPdu->GetSeqNum());pFromConn->SendPdu(&pdu);}
}void CGroupChat::HandleGroupChangeNameResponse(CImPdu* pPdu)
{IM::Group::IMGroupChangeGroupNameRsp msg;CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()));uint32_t user_id = msg.user_id();uint32_t result = msg.result_code();uint32_t group_id = msg.group_id();log("HandleGroupChangeNameResponse, req_id=%u, group_id=%u, result=%u",user_id, group_id, result);CDbAttachData attach_data((uchar_t*)msg.attach_data().c_str(), msg.attach_data().length());CMsgConn* pFromConn = CImUserManager::GetInstance()->GetMsgConnByHandle(user_id,attach_data.GetHandle());if (pFromConn) {msg.clear_attach_data();pPdu->SetPBMsg(&msg);pFromConn->SendPdu(pPdu);}if (!result) {IM::Group::IMGroupChangeGroupNameNotifyRsp msg2;msg2.set_user_id(user_id);msg2.set_group_id(group_id);// msg2.set_group_name();int cur_user_cnt = msg2.cur_user_id_list_size();for (uint32_t i = 0; i < cur_user_cnt; i++) {msg2.add_cur_user_id_list(msg.cur_user_id_list(i));}CImPdu pdu;pdu.SetPBMsg(&msg2);pdu.SetServiceId(SID_GROUP);pdu.SetCommandId(CID_GROUP_CHANGE_NAME_NOTIFY);CRouteServConn* pRouteConn = get_route_serv_conn();if (pRouteConn) {pRouteConn->SendPdu(&pdu);}for (uint32_t i = 0; i < cur_user_cnt; i++) {uint32_t to_user_id = msg.cur_user_id_list(i);_SendPduToUser(&pdu, to_user_id, pFromConn);}}
}void CGroupChat::HandleGroupChangeNameBroadcast(CImPdu* pPdu)
{IM::Group::IMGroupChangeMemberNotify msg;CHECK_PB_PARSE_MSG(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()));uint32_t change_type = msg.change_type();uint32_t group_id = msg.group_id();uint32_t chg_user_cnt = msg.chg_user_id_list_size();uint32_t cur_user_cnt = msg.cur_user_id_list_size();log("HandleChangeMemberBroadcast, change_type=%u, group_id=%u, chg_user_cnt=%u, cur_user_cnt=%u. ", change_type, group_id, chg_user_cnt, cur_user_cnt);for (uint32_t i = 0; i < chg_user_cnt; i++){uint32_t to_user_id = msg.chg_user_id_list(i);_SendPduToUser(pPdu, to_user_id);}for (uint32_t i = 0; i < cur_user_cnt; i++) {uint32_t to_user_id = msg.cur_user_id_list(i);_SendPduToUser(pPdu, to_user_id);}
}
DBServConn.cpp
void CDBServConn::HandlePdu(CImPdu* pPdu)
{switch (pPdu->GetCommandId()) {case CID_OTHER_HEARTBEAT:break;......case CID_GROUP_CHANGE_NAME_RESPONSE:s_group_chat->HandleGroupChangeNameResponse(pPdu);break;default:log("db server, wrong cmd id=%d ", pPdu->GetCommandId());}
}
7编译 db msg模块 运行
更新 db
cd db_proxy_server
make clean
cmake .
make
cp db_proxy_server ../../../auto_setup/im_server/im-server-1/db_proxy_server
更新 msg_server
cd msg_server
make clean
cmake .
make
cp msg_server../../../auto_setup/im_server/im-server-1/msg_server
android 修改proto协议
copy文件
IMGroupManager 添加以下方法
/*** 修改群组名** @param name* @param groupId*/public void reqChangeGroupName(final String name, int groupId) {if (TextUtils.isEmpty(name))return;final int loginId = imLoginManager.getLoginId();IMGroup.IMGroupChangeNameReq changeNameReq = IMGroup.IMGroupChangeNameReq.newBuilder().setUserId(loginId).setGroupId(groupId).setGroupName(name).build();int sid = IMBaseDefine.ServiceID.SID_GROUP_VALUE;int cid = IMBaseDefine.GroupCmdID.CID_GROUP_CHANGE_NAME_REQUEST_VALUE;imSocketManager.sendRequest(changeNameReq, sid, cid, new Packetlistener() {@Overridepublic void onSuccess(Object response) {try {IMGroup.IMGroupChangeNameRsp changeNameRsp = IMGroup.IMGroupChangeNameRsp.parseFrom((CodedInputStream) response);IMGroupManager.instance().onReqChangeGroupName(changeNameRsp, name);} catch (IOException e) {logger.e("reqChangeGroupName parse error!");triggerEvent(new GroupEvent(GroupEvent.Event.CHANGE_GROUP_NAME_FAIL));}}@Overridepublic void onFaild() {logger.e("reqChangeGroupName onFaild!");triggerEvent(new GroupEvent(GroupEvent.Event.CHANGE_GROUP_NAME_FAIL));}@Overridepublic void onTimeout() {logger.e("reqChangeGroupName onTimeout!");triggerEvent(new GroupEvent(GroupEvent.Event.CHANGE_GROUP_NAME_TIMEOUT));}});}public void onReqChangeGroupName(IMGroup.IMGroupChangeNameRsp groupChangeNameRsp, String name) {int resultCode = groupChangeNameRsp.getResultCode();if (0 != resultCode) {triggerEvent(new GroupEvent(GroupEvent.Event.CHANGE_GROUP_NAME_FAIL));logger.e("reqChangeGroupMember onFaild! ,resultCode=%d", resultCode);return;}//TODO notify 重复 deleteint groupId = groupChangeNameRsp.getGroupId();String groupName = name;GroupEntity groupEntityRet = groupMap.get(groupId);groupEntityRet.setMainName(groupName);//更新dbdbInterface.insertOrUpdateGroup(groupEntityRet);GroupEvent groupEvent;groupEvent = new GroupEvent(GroupEvent.Event.CHANGE_GROUP_NAME_SUCCESS);groupEvent.setGroupEntity(groupEntityRet);triggerEvent(groupEvent);}/*** 收到群成员发生变更消息* 服务端主动发出* DB*/public void receiveGroupChangeMemberNotify(IMGroup.IMGroupChangeMemberNotify notify){int groupId = notify.getGroupId();int changeType = ProtoBuf2JavaBean.getGroupChangeType(notify.getChangeType());List<Integer> changeList = notify.getChgUserIdListList();List<Integer> curMemberList = notify.getCurUserIdListList();if(groupMap.containsKey(groupId)){GroupEntity entity = groupMap.get(groupId);entity.setlistGroupMemberIds(curMemberList);dbInterface.insertOrUpdateGroup(entity);groupMap.put(groupId,entity);GroupEvent groupEvent = new GroupEvent(GroupEvent.Event.CHANGE_GROUP_MEMBER_SUCCESS);groupEvent.setChangeList(changeList);groupEvent.setChangeType(changeType);groupEvent.setGroupEntity(entity);triggerEvent(groupEvent);}else{//todo 没有就暂时不管了,只要聊过天都会显示在回话里面}}
TeamTalk 添加修改群组名功能相关推荐
- Facebook为Messenger应用添加群组付款功能
Facebook在2015年为Messenger应用添加了好友免费转账功能.这个使得用户可以方便安全地向朋友转账,但是如果用户需要向多人支付,可能会耗费时间.幸运的是,Facebook已经通过其最新的 ...
- 萤石云好友分享的监控怎么看_助力开学季丨萤石云APP新增群组分享功能、扩容优惠套餐!...
开学季 萤石云新功能上线 又是一年忙碌充实的开学季,小小少年们又回到了学校,萤石幼儿园校长却多了份幸福的烦恼:宝爸宝妈们都想看自家孩子的上课录像,可每次只能跨过班主任直接向校长申请:小班的同学座位升到 ...
- Linux 修改群组文件夹权限
首先添加群组,进入vim添加group成员 #groupadd groupname #vim /etc/group 然后修改群组文件权限, -R的作用是使得文件夹下的子文件都能有相同的权限 #chgr ...
- GitLab修改群组信息
1.问题背景 代码通过 GitLab 管理,之前创建的群组名称和群组路径可能不太合适,但是群组下已经创建了很多项目. 此时,想修改群组名称和群组路径. 2.解决方案 1)使用管理员账号登录到 GitL ...
- Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)
1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...
- linux添加有效群组,linux基础命令--groupadd 创建新的群组
描述 groupadd命令用于创建一个新的群组. groupadd命令默认会根据命令行指定的值和系统下的/etc/login.defs文件定义的值去修改系统下的/etc/group和/etc/gsha ...
- linux 修改群组名称,linux常用命令系列—chgrp-修改所属群组
指令名称:chgrp(change group) 功能介绍:变更文件或目录的所属群组.在UNIX系统家族里,文件或目录权限的掌控由拥有者及所属群组来管理.您可以使用chgrp指令去变更文件与目录的所属 ...
- Zotero | 群组Group功能的建立,加入及管理使用(十)
Zotero | 群组Group的建立,加入及管理使用 一.建立群组 二.群组设置 三.管理群组成员 四.群组搜索及申请加入 五.群组文献库的使用 在进行文献管理时,常常需要在课题组进行分享,针对大量 ...
- Sentinel 发布里程碑版本,添加集群流控功能
为什么80%的码农都做不了架构师?>>> 自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集 ...
最新文章
- Oracle 12c coming soon?
- 华为--PPP典型配置举例
- 10 个免费的服务器监控工具推荐
- SpringBoot和MyBatis集成案例(学习笔记)
- Java工厂构造函数参数,javascript 面向对象之构造函数、工厂方式、字面量
- 七年级认识计算机课件,认识计算机(七年级)ppt课件
- gin-控制器分组:
- python3.7中文手册chm_python3.7 官方中文手册文档全套
- querydsl动态 sql_QueryDSL-JPA
- selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
- C语言:二维数组传参的格式(详细+总结)
- 阶乘的0 【南阳 oj 题目84】
- android:viewpager实现图片循环滑动+索引点击事件
- 手机刷机的几种常用方法
- java 工作业绩_个人年度工作总结报告java
- TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
- 基于Mysql+Java的超市管理系统(附源码)
- Web应用程序防火墙Waf跟云防火墙有什么区别
- 新媒体运营——客户沟通方式
- c语言武汉市出租车收费标准 3公里以内,武汉的士起步价25日起调至10元 每公里租价1.8元...