此为信令扩展部分 关键部分如下

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 添加修改群组名功能相关推荐

  1. Facebook为Messenger应用添加群组付款功能

    Facebook在2015年为Messenger应用添加了好友免费转账功能.这个使得用户可以方便安全地向朋友转账,但是如果用户需要向多人支付,可能会耗费时间.幸运的是,Facebook已经通过其最新的 ...

  2. 萤石云好友分享的监控怎么看_助力开学季丨萤石云APP新增群组分享功能、扩容优惠套餐!...

    开学季 萤石云新功能上线 又是一年忙碌充实的开学季,小小少年们又回到了学校,萤石幼儿园校长却多了份幸福的烦恼:宝爸宝妈们都想看自家孩子的上课录像,可每次只能跨过班主任直接向校长申请:小班的同学座位升到 ...

  3. Linux 修改群组文件夹权限

    首先添加群组,进入vim添加group成员 #groupadd groupname #vim /etc/group 然后修改群组文件权限, -R的作用是使得文件夹下的子文件都能有相同的权限 #chgr ...

  4. GitLab修改群组信息

    1.问题背景 代码通过 GitLab 管理,之前创建的群组名称和群组路径可能不太合适,但是群组下已经创建了很多项目. 此时,想修改群组名称和群组路径. 2.解决方案 1)使用管理员账号登录到 GitL ...

  5. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

    1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...

  6. linux添加有效群组,linux基础命令--groupadd 创建新的群组

    描述 groupadd命令用于创建一个新的群组. groupadd命令默认会根据命令行指定的值和系统下的/etc/login.defs文件定义的值去修改系统下的/etc/group和/etc/gsha ...

  7. linux 修改群组名称,linux常用命令系列—chgrp-修改所属群组

    指令名称:chgrp(change group) 功能介绍:变更文件或目录的所属群组.在UNIX系统家族里,文件或目录权限的掌控由拥有者及所属群组来管理.您可以使用chgrp指令去变更文件与目录的所属 ...

  8. Zotero | 群组Group功能的建立,加入及管理使用(十)

    Zotero | 群组Group的建立,加入及管理使用 一.建立群组 二.群组设置 三.管理群组成员 四.群组搜索及申请加入 五.群组文献库的使用 在进行文献管理时,常常需要在课题组进行分享,针对大量 ...

  9. Sentinel 发布里程碑版本,添加集群流控功能

    为什么80%的码农都做不了架构师?>>>    自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集 ...

最新文章

  1. Oracle 12c coming soon?
  2. 华为--PPP典型配置举例
  3. 10 个免费的服务器监控工具推荐
  4. SpringBoot和MyBatis集成案例(学习笔记)
  5. Java工厂构造函数参数,javascript 面向对象之构造函数、工厂方式、字面量
  6. 七年级认识计算机课件,认识计算机(七年级)ppt课件
  7. gin-控制器分组:
  8. python3.7中文手册chm_python3.7 官方中文手册文档全套
  9. querydsl动态 sql_QueryDSL-JPA
  10. selenium弹窗处理,包括Javascript弹窗、HTML弹出层和Windows弹窗
  11. C语言:二维数组传参的格式(详细+总结)
  12. 阶乘的0 【南阳 oj 题目84】
  13. android:viewpager实现图片循环滑动+索引点击事件
  14. 手机刷机的几种常用方法
  15. java 工作业绩_个人年度工作总结报告java
  16. TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
  17. 基于Mysql+Java的超市管理系统(附源码)
  18. Web应用程序防火墙Waf跟云防火墙有什么区别
  19. 新媒体运营——客户沟通方式
  20. c语言武汉市出租车收费标准 3公里以内,武汉的士起步价25日起调至10元 每公里租价1.8元...

热门文章

  1. 免费使用chatgpt一分钟教你
  2. 复杂网络上的博弈及其演化动力学读书笔记
  3. 嵌入式低功耗 Wi-Fi 物联网报警系统——基于 TI 的 CC3200
  4. 这三大生肖都是成功人士,前途一片光明
  5. 好用的bim插件丨在Revit中怎么画斜柱?
  6. FreeRTOS的学习(六)——系统时钟
  7. Qt dateEdit 选择日期控件
  8. 转行产品经理求职必知!对互联网大厂产品经理岗位需求分析
  9. jQuery事件大全(真的很全)
  10. 关于百度排名点击器作弊提升百度排名的说明