流程设计与交互

煮酒流程设计与交互

服务端处理方式

  • 使用lua脚本进行流程处理,新增bargain.lua,修改entrance.lua、public.lua、helper.lua

配置分离

  • 原插件活动配置全部写在一份配置文件中ms_activity_lua.xml,这样后续如果再增加插件活动会导致该文件越来越大,故本次煮酒活动的配置单独写在ms_bargain_lua.xml中;
  • 在获取所有活动配置时,需要将煮酒活动的配置添加上去;
  • 在获取public模块配置时,需要将助酒活动的相关配置加进去;

煮酒活动相关配置

  • 名称: bargain
  • 模块id: 6
  • 配置需要保证同时只能进行一期煮酒活动,不可以有多期同时进行(即时间段不可以有重合)

煮酒码的生成

  • 每一期煮酒活动开启,生成的煮酒码需要保证唯一性
  • 10位大写字母组成,生成规则:
    1. 数字对26取模,取对应的大写字母;
    2. 前5位:账号后3位+当前时间戳2位,账号不足6位由时间戳补充,账号字符特殊处理(尽量不对外显示出玩家账号,数字按1处理,大写字母后移1位,小写字母后移2位);
    3. 中间3位,活动期数+物品序号+第几次煮酒序号
    4. 最后2位,随机字母
  • 生成一个随机码后,去redis数据库查询是否存在,存在则重新生成,最多重试3次

煮酒的redis数据记录

玩家煮酒信息

  • hash键名: hash:bargain_areaid_actid_player (areaid:区号 actid:期数id)
  • 内容:
    • key: 玩家账号
    • value: {“gotgoods”:{“已煮酒物品序号已煮酒物品id”:物品煮酒次数,..},”getinggoods”:”正在煮酒物品序号正在煮酒物品id,没有为0”,”selfcode”:”正在进行的煮酒码,没有为0”,”helpdata”:{“code”:最新助酒的煮酒码,acc:最新助酒的煮酒玩家账号,delprice:最新助酒的砍价数额,helpcnt:该账号累计助酒次数}}

煮酒码数据

  • hash键名: hash:bargain_areaid_actid_code
  • 内容:
    • key: 煮酒码
    • value: {“state”:状态,”master”:煮酒玩家账号,”goodsid”:煮酒物品id,”idx”:煮酒物品序号,code”:煮酒码,”helperlist”:[{“acc”:”助酒玩家账号”,”delprice”:砍价数额}],”totaldelprice”:总共的砍价数额,”createtime”:开始煮酒时间}

助酒信息

  • hash键名: hash:bargain_areaid_actid_help
  • 内容:
    • key: 玩家账号或ip或设备id
    • value: 助酒次数

玩家数据

  • hash键名: hash:user_data_areaid
  • 内容:
    • key: 玩家账号
    • value: {“head”:头像,”nick”:昵称,”acc”:账号,”sex”:性别}
  • 玩家助酒成功后会记录这个数据
  • 服务端dbs在玩家昵称改变时会记录这个数据
  • 在获取煮酒详细信息时,需要拉取助酒玩家的列表,部分数据从这里获取(客户端需能在煮酒玩家列表里可以查看玩家的名片,玩家昵称可能会变化,所以玩家数据单独记录)

日志记录

  1. 日志记录在插件活动的日志数据表中(mysql)tbl_luaactivity_data;
  2. op_type=2404 param1=6表示是煮酒活动的数据;
  3. log_info内容包括开始煮酒、煮酒、消费元宝、添加物品,这几个以煮酒码关联
    • 开始煮酒 {code=煮酒码, actid=活动期数, goodsid=煮酒物品id, op=”bargain start”}
    • 助酒砍价 {code=煮酒码, actid=活动期数, delpeice=砍价数额, op=”bargain help”}
    • 消费元宝 {code=煮酒码, actid=活动期数, goodsid=煮酒物品id, costprice=元宝数额, op=”bargain cost”}
    • 添加物品 {code=煮酒码, actid=活动期数, goodsid=煮酒物品id, goodscount=煮酒物品数目, costprice=元宝数额, op=”bargain add”}

活动内容交互

客户端请求

  • 协议号
    CLIENT_ACTIVITY_LUA_REQ=22803
  • 协议内容
    struct ClientActivityLuaReq : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

    服务端回复

  • 协议号
    CLIENT_ACTIVITY_LUA_REP=22804
  • 协议内容
    struct ClientActivityLuaRep : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

服务端通知

  • 协议号
    CLIENT_ACTIVITY_LUA_NTF = 22805
    
  • 协议内容
    struct ClientActivityLuaNtf : public PacketBase
    {
      unsigned int module_type; // 模块类型(不同活动)
      unsigned int opid; // 模块操作id
      unsigned int datalen;
      char data[sc_max_activity_data_len];
    };
    

请求的opid

-- 请求的opid
local EmOpID = {
    bargain_getacklist      = 0,            -- 获取ack列表
    bargain_getconfig       = 1,            -- 获取配置
    bargain_getcurdata      = 2,            -- 获取当前煮酒信息
    bargain_start           = 3,            -- 选择一个煮酒的物品,生成唯一码,开始煮酒
    bargain_help            = 4,            -- 助酒砍价
    bargain_getgoods        = 5,            -- 获取煮酒物品
    bargain_gethelp         = 6,            -- 获取助酒信息
    bargain_helpntf         = 7,            -- 助酒通知
}

处理结果枚举

  • 服务端回复客户端请求的处理结果,客户端只在success表示处理成功并处理数据,其他结果可以进行相应的提示
-- 请求回复的结果
local EnumResult = {
    success = 0,                -- 成功
    module_close = 1,           -- 模块未开启
    param_error = 2,            -- 参数错误
    click_too_fast = 3,         -- 操作太频繁
    data_error = 4,             -- 数据错误(resid没有需要的数据)
    activity_no_open = 5,       -- 活动未开启

    redis_error = 6,            -- redis操作失败
    redis_no_data = 7,          -- redis无数据

    help_limit_account = 8,     -- 助酒失败,账号限制,已经历助酒
    help_limit_ip = 8,          -- 助酒失败,ip限制,已经历助酒
    help_limit_device = 10,     -- 助酒失败,设备限制,已经历助酒

    bargain_none = 11,          -- 没有正在进行中的煮酒
    bargain_doing = 12,         -- 煮酒进行中
    bargain_free = 13,          -- 煮酒已免费,不需要助酒了
    bargain_over = 14,          -- 煮酒已结束,已获得物品
    bargain_had = 15,           -- 已完成煮酒

    code_make_fail = 16,        -- 已完成煮酒
    help_not_exist = 17,        -- 助酒的活动不存在
    help_already = 18,          -- 已经助酒了
    help_over = 19,             -- 不再需要助酒了
    help_not_self = 20,         -- 不能给自己助酒
    help_none = 21,             -- 没有助酒过

    use_yuanbao_failed = 22,    -- 扣元宝失败
    add_goods_failed = 23,      -- 添加道具失败

}

煮酒码状态

  • 玩家发起一次煮酒(对应一个煮酒码)后的状态
-- 煮酒码状态
local CodeState = {
    doing = 0,      -- 煮酒中
    canget = 1,     -- 可以领取,已达到保底价或已免费
    over = 2,       -- 已结束
}

玩家煮酒状态

  • 在拉取配置时,会一并告诉客户端当前煮酒状态
-- 玩家煮酒状态
local PlayerState = {
    notdo = 0,      -- 没有进行煮酒
    doing = 1,      -- 煮酒中
    done = 2,       -- 全部完成
}

玩家助酒状态

  • 在拉取配置时,会一并告诉客户端的助酒状态,bit位组合值
-- 玩家助酒状态
local HelpState = {
    can_help    = 0,   -- 可以助酒
    acc_help = 1,      -- 该账号已助酒
    device_help = 2,   -- 该设备已助酒
    ip_help = 4,       -- 该ip已助酒
}

煮酒物品状态

  • 当前一期煮酒活动中各个物品的状态
-- 煮酒物品状态
local GoodsState = {
    canget = 0,      -- 没有进行煮酒
    getting = 1,     -- 煮酒中
    got = 2,         -- 煮酒完成
}

获取活动列表

请求内容参数

module_type=6
opid=0

处理流程

  1. 获取有效配置回复;

回复内容

module_type=6
opid=0
data={
    result: EnumResult(success/activity_no_open),
    helpstate:该账号是否可以助酒(0:不可以,1:可以),
    bargainget:该账号是否有可领取的煮酒(0:没有,1:有),
    helphad:该账号是否已助酒(0:没有,1:有),
    actlist={
        [id]={
            id=第几期,
            actkey=活动key,
            name=模块名
        }
    }
}

说明

  • 只回复在有效时间内的活动配置,目前是只有一个在有效时间内

获取活动配置

请求内容

module_type=6
opid=1
data={
id=第几期,
}

处理流程

回复内容

module_type=6
opid=1
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error),
    state=玩家煮酒状态PlayerState,
    helpstate=玩家助酒状态HelpState,
    helphad:该账号是否已助酒(0:没有,1:有),
    config={
        id=第几期,
        actkey=活动key,
        name=模块名,
        show=是否显示,
        begintime=开始时间,
        endtime=结束时间,
        countDown=倒计时,
        limitlevel=根据等级的界面显示,
        goodslist=[
        {
        idx=物品序号,
        propid=物品id,
        propcount=物品数目,
        skinid=皮肤id,
        oldprice=原价,
        minprice=最低价,
        baseprice=基础价,
        hardlevel=难度等级,
        sort=排序值,
        recommandlevel=[推荐值区间],
        state=物品煮酒状态GoodsState
        },
        {...}
        ]
    }
}

获取煮酒码数据

请求内容

module_type=6
opid=2
data={id=第几期}

处理流程

回复内容

module_type=6
opid=2
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/bargain_none),
    bargaindata={
        state=状态,
        master=煮酒玩家账号,
        goodsid=煮酒物品id,
        code=煮酒码,
        totaldelprice=总共的砍价数额,
        createtime=开始煮酒时间,
        helperlist=[
            {
                acc=助酒玩家账号,
                head=头像,
                sex=性别,
                nickname=昵称,
                delprice=砍价数额
            },
            {...}
        ]
    }
}

选择物品开始煮酒

请求内容

module_type=6
opid=3
data={
    id=第几期,
    idx=物品序号,
    goodsid=物品id
}

处理流程

回复内容

module_type=6
opid=3
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/bargain_doing/bargain_had),
    bargaindata={
        state=状态,
        master=煮酒玩家账号,
        idx=煮酒物品序号,
        goodsid=煮酒物品id,
        code=煮酒码,
        totaldelprice=0,
        createtime=开始煮酒时间,
        helperlist=[]
    }
}

助酒砍价

请求内容

module_type=6
opid=4
data={
    id=第几期,
    deviceid=设备id,
    devicetype=机型,1-ios,0-其他
    bargaincode=煮酒码
}

处理流程

回复内容

module_type=6
opid=4
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/help_over/help_limit_account/help_limit_device/help_limit_ip/bargain_none/help_not_self/help_already/click_too_fast),
    bargaincode=煮酒码
    delprice=砍价数额
}

通知内容

  • 煮酒玩家收到该通知后,可以对应显示信息,并重新拉取煮酒数据更新
    module_type=6
    opid=7
    data={
      result:EnumResult(success),
      helper={
          nickname=助酒玩家昵称,
          sex=助酒玩家性别,
          head=助酒玩家头像,
          delprice=助酒玩家砍价数额,
          bargaincode=煮酒码,
      }
    }
    

获取煮酒物品(购买或免费)

请求内容

module_type=6
opid=5
data={
    id=第几期,
    goodsid=物品id,
    idx=物品序号,
    bargaincode=煮酒码
}

处理流程

回复内容

module_type=6
opid=5
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/click_too_fast/use_yuanbao_failed/add_goods_failed),
    goodsid=物品id,
    idx=物品序号,
    bargaincode=煮酒码
}

获取助酒数据

请求内容

module_type=6
opid=6
data={
    id=第几期,
}

处理流程

回复内容

module_type=6
opid=6
data={
    result:EnumResult(success/activity_no_open/param_error/redis_error/data_error/help_none),
    helpdata = {
        nickname=煮酒玩家昵称,
        sex=煮酒玩家性别,
        head=煮酒玩家头像,
        delprice=助酒玩家砍价数额,
        bargaincode=煮酒码,
    }
}