telegrinder 0.1.dev11__tar.gz → 0.1.dev14__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.

Potentially problematic release.


This version of telegrinder might be problematic. Click here for more details.

Files changed (74) hide show
  1. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/PKG-INFO +1 -1
  2. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/pyproject.toml +1 -1
  3. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/setup.py +1 -1
  4. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/__init__.py +1 -0
  5. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/abc.py +4 -0
  6. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/__init__.py +1 -1
  7. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/callback_query.py +3 -3
  8. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/message.py +11 -5
  9. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/func.py +2 -0
  10. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/abc.py +1 -1
  11. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/__init__.py +1 -0
  12. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/checkbox.py +1 -3
  13. telegrinder-0.1.dev14/telegrinder/bot/scenario/choice.py +39 -0
  14. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/model.py +12 -0
  15. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/schema_generator.py +4 -10
  16. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/methods.py +177 -153
  17. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/objects.py +92 -101
  18. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/LICENSE +0 -0
  19. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/__init__.py +0 -0
  20. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/api.py +0 -0
  21. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/error.py +0 -0
  22. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/response.py +0 -0
  23. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/bot.py +0 -0
  24. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/__init__.py +0 -0
  25. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/inline_query.py +0 -0
  26. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/__init__.py +0 -0
  27. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/abc.py +0 -0
  28. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/dispatch.py +0 -0
  29. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/__init__.py +0 -0
  30. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/abc.py +0 -0
  31. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/middleware/__init__.py +0 -0
  32. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/middleware/abc.py +0 -0
  33. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/process.py +0 -0
  34. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/__init__.py +0 -0
  35. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/abc.py +0 -0
  36. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/callback_query.py +0 -0
  37. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/inline_query.py +0 -0
  38. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/message.py +0 -0
  39. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/waiter.py +0 -0
  40. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/__init__.py +0 -0
  41. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/abc.py +0 -0
  42. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/polling.py +0 -0
  43. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/__init__.py +0 -0
  44. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/callback_data.py +0 -0
  45. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/func.py +0 -0
  46. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/fuzzy.py +0 -0
  47. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/integer.py +0 -0
  48. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/is_from.py +0 -0
  49. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/markup.py +0 -0
  50. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/regex.py +0 -0
  51. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/text.py +0 -0
  52. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/abc.py +0 -0
  53. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/__init__.py +0 -0
  54. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/abc.py +0 -0
  55. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/aiohttp.py +0 -0
  56. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/modules.py +0 -0
  57. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/result.py +0 -0
  58. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/rules.py +0 -0
  59. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/__init__.py +0 -0
  60. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/buttons.py +0 -0
  61. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/__init__.py +0 -0
  62. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/abc.py +0 -0
  63. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/html.py +0 -0
  64. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/markdown.py +0 -0
  65. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/__init__.py +0 -0
  66. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/base.py +0 -0
  67. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/yaml.py +0 -0
  68. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/keyboard.py +0 -0
  69. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/magic.py +0 -0
  70. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/parse_mode.py +0 -0
  71. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/__init__.py +0 -0
  72. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/__main__.py +0 -0
  73. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/nicification.py +0 -0
  74. {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: telegrinder
3
- Version: 0.1.dev11
3
+ Version: 0.1.dev14
4
4
  Summary: async telegram bot building
5
5
  License: MIT
6
6
  Author: timoniq
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "telegrinder"
3
- version = "0.1.dev11"
3
+ version = "0.1.dev14"
4
4
  description = "async telegram bot building"
5
5
  authors = ["timoniq <tesseradecades@mail.ru>"]
6
6
  license = "MIT"
@@ -35,7 +35,7 @@ install_requires = \
35
35
 
36
36
  setup_kwargs = {
37
37
  'name': 'telegrinder',
38
- 'version': '0.1.dev11',
38
+ 'version': '0.1.dev14',
39
39
  'description': 'async telegram bot building',
40
40
  'long_description': 'None',
41
41
  'author': 'timoniq',
@@ -19,6 +19,7 @@ from .bot import (
19
19
  ABCMiddleware,
20
20
  ABCScenario,
21
21
  Checkbox,
22
+ SingleChoice,
22
23
  )
23
24
  from .tools import (
24
25
  Keyboard,
@@ -17,6 +17,10 @@ class Token(str):
17
17
  env.read_envfile()
18
18
  return cls(env.str(var_name))
19
19
 
20
+ @property
21
+ def bot_id(self) -> int:
22
+ return int(self.split(":")[0])
23
+
20
24
 
21
25
  class ABCAPI(ABC):
22
26
  http: ABCClient
@@ -12,4 +12,4 @@ from .dispatch import (
12
12
  from .bot import Telegrinder
13
13
  from .cute_types import MessageCute, CallbackQueryCute, InlineQueryCute
14
14
  from .rules import ABCRule, ABCMessageRule
15
- from .scenario import ABCScenario, Checkbox
15
+ from .scenario import ABCScenario, Checkbox, SingleChoice
@@ -1,6 +1,6 @@
1
1
  from telegrinder.types import CallbackQuery, User
2
- from telegrinder.types.methods import APIMethods
3
- from telegrinder.api import API, APIError, Token
2
+ from telegrinder.model import get_params
3
+ from telegrinder.api import API, APIError
4
4
  from telegrinder.result import Result
5
5
  import typing
6
6
 
@@ -24,5 +24,5 @@ class CallbackQueryCute(CallbackQuery):
24
24
  cache_time: typing.Optional[int] = None,
25
25
  **other
26
26
  ) -> Result[bool, APIError]:
27
- params = APIMethods.get_params(locals())
27
+ params = get_params(locals())
28
28
  return await self.ctx_api.answer_callback_query(self.id, **params)
@@ -6,8 +6,8 @@ from telegrinder.types import (
6
6
  ReplyKeyboardRemove,
7
7
  ForceReply,
8
8
  )
9
- from telegrinder.types.methods import APIMethods
10
- from telegrinder.api import API, APIError, Token
9
+ from telegrinder.model import get_params
10
+ from telegrinder.api import API, APIError
11
11
  from telegrinder.result import Result
12
12
  import typing
13
13
 
@@ -39,7 +39,9 @@ class MessageCute(Message):
39
39
  ] = None,
40
40
  **other
41
41
  ) -> Result["Message", APIError]:
42
- params = APIMethods.get_params(locals())
42
+ params = get_params(locals())
43
+ if "message_thread_id" not in params and self.is_topic_message:
44
+ params["message_thread_id"] = self.message_thread_id
43
45
  return await self.ctx_api.send_message(chat_id=self.chat.id, **params)
44
46
 
45
47
  async def reply(
@@ -61,7 +63,11 @@ class MessageCute(Message):
61
63
  ] = None,
62
64
  **other
63
65
  ) -> Result["Message", APIError]:
64
- params = APIMethods.get_params(locals())
66
+ params = get_params(locals())
67
+ if "message_thread_id" not in params and self.is_topic_message:
68
+ params["message_thread_id"] = self.message_thread_id
65
69
  return await self.ctx_api.send_message(
66
- chat_id=self.chat.id, reply_to_message_id=self.message_id, **params
70
+ chat_id=self.chat.id,
71
+ reply_to_message_id=self.message_id,
72
+ **params
67
73
  )
@@ -5,6 +5,7 @@ from telegrinder.tools import magic_bundle
5
5
  from telegrinder.types import Update
6
6
  from telegrinder.api.abc import ABCAPI
7
7
  from .abc import ABCHandler
8
+ from telegrinder.modules import logger
8
9
 
9
10
  T = typing.TypeVar("T")
10
11
 
@@ -38,6 +39,7 @@ class FuncHandler(ABCHandler, typing.Generic[T]):
38
39
  api=api,
39
40
  )
40
41
  if not await rule.run_check(e, self.ctx):
42
+ logger.debug("Rule {} failed", rule)
41
43
  return False
42
44
  return True
43
45
 
@@ -29,7 +29,7 @@ class ABCRule(ABC, typing.Generic[T]):
29
29
  async def check(self, event: T, ctx: dict) -> bool:
30
30
  pass
31
31
 
32
- def __init_subclass__(cls, require: typing.List["ABCRule[T]"] = None):
32
+ def __init_subclass__(cls, require: typing.Optional[typing.List["ABCRule[T]"]] = None):
33
33
  """Merges requirements from inherited classes and rule-specific requirements"""
34
34
  requirements = []
35
35
  for base in inspect.getmro(cls):
@@ -1,2 +1,3 @@
1
1
  from .abc import ABCScenario
2
2
  from .checkbox import Checkbox
3
+ from .choice import SingleChoice
@@ -35,13 +35,11 @@ class Checkbox(ABCScenario):
35
35
  self,
36
36
  chat_id: int,
37
37
  msg: str,
38
- multiple_choice: bool = True,
39
38
  ready_text: str = "Ready",
40
39
  max_in_row: int = 3,
41
40
  ):
42
41
  self.chat_id = chat_id
43
42
  self.msg = msg
44
- self.multiple_choice = multiple_choice
45
43
  self.choices: typing.List[Choice] = []
46
44
  self.ready = ready_text
47
45
  self.max_in_row = max_in_row
@@ -100,7 +98,7 @@ class Checkbox(ABCScenario):
100
98
  assert len(self.choices) > 1
101
99
  message = (
102
100
  await api.send_message(
103
- self.chat_id, self.msg, self.PARSE_MODE, reply_markup=self.get_markup()
101
+ self.chat_id, text=self.msg, parse_mode=self.PARSE_MODE, reply_markup=self.get_markup()
104
102
  )
105
103
  ).unwrap()
106
104
  while True:
@@ -0,0 +1,39 @@
1
+ from .checkbox import Checkbox
2
+ from telegrinder.bot.cute_types import CallbackQueryCute
3
+ import typing
4
+
5
+ if typing.TYPE_CHECKING:
6
+ from telegrinder.api import API
7
+ from telegrinder.bot.dispatch import Dispatch
8
+
9
+
10
+ class SingleChoice(Checkbox):
11
+ async def handle(self, cb: CallbackQueryCute) -> bool:
12
+ code = cb.data.replace(self.random_code + "/", "", 1)
13
+
14
+ if code == "ready":
15
+ return False
16
+
17
+ for choice in self.choices:
18
+ choice.is_picked = False
19
+
20
+ for i, choice in enumerate(self.choices):
21
+ if choice.code == code:
22
+ self.choices[i].is_picked = True
23
+ await cb.ctx_api.edit_message_text(
24
+ cb.message.chat.id,
25
+ cb.message.message_id,
26
+ text=self.msg,
27
+ parse_mode=self.PARSE_MODE,
28
+ reply_markup=self.get_markup(),
29
+ )
30
+
31
+ return True
32
+
33
+ async def wait(
34
+ self, api: "API", dispatch: "Dispatch"
35
+ ) -> typing.Tuple[str, int]:
36
+ if len([choice for choice in self.choices if choice.is_picked]) != 1:
37
+ raise ValueError("Exactly one choice must be picked")
38
+ choices, m_id = await super().wait(api, dispatch)
39
+ return list(choices.keys())[list(choices.values()).index(True)], m_id
@@ -42,6 +42,17 @@ class Model(msgspec.Struct, **model_config):
42
42
  return self._dict_cached
43
43
 
44
44
 
45
+ def get_params(params: dict) -> dict:
46
+ return {
47
+ k: v for k, v in (
48
+ *params.items(),
49
+ *params.pop("other").items()
50
+ )
51
+ if k != "self"
52
+ and v is not None
53
+ }
54
+
55
+
45
56
  __all__ = (
46
57
  "convert",
47
58
  "model_config",
@@ -50,4 +61,5 @@ __all__ = (
50
61
  "msgspec",
51
62
  "Model",
52
63
  "Raw",
64
+ "get_params",
53
65
  )
@@ -59,7 +59,7 @@ def convert_type(name: str, d: dict, obj: dict, forward_ref: bool = True) -> str
59
59
  if t in TYPES:
60
60
  return TYPES[t]
61
61
  elif t == "array":
62
- nt = convert_type(name, d["items"], obj, forward_ref)
62
+ nt = convert_type("", d["items"], obj, forward_ref)
63
63
  return "typing.List[" + nt + "]"
64
64
  else:
65
65
  if "." in t:
@@ -74,7 +74,7 @@ def convert_type(name: str, d: dict, obj: dict, forward_ref: bool = True) -> str
74
74
  elif "anyOf" in d:
75
75
  return (
76
76
  "typing.Union["
77
- + ", ".join(convert_type(name, ut, obj, forward_ref) for ut in d["anyOf"])
77
+ + ", ".join(convert_type("", ut, obj, forward_ref) for ut in d["anyOf"])
78
78
  + "]"
79
79
  )
80
80
  else:
@@ -210,13 +210,7 @@ def generate(path: str, schema_url: str = URL) -> None:
210
210
  "\n\n",
211
211
  "class APIMethods:\n",
212
212
  SPACES + 'def __init__(self, api: "ABCAPI"):\n',
213
- SPACES + SPACES + "self.api = api\n\n",
214
- SPACES + "@staticmethod\n",
215
- SPACES + "def get_params(loc: dict) -> dict:\n",
216
- SPACES
217
- + SPACES
218
- + 'n = {k: v for k, v in loc.items() if k not in ("self", "other") and v is not None}\n',
219
- SPACES + SPACES + "n.update(loc['other'])\n return n\n",
213
+ SPACES + SPACES + "self.api = api\n",
220
214
  ]
221
215
  )
222
216
 
@@ -247,7 +241,7 @@ def generate(path: str, schema_url: str = URL) -> None:
247
241
  [
248
242
  SPACES + li
249
243
  for li in (
250
- "result = await self.api.request_raw({}, self.get_params(locals()))\n".format(
244
+ "result = await self.api.request_raw({}, get_params(locals()))\n".format(
251
245
  '"' + method_name + '"'
252
246
  ),
253
247
  ("\n" + SPACES + SPACES).join(parse_response(response).split("\n"))