diff --git a/synapse/events/__init__.py b/synapse/events/__init__.py
index 01db729847..e74ea33a7c 100644
--- a/synapse/events/__init__.py
+++ b/synapse/events/__init__.py
@@ -18,7 +18,11 @@ from distutils.util import strtobool
import six
-from synapse.api.constants import KNOWN_ROOM_VERSIONS, EventFormatVersions
+from synapse.api.constants import (
+ KNOWN_EVENT_FORMAT_VERSIONS,
+ KNOWN_ROOM_VERSIONS,
+ EventFormatVersions,
+)
from synapse.util.caches import intern_dict
from synapse.util.frozenutils import freeze
@@ -254,3 +258,21 @@ def room_version_to_event_format(room_version):
raise
return EventFormatVersions.V1
+
+
+def event_type_from_format_version(format_version):
+ """Returns the python type to use to construct an Event object for the
+ given event format version.
+
+ Args:
+ format_version (int): The event format version
+
+ Returns:
+ type: A type that can be initialized as per the initializer of
+ `FrozenEvent`
+ """
+ if format_version not in KNOWN_EVENT_FORMAT_VERSIONS:
+ raise Exception(
+ "No event format %r" % (format_version,)
+ )
+ return FrozenEvent
diff --git a/synapse/events/builder.py b/synapse/events/builder.py
index e662eaef10..7e63371095 100644
--- a/synapse/events/builder.py
+++ b/synapse/events/builder.py
@@ -15,12 +15,39 @@
import copy
+from synapse.api.constants import RoomVersions
from synapse.types import EventID
from synapse.util.stringutils import random_string
from . import EventBase, FrozenEvent, _event_dict_property
+def get_event_builder(room_version, key_values={}, internal_metadata_dict={}):
+ """Generate an event builder appropriate for the given room version
+
+ Args:
+ room_version (str): Version of the room that we're creating an
+ event builder for
+ key_values (dict): Fields used as the basis of the new event
+ internal_metadata_dict (dict): Used to create the `_EventInternalMetadata`
+ object.
+
+ Returns:
+ EventBuilder
+ """
+ if room_version in {
+ RoomVersions.V1,
+ RoomVersions.V2,
+ RoomVersions.VDH_TEST,
+ RoomVersions.STATE_V2_TEST,
+ }:
+ return EventBuilder(key_values, internal_metadata_dict)
+ else:
+ raise Exception(
+ "No event format defined for version %r" % (room_version,)
+ )
+
+
class EventBuilder(EventBase):
def __init__(self, key_values={}, internal_metadata_dict={}):
signatures = copy.deepcopy(key_values.pop("signatures", {}))
@@ -58,7 +85,29 @@ class EventBuilderFactory(object):
return e_id.to_string()
- def new(self, key_values={}):
+ def new(self, room_version, key_values={}):
+ """Generate an event builder appropriate for the given room version
+
+ Args:
+ room_version (str): Version of the room that we're creating an
+ event builder for
+ key_values (dict): Fields used as the basis of the new event
+
+ Returns:
+ EventBuilder
+ """
+
+ # There's currently only the one event version defined
+ if room_version not in {
+ RoomVersions.V1,
+ RoomVersions.V2,
+ RoomVersions.VDH_TEST,
+ RoomVersions.STATE_V2_TEST,
+ }:
+ raise Exception(
+ "No event format defined for version %r" % (room_version,)
+ )
+
key_values["event_id"] = self.create_event_id()
time_now = int(self.clock.time_msec())
|