11from telegram import (
2+ InlineQueryResultCachedGif ,
23 InlineQueryResultCachedPhoto ,
4+ InlineQueryResultCachedVideo ,
35 InlineQueryResultsButton ,
46 Update ,
57)
68from telegram .constants import ParseMode
79from telegram .ext import ContextTypes
810
9- from src .config import settings
1011from src .localizer import t
12+ from src .storage .constants import MemeType
1113from src .tgbot .constants import (
1214 INLINE_SEARCH_REQUEST_DEEPLINK ,
1315)
1618from src .tgbot .service import (
1719 create_inline_chosen_result_log ,
1820 create_inline_search_log ,
21+ get_shareable_meme_by_id ,
1922 search_memes_for_inline_query ,
2023)
24+ from src .tgbot .sharing import get_meme_share_link
2125from src .tgbot .user_info import get_user_info
2226
2327MIN_SEARCH_QUERY_LENGTH = 3
2731
2832
2933def get_inline_result_ref_link (user_id : int , meme_id : int ):
30- deep_link = f"ir_{ user_id } _{ meme_id } " # inline result
31- return f"https://t.me/{ settings .TELEGRAM_BOT_USERNAME } ?start={ deep_link } "
34+ return get_meme_share_link (user_id , meme_id )
3235
3336
3437def get_inline_result_caption (meme , user_info ):
@@ -42,6 +45,62 @@ def get_inline_result_caption(meme, user_info):
4245 return caption
4346
4447
48+ def parse_exact_meme_inline_query (query : str ) -> int | None :
49+ if not query .startswith ("#" ):
50+ return None
51+
52+ meme_id = query [1 :]
53+ if not meme_id .isdigit ():
54+ return None
55+
56+ return int (meme_id )
57+
58+
59+ def build_inline_meme_result (meme : dict , user_info : dict ):
60+ caption = get_inline_result_caption (meme , user_info )
61+ meme_type = MemeType (meme ["type" ])
62+ if meme_type == MemeType .IMAGE :
63+ return InlineQueryResultCachedPhoto (
64+ id = str (meme ["id" ]),
65+ photo_file_id = meme ["telegram_file_id" ],
66+ caption = caption ,
67+ parse_mode = ParseMode .HTML ,
68+ )
69+ if meme_type == MemeType .VIDEO :
70+ return InlineQueryResultCachedVideo (
71+ id = str (meme ["id" ]),
72+ video_file_id = meme ["telegram_file_id" ],
73+ title = "Fast Food Memes" ,
74+ caption = caption ,
75+ parse_mode = ParseMode .HTML ,
76+ )
77+ if meme_type == MemeType .ANIMATION :
78+ return InlineQueryResultCachedGif (
79+ id = str (meme ["id" ]),
80+ gif_file_id = meme ["telegram_file_id" ],
81+ caption = caption ,
82+ parse_mode = ParseMode .HTML ,
83+ )
84+ return None
85+
86+
87+ async def answer_exact_meme_inline_query (update : Update , user_info : dict , meme_id : int ) -> None :
88+ meme = await get_shareable_meme_by_id (meme_id )
89+ result = build_inline_meme_result (meme , user_info ) if meme else None
90+ results = [result ] if result else []
91+ await update .inline_query .answer (
92+ results ,
93+ cache_time = INLINE_SEARCH_RESULT_CACHE_SECONDS ,
94+ is_personal = True ,
95+ )
96+
97+ await create_inline_search_log (
98+ user_id = update .effective_user .id ,
99+ query = update .inline_query .query .strip ().lower (),
100+ chat_type = update .inline_query .chat_type ,
101+ )
102+
103+
45104async def search_inline (update : Update , _ : ContextTypes .DEFAULT_TYPE ):
46105 try :
47106 user_info = await get_user_info (update .effective_user .id )
@@ -56,6 +115,10 @@ async def search_inline(update: Update, _: ContextTypes.DEFAULT_TYPE):
56115
57116 query = update .inline_query .query .strip ().lower ()
58117
118+ exact_meme_id = parse_exact_meme_inline_query (query )
119+ if exact_meme_id is not None :
120+ return await answer_exact_meme_inline_query (update , user_info , exact_meme_id )
121+
59122 if len (query ) == 0 :
60123 # TODO: show trending / recommended memes
61124 return await update .inline_query .answer (
@@ -92,17 +155,13 @@ async def search_inline(update: Update, _: ContextTypes.DEFAULT_TYPE):
92155 await update .inline_query .answer ([], button = no_results_button )
93156 return
94157
95- results = [
96- InlineQueryResultCachedPhoto (
97- id = str (meme ["id" ]),
98- photo_file_id = meme ["telegram_file_id" ],
99- caption = get_inline_result_caption (meme , user_info ),
100- parse_mode = ParseMode .HTML ,
101- )
102- for meme in memes
103- ]
158+ results = [result for meme in memes if (result := build_inline_meme_result (meme , user_info ))]
104159
105- await update .inline_query .answer (results , cache_time = INLINE_SEARCH_RESULT_CACHE_SECONDS )
160+ await update .inline_query .answer (
161+ results ,
162+ cache_time = INLINE_SEARCH_RESULT_CACHE_SECONDS ,
163+ is_personal = True ,
164+ )
106165
107166 await create_inline_search_log (
108167 user_id = update .effective_user .id ,
0 commit comments