teamtalk最近联系会话

news2024/12/23 20:19:33

最近联系人相关信令和协议设计

enum BuddyListCmdID {
  CID_BUDDY_LIST_RECENT_CONTACT_SESSION_REQUEST = 513,
  CID_BUDDY_LIST_RECENT_CONTACT_SESSION_RESPONSE = 514,
  };

流程图

请添加图片描述

  1. 根据最新的时间戳查找最新的会话
  2. 更新客户端的会话时间
/**
     *  获取最近会话接口
     *
     *  @param pPdu      收到的packet包指针
     *  @param conn_uuid 该包过来的socket 描述符
     */
    void getRecentSession(CImPdu* pPdu, uint32_t conn_uuid)
    {
        
        IM::Buddy::IMRecentContactSessionReq msg;
        IM::Buddy::IMRecentContactSessionRsp msgResp;
        if(msg.ParseFromArray(pPdu->GetBodyData(), pPdu->GetBodyLength()))
        {
            CImPdu* pPduResp = new CImPdu;
        
            uint32_t nUserId = msg.user_id();
            uint32_t nLastTime = msg.latest_update_time();
            
            //获取最近联系人列表
            list<IM::BaseDefine::ContactSessionInfo> lsContactList;
            CSessionModel::getInstance()->getRecentSession(nUserId, nLastTime, lsContactList);
            msgResp.set_user_id(nUserId);
            for(auto it=lsContactList.begin(); it!=lsContactList.end(); ++it)
            {
                IM::BaseDefine::ContactSessionInfo* pContact = msgResp.add_contact_session_list();
    //            *pContact = *it;
                pContact->set_session_id(it->session_id());
                pContact->set_session_type(it->session_type());
                pContact->set_session_status(it->session_status());
                pContact->set_updated_time(it->updated_time());
                pContact->set_latest_msg_id(it->latest_msg_id());
                pContact->set_latest_msg_data(it->latest_msg_data());
                pContact->set_latest_msg_type(it->latest_msg_type());
                pContact->set_latest_msg_from_user_id(it->latest_msg_from_user_id());
            }
            
            log("userId=%u, last_time=%u, count=%u", nUserId, nLastTime, msgResp.contact_session_list_size());
            
            msgResp.set_attach_data(msg.attach_data());
            pPduResp->SetPBMsg(&msgResp);
            pPduResp->SetSeqNum(pPdu->GetSeqNum());
            pPduResp->SetServiceId(IM::BaseDefine::SID_BUDDY_LIST);
            pPduResp->SetCommandId(IM::BaseDefine::CID_BUDDY_LIST_RECENT_CONTACT_SESSION_RESPONSE);
            CProxyConn::AddResponsePdu(conn_uuid, pPduResp);
        }
        else
        {
            log("parse pb failed");
        }
    }

void CSessionModel::getRecentSession(uint32_t nUserId, uint32_t lastTime, list<IM::BaseDefine::ContactSessionInfo>& lsContact)
{
    CDBManager* pDBManager = CDBManager::getInstance();
    CDBConn* pDBConn = pDBManager->GetDBConn("teamtalk_slave");
    if (pDBConn)
    {
        string strSql = "select * from IMRecentSession where userId = " + int2string(nUserId) + " and status = 0 and updated >" + int2string(lastTime) + " order by updated desc limit 100";
        
        CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str());
        if (pResultSet)
        {
            while (pResultSet->Next())
            {
                IM::BaseDefine::ContactSessionInfo cRelate;
                uint32_t nPeerId = pResultSet->GetInt("peerId");
                cRelate.set_session_id(nPeerId);
                cRelate.set_session_status(::IM::BaseDefine::SessionStatusType(pResultSet->GetInt("status")));
                
                IM::BaseDefine::SessionType nSessionType = IM::BaseDefine::SessionType(pResultSet->GetInt("type"));
                if(IM::BaseDefine::SessionType_IsValid(nSessionType))
                {
                    cRelate.set_session_type(IM::BaseDefine::SessionType(nSessionType));
                    cRelate.set_updated_time(pResultSet->GetInt("updated"));
                    lsContact.push_back(cRelate);
                }
                else
                {
                    log("invalid sessionType. userId=%u, peerId=%u, sessionType=%u", nUserId, nPeerId, nSessionType);
                }
            }
            delete pResultSet;
        }
        else
        {
            log("no result set for sql: %s", strSql.c_str());
        }
        pDBManager->RelDBConn(pDBConn);
        if(!lsContact.empty())
        {
            fillSessionMsg(nUserId, lsContact);
        }
    }
    else
    {
        log("no db connection for teamtalk_slave");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java数据结构(七)——优先级队列与PriorityQueue

文章目录 优先级队列与PriorityQueue堆基本概念和性质建堆堆的插入堆的删除堆的应用 PriorityQueuePriorityQueue的构造方法PriorityQueue的常用方法PriorityQueue的模拟实现 经典TopK问题 优先级队列与PriorityQueue 优先级队列是一种特殊类型的队列&#xff0c;其中元素按照…

聊聊 OceanBase 内存管理

内存配置管理是数据库日常管理中非常重要的工作&#xff0c;正确合理配置数据库内存是保障系统高效运行的前提条件。 OceanBase 数据库是一个支持多租户架构的准内存级的分布式数据库&#xff0c;对大容量内存的管理和使用提出了很高的要求。实际使用上&#xff0c;OceanBase …

1.【R语言】R语言的下载和安装

R语言是一种开源编程语言&#xff0c;它提供了丰富的统计模型和图形绘制功能&#xff0c;广泛用于数据科学、统计分析、数据挖掘和机器学习。R有一个活跃的社区和大量的包&#xff0c;可以满足各种需求&#xff0c;如数据清洗、绘图和报告生成。其强大的数据处理能力和灵活的可…

【ESP-IDF FreeRTOS】队列管理

先包含下头文件。 #include "freertos/queue.h" 队列大家应该不陌生&#xff0c;就是一个先进先出的容器。用在FreeRTOS里用途就多了。 首先是可以让任务与任务之间以及中断之间通信&#xff0c;任务A把数据塞进队列再让任务B取出&#xff0c;这样就可以传递数据了…

BMC lighttpd kvm数据分析(websocket)

1.说明 lighttpd源码: https://github.com/lighttpd/lighttpd1.4.gitlighttpd wiki: https://redmine.lighttpd.net/projects/lighttpd/wiki/libfcgi: https://github.com/toshic/libfcgi/tree/master 注意: 本章的代码仓库: https://gitee.com/wit_yuan/lighttpd_kvm 2.编…

3127.构造相同颜色的正方形

1.题目描述 给你一个二维 3 x 3 的矩阵 grid &#xff0c;每个格子都是一个字符&#xff0c;要么是 B &#xff0c;要么是 W 。字符 W 表示白色&#xff0c;字符 B 表示黑色。 你的任务是改变 至多一个 格子的颜色&#xff0c;使得矩阵中存在一个 2 x 2 颜色完全相同的正方形。…

无敌美少男和无敌美少女构建企业级私有仓库(harbor)

一&#xff1a;harbor简介 Harbor 是由 vmware 公司开源的企业级 Docker Registry 项目。 它提供了以下主要功能和特点&#xff1a; 基于角色的访问控制&#xff08;RBAC&#xff09;&#xff1a;可以为不同的用户和用户组分配不同的权限&#xff0c;增强了安全性和管理的灵…

Linux下的MySQL8.0报错:[Err]1055

Linux下的MySQL8.0报错&#xff1a;[Err]1055 报错信息解决办法 报错信息 在Linux环境下的MySQL里执行SQL语句报如下错误&#xff1a;[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column information_schema.PROFIL…

maven 父子工程创建详解

maven 父子工程创建详解 一、Maven工程继承关系 继承概念 maven继承是指的Maven的项目中&#xff0c;让一个项目从另外项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一个配置信息&#xff0c;简化项目的管理和维护工作 继承作用&#xff1a;在父工程中统一管理…

Datawhale AI夏令营 第五期 CV方向 Task3笔记

Task3&#xff1a;上分思路——数据集增强与模型预测 Part1&#xff1a;数据增强 数据增强是机器学习和深度学习中的一种技术&#xff0c;通过在原始数据集上应用一系列变换来人工地增加数据样本的数量和多样性&#xff0c;从而提高模型的泛化能力&#xff0c;减少过拟合&…

简单的 nginx 学习

简单的 nginx 学习 1. nginx的安装 1.1 下载安装包 去官网下载对应的nginx包&#xff0c;推荐使用稳定版本&#xff0c;上传nginx到linux系统 1.2 安装依赖环境 安装gcc环境 yum install gcc-c安装PCRE库&#xff0c;用于解析正则表达式 yum install -y pcre pcre-develzlib压…

【立体匹配】双目相机外参自标定方法介绍

双目相机外参自标定方法 原理实践 双目相机外参自标定方法是一种无需固定标定板&#xff0c;在拍摄实际场景的两张图像时&#xff0c;通过计算两幅图像之间的匹配特征点对&#xff0c;结合相机的内参矩阵&#xff0c;来实时求解两个相机之间相对位置&#xff08;即外参&#xf…

ThermoParser 介绍

ThermoParser是一个工具包&#xff0c;用于简化专业材料科学代码产生的数据分析&#xff0c;以热电学为中心&#xff0c;但也适用于任何与电子和/或声子传输有关的内容。ThermoParser是一个Python库&#xff0c;它包含数据检索、操作和绘图的函数&#xff0c;只需几行代码就可以…

HashMap 链表转红黑树的阈值为何为 8

与一个重要的统计学原理——泊松分布密切相关&#xff1a;该原理阐明了在单位时间&#xff08;或面积、体积&#xff09;内&#xff0c;随机事件的平均发生次数遵循泊松分布 为什么这因子设定为0.5呢&#xff1f; 在忽略方差的情况下&#xff0c;哈希表容量占比的期望值约为 0.…

揭秘扩散模型:DDPM的数学基础与代码实现全攻略!

(DDPM) denoising diffusion probabilistic models 理论学习 本文价值 本文是 Diffusion 这一类模型的开山之作&#xff0c;首次证明 diffusion 模型能够生成高质量的图片&#xff0c;且奠定了所有后续模型的基本原理&#xff1a;加噪 --> 去噪。DDPM 模型的效果如下&#x…

springboot+vue+mybatis计算机毕业设计飞机订票系统+PPT+论文+讲解+售后

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

IDEA向mysql写入中文字符时出现乱码问题

可参考该博客&#xff1a;https://www.cnblogs.com/bb1008/p/7704458.html 第一步是将IDEA软件中的编码方式全部改为utf8 File -> Settings -> Editor -> File Encodings 第二步是在数据库链接中加入 ?characterEncodingUTF-8

备战2024年全国大学生数学建模竞赛:蔬菜类商品的自动定价与补货决策

目录 一、引言 二、问题分析 三、解题思路 问题1&#xff1a;销售量分布规律及相互关系 问题2&#xff1a;品类级别的补货计划与定价策略 问题3&#xff1a;单品级别的补货计划与定价策略 问题4&#xff1a;补充数据的建议与分析 四、知识点解析 五、模型建立与求解 1…

没有永远免费的加速器,但是永远有免费的加速器【20240831更新】

没有永远免费的加速器&#xff0c;但是永远有免费的加速器【每日更新】 一、迅雷加速器&#xff08;免费时长最高38天&#xff09; 可免费时长&#xff1a;8天 如果是迅雷会员&#xff0c;则免费时长为38天 官网下载链接&#xff1a;迅雷加速器—迅雷官方出品&#xff0c;为快…

关于数字存储和byte[]数组的一些心得

前言 最近做项目&#xff0c;发现一些规律&#xff0c;比如数字的存储和字符串的存储&#xff0c;先说数字吧&#xff0c;最常见的整数&#xff0c;就涉及反码和补码&#xff0c;根据这些规则&#xff0c;甚至我们自己也能造一种数据存储结构&#xff0c;比如1个字节8bit&…