aboutsummaryrefslogtreecommitdiff
path: root/src/mod_offline.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2004-08-08 19:07:55 +0000
committerAlexey Shchepin <alexey@process-one.net>2004-08-08 19:07:55 +0000
commit357554265e4c86c5cd0dc3b6ae2f69f20c85786b (patch)
tree41219e7fbcccd2f24ca040c8fad8237bdc6e2e8b /src/mod_offline.erl
parent* src/aclocal.m4: Updated to check for openssl library (thanks to (diff)
* src/ejabberd_c2s.erl: Use resend_offline_messages_hook to fetch
offline messages * src/mod_offline.erl: Likewise * src/mod_offline.erl: Added table locking in remove_old_messages/1 * src/ejabberd_sm.erl: Use offline_message_hook to store offline messages * src/mod_offline.erl: Likewise * src/ejabberd_hooks.erl: Hooks support * src/ejabberd_sup.erl: Added ejabberd_hooks * doc/guide.tex: Updated * src/ejabberd.cfg.example: Updated * src/ejabberd_c2s.erl: Changed TLS options (thanks to Sergei Golovan) SVN Revision: 255
Diffstat (limited to 'src/mod_offline.erl')
-rw-r--r--src/mod_offline.erl43
1 files changed, 28 insertions, 15 deletions
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index 7af72442b..22e9b85ee 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -16,7 +16,7 @@
stop/0,
store_packet/3,
resend_offline_messages/1,
- pop_offline_messages/1,
+ pop_offline_messages/2,
remove_old_messages/1,
remove_user/1]).
@@ -31,6 +31,10 @@ start(_) ->
[{disc_only_copies, [node()]},
{type, bag},
{attributes, record_info(fields, offline_msg)}]),
+ ejabberd_hooks:add(offline_message_hook,
+ ?MODULE, store_packet, 50),
+ ejabberd_hooks:add(resend_offline_messages_hook,
+ ?MODULE, pop_offline_messages, 50),
register(?PROCNAME, spawn(?MODULE, init, [])).
init() ->
@@ -61,23 +65,31 @@ receive_all(Msgs) ->
stop() ->
+ ejabberd_hooks:delete(offline_message_hook,
+ ?MODULE, store_packet, 50),
+ ejabberd_hooks:delete(resend_offline_messages_hook,
+ ?MODULE, pop_offline_messages, 50),
exit(whereis(?PROCNAME), stop),
ok.
store_packet(From, To, Packet) ->
- true = is_process_alive(whereis(?PROCNAME)),
Type = xml:get_tag_attr_s("type", Packet),
- true = Type /= "error" andalso Type /= "groupchat",
- case check_event(From, To, Packet) of
+ if
+ (Type /= "error") and (Type /= "groupchat") ->
+ case check_event(From, To, Packet) of
+ true ->
+ #jid{luser = LUser} = To,
+ TimeStamp = now(),
+ ?PROCNAME ! #offline_msg{user = LUser,
+ timestamp = TimeStamp,
+ from = From,
+ to = To,
+ packet = Packet},
+ stop;
+ _ ->
+ ok
+ end;
true ->
- #jid{luser = LUser} = To,
- TimeStamp = now(),
- ?PROCNAME ! #offline_msg{user = LUser,
- timestamp = TimeStamp,
- from = From,
- to = To,
- packet = Packet};
- _ ->
ok
end.
@@ -154,7 +166,7 @@ resend_offline_messages(User) ->
ok
end.
-pop_offline_messages(User) ->
+pop_offline_messages(Ls, User) ->
LUser = jlib:nodeprep(User),
F = fun() ->
Rs = mnesia:wread({offline_msg, LUser}),
@@ -175,9 +187,9 @@ pop_offline_messages(User) ->
calendar:now_to_universal_time(
R#offline_msg.timestamp))]}}
end,
- lists:keysort(#offline_msg.timestamp, Rs));
+ Ls ++ lists:keysort(#offline_msg.timestamp, Rs));
_ ->
- []
+ Ls
end.
remove_old_messages(Days) ->
@@ -187,6 +199,7 @@ remove_old_messages(Days) ->
Secs1 = S rem 1000000,
TimeStamp = {MegaSecs1, Secs1, 0},
F = fun() ->
+ mnesia:write_lock_table(offline_msg),
mnesia:foldl(
fun(#offline_msg{timestamp = TS} = Rec, _Acc)
when TS < TimeStamp ->