]> granicus.if.org Git - ejabberd/commitdiff
* doc/api/Makefile: Report the correct ejabberd version. When
authorBadlop <badlop@process-one.net>
Tue, 1 Apr 2008 10:11:39 +0000 (10:11 +0000)
committerBadlop <badlop@process-one.net>
Tue, 1 Apr 2008 10:11:39 +0000 (10:11 +0000)
cleaning, remove also erlang.png

* src/mod_muc/mod_muc_room.erl: Update source code to prevent
warning messages from EDoc
* src/mod_pubsub/mod_pubsub.erl: Likewise
* src/mod_pubsub/node_default.erl: Likewise
* src/mod_pubsub/nodetree_default.erl: Likewise
* src/mod_pubsub/nodetree_virtual.erl: Likewise
* src/mod_pubsub/pubsub.hrl: Likewise

SVN Revision: 1265

ChangeLog
doc/api/Makefile
src/mod_muc/mod_muc_room.erl
src/mod_pubsub/mod_pubsub.erl
src/mod_pubsub/node_default.erl
src/mod_pubsub/nodetree_default.erl
src/mod_pubsub/nodetree_virtual.erl
src/mod_pubsub/pubsub.hrl

index ec4ad801e0e219aa99010f2d5a36d85acdc70091..a2422ac07ae5206e04b2637c3ad950746ea954c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2008-04-01  Badlop  <badlop@process-one.net>
+
+       * doc/api/Makefile: Report the correct ejabberd version. When
+       cleaning, remove also erlang.png
+
+       * src/mod_muc/mod_muc_room.erl: Update source code to prevent
+       warning messages from EDoc
+       * src/mod_pubsub/mod_pubsub.erl: Likewise
+       * src/mod_pubsub/node_default.erl: Likewise
+       * src/mod_pubsub/nodetree_default.erl: Likewise
+       * src/mod_pubsub/nodetree_virtual.erl: Likewise
+       * src/mod_pubsub/pubsub.hrl: Likewise
+
 2008-04-01  Christophe Romain <christophe.romain@process-one.net>
 
        * src/ejabberdctl.template: Add firewalling port range definition
index 66f39955502daea85e1e208ef97298247adf6081..a4c8dbb7cb026e6012c5047fd16e12895b110dae 100644 (file)
@@ -1,5 +1,5 @@
 APPNAME = ejabberd
-VSN = SVN
+VSN = $(shell sed '/VERSION/!d;s/\(.*\)"\(.*\)"\(.*\)/\2/' ../../src/ejabberd.hrl)
 
 DOCDIR=.
 SRCDIR=../../src
@@ -11,6 +11,7 @@ all: docs
 clean:
        rm -f *.html
        rm edoc-info
+       rm erlang.png
 
 docs:
        erl -noshell -run edoc_run application \
index 43918daa45b2c49e9a990911e1bdc6dba6c109ce..10b7d8a7516bf94bf4677eb3da7ee032f8c223d8 100644 (file)
@@ -2818,21 +2818,21 @@ set_opts([], StateData) ->
     StateData;
 set_opts([{Opt, Val} | Opts], StateData) ->
     NSD = case Opt of
-             ?CASE_CONFIG_OPT(title);
-             ?CASE_CONFIG_OPT(allow_change_subj);
-             ?CASE_CONFIG_OPT(allow_query_users);
-             ?CASE_CONFIG_OPT(allow_private_messages);
-             ?CASE_CONFIG_OPT(public);
-             ?CASE_CONFIG_OPT(public_list);
-             ?CASE_CONFIG_OPT(persistent);
-             ?CASE_CONFIG_OPT(moderated);
-             ?CASE_CONFIG_OPT(members_by_default);
-             ?CASE_CONFIG_OPT(members_only);
-             ?CASE_CONFIG_OPT(allow_user_invites);
-             ?CASE_CONFIG_OPT(password_protected);
-             ?CASE_CONFIG_OPT(password);
-             ?CASE_CONFIG_OPT(anonymous);
-             ?CASE_CONFIG_OPT(logging);
+             title -> StateData#state{config = (StateData#state.config)#config{title = Val}};
+             allow_change_subj -> StateData#state{config = (StateData#state.config)#config{allow_change_subj = Val}};
+             allow_query_users -> StateData#state{config = (StateData#state.config)#config{allow_query_users = Val}};
+             allow_private_messages -> StateData#state{config = (StateData#state.config)#config{allow_private_messages = Val}};
+             public -> StateData#state{config = (StateData#state.config)#config{public = Val}};
+             public_list -> StateData#state{config = (StateData#state.config)#config{public_list = Val}};
+             persistent -> StateData#state{config = (StateData#state.config)#config{persistent = Val}};
+             moderated -> StateData#state{config = (StateData#state.config)#config{moderated = Val}};
+             members_by_default -> StateData#state{config = (StateData#state.config)#config{members_by_default = Val}};
+             members_only -> StateData#state{config = (StateData#state.config)#config{members_only = Val}};
+             allow_user_invites -> StateData#state{config = (StateData#state.config)#config{allow_user_invites = Val}};
+             password_protected -> StateData#state{config = (StateData#state.config)#config{password_protected = Val}};
+             password -> StateData#state{config = (StateData#state.config)#config{password = Val}};
+             anonymous -> StateData#state{config = (StateData#state.config)#config{anonymous = Val}};
+             logging -> StateData#state{config = (StateData#state.config)#config{logging = Val}};
              max_users ->
                  ServiceMaxUsers = get_service_max_users(StateData),
                  MaxUsers = if
index f70129de923c461644a6b405cfe60ee2721dff7a..56fdb627b22fb451e99b5751081f60451f6d904e 100644 (file)
@@ -33,7 +33,7 @@
 %%% This module uses version 1.10 of the specification as a base.
 %%% Most of the specification is implemented.
 %%% Code is derivated from the original pubsub v1.7, functions concerning config may be rewritten.
-%%% Code also inspired from the original PEP patch by Magnus Henoch <mange@freemail.hu>
+%%% Code also inspired from the original PEP patch by Magnus Henoch (mangeATfreemail.hu)
 
 %%% TODO
 %%% plugin: generate Reply (do not use broadcast atom anymore)
@@ -190,7 +190,7 @@ init([ServerHost, Opts]) ->
                nodetree = NodeTree,
                plugins = Plugins}}.
 
-%% @spec (Host, Opts) -> Plugins
+%% @spec (Host, ServerHost, Opts) -> Plugins
 %%      Host = mod_pubsub:host()   Opts = [{Key,Value}]
 %%      ServerHost = host()
 %%      Key = atom()
@@ -1121,19 +1121,19 @@ handle_authorization_response(Host, From, To, Packet, XFields) ->
 %% @doc <p>Create new pubsub nodes</p>
 %%<p>In addition to method-specific error conditions, there are several general reasons why the node creation request might fail:</p>
 %%<ul>
-%%<li>The service does not support node creation.
-%%<li>Only entities that are registered with the service are allowed to create nodes but the requesting entity is not registered.
-%%<li>The requesting entity does not have sufficient privileges to create nodes.
-%%<li>The requested NodeID already exists.
-%%<li>The request did not include a NodeID and "instant nodes" are not supported.
+%%<li>The service does not support node creation.</li>
+%%<li>Only entities that are registered with the service are allowed to create nodes but the requesting entity is not registered.</li>
+%%<li>The requesting entity does not have sufficient privileges to create nodes.</li>
+%%<li>The requested NodeID already exists.</li>
+%%<li>The request did not include a NodeID and "instant nodes" are not supported.</li>
 %%</ul>
 %%<p>ote: node creation is a particular case, error return code is evaluated at many places:</p>
 %%<ul>
-%%<li>iq_pubsub checks if service supports node creation (type exists)
-%%<li>create_node checks if instant nodes are supported
-%%<li>create_node asks node plugin if entity have sufficient privilege
-%%<li>nodetree create_node checks if nodeid already exists
-%%<li>node plugin create_node just sets default affiliation/subscription
+%%<li>iq_pubsub checks if service supports node creation (type exists)</li>
+%%<li>create_node checks if instant nodes are supported</li>
+%%<li>create_node asks node plugin if entity have sufficient privilege</li>
+%%<li>nodetree create_node checks if nodeid already exists</li>
+%%<li>node plugin create_node just sets default affiliation/subscription</li>
 %%</ul>
 create_node(Host, ServerHost, Node, Owner, Type) ->
     create_node(Host, ServerHost, Node, Owner, Type, all, []).
@@ -1245,9 +1245,9 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) ->
 %% @doc <p>Delete specified node and all childs.</p>
 %%<p>There are several reasons why the node deletion request might fail:</p>
 %%<ul>
-%%<li>The requesting entity does not have sufficient privileges to delete the node.
-%%<li>The node is the root collection node, which cannot be deleted.
-%%<li>The specified node does not exist.
+%%<li>The requesting entity does not have sufficient privileges to delete the node.</li>
+%%<li>The node is the root collection node, which cannot be deleted.</li>
+%%<li>The specified node does not exist.</li>
 %%</ul>
 delete_node(_Host, [], _Owner) ->
     %% Node is the root
@@ -1299,20 +1299,20 @@ delete_nodes(Host, Owner) ->
 %%      Node = pubsubNode()
 %%      From = jid()
 %%      JID = jid()
-%% @doc <p>Accepts or rejects subcription requests on a PubSub node.</p>
 %% @see node_default:subscribe_node/5
+%% @doc <p>Accepts or rejects subcription requests on a PubSub node.</p>
 %%<p>There are several reasons why the subscription request might fail:</p>
 %%<ul>
-%%<li>The bare JID portions of the JIDs do not match.
-%%<li>The node has an access model of "presence" and the requesting entity is not subscribed to the owner's presence.
-%%<li>The node has an access model of "roster" and the requesting entity is not in one of the authorized roster groups.
-%%<li>The node has an access model of "whitelist" and the requesting entity is not on the whitelist.
-%%<li>The service requires payment for subscriptions to the node.
-%%<li>The requesting entity is anonymous and the service does not allow anonymous entities to subscribe.
-%%<li>The requesting entity has a pending subscription.
-%%<li>The requesting entity is blocked from subscribing (e.g., because having an affiliation of outcast).
-%%<li>The node does not support subscriptions.
-%%<li>The node does not exist.
+%%<li>The bare JID portions of the JIDs do not match.</li>
+%%<li>The node has an access model of "presence" and the requesting entity is not subscribed to the owner's presence.</li>
+%%<li>The node has an access model of "roster" and the requesting entity is not in one of the authorized roster groups.</li>
+%%<li>The node has an access model of "whitelist" and the requesting entity is not on the whitelist.</li>
+%%<li>The service requires payment for subscriptions to the node.</li>
+%%<li>The requesting entity is anonymous and the service does not allow anonymous entities to subscribe.</li>
+%%<li>The requesting entity has a pending subscription.</li>
+%%<li>The requesting entity is blocked from subscribing (e.g., because having an affiliation of outcast).</li>
+%%<li>The node does not support subscriptions.</li>
+%%<li>The node does not exist.</li>
 %%</ul>
 subscribe_node(Host, Node, From, JID) ->
     Subscriber = case jlib:string_to_jid(JID) of
@@ -1385,7 +1385,7 @@ subscribe_node(Host, Node, From, JID) ->
            {result, Result}
     end.
 
-%% @spec (Host, Noce, From, JID) -> {error, Reason} | {result, []}
+%% @spec (Host, Noce, From, JID, SubId) -> {error, Reason} | {result, []}
 %%      Host = host()
 %%      Node = pubsubNode()
 %%      From = jid()
@@ -1395,12 +1395,12 @@ subscribe_node(Host, Node, From, JID) ->
 %% @doc <p>Unsubscribe <tt>JID</tt> from the <tt>Node</tt>.</p>
 %%<p>There are several reasons why the unsubscribe request might fail:</p>
 %%<ul>
-%%<li>The requesting entity has multiple subscriptions to the node but does not specify a subscription ID.
-%%<li>The request does not specify an existing subscriber.
-%%<li>The requesting entity does not have sufficient privileges to unsubscribe the specified JID.
-%%<li>The node does not exist.
-%%<li>The request specifies a subscription ID that is not valid or current.
-%%</il>
+%%<li>The requesting entity has multiple subscriptions to the node but does not specify a subscription ID.</li>
+%%<li>The request does not specify an existing subscriber.</li>
+%%<li>The requesting entity does not have sufficient privileges to unsubscribe the specified JID.</li>
+%%<li>The node does not exist.</li>
+%%<li>The request specifies a subscription ID that is not valid or current.</li>
+%%</ul>
 unsubscribe_node(Host, Node, From, JID, SubId) ->
     Subscriber = case jlib:string_to_jid(JID) of
                     error -> {"", "", ""};
@@ -1423,12 +1423,12 @@ unsubscribe_node(Host, Node, From, JID, SubId) ->
 %% <p>The permission to publish an item must be verified by the plugin implementation.</p>
 %%<p>There are several reasons why the publish request might fail:</p>
 %%<ul>
-%%<li>The requesting entity does not have sufficient privileges to publish.
-%%<li>The node does not support item publication.
-%%<li>The node does not exist.
-%%<li>The payload size exceeds a service-defined limit.
-%%<li>The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.
-%%<li>The request does not match the node configuration.
+%%<li>The requesting entity does not have sufficient privileges to publish.</li>
+%%<li>The node does not support item publication.</li>
+%%<li>The node does not exist.</li>
+%%<li>The payload size exceeds a service-defined limit.</li>
+%%<li>The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.</li>
+%%<li>The request does not match the node configuration.</li>
 %%</ul>
 publish_item(Host, ServerHost, Node, Publisher, "", Payload) ->
     %% if publisher does not specify an ItemId, the service MUST generate the ItemId
@@ -1524,12 +1524,12 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) ->
 %% <p>The permission to delete an item must be verified by the plugin implementation.</p>
 %%<p>There are several reasons why the item retraction request might fail:</p>
 %%<ul>
-%%<li>The publisher does not have sufficient privileges to delete the requested item.
-%%<li>The node or item does not exist.
-%%<li>The request does not specify a node.
-%%<li>The request does not include an <item/> element or the <item/> element does not specify an ItemId.
-%%<li>The node does not support persistent items.
-%%<li>The service does not support the deletion of items.
+%%<li>The publisher does not have sufficient privileges to delete the requested item.</li>
+%%<li>The node or item does not exist.</li>
+%%<li>The request does not specify a node.</li>
+%%<li>The request does not include an <item/> element or the <item/> element does not specify an ItemId.</li>
+%%<li>The node does not support persistent items.</li>
+%%<li>The service does not support the deletion of items.</li>
 %%</ul>
 delete_item(Host, Node, Publisher, ItemId) ->
     delete_item(Host, Node, Publisher, ItemId, false).
@@ -1580,10 +1580,10 @@ delete_item(Host, Node, Publisher, ItemId, ForceNotify) ->
 %% @doc <p>Delete all items of specified node owned by JID.</p>
 %%<p>There are several reasons why the node purge request might fail:</p>
 %%<ul>
-%%<li>The node or service does not support node purging.
-%%<li>The requesting entity does not have sufficient privileges to purge the node.
-%%<li>The node is not configured to persist items.
-%%<li>The specified node does not exist.
+%%<li>The node or service does not support node purging.</li>
+%%<li>The requesting entity does not have sufficient privileges to purge the node.</li>
+%%<li>The node is not configured to persist items.</li>
+%%<li>The specified node does not exist.</li>
 %%</ul>
 purge_node(Host, Node, Owner) ->
     Action = fun(#pubsub_node{type = Type, options = Options}) ->
@@ -1670,7 +1670,7 @@ get_items(Host, Node) ->
 %% @spec (Host, Node, LJID) -> any()
 %%      Host = host()
 %%      Node = pubsubNode()
-%%      LJID = {U,S,""}
+%%      LJID = {U, S, []}
 %% @doc <p>Resend the items of a node to the user.</p>
 send_all_items(Host, Node, LJID) ->
     send_items(Host, Node, LJID, all).
@@ -1949,7 +1949,8 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
     end.
 
 
-% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups)
+%% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, SubscriberResource}, AllowedGroups)
+%%    -> {PresenceSubscription, RosterGroup}
 get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups) ->
     {Subscription, Groups} =
        ejabberd_hooks:run_fold(
@@ -2022,11 +2023,11 @@ service_jid(Host) ->
     _ -> {jid, "", Host, "", "", Host, ""}
     end.
 
-%% @spec (LJID, PresenceDelivery) -> boolean()
+%% @spec (LJID, Subscription, PresenceDelivery) -> boolean()
 %%     LJID = jid()
 %%     Subscription = atom()
 %%     PresenceDelivery = boolean()
-%% @doc <p>Check if a notification must be delivered or not
+%% @doc <p>Check if a notification must be delivered or not.</p>
 is_to_delivered(_, none, _) -> false;
 is_to_delivered(_, pending, _) -> false;
 is_to_delivered(_, _, false) -> true;
@@ -2325,8 +2326,8 @@ is_caps_notify(Host, Node, Caps) ->
 
 %%<p>There are several reasons why the default node configuration options request might fail:</p>
 %%<ul>
-%%<li>The service does not support node configuration.
-%%<li>The service does not support retrieval of default node configuration.
+%%<li>The service does not support node configuration.</li>
+%%<li>The service does not support retrieval of default node configuration.</li>
 %%</ul>
 get_configure(Host, Node, From, Lang) ->
     Action =
@@ -2460,11 +2461,11 @@ get_configure_xfields(_Type, Options, _Owners, Lang) ->
 
 %%<p>There are several reasons why the node configuration request might fail:</p>
 %%<ul>
-%%<li>The service does not support node configuration.
-%%<li>The requesting entity does not have sufficient privileges to configure the node.
-%%<li>The request did not specify a node.
-%%<li>The node has no configuration options.
-%%<li>The specified node does not exist.
+%%<li>The service does not support node configuration.</li>
+%%<li>The requesting entity does not have sufficient privileges to configure the node.</li>
+%%<li>The request did not specify a node.</li>
+%%<li>The node has no configuration options.</li>
+%%<li>The specified node does not exist.</li>
 %%</ul>
 set_configure(Host, Node, From, Els, Lang) ->
     case xml:remove_cdata(Els) of
index 2c0c044cb63879ac2db1f586d48e28c09efb7bf3..fc4194c325e0d0b80e838cb1291e81b24e38930f 100644 (file)
@@ -79,9 +79,9 @@
 %% API definition
 %% ================
 
-%% @spec (Host) -> any()
+%% @spec (Host, ServerHost, Opts) -> any()
 %%      Host = mod_pubsub:host()
-%%      ServerHost = host()
+%%      ServerHost = mod_pubsub:host()
 %%      Opts = list()
 %% @doc <p>Called during pubsub modules initialisation. Any pubsub plugin must
 %% implement this function. It can return anything.</p>
@@ -109,8 +109,9 @@ init(_Host, _ServerHost, _Opts) ->
     end,
     ok.
 
-%% @spec (Host) -> any()
+%% @spec (Host, ServerHost) -> any()
 %%      Host = mod_pubsub:host()
+%%      ServerHost = host()
 %% @doc <p>Called during pubsub modules termination. Any pubsub plugin must
 %% implement this function. It can return anything.</p>
 terminate(_Host, _ServerHost) ->
@@ -172,10 +173,11 @@ features() ->
      "subscription-notifications"
     ].
 
-%% @spec (Host, Node, Owner, Access) -> bool()
+%% @spec (Host, ServerHost, Node, ParentNode, Owner, Access) -> bool()
 %%      Host = mod_pubsub:host()
 %%      ServerHost = mod_pubsub:host()
 %%      Node = mod_pubsub:pubsubNode()
+%%      ParentNode = mod_pubsub:pubsubNode()
 %%      Owner = mod_pubsub:jid()
 %%      Access = all | atom()
 %% @doc Checks if the current user has the permission to create the requested node
@@ -246,7 +248,7 @@ delete_node(Host, Removed) ->
       end, Removed),
     {result, {default, broadcast, Removed}}.
 
-%% @spec (Host, Node, Sender, Subscriber, AccessModel, SendLast) ->
+%% @spec (Host, Node, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup) ->
 %%              {error, Reason} | {result, Result}
 %% @doc <p>Accepts or rejects subcription requests on a PubSub node.</p>
 %% <p>The mechanism works as follow:
@@ -531,7 +533,12 @@ delete_item(Host, Node, Publisher, ItemId) ->
            end
     end.
 
-%% @spec (TODO)
+%% @spec (Host, Node, Owner) ->
+%%               {error, Reason::stanzaError()} |
+%%               {result, {default, broadcast}}
+%%      Host = mod_pubsub:host()
+%%      Node = mod_pubsub:pubsubNode()
+%%      Owner = mod_pubsub:jid()
 purge_node(Host, Node, Owner) ->
     OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
     case get_state(Host, Node, OwnerKey) of
@@ -597,9 +604,10 @@ set_affiliation(Host, Node, Owner, Affiliation) ->
     set_state(Record),
     ok.
 
-%% @spec (Host) -> [{Node,Subscription}]
+%% @spec (Host, Owner) -> [{Node,Subscription}]
 %%      Host = host()
-%%      JID = mod_pubsub:jid()
+%%      Owner = mod_pubsub:jid()
+%%      Node = mod_pubsub:pubsubNode()
 %% @doc <p>Return the current subscriptions for the given user</p>
 %% <p>The default module reads subscriptions in the main Mnesia
 %% <tt>pubsub_state</tt> table. If a plugin stores its data in the same
@@ -679,7 +687,7 @@ get_state(Host, Node, JID) ->
            {error, ?ERR_ITEM_NOT_FOUND}
     end.
 
-%% @spec (State) -> ok | {error, ?ERR_INTERNAL_SERVER_ERROR}
+%% @spec (State) -> ok | {error, Reason::stanzaError()}
 %%      State = mod_pubsub:pubsubStates()
 %% @doc <p>Write a state into database.</p>
 set_state(State) when is_record(State, pubsub_state) ->
@@ -720,7 +728,7 @@ get_item(Host, Node, ItemId) ->
            {error, ?ERR_ITEM_NOT_FOUND}
     end.
 
-%% @spec (Item) -> ok | {error, ?ERR_INTERNAL_SERVER_ERROR}
+%% @spec (Item) -> ok | {error, Reason::stanzaError()}
 %%      Item = mod_pubsub:pubsubItems()
 %% @doc <p>Write a state into database.</p>
 set_item(Item) when is_record(Item, pubsub_item) ->
index 80eeefb31959bfe470800a58fa366541a7528b65..0a36e3362f0a7087e3fe13f9686ed54069be7810 100644 (file)
@@ -58,7 +58,7 @@
 %% API definition
 %% ================
 
-%% @spec (Host) -> any()
+%% @spec (Host, ServerHost, Opts) -> any()
 %%     Host = mod_pubsub:host()
 %%     ServerHost = host()
 %%     Opts = list()
index c931a1b4f3884f59c1c0528f0651ee61d1b0b236..5ce256140361e054e200f3ca17a1865718a3904d 100644 (file)
@@ -55,7 +55,7 @@
 %% API definition
 %% ================
 
-%% @spec (Host) -> any()
+%% @spec (Host, ServerHost, Opts) -> any()
 %%     Host = mod_pubsub:host()
 %%     ServerHost = host()
 %%     Opts = list()
index f2ecd6eebac3e5d79cc4e4fd981f6f7a186e1d88..25f60c36d5b82154108f585c72d53fd26d91020c 100644 (file)
@@ -16,7 +16,7 @@
 %%% This software is copyright 2006-2008, Process-one.
 %%%
 %%%
-%%% @copyright 2006-2008 Process-one
+%%% copyright 2006-2008 Process-one
 %%%
 %%% This file contains pubsub types definition.
 %%% ====================================================================
 
 %% @type pubsubPresence() = #pubsub_presence{
 %%     key = {Host::host(), User::string(), Server::string()},
-%%     presence = list().
+%%     presence = list()}.
 %%% <p>This is the format of the <tt>published presence</tt> table. The type of the
 %%% table is: <tt>set</tt>,<tt>ram</tt>.</p>
 -record(pubsub_presence, {key,