slidge 0.1.3__py3-none-any.whl → 0.2.0a1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. slidge/__init__.py +3 -5
  2. slidge/__main__.py +2 -196
  3. slidge/__version__.py +5 -0
  4. slidge/command/adhoc.py +8 -1
  5. slidge/command/admin.py +6 -7
  6. slidge/command/base.py +1 -2
  7. slidge/command/register.py +32 -16
  8. slidge/command/user.py +85 -6
  9. slidge/contact/contact.py +165 -49
  10. slidge/contact/roster.py +122 -47
  11. slidge/core/config.py +14 -11
  12. slidge/core/gateway/base.py +148 -36
  13. slidge/core/gateway/caps.py +7 -5
  14. slidge/core/gateway/disco.py +2 -4
  15. slidge/core/gateway/mam.py +1 -4
  16. slidge/core/gateway/muc_admin.py +1 -1
  17. slidge/core/gateway/ping.py +2 -3
  18. slidge/core/gateway/presence.py +1 -1
  19. slidge/core/gateway/registration.py +32 -21
  20. slidge/core/gateway/search.py +3 -5
  21. slidge/core/gateway/session_dispatcher.py +120 -57
  22. slidge/core/gateway/vcard_temp.py +7 -5
  23. slidge/core/mixins/__init__.py +11 -1
  24. slidge/core/mixins/attachment.py +32 -14
  25. slidge/core/mixins/avatar.py +90 -25
  26. slidge/core/mixins/base.py +8 -2
  27. slidge/core/mixins/db.py +18 -0
  28. slidge/core/mixins/disco.py +0 -10
  29. slidge/core/mixins/message.py +18 -8
  30. slidge/core/mixins/message_maker.py +17 -9
  31. slidge/core/mixins/presence.py +17 -4
  32. slidge/core/pubsub.py +54 -220
  33. slidge/core/session.py +69 -34
  34. slidge/db/__init__.py +4 -0
  35. slidge/db/alembic/env.py +64 -0
  36. slidge/db/alembic/script.py.mako +26 -0
  37. slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +36 -0
  38. slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +36 -0
  39. slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +37 -0
  40. slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +41 -0
  41. slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +48 -0
  42. slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +133 -0
  43. slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +85 -0
  44. slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +214 -0
  45. slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +48 -0
  46. slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +34 -0
  47. slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +26 -0
  48. slidge/db/avatar.py +235 -0
  49. slidge/db/meta.py +65 -0
  50. slidge/db/models.py +375 -0
  51. slidge/db/store.py +1078 -0
  52. slidge/group/archive.py +58 -14
  53. slidge/group/bookmarks.py +72 -57
  54. slidge/group/participant.py +87 -28
  55. slidge/group/room.py +369 -211
  56. slidge/main.py +201 -0
  57. slidge/migration.py +30 -0
  58. slidge/slixfix/__init__.py +35 -2
  59. slidge/slixfix/roster.py +11 -4
  60. slidge/slixfix/xep_0292/vcard4.py +3 -0
  61. slidge/util/archive_msg.py +2 -1
  62. slidge/util/db.py +1 -47
  63. slidge/util/test.py +71 -4
  64. slidge/util/types.py +29 -4
  65. slidge/util/util.py +22 -0
  66. {slidge-0.1.3.dist-info → slidge-0.2.0a1.dist-info}/METADATA +4 -4
  67. slidge-0.2.0a1.dist-info/RECORD +114 -0
  68. slidge/core/cache.py +0 -183
  69. slidge/util/schema.sql +0 -126
  70. slidge/util/sql.py +0 -508
  71. slidge-0.1.3.dist-info/RECORD +0 -96
  72. {slidge-0.1.3.dist-info → slidge-0.2.0a1.dist-info}/LICENSE +0 -0
  73. {slidge-0.1.3.dist-info → slidge-0.2.0a1.dist-info}/WHEEL +0 -0
  74. {slidge-0.1.3.dist-info → slidge-0.2.0a1.dist-info}/entry_points.txt +0 -0
@@ -1,25 +1,25 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: slidge
3
- Version: 0.1.3
3
+ Version: 0.2.0a1
4
4
  Summary: XMPP bridging framework
5
5
  Home-page: https://sr.ht/~nicoco/slidge/
6
6
  License: AGPL-3.0-or-later
7
7
  Author: Nicolas Cedilnik
8
8
  Author-email: nicoco@nicoco.fr
9
- Requires-Python: >=3.9,<4.0
9
+ 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
- Classifier: Programming Language :: Python :: 3.9
13
- Classifier: Programming Language :: Python :: 3.10
14
12
  Classifier: Programming Language :: Python :: 3.11
15
13
  Requires-Dist: ConfigArgParse (>=1.5.3,<2.0.0)
16
14
  Requires-Dist: Pillow (>=10,<11)
17
15
  Requires-Dist: aiohttp[speedups] (>=3.8.3,<4.0.0)
16
+ Requires-Dist: alembic (>=1.13.1,<2.0.0)
18
17
  Requires-Dist: blurhash-python (>=1.2.1,<2.0.0)
19
18
  Requires-Dist: pickle-secure (>=0.99.9,<0.100.0)
20
19
  Requires-Dist: python-magic (>=0.4.27,<0.5.0)
21
20
  Requires-Dist: qrcode (>=7.4.1,<8.0.0)
22
21
  Requires-Dist: slixmpp (>=1.8.5,<2.0.0)
22
+ Requires-Dist: sqlalchemy (>=2.0.29,<3.0.0)
23
23
  Project-URL: Documentation, https://slidge.im/
24
24
  Project-URL: Repository, https://git.sr.ht/~nicoco/slidge/
25
25
  Description-Content-Type: text/markdown
@@ -0,0 +1,114 @@
1
+ slidge/__init__.py,sha256=S0tUjqpZlzsr8G4Y_1Xt-KCYB07qaknTB0OwHU8k29U,1587
2
+ slidge/__main__.py,sha256=Y12eh1TD_C5MB50KgEAuMffGnRFCvKYFKHD4UYSmHA0,72
3
+ slidge/__version__.py,sha256=I-T5nrkdyqNFMxbn8y7FgSsLGaj0eM2dLL9f5LDsI2Q,170
4
+ slidge/command/__init__.py,sha256=UYf1mjCYbZ5G7PIgaFTWSQRAzEJkQ6dTH8Fu_e_XnO0,613
5
+ slidge/command/adhoc.py,sha256=5xLLoWyUJqCJB7kAwD2VKYTl_7MObCsgdz-qg_WkWGs,9417
6
+ slidge/command/admin.py,sha256=JAN8s-b2KckgUozAQNBGOzkrEaQv-LtwezYgOsAR6Ng,5768
7
+ slidge/command/base.py,sha256=xTlzxAbTWTpbFgQ0FxKjmp3ZImzempwJvGn9UiVUUTc,13044
8
+ slidge/command/categories.py,sha256=BJCfaga2qoAxnHfgHD7I_RKZuBA5nnNOukkWHJwsUFE,99
9
+ slidge/command/chat_command.py,sha256=kMnxrzmD7LhWgyO1w9Rgz1eA7PhfAJ2Rf34YWjoKrwQ,9975
10
+ slidge/command/register.py,sha256=fzPcGUoJtainnDOiC13gWV-uYLuJcsmdKGJ-jXT1qIo,6697
11
+ slidge/command/user.py,sha256=nJnoU4t1r9oPkFFHSHHwSY8WOQNLQn9mMcwZp-yZaKA,11422
12
+ slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
13
+ slidge/contact/contact.py,sha256=Ag4Gq81jlEsz8MMXyU_VcLGJY7_IUgY76jOMlmAQpJc,20237
14
+ slidge/contact/roster.py,sha256=2EGV7q0km6JEahn2brr-td0KJILtXQGFWiSPuORA86I,10756
15
+ slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
16
+ slidge/core/config.py,sha256=leNcN_TI0Ka1hhzOHx7cBW3fNj5xZwsiv9l8AfRY_vU,7630
17
+ slidge/core/gateway/__init__.py,sha256=rZckY2gAE-mon77_DSsAW1XtWqhBAETE2d4FqZ8pJXk,58
18
+ slidge/core/gateway/base.py,sha256=V-9HMokUfeTpIO_dqU1ONDMXnNMBCEJJbmob-oYjD8s,38600
19
+ slidge/core/gateway/caps.py,sha256=jemB4tB_2MTAxqQw5Bs4b7qNQ8gLPuAve0aoH6TzLEs,1937
20
+ slidge/core/gateway/delivery_receipt.py,sha256=AT_9gvZrtWpSRsDJcYjE8CmF7TW-YBbUPdqNW5zWAdo,1352
21
+ slidge/core/gateway/disco.py,sha256=uazgDXSDb5KrardjPCvElItARcxkeBRohtx82A2BlCQ,2203
22
+ slidge/core/gateway/mam.py,sha256=ZUZXX7YcpK1WHq8RlgYrXo2zrLm5pOM1sVzON61mXYQ,2418
23
+ slidge/core/gateway/muc_admin.py,sha256=PslX1gZK_PhY2VaeAPP1nEzThMaBBGPRgs-wiJ35zJQ,1033
24
+ slidge/core/gateway/ping.py,sha256=_zzPkjqvxjTxLNP1jbj0WVLMaybxbYqrKDRM5jHSDjs,1729
25
+ slidge/core/gateway/presence.py,sha256=Ls8IY4uNQaW8F3F1CpRhfyFIVbd_py_VkZyJKMMei8s,2732
26
+ slidge/core/gateway/registration.py,sha256=JXwIQ-QqZCPXEmCU2G8FvIYDGvD8L8CqGb_Qkbycgt0,2303
27
+ slidge/core/gateway/search.py,sha256=08ds6gvzX3EnTH-AU8X8J8JKEKYaSrRGTFwwClTT-Rc,3495
28
+ slidge/core/gateway/session_dispatcher.py,sha256=mV3ds7zulD1_ivaV-QfilRKk2aN8T0XgcicCYOiYfx0,32306
29
+ slidge/core/gateway/vcard_temp.py,sha256=5Trs0O240mpOoFeRzprAYX86W7Qaq9hFhi06437w0Yg,4694
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
33
+ slidge/core/mixins/base.py,sha256=9hjf2Pw5r0poSi1Abv-_znk83Kngsu9EXTf05gpFDdI,768
34
+ slidge/core/mixins/db.py,sha256=5Qpegd7D8e5TLXLLINYcf_DuVdN-7wNmsfztUuFYPcU,442
35
+ slidge/core/mixins/disco.py,sha256=jk3Z1B6zTuisHv8VKNRJodIo0ee5btYHh2ZrlflPj_Q,3670
36
+ slidge/core/mixins/lock.py,sha256=mVzwVVEoq1hrAMgGLh4K84BTLt7JTJ33B8HSGSorTdY,913
37
+ slidge/core/mixins/message.py,sha256=jJz_peNQmDf0uVQcI7TWG7oUaSGjUL8eiulNicGgWhI,15071
38
+ slidge/core/mixins/message_maker.py,sha256=TcCutHi0sIwL6beJNkN7XyR0aDIbA0xZyxd2Gc9ulG4,6022
39
+ slidge/core/mixins/presence.py,sha256=yywo6KAw8C7GaZSMrSMuioNfhW08MrnobHt8XbHd0q8,7891
40
+ slidge/core/mixins/recipient.py,sha256=U-YppozUO8pA94jmD3-qmhkykTebPNaOVWc3JDPC9w8,1302
41
+ slidge/core/pubsub.py,sha256=QUwh1o5n9SVn1QBuflgfP4GR5yx6AJqRByDD3AGVCTY,12298
42
+ slidge/core/session.py,sha256=IUZur7huNj066uy-Nh-I-R0etYmPJccgXFIimcSQ148,27161
43
+ slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
44
+ slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
45
+ slidge/db/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
46
+ slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py,sha256=mUL-0Io6ZPd_QbnKfwGYyjdMcM2uxQ0Wg72H23-2t_E,1033
47
+ slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py,sha256=CLB-kOP9Rc0FJIKDLef912L5sYkjpTIPC8fhrIdrC7k,1084
48
+ slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py,sha256=f8TFS28CXjGhvIn41UYMoHYeODfqhKfo4O7gk-JwA1E,1134
49
+ slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py,sha256=CMVP2wFz6s7t57eWdSaGtck8BXzfVPJhHE5AoWi34tI,1359
50
+ slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py,sha256=g37po0ydp8ZmzJrE5oFV7GscnploxjCtPDpw28SqVGk,1429
51
+ slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py,sha256=olXaOEEsUSasqaaKdlP1cBODsMhmV1i90qbpDM2vTm4,4696
52
+ slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=qBEw4KSf8NLn9piRxCn7VQbNS4XJQAfHIKmc2Rj1H5U,2320
53
+ slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py,sha256=2tiRxoC9PYOQn6XQrwK0JTEsb45Pzp2PsKoZSS4rcIA,7564
54
+ slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py,sha256=N6HYpFBhMckAFLZFW8PY8Us1qzXlauEQiDwEYwd9_K8,1422
55
+ slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py,sha256=jjQmlRv6nqdm5q6LbwVpSUSkTBj1c76Hiq8e8q77q3g,933
56
+ slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
57
+ slidge/db/avatar.py,sha256=khMqkhUSLOOAulhWHUtkIlE8asdqUuaY8cieij97Hsw,7640
58
+ slidge/db/meta.py,sha256=-MxJ66fI2hUs86geCTC4PSFDlRfJTvqJYvhdXydO6w8,1538
59
+ slidge/db/models.py,sha256=r6AyhSJ18kOiEgiArZLhBxMD6a07xbZVOIQ0RsQ8Tmo,12834
60
+ slidge/db/store.py,sha256=4QplqGaU8IPPf9MZU_P2LLZkbQB60GXDkxQrkkemfbc,40329
61
+ slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
62
+ slidge/group/archive.py,sha256=xGPkdSk8-BT6t6lNVo1FEwiFVAttoxCma8Tsyk5r8Kg,5279
63
+ slidge/group/bookmarks.py,sha256=NGEOTSrIIzSYVxUp2QlbW4cRNavPCaFLo21WrOjxBPc,6647
64
+ slidge/group/participant.py,sha256=FhI8RjVMp5fpYMLxG38wWPI3GEke8rTs-tmLklCIpzA,16764
65
+ slidge/group/room.py,sha256=Y5-0u7erskQF9L68htc4Yh6MnrzQwpT5zvIOrOah6fA,45032
66
+ slidge/main.py,sha256=gIlF9MEtychpdeUcOE1PWe_QPlOmsQAYvpcOfwRNoQo,6119
67
+ slidge/migration.py,sha256=qUrux9dYCtOfFjPIlvGfWjoyqhkdxzaOByJRqTmCoUI,1072
68
+ slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ slidge/slixfix/__init__.py,sha256=7GevigEt68hwgwHqXcsFogN5jRXRHPeqR6kwODCH4hc,3055
70
+ slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
71
+ slidge/slixfix/link_preview/link_preview.py,sha256=9PgdfnoyVMHnXS0w5OFp0wz3ku96Ck-HtRXbVUlDi1U,448
72
+ slidge/slixfix/link_preview/stanza.py,sha256=YAXoNw2MD0a3nzvldGKlvSemjUMbUEG23regzmj4Ntc,2664
73
+ slidge/slixfix/roster.py,sha256=zdcO8vsk8gqkqye-vqIynfj-pmozbjD-tRtoqwpKW7I,1680
74
+ slidge/slixfix/xep_0077/__init__.py,sha256=0lY1YXdgAsfrfxI_Woxaf1etHCJXe35Xtntq_icF6nA,325
75
+ slidge/slixfix/xep_0077/register.py,sha256=6nwTfHNL7Z9-1wUhpAF743TNbjQLCMP7Rflkdad8d60,10431
76
+ slidge/slixfix/xep_0077/stanza.py,sha256=Lngly7F1ChCkNKn7yl1QmN838fO-KqkAhkazxzDsz80,2410
77
+ slidge/slixfix/xep_0100/__init__.py,sha256=AtEXDQOrEWodkN3fgKR0W3Ezsz_Zza6cgO5ZaZS-JOo,107
78
+ slidge/slixfix/xep_0100/gateway.py,sha256=Fhxs2sUPnVRPa1o7RXCncnbBO2gjeZx3pbItug-8OiA,4501
79
+ slidge/slixfix/xep_0100/stanza.py,sha256=7vCzej9VFQupsTpGGl0cJWuGNH4I6oVcckBu_-fE55c,232
80
+ slidge/slixfix/xep_0153/__init__.py,sha256=wZCTLaVsXQn_wYEHA8YXdGCsspvj2rvq92iyi16W0xA,319
81
+ slidge/slixfix/xep_0153/stanza.py,sha256=qhVfxlJEKuYDuWnd_I_VT4TtJbpX2opN6kG8oxYrc3o,735
82
+ slidge/slixfix/xep_0153/vcard_avatar.py,sha256=mzaReW5c1OaeL39CeGvuzIkh3j-Z5mc2joLqn5cNc5Q,658
83
+ slidge/slixfix/xep_0264/__init__.py,sha256=c6g_y-PAwQJZ4ZLWcwXc6Q5xRPeXTvvvJH4ZKQpkj3o,109
84
+ slidge/slixfix/xep_0264/stanza.py,sha256=YvkI9rsGztkc9yOZBjf5PNKReW8aeGdF6MnrsfDckYs,864
85
+ slidge/slixfix/xep_0264/thumbnail.py,sha256=6ukgPCWJTFUnew4USB6hNtEk_ZcpWcFAvHr2r0T5znw,456
86
+ slidge/slixfix/xep_0292/__init__.py,sha256=_MvS9wGra6ig3P_dPAVlCPDJkiOFvUWGjaRsHj1woUg,98
87
+ slidge/slixfix/xep_0292/vcard4.py,sha256=uuZp_6DR1_-QuRNV-IfYwu9eX-wBT1jxh5p-PO92Nm8,3211
88
+ slidge/slixfix/xep_0313/__init__.py,sha256=rpvXxN4Fi-ey4Ww39OEAXoiaeWs3XMqvzR64hA6j_x4,368
89
+ slidge/slixfix/xep_0313/mam.py,sha256=2USgMGgklnGXPcw_1F3482HxIyd41TLx0uit43_RthA,9211
90
+ slidge/slixfix/xep_0313/stanza.py,sha256=WriAx6XKiiyZTkoTw5RHcgu3ZYdkDd6hjQ0wHqDkXE0,10249
91
+ slidge/slixfix/xep_0317/__init__.py,sha256=KRMpj3n2TYTyXzlGHdGXzNbMEvbHxn7Qd1WxqRIkrhU,104
92
+ slidge/slixfix/xep_0317/hats.py,sha256=HAZ7y5DNehpdPVpNpgo1JxnG2GVhVSElLYdARiL9KJQ,290
93
+ slidge/slixfix/xep_0317/stanza.py,sha256=HYSJSUHqPNHmrpJsschb__qazfb2Jm3WUxLsrmPqC4I,659
94
+ slidge/slixfix/xep_0356_old/__init__.py,sha256=3jGWJX2m5gWgDCxcVqCsCCVPRTcfmU96yenwvAJtOKE,180
95
+ slidge/slixfix/xep_0356_old/privilege.py,sha256=kcJzFbzhOHtQMtzOJpvvwm1pghSpealWnqhC0zc8dGo,5338
96
+ slidge/slixfix/xep_0356_old/stanza.py,sha256=i7aqcaTg6PBhVwbHToLtlrwxBj7uO-M7VrYSyElyEKI,1229
97
+ slidge/slixfix/xep_0424/__init__.py,sha256=ngz0GBepiJs_cocaohkDRTiaB8mvaEwXoqQBv9Av9o8,284
98
+ slidge/slixfix/xep_0424/retraction.py,sha256=VmJQCj4umtjslnU1ydVOL6KquZnVvqgPTAyoE1KQKwE,2448
99
+ slidge/slixfix/xep_0424/stanza.py,sha256=mT8QzRX3YcyTqTSfaaWKxyhag1s1-iQy5QW9nH6cyU8,753
100
+ slidge/slixfix/xep_0490/__init__.py,sha256=Rhu_1h1P34LfIP_yr4JQ_PBHcuNBLDzLdJMnNmNJRrE,158
101
+ slidge/slixfix/xep_0490/mds.py,sha256=KaITeEzSWgpGyU7RP-iwipjSyCEdVMPiVIT5vHVK-RM,1527
102
+ slidge/slixfix/xep_0490/stanza.py,sha256=ztec_ipyhUFz_uWQYkS0Q6LlsNiSBBC5aZK-qSmhHXk,443
103
+ slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
104
+ slidge/util/archive_msg.py,sha256=xXAR0BI5r3d6KKWjae9594izCOv6iI03z2WLuTecNw8,1724
105
+ slidge/util/conf.py,sha256=1j2OnOsCBar1tOObErhXR5RC3Vl3faliOZ1U8J3My58,6613
106
+ slidge/util/db.py,sha256=zFOv0JEWQQK0_TMRlU4Z0G5Mc9pxvEErLyOzXmRAe5Q,5209
107
+ slidge/util/test.py,sha256=yRl3_dmNrn_v-FtOsRo_9eZr3Owj5JB5YIS0PozFU0E,13266
108
+ slidge/util/types.py,sha256=Gif-Z9NVd_eTei1uM3_KOsdok3B1yMQwdOkOzf9vheE,5224
109
+ slidge/util/util.py,sha256=8JeE0QObNGQr_Tw4OFPwQSz_EB_zh_0t9IJmNNhW0ic,9114
110
+ slidge-0.2.0a1.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
111
+ slidge-0.2.0a1.dist-info/METADATA,sha256=_6VENlq93oEe42OuGW4DM-Riq0-08DziC-hTrb0fl5s,4723
112
+ slidge-0.2.0a1.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
113
+ slidge-0.2.0a1.dist-info/entry_points.txt,sha256=SNl72KSocF5plsu_67xyH6wVWfGTXQbzkQgXbLtzDrQ,47
114
+ slidge-0.2.0a1.dist-info/RECORD,,
slidge/core/cache.py DELETED
@@ -1,183 +0,0 @@
1
- import asyncio
2
- import hashlib
3
- import io
4
- import logging
5
- import shelve
6
- import uuid
7
- from concurrent.futures import ThreadPoolExecutor
8
- from dataclasses import dataclass
9
- from http import HTTPStatus
10
- from pathlib import Path
11
- from typing import Optional
12
-
13
- import aiohttp
14
- from multidict import CIMultiDictProxy
15
- from PIL import Image
16
- from slixmpp import JID
17
-
18
- from ..util.types import URL, LegacyFileIdType
19
- from . import config
20
-
21
-
22
- @dataclass
23
- class CachedAvatar:
24
- filename: str
25
- hash: str
26
- height: int
27
- width: int
28
- root: Path
29
- etag: Optional[str] = None
30
- last_modified: Optional[str] = None
31
-
32
- @property
33
- def data(self):
34
- return self.path.read_bytes()
35
-
36
- @property
37
- def path(self):
38
- return self.root / self.filename
39
-
40
-
41
- class AvatarCache:
42
- _shelf_path: str
43
- _jid_to_legacy_path: str
44
- dir: Path
45
- http: aiohttp.ClientSession
46
-
47
- def __init__(self):
48
- self._thread_pool = ThreadPoolExecutor(config.AVATAR_RESAMPLING_THREADS)
49
-
50
- def set_dir(self, path: Path):
51
- self.dir = path
52
- self.dir.mkdir(exist_ok=True)
53
- self._shelf_path = str(path / "slidge_avatar_cache.shelf")
54
- self._jid_to_legacy_path = str(path / "jid_to_avatar_unique_id.shelf")
55
-
56
- def close(self):
57
- self._thread_pool.shutdown(cancel_futures=True)
58
-
59
- def __get_http_headers(self, cached: Optional[CachedAvatar]):
60
- headers = {}
61
- if cached and (self.dir / cached.filename).exists():
62
- if last_modified := cached.last_modified:
63
- headers["If-Modified-Since"] = last_modified
64
- if etag := cached.etag:
65
- headers["If-None-Match"] = etag
66
- return headers
67
-
68
- async def get_avatar_from_url_alone(self, url: str, jid: JID):
69
- """
70
- Used when no avatar unique ID is passed. Store and use http headers
71
- to avoid fetching ut
72
- """
73
- cached = self.get(url)
74
- headers = self.__get_http_headers(cached)
75
- async with _download_lock:
76
- return await self.__download(cached, url, headers, jid)
77
-
78
- async def __download(
79
- self,
80
- cached: Optional[CachedAvatar],
81
- url: str,
82
- headers: dict[str, str],
83
- jid: JID,
84
- ):
85
- async with self.http.get(url, headers=headers) as response:
86
- if response.status == HTTPStatus.NOT_MODIFIED:
87
- log.debug("Using avatar cache for %s", jid)
88
- return cached
89
- log.debug("Download avatar for %s", jid)
90
- return await self.convert_and_store(
91
- Image.open(io.BytesIO(await response.read())),
92
- url,
93
- jid,
94
- response.headers,
95
- )
96
-
97
- async def url_has_changed(self, url: URL):
98
- with shelve.open(self._shelf_path) as s:
99
- cached = s.get(url)
100
- if cached is None:
101
- return True
102
- headers = self.__get_http_headers(cached)
103
- async with self.http.head(url, headers=headers) as response:
104
- return response.status != HTTPStatus.NOT_MODIFIED
105
-
106
- def get(self, unique_id: LegacyFileIdType) -> Optional[CachedAvatar]:
107
- with shelve.open(self._shelf_path) as s:
108
- return s.get(str(unique_id))
109
-
110
- def get_cached_id_for(self, jid: JID) -> Optional[LegacyFileIdType]:
111
- with shelve.open(self._jid_to_legacy_path) as s:
112
- return s.get(str(jid))
113
-
114
- def store_jid(self, jid: JID, uid: LegacyFileIdType):
115
- with shelve.open(self._jid_to_legacy_path) as s:
116
- s[str(jid)] = uid
117
-
118
- def delete_jid(self, jid: JID):
119
- try:
120
- with shelve.open(self._jid_to_legacy_path) as s:
121
- del s[str(jid)]
122
- except KeyError:
123
- pass
124
-
125
- async def convert_and_store(
126
- self,
127
- img: Image.Image,
128
- unique_id: LegacyFileIdType,
129
- jid: JID,
130
- response_headers: Optional[CIMultiDictProxy[str]] = None,
131
- ) -> CachedAvatar:
132
- resize = (size := config.AVATAR_SIZE) and any(x > size for x in img.size)
133
- if resize:
134
- await asyncio.get_event_loop().run_in_executor(
135
- self._thread_pool, img.thumbnail, (size, size)
136
- )
137
- log.debug("Resampled image to %s", img.size)
138
-
139
- filename = str(uuid.uuid1()) + ".png"
140
- file_path = self.dir / filename
141
-
142
- if (
143
- not resize
144
- and img.format == "PNG"
145
- and isinstance(unique_id, str)
146
- and (path := Path(unique_id))
147
- and path.exists()
148
- ):
149
- img_bytes = path.read_bytes()
150
- else:
151
- with io.BytesIO() as f:
152
- img.save(f, format="PNG")
153
- img_bytes = f.getvalue()
154
-
155
- with file_path.open("wb") as file:
156
- file.write(img_bytes)
157
-
158
- hash_ = hashlib.sha1(img_bytes).hexdigest()
159
-
160
- avatar = CachedAvatar(
161
- filename=filename,
162
- hash=hash_,
163
- height=img.height,
164
- width=img.width,
165
- root=self.dir,
166
- )
167
- if response_headers:
168
- avatar.etag = response_headers.get("etag")
169
- avatar.last_modified = response_headers.get("last-modified")
170
- with shelve.open(self._shelf_path) as s:
171
- s[str(unique_id)] = avatar
172
- self.store_jid(jid, unique_id)
173
- return avatar
174
-
175
-
176
- avatar_cache = AvatarCache()
177
- log = logging.getLogger(__name__)
178
- _download_lock = asyncio.Lock()
179
-
180
- __all__ = (
181
- "CachedAvatar",
182
- "avatar_cache",
183
- )
slidge/util/schema.sql DELETED
@@ -1,126 +0,0 @@
1
- CREATE TABLE user(
2
- id INTEGER PRIMARY KEY,
3
- jid TEXT UNIQUE
4
- );
5
-
6
- CREATE TABLE muc(
7
- id INTEGER PRIMARY KEY,
8
- jid TEXT,
9
- user_id INTEGER,
10
- FOREIGN KEY(user_id) REFERENCES user(id),
11
- UNIQUE(user_id, jid)
12
- );
13
-
14
- CREATE TABLE mam_message(
15
- id INTEGER PRIMARY KEY,
16
- message_id TEXT,
17
- sent_on INTEGER,
18
- sender_jid TEXT,
19
- xml TEXT,
20
- muc_id INTEGER,
21
- user_id INTEGER,
22
- FOREIGN KEY(muc_id) REFERENCES muc(id),
23
- FOREIGN KEY(user_id) REFERENCES user(id),
24
- UNIQUE(user_id, muc_id, message_id)
25
- );
26
-
27
- CREATE INDEX mam_sent_on ON mam_message(sent_on);
28
- CREATE INDEX muc_jid ON muc(jid);
29
-
30
- CREATE TABLE session_message_sent(
31
- id INTEGER PRIMARY KEY,
32
- legacy_id UNIQUE,
33
- xmpp_id TEXT,
34
- user_id INTEGER,
35
- FOREIGN KEY(user_id) REFERENCES user(id)
36
- );
37
-
38
- CREATE INDEX session_message_sent_legacy_id
39
- ON session_message_sent(legacy_id);
40
- CREATE INDEX session_message_sent_xmpp_id
41
- ON session_message_sent(xmpp_id);
42
-
43
- CREATE TABLE session_message_sent_muc(
44
- id INTEGER PRIMARY KEY,
45
- legacy_id UNIQUE,
46
- xmpp_id TEXT,
47
- user_id INTEGER,
48
- FOREIGN KEY(user_id) REFERENCES user(id)
49
- );
50
-
51
- CREATE INDEX session_message_sent_muc_legacy_id
52
- ON session_message_sent_muc(legacy_id);
53
- CREATE INDEX session_message_sent_muc_xmpp_id
54
- ON session_message_sent_muc(xmpp_id);
55
-
56
- CREATE TABLE session_thread_sent_muc(
57
- id INTEGER PRIMARY KEY,
58
- legacy_id UNIQUE,
59
- xmpp_id TEXT,
60
- user_id INTEGER,
61
- FOREIGN KEY(user_id) REFERENCES user(id)
62
- );
63
-
64
- CREATE INDEX session_thread_sent_muc_legacy_id
65
- ON session_thread_sent_muc(legacy_id);
66
- CREATE INDEX session_thread_sent_muc_xmpp_id
67
- ON session_thread_sent_muc(xmpp_id);
68
-
69
-
70
- CREATE TABLE attachment(
71
- id INTEGER PRIMARY KEY,
72
- legacy_id UNIQUE,
73
- url TEXT UNIQUE,
74
- sims TEXT,
75
- sfs TEXT
76
- );
77
-
78
- CREATE INDEX attachment_legacy_id ON attachment(legacy_id);
79
- CREATE INDEX attachment_url ON attachment(url);
80
-
81
- CREATE TABLE attachment_legacy_msg_id(
82
- id INTEGER PRIMARY KEY,
83
- legacy_id UNIQUE
84
- );
85
-
86
- CREATE TABLE attachment_xmpp_ids(
87
- id INTEGER PRIMARY KEY,
88
- legacy_msg_id INTEGER,
89
- xmpp_id TEXT,
90
- FOREIGN KEY(legacy_msg_id) REFERENCES attachment_legacy_msg_id(id)
91
- );
92
-
93
- CREATE TABLE nick(
94
- id INTEGER PRIMARY KEY,
95
- jid UNIQUE,
96
- nick TEXT,
97
- user_id INTEGER,
98
- FOREIGN KEY(user_id) REFERENCES user(id),
99
- UNIQUE(jid, user_id)
100
- );
101
-
102
- CREATE INDEX nick_jid ON nick(jid);
103
-
104
-
105
- CREATE TABLE avatar(
106
- id INTEGER PRIMARY KEY,
107
- jid TEXT UNIQUE,
108
- cached_id TEXT
109
- );
110
-
111
- CREATE INDEX avatar_jid ON avatar(jid);
112
-
113
-
114
- CREATE TABLE presence(
115
- id INTEGER PRIMARY KEY,
116
- jid TEXT,
117
- last_seen INTEGER,
118
- ptype TEXT,
119
- pstatus TEXT,
120
- pshow TEXT,
121
- user_id INTEGER,
122
- FOREIGN KEY(user_id) REFERENCES user(id),
123
- UNIQUE(jid, user_id)
124
- );
125
-
126
- CREATE INDEX presence_jid ON presence(jid);