rebar3 服务器

This commit is contained in:
lwt
2026-05-19 11:30:21 +08:00
parent aeb18acee0
commit 03fd2da480
5187 changed files with 3670646 additions and 0 deletions
+291
View File
@@ -0,0 +1,291 @@
%%%-------------------------------------------------------------------
%%% @copyright (C) 2021, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 25. 5月 2021 11:15
%%%-------------------------------------------------------------------
-ifndef(__BASE_HRL__).
-define(__BASE_HRL__, true).
-include_lib("stdlib/include/ms_transform.hrl").
-include_lib("kernel/include/logger.hrl").
-define(RPC_CALL_TIMEOUT, 5000).
-define(CALL_TIMEOUT, 5000).
%% atom define
%% 游戏校验key
-define(AUTH_KEY, "4399-auth-key").
-define(TBL_KEY, "44c78a8401fd692bdefb58a32220861b").
-define(RECHARGE_KEY, "7e532cad3b95689afc4fddb7e9a83e09").
-define(FN_NORMAL_KEY, "aef842b91f54a878d00ad0897ed02473").
-define(CLIENT_KEY, "0248537b34d9cd80f8121fe07ec58eee").
-define(RCC_KEY, "53b16e47b634cd6046e4da2884ff77d8").
-define(API_KEY, "80260282bb470b304b60c03ab113e3ea"). % 通用api key
-ifndef(OK).
-define(OK, ok).
-endif.
%% 这里故意用的err,避免以系统抛异常的error冲突
-ifndef(ERROR).
-define(ERROR, error).
-endif.
%% 这里故意用的err,避免以系统抛异常的error冲突
-ifndef(ERR).
-define(ERR, err).
-endif.
-ifndef(TRUE).
-define(TRUE, true).
-endif.
-ifndef(FALSE).
-define(FALSE, false).
-endif.
-ifndef(TRUE_INT).
-define(TRUE_INT, 1).
-endif.
-ifndef(FALSE_INT).
-define(FALSE_INT, 0).
-endif.
-define(INT_TO_BOOLEAN(I), I =/= 0).
-define(BOOLEAN_TO_INT(I), ?IF(I, ?TRUE_INT, ?FALSE_INT)).
-ifndef(UNDEFINED).
-define(UNDEFINED, undefined).
-endif.
-ifndef(CONTINUE).
-define(CONTINUE, continue).
-endif.
-ifndef(IGNORE).
-define(IGNORE, ignore).
-endif.
-ifndef(INFINITY).
-define(INFINITY, infinity).
-endif.
-ifndef(NONE).
-define(NONE, none).
-endif.
-ifndef(STOP).
-define(STOP, stop).
-endif.
-ifndef(SKIP).
-define(SKIP, skip).
-endif.
-ifndef(DISABLED).
-define(DISABLED, disabled).
-endif.
-ifndef(ENABLED).
-define(ENABLED, enabled).
-endif.
-ifndef(ONLINE).
-define(ONLINE, online).
-endif.
-ifndef(OFFLINE).
-define(OFFLINE, offline).
-endif.
-ifndef(VALUE).
-define(VALUE, value).
-endif.
-ifndef(CONTINUE).
-define(CONTINUE, continue).
-endif.
-define(IF(C, T), (?IF(C, T, skip))).
-define(IF(C, T, F), (case (C) of true -> (T); false -> (F) end)).
-define(MAP_GET(__K__, __Map__, __Default__), (case (__Map__) of #{__K__ := __V__} -> __V__; #{} -> (__Default__) end)).
-define(THROW(ErrCode), throw(ErrCode)).
-define(ASSERT(Express),
case (Express) of
true ->
ok;
false ->
error(assert_error)
end).
-define(ASSERT(Express, ErrCode),
case (Express) of
true ->
ok;
false ->
error(ErrCode)
end).
%% try_catch 捕获玩家自己抛的异常,需要玩家自行匹配
-define(TRY_CATCH(Fun),
try
(Fun)
catch
_:TRY_CACHE_Error:Trace ->
?ERROR(?MODULE, "snip err, Error = ~p~n", [{TRY_CACHE_Error, Trace}]),
TRY_CACHE_Error
end
).
-define(CHILD_SPEC(I, Type), {I, {I, start_link, []}, permanent, 50000, Type, [I]}).
-define(CHILD_SPEC(I, Type, Args), {I, {I, start_link, Args}, permanent, 50000, Type, [I]}).
-define(CHILD_SPEC(C, I, Type, Args), {C, {I, start_link, Args}, permanent, 50000, Type, [I]}).
%% 控制台打印
-define(PRINT(F), ?PRINT(F, [])).
-define(PRINT(F, D), (io:format("~w:~w/~w:~w ~w ~w " ++ F ++ "\n", [?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?LINE, self(), erlang:get('!role_id!') | D]))).
-define(DEBUG(T, F, D), ?LOG_DEBUG(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(INFO(T, F, D), ?LOG_INFO(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(WARN(T, F, D), ?LOG_WARNING(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(CRIT(T, F, D), ?LOG_CRITICAL(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(NOTICE(T, F, D), ?LOG_NOTICE(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(ERROR(T, F, D), ?LOG_ERROR(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(DEBUG(F, D), ?LOG_DEBUG(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(INFO(F, D), ?LOG_INFO(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(WARN(F, D), ?LOG_WARNING(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(CRIT(F, D), ?LOG_CRITICAL(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(NOTICE(F, D), ?LOG_NOTICE(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(ERROR(F, D), ?LOG_ERROR(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_base]})).
-define(DEBUG_TAG(Tag, Data), ?DEBUG(Tag, "~p=~w", [??Data, Data])).
%% http单独打印
-define(HTTP_DEBUG(T, F, D), ?LOG_DEBUG(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_INFO(T, F, D), ?LOG_INFO(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_WARN(T, F, D), ?LOG_WARNING(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_CRIT(T, F, D), ?LOG_CRITICAL(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_NOTICE(T, F, D), ?LOG_NOTICE(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_ERROR(T, F, D), ?LOG_ERROR(F, D, #{tag => T, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_DEBUG(F, D), ?LOG_DEBUG(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_INFO(F, D), ?LOG_INFO(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_WARN(F, D), ?LOG_WARNING(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_CRIT(F, D), ?LOG_CRITICAL(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_NOTICE(F, D), ?LOG_NOTICE(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
-define(HTTP_ERROR(F, D), ?LOG_ERROR(F, D, #{tag => ?MODULE, id => erlang:get('!role_id!'), domain => [ms_http]})).
%% 协议录制
-define(GET_PROTO_TIME, (
case erlang:get(proto_time) of
?UNDEFINED ->
erlang:put(proto_time, misc_lib:now_ms()),
0;
ProtoTime ->
ProtoTime1 = misc_lib:now_ms(),
erlang:put(proto_time, ProtoTime1),
ProtoTime1 - ProtoTime
end)).
-define(PROTO_TRACE(F, D), ?LOG_DEBUG(F, D, #{tag => proto, time1=>?GET_PROTO_TIME, id => erlang:get('!role_id!'), domain=>[proto]})).
%% 打印错误码日志
-define(CODE_LOG(Code, Desc, LogArgs), ?INFO(?MODULE, "err_code:~p ~ts ~p=~w", [Code, Desc, ??LogArgs, LogArgs])).
%% 错误码处理, 打印错误码日志,返回{err,code}
-define(ERROR_CODE(Code, LogArgs),
begin
?CODE_LOG(Code, "", LogArgs),
{?ERR, Code}
end).
%% 错误码处理, 打印错误码日志,返回{err,code}
-define(ERROR_CODE(Code, Desc, LogArgs),
begin
?CODE_LOG(Code, Desc, LogArgs),
{?ERR, Code}
end).
-define(SECONDS_PER_MINUTE, 60).
-define(SECONDS_PER_HOUR, 3600).
-define(SECONDS_PER_DAY, 86400).
-define(SECONDS_PER_WEEK, 604800).
-define(SECONDS_PER_YEAR, 31536000).
-define(SECONDS_PER_LEAP_YEAR, 31622400).
-define(SECONDS_FROM_0_TO_1970, 62167219200).
-define(MSECS_PER_SEC, 1000).
-define(MSECS_PER_MINUTE, 60000).
-define(MSECS_PER_HOUR, 3600000).
-define(MSECS_PER_DAY, 86400000).
-define(MSECS_PER_WEEK, 604800000).
-define(DAYS_PER_WEEK, 7).
-define(DAYS_PER_YEAR, 365).
-define(DAYS_PER_LEAP_YEAR, 366).
-define(DAYS_PER_4YEARS, 1461).
-define(DAYS_PER_100YEARS, 36524).
-define(DAYS_PER_400YEARS, 146097).
-define(DAYS_FROM_0_TO_1970, 719528).
-define(TEN, 10). % 0.01k
-define(ONE_HUNDRED, 100). % 0.1k
-define(ONE_THOUSAND, 1000). % 1k
-define(TEN_THOUSAND, 10000). % 1w
-define(HUNDRED_THOUSAND, 100000). % 10w
-define(ONE_MILLION, 1000000). % 100w
-define(HUNDRED_MILLION, 100000000). % 1亿
-define(INTMAX, 2147483647).
-define(UINTMAX, 4294967294).
-define(UINT64MAX, 18446744073709551615).
-define(RECORD_NAME_POS, 1).
-type role_id() :: integer().
%% 日常清理偏移时间
-define(DAILY_HOUR, 0).
-define(DAILY_RESET_SHIFT_TIME, (3600 * ?DAILY_HOUR)).
-define(ETS_OPTIONS, [set, public, named_table, {keypos, 1}, {read_concurrency, true}, {write_concurrency, auto}]).
%% todo,以下宏属于游戏相关的,写在这里是因为登录服和游戏服都要用到同一套宏定义
%% 服务器状态
-define(SERVER_STATUS_SMOOTH, 1). %% 服务器状态 - 流畅
-define(SERVER_STATUS_CROWD, 2). %% 服务器转态 - 拥挤
-define(SERVER_STATUS_FULL, 3). %% 服务器状态 - 爆满
%% 蜂鸟角色互通平台
-define(FN_PLATFORM_APP_AND, <<"1">>).
-define(FN_PLATFORM_APP_IOS, <<"2">>).
-define(FN_PLATFORM_WECHAT_AND, <<"1388">>).
-define(FN_PLATFORM_WECHAT_IOS, <<"1390">>).
-define(FN_PLATFORM_INTER_LIST, [?FN_PLATFORM_APP_AND, ?FN_PLATFORM_APP_IOS, ?FN_PLATFORM_WECHAT_AND, ?FN_PLATFORM_WECHAT_IOS]).
%% 角色类型
-define(ACCOUNT_TYPE_VISITOR, 0). %% 游客
-define(ACCOUNT_TYPE_NORMAL, 1). %% 普通玩家
-define(ACCOUNT_TYPE_INNER, 2). %% 内部玩家
-define(ACCOUNT_TYPE_INNER_MGR, 3). %% 内部玩家管理员
-define(SERVER_ACTIVE_AUTO, 0). %% 服务器自动激活,开服时间到了自动开服
-define(SERVER_ACTIVE_CLOSE, 1). %% 服务器未激活,开服时间到了也不开服
-define(SERVER_ACTIVE_OPEN, 2). %% 服务器立刻激活,马上开服
-define(PLATFORM_ZONE_ALL, 0). %% 通用专区
-define(PLATFORM_ZONE_WECHAT, 1). %% 微信专区
-define(PLATFORM_ZONE_APP, 2). %% app专区
-define(PLATFORM_ZONE_WECHAT_FN_PLATFORMS, [?FN_PLATFORM_WECHAT_AND, ?FN_PLATFORM_WECHAT_IOS]).
-endif.
+113
View File
@@ -0,0 +1,113 @@
%%%-------------------------------------------------------------------
%%% @copyright (C) 2021, 四三九九
%%% @doc
%%%
%%% @end
%%% Created : 2021-07-28 14:58:59
%%%-------------------------------------------------------------------
-ifndef(__MS_TBLAPI_HRL__).
-define(__MS_TBLAPI_HRL__, true).
-include("base.hrl").
%% -include("tblapi_c.hrl").
%% -include("tblapi_pb.hrl").
-define(EXPIRED_TIME, 300). %% 过期时间
-define(HTTP_TIMEOUT, 5000).
%% 错误码
-ifdef(CODE_SUCC).
-undef(CODE_SUCC).
-endif.
-ifdef(CODE_ERR_DUP).
-undef(CODE_ERR_DUP).
-endif.
-ifdef(CODE_ERR_PARAM).
-undef(CODE_ERR_PARAM).
-endif.
-ifdef(CODE_PARAM_INVALID).
-undef(CODE_PARAM_INVALID).
-endif.
-ifdef(CODE_ERR_AUTH).
-undef(CODE_ERR_AUTH).
-endif.
-ifdef(CODE_ERR_DATA).
-undef(CODE_ERR_DATA).
-endif.
-ifdef(CODE_ERR_IP).
-undef(CODE_ERR_IP).
-endif.
-ifdef(CODE_ERR_OTHER).
-undef(CODE_ERR_OTHER).
-endif.
-define(CODE_SUCC, <<"0">>). %% 操作成功
-define(CODE_ERR_DUP, <<"1">>). %% 请求重复
-define(CODE_ERR_PARAM, <<"101">>). %% 参数错误
-define(CODE_PARAM_INVALID, <<"102">>). %% 参数错误
-define(CODE_ERR_AUTH, <<"202">>). %% 验证错误
-define(CODE_ERR_DATA, <<"301">>). %% 数据部分错误
-define(CODE_ERR_IP, <<"888">>). %% IP错误,非白名单IP
-define(CODE_ERR_OTHER, <<"999">>). %% 其他错误
%% 邮件发送类型
-define(SEND_BY_ROLE_NAME, 1).
-define(SEND_BY_ROLE_ID, 2).
-define(SEND_BY_ROLE_ACCOUNT, 3).
-define(SEND_BY_CONDITION, 4).
-define(SEND_TO_EVERYBODY, 5).
-define(SEND_TO_ONLINE_PALYER, 6).
%% 玩家详情数据模式
-define(TABLE_TYPE_1_VS_1, 1). %% 1对1
-define(TABLE_TYPE_1_VS_N, 2). %% 1对多
-define(TABLE_TYPE_1_VS_N2, 3). %% 特殊1对多
%% 白名单ip
-define(WHITE_IP_LIST,
[
%% T后台
"42.62.31.88"
, "106.52.229.108"
, "172.20.16.46"
, "43.136.74.50"
, "111.230.233.101"
, "106.52.39.247"
%% T后台hk
, "150.109.109.6"
, "43.154.4.184"
%% 聊天监控平台
, "42.62.31.81"
, "109.244.51.16"
, "120.31.139.140"
%% 统一网关 todo 应该t后台/风控/蜂鸟都接了统一网关
, "43.138.173.45"
, "119.29.184.236"
, "172.20.16.18"
, "172.20.48.15"
]).
-define(WHITE_IP_SEGMENT_LIST,
[
%% T后台
%% 121.201.56.0 ~ 121.201.56.255
"121.201.56.0/24"
, "124.243.195.0/24"
]).
-define(ETS_TBLAPI_FLAG, ets_tblapi_flag).
-define(ETS_API_FLAG, ets_api_flag).
-define(TBLKEY_RET, ret).
-define(TBLKEY_MSG, msg).
-define(TBLKEY_DATA, data).
-define(TBLKEY_TOTAL_NUM, totalNum).
-define(TBLKEY_DESC, desc).
-define(TBLKEY_TABLE_TYPE, tableType).
-define(OSS_SEX_ALL, 0). % 全体玩家
-define(OSS_SEX_MALE, 1). % 男
-define(OSS_SEX_FEMALE, 2). % 女
-endif.
+34
View File
@@ -0,0 +1,34 @@
-ifndef(__TABLE_HRL__).
-define(__TABLE_HRL__, true).
%% -------------------------------------------------------------------
%% 表配置
%% -------------------------------------------------------------------
-record(table, {
tab_name, %% 数据库表对应的表名,也是代码里对应的record名
field_list = [], %% 字段列表,对应mysql数据库表的字段 [#field{}...]
prim_key_list = [], %% 表主键,为空默认表的第一个字段作为主键;多个字段表示联合主键
index_list = [], %% 表索引,自动创建数据库表时自动创建索引,该字段只有数据库作用到
uniq_id_field = undefined, %% 唯一id字段,类似于唯一索引,undefined表示该表不需要唯一id字段;该字段主要用于生成select max取表的最大唯一id值
pre_load = false, %% 启动时是否全量加载数据,true/false
all_clear = false, %% 表示可否通过ms_cache:delete_all_objects方法删除表的所有数据;慎用,不重要数据可以用该字段
merge_type = 0, %% 合服类型,用于生成合服sql,0-保留主从服数据(默认值) 1-保留主服数据 2-保留从服数据 3-删除主从服数据 4-不处理
merge_ignore_prim_key_conflict = false, %% 合服时是否忽略主键冲突,true-忽略冲突,false-不忽略冲突(默认值)
worker_count = 0, %% 表的工作进程数量
split_zone_column = undefined, %% 表的分区字段
copy_from_table = undefined, %% 该表从哪一张表复制,两张表结构完全相同
server_types = [game_server] %% 表的服务类型
}).
%% -------------------------------------------------------------------
%% 字段配置
%% -------------------------------------------------------------------
-record(field, {
name, %% 字段名
type = int, %% 类型,int | binary | list | map | atom | boolean | tuple | any
len = 0, %% 数据库表中该字段的长度;Len=0 且 Type=list/map/tuple 时用text存储,Type=binary/any时用blob存储
common = "", %% 字段的说明
sync = true %% 是否同步到数据库表,true | false;当sync=false,表示该字段是临时数据,数据库表也没有该字段
}).
-endif.