mod_mam_muc/mod_mam_muc.lua
author Kim Alvefur <zash@zash.se>
Fri, 23 Jun 2017 13:53:39 +0200
changeset 2723 7568157bf998
parent 2722 02d688ba7739
child 2724 454d038df9b4
permissions -rw-r--r--
mod_mam_muc: Add debug logging like in mod_mam
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1313
440d7276ca62 mod_mam_muc: Rename variable
Kim Alvefur <zash@zash.se>
parents: 1312
diff changeset
     1
-- XEP-0313: Message Archive Management for Prosody MUC
2630
17883c405df3 mod_mam_muc: Shorten some lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2511
diff changeset
     2
-- Copyright (C) 2011-2017 Kim Alvefur
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
--
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- This file is MIT/X11 licensed.
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
1977
9329a11c03a6 mod_mam_muc: Add guard to prevent loading on normal hosts
Kim Alvefur <zash@zash.se>
parents: 1869
diff changeset
     6
if module:get_host_type() ~= "component" then
9329a11c03a6 mod_mam_muc: Add guard to prevent loading on normal hosts
Kim Alvefur <zash@zash.se>
parents: 1869
diff changeset
     7
	module:log("error", "mod_%s should be loaded only on a MUC component, not normal hosts", module.name);
9329a11c03a6 mod_mam_muc: Add guard to prevent loading on normal hosts
Kim Alvefur <zash@zash.se>
parents: 1869
diff changeset
     8
	return;
9329a11c03a6 mod_mam_muc: Add guard to prevent loading on normal hosts
Kim Alvefur <zash@zash.se>
parents: 1869
diff changeset
     9
end
9329a11c03a6 mod_mam_muc: Add guard to prevent loading on normal hosts
Kim Alvefur <zash@zash.se>
parents: 1869
diff changeset
    10
2631
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
    11
local xmlns_mam     = "urn:xmpp:mam:2";
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
local xmlns_delay   = "urn:xmpp:delay";
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local xmlns_forward = "urn:xmpp:forward:0";
2631
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
    14
local xmlns_st_id   = "urn:xmpp:sid:0";
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
    15
local muc_form_enable = "muc#roomconfig_enablearchiving"
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
local st = require "util.stanza";
2501
c6761ebe613b mod_mam_muc: Use util.rsm (fixes #829, depends on a recent 0.10+)
Kim Alvefur <zash@zash.se>
parents: 2433
diff changeset
    18
local rsm = require "util.rsm";
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local jid_bare = require "util.jid".bare;
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
local jid_split = require "util.jid".split;
2631
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
    21
local jid_prep = require "util.jid".prep;
1536
4fb280768efc mod_mam_muc: Add missing import and change the namespace to MAM v0.3
Kim Alvefur <zash@zash.se>
parents: 1535
diff changeset
    22
local dataform = require "util.dataforms".new;
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    23
local it = require"util.iterators";
1534
4dd6eebc8fbd mod_mam_muc: Minor moving about of variables
Kim Alvefur <zash@zash.se>
parents: 1533
diff changeset
    24
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    25
-- Support both old and new MUC code
1534
4dd6eebc8fbd mod_mam_muc: Minor moving about of variables
Kim Alvefur <zash@zash.se>
parents: 1533
diff changeset
    26
local mod_muc = module:depends"muc";
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    27
local rooms = rawget(mod_muc, "rooms");
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    28
local each_room = rawget(mod_muc, "each_room") or function() return it.values(rooms); end;
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    29
local new_muc = not rooms;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    30
if new_muc then
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    31
	rooms = module:shared"muc/rooms";
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    32
end
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    33
local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    34
	function (jid)
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    35
		return rooms[jid];
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    36
	end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
2502
e065e94f0ac6 mod_mam_muc: Remove fallback for util.stanza.is_stanza, it should be available
Kim Alvefur <zash@zash.se>
parents: 2501
diff changeset
    38
local is_stanza = st.is_stanza;
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
local tostring = tostring;
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
local time_now = os.time;
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
local m_min = math.min;
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse;
2722
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    43
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    44
local default_history_length = 20;
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    45
local max_history_length = module:get_option_number("max_history_messages", math.huge);
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    46
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    47
local function get_historylength(room)
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    48
	return math.min(room._data.history_length or default_history_length, max_history_length);
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
    49
end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
1143
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
    51
local log_all_rooms = module:get_option_boolean("muc_log_all_rooms", false);
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
    52
local log_by_default = module:get_option_boolean("muc_log_by_default", true);
1142
fabdaa0d99e3 mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents: 1141
diff changeset
    53
1571
eed7db9f3157 mod_mam_muc, mod_http_muc_log: Change store name from 'archive2' to 'muc_log' to distinguish it from personal MAM archives. Old data will require migration.
Kim Alvefur <zash@zash.se>
parents: 1551
diff changeset
    54
local archive_store = "muc_log";
1311
27b2a357c73c mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1279
diff changeset
    55
local archive = module:open_store(archive_store, "archive");
2035
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    56
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    57
if archive.name == "null" or not archive.find then
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    58
	if not archive.find then
2630
17883c405df3 mod_mam_muc: Shorten some lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2511
diff changeset
    59
		module:log("error", "Attempt to open archive storage returned a driver without archive API support");
17883c405df3 mod_mam_muc: Shorten some lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2511
diff changeset
    60
		module:log("error", "mod_%s does not support archiving",
17883c405df3 mod_mam_muc: Shorten some lines [luacheck]
Kim Alvefur <zash@zash.se>
parents: 2511
diff changeset
    61
			archive._provided_by or archive.name and "storage_"..archive.name.."(?)" or "<unknown>");
2035
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    62
	else
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    63
		module:log("error", "Attempt to open archive storage returned null driver");
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    64
	end
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    65
	module:log("info", "See https://prosody.im/doc/storage and https://prosody.im/doc/archiving for more information");
f21147d56bc4 mod_mam_muc: Yell loudly when archive store can't be opened
Kim Alvefur <zash@zash.se>
parents: 1977
diff changeset
    66
	return false;
1311
27b2a357c73c mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1279
diff changeset
    67
end
27b2a357c73c mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents: 1279
diff changeset
    68
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
    69
local function archiving_enabled(room)
1542
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    70
	if log_all_rooms then
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    71
		return true;
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    72
	end
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
    73
	local enabled = room._data.archiving;
1542
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    74
	if enabled == nil then
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    75
		return log_by_default;
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    76
	end
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    77
	return enabled;
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    78
end
ccb9dc624ebd mod_mam_muc: Split logic for determining if logging is enabled into a function
Kim Alvefur <zash@zash.se>
parents: 1541
diff changeset
    79
1314
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
    80
local send_history, save_to_history;
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
    81
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
    82
	-- Override history methods for all rooms.
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    83
if not new_muc then -- 0.10 or older
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    84
	module:hook("muc-room-created", function (event)
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    85
		local room = event.room;
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
    86
		if archiving_enabled(room) then
1533
915bdcb35e79 mod_mam_muc: Restructure initialization
Kim Alvefur <zash@zash.se>
parents: 1532
diff changeset
    87
			room.send_history = send_history;
915bdcb35e79 mod_mam_muc: Restructure initialization
Kim Alvefur <zash@zash.se>
parents: 1532
diff changeset
    88
			room.save_to_history = save_to_history;
1314
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
    89
		end
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    90
	end);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    91
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    92
	function module.load()
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
    93
		for room in each_room() do
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
    94
			if archiving_enabled(room) then
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    95
				room.send_history = send_history;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    96
				room.save_to_history = save_to_history;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    97
			end
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
    98
		end
1314
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
    99
	end
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   100
	function module.unload()
1551
5127f4db9d39 mod_mam_muc: Try to use new MUC API for getting room objects (fixes queries to not yet initialized rooms)
Kim Alvefur <zash@zash.se>
parents: 1548
diff changeset
   101
		for room in each_room() do
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   102
			if room.send_history == send_history then
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   103
				room.send_history = nil;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   104
				room.save_to_history = nil;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   105
			end
1314
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   106
		end
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   107
	end
1533
915bdcb35e79 mod_mam_muc: Restructure initialization
Kim Alvefur <zash@zash.se>
parents: 1532
diff changeset
   108
end
915bdcb35e79 mod_mam_muc: Restructure initialization
Kim Alvefur <zash@zash.se>
parents: 1532
diff changeset
   109
915bdcb35e79 mod_mam_muc: Restructure initialization
Kim Alvefur <zash@zash.se>
parents: 1532
diff changeset
   110
if not log_all_rooms then
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   111
	module:hook("muc-config-form", function(event)
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   112
		local room, form = event.room, event.form;
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   113
		table.insert(form,
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   114
		{
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   115
			name = muc_form_enable,
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   116
			type = "boolean",
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   117
			label = "Enable archiving?",
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   118
			value = archiving_enabled(room),
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   119
		}
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   120
		);
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   121
	end);
1143
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
   122
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   123
	module:hook("muc-config-submitted", function(event)
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   124
		local room, fields, changed = event.room, event.fields, event.changed;
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   125
		local new = fields[muc_form_enable];
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   126
		if new ~= room._data.archiving then
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   127
			room._data.archiving = new;
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   128
			if type(changed) == "table" then
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   129
				changed[muc_form_enable] = true;
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   130
			else
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   131
				event.changed = true;
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   132
			end
1314
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   133
			if new then
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   134
				room.send_history = send_history;
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   135
				room.save_to_history = save_to_history;
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   136
			else
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   137
				room.send_history = nil;
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   138
				room.save_to_history = nil;
cc9831033f5d mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents: 1313
diff changeset
   139
			end
1143
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
   140
		end
1276
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   141
	end);
01dfaf2f2782 mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents: 1275
diff changeset
   142
end
1143
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
   143
1546
fff2858c554f mod_mam_muc: Remove parsing of 'with' field in MAM form, we currently ignore it anyways
Kim Alvefur <zash@zash.se>
parents: 1543
diff changeset
   144
-- Note: We ignore the 'with' field as this is internally used for stanza types
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   145
local query_form = dataform {
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   146
	{ name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; };
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   147
	{ name = "with"; type = "jid-single"; };
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   148
	{ name = "start"; type = "text-single" };
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   149
	{ name = "end"; type = "text-single"; };
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   150
};
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   151
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   152
-- Serve form
1631
458c80904525 mod_mam_muc: fix <iq type='get' to='room-bare-jid'> query
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1620
diff changeset
   153
module:hook("iq-get/bare/"..xmlns_mam..":query", function(event)
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   154
	local origin, stanza = event.origin, event.stanza;
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   155
	origin.send(st.reply(stanza):add_child(query_form:form()));
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   156
	return true;
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   157
end);
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   158
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   159
-- Handle archive queries
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   160
module:hook("iq-set/bare/"..xmlns_mam..":query", function(event)
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   161
	local origin, stanza = event.origin, event.stanza;
2430
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   162
	local room_jid = stanza.attr.to;
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   163
	local room_node = jid_split(room_jid);
1382
ba17268490b7 mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
   164
	local orig_from = stanza.attr.from;
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
	local query = stanza.tags[1];
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
2430
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   167
	local room = get_room_from_jid(room_jid);
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   168
	if not room then
1869
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   169
		origin.send(st.error_reply(stanza, "cancel", "item-not-found"))
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   170
		return true;
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   171
	end
1382
ba17268490b7 mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents: 1369
diff changeset
   172
	local from = jid_bare(orig_from);
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
1140
402cb9b604eb mod_mam_muc: Send proper error reply when one is not allowed to query archive
Kim Alvefur <zash@zash.se>
parents: 1139
diff changeset
   174
	-- Banned or not a member of a members-only room?
2430
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   175
	local from_affiliation = room:get_affiliation(from);
1312
a48cf3ccdf9c mod_mam_muc: Use public API of rooms for authorization check
Kim Alvefur <zash@zash.se>
parents: 1311
diff changeset
   176
	if from_affiliation == "outcast" -- banned
2430
deedb77c4f96 mod_mam_muc: Rename room and room JID variables for consistency
Kim Alvefur <zash@zash.se>
parents: 2418
diff changeset
   177
		or room:get_members_only() and not from_affiliation then -- members-only, not a member
1869
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   178
		origin.send(st.error_reply(stanza, "auth", "forbidden"))
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   179
		return true;
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
	end
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   181
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   182
	local qid = query.attr.queryid;
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   183
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   184
	-- Search query parameters
1546
fff2858c554f mod_mam_muc: Remove parsing of 'with' field in MAM form, we currently ignore it anyways
Kim Alvefur <zash@zash.se>
parents: 1543
diff changeset
   185
	local qstart, qend;
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   186
	local form = query:get_child("x", "jabber:x:data");
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   187
	if form then
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   188
		local err;
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   189
		form, err = query_form:data(form);
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   190
		if err then
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   191
			origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err))));
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   192
			return true;
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   193
		end
1546
fff2858c554f mod_mam_muc: Remove parsing of 'with' field in MAM form, we currently ignore it anyways
Kim Alvefur <zash@zash.se>
parents: 1543
diff changeset
   194
		qstart, qend = form["start"], form["end"];
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   195
	end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   196
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   197
	if qstart or qend then -- Validate timestamps
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   198
		local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend))
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   199
		if (qstart and not vstart) or (qend and not vend) then
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   200
			origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp"))
2504
ec046f915506 mod_mam_muc: Minor syntax change
Kim Alvefur <zash@zash.se>
parents: 2502
diff changeset
   201
			return true;
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   202
		end
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   203
		qstart, qend = vstart, vend;
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   204
	end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   205
2723
7568157bf998 mod_mam_muc: Add debug logging like in mod_mam
Kim Alvefur <zash@zash.se>
parents: 2722
diff changeset
   206
	module:log("debug", "Archive query id %s from %s until %s)",
7568157bf998 mod_mam_muc: Add debug logging like in mod_mam
Kim Alvefur <zash@zash.se>
parents: 2722
diff changeset
   207
		tostring(qid),
7568157bf998 mod_mam_muc: Add debug logging like in mod_mam
Kim Alvefur <zash@zash.se>
parents: 2722
diff changeset
   208
		qstart and timestamp(qstart) or "the dawn of time",
7568157bf998 mod_mam_muc: Add debug logging like in mod_mam
Kim Alvefur <zash@zash.se>
parents: 2722
diff changeset
   209
		qend and timestamp(qend) or "now");
7568157bf998 mod_mam_muc: Add debug logging like in mod_mam
Kim Alvefur <zash@zash.se>
parents: 2722
diff changeset
   210
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   211
	-- RSM stuff
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   212
	local qset = rsm.get(query);
2722
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
   213
	local qmax = m_min(qset and qset.max or 20, 20);
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   214
	local reverse = qset and qset.before or false;
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   215
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   216
	local before, after = qset and qset.before, qset and qset.after;
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   217
	if type(before) ~= "string" then before = nil; end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   218
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   219
	-- Load all the data!
1146
9fa89dc7a86f mod_mam_muc: Search the rooms archive correctly (copypaste error from mod_mam)
Kim Alvefur <zash@zash.se>
parents: 1145
diff changeset
   220
	local data, err = archive:find(room_node, {
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   221
		start = qstart; ["end"] = qend; -- Time range
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   222
		limit = qmax + 1;
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   223
		before = before; after = after;
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   224
		reverse = reverse;
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   225
		total = true;
1547
e98c335c6554 mod_mam_muc: Limit search to groupchat messages (we use the internal 'with' field stanza types)
Kim Alvefur <zash@zash.se>
parents: 1546
diff changeset
   226
		with = "message<groupchat";
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   227
	});
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   228
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   229
	if not data then
1869
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   230
		origin.send(st.error_reply(stanza, "cancel", "internal-server-error"));
db8b256f51ff mod_admin_web,mod_carbons,mod_csi_compat,mod_mam_muc,mod_tcpproxy: Explicitly return true
Kim Alvefur <zash@zash.se>
parents: 1695
diff changeset
   231
		return true;
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   232
	end
2505
04064f01df0e mod_mam_muc: Make sure that the total, if it is a total, is a number
Kim Alvefur <zash@zash.se>
parents: 2504
diff changeset
   233
	local total = tonumber(err);
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   234
1534
4dd6eebc8fbd mod_mam_muc: Minor moving about of variables
Kim Alvefur <zash@zash.se>
parents: 1533
diff changeset
   235
	local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to };
4dd6eebc8fbd mod_mam_muc: Minor moving about of variables
Kim Alvefur <zash@zash.se>
parents: 1533
diff changeset
   236
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   237
	local results = {};
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   238
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   239
	-- Wrap it in stuff and deliver
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   240
	local first, last;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   241
	local count = 0;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   242
	local complete = "true";
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   243
	for id, item, when in data do
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   244
		count = count + 1;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   245
		if count > qmax then
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   246
			complete = nil;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   247
			break;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   248
		end
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   249
		local fwd_st = st.message(msg_reply_attr)
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   250
			:tag("result", { xmlns = xmlns_mam, queryid = qid, id = id })
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   251
				:tag("forwarded", { xmlns = xmlns_forward })
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   252
					:tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up();
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   253
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   254
		if not is_stanza(item) then
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   255
			item = st.deserialize(item);
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   256
		end
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   257
		item.attr.xmlns = "jabber:client";
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   258
		fwd_st:add_child(item);
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   259
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   260
		if not first then first = id; end
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   261
		last = id;
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   262
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   263
		if reverse then
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   264
			results[count] = fwd_st;
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   265
		else
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   266
			origin.send(fwd_st);
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   267
		end
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   268
	end
2504
ec046f915506 mod_mam_muc: Minor syntax change
Kim Alvefur <zash@zash.se>
parents: 2502
diff changeset
   269
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   270
	if reverse then
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   271
		for i = #results, 1, -1 do
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   272
			origin.send(results[i]);
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   273
		end
2506
f576ac1cad65 mod_mam_muc: Move swapping of reversed variables (like 5fb917b86838 for mod_mam)
Kim Alvefur <zash@zash.se>
parents: 2505
diff changeset
   274
		first, last = last, first;
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   275
	end
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   276
1138
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   277
	-- That's all folks!
5c97ee75cadb mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents: 820
diff changeset
   278
	module:log("debug", "Archive query %s completed", tostring(qid));
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   279
2511
b8a66805459e mod_mam_muc: Update to XEP-0313 0.5.1
Kim Alvefur <zash@zash.se>
parents: 2506
diff changeset
   280
	origin.send(st.reply(stanza)
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   281
		:tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete })
1535
efbb047c01e7 mod_mam_muc: Update to XEP-0313 v 0.3
Kim Alvefur <zash@zash.se>
parents: 1534
diff changeset
   282
			:add_child(rsm.generate {
1695
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   283
				first = first, last = last, count = total }));
1a8c791d365f mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
Kim Alvefur <zash@zash.se>
parents: 1683
diff changeset
   284
	return true;
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   285
end);
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   286
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   287
module:hook("muc-get-history", function (event)
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   288
	local room = event.room;
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   289
	if not archiving_enabled(room) then return end
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   290
	local room_jid = room.jid;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   291
	local maxstanzas = event.maxstanzas;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   292
	local maxchars = event.maxchars;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   293
	local since = event.since;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   294
	local to = event.to;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   295
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   296
	-- Load all the data!
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   297
	local query = {
2722
02d688ba7739 mod_mam_muc: Make calculation of max history length more like in mod_muc
Kim Alvefur <zash@zash.se>
parents: 2720
diff changeset
   298
		limit = math.min(maxstanzas, get_historylength(room));
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   299
		start = since;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   300
		reverse = true;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   301
		with = "message<groupchat";
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   302
	}
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   303
	local data, err = archive:find(jid_split(room_jid), query);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   304
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   305
	if not data then
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   306
		module:log("error", "Could not fetch history: %s", tostring(err));
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   307
		return
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   308
	end
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   309
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   310
	local history, i = {}, 1;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   311
2632
fbb26a56a667 mod_mam_muc: Include stanza-id in history replay
Kim Alvefur <zash@zash.se>
parents: 2631
diff changeset
   312
	for id, item, when in data do
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   313
		item.attr.to = to;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   314
		item:tag("delay", { xmlns = "urn:xmpp:delay", from = room_jid, stamp = timestamp(when) }):up(); -- XEP-0203
2632
fbb26a56a667 mod_mam_muc: Include stanza-id in history replay
Kim Alvefur <zash@zash.se>
parents: 2631
diff changeset
   315
		item:tag("stanza-id", { xmlns = xmlns_st_id, by = room_jid, id = id }):up();
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   316
		if maxchars then
1653
ab4073468dfb mod_mam_muc: Fix character limit again(?)
Kim Alvefur <zash@zash.se>
parents: 1644
diff changeset
   317
			local chars = #tostring(item);
1644
7fa0c41792c7 mod_mam_muc: Fix character limit
Kim Alvefur <zash@zash.se>
parents: 1631
diff changeset
   318
			if maxchars - chars < 0 then
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   319
				break
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   320
			end
1653
ab4073468dfb mod_mam_muc: Fix character limit again(?)
Kim Alvefur <zash@zash.se>
parents: 1644
diff changeset
   321
			maxchars = maxchars - chars;
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   322
		end
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   323
		history[i], i = item, i+1;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   324
		-- module:log("debug", tostring(item));
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   325
	end
1654
66d67f0bae16 mod_mam_muc: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1653
diff changeset
   326
	function event.next_stanza()
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   327
		i = i - 1;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   328
		return history[i];
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   329
	end
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   330
	return true;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   331
end, 1);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   332
1519
67c80abe742e mod_mam_muc: Fix add/removal of room method overrides
Kim Alvefur <zash@zash.se>
parents: 1430
diff changeset
   333
function send_history(self, to, stanza)
1278
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   334
	local maxchars, maxstanzas, seconds, since;
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   335
	local history_tag = stanza:find("{http://jabber.org/protocol/muc}x/history")
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   336
	if history_tag then
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   337
		module:log("debug", tostring(history_tag));
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   338
		local history_attr = history_tag.attr;
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   339
		maxchars = tonumber(history_attr.maxchars);
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   340
		maxstanzas = tonumber(history_attr.maxstanzas);
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   341
		seconds = tonumber(history_attr.seconds);
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   342
		since = history_attr.since;
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   343
		if since then
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   344
			since = timestamp_parse(since);
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   345
		end
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   346
		if seconds then
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   347
			since = math.max(os.time() - seconds, since or 0);
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   348
		end
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   349
	end
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   350
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   351
	local event = {
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   352
		room = self;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   353
		to = to; -- `to` is required to calculate the character count for `maxchars`
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   354
		maxchars = maxchars, maxstanzas = maxstanzas, since = since;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   355
		next_stanza = function() end; -- events should define this iterator
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   356
	};
1278
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   357
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   358
	module:fire_event("muc-get-history", event);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   359
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   360
	for msg in event.next_stanza, event do
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   361
		self:_route_stanza(msg);
1278
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   362
	end
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   363
end
40f077b18dfe mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents: 1277
diff changeset
   364
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   365
-- Handle messages
1519
67c80abe742e mod_mam_muc: Fix add/removal of room method overrides
Kim Alvefur <zash@zash.se>
parents: 1430
diff changeset
   366
function save_to_history(self, stanza)
2631
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   367
	local room_node, room_host = jid_split(self.jid);
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   368
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   369
	-- Filter out <stanza-id> that claim to be from us
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   370
	stanza:maptags(function (tag)
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   371
		if tag.name == "stanza-id" and tag.attr.xmlns == xmlns_st_id
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   372
		and jid_prep(tag.attr.by) == self.jid then
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   373
			return nil;
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   374
		end
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   375
		return tag;
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   376
	end);
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   377
1279
2118a2eeb1d5 mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents: 1278
diff changeset
   378
	-- Policy check
2720
02a7f9fe44fa mod_mam_muc: Rename various fields from "logging" to "archiving"
Kim Alvefur <zash@zash.se>
parents: 2632
diff changeset
   379
	if not archiving_enabled(self) then return end -- Don't log
1143
8098683b6d6f mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents: 1142
diff changeset
   380
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   381
	-- And stash it
1385
da9469e68dee mod_mam_muc: Place stanza type in 'with' column; when sending history, only send messages with type=groupchat
daurnimator <quae@daurnimator.com>
parents: 1382
diff changeset
   382
	local with = stanza.name
da9469e68dee mod_mam_muc: Place stanza type in 'with' column; when sending history, only send messages with type=groupchat
daurnimator <quae@daurnimator.com>
parents: 1382
diff changeset
   383
	if stanza.attr.type then
da9469e68dee mod_mam_muc: Place stanza type in 'with' column; when sending history, only send messages with type=groupchat
daurnimator <quae@daurnimator.com>
parents: 1382
diff changeset
   384
		with = with .. "<" .. stanza.attr.type
da9469e68dee mod_mam_muc: Place stanza type in 'with' column; when sending history, only send messages with type=groupchat
daurnimator <quae@daurnimator.com>
parents: 1382
diff changeset
   385
	end
2631
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   386
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   387
	local id = archive:append(room_node, nil, stanza, time_now(), with);
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   388
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   389
	if id then
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   390
		stanza:add_direct_child(st.stanza("stanza-id", { xmlns = xmlns_st_id, by = self.jid, id = id }));
3f166242b460 mod_mam_muc: Add stanza-id tags (updates to XEP-0313 v0.6)
Kim Alvefur <zash@zash.se>
parents: 2630
diff changeset
   391
	end
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   392
end
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   393
1543
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   394
module:hook("muc-broadcast-message", function (event)
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   395
	local room, stanza = event.room, event.stanza;
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   396
	if stanza:get_child("body") then
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   397
		save_to_history(room, stanza);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   398
	end
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   399
end);
57fb9ce21f9c mod_mam_muc: Add compatibility with the new MUC code in trunk
Kim Alvefur <zash@zash.se>
parents: 1542
diff changeset
   400
1620
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   401
if module:get_option_boolean("muc_log_presences", true) then
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   402
	module:hook("muc-occupant-joined", function (event)
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   403
		save_to_history(event.room, st.stanza("presence", { from = event.nick }));
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   404
	end);
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   405
	module:hook("muc-occupant-left", function (event)
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   406
		save_to_history(event.room, st.stanza("presence", { type = "unavailable", from = event.nick }));
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   407
	end);
28411e97db94 mod_mam_muc: support to disable presence logging via muc_log_presences
Stuart Carnie <stuart.carnie@gmail.com>
parents: 1571
diff changeset
   408
end
1548
d3c847070618 mod_mam_muc: Store joins and leaves
Kim Alvefur <zash@zash.se>
parents: 1547
diff changeset
   409
1277
999891a9ae5d mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents: 1276
diff changeset
   410
module:hook("muc-room-destroyed", function(event)
2431
e5795f5f7a7b mod_mam_muc: More room JID variable renaming for more consistency
Kim Alvefur <zash@zash.se>
parents: 2430
diff changeset
   411
	local room_node = jid_split(event.room.jid);
e5795f5f7a7b mod_mam_muc: More room JID variable renaming for more consistency
Kim Alvefur <zash@zash.se>
parents: 2430
diff changeset
   412
	archive:delete(room_node);
1277
999891a9ae5d mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents: 1276
diff changeset
   413
end);
999891a9ae5d mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents: 1276
diff changeset
   414
1141
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   415
-- And role/affiliation changes?
1091be1c3aba mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents: 1140
diff changeset
   416
820
005037032d65 mod_mam_muc: MUC version of mod_mam
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   417
module:add_feature(xmlns_mam);
1683
c77e9522dc66 mod_mam_muc: Advertise MAM feature on bare JID room disco#info (only effective after prosody 57bc52f67564)
Kim Alvefur <zash@zash.se>
parents: 1654
diff changeset
   418
c77e9522dc66 mod_mam_muc: Advertise MAM feature on bare JID room disco#info (only effective after prosody 57bc52f67564)
Kim Alvefur <zash@zash.se>
parents: 1654
diff changeset
   419
module:hook("muc-disco#info", function(event)
c77e9522dc66 mod_mam_muc: Advertise MAM feature on bare JID room disco#info (only effective after prosody 57bc52f67564)
Kim Alvefur <zash@zash.se>
parents: 1654
diff changeset
   420
	event.reply:tag("feature", {var=xmlns_mam}):up();
c77e9522dc66 mod_mam_muc: Advertise MAM feature on bare JID room disco#info (only effective after prosody 57bc52f67564)
Kim Alvefur <zash@zash.se>
parents: 1654
diff changeset
   421
end);