slidge 0.1.2__py3-none-any.whl → 0.2.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 (63) 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 +5 -6
  6. slidge/command/base.py +1 -2
  7. slidge/command/register.py +32 -16
  8. slidge/command/user.py +85 -5
  9. slidge/contact/contact.py +93 -31
  10. slidge/contact/roster.py +54 -39
  11. slidge/core/config.py +13 -7
  12. slidge/core/gateway/base.py +139 -34
  13. slidge/core/gateway/disco.py +2 -4
  14. slidge/core/gateway/mam.py +1 -4
  15. slidge/core/gateway/ping.py +2 -3
  16. slidge/core/gateway/presence.py +1 -1
  17. slidge/core/gateway/registration.py +32 -21
  18. slidge/core/gateway/search.py +3 -5
  19. slidge/core/gateway/session_dispatcher.py +109 -51
  20. slidge/core/gateway/vcard_temp.py +6 -4
  21. slidge/core/mixins/__init__.py +11 -1
  22. slidge/core/mixins/attachment.py +15 -10
  23. slidge/core/mixins/avatar.py +66 -18
  24. slidge/core/mixins/base.py +8 -2
  25. slidge/core/mixins/message.py +11 -7
  26. slidge/core/mixins/message_maker.py +17 -9
  27. slidge/core/mixins/presence.py +14 -4
  28. slidge/core/pubsub.py +54 -212
  29. slidge/core/session.py +65 -33
  30. slidge/db/__init__.py +4 -0
  31. slidge/db/alembic/env.py +64 -0
  32. slidge/db/alembic/script.py.mako +26 -0
  33. slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +36 -0
  34. slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +37 -0
  35. slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +133 -0
  36. slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +76 -0
  37. slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +214 -0
  38. slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +26 -0
  39. slidge/db/avatar.py +224 -0
  40. slidge/db/meta.py +65 -0
  41. slidge/db/models.py +365 -0
  42. slidge/db/store.py +976 -0
  43. slidge/group/archive.py +13 -14
  44. slidge/group/bookmarks.py +59 -56
  45. slidge/group/participant.py +81 -29
  46. slidge/group/room.py +242 -142
  47. slidge/main.py +201 -0
  48. slidge/migration.py +30 -0
  49. slidge/slixfix/__init__.py +35 -2
  50. slidge/slixfix/roster.py +11 -4
  51. slidge/slixfix/xep_0292/vcard4.py +1 -0
  52. slidge/util/db.py +1 -47
  53. slidge/util/test.py +21 -4
  54. slidge/util/types.py +24 -4
  55. {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/METADATA +3 -1
  56. slidge-0.2.0a0.dist-info/RECORD +108 -0
  57. slidge/core/cache.py +0 -183
  58. slidge/util/schema.sql +0 -126
  59. slidge/util/sql.py +0 -508
  60. slidge-0.1.2.dist-info/RECORD +0 -96
  61. {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/LICENSE +0 -0
  62. {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/WHEEL +0 -0
  63. {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,108 @@
1
+ slidge/__init__.py,sha256=S0tUjqpZlzsr8G4Y_1Xt-KCYB07qaknTB0OwHU8k29U,1587
2
+ slidge/__main__.py,sha256=Y12eh1TD_C5MB50KgEAuMffGnRFCvKYFKHD4UYSmHA0,72
3
+ slidge/__version__.py,sha256=NGiTlFQJwfeI5FYgTxAr8mGPL4FIT28Fk_rnNgPCUBY,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=MJ4nRQHqqGP3DeEvm3tSYoT4dGbLiPcOgqBxhf20Idw,5753
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=EqvMrCxWyKWm-qCsQJCD_pV3DwxlWt8MQQA54kUaF58,11460
12
+ slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
13
+ slidge/contact/contact.py,sha256=9ew0vNr5pmp6bCLg4og6o2yYli3PqlVZZ55JB0XU0d8,18428
14
+ slidge/contact/roster.py,sha256=zRlQnlmyxlWOBTRqZLMSbnIjCDyuusYkt3WX9AI9As8,8230
15
+ slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
16
+ slidge/core/config.py,sha256=lUO_aSu7bZUWWiFAKPwKMtbeUc7CwDzUrf0UQ2-SIB4,7694
17
+ slidge/core/gateway/__init__.py,sha256=rZckY2gAE-mon77_DSsAW1XtWqhBAETE2d4FqZ8pJXk,58
18
+ slidge/core/gateway/base.py,sha256=9FgJ_CTnXMA6iu5xpKN0TMKp0v3kPLQUmY5WHdZqxTc,38375
19
+ slidge/core/gateway/caps.py,sha256=Qosd3cZ356mGzzQkdP6Y8OZ5c0l7H3Lr2wptoFrD1qU,1919
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=z2l4Zt0h-Z9WzEcA6MEiPNPrbYwggEqBVXpia5HtpLI,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=0F7riSSvgHdaPTzetjaQ6mGk2mhoil9SFD8jGq0Ea7c,31860
29
+ slidge/core/gateway/vcard_temp.py,sha256=p84mqrxJYxqUr0L9RcpPZPKNTbuPoq96Sq2rQVEY780,4687
30
+ slidge/core/mixins/__init__.py,sha256=muReAzgvENgMvlfm0Fpe6BQFfm2EMjoDe9ZhGgo6Vig,627
31
+ slidge/core/mixins/attachment.py,sha256=x6R0F3ON_DWDKuf3l0OBmcOkwHA_xGfButn6hnZEIuQ,17966
32
+ slidge/core/mixins/avatar.py,sha256=u2DvJuP7bhmPR6utlj4qs1e9ySmcfGjfWwP-tHu_hhA,7093
33
+ slidge/core/mixins/base.py,sha256=9hjf2Pw5r0poSi1Abv-_znk83Kngsu9EXTf05gpFDdI,768
34
+ slidge/core/mixins/disco.py,sha256=SKPVRVq8NUcc-zerHit7_K3Xmo1yJF1ipYN9lhHUDBU,3935
35
+ slidge/core/mixins/lock.py,sha256=mVzwVVEoq1hrAMgGLh4K84BTLt7JTJ33B8HSGSorTdY,913
36
+ slidge/core/mixins/message.py,sha256=xncQEBaFsnJdyAZB8RXuYR3tYE6_cNX7v9bX8mL8rYg,14971
37
+ slidge/core/mixins/message_maker.py,sha256=TcCutHi0sIwL6beJNkN7XyR0aDIbA0xZyxd2Gc9ulG4,6022
38
+ slidge/core/mixins/presence.py,sha256=9B-F3ihU-vlLN020V0JFXt7YOEmKHXbZsIPvWbn5i4s,7672
39
+ slidge/core/mixins/recipient.py,sha256=U-YppozUO8pA94jmD3-qmhkykTebPNaOVWc3JDPC9w8,1302
40
+ slidge/core/pubsub.py,sha256=RF9Jkn5QzsjshkNmxrabbdWFwpksIODls8-R9kMH1VU,12625
41
+ slidge/core/session.py,sha256=bulAYyjuSlhJ2IKXScyvQGtxYWZrSf7Z91dEkM8ZcYM,27055
42
+ slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
43
+ slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
44
+ slidge/db/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
45
+ slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py,sha256=mUL-0Io6ZPd_QbnKfwGYyjdMcM2uxQ0Wg72H23-2t_E,1033
46
+ slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py,sha256=f8TFS28CXjGhvIn41UYMoHYeODfqhKfo4O7gk-JwA1E,1134
47
+ slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py,sha256=olXaOEEsUSasqaaKdlP1cBODsMhmV1i90qbpDM2vTm4,4696
48
+ slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py,sha256=2Bf9BA41eIWVvlPHsa67X7rnPe0KT9D0qcySrVyR6WE,2083
49
+ slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py,sha256=2tiRxoC9PYOQn6XQrwK0JTEsb45Pzp2PsKoZSS4rcIA,7564
50
+ slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
51
+ slidge/db/avatar.py,sha256=KVLHgcGAhyzD8vZ9EKzA8ZIxjjctTsZFAaz3XvmNm44,7098
52
+ slidge/db/meta.py,sha256=-MxJ66fI2hUs86geCTC4PSFDlRfJTvqJYvhdXydO6w8,1538
53
+ slidge/db/models.py,sha256=cvFYXQ4PDPAwcer1qY1cH3kkTMBtA0vgnj_JzQLjqqk,12467
54
+ slidge/db/store.py,sha256=foTMbm34-jfbdDUex--ZwOdUXga_kZJvh2BBxrTCAnc,36594
55
+ slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
56
+ slidge/group/archive.py,sha256=v3Qt-IuWNciH7Y5I6N1YIbM8zsVT663ni9QRdN6s1yQ,3441
57
+ slidge/group/bookmarks.py,sha256=CfzbAojyYEQ4BFX9G_hpRMtznhOs2qadiYAjhUozUDU,6140
58
+ slidge/group/participant.py,sha256=TYknjNLMWUhI6c4VAijU8hY-FF3KZZQwWbQKPBj3ATI,16470
59
+ slidge/group/room.py,sha256=P1t4iKYdDQw8ao5h__oSINgF199zAuZ6OlRSByzKfYY,42642
60
+ slidge/main.py,sha256=QG7L5BkHB3hXVedwFr7xklt-8vGro54aGWnCW_4hCkg,6085
61
+ slidge/migration.py,sha256=qUrux9dYCtOfFjPIlvGfWjoyqhkdxzaOByJRqTmCoUI,1072
62
+ slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ slidge/slixfix/__init__.py,sha256=7GevigEt68hwgwHqXcsFogN5jRXRHPeqR6kwODCH4hc,3055
64
+ slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
65
+ slidge/slixfix/link_preview/link_preview.py,sha256=9PgdfnoyVMHnXS0w5OFp0wz3ku96Ck-HtRXbVUlDi1U,448
66
+ slidge/slixfix/link_preview/stanza.py,sha256=YAXoNw2MD0a3nzvldGKlvSemjUMbUEG23regzmj4Ntc,2664
67
+ slidge/slixfix/roster.py,sha256=zdcO8vsk8gqkqye-vqIynfj-pmozbjD-tRtoqwpKW7I,1680
68
+ slidge/slixfix/xep_0077/__init__.py,sha256=0lY1YXdgAsfrfxI_Woxaf1etHCJXe35Xtntq_icF6nA,325
69
+ slidge/slixfix/xep_0077/register.py,sha256=6nwTfHNL7Z9-1wUhpAF743TNbjQLCMP7Rflkdad8d60,10431
70
+ slidge/slixfix/xep_0077/stanza.py,sha256=Lngly7F1ChCkNKn7yl1QmN838fO-KqkAhkazxzDsz80,2410
71
+ slidge/slixfix/xep_0100/__init__.py,sha256=AtEXDQOrEWodkN3fgKR0W3Ezsz_Zza6cgO5ZaZS-JOo,107
72
+ slidge/slixfix/xep_0100/gateway.py,sha256=Fhxs2sUPnVRPa1o7RXCncnbBO2gjeZx3pbItug-8OiA,4501
73
+ slidge/slixfix/xep_0100/stanza.py,sha256=7vCzej9VFQupsTpGGl0cJWuGNH4I6oVcckBu_-fE55c,232
74
+ slidge/slixfix/xep_0153/__init__.py,sha256=wZCTLaVsXQn_wYEHA8YXdGCsspvj2rvq92iyi16W0xA,319
75
+ slidge/slixfix/xep_0153/stanza.py,sha256=qhVfxlJEKuYDuWnd_I_VT4TtJbpX2opN6kG8oxYrc3o,735
76
+ slidge/slixfix/xep_0153/vcard_avatar.py,sha256=mzaReW5c1OaeL39CeGvuzIkh3j-Z5mc2joLqn5cNc5Q,658
77
+ slidge/slixfix/xep_0264/__init__.py,sha256=c6g_y-PAwQJZ4ZLWcwXc6Q5xRPeXTvvvJH4ZKQpkj3o,109
78
+ slidge/slixfix/xep_0264/stanza.py,sha256=YvkI9rsGztkc9yOZBjf5PNKReW8aeGdF6MnrsfDckYs,864
79
+ slidge/slixfix/xep_0264/thumbnail.py,sha256=6ukgPCWJTFUnew4USB6hNtEk_ZcpWcFAvHr2r0T5znw,456
80
+ slidge/slixfix/xep_0292/__init__.py,sha256=_MvS9wGra6ig3P_dPAVlCPDJkiOFvUWGjaRsHj1woUg,98
81
+ slidge/slixfix/xep_0292/vcard4.py,sha256=leP2klQAjftK76TU0zRn0U_JTHFB-Esk4Q-Rlvoi4LE,3161
82
+ slidge/slixfix/xep_0313/__init__.py,sha256=rpvXxN4Fi-ey4Ww39OEAXoiaeWs3XMqvzR64hA6j_x4,368
83
+ slidge/slixfix/xep_0313/mam.py,sha256=2USgMGgklnGXPcw_1F3482HxIyd41TLx0uit43_RthA,9211
84
+ slidge/slixfix/xep_0313/stanza.py,sha256=WriAx6XKiiyZTkoTw5RHcgu3ZYdkDd6hjQ0wHqDkXE0,10249
85
+ slidge/slixfix/xep_0317/__init__.py,sha256=KRMpj3n2TYTyXzlGHdGXzNbMEvbHxn7Qd1WxqRIkrhU,104
86
+ slidge/slixfix/xep_0317/hats.py,sha256=HAZ7y5DNehpdPVpNpgo1JxnG2GVhVSElLYdARiL9KJQ,290
87
+ slidge/slixfix/xep_0317/stanza.py,sha256=HYSJSUHqPNHmrpJsschb__qazfb2Jm3WUxLsrmPqC4I,659
88
+ slidge/slixfix/xep_0356_old/__init__.py,sha256=3jGWJX2m5gWgDCxcVqCsCCVPRTcfmU96yenwvAJtOKE,180
89
+ slidge/slixfix/xep_0356_old/privilege.py,sha256=kcJzFbzhOHtQMtzOJpvvwm1pghSpealWnqhC0zc8dGo,5338
90
+ slidge/slixfix/xep_0356_old/stanza.py,sha256=i7aqcaTg6PBhVwbHToLtlrwxBj7uO-M7VrYSyElyEKI,1229
91
+ slidge/slixfix/xep_0424/__init__.py,sha256=ngz0GBepiJs_cocaohkDRTiaB8mvaEwXoqQBv9Av9o8,284
92
+ slidge/slixfix/xep_0424/retraction.py,sha256=VmJQCj4umtjslnU1ydVOL6KquZnVvqgPTAyoE1KQKwE,2448
93
+ slidge/slixfix/xep_0424/stanza.py,sha256=mT8QzRX3YcyTqTSfaaWKxyhag1s1-iQy5QW9nH6cyU8,753
94
+ slidge/slixfix/xep_0490/__init__.py,sha256=Rhu_1h1P34LfIP_yr4JQ_PBHcuNBLDzLdJMnNmNJRrE,158
95
+ slidge/slixfix/xep_0490/mds.py,sha256=KaITeEzSWgpGyU7RP-iwipjSyCEdVMPiVIT5vHVK-RM,1527
96
+ slidge/slixfix/xep_0490/stanza.py,sha256=ztec_ipyhUFz_uWQYkS0Q6LlsNiSBBC5aZK-qSmhHXk,443
97
+ slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
98
+ slidge/util/archive_msg.py,sha256=2gq0N8GMVN8PKB0HxkWJza5FdgCDob_WPo0yVcx7DJk,1686
99
+ slidge/util/conf.py,sha256=1j2OnOsCBar1tOObErhXR5RC3Vl3faliOZ1U8J3My58,6613
100
+ slidge/util/db.py,sha256=zFOv0JEWQQK0_TMRlU4Z0G5Mc9pxvEErLyOzXmRAe5Q,5209
101
+ slidge/util/test.py,sha256=-iBzeY9RX1o8K_nyBIP4UUTuFAodTr9IjDxZH67EsC4,11372
102
+ slidge/util/types.py,sha256=68wrehrMrRH3AxJ1Gs6r5XtvN5E4nZo1o1nbMHzNn4E,5151
103
+ slidge/util/util.py,sha256=t8t1nPybcitpmuSlYsOwZ8gDjfiEwTjaa4D7vtzrvQ8,8587
104
+ slidge-0.2.0a0.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
105
+ slidge-0.2.0a0.dist-info/METADATA,sha256=GV1PE5-H9VqBRT_Vd9sV4tPPtGjbd7PC5XKUX5wA350,4823
106
+ slidge-0.2.0a0.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
107
+ slidge-0.2.0a0.dist-info/entry_points.txt,sha256=SNl72KSocF5plsu_67xyH6wVWfGTXQbzkQgXbLtzDrQ,47
108
+ slidge-0.2.0a0.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);