#ifndef PROTOCOL_H
#define PROTOCOL_H

/************************************************
 * IM通讯协议规定
 *
 * 功能码 [参数]
 *
 * 客户端功能码规定：      参数：               例子：                         说明：
 * 1 = 请求登录          用户昵称              1  张三                       当客户端登录时必须先发送这条命令，告诉服务端自己的昵称
 * 2 = 发送私聊消息       私聊对象 消息内容      2  李四  你妈喊你回家吃饭        当A向B发送一条私聊消息时，A要向服务器发送这条指令，告诉服务器消息发给谁和发什么消息
 * 3 = 发送群聊消息       消息内容              3  大家好，我是张三             当A向群聊发送一条消息时，直接告诉服务端需要发什么内容即可
 *
 * 服务端功能码规定：      参数：               例子：                     说明：
 * 1 = 发送私聊消息       用户昵称 消息内容      1 张三  你妈喊你回家吃饭       当A向B发送一条私聊消息时，B会收到这条指令，其中昵称是指A（发送者）的昵称
 * 2 = 发送群聊消息       用户昵称 消息内容      2 张三  大家好，我是张三       当A向群聊发送一条消息时，所有人都会收到这条指令，其中昵称是指A（发送者）的昵称
 * 3 = 某人上线           用户昵称             3 张三                      当A上线时，所有人都会收到这条指令，其中昵称是A（上线者）的昵称
 * 4 = 某人下线           用户昵称             4 张三                      当A下线时，所有人都会手套这条指令，其中昵称是A（下线者）的昵称
 * 10 = 登录结果          是否成功(0:成功，!0:失败) [当前在线人数] [当前在线人员列表]
 *                                成功时     10 0 4 张三 李四 王五 赵六    当客户端发送登录请求后，如果登录成功则返回当前在线人数与昵称列表，如果失败就返回一个!0值
 *                                失败时     10 1
 *
 ***********************************************/

/**
 * @brief 服务端功能码
 */
enum ServerFunctionCode {
    // 私聊消息
    PrivateMessage = 1,

    // 群聊消息
    GroupMessage = 2,

    // 用户上线
    UserOnline = 3,

    // 用户下线
    UserOffline = 4,

    // 登录结果
    LoginResult = 10
};

/**
 * @brief 客户端功能码
 */
enum ClientFunctionCode {
    // 登录
    Login = 1,

    // 发送私聊消息
    SendPrivateMessage = 2,

    // 发送群聊消息
    SendGroupMessage = 3
};

#endif // PROTOCOL_H
