C++搭建集群聊天室(十三):添加好友功能实现

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++搭建集群聊天室(十三):添加好友功能实现相关的知识,希望对你有一定的参考价值。

添加好友

又是一个新模块,好友功能。

所以,照旧,先在public中写上,然后写上一个model类,再绑定一下,并在service中调用即可。

最后重新编译,轻车熟路了。


public.hpp

#ifndef PUBLIC_H_
#define PUBLIC_H_

enum EnMsgType{
    LOGIN_TYPE = 1, //正常登录
    LOGIN_MSG_ACK,  //登录相应消息
    REG_TYPE,       //正常注册
    REG_MSG_ACK,    //注册相应消息
    ONE_CHAT_MSG,   //一对一聊天消息
    GROUP_CHAT_MSG, //群聊聊天消息
    ADD_FRINEND_MSG,//添加好友
};

#endif

friendmodel.hpp

#ifndef FRIENDMODEL_H_
#define FRIENDMODEL_H_

#include<vector>
#include"user.hpp"

using namespace std;

//好友信息方法
class FriendModel{
public:
    void insert(int userid,int friendid);

    vector<User> query(int userid);

private:

};

#endif

friendmodel.cpp

#include"friendmodel.hpp"
#include"db.hpp"

void FriendModel::insert(int userid,int friendid){
    char sql[128] = {0};

    sprintf(sql,"insert into Friend(userid,friendid) values(%d,%d)",userid,friendid);

    mysql mysql;
    if(mysql.connect()){
        mysql.update(sql);
    }
}

vector<User> FriendModel::query(int userid){
    // 1.组装sql语句
    char sql[256] = {0};
    sprintf(sql, "select a.id,a.name,a.state from User a inner join Friend b on b.friendid = a.id where b.userid = %d", userid);

    vector<User> vec;

    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while((row = mysql_fetch_row(res)) != nullptr){
                User user;
                user.setID(atoi(row[0]));
                user.setname(row[1]);
                user.setstate(row[2]);

                vec.push_back(user);
            }
            mysql_free_result(res);
        }
    }

    return vec;
}

chatservice.hpp 中添加部分

#include"friendmodel.hpp"

//添加好友
void addFriend(const TcpConnectionPtr &conn,json &js,Timestamp time);

FriendModel _friendmodel;

chatservice.cpp 部分

绑定自己绑

void ChatService::login(const TcpConnectionPtr &conn,json &js,Timestamp time){
    int id = js["id"].get<int>();
    string pwd = js["password"];

    User user = _usermodel.query(id);
    if (user.getID() == id && user.getpassword() == pwd)
    {
        if (user.getstate() == "online")
        {
            // 该用户已经登录,不允许重复登录
            json response;
            response["msgid"] = LOGIN_MSG_ACK;
            response["errno"] = 2;
            response["errmsg"] = "this account is using, input another!";

            conn->send(response.dump());
        }
        else
        {   
            //添加作用域,限制锁的粒度
            {
                lock_guard<mutex> lock(_connMutex);
          
                //记录用户连接
                _userConnMap.insert({id,conn});
            }
            
            // 登录成功,更新用户状态信息 state offline=>online
            user.setstate("online");
            _usermodel.updateState(user);

            json response;
            response["msgid"] = LOGIN_MSG_ACK;
            response["errno"] = 0;
            response["id"] = user.getID();
            response["name"] = user.getname();
            
            //查询用户是否有离线消息
            vector<string> vecofflinemsg = _offlineMsgmodel.query(id);
            if(!vecofflinemsg.empty()){
                response["offlinemsg"] = vecofflinemsg;

                //清空离线消息
                _offlineMsgmodel.remove(id);
            }

            vector<User> uservec = _friendmodel.query(id);
            if(!uservec.empty()){
                vector<string> vecfriend;
                for(User &user:uservec){
                    json js;
                    js["id"] = user.getID();
                    js["name"] = user.getname();
                    js["state"] = user.getstate();

                    vecfriend.push_back(js.dump());
                }
                response["friends"] = vecfriend;
            }

            conn->send(response.dump());
        }
    }
    else
    {
        // 该用户不存在,用户存在但是密码错误,登录失败
        json response;
        response["msgid"] = LOGIN_MSG_ACK;
        response["errno"] = 1;
        response["errmsg"] = "id or password is invalid!";
        conn->send(response.dump());
    }
}
void ChatService::addFriend(const TcpConnectionPtr &conn,json &js,Timestamp time){
    int userid = js["id"].get<int>();
    int friendid = js["friendid"].get<int>();

    _friendmodel.insert(userid,friendid);
}

以上是关于C++搭建集群聊天室(十三):添加好友功能实现的主要内容,如果未能解决你的问题,请参考以下文章

C++搭建集群聊天室:用户单聊及离线消息处理功能实现

C++搭建集群聊天室:用户单聊及离线消息处理功能实现

C++搭建集群聊天室:配置远程代码编辑神器 VScode

C++搭建集群聊天室:配置远程代码编辑神器 VScode

C++搭建集群聊天室(十四):群聊功能

C++搭建集群聊天室(十四):群聊功能