Skip to content

Commit

Permalink
解决 make xref 的警告问题; 引入 redbug
Browse files Browse the repository at this point in the history
  • Loading branch information
leeyisoft committed Oct 20, 2023
1 parent 3a68310 commit 2cab2c3
Show file tree
Hide file tree
Showing 15 changed files with 130 additions and 53 deletions.
8 changes: 6 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ LOCAL_DEPS += cron
# LOCAL_DEPS += erlmedia

# erlang.mk会保证 DEPS依赖的包能运行在shell、run、tests命令的时候
DEPS = telemetry lager jsone ranch cowlib cowboy
DEPS += jwerl hashids recon observer_cli gen_smtp throttle
DEPS = jsone ranch cowlib cowboy
DEPS += jwerl hashids gen_smtp throttle
DEPS += qdate qdate_localtime
# goldrush 提供了快速的事件流处理
DEPS += goldrush
Expand All @@ -31,7 +31,11 @@ DEPS += epgsql pooler
DEPS += depcache
DEPS += syn
DEPS += ecron

# 运维诊断类型的库
DEPS += telemetry lager observer_cli recon redbug
DEPS += sync

# DEPS += nksip
DEPS += ersip rtps

Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@ Erlang/OTP 23 / Erlang/OTP 24 / Erlang/OTP 25
// 列表可安装的版本号
kerl list releases
kerl build 24.3.4.2 / kerl delete build 24.3.3
CPP=cpp EGREP=egrep kerl build 25.3.2.7
kerl delete build 24.3.3
kerl list builds
kerl install 24.3.4.2 ~/kerl/24.3.4.2
kerl install 25.3.2.7 ~/kerl/25.3.2.7
. /Users/leeyi/kerl/24.3.4.2/activate
. /Users/leeyi/kerl/25.3.2.7/activate
Later on, you can leave the installation typing:
kerl_deactivate
Expand Down
19 changes: 19 additions & 0 deletions apps/cron/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@


```
ecron:statistic().
ecron:add(test_job, "*/15 * * * * *", {demo_cron_logic, inspect, ["xxx"]}).
apply(demo_cron_logic, F, A).
ecron:activate(test_job).
ecron:statistic(test_job).
ecron:deactivate(test_job).
ecron:delete(test_job).
```

2 changes: 1 addition & 1 deletion apps/cron/src/demo_cron_logic.erl
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
% demo_cron_logic:add_every_4am_job()
add_every_4am_job() ->
JobName = every_4am_job,
MFA = {?MODULE, insepct, ["at 04:00 everyday."]},
MFA = {?MODULE, inspect, ["at 04:00 everyday."]},
{ok, JobName} = ecron:add(JobName, "0 4 * * *", MFA).


Expand Down
File renamed without changes.
26 changes: 26 additions & 0 deletions config/cron.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[
{crontab_jobs, [
%% {JobName, CrontabSpec, {M, F, A}}
%% {JobName, CrontabSpec, {M, F, A}, StartDateTime, EndDateTime}
%% CrontabSpec
%% 1. "Minute Hour DayOfMonth Month DayOfWeek"
%% 2. "Second Minute Hour DayOfMonth Month DayOfWeek"
%% 3. @yearly | @annually | @monthly | @weekly | @daily | @midnight | @hourly | @minutely
%% 4. @every 1h2m3s

%% Standard crontab spec without second (default second is 0 not *).
{crontab_job, "*/15 * * * *", {demo_cron_logic, inspect, ["Runs on 0, 15, 30, 45 minutes"]}},
%% Extend crontab spec with second.
{extend_crontab_job, "0 0 1-6/2,18 * * *", {demo_cron_logic, inspect, ["Runs on 1,3,6,18 o'clock"]}},
%% Crontab spec with alphabet.
{alphabet_job, "@hourly", {demo_cron_logic, inspect, ["Runs every(0-23) o'clock"]}},
%% Fixed interval spec.
{fixed_interval_job, "@every 5m", {demo_cron_logic, inspect, ["Runs every 5 minutes"]}},
%% Job with startDateTime and EndDateTime. Runs 0-23 o'clock since {11,0,0}.
{limit_datetime_job, "@hourly", {demo_cron_logic, inspect, ["Runs every(0-23) o'clock"]}, {11, 0, 0}, unlimited},
%% Job with max run count, default is `unlimited`
{max_run_count_job, "@daily", {demo_cron_logic, inspect, ["Runs daily"]}, unlimited, unlimited, [{max_count, 1000}]},
%% Parallel job, singleton default is true.
{no_singleton_job, "@minutely", {timer, sleep, [61000]}, unlimited, unlimited, [{singleton, false}]}
]}
]
1 change: 1 addition & 0 deletions doc/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* 调整收藏方案:清除 收藏专有的存储服务,改用定时任务扫描,在判断资源配如果没收藏嘞,就不删除;否则,过期删除之
* json 库只用jsone,移除 jsx依赖
* 项目支持 multi app (引入 apps/imlib apps/cron),调整相关目录
* 引入 redbug 库

# 0.1.12
* "/passport/" 开通的api也需要做签名验证;
Expand Down
16 changes: 16 additions & 0 deletions doc/redbug.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

https://github.com/massemanet/redbug

https://www.cloudby.me/2022/05/19/使用-redbug-跟踪-erlang/

```
4> redbug("your_module:your_private_function->return").
{156,1}
5> your_module:your_public_function().
% 19:59:13 <0.1.0>({erlang,apply,4})
% your_module:your_private_function(some, parameters)
% 19:59:13 <0.1.0>({erlang,apply,4})
% your_module:your_private_function/2 -> ok
ok
```
57 changes: 32 additions & 25 deletions include/deps.mk
Original file line number Diff line number Diff line change
Expand Up @@ -14,40 +14,21 @@ dep_gen_smtp = git https://gitee.com/imboy-tripartite-deps/gen_smtp 1.2.0
# goldrush 提供了快速的事件流处理
dep_goldrush = git https://gitee.com/imboy-tripartite-deps/goldrush 0.2.0
dep_hashids = git https://gitee.com/imboy-tripartite-deps/hashids-erlang 1.0.5
# hut 小型的日志处理库
dep_hut = git https://gitee.com/imboy-tripartite-deps/hut.git 1.4.0
# jsone An Erlang library for encoding, decoding JSON data.
dep_jsone = git https://gitee.com/imboy-tripartite-deps/jsone 1.8.0
# jsx an erlang application for consuming, producing and manipulating json
dep_jsx = git https://gitee.com/imboy-tripartite-deps/jsx.git v3.1.0
# jwerl JWT library
dep_jwerl = git https://gitee.com/imboy-tripartite-deps/jwerl 1.2.0
# dep_jwerl = git https://gitee.com/mirrors_emqx/jwerl 1.1.1
# lager 日志库
dep_lager = git https://gitee.com/imboy-tripartite-deps/lager 3.9.2

# dep_mysql = git https://gitee.com/imboy-tripartite-deps/mysql-otp 1.7.0
# dep_mysql = hex 1.8.0
# poolboy A hunky Erlang worker pool factory
#dep_poolboy = git https://gitee.com/imboy-tripartite-deps/poolboy 1.5.2

dep_epgsql = git https://gitee.com/imboy-tripartite-deps/epgsql.git 4.7.1
dep_pooler = git https://gitee.com/imboy-tripartite-deps/pooler.git 1.6.0

# Observer CLI 是一个可以被放入任何 Beam 节点的库,用于帮助 DevOps 人员诊断生产节点中的问题
dep_observer_cli = git https://gitee.com/imboy-tripartite-deps/observer_cli.git 1.7.4
# Recon 希望成为一套可用于生产环境的工具,用于诊断 Erlang 问题或安全地检查生产环境。
dep_recon = git https://gitee.com/imboy-tripartite-deps/recon.git 2.5.3
# depcache is an in-memory caching server for Erlang with dependency checks, cache expiration and local in process memoization of lookups.

#dep_khepri = hex 0.7.0
dep_depcache = git https://gitee.com/imboy-tripartite-deps/depcache.git master
# syn 全局进程注册表和进程组管理器,能够自动管理动态集群(添加/删除节点)并从网络分裂中恢复。
# Syn 是 Erlang/OTP global的 registry 和 pg模块的替代品。Syn 实现了 强最终一致性。
dep_syn = git https://gitee.com/imboy-tripartite-deps/syn.git 3.3.0

# Relx 是一个组装 Erlang/OTP 版本的库。给定发布规范和要在其中搜索 OTP 应用程序的目录列表,它将生成发布输出。
dep_relx = git https://gitee.com/imboy-tripartite-deps/relx.git v4.8.0
# bbmustache 一个无逻辑的模板。 deps by relx
dep_bbmustache = git https://gitee.com/imboy-tripartite-deps/bbmustache.git v1.12.2
# erlware_commons 为与 Erlang 一起分发的 stdlib 应用程序的扩展,被 qdate 依赖
Expand All @@ -59,20 +40,46 @@ dep_qdate_localtime = git https://gitee.com/imboy-tripartite-deps/qdate_localtim
dep_qdate = git https://gitee.com/imboy-tripartite-deps/qdate master
dep_throttle = git https://gitee.com/imboy-tripartite-deps/throttle.git 0.3.0

# fs Native Listener (Mac Windows Linux) 被 sync 依赖
dep_fs = git https://gitee.com/imboy-tripartite-deps/fs.git 6.1
# Sync 是一个开发者工具。它会即时重新编译和重新加载您的 Erlang 代码。
dep_sync = git https://gitee.com/imboy-tripartite-deps/sync.git v0.4.1

# ecron 用于 Erlang 的轻量级/高效的类似 cron 的作业调度库。
dep_ecron = git https://gitee.com/imboy-tripartite-deps/ecron.git v0.6.1
# Erlang 的纯函数式和泛型编程
dep_datum = git https://gitee.com/imboy-tripartite-deps/datum.git 4.6.1
# telemetry 用于指标和仪器的动态调度库。
dep_telemetry = git https://gitee.com/imboy-tripartite-deps/telemetry.git v1.2.1
# Erlang 的简单持久队列
# dep_esq = git https://gitee.com/imboy-tripartite-deps/esq.git master
dep_esq = hex 2.0.6


# Relx 是一个组装 Erlang/OTP 版本的库。给定发布规范和要在其中搜索 OTP 应用程序的目录列表,它将生成发布输出。
dep_relx = git https://gitee.com/imboy-tripartite-deps/relx.git v4.8.0
# hut 小型的日志处理库
dep_hut = git https://gitee.com/imboy-tripartite-deps/hut.git 1.4.0
# lager 日志库
dep_lager = git https://gitee.com/imboy-tripartite-deps/lager 3.9.2
# Observer CLI 是一个可以被放入任何 Beam 节点的库,用于帮助 DevOps 人员诊断生产节点中的问题
dep_observer_cli = git https://gitee.com/imboy-tripartite-deps/observer_cli.git 1.7.4
# Recon 希望成为一套可用于生产环境的工具,用于诊断 Erlang 问题或安全地检查生产环境。
dep_recon = git https://gitee.com/imboy-tripartite-deps/recon.git 2.5.4
# fs Native Listener (Mac Windows Linux) 被 sync 依赖
dep_fs = git https://gitee.com/imboy-tripartite-deps/fs.git 6.1
# Sync 是一个开发者工具。它会即时重新编译和重新加载您的 Erlang 代码。
dep_sync = git https://gitee.com/imboy-tripartite-deps/sync.git v0.4.1
# telemetry 用于指标和仪器的动态调度库。
dep_telemetry = git https://gitee.com/imboy-tripartite-deps/telemetry.git v1.2.1
# erlang tracing debugger
dep_redbug = git https://gitee.com/imboy-tripartite-deps/redbug.git 2.0.7


# dep_mysql = git https://gitee.com/imboy-tripartite-deps/mysql-otp 1.7.0
# dep_mysql = hex 1.8.0
# poolboy A hunky Erlang worker pool factory
#dep_poolboy = git https://gitee.com/imboy-tripartite-deps/poolboy 1.5.2

dep_epgsql = git https://gitee.com/imboy-tripartite-deps/epgsql.git 4.7.1
dep_pooler = git https://gitee.com/imboy-tripartite-deps/pooler.git 1.6.0

# depcache is an in-memory caching server for Erlang with dependency checks, cache expiration and local in process memoization of lookups.

# dep_nksip = git https://gitee.com/imboy-tripartite-deps/nksip v0.6.1
# dep_nkpacket = git https://gitee.com/imboy-tripartite-deps/nkpacket.git master

Expand Down
2 changes: 1 addition & 1 deletion rebar.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{deps, [
{telemetry,".*",{git,"https://github.com/beam-telemetry/telemetry.git","v1.2.1"}},{lager,".*",{git,"https://gitee.com/imboy-tripartite-deps/lager","3.9.2"}},{jsone,".*",{git,"https://gitee.com/imboy-tripartite-deps/jsone","1.8.0"}},{ranch,".*",{git,"https://gitee.com/imboy-tripartite-deps/ranch.git","2.1.0"}},{cowlib,".*",{git,"https://gitee.com/imboy-tripartite-deps/cowlib","2.12.1"}},{cowboy,".*",{git,"https://gitee.com/imboy-tripartite-deps/cowboy","2.10.0"}},{jsx,".*",{git,"https://gitee.com/imboy-tripartite-deps/jsx.git","v3.1.0"}},{jwerl,".*",{git,"https://gitee.com/imboy-tripartite-deps/jwerl","1.2.0"}},{hashids,".*",{git,"https://gitee.com/imboy-tripartite-deps/hashids-erlang","1.0.5"}},{recon,".*",{git,"https://gitee.com/imboy-tripartite-deps/recon.git","2.5.3"}},{observer_cli,".*",{git,"https://gitee.com/imboy-tripartite-deps/observer_cli.git","1.7.4"}},{gen_smtp,".*",{git,"https://gitee.com/imboy-tripartite-deps/gen_smtp","1.2.0"}},{qdate,".*",{git,"https://gitee.com/imboy-tripartite-deps/qdate","master"}},{throttle,".*",{git,"https://gitee.com/imboy-tripartite-deps/throttle.git","0.3.0"}},{goldrush,".*",{git,"https://gitee.com/imboy-tripartite-deps/goldrush","0.2.0"}},{datum,".*",{git,"https://gitee.com/imboy-tripartite-deps/datum.git","4.6.1"}},{epgsql,".*",{git,"https://gitee.com/imboy-tripartite-deps/epgsql.git","4.7.1"}},{pooler,".*",{git,"https://gitee.com/imboy-tripartite-deps/pooler.git","1.6.0"}},{depcache,".*",{git,"https://gitee.com/imboy-tripartite-deps/depcache.git","master"}},{syn,".*",{git,"https://gitee.com/imboy-tripartite-deps/syn.git","3.3.0"}},{ecron,".*",{git,"https://gitee.com/imboy-tripartite-deps/ecron.git","v0.6.1"}},{sync,".*",{git,"https://gitee.com/imboy-tripartite-deps/sync.git","v0.4.1"}}
{jsone,".*",{git,"https://gitee.com/imboy-tripartite-deps/jsone","1.8.0"}},{ranch,".*",{git,"https://gitee.com/imboy-tripartite-deps/ranch.git","2.1.0"}},{cowlib,".*",{git,"https://gitee.com/imboy-tripartite-deps/cowlib","2.12.1"}},{cowboy,".*",{git,"https://gitee.com/imboy-tripartite-deps/cowboy","2.10.0"}},{jwerl,".*",{git,"https://gitee.com/imboy-tripartite-deps/jwerl","1.2.0"}},{hashids,".*",{git,"https://gitee.com/imboy-tripartite-deps/hashids-erlang","1.0.5"}},{gen_smtp,".*",{git,"https://gitee.com/imboy-tripartite-deps/gen_smtp","1.2.0"}},{throttle,".*",{git,"https://gitee.com/imboy-tripartite-deps/throttle.git","0.3.0"}},{qdate,".*",{git,"https://gitee.com/imboy-tripartite-deps/qdate","master"}},{qdate_localtime,".*",{git,"https://gitee.com/imboy-tripartite-deps/qdate_localtime","1.2.1"}},{goldrush,".*",{git,"https://gitee.com/imboy-tripartite-deps/goldrush","0.2.0"}},{datum,".*",{git,"https://gitee.com/imboy-tripartite-deps/datum.git","4.6.1"}},{epgsql,".*",{git,"https://gitee.com/imboy-tripartite-deps/epgsql.git","4.7.1"}},{pooler,".*",{git,"https://gitee.com/imboy-tripartite-deps/pooler.git","1.6.0"}},{depcache,".*",{git,"https://gitee.com/imboy-tripartite-deps/depcache.git","master"}},{syn,".*",{git,"https://gitee.com/imboy-tripartite-deps/syn.git","3.3.0"}},{ecron,".*",{git,"https://gitee.com/imboy-tripartite-deps/ecron.git","v0.6.1"}},{telemetry,".*",{git,"https://gitee.com/imboy-tripartite-deps/telemetry.git","v1.2.1"}},{lager,".*",{git,"https://gitee.com/imboy-tripartite-deps/lager","3.9.2"}},{observer_cli,".*",{git,"https://gitee.com/imboy-tripartite-deps/observer_cli.git","1.7.4"}},{recon,".*",{git,"https://gitee.com/imboy-tripartite-deps/recon.git","2.5.4"}},{redbug,".*",{git,"https://gitee.com/imboy-tripartite-deps/redbug.git","2.0.7"}},{sync,".*",{git,"https://gitee.com/imboy-tripartite-deps/sync.git","v0.4.1"}},{ersip,".*",{git,"https://gitee.com/imboy-tripartite-deps/ersip.git","master"}},{rtps,".*",{git,"https://gitee.com/imboy-tripartite-deps/rtps.git","master"}}
]}.
{erl_opts, [debug_info,warn_export_vars,warn_shadow_vars,warn_obsolete_guard,{parse_transform,lager_transform}]}.
2 changes: 1 addition & 1 deletion src/auth_handler.erl
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,5 @@ assets(<<"POST">>, Req0) ->
end;
assets(<<"GET">>, Req0) ->
% Body is <<"fail">>
Body = auth_logic:verify_for_assets(undefined, undefined, undefined),
Body = auth_logic:verify_for_assets(undefined, undefined, undefined, undefined),
cowboy_req:reply(200, #{<<"content-type">> => <<"text/html">>}, unicode:characters_to_binary(Body, utf8), Req0).
17 changes: 9 additions & 8 deletions src/imboy_app.erl
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,15 @@ stop(_State) ->
%% Internal Function Definitions
%% ===================================================================
-spec start_quic(cowboy_router:dispatch_rules()) -> {ok, pid()} | {error, any()}.
start_quic(Dispatch) ->
PrivDir = code:priv_dir(imboy),
cowboy:start_quic(#{socket_opts => [
% {cert, "deps/quicer/test/quicer_SUITE_data/cert.pem"},
% {key, "deps/quicer/test/quicer_SUITE_data/key.pem"}
{cert, PrivDir ++ config_ds:env(certfile)},
{key, PrivDir ++ config_ds:env(keyfile)}]},
#{env => #{dispatch => Dispatch}}).
start_quic(_Dispatch) ->
{error, "调整中的功能"}.
% PrivDir = code:priv_dir(imboy),
% cowboy:start_quic(#{socket_opts => [
% % {cert, "deps/quicer/test/quicer_SUITE_data/cert.pem"},
% % {key, "deps/quicer/test/quicer_SUITE_data/key.pem"}
% {cert, PrivDir ++ config_ds:env(certfile)},
% {key, PrivDir ++ config_ds:env(keyfile)}]},
% #{env => #{dispatch => Dispatch}}).


-spec start_tls(map(), integer()) -> {ok, pid()} | {error, any()}.
Expand Down
12 changes: 6 additions & 6 deletions src/user_tag_logic.erl
Original file line number Diff line number Diff line change
Expand Up @@ -98,18 +98,18 @@ change_name(Count, _Uid, _Scene, _TagId, TagName) when Count > 0 ->
change_name(0, Uid, Scene, TagId, TagName) ->
NowTs = imboy_dt:millisecond(),
CreatedAt = integer_to_binary(NowTs),
RefCount = imboy_db:pluck(<<"user_tag_relation">>,
<<"scene = ", Scene/binary, " AND tag_id = ", TagId/binary, " AND user_id = ",
Uid/binary>>,
<<"count(*)">>,
0),
% RefCount = imboy_db:pluck(<<"user_tag_relation">>,
% <<"scene = ", Scene/binary, " AND tag_id = ", TagId/binary, " AND user_id = ",
% Uid/binary>>,
% <<"count(*)">>,
% 0),
Sql = <<"SELECT object_id FROM public.user_tag_relation WHERE scene = ", Scene/binary, " AND user_id = ",
Uid/binary, " AND tag_id = ", TagId/binary>>,
ObjectIds2 = imboy_db:list(Sql),
% lager:error(io_lib:format("user_tag_logic:change_name/4 ~s ObjectIds2: ~p; ~n", [Sql, ObjectIds2])),
imboy_db:with_transaction(fun(Conn) ->
% 保存 public.user_tag
user_tag_relation_repo:update_tag(Conn, TagId, TagName, RefCount, Uid, CreatedAt),
user_tag_relation_repo:update_tag(Conn, TagId, TagName, Uid, CreatedAt),

[change_scene_tag(Conn, Scene, Uid, I, [{TagId, TagName}]) || {I} <- ObjectIds2],
ok
Expand Down
10 changes: 5 additions & 5 deletions src/user_tag_relation_repo.erl
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ save_tag(Conn, Uid, Scene, CreatedAt, Tag) ->
-spec update_tag(any(), binary(), binary(), binary(), binary()) -> ok.
update_tag(Conn, TagId, TagName, Uid, CreatedAt) ->
Tb = imboy_db:public_tablename(<<"user_tag">>),
% lager:info(io_lib:format("user_tag_relation_repo:update_tag/6 Tb:~p ~n", [Tb])),
% lager:info(io_lib:format("user_tag_relation_repo:update_tag/5 Tb:~p ~n", [Tb])),
Args = ["UPDATE ",
Tb,
<<" SET name = '", TagName/binary, "', ">>,
Expand All @@ -116,17 +116,17 @@ update_tag(Conn, TagId, TagName, Uid, CreatedAt) ->
TagId,
" AND creator_user_id = ",
Uid],
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/6 Args:~p ~n", [Args])),
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/5 Args:~p ~n", [Args])),
UpSql = imboy_func:implode("", Args),
% lager:info(io_lib:format("user_tag_relation_repo:update_tag/6 sql:~p;~n", [UpSql])),
% lager:info(io_lib:format("user_tag_relation_repo:update_tag/5 sql:~p;~n", [UpSql])),
{ok, Stmt} = epgsql:parse(Conn, UpSql),
Res = epgsql:execute_batch(Conn, [{Stmt, []}]),
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/6 Res:~p;~n", [Res])),
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/5 Res:~p;~n", [Res])),
case Res of
[{ok, 1}] ->
{TagId, TagName};
_ ->
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/6 Res:~p ~n", [Res])),
% lager:error(io_lib:format("user_tag_relation_repo:update_tag/5 Res:~p ~n", [Res])),
{0, TagName}
end.

Expand Down
2 changes: 1 addition & 1 deletion src/websocket_logic.erl
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ c2g(MsgId, CurrentUid, Data) ->
Gid = proplists:get_value(<<"to">>, Data),
ToGID = imboy_hashids:uid_decode(Gid),
% TODO check is group member
MemberUids = group_member_ds:member_uids(ToGID, CurrentUid),
MemberUids = group_member_ds:member_uids(ToGID),
% Uids.
NowTs = imboy_dt:millisecond(),
Msg = [{<<"id">>, MsgId},
Expand Down

0 comments on commit 2cab2c3

Please sign in to comment.