forked from 39bit/spoilerobot
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathhandlers_inline.py
135 lines (109 loc) · 3.86 KB
/
handlers_inline.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import re
from telethon import custom, events, types
from telethon.extensions import html
from telethon.types import DocumentAttributeFilename, InputWebDocument
import validators
import database
from config import MAX_INLINE_LENGTH
from proxy import client, logger
from structs import Spoiler
make_webdoc_png = lambda url: InputWebDocument(
url,
size=0,
mime_type='image/png',
attributes=[DocumentAttributeFilename('image.png')]
)
IMAGE_MINOR = make_webdoc_png('https://i.imgur.com/qrViKOz.png')
IMAGE_MAJOR = make_webdoc_png('https://i.imgur.com/6oSoT16.png')
def is_url(url):
try:
return validators.url(url)
except validators.ValidationError:
return False
def spoiler_from_query(query):
m = re.match(r'(?s)(?P<desc>.*(?::::))?(?P<text>.*)', query)
return Spoiler('Text', (m['desc'] or '').removesuffix(':::'), m['text'])
def get_url_button(text, uuid, spoiler):
return custom.Button.url(text, spoiler.content)
def get_normal_button(text, uuid, spoiler):
return custom.Button.inline(text, uuid)
def get_inline_results(event, uuid: database.UUID, spoiler: Spoiler):
get_button = get_normal_button
if spoiler.type == 'Text' and is_url(spoiler.content):
uuid.flags.skip_saving = True
spoiler.type = 'URL'
get_button = get_url_button
# modify the inline description and reply text of the result if a custom description is set
if spoiler.description:
description_fmt = f'{spoiler.type}, custom title, {{}}'
text_fmt = '<{tag}>{inner}:</{tag}> ' + f'<code>{html.escape(spoiler.description)}</code>'
else:
description_fmt = f'{spoiler.type}, {{}}'
text_fmt = '<{tag}>{inner}{inner_suf}</{tag}>'
results = []
uuid_str = uuid.get_str(is_major=True)
results.append(event.builder.article(
title='Major Spoiler',
description=description_fmt.format('double tap'),
thumb=IMAGE_MAJOR,
text=text_fmt.format(tag='b', inner='Major Spoiler', inner_suf='!'),
buttons=get_button('Double tap to show spoiler', uuid_str, spoiler),
id=uuid_str
))
uuid_str = uuid.get_str(is_major=False)
results.append(event.builder.article(
title='Minor Spoiler',
description=description_fmt.format('single tap'),
thumb=IMAGE_MINOR,
text=text_fmt.format(tag='i', inner='Minor Spoiler', inner_suf=''),
buttons=get_button('Show spoiler', uuid_str, spoiler),
id=uuid_str
))
return results
@client.on(events.InlineQuery(pattern='id:(.+)'))
async def on_inline_id(event: events.InlineQuery.Event):
uuid = database.UUID(event.pattern_match[1])
spoiler = await database.get_spoiler(uuid)
results = []
switch_pm_text = 'Spoiler not found'
if spoiler:
logger.info(f"{event.query.user_id} requested {spoiler.type}")
uuid.flags.skip_saving = True
results = get_inline_results(event, uuid, spoiler)
switch_pm_text = 'Advanced spoiler (media etc.)…'
await event.answer(
results=results,
cache_time=1,
switch_pm=switch_pm_text,
switch_pm_param='inline'
)
raise events.StopPropagation
@client.on(events.InlineQuery())
async def on_inline_text(event: events.InlineQuery.Event):
uuid = database.UUID()
results = []
if len(event.text) >= MAX_INLINE_LENGTH:
switch_pm_text = 'Too long! Use an advanced spoiler!'
else:
switch_pm_text = 'Advanced spoiler (media etc.)…'
spoiler = spoiler_from_query(event.text)
if spoiler.content:
results = get_inline_results(event, uuid, spoiler)
await event.answer(
results=results,
cache_time=1,
switch_pm=switch_pm_text,
switch_pm_param='inline'
)
@client.on(events.Raw(types=types.UpdateBotInlineSend))
async def on_inline_chosen(event):
uuid = database.UUID(event.id)
if uuid.flags.skip_saving:
return
spoiler = spoiler_from_query(event.query)
logger.info(f'{event.user_id} created {spoiler.type}')
await database.insert_spoiler(
uuid=uuid,
spoiler=spoiler,
owner_id=event.user_id
)