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.
- slidge/__init__.py +3 -5
- slidge/__main__.py +2 -196
- slidge/__version__.py +5 -0
- slidge/command/adhoc.py +8 -1
- slidge/command/admin.py +5 -6
- slidge/command/base.py +1 -2
- slidge/command/register.py +32 -16
- slidge/command/user.py +85 -5
- slidge/contact/contact.py +93 -31
- slidge/contact/roster.py +54 -39
- slidge/core/config.py +13 -7
- slidge/core/gateway/base.py +139 -34
- slidge/core/gateway/disco.py +2 -4
- slidge/core/gateway/mam.py +1 -4
- slidge/core/gateway/ping.py +2 -3
- slidge/core/gateway/presence.py +1 -1
- slidge/core/gateway/registration.py +32 -21
- slidge/core/gateway/search.py +3 -5
- slidge/core/gateway/session_dispatcher.py +109 -51
- slidge/core/gateway/vcard_temp.py +6 -4
- slidge/core/mixins/__init__.py +11 -1
- slidge/core/mixins/attachment.py +15 -10
- slidge/core/mixins/avatar.py +66 -18
- slidge/core/mixins/base.py +8 -2
- slidge/core/mixins/message.py +11 -7
- slidge/core/mixins/message_maker.py +17 -9
- slidge/core/mixins/presence.py +14 -4
- slidge/core/pubsub.py +54 -212
- slidge/core/session.py +65 -33
- slidge/db/__init__.py +4 -0
- slidge/db/alembic/env.py +64 -0
- slidge/db/alembic/script.py.mako +26 -0
- slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +36 -0
- slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +37 -0
- slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +133 -0
- slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +76 -0
- slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +214 -0
- slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +26 -0
- slidge/db/avatar.py +224 -0
- slidge/db/meta.py +65 -0
- slidge/db/models.py +365 -0
- slidge/db/store.py +976 -0
- slidge/group/archive.py +13 -14
- slidge/group/bookmarks.py +59 -56
- slidge/group/participant.py +81 -29
- slidge/group/room.py +242 -142
- slidge/main.py +201 -0
- slidge/migration.py +30 -0
- slidge/slixfix/__init__.py +35 -2
- slidge/slixfix/roster.py +11 -4
- slidge/slixfix/xep_0292/vcard4.py +1 -0
- slidge/util/db.py +1 -47
- slidge/util/test.py +21 -4
- slidge/util/types.py +24 -4
- {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/METADATA +3 -1
- slidge-0.2.0a0.dist-info/RECORD +108 -0
- slidge/core/cache.py +0 -183
- slidge/util/schema.sql +0 -126
- slidge/util/sql.py +0 -508
- slidge-0.1.2.dist-info/RECORD +0 -96
- {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/LICENSE +0 -0
- {slidge-0.1.2.dist-info → slidge-0.2.0a0.dist-info}/WHEEL +0 -0
- {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);
|