funpaybotengine 0.5.2__tar.gz → 0.5.4__tar.gz

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 (122) hide show
  1. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/PKG-INFO +2 -2
  2. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/bot.py +8 -0
  3. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/filters/order_filters.py +2 -1
  4. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/action_exceptions.py +20 -2
  5. funpaybotengine-0.5.4/funpaybotengine/exceptions/method_exceptions.py +20 -0
  6. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/__init__.py +1 -0
  7. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_sales.py +1 -0
  8. funpaybotengine-0.5.4/funpaybotengine/methods/get_sras_info_page.py +29 -0
  9. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/raise_offers.py +2 -24
  10. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/save_offer_fields.py +29 -4
  11. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/__init__.py +1 -0
  12. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/base.py +0 -1
  13. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/orders.py +2 -2
  14. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/__init__.py +1 -0
  15. funpaybotengine-0.5.4/funpaybotengine/types/pages/sras_info_page.py +16 -0
  16. funpaybotengine-0.5.4/funpaybotengine/types/sras.py +21 -0
  17. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/pyproject.toml +2 -2
  18. funpaybotengine-0.5.4/temp.py +20 -0
  19. funpaybotengine-0.5.2/examples/temp.py +0 -34
  20. funpaybotengine-0.5.2/temp.json +0 -0
  21. funpaybotengine-0.5.2/temp.py +0 -19
  22. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/.github/CODEOWNERS +0 -0
  23. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/.gitignore +0 -0
  24. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/.pre-commit-config.yaml +0 -0
  25. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/LICENSE +0 -0
  26. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/Makefile +0 -0
  27. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/README.md +0 -0
  28. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/examples/basic.py +0 -0
  29. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/examples/with_redis_storage.py +0 -0
  30. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/__init__.py +0 -0
  31. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/base.py +0 -0
  32. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/__init__.py +0 -0
  33. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/default_hooks.py +0 -0
  34. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/session/__init__.py +0 -0
  35. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/session/aiohttp_session.py +0 -0
  36. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/session/base.py +0 -0
  37. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/client/session/http_methods.py +0 -0
  38. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/__init__.py +0 -0
  39. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/events/__init__.py +0 -0
  40. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/events/base.py +0 -0
  41. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/events/builtin_events.py +0 -0
  42. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/filters/__init__.py +0 -0
  43. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/filters/base.py +0 -0
  44. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/filters/message_filters.py +0 -0
  45. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/handlers/__init__.py +0 -0
  46. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/handlers/handler_manager.py +0 -0
  47. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/routers/__init__.py +0 -0
  48. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/routers/base.py +0 -0
  49. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/dispatching/routers/dispatcher.py +0 -0
  50. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/__init__.py +0 -0
  51. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/base.py +0 -0
  52. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/bot_exceptions.py +0 -0
  53. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/message_check_errors.py +0 -0
  54. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/runner_exceptions.py +0 -0
  55. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/exceptions/session_exceptions.py +0 -0
  56. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/loggers.py +0 -0
  57. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/base.py +0 -0
  58. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/calc_chips.py +0 -0
  59. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/calc_lots.py +0 -0
  60. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/check_banned.py +0 -0
  61. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/delete_review.py +0 -0
  62. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_2fa_status.py +0 -0
  63. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_chat_history.py +0 -0
  64. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_chat_page.py +0 -0
  65. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_main_page.py +0 -0
  66. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_my_chips_page.py +0 -0
  67. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_my_offers_page.py +0 -0
  68. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_offer_fields.py +0 -0
  69. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_offer_page.py +0 -0
  70. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_order_page.py +0 -0
  71. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_profile_page.py +0 -0
  72. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_purchases.py +0 -0
  73. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_reviews.py +0 -0
  74. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_settings_page.py +0 -0
  75. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_subcategory_page.py +0 -0
  76. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_telegram_connect_url.py +0 -0
  77. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_transactions.py +0 -0
  78. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/get_transactions_page.py +0 -0
  79. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/logout.py +0 -0
  80. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/mute_chat.py +0 -0
  81. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/refund.py +0 -0
  82. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/review.py +0 -0
  83. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/runner_request.py +0 -0
  84. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/set_offers_hidden.py +0 -0
  85. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/update_notice_channel.py +0 -0
  86. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/upload_avatar.py +0 -0
  87. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/methods/upload_image.py +0 -0
  88. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/py.typed +0 -0
  89. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/runner/__init__.py +0 -0
  90. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/runner/config.py +0 -0
  91. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/runner/event_collector.py +0 -0
  92. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/runner/runner.py +0 -0
  93. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/storage/__init__.py +0 -0
  94. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/storage/base.py +0 -0
  95. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/storage/inmemory.py +0 -0
  96. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/storage/redis.py +0 -0
  97. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/calc.py +0 -0
  98. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/categories.py +0 -0
  99. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/chat.py +0 -0
  100. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/common.py +0 -0
  101. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/common_page_elements.py +0 -0
  102. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/enums.py +0 -0
  103. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/finances.py +0 -0
  104. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/messages.py +0 -0
  105. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/offers.py +0 -0
  106. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/base.py +0 -0
  107. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/chat_page.py +0 -0
  108. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/main_page.py +0 -0
  109. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/my_chips_page.py +0 -0
  110. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/my_offers_page.py +0 -0
  111. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/offer_page.py +0 -0
  112. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/order_page.py +0 -0
  113. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/profile_page.py +0 -0
  114. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/settings_page.py +0 -0
  115. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/subcategory_page.py +0 -0
  116. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/pages/transactions_page.py +0 -0
  117. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/requests/__init__.py +0 -0
  118. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/requests/runner.py +0 -0
  119. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/reviews.py +0 -0
  120. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/settings.py +0 -0
  121. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/types/updates.py +0 -0
  122. {funpaybotengine-0.5.2 → funpaybotengine-0.5.4}/funpaybotengine/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: funpaybotengine
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: Framework for creating FunPay bots.
5
5
  Project-URL: Telegram, https://t.me/funpay_hub
6
6
  Project-URL: Issues, https://github.com/funpayhub/funpaybotengine/issues
@@ -21,7 +21,7 @@ Requires-Python: >=3.10
21
21
  Requires-Dist: aiohttp-socks>=0.11.0
22
22
  Requires-Dist: aiohttp<3.14,>=3.13.3
23
23
  Requires-Dist: eventry<1.0.0,>=0.3.6
24
- Requires-Dist: funpayparsers<0.7.0,>=0.6.1
24
+ Requires-Dist: funpayparsers<0.8.0,>=0.7.0
25
25
  Requires-Dist: pydantic<2.13,>=2.12
26
26
  Provides-Extra: dev
27
27
  Requires-Dist: mypy>=1.10.1; extra == 'dev'
@@ -61,6 +61,7 @@ from funpaybotengine.methods import (
61
61
  GetProfilePage,
62
62
  GetSettingPage,
63
63
  GetMyOffersPage,
64
+ GetSrasInfoPage,
64
65
  GetTransactions,
65
66
  SaveOfferFields,
66
67
  SetOffersHidden,
@@ -86,6 +87,7 @@ from funpaybotengine.types.pages import (
86
87
  ProfilePage,
87
88
  MyOffersPage,
88
89
  SettingsPage,
90
+ SrasInfoPage,
89
91
  SubcategoryPage,
90
92
  TransactionsPage,
91
93
  )
@@ -837,6 +839,12 @@ class Bot:
837
839
  async def get_order_page(self, order_id: str) -> OrderPage:
838
840
  return (await GetOrderPage(order_id=order_id).execute(self)).response_obj
839
841
 
842
+ async def get_sras_info_page(self) -> SrasInfoPage:
843
+ """
844
+ Retrieves the SRAS info page with seller rating restrictions per subcategory.
845
+ """
846
+ return (await GetSrasInfoPage().execute(self)).response_obj
847
+
840
848
  async def get_settings_page(self) -> SettingsPage:
841
849
  return (await GetSettingPage().execute(self)).response_obj
842
850
 
@@ -7,13 +7,14 @@ __all__ = ('FinalOrderStatusFilter',)
7
7
  from typing import TYPE_CHECKING, Any
8
8
 
9
9
  from funpaybotengine.types.enums import MessageType, OrderStatus
10
+ from funpaybotengine.dispatching.events.builtin_events import NewMessageEvent
10
11
 
11
12
  from .base import Filter
12
13
 
13
14
 
14
15
  if TYPE_CHECKING:
15
16
  from funpaybotengine.dispatching.events.base import Event
16
- from funpaybotengine.dispatching.events.builtin_events import OrderEvent, NewMessageEvent
17
+ from funpaybotengine.dispatching.events.builtin_events import OrderEvent
17
18
 
18
19
 
19
20
  _message_type_to_order_status_mapping = {
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
 
4
4
  __all__ = ['RefundError', 'RaiseOffersError']
5
+ import re
6
+
5
7
  from .base import FunPayBotEngineError
6
8
 
7
9
 
@@ -21,10 +23,26 @@ class RaiseOffersError(FunPayBotEngineError):
21
23
  response: str,
22
24
  category_id: int,
23
25
  message: str | None,
24
- wait_time: int | None,
25
26
  ) -> None:
26
27
  super().__init__()
27
28
  self.raw_response = response
28
29
  self.category_id = category_id
29
30
  self.message = message
30
- self.wait_time = wait_time
31
+
32
+ @staticmethod
33
+ def parse_wait_time(response: str) -> int:
34
+ x = re.search(r'(\d+)\s+', response)
35
+ time = int(x.group(1)) if x else 0
36
+
37
+ if 'секунд' in response or 'second' in response:
38
+ return time or 2
39
+ if 'минут' in response or 'хвилин' in response or 'minute' in response:
40
+ return (time or 1) * 60
41
+ if 'час' in response or 'годин' in response or 'hour' in response:
42
+ return (time or 1) * 3600
43
+
44
+ return 10
45
+
46
+ @property
47
+ def wait_time(self) -> int:
48
+ return self.parse_wait_time(self.message or '')
@@ -0,0 +1,20 @@
1
+ __all__ = [
2
+ 'MethodError',
3
+ 'InvalidOfferFieldsError'
4
+ ]
5
+
6
+
7
+ from .base import FunPayBotEngineError
8
+
9
+
10
+ class MethodError(FunPayBotEngineError):
11
+ ...
12
+
13
+
14
+ class InvalidOfferFieldsError(MethodError):
15
+ def __init__(self, message: str, fields: dict[str, str] | None = None):
16
+ self.message = message
17
+ self.fields = fields
18
+
19
+ def __str__(self):
20
+ return self.message
@@ -28,6 +28,7 @@ from .get_my_chips_page import *
28
28
  from .get_settings_page import *
29
29
  from .save_offer_fields import *
30
30
  from .set_offers_hidden import *
31
+ from .get_sras_info_page import *
31
32
  from .get_my_offers_page import *
32
33
  from .get_subcategory_page import *
33
34
  from .get_transactions_page import *
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  __all__ = ('GetSales',)
5
5
 
6
+
6
7
  from pydantic import BaseModel
7
8
  from funpayparsers.types import Language
8
9
  from funpayparsers.parsers import OrderPreviewsParser
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ __all__ = ('GetSrasInfoPage',)
5
+
6
+
7
+ from funpayparsers.parsers.page_parsers import SrasInfoPageParser
8
+
9
+ from funpaybotengine.types.pages import SrasInfoPage
10
+ from funpaybotengine.methods.base import FunPayMethod
11
+ from funpaybotengine.client.session.http_methods import HTTPMethod
12
+
13
+
14
+ class GetSrasInfoPage(FunPayMethod[SrasInfoPage]):
15
+ """
16
+ Get SRAS info page (``https://funpay.com/sras/info``).
17
+
18
+ Returns seller rating restrictions per subcategory.
19
+ Returns ``funpaybotengine.types.pages.SrasInfoPage``.
20
+ """
21
+
22
+ __model_to_build__ = SrasInfoPage
23
+
24
+ def __init__(self) -> None:
25
+ super().__init__(
26
+ url='sras/info',
27
+ method=HTTPMethod.GET,
28
+ parser_cls=SrasInfoPageParser,
29
+ )
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
 
4
4
  __all__ = ('RaiseOffers',)
5
5
 
6
- import re
7
6
  import json
8
7
  from typing import TYPE_CHECKING
9
8
  from collections.abc import Sequence
@@ -21,19 +20,6 @@ if TYPE_CHECKING:
21
20
  from funpaybotengine.client.session.base import RawResponse
22
21
 
23
22
 
24
- def parse_wait_time(response: str) -> int:
25
- x = re.search(r'(\d+)', response)
26
- time = int(x.group()) if x else 0
27
-
28
- if 'секунд' in response or 'second' in response:
29
- return time or 2
30
- if 'минут' in response or 'хвилин' in response or 'minute' in response:
31
- return (time - 1 if time else 1) * 60
32
- if 'час' in response or 'годин' in response or 'hour' in response:
33
- return int((time - 0.5 if time else 1) * 3600)
34
- return 10
35
-
36
-
37
23
  class RaiseOffers(FunPayMethod[Literal[True]]):
38
24
  category_id: int
39
25
  subcategory_ids: Annotated[Sequence[int], Field(min_length=1)]
@@ -62,17 +48,9 @@ class RaiseOffers(FunPayMethod[Literal[True]]):
62
48
  data = json.loads(response.raw_response)
63
49
  error, url, msg = data.get('error'), data.get('url'), data.get('msg')
64
50
 
65
- if url:
66
- raise RaiseOffersError(response.raw_response, self.category_id, url, None)
51
+ if url or error:
52
+ raise RaiseOffersError(response.raw_response, self.category_id, url or msg)
67
53
 
68
- if error:
69
- if msg:
70
- if any(_ in msg for _ in ('Подождите ', 'Please wait ', 'Зачекайте ')):
71
- wait = parse_wait_time(msg)
72
- else:
73
- wait = None
74
- raise RaiseOffersError(response.raw_response, self.category_id, msg, wait)
75
- raise RaiseOffersError(response.raw_response, self.category_id, msg, None)
76
54
  return True
77
55
 
78
56
  async def transform_result(
@@ -9,9 +9,11 @@ from pydantic import BaseModel
9
9
  from funpayparsers.types import Language
10
10
  from funpayparsers.parsers import OfferFieldsParser
11
11
 
12
+ from funpaybotengine.exceptions.method_exceptions import InvalidOfferFieldsError
12
13
  from funpaybotengine.methods.base import FunPayMethod
13
14
  from funpaybotengine.types.offers import OfferFields
14
15
  from funpaybotengine.client.session import HTTPMethod, RawResponse
16
+ import json
15
17
 
16
18
 
17
19
  class SaveOfferFields(FunPayMethod[bool], BaseModel):
@@ -38,8 +40,31 @@ class SaveOfferFields(FunPayMethod[bool], BaseModel):
38
40
  offer_fields=offer_fields,
39
41
  )
40
42
 
41
- async def parse_result(self, response: RawResponse[Any]) -> bool:
42
- return True
43
+ async def parse_result(self, response: RawResponse[Any]) -> bool | dict[str, Any]:
44
+ try:
45
+ return json.loads(response.raw_response)
46
+ except json.decoder.JSONDecodeError:
47
+ return True
48
+
49
+ async def transform_result(
50
+ self,
51
+ parsing_result: bool | dict[str, Any],
52
+ response: RawResponse[Any]
53
+ ) -> bool:
54
+ if isinstance(parsing_result, bool):
55
+ return parsing_result
56
+
57
+
58
+ if not parsing_result.get('error'):
59
+ return True
60
+
61
+ error_msg = str(parsing_result.get('msg', '')) or str(parsing_result.get('error'))
62
+ fields: list[list[str, str]] = parsing_result.get('errors')
63
+ try:
64
+ fields_dict = {field: error for field, error in fields}
65
+ except Exception:
66
+ fields_dict = {}
67
+
68
+ raise InvalidOfferFieldsError(error_msg, fields_dict)
69
+
43
70
 
44
- async def transform_result(self, parsing_result: Any, response: RawResponse[Any]) -> bool:
45
- return True
@@ -11,6 +11,7 @@ from .reviews import *
11
11
  from .updates import *
12
12
  from .finances import *
13
13
  from .messages import *
14
+ from .sras import *
14
15
  from .settings import *
15
16
  from .categories import *
16
17
  from .common_page_elements import *
@@ -15,7 +15,6 @@ class FunPayObject(BindableObject, BaseModel):
15
15
  """Base class for all FunPay-parsed objects."""
16
16
 
17
17
  model_config = ConfigDict(
18
- frozen=True,
19
18
  validate_assignment=True,
20
19
  arbitrary_types_allowed=True,
21
20
  populate_by_name=True,
@@ -22,9 +22,9 @@ class OrderPreview(FunPayObject, BaseModel):
22
22
  if (
23
23
  self.type is OrderPreviewType.UNKNOWN
24
24
  and context
25
- and context.get('order_preview_type') is not None
25
+ and isinstance(context.get('order_preview_type'), OrderPreviewType)
26
26
  ):
27
- self._type = context['order_preview_type']
27
+ self.type = context['order_preview_type']
28
28
 
29
29
  id: str
30
30
  """Order ID."""
@@ -10,4 +10,5 @@ from .my_chips_page import *
10
10
  from .settings_page import *
11
11
  from .my_offers_page import *
12
12
  from .subcategory_page import *
13
+ from .sras_info_page import *
13
14
  from .transactions_page import *
@@ -0,0 +1,16 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ __all__ = ('SrasInfoPage',)
5
+
6
+
7
+ from funpaybotengine.types.sras import SrasSectionRestriction
8
+ from funpaybotengine.types.enums import SubcategoryType
9
+ from funpaybotengine.types.pages.base import FunPayPage
10
+
11
+
12
+ class SrasInfoPage(FunPayPage):
13
+ """Represents the SRAS info page (``https://funpay.com/sras/info``)."""
14
+
15
+ restrictions: dict[SubcategoryType, dict[int, SrasSectionRestriction]]
16
+ """Restrictions grouped by subcategory type and subcategory ID."""
@@ -0,0 +1,21 @@
1
+ from __future__ import annotations
2
+
3
+
4
+ __all__ = ('SrasSectionRestriction',)
5
+
6
+
7
+ from funpaybotengine.types.base import FunPayObject
8
+ from funpaybotengine.types.enums import SubcategoryType
9
+
10
+
11
+ class SrasSectionRestriction(FunPayObject):
12
+ """Represents a SRAS restriction for a specific subcategory."""
13
+
14
+ subcategory_id: int
15
+ """Subcategory ID."""
16
+
17
+ subcategory_type: SubcategoryType
18
+ """Subcategory type."""
19
+
20
+ max_rating: int
21
+ """Maximum allowed seller rating to be listed in this subcategory."""
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "funpaybotengine"
3
- version = "0.5.2"
3
+ version = "0.5.4"
4
4
  description = "Framework for creating FunPay bots."
5
5
  requires-python = ">=3.10"
6
6
  readme = "README.md"
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "aiohttp>=3.13.3,<3.14",
10
10
  "aiohttp-socks>=0.11.0",
11
11
  "eventry>=0.3.6,<1.0.0",
12
- "funpayparsers>=0.6.1,<0.7.0",
12
+ "funpayparsers>=0.7.0,<0.8.0",
13
13
  "pydantic>=2.12,<2.13",
14
14
  ]
15
15
  authors = [
@@ -0,0 +1,20 @@
1
+ from funpaybotengine import Bot
2
+
3
+ bot = Bot(golden_key='ldc86q3vuwdx30wi7koqsr9scpsejash', proxy='socks5://user148429:dgej93@45.39.104.142:19392')
4
+
5
+
6
+ async def main():
7
+ result = await bot.get_my_offers_page(2418)
8
+ print(result.subcategory_id)
9
+ print(result.category_id)
10
+ for i in result.offers.values():
11
+ print(i.id)
12
+ print(i.title)
13
+ print(i.price)
14
+ print(i.auto_delivery)
15
+ print(i.seller)
16
+
17
+
18
+ if __name__ == '__main__':
19
+ import asyncio
20
+ asyncio.run(main())
@@ -1,34 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
-
5
- from funpaybotengine import Bot, Dispatcher
6
- from funpaybotengine.types import Message
7
-
8
-
9
- bot: Bot = Bot(golden_key='12345678901234567890123456789012') # Создаем экземляр бота
10
- dp: Dispatcher = Dispatcher() # Создаем диспетчер - корневой роутер
11
-
12
-
13
- # Регистрируем хэндлер на событие о новом сообщении
14
- # Хэндлер отработает на абсолютно любое сообщение.
15
- @dp.on_new_message()
16
- async def print_message(message: Message) -> None:
17
- print(f'Пришло новое сообщение от {message.sender_username}: ')
18
- print(message.text or message.image_url)
19
-
20
-
21
- # Регистрируем хэндлер на событие о новом сообщении
22
- # Хэндлер сработает тольько в том случае, если текст сообщения == 'привет'
23
- @dp.on_new_message(lambda message: message.text.lower() == 'привет')
24
- async def echo(message: Message) -> None:
25
- await message.reply('Пока')
26
-
27
-
28
- async def main() -> None:
29
- # Запускаем цикл получения новых событий.
30
- await bot.listen_events(dp)
31
-
32
-
33
- if __name__ == '__main__':
34
- asyncio.run(main())
File without changes
@@ -1,19 +0,0 @@
1
- from funpaybotengine import Bot
2
- from funpaybotengine.methods.get_orders import GetOrders
3
- import json
4
-
5
-
6
- bot = Bot(golden_key='j9k09a1lnifuw3ngpdc9pphxuqe94bqy', proxy='socks5://user148429:dgej93@45.39.104.142:19392')
7
-
8
- async def main():
9
- await bot.update()
10
- print(bot.username)
11
-
12
- method = GetOrders(order_ids=['B72YEFH9'])
13
- r = (await method.execute(bot)).response_obj
14
- print(json.dumps(r, indent=4, ensure_ascii=False))
15
-
16
-
17
- if __name__ == '__main__':
18
- import asyncio
19
- asyncio.run(main())
File without changes