mirror of
https://github.com/processone/ejabberd.git
synced 2024-07-14 23:44:18 +02:00
Add command to persist recent MUC messages (EJABS-1785)
Example: $ejabberdctl persist_recent_messages Host 'localhost' , 4 messages persisted in 12 rooms
This commit is contained in:
parent
d736c47649
commit
31f6a9e66e
|
@ -49,7 +49,8 @@
|
||||||
dump_to_textfile/1, dump_to_textfile/2,
|
dump_to_textfile/1, dump_to_textfile/2,
|
||||||
mnesia_change_nodename/4,
|
mnesia_change_nodename/4,
|
||||||
restore/1, % Still used by some modules
|
restore/1, % Still used by some modules
|
||||||
moderate_room_history/2
|
moderate_room_history/2,
|
||||||
|
persist_recent_messages/0
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-include("ejabberd.hrl").
|
-include("ejabberd.hrl").
|
||||||
|
@ -210,6 +211,11 @@ commands() ->
|
||||||
module = ?MODULE, function = moderate_room_history,
|
module = ?MODULE, function = moderate_room_history,
|
||||||
args = [{room, string}, {nick, string}],
|
args = [{room, string}, {nick, string}],
|
||||||
result = {res, restuple}}
|
result = {res, restuple}}
|
||||||
|
#ejabberd_commands{name = persist_recent_messages, tags = [server],
|
||||||
|
desc = "Force recent muc messages to be savd on DB",
|
||||||
|
module = ?MODULE, function = persist_recent_messages,
|
||||||
|
args = [],
|
||||||
|
result = {res, restuple}}
|
||||||
].
|
].
|
||||||
|
|
||||||
%%%
|
%%%
|
||||||
|
@ -225,8 +231,14 @@ moderate_room_history(Room, Nick) ->
|
||||||
_ ->
|
_ ->
|
||||||
io_lib:format("Bad nodes: ~p", [BadNodes])
|
io_lib:format("Bad nodes: ~p", [BadNodes])
|
||||||
end,
|
end,
|
||||||
{ok, io:format("Deleted: ~p ~s", [Res, B])}.
|
{ok, io_lib:format("Deleted: ~p ~s", [Res, B])}.
|
||||||
|
|
||||||
|
persist_recent_messages() ->
|
||||||
|
Saved = [ {Host, mod_muc:persist_recent_messages(Host)} || Host <- ?MYHOSTS],
|
||||||
|
R = lists:map(fun({Host, {RoomsPersisted, Messages}}) ->
|
||||||
|
io_lib:format("Host '~s' , ~p messages persisted in ~p rooms\n", [Host, Messages, RoomsPersisted])
|
||||||
|
end, Saved),
|
||||||
|
{ok,io_lib:format("~s", [R])}.
|
||||||
|
|
||||||
%%%
|
%%%
|
||||||
%%% Server management
|
%%% Server management
|
||||||
|
|
|
@ -48,7 +48,8 @@
|
||||||
get_vh_rooms/1,
|
get_vh_rooms/1,
|
||||||
is_broadcasted/1,
|
is_broadcasted/1,
|
||||||
can_use_nick/3,
|
can_use_nick/3,
|
||||||
moderate_room_history/2]).
|
moderate_room_history/2,
|
||||||
|
persist_recent_messages/1]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
||||||
|
@ -114,6 +115,18 @@ shutdown_rooms(Host) ->
|
||||||
[Pid ! 'shutdown' || Pid <- Rooms],
|
[Pid ! 'shutdown' || Pid <- Rooms],
|
||||||
Rooms.
|
Rooms.
|
||||||
|
|
||||||
|
%% Returns {RoomsPersisted, MessagesPersisted}
|
||||||
|
persist_recent_messages(Host) ->
|
||||||
|
MyHost = gen_mod:get_module_opt_host(Host, mod_muc, "conference.@HOST@"),
|
||||||
|
Rooms = mnesia:dirty_select(muc_online_room,
|
||||||
|
[{#muc_online_room{name_host = '$1', pid = '$2'},
|
||||||
|
[{'==', {element, 2, '$1'}, MyHost}],
|
||||||
|
['$2']}]),
|
||||||
|
lists:foldl(fun(Pid, {NRooms, Messages}) ->
|
||||||
|
case mod_muc_room:persist_recent_messages(Pid) of
|
||||||
|
{ok, {persisted, N}} -> {NRooms +1, Messages +N};
|
||||||
|
{ok, not_persistent} -> {NRooms, Messages}
|
||||||
|
end end, {0, 0}, Rooms).
|
||||||
|
|
||||||
moderate_room_history(RoomStr, Nick) ->
|
moderate_room_history(RoomStr, Nick) ->
|
||||||
Room = jlib:string_to_jid(RoomStr),
|
Room = jlib:string_to_jid(RoomStr),
|
||||||
|
|
|
@ -41,7 +41,8 @@
|
||||||
start/2,
|
start/2,
|
||||||
migrate/3,
|
migrate/3,
|
||||||
route/4,
|
route/4,
|
||||||
moderate_room_history/2]).
|
moderate_room_history/2,
|
||||||
|
persist_recent_messages/1]).
|
||||||
|
|
||||||
%% gen_fsm callbacks
|
%% gen_fsm callbacks
|
||||||
-export([init/1,
|
-export([init/1,
|
||||||
|
@ -116,6 +117,8 @@ migrate(FsmRef, Node, After) ->
|
||||||
moderate_room_history(FsmRef, Nick) ->
|
moderate_room_history(FsmRef, Nick) ->
|
||||||
?GEN_FSM:sync_send_all_state_event(FsmRef, {moderate_room_history, Nick}).
|
?GEN_FSM:sync_send_all_state_event(FsmRef, {moderate_room_history, Nick}).
|
||||||
|
|
||||||
|
persist_recent_messages(FsmRef) ->
|
||||||
|
?GEN_FSM:sync_send_all_state_event(FsmRef, persist_recent_messages).
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% Callback functions from gen_fsm
|
%%% Callback functions from gen_fsm
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
@ -752,6 +755,9 @@ handle_sync_event({moderate_room_history, Nick}, _From, StateName, #state{histor
|
||||||
Moderated = History#lqueue.len - NewHistory#lqueue.len,
|
Moderated = History#lqueue.len - NewHistory#lqueue.len,
|
||||||
{reply, {ok, integer_to_list(Moderated)}, StateName, StateData#state{history = NewHistory}};
|
{reply, {ok, integer_to_list(Moderated)}, StateName, StateData#state{history = NewHistory}};
|
||||||
|
|
||||||
|
handle_sync_event(persist_recent_messages, _From, StateName, StateData) ->
|
||||||
|
{reply, persist_muc_history(StateData), StateName, StateData};
|
||||||
|
|
||||||
handle_sync_event({get_disco_item, JID, Lang}, _From, StateName, StateData) ->
|
handle_sync_event({get_disco_item, JID, Lang}, _From, StateName, StateData) ->
|
||||||
Reply = get_roomdesc_reply(JID, StateData,
|
Reply = get_roomdesc_reply(JID, StateData,
|
||||||
get_roomdesc_tail(StateData, Lang)),
|
get_roomdesc_tail(StateData, Lang)),
|
||||||
|
@ -956,12 +962,13 @@ persist_muc_history(#state{room = Room, server_host = Server, config = #config{p
|
||||||
integer_to_list(calendar:datetime_to_gregorian_seconds(Timestamp)),
|
integer_to_list(calendar:datetime_to_gregorian_seconds(Timestamp)),
|
||||||
integer_to_list(Size))
|
integer_to_list(Size))
|
||||||
end, lqueue_to_list(Q)),
|
end, lqueue_to_list(Q)),
|
||||||
odbc_queries:clear_and_add_roomhistory(Server,ejabberd_odbc:escape(Room), Queries);
|
odbc_queries:clear_and_add_roomhistory(Server,ejabberd_odbc:escape(Room), Queries),
|
||||||
|
{ok, {persisted, length(Queries)}};
|
||||||
%% en mod_muc, cuando se levantan los muc persistentes, si se crea, y el flag persist_history esta en true,
|
%% en mod_muc, cuando se levantan los muc persistentes, si se crea, y el flag persist_history esta en true,
|
||||||
%% se levantan los mensajes persistentes tb.
|
%% se levantan los mensajes persistentes tb.
|
||||||
|
|
||||||
persist_muc_history(_) ->
|
persist_muc_history(_) ->
|
||||||
ok.
|
{ok, not_persistent}.
|
||||||
|
|
||||||
route(Pid, From, ToNick, Packet) ->
|
route(Pid, From, ToNick, Packet) ->
|
||||||
?GEN_FSM:send_event(Pid, {route, From, ToNick, Packet}).
|
?GEN_FSM:send_event(Pid, {route, From, ToNick, Packet}).
|
||||||
|
|
Loading…
Reference in New Issue
Block a user