slidge 0.2.12__py3-none-any.whl → 0.3.0a0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. slidge/__init__.py +5 -2
  2. slidge/command/adhoc.py +9 -3
  3. slidge/command/admin.py +16 -12
  4. slidge/command/base.py +16 -12
  5. slidge/command/chat_command.py +25 -16
  6. slidge/command/user.py +7 -8
  7. slidge/contact/contact.py +119 -209
  8. slidge/contact/roster.py +106 -105
  9. slidge/core/config.py +2 -43
  10. slidge/core/dispatcher/caps.py +9 -2
  11. slidge/core/dispatcher/disco.py +13 -3
  12. slidge/core/dispatcher/message/__init__.py +1 -1
  13. slidge/core/dispatcher/message/chat_state.py +17 -8
  14. slidge/core/dispatcher/message/marker.py +7 -5
  15. slidge/core/dispatcher/message/message.py +117 -92
  16. slidge/core/dispatcher/muc/__init__.py +1 -1
  17. slidge/core/dispatcher/muc/admin.py +4 -4
  18. slidge/core/dispatcher/muc/mam.py +10 -6
  19. slidge/core/dispatcher/muc/misc.py +4 -2
  20. slidge/core/dispatcher/muc/owner.py +5 -3
  21. slidge/core/dispatcher/muc/ping.py +3 -1
  22. slidge/core/dispatcher/presence.py +21 -15
  23. slidge/core/dispatcher/registration.py +20 -12
  24. slidge/core/dispatcher/search.py +7 -3
  25. slidge/core/dispatcher/session_dispatcher.py +13 -5
  26. slidge/core/dispatcher/util.py +37 -27
  27. slidge/core/dispatcher/vcard.py +7 -4
  28. slidge/core/gateway.py +168 -84
  29. slidge/core/mixins/__init__.py +1 -11
  30. slidge/core/mixins/attachment.py +163 -148
  31. slidge/core/mixins/avatar.py +100 -177
  32. slidge/core/mixins/db.py +50 -2
  33. slidge/core/mixins/message.py +19 -17
  34. slidge/core/mixins/message_maker.py +29 -15
  35. slidge/core/mixins/message_text.py +38 -30
  36. slidge/core/mixins/presence.py +91 -35
  37. slidge/core/pubsub.py +42 -47
  38. slidge/core/session.py +88 -57
  39. slidge/db/alembic/versions/0337c90c0b96_unify_legacy_xmpp_id_mappings.py +183 -0
  40. slidge/db/alembic/versions/4dbd23a3f868_new_avatar_store.py +56 -0
  41. slidge/db/alembic/versions/54ce3cde350c_use_hash_for_avatar_filenames.py +50 -0
  42. slidge/db/alembic/versions/58b98dacf819_refactor.py +118 -0
  43. slidge/db/alembic/versions/75a62b74b239_ditch_hats_table.py +74 -0
  44. slidge/db/avatar.py +150 -119
  45. slidge/db/meta.py +33 -22
  46. slidge/db/models.py +68 -117
  47. slidge/db/store.py +412 -1094
  48. slidge/group/archive.py +61 -54
  49. slidge/group/bookmarks.py +74 -55
  50. slidge/group/participant.py +135 -142
  51. slidge/group/room.py +315 -312
  52. slidge/main.py +28 -18
  53. slidge/migration.py +2 -12
  54. slidge/slixfix/__init__.py +20 -4
  55. slidge/slixfix/delivery_receipt.py +6 -4
  56. slidge/slixfix/link_preview/link_preview.py +1 -1
  57. slidge/slixfix/link_preview/stanza.py +1 -1
  58. slidge/slixfix/roster.py +5 -7
  59. slidge/slixfix/xep_0077/register.py +8 -8
  60. slidge/slixfix/xep_0077/stanza.py +7 -7
  61. slidge/slixfix/xep_0100/gateway.py +12 -13
  62. slidge/slixfix/xep_0153/vcard_avatar.py +1 -1
  63. slidge/slixfix/xep_0292/vcard4.py +1 -1
  64. slidge/util/archive_msg.py +11 -5
  65. slidge/util/conf.py +23 -20
  66. slidge/util/jid_escaping.py +1 -1
  67. slidge/{core/mixins → util}/lock.py +6 -6
  68. slidge/util/test.py +30 -29
  69. slidge/util/types.py +22 -18
  70. slidge/util/util.py +19 -22
  71. {slidge-0.2.12.dist-info → slidge-0.3.0a0.dist-info}/METADATA +1 -1
  72. slidge-0.3.0a0.dist-info/RECORD +117 -0
  73. {slidge-0.2.12.dist-info → slidge-0.3.0a0.dist-info}/WHEEL +1 -1
  74. slidge-0.2.12.dist-info/RECORD +0 -112
  75. {slidge-0.2.12.dist-info → slidge-0.3.0a0.dist-info}/entry_points.txt +0 -0
  76. {slidge-0.2.12.dist-info → slidge-0.3.0a0.dist-info}/licenses/LICENSE +0 -0
  77. {slidge-0.2.12.dist-info → slidge-0.3.0a0.dist-info}/top_level.txt +0 -0
@@ -29,7 +29,7 @@ JID_UNESCAPE_TRANSFORMATIONS = {
29
29
 
30
30
 
31
31
  @lru_cache(1000)
32
- def unescape_node(node: str):
32
+ def unescape_node(node: str) -> str:
33
33
  """Unescape a local portion of a JID."""
34
34
  unescaped = []
35
35
  seq = ""
@@ -1,16 +1,16 @@
1
1
  import asyncio
2
2
  import logging
3
3
  from contextlib import asynccontextmanager
4
- from typing import Hashable
4
+ from typing import Any, AsyncIterator, Hashable
5
5
 
6
6
 
7
7
  class NamedLockMixin:
8
- def __init__(self, *a, **k):
8
+ def __init__(self, *a: Any, **k: Any) -> None:
9
9
  super().__init__(*a, **k)
10
10
  self.__locks = dict[Hashable, asyncio.Lock]()
11
11
 
12
12
  @asynccontextmanager
13
- async def lock(self, id_: Hashable):
13
+ async def lock(self, id_: Hashable) -> AsyncIterator[None]:
14
14
  log.trace("getting %s", id_) # type:ignore
15
15
  locks = self.__locks
16
16
  if not locks.get(id_):
@@ -21,13 +21,13 @@ class NamedLockMixin:
21
21
  yield
22
22
  finally:
23
23
  log.trace("releasing %s", id_) # type:ignore
24
- waiters = locks[id_]._waiters # type:ignore
24
+ waiters = locks[id_]._waiters
25
25
  if not waiters:
26
26
  del locks[id_]
27
27
  log.trace("erasing %s", id_) # type:ignore
28
28
 
29
- def get_lock(self, id_: Hashable):
29
+ def get_lock(self, id_: Hashable) -> asyncio.Lock | None:
30
30
  return self.__locks.get(id_)
31
31
 
32
32
 
33
- log = logging.getLogger(__name__) # type:ignore
33
+ log = logging.getLogger(__name__)
slidge/util/test.py CHANGED
@@ -43,19 +43,25 @@ from slidge import (
43
43
  from ..command import Command
44
44
  from ..core import config
45
45
  from ..core.config import _TimedeltaSeconds
46
- from ..core.pubsub import PepAvatar, PepNick
47
46
  from ..db import SlidgeStore
48
47
  from ..db.avatar import avatar_cache
49
48
  from ..db.meta import Base
50
- from ..db.models import Contact
49
+ from ..db.models import Contact, GatewayUser
51
50
 
52
51
 
53
52
  class SlixTestPlus(SlixTest):
54
- def setUp(self):
53
+ def setUp(self) -> None:
55
54
  super().setUp()
56
55
  Error.namespace = "jabber:component:accept"
57
56
 
58
- def check(self, stanza, criteria, method="exact", defaults=None, use_values=True):
57
+ def check(
58
+ self,
59
+ stanza,
60
+ criteria,
61
+ method: str = "exact",
62
+ defaults=None,
63
+ use_values: bool = True,
64
+ ):
59
65
  """
60
66
  Create and compare several stanza objects to a correct XML string.
61
67
 
@@ -174,7 +180,9 @@ class SlixTestPlus(SlixTest):
174
180
  )
175
181
  self.assertTrue(result, debug)
176
182
 
177
- def next_sent(self, timeout=0.05) -> Optional[Union[Message, Iq, Presence]]:
183
+ def next_sent(
184
+ self, timeout: float = 0.05
185
+ ) -> Optional[Union[Message, Iq, Presence]]:
178
186
  self.wait_for_send_queue()
179
187
  sent = self.xmpp.socket.next_sent(timeout=timeout)
180
188
  if sent is None:
@@ -197,13 +205,11 @@ class SlidgeTest(SlixTestPlus):
197
205
  home_dir = Path(tempfile.mkdtemp())
198
206
  user_jid_validator = ".*"
199
207
  admins: list[str] = []
200
- no_roster_push = False
201
208
  upload_requester = None
202
209
  ignore_delay_threshold = _TimedeltaSeconds("300")
203
- last_seen_fallback = True
204
210
 
205
211
  @classmethod
206
- def setUpClass(cls):
212
+ def setUpClass(cls) -> None:
207
213
  for k, v in vars(cls.Config).items():
208
214
  setattr(config, k.upper(), v)
209
215
 
@@ -237,8 +243,6 @@ class SlidgeTest(SlixTestPlus):
237
243
  except Exception:
238
244
  raise
239
245
  self.xmpp.TEST_MODE = True
240
- PepNick.contact_store = self.xmpp.store.contacts
241
- PepAvatar.store = self.xmpp.store
242
246
  avatar_cache.store = self.xmpp.store.avatars
243
247
  avatar_cache.set_dir(Path(tempfile.mkdtemp()))
244
248
  self.xmpp._always_send_everything = True
@@ -273,22 +277,20 @@ class SlidgeTest(SlixTestPlus):
273
277
  self.xmpp.use_presence_ids = False
274
278
  Error.namespace = "jabber:component:accept"
275
279
 
276
- def tearDown(self):
280
+ def tearDown(self) -> None:
277
281
  self.db_engine.echo = False
278
282
  super().tearDown()
279
- import slidge.db.store
280
-
281
- if slidge.db.store._session is not None:
282
- slidge.db.store._session.commit()
283
- slidge.db.store._session = None
284
283
  Base.metadata.drop_all(self.xmpp.store._engine)
285
284
 
286
- def setup_logged_session(self, n_contacts=0):
287
- user = self.xmpp.store.users.new(
288
- JID("romeo@montague.lit/gajim"), {"username": "romeo", "city": ""}
289
- )
290
- user.preferences = {"sync_avatar": True, "sync_presence": True}
291
- self.xmpp.store.users.update(user)
285
+ def setup_logged_session(self, n_contacts: int = 0) -> None:
286
+ with self.xmpp.store.session() as orm:
287
+ user = GatewayUser(
288
+ jid=JID("romeo@montague.lit/gajim").bare,
289
+ legacy_module_data={"username": "romeo", "city": ""},
290
+ preferences={"sync_avatar": True, "sync_presence": True},
291
+ )
292
+ orm.add(user)
293
+ orm.commit()
292
294
 
293
295
  with self.xmpp.store.session() as session:
294
296
  session.execute(delete(Contact))
@@ -308,9 +310,8 @@ class SlidgeTest(SlixTestPlus):
308
310
  if BaseGateway.get_self_or_unique_subclass().GROUPS:
309
311
  stanza = self.next_sent()
310
312
  assert "syncing groups" in stanza["status"].lower(), stanza
311
- for _ in range(n_contacts):
312
- probe = self.next_sent()
313
- assert probe.get_type() == "probe"
313
+ probe = self.next_sent()
314
+ assert probe.get_type() == "probe"
314
315
  stanza = self.next_sent()
315
316
  assert "yup" in stanza["status"].lower(), stanza
316
317
  self.romeo: BaseSession = BaseSession.get_self_or_unique_subclass().from_jid(
@@ -338,7 +339,7 @@ class SlidgeTest(SlixTestPlus):
338
339
  )
339
340
 
340
341
  @classmethod
341
- def tearDownClass(cls):
342
+ def tearDownClass(cls) -> None:
342
343
  reset_subclasses()
343
344
 
344
345
 
@@ -348,7 +349,7 @@ def format_stanza(stanza):
348
349
  )
349
350
 
350
351
 
351
- def find_subclass(o, parent, base_ok=False):
352
+ def find_subclass(o, parent, base_ok: bool = False):
352
353
  try:
353
354
  vals = vars(o).values()
354
355
  except TypeError:
@@ -366,7 +367,7 @@ def find_subclass(o, parent, base_ok=False):
366
367
  raise RuntimeError
367
368
 
368
369
 
369
- def reset_subclasses():
370
+ def reset_subclasses() -> None:
370
371
  """
371
372
  Reset registered subclasses between test classes.
372
373
 
@@ -383,7 +384,7 @@ def reset_subclasses():
383
384
  # reset_commands()
384
385
 
385
386
 
386
- def reset_commands():
387
+ def reset_commands() -> None:
387
388
  Command.subclasses = [
388
389
  c for c in Command.subclasses if str(c).startswith("<class 'slidge.core")
389
390
  ]
slidge/util/types.py CHANGED
@@ -10,6 +10,7 @@ from typing import (
10
10
  IO,
11
11
  TYPE_CHECKING,
12
12
  Any,
13
+ AsyncIterator,
13
14
  Generic,
14
15
  Hashable,
15
16
  Literal,
@@ -25,19 +26,15 @@ from slixmpp.types import PresenceShows, PresenceTypes, ResourceDict
25
26
 
26
27
  if TYPE_CHECKING:
27
28
  from ..contact import LegacyContact
28
- from ..core.pubsub import PepItem
29
29
  from ..core.session import BaseSession
30
- from ..group.participant import LegacyMUC, LegacyParticipant
30
+ from ..group import LegacyMUC
31
+ from ..group.participant import LegacyParticipant
31
32
 
32
33
  AnyBaseSession = BaseSession[Any, Any]
33
34
  else:
34
35
  AnyBaseSession = None
35
36
 
36
37
 
37
- class URL(str):
38
- pass
39
-
40
-
41
38
  LegacyGroupIdType = TypeVar("LegacyGroupIdType", bound=Hashable)
42
39
  """
43
40
  Type of the unique identifier for groups, usually a str or an int,
@@ -47,18 +44,14 @@ LegacyMessageType = TypeVar("LegacyMessageType", bound=Hashable)
47
44
  LegacyThreadType = TypeVar("LegacyThreadType", bound=Hashable)
48
45
  LegacyUserIdType = TypeVar("LegacyUserIdType", bound=Hashable)
49
46
 
50
- LegacyContactType = TypeVar("LegacyContactType", bound="LegacyContact")
51
- LegacyMUCType = TypeVar("LegacyMUCType", bound="LegacyMUC")
47
+ LegacyContactType = TypeVar("LegacyContactType", bound="LegacyContact[Any]")
48
+ LegacyMUCType = TypeVar("LegacyMUCType", bound="LegacyMUC[Any, Any, Any, Any]")
52
49
  LegacyParticipantType = TypeVar("LegacyParticipantType", bound="LegacyParticipant")
53
50
 
54
- PepItemType = TypeVar("PepItemType", bound="PepItem")
55
-
56
- Recipient = Union["LegacyMUC", "LegacyContact"]
51
+ Recipient = Union["LegacyMUC[Any, Any, Any, Any]", "LegacyContact[Any]"]
57
52
  RecipientType = TypeVar("RecipientType", bound=Recipient)
58
- Sender = Union["LegacyContact", "LegacyParticipant"]
59
- AvatarType = Union[bytes, str, Path]
53
+ Sender = Union["LegacyContact[Any]", "LegacyParticipant"]
60
54
  LegacyFileIdType = Union[int, str]
61
- AvatarIdType = Union[LegacyFileIdType, URL]
62
55
 
63
56
  ChatState = Literal["active", "composing", "gone", "inactive", "paused"]
64
57
  ProcessingHint = Literal["no-store", "markable", "store"]
@@ -116,6 +109,7 @@ class LegacyAttachment:
116
109
  path: Optional[Union[Path, str]] = None
117
110
  name: Optional[Union[str]] = None
118
111
  stream: Optional[IO[bytes]] = None
112
+ aio_stream: Optional[AsyncIterator[bytes]] = None
119
113
  data: Optional[bytes] = None
120
114
  content_type: Optional[str] = None
121
115
  legacy_file_id: Optional[Union[str, int]] = None
@@ -126,11 +120,14 @@ class LegacyAttachment:
126
120
  use the ``body`` parameter of :meth:`.AttachmentMixin.send_files`
127
121
  """
128
122
 
129
- def __post_init__(self):
130
- if not any(
131
- x is not None for x in (self.path, self.stream, self.data, self.url)
123
+ def __post_init__(self) -> None:
124
+ if all(
125
+ x is None
126
+ for x in (self.path, self.stream, self.data, self.url, self.aio_stream)
132
127
  ):
133
128
  raise TypeError("There is not data in this attachment", self)
129
+ if isinstance(self.path, str):
130
+ self.path = Path(self.path)
134
131
 
135
132
 
136
133
  class MucType(IntEnum):
@@ -171,7 +168,7 @@ class LinkPreview(NamedTuple):
171
168
 
172
169
 
173
170
  class Mention(NamedTuple):
174
- contact: "LegacyContact"
171
+ contact: "LegacyContact[Any]"
175
172
  start: int
176
173
  end: int
177
174
 
@@ -207,3 +204,10 @@ class Sticker(NamedTuple):
207
204
  path: Path
208
205
  content_type: Optional[str]
209
206
  hashes: dict[str, str]
207
+
208
+
209
+ class Avatar(NamedTuple):
210
+ path: Optional[Path] = None
211
+ unique_id: Optional[str | int] = None
212
+ url: Optional[str] = None
213
+ data: Optional[bytes] = None
slidge/util/util.py CHANGED
@@ -7,7 +7,7 @@ from abc import ABCMeta
7
7
  from functools import wraps
8
8
  from pathlib import Path
9
9
  from time import time
10
- from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Type, TypeVar
10
+ from typing import TYPE_CHECKING, Any, Callable, NamedTuple, Optional, Type, TypeVar
11
11
 
12
12
  try:
13
13
  import emoji
@@ -34,7 +34,7 @@ except ImportError as e:
34
34
  )
35
35
 
36
36
 
37
- def fix_suffix(path: Path, mime_type: Optional[str], file_name: Optional[str]):
37
+ def fix_suffix(path: Path, mime_type: Optional[str], file_name: Optional[str]) -> Path:
38
38
  guessed = magic.from_file(path, mime=True)
39
39
  if guessed == mime_type:
40
40
  log.debug("Magic and given MIME match")
@@ -65,9 +65,15 @@ def fix_suffix(path: Path, mime_type: Optional[str], file_name: Optional[str]):
65
65
 
66
66
 
67
67
  class SubclassableOnce(type):
68
- TEST_MODE = False # To allow importing everything, including plugins, during tests
69
-
70
- def __init__(cls, name, bases, dct):
68
+ # To allow importing everything, including plugins, during tests
69
+ TEST_MODE: bool = False
70
+
71
+ def __init__(
72
+ cls,
73
+ name: str,
74
+ bases: tuple[Type[Any], ...],
75
+ dct: dict[str, Any],
76
+ ) -> None:
71
77
  for b in bases:
72
78
  if type(b) in (SubclassableOnce, ABCSubclassableOnceAtMost):
73
79
  if hasattr(b, "_subclass") and not cls.TEST_MODE:
@@ -84,19 +90,19 @@ class SubclassableOnce(type):
84
90
 
85
91
  super().__init__(name, bases, dct)
86
92
 
87
- def get_self_or_unique_subclass(cls):
93
+ def get_self_or_unique_subclass(cls) -> "SubclassableOnce":
88
94
  try:
89
95
  return cls.get_unique_subclass()
90
96
  except AttributeError:
91
97
  return cls
92
98
 
93
- def get_unique_subclass(cls):
99
+ def get_unique_subclass(cls) -> "SubclassableOnce":
94
100
  r = getattr(cls, "_subclass", None)
95
101
  if r is None:
96
102
  raise AttributeError("Could not find any subclass", cls)
97
103
  return r
98
104
 
99
- def reset_subclass(cls):
105
+ def reset_subclass(cls) -> None:
100
106
  try:
101
107
  log.debug("Resetting subclass of %s", cls)
102
108
  delattr(cls, "_subclass")
@@ -156,7 +162,7 @@ ILLEGAL_XML_CHARS_RE = re.compile(XML_ILLEGAL_CHARACTER_REGEX)
156
162
  # from https://stackoverflow.com/a/35804945/5902284
157
163
  def addLoggingLevel(
158
164
  levelName: str = "TRACE", levelNum: int = logging.DEBUG - 5, methodName=None
159
- ):
165
+ ) -> None:
160
166
  """
161
167
  Comprehensively adds a new logging level to the `logging` module and the
162
168
  currently configured logging class.
@@ -197,11 +203,11 @@ def addLoggingLevel(
197
203
  # This method was inspired by the answers to Stack Overflow post
198
204
  # http://stackoverflow.com/q/2183233/2988730, especially
199
205
  # http://stackoverflow.com/a/13638084/2988730
200
- def logForLevel(self, message, *args, **kwargs):
206
+ def logForLevel(self, message, *args, **kwargs) -> None:
201
207
  if self.isEnabledFor(levelNum):
202
208
  self._log(levelNum, message, args, **kwargs)
203
209
 
204
- def logToRoot(message, *args, **kwargs):
210
+ def logToRoot(message, *args, **kwargs) -> None:
205
211
  logging.log(levelNum, message, *args, **kwargs)
206
212
 
207
213
  logging.addLevelName(levelNum, levelName)
@@ -211,7 +217,7 @@ def addLoggingLevel(
211
217
 
212
218
 
213
219
  class SlidgeLogger(logging.Logger):
214
- def trace(self):
220
+ def trace(self) -> None:
215
221
  pass
216
222
 
217
223
 
@@ -294,15 +300,6 @@ def replace_mentions(
294
300
  return "".join(pieces)
295
301
 
296
302
 
297
- def with_session(func):
298
- @wraps(func)
299
- async def wrapped(self, *args, **kwargs):
300
- with self.xmpp.store.session():
301
- return await func(self, *args, **kwargs)
302
-
303
- return wrapped
304
-
305
-
306
303
  def timeit(func):
307
304
  @wraps(func)
308
305
  async def wrapped(self, *args, **kwargs):
@@ -325,5 +322,5 @@ def strip_leading_emoji(text: str) -> str:
325
322
  return text
326
323
 
327
324
 
328
- async def noop_coro():
325
+ async def noop_coro() -> None:
329
326
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: slidge
3
- Version: 0.2.12
3
+ Version: 0.3.0a0
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -0,0 +1,117 @@
1
+ slidge/__init__.py,sha256=OWGOMz8wl6I6XNUT9ipE9IFD-OinS8zQGGn4U_z3IWw,1835
2
+ slidge/__main__.py,sha256=ydjUklOoavS4YlGfjRX_8BQN2DaSbaXPMi47RkOgcFI,37
3
+ slidge/main.py,sha256=Q2memNl050JJhUk-ZKHV2Q2lVpdMtoyLKupKswq-swM,7070
4
+ slidge/migration.py,sha256=gq14UVm0zGP7VankizT3jy9Q9zu7hJeTYpVlInrswf8,1221
5
+ slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ slidge/command/__init__.py,sha256=UYf1mjCYbZ5G7PIgaFTWSQRAzEJkQ6dTH8Fu_e_XnO0,613
7
+ slidge/command/adhoc.py,sha256=NCHammJdl30eHniiYukYQZKp1IeI-5qv5u9NncLNSNM,10760
8
+ slidge/command/admin.py,sha256=_utjSHGKeKtMTe2UHXVr2oQ_ZzCiG575pUQpVcO6tHE,6409
9
+ slidge/command/base.py,sha256=h6lQ6ypb5uNrppZ_N8mS7ObJpnOINYZS6QokGlWVgAk,13527
10
+ slidge/command/categories.py,sha256=vF0KGDV9sEn8TNkcMoDRw-u3gEyNHSXghOU2JRHQtKs,351
11
+ slidge/command/chat_command.py,sha256=r_qalygOCsEoS-OgWw8IIlAzTufhXNjduONbeoepUIA,11557
12
+ slidge/command/register.py,sha256=BduDI31Kx8CbWWEdjybimTA5Wcfhn-Jkt8sSPsySCpo,6724
13
+ slidge/command/user.py,sha256=VS7xuADXXes941OyiJbxC_C8d5hcqm-TSS4Gu82_8PQ,12173
14
+ slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
15
+ slidge/contact/contact.py,sha256=ubqd3aH-TOcv5hsHGPSlDGyojQXn3wjalrO7l_LfZk8,19449
16
+ slidge/contact/roster.py,sha256=TAPvaPWUn77CHt8la_BLfQRkZZJhlG-hn2wEQZbGzJ8,9706
17
+ slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
18
+ slidge/core/config.py,sha256=1HxHQ5BOnYghi8V5KbCQ6sUsNnXzAZAIoFA5PrMqH4E,6060
19
+ slidge/core/gateway.py,sha256=IpnHk0D-MXBY2-oPu8u-WrO6bV2Smq95Quqeec5-DEI,40930
20
+ slidge/core/pubsub.py,sha256=-YK49tEdz_SLM3O8Y9zvu3p5KYhxgNpqbsD57rOIdNI,12141
21
+ slidge/core/session.py,sha256=Arz8hQ99o_DJd4NnhRTPaeurywD48xahpjbUVFR8Lkk,29382
22
+ slidge/core/dispatcher/__init__.py,sha256=1EXcjXietUKlxEqdrCWCV3xZ3q_DSsjHoqWrPMbtYao,84
23
+ slidge/core/dispatcher/caps.py,sha256=gISaHtFwFDXtkSrSsAkZfPiHQyXfmXg3v_YYU0w9iDg,2254
24
+ slidge/core/dispatcher/disco.py,sha256=xVPyBFnnkON-JjjM1oydRa-dqnDbwAZER2MGQACRhVk,2309
25
+ slidge/core/dispatcher/presence.py,sha256=XrcWGjIHofmAu_8QIOMsF6Wlg4_kyPukp73FPm8BwOg,6721
26
+ slidge/core/dispatcher/registration.py,sha256=Qa3fYZFJ4NaVz-FsnXorCmMQ9WyO7oZte1Zvro5f74E,3415
27
+ slidge/core/dispatcher/search.py,sha256=bL5cwMOtsfnX5IH-t60S1PudpeMWZnF4-qksrKDuDyc,3411
28
+ slidge/core/dispatcher/session_dispatcher.py,sha256=ysgPhns7NgUxhmkgEwRv-yDkSnUIXEdc-FsgqDqQAkE,3466
29
+ slidge/core/dispatcher/util.py,sha256=DsMWz7yS67E2Y2pcnXUkuVMTa9F_Ok0JIxjhqhdYpD0,6161
30
+ slidge/core/dispatcher/vcard.py,sha256=qHZZShq3Iyvgh1FkcAgGhdKXF5m1VUqeb4EWkY0cbFw,5203
31
+ slidge/core/dispatcher/message/__init__.py,sha256=gNeZZ0wtCI9JBqMe6tpumwV1TjY0mnPWTJc94uFTN-I,244
32
+ slidge/core/dispatcher/message/chat_state.py,sha256=RbtM_nlZyvOHusZkDEP0TXA4wMp_N435490eE4wW8U0,2143
33
+ slidge/core/dispatcher/message/marker.py,sha256=WZyf72_SM6sDGPMEOzhu93o2KbgxSxNF25jwsiM7h2A,2439
34
+ slidge/core/dispatcher/message/message.py,sha256=IEXbgaErWk8L-xQhkUXdYlruzk7x84Q1BjltLGjFxXI,16146
35
+ slidge/core/dispatcher/muc/__init__.py,sha256=60YUr0i8PCZEPyNNTynJueRbbxF5pqzdyVf8z_XFXmM,290
36
+ slidge/core/dispatcher/muc/admin.py,sha256=1tDZ9hHD6q5SqCjsYOpDimPB3Iyl21YO5RnK1goEGso,3284
37
+ slidge/core/dispatcher/muc/mam.py,sha256=7vfmMI_mJOIrc9KCbtTibJSowhZTBBFwXWc84Ikpu3I,2994
38
+ slidge/core/dispatcher/muc/misc.py,sha256=FYo5FdmzksEuUCfCLLOOm8_8plXtZFQP8IzvzVv3Wug,4115
39
+ slidge/core/dispatcher/muc/owner.py,sha256=dDAxpRaA8H_NJQNIyBNixck2oG4GHZeEQqPhKd7MmDQ,3359
40
+ slidge/core/dispatcher/muc/ping.py,sha256=EgKKS9AvMnW-vINGcoGbtk6NdbN9A7zVaGfT5T7F6YE,1699
41
+ slidge/core/mixins/__init__.py,sha256=Zea39CCwjJU5XfHwcYPEZ9Sin8z1BZxoV68G2RwC3nE,386
42
+ slidge/core/mixins/attachment.py,sha256=nR_ZHaPbrrXi3Ko8we6vhlu6GD0k4lU6JD3PPzsnFwU,20484
43
+ slidge/core/mixins/avatar.py,sha256=X5tS6jJmjEoHC6O9kMgkNJoXM8eCY53tzW8kv2NOyv4,5346
44
+ slidge/core/mixins/base.py,sha256=MOd-pas38_52VawQVlxWtBtmTKC6My9G0ZaCeQxOJbs,748
45
+ slidge/core/mixins/db.py,sha256=a6idm-FgHWfDK-MJZWy5AkkBlyY8JmwOB8xAFmm0E9g,1934
46
+ slidge/core/mixins/disco.py,sha256=jk3Z1B6zTuisHv8VKNRJodIo0ee5btYHh2ZrlflPj_Q,3670
47
+ slidge/core/mixins/message.py,sha256=xk4bgiJF9ATe-rgtH4sHU8hUwecBF4KjGIujm90mbXQ,8014
48
+ slidge/core/mixins/message_maker.py,sha256=d9lMurnWCr7Y-pyyUkLoQYykb6lCCZuBNKFOe2hcY3A,6552
49
+ slidge/core/mixins/message_text.py,sha256=UUbY-hdsMEUHe3b2h2Rwkaic43iDiaaUoEmuyw6FezY,8564
50
+ slidge/core/mixins/presence.py,sha256=YPGdAPyVocjV7UJgIGupgf-arKJUYni67b3I7ajsKJE,9697
51
+ slidge/core/mixins/recipient.py,sha256=b0uFnpym-hOFgYxGjXT1xQcZ4YRbDSBftPcNWLzSwEI,1336
52
+ slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
53
+ slidge/db/avatar.py,sha256=MXFd1oe0eL5CCUYbc5CpsIcbio3cY3xVoKt39RAoj9I,8240
54
+ slidge/db/meta.py,sha256=NtjGWcqPfG7uPfwR_cC6_23zyo8ftqgKX8CbP9IBq6U,2185
55
+ slidge/db/models.py,sha256=xkTveglIbJDwcm1YEF7urEC1LTlwyXYrxgT4Vppdmmg,12763
56
+ slidge/db/store.py,sha256=nRR0oAAHg16YX8zffavFh0i8d2QnZgyf0Zexev3M3sM,19261
57
+ slidge/db/alembic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
59
+ slidge/db/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
60
+ slidge/db/alembic/versions/0337c90c0b96_unify_legacy_xmpp_id_mappings.py,sha256=51Z7jCMEKtSeex4FUikEy2g-KQggW0kB-qxpBFKQh-0,6832
61
+ slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py,sha256=Dwz_azOXr7Tsw7Wnj0L8mknITIPXO9ewEsRn169EUNA,904
62
+ slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py,sha256=mUL-0Io6ZPd_QbnKfwGYyjdMcM2uxQ0Wg72H23-2t_E,1033
63
+ slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py,sha256=kzHuHGhzey5CY0p_OsKf5a-3zSk2649wqg2ToLiSD1I,2927
64
+ slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py,sha256=CLB-kOP9Rc0FJIKDLef912L5sYkjpTIPC8fhrIdrC7k,1084
65
+ slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py,sha256=f8TFS28CXjGhvIn41UYMoHYeODfqhKfo4O7gk-JwA1E,1134
66
+ slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py,sha256=CMVP2wFz6s7t57eWdSaGtck8BXzfVPJhHE5AoWi34tI,1359
67
+ slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py,sha256=jCdwCOnX9VDgnqIFFHGKaPA7w87Hm9nvR1rMY0LrA30,1394
68
+ slidge/db/alembic/versions/45c24cc73c91_add_bob.py,sha256=UjMySZ5LaInyPt0KbAxx0rF4GQhZh8CwBeqHtNPdG1c,1249
69
+ slidge/db/alembic/versions/4dbd23a3f868_new_avatar_store.py,sha256=t4kuly8UBqz-Vv6nMhJLZ834eCXZbziGjCotkenJIag,1764
70
+ slidge/db/alembic/versions/54ce3cde350c_use_hash_for_avatar_filenames.py,sha256=aNwlpXCHI_TEnVt2w-C8OrdH02-FhgrKbZkEqt40ay4,1495
71
+ slidge/db/alembic/versions/58b98dacf819_refactor.py,sha256=bQG57V7b0UK6of4MdDpoBNDtPQH5AYHqAkt3RL9OmaI,5001
72
+ slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py,sha256=m3USa76h0O2Xut-NePXIOZfkXl0bx0d5FyjOYpd34Jo,1977
73
+ slidge/db/alembic/versions/75a62b74b239_ditch_hats_table.py,sha256=INKDe7Y5iMETpyFmwMyQm-RrnGjP9gbcC_pWKuXoi2I,2388
74
+ slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py,sha256=g37po0ydp8ZmzJrE5oFV7GscnploxjCtPDpw28SqVGk,1429
75
+ slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py,sha256=18tG8B03Kq8Qz_-mMd28Beed6jow8XNTtrz7gT5QY3g,1210
76
+ slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py,sha256=ikoAlRV3_BJcDcFRANF-9HTB--0xpY0C5XdGuMuW9c0,4866
77
+ slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=eFlfn-LiDph05yyCc8gmtJwVKzgrSHwyWJ6nuVfEpQA,1391
78
+ slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py,sha256=VprqEVHipYuM-ea-CIM4_ubOD5zJ9inLTbhXc869n3A,2779
79
+ slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py,sha256=2tiRxoC9PYOQn6XQrwK0JTEsb45Pzp2PsKoZSS4rcIA,7564
80
+ slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py,sha256=r2sOgR5HcfueJyc3cWNDRmlZzdHOSX6nl2gef54wDbk,1559
81
+ slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py,sha256=jjQmlRv6nqdm5q6LbwVpSUSkTBj1c76Hiq8e8q77q3g,933
82
+ slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
83
+ slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
84
+ slidge/group/archive.py,sha256=DKwyde15-Op2rXuQBvdSmFcAKhUyWuorpEFcRSmDHec,5956
85
+ slidge/group/bookmarks.py,sha256=UWrUjZMWlDmwKFRuNEqxZSx4cvXFib4AP_l388ApJa8,7086
86
+ slidge/group/participant.py,sha256=6atjdHEgbfhPjPAkOVAQFFuCv5b8TO279HPHq-qpqIE,17651
87
+ slidge/group/room.py,sha256=KKj1mmASoRH80AfI-IZMOeahdThEEGu77-DFUw0ZsZo,49299
88
+ slidge/slixfix/__init__.py,sha256=LvaYZQYjr4l_45AYYpod1dB3MUaZye18vKF-4H8Bm20,4758
89
+ slidge/slixfix/delivery_receipt.py,sha256=JmogxsiXYEbTmCM4fvC5wkQs0jBsaJtKl4j_B_18riE,1415
90
+ slidge/slixfix/roster.py,sha256=DjjHQqCsKsPChUxV7S0Pm4IAgjfrwgm5tcTdJi3N_gY,1670
91
+ slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
92
+ slidge/slixfix/link_preview/link_preview.py,sha256=_SeTvcNe_mPljLRp3rIKwOw0sXxpVIzMRF-Bkr3iMHw,456
93
+ slidge/slixfix/link_preview/stanza.py,sha256=0RC9dkD_3mzASq4nMYjyyytk9FqhOvkrv1Qbqf7hWqw,2672
94
+ slidge/slixfix/xep_0077/__init__.py,sha256=0lY1YXdgAsfrfxI_Woxaf1etHCJXe35Xtntq_icF6nA,325
95
+ slidge/slixfix/xep_0077/register.py,sha256=VtWFkQiqtbxke8lncwL9z32qWvuG40J38LYmWTQKUoE,10500
96
+ slidge/slixfix/xep_0077/stanza.py,sha256=u1rolvn-vRTMUSIxfWyFIveWz7Z6BWW3QmLh5o-g8vM,2471
97
+ slidge/slixfix/xep_0100/__init__.py,sha256=AtEXDQOrEWodkN3fgKR0W3Ezsz_Zza6cgO5ZaZS-JOo,107
98
+ slidge/slixfix/xep_0100/gateway.py,sha256=iK_a6XQGh6bYqSMAZw4i-7Fb0nguvGDQkuvxIeYIxKg,4330
99
+ slidge/slixfix/xep_0100/stanza.py,sha256=7vCzej9VFQupsTpGGl0cJWuGNH4I6oVcckBu_-fE55c,232
100
+ slidge/slixfix/xep_0153/__init__.py,sha256=hsEldnLuzvcp0NqSscxPV7FJl-6GFP372vlDg1G3S3I,283
101
+ slidge/slixfix/xep_0153/vcard_avatar.py,sha256=Oq4bV1XomedjIb9eWCGB5xxW_IDoRRYNTfQ-GYhzLYI,466
102
+ slidge/slixfix/xep_0292/__init__.py,sha256=_MvS9wGra6ig3P_dPAVlCPDJkiOFvUWGjaRsHj1woUg,98
103
+ slidge/slixfix/xep_0292/vcard4.py,sha256=I6EXdTQ51nfF5qvKh7WMAluELbFsdtnYHrsV_8PrjK4,366
104
+ slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
105
+ slidge/util/archive_msg.py,sha256=hGNquu38ouSWSc-kz_oAYPXwjhUVZNSedIpwkrXHSd0,1826
106
+ slidge/util/conf.py,sha256=uNDY6GdQyTZEV47ab9fi27wwRb0ZMvbuZ7Hbzfe_NT8,7269
107
+ slidge/util/jid_escaping.py,sha256=QJ2Yj_j1gTmiO9g2r187iVCu7kia_O5ABhRiLAO2TG4,1073
108
+ slidge/util/lock.py,sha256=ZnUi3LGiz271-YeYKo9JzxovJCoSwlP9P65pNyHIO9o,1029
109
+ slidge/util/test.py,sha256=_E6er2BtQlpyzTUmp4u8C9KhBYzbLrmTwSVgxGObKHU,13988
110
+ slidge/util/types.py,sha256=xJ84ZvaUOU_VVJSjEMysgNSl05k0_O9YKbyW-JUrsMI,5635
111
+ slidge/util/util.py,sha256=4hihLCl4SsB5S14TT3bP8tDPP_Zg9rYbSfLdLB9-G_Q,9332
112
+ slidge-0.3.0a0.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
113
+ slidge-0.3.0a0.dist-info/METADATA,sha256=-zxaahvP72dUIyyg9A2DEygBURS_rRqAJp2WBLoYcMw,5056
114
+ slidge-0.3.0a0.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
115
+ slidge-0.3.0a0.dist-info/entry_points.txt,sha256=py3_x834fFJ2TEzPd18Wt2DnysdAfuVqJ5zzBrXbAZs,44
116
+ slidge-0.3.0a0.dist-info/top_level.txt,sha256=2LRjDYHaGZ5ieCMF8xy58JIiabRMzX-MGMbCZwfE17c,7
117
+ slidge-0.3.0a0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,112 +0,0 @@
1
- slidge/__init__.py,sha256=CJBHKrNCsJkFA5aPRhmMF3a-dfWtPG4zOcHeuWb0xxU,1757
2
- slidge/__main__.py,sha256=ydjUklOoavS4YlGfjRX_8BQN2DaSbaXPMi47RkOgcFI,37
3
- slidge/main.py,sha256=WMjWFeeODHZKzpXoQdOweZN1ygxM03dah3vFpOUdDUs,6537
4
- slidge/migration.py,sha256=4BJmPIRB56_WIhRTqBFIIBXuvnhhBjjOMl4CE7jY6oc,1541
5
- slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- slidge/command/__init__.py,sha256=UYf1mjCYbZ5G7PIgaFTWSQRAzEJkQ6dTH8Fu_e_XnO0,613
7
- slidge/command/adhoc.py,sha256=bYLXcYJjbqPE9nBhrEQevqYFh9AS7Ei3m1vTZBIggrc,10557
8
- slidge/command/admin.py,sha256=DYN9yADZo2hKV0t20K2qnFPJHU98eKsaZTOqi1zdMys,6165
9
- slidge/command/base.py,sha256=EDcEl5dJcooSmLarXI2fmBq6QtU7h-7MOM3DDsxXmTU,13447
10
- slidge/command/categories.py,sha256=vF0KGDV9sEn8TNkcMoDRw-u3gEyNHSXghOU2JRHQtKs,351
11
- slidge/command/chat_command.py,sha256=z-4qp03rK7kCh3_kEozDViwkDg_hVjHvRCiYYJxedBQ,11153
12
- slidge/command/register.py,sha256=BduDI31Kx8CbWWEdjybimTA5Wcfhn-Jkt8sSPsySCpo,6724
13
- slidge/command/user.py,sha256=fLh5d7XTSXicj6g0I80F5n6BFaA20PaYoXFkfDOR4zA,12303
14
- slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
15
- slidge/contact/contact.py,sha256=CLWuNLvWuODi1mlT6MFGx9s3y8yGPM8ZEsH-Ih6QEn8,22929
16
- slidge/contact/roster.py,sha256=19EYyX-usuevMob9AgnQmSt6APdE5MxMroHOYmVYt-w,10205
17
- slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
18
- slidge/core/config.py,sha256=OjJfpXJaDhMxRB-vYA0cqkSf0fwMt-HMThM8GS1htCg,7964
19
- slidge/core/gateway.py,sha256=Ghe2-bZ2XSeWC34uXO0D31yn04WbcwKH5pnDpPL4cVA,37606
20
- slidge/core/pubsub.py,sha256=IAu-MV_ncrUk3SiVVWyzmKtv9I9yXBNAOE78GaowyYE,12156
21
- slidge/core/session.py,sha256=Ie1a6bpUCC_HFvm98S-t03WG5JlOFG0SwbmGB2l9ZTc,28439
22
- slidge/core/dispatcher/__init__.py,sha256=1EXcjXietUKlxEqdrCWCV3xZ3q_DSsjHoqWrPMbtYao,84
23
- slidge/core/dispatcher/caps.py,sha256=vzCAXo_bhALuLEpJWtyJTzVfWx96g1AsWD8_wkoDl0Y,2028
24
- slidge/core/dispatcher/disco.py,sha256=j56VY9NIFzwPEWFKQQZ7YIqS9GdD-ZaF_K8a2L-JvRk,2006
25
- slidge/core/dispatcher/presence.py,sha256=X4i-JjQ423gXiveJH7sjdwW_67rJiSYS7jIvkm1XsJg,6421
26
- slidge/core/dispatcher/registration.py,sha256=Xmbw9NF3LUppCOa3XzreopdKDitZnwl_5HE-kds74n8,3155
27
- slidge/core/dispatcher/search.py,sha256=9cGj0wwvyYlP_Yk440Y12sgo4Y1p-JWUDSJP5Zxch0M,3296
28
- slidge/core/dispatcher/session_dispatcher.py,sha256=Gzq2IPThhzQ0_mCVKPCNHypIXgL-WnZalTyLMjUX9Hs,3148
29
- slidge/core/dispatcher/util.py,sha256=YtXyVxM3orE7aYWs-GbJumtLTI63OpaQY_t4FMTjoZo,5754
30
- slidge/core/dispatcher/vcard.py,sha256=Rmx-wCz6Lps0mXCO48HppNQlS3GOgMuzuw9hZYBdlVU,5130
31
- slidge/core/dispatcher/message/__init__.py,sha256=vpDGOc_U9XvkUU_ws9n9-5M2NPJ87XGTVpuIxM7Z99k,223
32
- slidge/core/dispatcher/message/chat_state.py,sha256=sCdEpzbgmvBmTovNOCv9uY6v0eJZcWVvDYAGlAV3FJ4,1735
33
- slidge/core/dispatcher/message/marker.py,sha256=f1ezaMoHupBFZY7aUMsWLAQG7G1J9b3ihxICCkpGtis,2411
34
- slidge/core/dispatcher/message/message.py,sha256=07h7OBbIh3OtSbi7DNwv5ANRTzWbwS9ICMHjS_6KpEM,15360
35
- slidge/core/dispatcher/muc/__init__.py,sha256=V8URHLJ_y7mk-7Id6FzRuczb1Uq_Z69fhxvzHuVLH1w,269
36
- slidge/core/dispatcher/muc/admin.py,sha256=mkosquhaI2iC_mFq7C08kjwjr4iVqAWp7kbOTmgUQtU,3321
37
- slidge/core/dispatcher/muc/mam.py,sha256=1ROVP4ZPEVEH-HR5qRV4YwHz-V15uu5gyhv1ZwwKhk8,2821
38
- slidge/core/dispatcher/muc/misc.py,sha256=bHBjMC-Pu3jR5hAPGMzXf-C05UbACIwg38YbJUxHIxk,4068
39
- slidge/core/dispatcher/muc/owner.py,sha256=1a6YV7b_mmi1jC6q1ko8weeL8imQA-s-hYGPLIHd10I,3308
40
- slidge/core/dispatcher/muc/ping.py,sha256=lb1VQPhiUPZ19KhbofRXMVCcY6wwQ2w-asnqtANaAwA,1660
41
- slidge/core/mixins/__init__.py,sha256=muReAzgvENgMvlfm0Fpe6BQFfm2EMjoDe9ZhGgo6Vig,627
42
- slidge/core/mixins/attachment.py,sha256=diEmZAkc_fv9UEHzDXVHtRbE9-vhK8yN9ZtI9gL0JAY,20212
43
- slidge/core/mixins/avatar.py,sha256=BVOeH5j5tsPJ0IHUcB5ozpyh02TBPKiZMd9MYizDokA,8136
44
- slidge/core/mixins/base.py,sha256=MOd-pas38_52VawQVlxWtBtmTKC6My9G0ZaCeQxOJbs,748
45
- slidge/core/mixins/db.py,sha256=5Qpegd7D8e5TLXLLINYcf_DuVdN-7wNmsfztUuFYPcU,442
46
- slidge/core/mixins/disco.py,sha256=jk3Z1B6zTuisHv8VKNRJodIo0ee5btYHh2ZrlflPj_Q,3670
47
- slidge/core/mixins/lock.py,sha256=Vf1rrkbyNbSprr38WGfZiMgTB7AdbqH8ppFHY8N2yXE,975
48
- slidge/core/mixins/message.py,sha256=X8Ka8j0nOnBcecYE_YuK8_J7MeO5-R0TIZw4X8c7R3Y,7846
49
- slidge/core/mixins/message_maker.py,sha256=_sa0YWyxnvI0DcPgoh6h1CxLbYF73Ezw1LRZN2CNRTM,6025
50
- slidge/core/mixins/message_text.py,sha256=pCY4tezEuwB2ZuUyUi72i4v9AJkxp_SWF1jrFsn94Ns,8096
51
- slidge/core/mixins/presence.py,sha256=yywo6KAw8C7GaZSMrSMuioNfhW08MrnobHt8XbHd0q8,7891
52
- slidge/core/mixins/recipient.py,sha256=b0uFnpym-hOFgYxGjXT1xQcZ4YRbDSBftPcNWLzSwEI,1336
53
- slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
54
- slidge/db/avatar.py,sha256=z5e72STv8PdN6zkNyKlLqF7NFxHwCa6IjwgFpzu5ghE,8033
55
- slidge/db/meta.py,sha256=v1Jf-npZ28QwdGpsLQWLBHEbEP3-jnPrygRg05tJ_Iw,1831
56
- slidge/db/models.py,sha256=MSVNW04x05qfxahvjCYRDFjfFP-XXp-lOHnK5IqFCXw,14046
57
- slidge/db/store.py,sha256=P9gprCsRsbJjdzvyG2UKV5IHL6R0tWu-Q7t6mivqJVI,47206
58
- slidge/db/alembic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
60
- slidge/db/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
61
- slidge/db/alembic/versions/04cf35e3cf85_add_participant_nickname_no_illegal.py,sha256=Dwz_azOXr7Tsw7Wnj0L8mknITIPXO9ewEsRn169EUNA,904
62
- slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py,sha256=mUL-0Io6ZPd_QbnKfwGYyjdMcM2uxQ0Wg72H23-2t_E,1033
63
- slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py,sha256=kzHuHGhzey5CY0p_OsKf5a-3zSk2649wqg2ToLiSD1I,2927
64
- slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py,sha256=CLB-kOP9Rc0FJIKDLef912L5sYkjpTIPC8fhrIdrC7k,1084
65
- slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py,sha256=f8TFS28CXjGhvIn41UYMoHYeODfqhKfo4O7gk-JwA1E,1134
66
- slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py,sha256=CMVP2wFz6s7t57eWdSaGtck8BXzfVPJhHE5AoWi34tI,1359
67
- slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py,sha256=jCdwCOnX9VDgnqIFFHGKaPA7w87Hm9nvR1rMY0LrA30,1394
68
- slidge/db/alembic/versions/45c24cc73c91_add_bob.py,sha256=UjMySZ5LaInyPt0KbAxx0rF4GQhZh8CwBeqHtNPdG1c,1249
69
- slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py,sha256=m3USa76h0O2Xut-NePXIOZfkXl0bx0d5FyjOYpd34Jo,1977
70
- slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py,sha256=g37po0ydp8ZmzJrE5oFV7GscnploxjCtPDpw28SqVGk,1429
71
- slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py,sha256=18tG8B03Kq8Qz_-mMd28Beed6jow8XNTtrz7gT5QY3g,1210
72
- slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py,sha256=ikoAlRV3_BJcDcFRANF-9HTB--0xpY0C5XdGuMuW9c0,4866
73
- slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=eFlfn-LiDph05yyCc8gmtJwVKzgrSHwyWJ6nuVfEpQA,1391
74
- slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py,sha256=VprqEVHipYuM-ea-CIM4_ubOD5zJ9inLTbhXc869n3A,2779
75
- slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py,sha256=2tiRxoC9PYOQn6XQrwK0JTEsb45Pzp2PsKoZSS4rcIA,7564
76
- slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py,sha256=r2sOgR5HcfueJyc3cWNDRmlZzdHOSX6nl2gef54wDbk,1559
77
- slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py,sha256=jjQmlRv6nqdm5q6LbwVpSUSkTBj1c76Hiq8e8q77q3g,933
78
- slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
79
- slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
80
- slidge/group/archive.py,sha256=AUzVtXlHiCreyY3jp1XMt0G7LDNm-qOU-4CEPQ89ics,5445
81
- slidge/group/bookmarks.py,sha256=uGw_XtF0nloZ7rhNLdKM0nNZZb5C6SBfTsLyZryxjxY,6592
82
- slidge/group/participant.py,sha256=YExXhm7FWK_G-_H6VJKFhJhA07l1KB7pZvD1xAYibj8,17730
83
- slidge/group/room.py,sha256=XDbK7kHTIB3A1JlvdeK85OBBxYTA9sVCu7tb7gcXa0Q,49515
84
- slidge/slixfix/__init__.py,sha256=su7mDAHgP3uU7bSxjK8dwW79k7KBLevJHdMQV8_33WA,4130
85
- slidge/slixfix/delivery_receipt.py,sha256=3bWdZH3-X3CZJXmnI_TpjkTUUK-EY4Ktm78lW0-40fc,1366
86
- slidge/slixfix/roster.py,sha256=KvDjh9q7pqaZf69H93okfib13cc95uVZUJ6rzpqmDaU,1704
87
- slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
88
- slidge/slixfix/link_preview/link_preview.py,sha256=9PgdfnoyVMHnXS0w5OFp0wz3ku96Ck-HtRXbVUlDi1U,448
89
- slidge/slixfix/link_preview/stanza.py,sha256=YAXoNw2MD0a3nzvldGKlvSemjUMbUEG23regzmj4Ntc,2664
90
- slidge/slixfix/xep_0077/__init__.py,sha256=0lY1YXdgAsfrfxI_Woxaf1etHCJXe35Xtntq_icF6nA,325
91
- slidge/slixfix/xep_0077/register.py,sha256=6nwTfHNL7Z9-1wUhpAF743TNbjQLCMP7Rflkdad8d60,10431
92
- slidge/slixfix/xep_0077/stanza.py,sha256=Lngly7F1ChCkNKn7yl1QmN838fO-KqkAhkazxzDsz80,2410
93
- slidge/slixfix/xep_0100/__init__.py,sha256=AtEXDQOrEWodkN3fgKR0W3Ezsz_Zza6cgO5ZaZS-JOo,107
94
- slidge/slixfix/xep_0100/gateway.py,sha256=aSR18605MWVqgucNd_zd1SdYlXry7k5uoqDzsvVqQyM,4363
95
- slidge/slixfix/xep_0100/stanza.py,sha256=7vCzej9VFQupsTpGGl0cJWuGNH4I6oVcckBu_-fE55c,232
96
- slidge/slixfix/xep_0153/__init__.py,sha256=hsEldnLuzvcp0NqSscxPV7FJl-6GFP372vlDg1G3S3I,283
97
- slidge/slixfix/xep_0153/vcard_avatar.py,sha256=py-qzj1jmmzsM4GCTKLRW7cAdAmSVjodp6q0r5B0RqQ,458
98
- slidge/slixfix/xep_0292/__init__.py,sha256=_MvS9wGra6ig3P_dPAVlCPDJkiOFvUWGjaRsHj1woUg,98
99
- slidge/slixfix/xep_0292/vcard4.py,sha256=jL-TOW3eG2QXLduSLNq03L8HoUNmvy8kTZI5ojvo6GE,358
100
- slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
101
- slidge/util/archive_msg.py,sha256=xXAR0BI5r3d6KKWjae9594izCOv6iI03z2WLuTecNw8,1724
102
- slidge/util/conf.py,sha256=yT_9Wino0xfhTvOjmmokt2PIQBTwBKVuVPWp7_7aoKU,6967
103
- slidge/util/jid_escaping.py,sha256=pWJTrB6-M923a_rEE-nxPmiDTOx9UCMa8UgE7JbLC0c,1066
104
- slidge/util/test.py,sha256=l1VHBsw5Uzk2t7wtkfb9kWvtehcYhw1t_d567JAJFKA,14135
105
- slidge/util/types.py,sha256=5j0G22hhsh3PNhtpJaz2DVt5XINJznZjz0hqewPZoFo,5407
106
- slidge/util/util.py,sha256=ZkQltO6JmfqZc9T-86XI6gAsZx9BLdF0CCurnxPRNRc,9329
107
- slidge-0.2.12.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
108
- slidge-0.2.12.dist-info/METADATA,sha256=NoQOAYNN-4kPAqDQyKp5rfiFvLtygf8UOXHgZ7kkH6k,5055
109
- slidge-0.2.12.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
110
- slidge-0.2.12.dist-info/entry_points.txt,sha256=py3_x834fFJ2TEzPd18Wt2DnysdAfuVqJ5zzBrXbAZs,44
111
- slidge-0.2.12.dist-info/top_level.txt,sha256=2LRjDYHaGZ5ieCMF8xy58JIiabRMzX-MGMbCZwfE17c,7
112
- slidge-0.2.12.dist-info/RECORD,,