slidge 0.2.0a6__py3-none-any.whl → 0.2.0a8__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
slidge/db/store.py CHANGED
@@ -13,7 +13,7 @@ from sqlalchemy.orm import Session, attributes
13
13
  from sqlalchemy.sql.functions import count
14
14
 
15
15
  from ..util.archive_msg import HistoryMessage
16
- from ..util.types import URL, CachedPresence
16
+ from ..util.types import URL, CachedPresence, ClientType
17
17
  from ..util.types import Hat as HatTuple
18
18
  from ..util.types import MamMetadata, MucAffiliation, MucRole
19
19
  from .meta import Base
@@ -65,9 +65,6 @@ class UpdatedMixin(EngineMixin):
65
65
  def __init__(self, *a, **kw):
66
66
  super().__init__(*a, **kw)
67
67
  with self.session() as session:
68
- session.execute(
69
- delete(self.model).where(~self.model.updated) # type:ignore
70
- )
71
68
  session.execute(update(self.model).values(updated=False)) # type:ignore
72
69
  session.commit()
73
70
 
@@ -133,18 +130,19 @@ class UserStore(EngineMixin):
133
130
  session.delete(self.get(jid))
134
131
  session.commit()
135
132
 
133
+ def set_avatar_hash(self, pk: int, h: str | None = None) -> None:
134
+ with self.session() as session:
135
+ session.execute(
136
+ update(GatewayUser).where(GatewayUser.id == pk).values(avatar_hash=h)
137
+ )
138
+ session.commit()
139
+
136
140
 
137
141
  class AvatarStore(EngineMixin):
138
142
  def get_by_url(self, url: URL | str) -> Optional[Avatar]:
139
143
  with self.session() as session:
140
144
  return session.execute(select(Avatar).where(Avatar.url == url)).scalar()
141
145
 
142
- def get_by_legacy_id(self, legacy_id: str) -> Optional[Avatar]:
143
- with self.session() as session:
144
- return session.execute(
145
- select(Avatar).where(Avatar.legacy_id == legacy_id)
146
- ).scalar()
147
-
148
146
  def get_by_pk(self, pk: int) -> Optional[Avatar]:
149
147
  with self.session() as session:
150
148
  return session.execute(select(Avatar).where(Avatar.id == pk)).scalar()
@@ -344,12 +342,14 @@ class ContactStore(UpdatedMixin):
344
342
  )
345
343
  session.commit()
346
344
 
347
- def set_avatar(self, contact_pk: int, avatar_pk: Optional[int]):
345
+ def set_avatar(
346
+ self, contact_pk: int, avatar_pk: Optional[int], avatar_legacy_id: Optional[str]
347
+ ):
348
348
  with self.session() as session:
349
349
  session.execute(
350
350
  update(Contact)
351
351
  .where(Contact.id == contact_pk)
352
- .values(avatar_id=avatar_pk)
352
+ .values(avatar_id=avatar_pk, avatar_legacy_id=avatar_legacy_id)
353
353
  )
354
354
  session.commit()
355
355
 
@@ -360,7 +360,7 @@ class ContactStore(UpdatedMixin):
360
360
  ).scalar()
361
361
  if contact is None or contact.avatar is None:
362
362
  return None
363
- return contact.avatar.legacy_id
363
+ return contact.avatar_legacy_id
364
364
 
365
365
  def update(self, contact: "LegacyContact", commit=True) -> int:
366
366
  with self.session() as session:
@@ -390,6 +390,7 @@ class ContactStore(UpdatedMixin):
390
390
  row.caps_ver = contact._caps_ver
391
391
  row.vcard = contact._vcard
392
392
  row.vcard_fetched = contact._vcard_fetched
393
+ row.client_type = contact.client_type
393
394
  session.add(row)
394
395
  if commit:
395
396
  session.commit()
@@ -450,6 +451,15 @@ class ContactStore(UpdatedMixin):
450
451
  session.execute(delete(Contact).where(Contact.id == contact_pk))
451
452
  session.commit()
452
453
 
454
+ def set_client_type(self, contact_pk: int, value: ClientType):
455
+ with self.session() as session:
456
+ session.execute(
457
+ update(Contact)
458
+ .where(Contact.id == contact_pk)
459
+ .values(client_type=value)
460
+ )
461
+ session.commit()
462
+
453
463
 
454
464
  class MAMStore(EngineMixin):
455
465
  def __init__(self, *a, **kw):
@@ -795,10 +805,14 @@ class RoomStore(UpdatedMixin):
795
805
  )
796
806
  session.commit()
797
807
 
798
- def set_avatar(self, room_pk: int, avatar_pk: int | None) -> None:
808
+ def set_avatar(
809
+ self, room_pk: int, avatar_pk: int | None, avatar_legacy_id: str | None
810
+ ) -> None:
799
811
  with self.session() as session:
800
812
  session.execute(
801
- update(Room).where(Room.id == room_pk).values(avatar_id=avatar_pk)
813
+ update(Room)
814
+ .where(Room.id == room_pk)
815
+ .values(avatar_id=avatar_pk, avatar_legacy_id=avatar_legacy_id)
802
816
  )
803
817
  session.commit()
804
818
 
@@ -807,7 +821,7 @@ class RoomStore(UpdatedMixin):
807
821
  room = session.execute(select(Room).where(Room.id == room_pk)).scalar()
808
822
  if room is None or room.avatar is None:
809
823
  return None
810
- return room.avatar.legacy_id
824
+ return room.avatar_legacy_id
811
825
 
812
826
  def get_by_jid(self, user_pk: int, jid: JID) -> Optional[Room]:
813
827
  if jid.resource:
slidge/group/room.py CHANGED
@@ -238,7 +238,9 @@ class LegacyMUC(
238
238
  for db_participant in self.xmpp.store.participants.get_all(
239
239
  self.pk, user_included=True
240
240
  ):
241
- participant = self.Participant.from_store(self.session, db_participant)
241
+ participant = self.Participant.from_store(
242
+ self.session, db_participant, muc=self
243
+ )
242
244
  yield participant
243
245
  return
244
246
 
@@ -250,7 +252,9 @@ class LegacyMUC(
250
252
  for db_participant in self.xmpp.store.participants.get_all(
251
253
  self.pk, user_included=True
252
254
  ):
253
- participant = self.Participant.from_store(self.session, db_participant)
255
+ participant = self.Participant.from_store(
256
+ self.session, db_participant, muc=self
257
+ )
254
258
  resources.add(participant.jid.resource)
255
259
  yield participant
256
260
  async for p in self.fill_participants():
@@ -570,7 +574,11 @@ class LegacyMUC(
570
574
  if self.pk is None:
571
575
  return
572
576
  assert self.pk is not None
573
- self.xmpp.store.rooms.set_avatar(self.pk, self._avatar_pk)
577
+ self.xmpp.store.rooms.set_avatar(
578
+ self.pk,
579
+ self._avatar_pk,
580
+ None if self.avatar_id is None else str(self.avatar_id),
581
+ )
574
582
  self.__send_configuration_change((104,))
575
583
  self._send_room_presence()
576
584
 
@@ -1216,7 +1224,12 @@ class LegacyMUC(
1216
1224
  muc._subject_setter = stored.subject_setter
1217
1225
  muc.archive = MessageArchive(muc.pk, session.xmpp.store.mam)
1218
1226
  muc._set_logger_name()
1219
- muc._set_avatar_from_store(stored)
1227
+ muc._AvatarMixin__avatar_unique_id = ( # type:ignore
1228
+ None
1229
+ if stored.avatar_legacy_id is None
1230
+ else session.xmpp.AVATAR_ID_TYPE(stored.avatar_legacy_id)
1231
+ )
1232
+ muc._avatar_pk = stored.avatar_id
1220
1233
  return muc
1221
1234
 
1222
1235
 
slidge/main.py CHANGED
@@ -15,6 +15,7 @@ https://git.sr.ht/~nicoco/slidge/tree/master/item/dev/confs/slidge-example.ini
15
15
 
16
16
  import asyncio
17
17
  import importlib
18
+ import inspect
18
19
  import logging
19
20
  import os
20
21
  import re
@@ -140,6 +141,11 @@ def main():
140
141
  if plugin_config_obj := getattr(
141
142
  legacy_module, "config", getattr(legacy_module, "Config", None)
142
143
  ):
144
+ # If the legacy module has default parameters that depend on dynamic defaults
145
+ # of the slidge main config, it needs to be refreshed at this point, because
146
+ # now the dynamic defaults are set.
147
+ if inspect.ismodule(plugin_config_obj):
148
+ importlib.reload(plugin_config_obj)
143
149
  logging.debug("Found a config object in plugin: %r", plugin_config_obj)
144
150
  ConfigModule.ENV_VAR_PREFIX += (
145
151
  f"_{config.LEGACY_MODULE.split('.')[-1].upper()}_"
@@ -152,12 +158,11 @@ def main():
152
158
 
153
159
  migrate()
154
160
 
155
- BaseGateway.store = SlidgeStore(get_engine(config.DB_URL))
161
+ store = SlidgeStore(get_engine(config.DB_URL))
162
+ BaseGateway.store = store
156
163
  gateway: BaseGateway = BaseGateway.get_unique_subclass()()
157
- avatar_cache.http = gateway.http
158
164
  avatar_cache.store = gateway.store.avatars
159
165
  avatar_cache.set_dir(config.HOME_DIR / "slidge_avatars_v3")
160
- avatar_cache.legacy_avatar_type = gateway.AVATAR_ID_TYPE
161
166
 
162
167
  PepAvatar.store = gateway.store
163
168
  PepNick.contact_store = gateway.store.contacts
slidge/migration.py CHANGED
@@ -5,8 +5,12 @@ from pathlib import Path
5
5
 
6
6
  from alembic import command
7
7
  from alembic.config import Config
8
+ from slixmpp import JID
8
9
 
9
10
  from .core import config
11
+ from .db.meta import get_engine
12
+ from .db.models import GatewayUser
13
+ from .db.store import SlidgeStore
10
14
 
11
15
 
12
16
  def remove_avatar_cache_v1():
@@ -26,9 +30,19 @@ def get_alembic_cfg() -> Config:
26
30
  return alembic_cfg
27
31
 
28
32
 
29
- def migrate():
33
+ def remove_resource_parts_from_users() -> None:
34
+ with SlidgeStore(get_engine(config.DB_URL)).session() as orm:
35
+ for user in orm.query(GatewayUser).all():
36
+ if user.jid.resource:
37
+ user.jid = JID(user.jid.bare)
38
+ orm.add(user)
39
+ orm.commit()
40
+
41
+
42
+ def migrate() -> None:
30
43
  remove_avatar_cache_v1()
31
44
  command.upgrade(get_alembic_cfg(), "head")
45
+ remove_resource_parts_from_users()
32
46
 
33
47
 
34
48
  def main():
slidge/util/test.py CHANGED
@@ -215,9 +215,16 @@ class SlidgeTest(SlixTestPlus):
215
215
  self.plugin, LegacyBookmarks, base_ok=True
216
216
  )
217
217
 
218
- engine = self.db_engine = create_engine("sqlite+pysqlite:///:memory:")
218
+ from sqlalchemy import log as sqlalchemy_log
219
+
220
+ sqlalchemy_log._add_default_handler = lambda x: None
221
+
222
+ engine = self.db_engine = create_engine(
223
+ "sqlite+pysqlite:///:memory:", echo=True
224
+ )
219
225
  Base.metadata.create_all(engine)
220
226
  BaseGateway.store = SlidgeStore(engine)
227
+ BaseGateway._test_mode = True
221
228
  try:
222
229
  self.xmpp = BaseGateway.get_self_or_unique_subclass()()
223
230
  except Exception:
slidge/util/types.py CHANGED
@@ -75,6 +75,10 @@ FieldType = Literal[
75
75
  ]
76
76
  MucAffiliation = Literal["owner", "admin", "member", "outcast", "none"]
77
77
  MucRole = Literal["visitor", "participant", "moderator", "none"]
78
+ # https://xmpp.org/registrar/disco-categories.html#client
79
+ ClientType = Literal[
80
+ "bot", "console", "game", "handheld", "pc", "phone", "sms", "tablet", "web"
81
+ ]
78
82
 
79
83
 
80
84
  @dataclass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: slidge
3
- Version: 0.2.0a6
3
+ Version: 0.2.0a8
4
4
  Summary: XMPP bridging framework
5
5
  Home-page: https://sr.ht/~nicoco/slidge/
6
6
  License: AGPL-3.0-or-later
@@ -10,16 +10,20 @@ Requires-Python: >=3.11,<4.0
10
10
  Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
11
11
  Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Topic :: Internet :: XMPP
14
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
13
15
  Requires-Dist: ConfigArgParse (>=1.5.3,<2.0.0)
14
16
  Requires-Dist: Pillow (>=10,<11)
15
17
  Requires-Dist: aiohttp[speedups] (>=3.8.3,<4.0.0)
16
18
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
17
- Requires-Dist: blurhash-python (>=1.2.1,<2.0.0)
18
19
  Requires-Dist: pickle-secure (>=0.99.9,<0.100.0)
19
20
  Requires-Dist: python-magic (>=0.4.27,<0.5.0)
20
21
  Requires-Dist: qrcode (>=7.4.1,<8.0.0)
21
22
  Requires-Dist: slixmpp (>=1.8.5,<2.0.0)
22
23
  Requires-Dist: sqlalchemy (>=2.0.29,<3.0.0)
24
+ Requires-Dist: thumbhash (>=0.1.2,<0.2.0)
25
+ Project-URL: Bug tracker, https://todo.sr.ht/~nicoco/slidge
26
+ Project-URL: Chat room, https://conference.nicoco.fr:5281/muc_log/slidge/
23
27
  Project-URL: Documentation, https://slidge.im/
24
28
  Project-URL: Repository, https://git.sr.ht/~nicoco/slidge/
25
29
  Description-Content-Type: text/markdown
@@ -1,21 +1,21 @@
1
1
  slidge/__init__.py,sha256=S0tUjqpZlzsr8G4Y_1Xt-KCYB07qaknTB0OwHU8k29U,1587
2
2
  slidge/__main__.py,sha256=Y12eh1TD_C5MB50KgEAuMffGnRFCvKYFKHD4UYSmHA0,72
3
- slidge/__version__.py,sha256=Z2v182VfCCHc2NnkauNdFLVe5MwGg5cg8dRIWwfmsHM,170
3
+ slidge/__version__.py,sha256=qap3pTXnZj5_Gq_Mgl7kcZK8XTWRiGg1h_7knTHmSlQ,170
4
4
  slidge/command/__init__.py,sha256=UYf1mjCYbZ5G7PIgaFTWSQRAzEJkQ6dTH8Fu_e_XnO0,613
5
5
  slidge/command/adhoc.py,sha256=5xLLoWyUJqCJB7kAwD2VKYTl_7MObCsgdz-qg_WkWGs,9417
6
6
  slidge/command/admin.py,sha256=x_kJ0TJhzf6d3OBIOXFjudZFO8bRYUG919td7OjMCug,6008
7
7
  slidge/command/base.py,sha256=xTlzxAbTWTpbFgQ0FxKjmp3ZImzempwJvGn9UiVUUTc,13044
8
8
  slidge/command/categories.py,sha256=BJCfaga2qoAxnHfgHD7I_RKZuBA5nnNOukkWHJwsUFE,99
9
- slidge/command/chat_command.py,sha256=kMnxrzmD7LhWgyO1w9Rgz1eA7PhfAJ2Rf34YWjoKrwQ,9975
9
+ slidge/command/chat_command.py,sha256=VBs6IuDka1IyyMzz0ZyE9zMImaEzUZLcnffxq_vwb4M,10565
10
10
  slidge/command/register.py,sha256=fzPcGUoJtainnDOiC13gWV-uYLuJcsmdKGJ-jXT1qIo,6697
11
- slidge/command/user.py,sha256=nJnoU4t1r9oPkFFHSHHwSY8WOQNLQn9mMcwZp-yZaKA,11422
11
+ slidge/command/user.py,sha256=uFheYOprhypkHEEl6qSTEM7T2N28xXaDi7v1he-AET8,11512
12
12
  slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
13
- slidge/contact/contact.py,sha256=yzemaELpe256B43gUXYc9CLjFhwSjr7-PwkY0uxVQfc,22169
14
- slidge/contact/roster.py,sha256=2UPuf2XkCdt9mdjhbATxxIH5dyIiJaxA0en8t1BgJuc,9989
13
+ slidge/contact/contact.py,sha256=h1_outxzNidJrN4iwcaekyymhuLWruY92JCd1Yfz4-4,23088
14
+ slidge/contact/roster.py,sha256=YF5NiParDKYNqW52fu1xSVW1skR-guy7YzIQ5kDYoDk,9874
15
15
  slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
16
16
  slidge/core/config.py,sha256=leNcN_TI0Ka1hhzOHx7cBW3fNj5xZwsiv9l8AfRY_vU,7630
17
17
  slidge/core/gateway/__init__.py,sha256=rZckY2gAE-mon77_DSsAW1XtWqhBAETE2d4FqZ8pJXk,58
18
- slidge/core/gateway/base.py,sha256=EWqDLhkCcVUJf0Cy-PZPYxdIEhXckHv1-XG7GlHYcdQ,38491
18
+ slidge/core/gateway/base.py,sha256=Dxy39bAgOvJ-vN1RA9PU821YYuvkp_V06y_-vUDW7bU,38752
19
19
  slidge/core/gateway/caps.py,sha256=jemB4tB_2MTAxqQw5Bs4b7qNQ8gLPuAve0aoH6TzLEs,1937
20
20
  slidge/core/gateway/delivery_receipt.py,sha256=AT_9gvZrtWpSRsDJcYjE8CmF7TW-YBbUPdqNW5zWAdo,1352
21
21
  slidge/core/gateway/disco.py,sha256=uazgDXSDb5KrardjPCvElItARcxkeBRohtx82A2BlCQ,2203
@@ -25,11 +25,11 @@ slidge/core/gateway/ping.py,sha256=_zzPkjqvxjTxLNP1jbj0WVLMaybxbYqrKDRM5jHSDjs,1
25
25
  slidge/core/gateway/presence.py,sha256=Ls8IY4uNQaW8F3F1CpRhfyFIVbd_py_VkZyJKMMei8s,2732
26
26
  slidge/core/gateway/registration.py,sha256=JXwIQ-QqZCPXEmCU2G8FvIYDGvD8L8CqGb_Qkbycgt0,2303
27
27
  slidge/core/gateway/search.py,sha256=08ds6gvzX3EnTH-AU8X8J8JKEKYaSrRGTFwwClTT-Rc,3495
28
- slidge/core/gateway/session_dispatcher.py,sha256=F8YGUCB7hA1PNsGgQDaUYHmLnf4e8NWptIh-9ra_43c,32930
28
+ slidge/core/gateway/session_dispatcher.py,sha256=FBCbMNNa3SQCd2n_NEdD5q7cjdEgUHGuI_DIWh5cTUY,33202
29
29
  slidge/core/gateway/vcard_temp.py,sha256=cnzHZO6qF8OUWSvBieEdNAV_Ndv1ixZOzBCBXy2Vopw,4637
30
30
  slidge/core/mixins/__init__.py,sha256=muReAzgvENgMvlfm0Fpe6BQFfm2EMjoDe9ZhGgo6Vig,627
31
- slidge/core/mixins/attachment.py,sha256=YXuObz68eem2AND1q-RBeZ-X9Zi_IlUgx0DRMiwM3Xw,18706
32
- slidge/core/mixins/avatar.py,sha256=ke3cwm6Iiz1AM0_SiARTUTU2nGYskPZlxtFrXKQT5fI,7812
31
+ slidge/core/mixins/attachment.py,sha256=4p8cPPz1rqqTqOhkuSS-UW2anJMULxuvnmIPsUUxcds,18792
32
+ slidge/core/mixins/avatar.py,sha256=kGIIZzLSNuxF9bIvt5Bv03_uT_pU5QV1kS7cRu6-GUA,7874
33
33
  slidge/core/mixins/base.py,sha256=9hjf2Pw5r0poSi1Abv-_znk83Kngsu9EXTf05gpFDdI,768
34
34
  slidge/core/mixins/db.py,sha256=5Qpegd7D8e5TLXLLINYcf_DuVdN-7wNmsfztUuFYPcU,442
35
35
  slidge/core/mixins/disco.py,sha256=jk3Z1B6zTuisHv8VKNRJodIo0ee5btYHh2ZrlflPj_Q,3670
@@ -38,8 +38,8 @@ slidge/core/mixins/message.py,sha256=jJz_peNQmDf0uVQcI7TWG7oUaSGjUL8eiulNicGgWhI
38
38
  slidge/core/mixins/message_maker.py,sha256=TcCutHi0sIwL6beJNkN7XyR0aDIbA0xZyxd2Gc9ulG4,6022
39
39
  slidge/core/mixins/presence.py,sha256=yywo6KAw8C7GaZSMrSMuioNfhW08MrnobHt8XbHd0q8,7891
40
40
  slidge/core/mixins/recipient.py,sha256=U-YppozUO8pA94jmD3-qmhkykTebPNaOVWc3JDPC9w8,1302
41
- slidge/core/pubsub.py,sha256=m70ahpZLKUWdBb4fG4e90UpPhdcGGZJD31oDU_O12Rg,12434
42
- slidge/core/session.py,sha256=IUZur7huNj066uy-Nh-I-R0etYmPJccgXFIimcSQ148,27161
41
+ slidge/core/pubsub.py,sha256=ITOhgUKdYh6oJBpmZ8nevDQlYT4WJMC-k7Z76YchXqY,11906
42
+ slidge/core/session.py,sha256=iYRdG_CZYiH-a4A69vqKLf-vnSF_N-XnxEF1veBMCWk,27182
43
43
  slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
44
44
  slidge/db/alembic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
@@ -49,26 +49,28 @@ slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py,sha256
49
49
  slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py,sha256=CLB-kOP9Rc0FJIKDLef912L5sYkjpTIPC8fhrIdrC7k,1084
50
50
  slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py,sha256=f8TFS28CXjGhvIn41UYMoHYeODfqhKfo4O7gk-JwA1E,1134
51
51
  slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py,sha256=CMVP2wFz6s7t57eWdSaGtck8BXzfVPJhHE5AoWi34tI,1359
52
- slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py,sha256=wk958rfBuop9mw6wI_dDQUeTdiCCV6GJb-WcP4h1xVs,1340
52
+ slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py,sha256=O5BY1vpbtuYT5j6i3EMuuJAf6loIYT1kco8c-c6TF5g,1391
53
+ slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py,sha256=cObfqUzqdNezIeJdHe7YKFwRwtelXk8y1PwZ75chXDc,1629
53
54
  slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py,sha256=g37po0ydp8ZmzJrE5oFV7GscnploxjCtPDpw28SqVGk,1429
54
55
  slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py,sha256=18tG8B03Kq8Qz_-mMd28Beed6jow8XNTtrz7gT5QY3g,1210
55
56
  slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py,sha256=olXaOEEsUSasqaaKdlP1cBODsMhmV1i90qbpDM2vTm4,4696
56
- slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=XOf6Oiot2wLsngvUwrM30LbuVNm549FWXnKMJijBjVo,2578
57
+ slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=XFHaHjPMoxKxKRjNBnYHBzMtS6K38ENcsGzgzlyp60g,2649
58
+ slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py,sha256=tLnVrbtWzxSPXACIhWPeLxxCIFdnVxK-izoNZxbvA3A,2701
57
59
  slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py,sha256=2tiRxoC9PYOQn6XQrwK0JTEsb45Pzp2PsKoZSS4rcIA,7564
58
60
  slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py,sha256=N6HYpFBhMckAFLZFW8PY8Us1qzXlauEQiDwEYwd9_K8,1422
59
61
  slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py,sha256=jjQmlRv6nqdm5q6LbwVpSUSkTBj1c76Hiq8e8q77q3g,933
60
62
  slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
61
- slidge/db/avatar.py,sha256=C3BrEkEJbBEEY42DjXMacl8wOXgooUQ9KgIOUPs9620,7881
63
+ slidge/db/avatar.py,sha256=FfRt2Vu11ZKD9F3x1_drawvUd-TDE3mp7SE3BZ9hOOg,6467
62
64
  slidge/db/meta.py,sha256=v1Jf-npZ28QwdGpsLQWLBHEbEP3-jnPrygRg05tJ_Iw,1831
63
- slidge/db/models.py,sha256=UoQnDYGuwp8VPYpqMKS9uFez_Vc8IMHtLADGlDCXC1Q,13179
64
- slidge/db/store.py,sha256=j-8MvzC_HVzjYXEimAq8ViPSZfrT90QLs1U3FUoYPJs,41597
65
+ slidge/db/models.py,sha256=yO4hM0VE1cQdDqWiZU1YW5ZjzwSnHUTavkGbkAMEB9A,13297
66
+ slidge/db/store.py,sha256=jBkjTVXIg_N558rEfaDWzQ7mnIYMp2ziTk0o9KRVioo,42071
65
67
  slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
66
68
  slidge/group/archive.py,sha256=xGPkdSk8-BT6t6lNVo1FEwiFVAttoxCma8Tsyk5r8Kg,5279
67
69
  slidge/group/bookmarks.py,sha256=_LDf7A7aWkwPH88v7c-mOp8VJs3gSFM1-uCqSb4ThO8,5825
68
70
  slidge/group/participant.py,sha256=VNMtqr98QVuYgiTsJ9BaaIG1noz-xe3ewyKhLeDRhBk,17033
69
- slidge/group/room.py,sha256=KqVTEwpoVvwoDqAe-eIL7-ASNebuThRL4EAZsFtdCcY,45384
70
- slidge/main.py,sha256=TbkG5m1SgNmfaZ7TOD5VGTh4Q52XltLJayWnan8M9cw,5986
71
- slidge/migration.py,sha256=qUrux9dYCtOfFjPIlvGfWjoyqhkdxzaOByJRqTmCoUI,1072
71
+ slidge/group/room.py,sha256=v5mCV7ZrCdgXtDu_K7oDTdtjNYJV-y9wPmlg_RN_4s4,45789
72
+ slidge/main.py,sha256=8oND7xpR3eLw7b62fT61UhYlmNp_9gv3tNz2N3xR7-c,6232
73
+ slidge/migration.py,sha256=4BJmPIRB56_WIhRTqBFIIBXuvnhhBjjOMl4CE7jY6oc,1541
72
74
  slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
75
  slidge/slixfix/__init__.py,sha256=7GevigEt68hwgwHqXcsFogN5jRXRHPeqR6kwODCH4hc,3055
74
76
  slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
@@ -108,11 +110,11 @@ slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
108
110
  slidge/util/archive_msg.py,sha256=xXAR0BI5r3d6KKWjae9594izCOv6iI03z2WLuTecNw8,1724
109
111
  slidge/util/conf.py,sha256=1j2OnOsCBar1tOObErhXR5RC3Vl3faliOZ1U8J3My58,6613
110
112
  slidge/util/db.py,sha256=4LxZj8oBYgiSnyBUnF_ALjr0TblkfNQq_p28sCfkHMY,242
111
- slidge/util/test.py,sha256=84GCSsWDaf7ukrMUaej2tuedY2Uxje5JljUt3x-V4mM,13645
112
- slidge/util/types.py,sha256=Gif-Z9NVd_eTei1uM3_KOsdok3B1yMQwdOkOzf9vheE,5224
113
+ slidge/util/test.py,sha256=S8Kp5uJlWYPvnw8HMHUPlbrvsqwdBLs9MI99svMfjLg,13832
114
+ slidge/util/types.py,sha256=o_5rbwfL_3e73JPT1t9o3kyDpJscFHzn4_bt8i3LoSk,5386
113
115
  slidge/util/util.py,sha256=8JeE0QObNGQr_Tw4OFPwQSz_EB_zh_0t9IJmNNhW0ic,9114
114
- slidge-0.2.0a6.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
115
- slidge-0.2.0a6.dist-info/METADATA,sha256=Y3urIslvpvtG2sPaOfhxpOoRPfxfnRIrxqzuZGT5RrM,4723
116
- slidge-0.2.0a6.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
117
- slidge-0.2.0a6.dist-info/entry_points.txt,sha256=SNl72KSocF5plsu_67xyH6wVWfGTXQbzkQgXbLtzDrQ,47
118
- slidge-0.2.0a6.dist-info/RECORD,,
116
+ slidge-0.2.0a8.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
117
+ slidge-0.2.0a8.dist-info/METADATA,sha256=RQ4klx0IU7DLwRKiBTAfX-LWye5v9RzSBK8CpAgJgJY,4962
118
+ slidge-0.2.0a8.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
119
+ slidge-0.2.0a8.dist-info/entry_points.txt,sha256=SNl72KSocF5plsu_67xyH6wVWfGTXQbzkQgXbLtzDrQ,47
120
+ slidge-0.2.0a8.dist-info/RECORD,,