slidge 0.2.3.post1__tar.gz → 0.2.4__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/test.yaml +1 -1
  2. {slidge-0.2.3.post1 → slidge-0.2.4}/Dockerfile +1 -1
  3. {slidge-0.2.3.post1/slidge.egg-info → slidge-0.2.4}/PKG-INFO +2 -2
  4. {slidge-0.2.3.post1 → slidge-0.2.4}/README.md +1 -1
  5. {slidge-0.2.3.post1 → slidge-0.2.4}/doap.xml +16 -0
  6. {slidge-0.2.3.post1 → slidge-0.2.4}/docker-compose.yml +1 -1
  7. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/install.rst +1 -1
  8. {slidge-0.2.3.post1 → slidge-0.2.4}/pyproject.toml +1 -1
  9. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__version__.py +1 -1
  10. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/message.py +4 -1
  11. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/gateway.py +2 -0
  12. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/recipient.py +2 -2
  13. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/room.py +21 -1
  14. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/__init__.py +72 -5
  15. slidge-0.2.4/slidge/slixfix/xep_0492/__init__.py +8 -0
  16. slidge-0.2.4/slidge/slixfix/xep_0492/notify.py +16 -0
  17. slidge-0.2.4/slidge/slixfix/xep_0492/stanza.py +102 -0
  18. {slidge-0.2.3.post1 → slidge-0.2.4/slidge.egg-info}/PKG-INFO +2 -2
  19. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/SOURCES.txt +3 -0
  20. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_feature_restriction.py +1 -1
  21. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_muc.py +296 -4
  22. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_shakespeare.py +2 -1
  23. {slidge-0.2.3.post1 → slidge-0.2.4}/.gitignore +0 -0
  24. {slidge-0.2.3.post1 → slidge-0.2.4}/.pre-commit-config.yaml +0 -0
  25. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container-cache.yml +0 -0
  26. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container-ci.yaml +0 -0
  27. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/container.yml +0 -0
  28. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/docs.yaml +0 -0
  29. {slidge-0.2.3.post1 → slidge-0.2.4}/.woodpecker/package.yaml +0 -0
  30. {slidge-0.2.3.post1 → slidge-0.2.4}/LICENSE +0 -0
  31. {slidge-0.2.3.post1 → slidge-0.2.4}/commitlint.config.js +0 -0
  32. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/5x5.png +0 -0
  33. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-color-small.png +0 -0
  34. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-color.png +0 -0
  35. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-mono-black.png +0 -0
  36. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge-mono-white.png +0 -0
  37. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/assets/slidge.svg +0 -0
  38. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/movim.env +0 -0
  39. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/nginx.conf +0 -0
  40. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/confs/slidge-example.ini +0 -0
  41. {slidge-0.2.3.post1 → slidge-0.2.4}/dev/prettify_tests.py +0 -0
  42. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/Makefile +0 -0
  43. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/attachments.rst +0 -0
  44. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/component.rst +0 -0
  45. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/config/index.rst +0 -0
  46. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/daemon.rst +0 -0
  47. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/ejabberd.yaml +0 -0
  48. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/index.rst +0 -0
  49. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/examples/prosody.cfg.lua +0 -0
  50. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/index.rst +0 -0
  51. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/note.rst +0 -0
  52. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/admin/privilege.rst +0 -0
  53. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/codeberg.svg +0 -0
  54. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/conf.py +0 -0
  55. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/contributing.rst +0 -0
  56. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/design.rst +0 -0
  57. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/howto.rst +0 -0
  58. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/index.rst +0 -0
  59. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/dev/tutorial.rst +0 -0
  60. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/glossary.rst +0 -0
  61. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/index.rst +0 -0
  62. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/commands.rst +0 -0
  63. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/contacts.rst +0 -0
  64. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/foxyproxy.png +0 -0
  65. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/gajim.png +0 -0
  66. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/index.rst +0 -0
  67. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/low_profile.rst +0 -0
  68. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/movim1.png +0 -0
  69. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/movim2.png +0 -0
  70. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/note.rst +0 -0
  71. {slidge-0.2.3.post1 → slidge-0.2.4}/docs/source/user/register.rst +0 -0
  72. {slidge-0.2.3.post1 → slidge-0.2.4}/setup.cfg +0 -0
  73. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__init__.py +0 -0
  74. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/__main__.py +0 -0
  75. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/__init__.py +0 -0
  76. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/adhoc.py +0 -0
  77. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/admin.py +0 -0
  78. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/base.py +0 -0
  79. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/categories.py +0 -0
  80. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/chat_command.py +0 -0
  81. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/register.py +0 -0
  82. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/command/user.py +0 -0
  83. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/__init__.py +0 -0
  84. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/contact.py +0 -0
  85. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/contact/roster.py +0 -0
  86. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/__init__.py +0 -0
  87. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/config.py +0 -0
  88. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/__init__.py +0 -0
  89. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/caps.py +0 -0
  90. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/disco.py +0 -0
  91. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/__init__.py +0 -0
  92. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/chat_state.py +0 -0
  93. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/message/marker.py +0 -0
  94. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/__init__.py +0 -0
  95. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/admin.py +0 -0
  96. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/mam.py +0 -0
  97. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/misc.py +0 -0
  98. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/owner.py +0 -0
  99. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/muc/ping.py +0 -0
  100. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/presence.py +0 -0
  101. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/registration.py +0 -0
  102. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/search.py +0 -0
  103. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/session_dispatcher.py +0 -0
  104. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/util.py +0 -0
  105. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/dispatcher/vcard.py +0 -0
  106. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/__init__.py +0 -0
  107. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/attachment.py +0 -0
  108. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/avatar.py +0 -0
  109. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/base.py +0 -0
  110. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/db.py +0 -0
  111. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/disco.py +0 -0
  112. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/lock.py +0 -0
  113. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message.py +0 -0
  114. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message_maker.py +0 -0
  115. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/message_text.py +0 -0
  116. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/mixins/presence.py +0 -0
  117. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/pubsub.py +0 -0
  118. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/core/session.py +0 -0
  119. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/__init__.py +0 -0
  120. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/__init__.py +0 -0
  121. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/env.py +0 -0
  122. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/old_user_store.py +0 -0
  123. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/script.py.mako +0 -0
  124. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/09f27f098baa_add_missing_attributes_in_room.py +0 -0
  125. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/15b0bd83407a_remove_bogus_unique_constraints_on_room_.py +0 -0
  126. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/2461390c0af2_store_contacts_caps_verstring_in_db.py +0 -0
  127. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/29f5280c61aa_store_subject_setter_in_room.py +0 -0
  128. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/2b1f45ab7379_store_room_subject_setter_by_nickname.py +0 -0
  129. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/3071e0fa69d4_add_contact_client_type.py +0 -0
  130. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/45c24cc73c91_add_bob.py +0 -0
  131. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/5bd48bfdffa2_lift_room_legacy_id_constraint.py +0 -0
  132. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/82a4af84b679_add_muc_history_filled.py +0 -0
  133. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/8b993243a536_add_vcard_content_to_contact_table.py +0 -0
  134. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/8d2ced764698_rely_on_db_to_store_contacts_rooms_and_.py +0 -0
  135. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/aa9d82a7f6ef_db_creation.py +0 -0
  136. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/abba1ae0edb3_store_avatar_legacy_id_in_the_contact_.py +0 -0
  137. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/b33993e87db3_move_everything_to_persistent_db.py +0 -0
  138. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.py +0 -0
  139. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py +0 -0
  140. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py +0 -0
  141. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/avatar.py +0 -0
  142. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/meta.py +0 -0
  143. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/models.py +0 -0
  144. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/db/store.py +0 -0
  145. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/__init__.py +0 -0
  146. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/archive.py +0 -0
  147. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/bookmarks.py +0 -0
  148. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/group/participant.py +0 -0
  149. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/main.py +0 -0
  150. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/migration.py +0 -0
  151. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/py.typed +0 -0
  152. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/delivery_receipt.py +0 -0
  153. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/__init__.py +0 -0
  154. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/link_preview.py +0 -0
  155. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/link_preview/stanza.py +0 -0
  156. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/roster.py +0 -0
  157. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/__init__.py +0 -0
  158. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/register.py +0 -0
  159. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0077/stanza.py +0 -0
  160. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/__init__.py +0 -0
  161. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/gateway.py +0 -0
  162. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0100/stanza.py +0 -0
  163. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0153/__init__.py +0 -0
  164. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0153/vcard_avatar.py +0 -0
  165. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0292/__init__.py +0 -0
  166. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0292/vcard4.py +0 -0
  167. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/__init__.py +0 -0
  168. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/privilege.py +0 -0
  169. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/slixfix/xep_0356_old/stanza.py +0 -0
  170. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/__init__.py +0 -0
  171. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/archive_msg.py +0 -0
  172. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/conf.py +0 -0
  173. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/db.py +0 -0
  174. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/test.py +0 -0
  175. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/types.py +0 -0
  176. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge/util/util.py +0 -0
  177. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/dependency_links.txt +0 -0
  178. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/entry_points.txt +0 -0
  179. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/requires.txt +0 -0
  180. {slidge-0.2.3.post1 → slidge-0.2.4}/slidge.egg-info/top_level.txt +0 -0
  181. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/__init__.py +0 -0
  182. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/contact.py +0 -0
  183. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/gateway.py +0 -0
  184. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/group.py +0 -0
  185. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/legacy_client.py +0 -0
  186. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/session.py +0 -0
  187. {slidge-0.2.3.post1 → slidge-0.2.4}/superduper/util.py +0 -0
  188. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/conftest.py +0 -0
  189. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_access.py +0 -0
  190. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_confirmation.py +0 -0
  191. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_form.py +0 -0
  192. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_adhoc/test_reported.py +0 -0
  193. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_attachment.py +0 -0
  194. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_avatar.py +0 -0
  195. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_backfill.py +0 -0
  196. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_chat_commands.py +0 -0
  197. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_config.py +0 -0
  198. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_db/test_store.py +0 -0
  199. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_db/test_user.py +0 -0
  200. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_mds.py +0 -0
  201. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_name_in_constructor.py +0 -0
  202. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_resourceprep.py +0 -0
  203. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_session.py +0 -0
  204. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_session_2.py +0 -0
  205. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_set_name_before_fill.py +0 -0
  206. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_stanza_link_preview.py +0 -0
  207. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_util.py +0 -0
  208. {slidge-0.2.3.post1 → slidge-0.2.4}/tests/test_vcard.py +0 -0
  209. {slidge-0.2.3.post1 → slidge-0.2.4}/uv.lock +0 -0
@@ -60,5 +60,5 @@ steps:
60
60
  token:
61
61
  from_secret: CODEBERG_TOKEN
62
62
  html-root: htmlcov
63
- root: coverage
63
+ prefix: coverage
64
64
  <<: *only-once
@@ -71,7 +71,7 @@ FROM base AS dev
71
71
 
72
72
  USER root
73
73
 
74
- COPY --from=docker.io/nicocool84/slidge-prosody-dev:latest \
74
+ COPY --from=codeberg.org/slidge/prosody-slidge-dev:latest \
75
75
  /etc/prosody/certs/localhost.crt \
76
76
  /usr/local/share/ca-certificates/
77
77
  RUN update-ca-certificates
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: slidge
3
- Version: 0.2.3.post1
3
+ Version: 0.2.4
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -693,7 +693,7 @@ Requires-Dist: thumbhash>=0.1.2
693
693
 
694
694
 
695
695
  [![woodpecker CI status](https://ci.codeberg.org/api/badges/14027/status.svg)](https://ci.codeberg.org/repos/14027)
696
- [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage)
696
+ [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage/main)
697
697
 
698
698
  [![pypi version](https://badge.fury.io/py/slidge.svg)](https://pypi.org/project/slidge/)
699
699
  [![debian unstable version](https://badges.debian.net/badges/debian/unstable/python3-slidge/version.svg)](https://packages.debian.org/unstable/python3-slidge)
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
  [![woodpecker CI status](https://ci.codeberg.org/api/badges/14027/status.svg)](https://ci.codeberg.org/repos/14027)
7
- [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage)
7
+ [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage/main)
8
8
 
9
9
  [![pypi version](https://badge.fury.io/py/slidge.svg)](https://pypi.org/project/slidge/)
10
10
  [![debian unstable version](https://badges.debian.net/badges/debian/unstable/python3-slidge/version.svg)](https://packages.debian.org/unstable/python3-slidge)
@@ -485,6 +485,14 @@
485
485
  <xmpp:note>Legacy service to XMPP attachments have SFS metadata when possible. Not supported from XMPP to legacy service</xmpp:note>
486
486
  </xmpp:SupportedXep>
487
487
  </implements>
488
+ <implements>
489
+ <xmpp:SupportedXep>
490
+ <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0469.html"/>
491
+ <xmpp:status>complete</xmpp:status>
492
+ <xmpp:version>0.1.0</xmpp:version>
493
+ <xmpp:note>Relies on being a privileged entity (XEP-0356), to edit bookmark entries.</xmpp:note>
494
+ </xmpp:SupportedXep>
495
+ </implements>
488
496
  <implements>
489
497
  <xmpp:SupportedXep>
490
498
  <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0486.html"/>
@@ -502,5 +510,13 @@
502
510
  <xmpp:note>Slidge supports listening to MDS events and triggering "legacy MDS" events, if added to the PEP MDS node, which is done automatically if XEP-0356 IQ privileges are set. Slidge also support updating MDS node in reaction to "legacy MDS" events.</xmpp:note>
503
511
  </xmpp:SupportedXep>
504
512
  </implements>
513
+ <implements>
514
+ <xmpp:SupportedXep>
515
+ <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0492.html"/>
516
+ <xmpp:status>partial</xmpp:status>
517
+ <xmpp:version>0.1.0</xmpp:version>
518
+ <xmpp:note>Per client-type setting is not supported.</xmpp:note>
519
+ </xmpp:SupportedXep>
520
+ </implements>
505
521
  </Project>
506
522
  </rdf:RDF>
@@ -16,7 +16,7 @@ services:
16
16
  - prosody
17
17
 
18
18
  prosody:
19
- image: docker.io/nicocool84/slidge-prosody-dev:latest
19
+ image: codeberg.org/slidge/slidge-prosody-dev:latest
20
20
  ports:
21
21
  - "127.0.0.1:5281:5281" # XMPP port for clients to connect to
22
22
  - "127.0.0.1:5222:5222" # prosody's http_file_share
@@ -5,7 +5,7 @@ Installation
5
5
  Dockerhub
6
6
  ---------
7
7
 
8
- Containers for arm64 and amd64 are available on `docker hub <https://hub.docker.com/u/nicocool84>`_.
8
+ Containers for arm64 and amd64 are available on `codeberg <https://codeberg.org/slidge/-/packages?q=&type=container>`_.
9
9
  The slidge-whatsapp arm64 container is kindly provided by `raver <https://hub.docker.com/u/ravermeister>`_.
10
10
  See :ref:`Containers` for more details.
11
11
 
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Software Development :: Libraries :: Python Modules",
25
25
  ]
26
26
  keywords = ["xmpp", "gateway", "bridge", "instant messaging"]
27
- version = "v0.2.3.post1"
27
+ version = "v0.2.4"
28
28
  readme = "README.md"
29
29
 
30
30
  [build-system]
@@ -2,4 +2,4 @@ from slidge.util.util import get_version # noqa: F401
2
2
 
3
3
  # this is modified before publish, but if someone cloned from the repo,
4
4
  # it can help
5
- __version__ = "v0.2.3.post1"
5
+ __version__ = "v0.2.4"
@@ -296,7 +296,10 @@ class MessageContentMixin(DispatcherMixin):
296
296
  # no need to carbon for groups, we just don't echo the stanza
297
297
  entity.react(legacy_id, carbon=True) # type: ignore
298
298
  await session.on_react(entity, legacy_id, [], thread=thread)
299
- raise XMPPError("not-acceptable", text=error_msg)
299
+ raise XMPPError(
300
+ "policy-violation", # type:ignore
301
+ text=error_msg,
302
+ )
300
303
 
301
304
  await session.on_react(entity, legacy_id, emojis, thread=thread)
302
305
  if isinstance(entity, LegacyMUC):
@@ -913,7 +913,9 @@ SLIXMPP_PLUGINS = [
913
913
  "xep_0444", # Message reactions
914
914
  "xep_0447", # Stateless File Sharing
915
915
  "xep_0461", # Message replies
916
+ "xep_0469", # Bookmark Pinning
916
917
  "xep_0490", # Message Displayed Synchronization
918
+ "xep_0492", # Chat Notification Settings
917
919
  ]
918
920
 
919
921
  LOG_STRIP_ELEMENTS = ["data", "binval"]
@@ -21,9 +21,9 @@ class ReactionRecipientMixin:
21
21
  form["type"] = "result"
22
22
  form.add_field("FORM_TYPE", "hidden", value="urn:xmpp:reactions:0:restrictions")
23
23
  if self.REACTIONS_SINGLE_EMOJI:
24
- form.add_field("max_reactions_per_user", value="1")
24
+ form.add_field("max_reactions_per_user", value="1", type="number")
25
25
  if available:
26
- form.add_field("allowlist", value=list(available))
26
+ form.add_field("allowlist", value=list(available), type="text-multi")
27
27
  return form
28
28
 
29
29
  async def available_emojis(
@@ -26,6 +26,7 @@ from ..core.mixins.disco import ChatterDiscoMixin
26
26
  from ..core.mixins.lock import NamedLockMixin
27
27
  from ..core.mixins.recipient import ReactionRecipientMixin, ThreadRecipientMixin
28
28
  from ..db.models import Room
29
+ from ..slixfix.xep_0492.stanza import WhenLiteral
29
30
  from ..util import ABCSubclassableOnceAtMost
30
31
  from ..util.types import (
31
32
  HoleBound,
@@ -994,7 +995,14 @@ class LegacyMUC(
994
995
  p["muc"]["status_codes"] = {110, 333}
995
996
  p.send()
996
997
 
997
- async def add_to_bookmarks(self, auto_join=True, invite=False, preserve=True):
998
+ async def add_to_bookmarks(
999
+ self,
1000
+ auto_join=True,
1001
+ invite=False,
1002
+ preserve=True,
1003
+ pin: bool | None = None,
1004
+ notify: WhenLiteral | None = None,
1005
+ ):
998
1006
  """
999
1007
  Add the MUC to the user's XMPP bookmarks (:xep:`0402')
1000
1008
 
@@ -1012,6 +1020,11 @@ class LegacyMUC(
1012
1020
  settings.
1013
1021
  :param preserve: preserve auto-join and bookmarks extensions
1014
1022
  set by the user outside slidge
1023
+ :param pin: Pin the group chat bookmark :xep:`0469`. Requires privileged entity.
1024
+ If set to ``None`` (default), the bookmark pinning status will be untouched.
1025
+ :param notify: Chat notification setting: :xep:`0492`. Requires privileged entity.
1026
+ If set to ``None`` (default), the setting will be untouched. Only the "global"
1027
+ notification setting is supported (ie, per client type is not possible).
1015
1028
  """
1016
1029
  item = Item()
1017
1030
  item["id"] = self.jid
@@ -1046,6 +1059,13 @@ class LegacyMUC(
1046
1059
  item["conference"]["autojoin"] = auto_join
1047
1060
 
1048
1061
  item["conference"]["nick"] = self.user_nick
1062
+
1063
+ if pin is not None:
1064
+ item["conference"]["extensions"]["pinned"] = pin
1065
+
1066
+ if notify is not None:
1067
+ item["conference"]["extensions"]["notify"].configure(notify)
1068
+
1049
1069
  iq = Iq(stype="set", sfrom=self.user_jid, sto=self.user_jid)
1050
1070
  iq["pubsub"]["publish"]["node"] = self.xmpp["xep_0402"].stanza.NS
1051
1071
  iq["pubsub"]["publish"].append(item)
@@ -5,17 +5,30 @@
5
5
 
6
6
  import slixmpp.plugins
7
7
  from slixmpp import Iq, Message
8
- from slixmpp.exceptions import XMPPError
8
+ from slixmpp.exceptions import _DEFAULT_ERROR_TYPES, XMPPError
9
+ from slixmpp.plugins.xep_0004.stanza.field import FormField
9
10
  from slixmpp.plugins.xep_0050 import XEP_0050, Command
10
11
  from slixmpp.plugins.xep_0231 import XEP_0231
11
12
  from slixmpp.plugins.xep_0425.stanza import Moderate
13
+ from slixmpp.plugins.xep_0469.stanza import NS as PINNED_NS
14
+ from slixmpp.plugins.xep_0469.stanza import Pinned
12
15
  from slixmpp.xmlstream import StanzaBase
13
16
 
14
- from . import link_preview, xep_0077, xep_0100, xep_0153, xep_0292, xep_0356_old
17
+ from . import (
18
+ link_preview,
19
+ xep_0077,
20
+ xep_0100,
21
+ xep_0153,
22
+ xep_0292,
23
+ xep_0356_old,
24
+ xep_0492,
25
+ )
15
26
 
16
27
  # TODO: remove this when the fix is included in slixmpp
17
28
  Moderate.interfaces.add("id")
18
29
 
30
+ _DEFAULT_ERROR_TYPES["policy-violation"] = "modify" # type:ignore
31
+
19
32
 
20
33
  async def _handle_bob_iq(self, iq: Iq):
21
34
  cid = iq["bob"]["cid"]
@@ -42,6 +55,17 @@ async def _handle_bob_iq(self, iq: Iq):
42
55
  iq.send()
43
56
 
44
57
 
58
+ def set_pinned(self, val: bool):
59
+ extensions = self.parent()
60
+ if val:
61
+ extensions.enable("pinned")
62
+ else:
63
+ extensions._del_sub(f"{{{PINNED_NS}}}pinned")
64
+
65
+
66
+ Pinned.set_pinned = set_pinned
67
+
68
+
45
69
  XEP_0231._handle_bob_iq = _handle_bob_iq
46
70
 
47
71
 
@@ -75,13 +99,56 @@ def reply(self, body=None, clear=True):
75
99
  return new_message
76
100
 
77
101
 
102
+ Message.reply = reply # type: ignore
103
+
104
+
105
+ FormField.set_value_base = FormField.set_value # type:ignore
106
+
107
+
108
+ def set_value(self: FormField, value):
109
+ if not self._type:
110
+ if isinstance(value, bool):
111
+ self._type = "boolean"
112
+ elif isinstance(value, str):
113
+ self._type = "text-single"
114
+ elif isinstance(value, (list, tuple)):
115
+ self._type = "text-multi"
116
+
117
+ FormField.set_value_base(self, value)
118
+
119
+
120
+ def get_value(self, convert=True, convert_list=False):
121
+ valsXML = self.xml.findall("{%s}value" % self.namespace)
122
+ if len(valsXML) == 0:
123
+ return None
124
+ elif self._type == "boolean":
125
+ if convert:
126
+ return valsXML[0].text in self.true_values
127
+ return valsXML[0].text
128
+ elif self._type in self.multi_value_types or len(valsXML) > 1:
129
+ values = []
130
+ for valXML in valsXML:
131
+ if valXML.text is None:
132
+ valXML.text = ""
133
+ values.append(valXML.text)
134
+ if self._type == "text-multi" and convert_list:
135
+ values = "\n".join(values)
136
+ return values
137
+ else:
138
+ if valsXML[0].text is None:
139
+ return ""
140
+ return valsXML[0].text
141
+
142
+
143
+ FormField.set_value = set_value # type:ignore
144
+ FormField.get_value = get_value # type:ignore
145
+
146
+
78
147
  slixmpp.plugins.PLUGINS.extend(
79
148
  [
80
149
  "link_preview",
81
150
  "xep_0292_provider",
82
151
  "xep_0356_old",
152
+ "xep_0492",
83
153
  ]
84
154
  )
85
-
86
-
87
- Message.reply = reply # type: ignore
@@ -0,0 +1,8 @@
1
+ from slixmpp.plugins.base import register_plugin
2
+
3
+ from . import stanza
4
+ from .notify import XEP_0492
5
+
6
+ register_plugin(XEP_0492)
7
+
8
+ __all__ = ["stanza", "XEP_0492"]
@@ -0,0 +1,16 @@
1
+ from slixmpp.plugins import BasePlugin
2
+ from . import stanza
3
+
4
+
5
+ class XEP_0492(BasePlugin):
6
+ """
7
+ XEP-0492: Chat notification settings
8
+ """
9
+
10
+ name = "xep_0492"
11
+ description = "XEP-0492: Chat notification settings"
12
+ dependencies = {"xep_0402"}
13
+ stanza = stanza
14
+
15
+ def plugin_init(self):
16
+ stanza.register_plugin()
@@ -0,0 +1,102 @@
1
+ from typing import Literal, Optional, cast
2
+
3
+ from slixmpp import register_stanza_plugin
4
+ from slixmpp.plugins.xep_0402.stanza import Extensions
5
+ from slixmpp.xmlstream import ElementBase
6
+
7
+ from ...util.types import ClientType
8
+
9
+ NS = "urn:xmpp:notification-settings:0"
10
+
11
+ WhenLiteral = Literal["never", "always", "on-mention"]
12
+
13
+
14
+ class Notify(ElementBase):
15
+ """
16
+ Chat notification settings element
17
+
18
+
19
+ To enable it on a Conference element, use configure() like this:
20
+
21
+ .. code-block::python
22
+
23
+ # C being a Conference element
24
+ C['extensions']["notify"].configure("always", client_type="pc")
25
+
26
+ Which will add the <notify> element to the <extensions> element.
27
+ """
28
+
29
+ namespace = NS
30
+ name = "notify"
31
+ plugin_attrib = "notify"
32
+ interfaces = {"notify"}
33
+
34
+ def configure(self, when: WhenLiteral, client_type: Optional[ClientType] = None) -> None:
35
+ """
36
+ Configure the chat notification settings for this bookmark.
37
+
38
+ This method ensures that there are no conflicting settings, e.g.,
39
+ both a <never /> and a <always /> element.
40
+ """
41
+ cls = _CLASS_MAP[when]
42
+ element = cls()
43
+ if client_type is not None:
44
+ element["client-type"] = client_type
45
+
46
+ match = client_type if client_type is not None else ""
47
+ for child in self:
48
+ if isinstance(child, _Base) and child["client-type"] == match:
49
+ self.xml.remove(child.xml)
50
+
51
+ self.append(element)
52
+
53
+ def get_config(
54
+ self, client_type: Optional[ClientType] = None
55
+ ) -> Optional[WhenLiteral]:
56
+ """
57
+ Get the chat notification settings for this bookmark.
58
+
59
+ :param client_type: Optionally, get the notification for a specific client type.
60
+ If unset, returns the global notification setting.
61
+
62
+ :return: The chat notification setting as a string, or None if unset.
63
+ """
64
+ match = client_type if client_type is not None else ""
65
+ for child in self:
66
+ if isinstance(child, _Base) and child["client-type"] == match:
67
+ return cast(WhenLiteral, child.name)
68
+ return None
69
+
70
+
71
+ class _Base(ElementBase):
72
+ namespace = NS
73
+ interfaces = {"client-type"}
74
+
75
+
76
+ class Never(_Base):
77
+ name = "never"
78
+
79
+
80
+ class Always(_Base):
81
+ name = "always"
82
+
83
+
84
+ class OnMention(_Base):
85
+ name = "on-mention"
86
+
87
+
88
+ class Advanced(ElementBase):
89
+ namespace = NS
90
+ name = plugin_attrib = "advanced"
91
+
92
+
93
+ _CLASS_MAP = {
94
+ "never": Never,
95
+ "always": Always,
96
+ "on-mention": OnMention,
97
+ }
98
+
99
+
100
+ def register_plugin():
101
+ register_stanza_plugin(Extensions, Notify)
102
+ register_stanza_plugin(Notify, Advanced)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: slidge
3
- Version: 0.2.3.post1
3
+ Version: 0.2.4
4
4
  Summary: XMPP bridging framework
5
5
  Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -693,7 +693,7 @@ Requires-Dist: thumbhash>=0.1.2
693
693
 
694
694
 
695
695
  [![woodpecker CI status](https://ci.codeberg.org/api/badges/14027/status.svg)](https://ci.codeberg.org/repos/14027)
696
- [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage)
696
+ [![coverage](https://slidge.codeberg.page/coverage/main/coverage.svg)](https://slidge.im/coverage/main)
697
697
 
698
698
  [![pypi version](https://badge.fury.io/py/slidge.svg)](https://pypi.org/project/slidge/)
699
699
  [![debian unstable version](https://badges.debian.net/badges/debian/unstable/python3-slidge/version.svg)](https://packages.debian.org/unstable/python3-slidge)
@@ -164,6 +164,9 @@ slidge/slixfix/xep_0292/vcard4.py
164
164
  slidge/slixfix/xep_0356_old/__init__.py
165
165
  slidge/slixfix/xep_0356_old/privilege.py
166
166
  slidge/slixfix/xep_0356_old/stanza.py
167
+ slidge/slixfix/xep_0492/__init__.py
168
+ slidge/slixfix/xep_0492/notify.py
169
+ slidge/slixfix/xep_0492/stanza.py
167
170
  slidge/util/__init__.py
168
171
  slidge/util/archive_msg.py
169
172
  slidge/util/conf.py
@@ -31,7 +31,7 @@ async def test_single_emoji():
31
31
  form = await x.restricted_emoji_extended_feature()
32
32
  values = form.get_values()
33
33
  assert values.get("max_reactions_per_user") is None
34
- assert values.get("allowlist") == "♥"
34
+ assert values.get("allowlist") == ["♥"]
35
35
 
36
36
 
37
37
  @pytest.mark.asyncio