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.
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/PKG-INFO +1 -1
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/pyproject.toml +1 -1
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/setup.py +1 -1
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/__init__.py +1 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/abc.py +4 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/__init__.py +1 -1
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/callback_query.py +3 -3
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/message.py +11 -5
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/func.py +2 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/abc.py +1 -1
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/__init__.py +1 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/checkbox.py +1 -3
- telegrinder-0.1.dev14/telegrinder/bot/scenario/choice.py +39 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/model.py +12 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/schema_generator.py +4 -10
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/methods.py +177 -153
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/objects.py +92 -101
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/LICENSE +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/api.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/error.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/api/response.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/bot.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/inline_query.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/dispatch.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/handler/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/middleware/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/middleware/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/process.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/callback_query.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/inline_query.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/view/message.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/dispatch/waiter.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/polling/polling.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/callback_data.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/func.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/fuzzy.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/integer.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/is_from.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/markup.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/regex.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/rules/text.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/scenario/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/client/aiohttp.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/modules.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/result.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/rules.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/buttons.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/abc.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/html.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/formatting/markdown.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/base.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/kb_set/yaml.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/keyboard.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/magic.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/tools/parse_mode.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/__init__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/__main__.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/typegen/nicification.py +0 -0
- {telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/types/__init__.py +0 -0
|
@@ -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
|
{telegrinder-0.1.dev11 → telegrinder-0.1.dev14}/telegrinder/bot/cute_types/callback_query.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from telegrinder.types import CallbackQuery, User
|
|
2
|
-
from telegrinder.
|
|
3
|
-
from telegrinder.api import API, APIError
|
|
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 =
|
|
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.
|
|
10
|
-
from telegrinder.api import API, APIError
|
|
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 =
|
|
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 =
|
|
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,
|
|
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):
|
|
@@ -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(
|
|
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(
|
|
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
|
|
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({},
|
|
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"))
|