__init__.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014, 2015 OpenMarket Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. from synapse.util.frozenutils import freeze
  16. class _EventInternalMetadata(object):
  17. def __init__(self, internal_metadata_dict):
  18. self.__dict__ = dict(internal_metadata_dict)
  19. def get_dict(self):
  20. return dict(self.__dict__)
  21. def is_outlier(self):
  22. return hasattr(self, "outlier") and self.outlier
  23. def _event_dict_property(key):
  24. def getter(self):
  25. return self._event_dict[key]
  26. def setter(self, v):
  27. self._event_dict[key] = v
  28. def delete(self):
  29. del self._event_dict[key]
  30. return property(
  31. getter,
  32. setter,
  33. delete,
  34. )
  35. class EventBase(object):
  36. def __init__(self, event_dict, signatures={}, unsigned={},
  37. internal_metadata_dict={}):
  38. self.signatures = signatures
  39. self.unsigned = unsigned
  40. self._event_dict = event_dict
  41. self.internal_metadata = _EventInternalMetadata(
  42. internal_metadata_dict
  43. )
  44. auth_events = _event_dict_property("auth_events")
  45. depth = _event_dict_property("depth")
  46. content = _event_dict_property("content")
  47. event_id = _event_dict_property("event_id")
  48. hashes = _event_dict_property("hashes")
  49. origin = _event_dict_property("origin")
  50. origin_server_ts = _event_dict_property("origin_server_ts")
  51. prev_events = _event_dict_property("prev_events")
  52. prev_state = _event_dict_property("prev_state")
  53. redacts = _event_dict_property("redacts")
  54. room_id = _event_dict_property("room_id")
  55. sender = _event_dict_property("sender")
  56. state_key = _event_dict_property("state_key")
  57. type = _event_dict_property("type")
  58. user_id = _event_dict_property("sender")
  59. @property
  60. def membership(self):
  61. return self.content["membership"]
  62. def is_state(self):
  63. return hasattr(self, "state_key") and self.state_key is not None
  64. def get_dict(self):
  65. d = dict(self._event_dict)
  66. d.update({
  67. "signatures": self.signatures,
  68. "unsigned": self.unsigned,
  69. })
  70. return d
  71. def get(self, key, default):
  72. return self._event_dict.get(key, default)
  73. def get_internal_metadata_dict(self):
  74. return self.internal_metadata.get_dict()
  75. def get_pdu_json(self, time_now=None):
  76. pdu_json = self.get_dict()
  77. if time_now is not None and "age_ts" in pdu_json["unsigned"]:
  78. age = time_now - pdu_json["unsigned"]["age_ts"]
  79. pdu_json.setdefault("unsigned", {})["age"] = int(age)
  80. del pdu_json["unsigned"]["age_ts"]
  81. return pdu_json
  82. def __set__(self, instance, value):
  83. raise AttributeError("Unrecognized attribute %s" % (instance,))
  84. class FrozenEvent(EventBase):
  85. def __init__(self, event_dict, internal_metadata_dict={}):
  86. event_dict = dict(event_dict)
  87. # Signatures is a dict of dicts, and this is faster than doing a
  88. # copy.deepcopy
  89. signatures = {
  90. name: {sig_id: sig for sig_id, sig in sigs.items()}
  91. for name, sigs in event_dict.pop("signatures", {}).items()
  92. }
  93. unsigned = dict(event_dict.pop("unsigned", {}))
  94. frozen_dict = freeze(event_dict)
  95. super(FrozenEvent, self).__init__(
  96. frozen_dict,
  97. signatures=signatures,
  98. unsigned=unsigned,
  99. internal_metadata_dict=internal_metadata_dict,
  100. )
  101. @staticmethod
  102. def from_event(event):
  103. e = FrozenEvent(
  104. event.get_pdu_json()
  105. )
  106. e.internal_metadata = event.internal_metadata
  107. return e
  108. def __str__(self):
  109. return self.__repr__()
  110. def __repr__(self):
  111. return "<FrozenEvent event_id='%s', type='%s', state_key='%s'>" % (
  112. self.event_id, self.type, self.get("state_key", None),
  113. )