Add wikipedia
This commit is contained in:
parent
e16bf93f95
commit
dbe09f3b19
|
@ -0,0 +1,37 @@
|
|||
from pyrogram import Client, filters
|
||||
from pyrogram.errors.exceptions.forbidden_403 import Forbidden
|
||||
from .. import slave, config, help_dict, log_errors, public_log_errors
|
||||
|
||||
@Client.on_message(~filters.sticker & ~filters.via_bot & ~filters.edited & filters.me & filters.command(['w', 'wiki', 'wikipedia'], prefixes=config['config']['prefixes']))
|
||||
@log_errors
|
||||
@public_log_errors
|
||||
async def wikipedia(client, message):
|
||||
bot = await slave.get_me()
|
||||
query = message.command
|
||||
page = 1
|
||||
query.pop(0)
|
||||
if query and query[0].isnumeric():
|
||||
page = int(query.pop(0))
|
||||
page -= 1
|
||||
if page < 0:
|
||||
page = 0
|
||||
elif page > 9:
|
||||
page = 9
|
||||
query = ' '.join(query)
|
||||
if not query:
|
||||
return
|
||||
results = await client.get_inline_bot_results(bot.username or bot.id, 'w ' + query)
|
||||
if not results.results:
|
||||
await message.reply_text('There are no definitions')
|
||||
return
|
||||
try:
|
||||
await message.reply_inline_bot_result(results.query_id, results.results[page].id)
|
||||
except IndexError:
|
||||
await message.reply_text(f'There are only {len(results.results)} definitions')
|
||||
except Forbidden:
|
||||
await message.reply_text({'message': results.results[page].send_message.message, 'entities': results.results[page].send_message.entities}, disable_web_page_preview=True, parse_mode='through')
|
||||
|
||||
help_dict['wikipedia'] = ('Wikipedia',
|
||||
'''{prefix}wikipedia <i><query></i> - Searches for <i><query></i> on Wikipedia
|
||||
Aliases: {prefix}w, {prefix}wiki
|
||||
Can also be activated inline with: @{bot} wikipedia <i><query></i> or @{bot} wiki <i><query></i> or @{bot} w <i><query></i>''')
|
|
@ -0,0 +1,108 @@
|
|||
import re
|
||||
import time
|
||||
import asyncio
|
||||
from urllib.parse import quote as urlencode
|
||||
from pyrogram import Client, filters
|
||||
from pyrogram.parser.html import HTML as pyrogram_html
|
||||
from pyrogram.types import InlineQueryResultArticle, InputTextMessageContent, InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from .. import session, app_user_ids, log_errors
|
||||
|
||||
all_results = dict()
|
||||
results_lock = asyncio.Lock()
|
||||
@Client.on_inline_query(filters.regex('^w(?:iki)?(?:pedia)?(.+)$'))
|
||||
@log_errors
|
||||
async def wikipedia(client, inline_query):
|
||||
if inline_query.from_user.id not in app_user_ids:
|
||||
await inline_query.answer([
|
||||
InlineQueryResultArticle('...no', InputTextMessageContent('...no'))
|
||||
], cache_time=3600, is_personal=True)
|
||||
return
|
||||
query = inline_query.matches[0].group(1).strip().lower()
|
||||
async with results_lock:
|
||||
if query not in all_results:
|
||||
async with session.get(f'https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&formatversion=2&srlimit=10&srprop=snippet&srenablerewrites=1&srsearch={urlencode(query)}') as resp:
|
||||
all_results[query] = (await resp.json())['query']['search']
|
||||
results = all_results[query]
|
||||
answers = []
|
||||
parser = pyrogram_html(client)
|
||||
for a, result in enumerate(results):
|
||||
full_snippet = None
|
||||
text = f'<a href="https://en.wikipedia.org/wiki/{urlencode(result["title"])}">{result["title"]}</a>\n\n'
|
||||
if result['snippet']:
|
||||
full_snippet = snippet = (await parser.parse(result['snippet']))['message']
|
||||
total_length = len((await parser.parse(text))['message'])
|
||||
if len(snippet) > 1022 - total_length:
|
||||
snippet = snippet[:1021-total_length] + '…'
|
||||
text += snippet
|
||||
buttons = [InlineKeyboardButton('Back', 'wikipedia_back'), InlineKeyboardButton(f'{a + 1}/{len(results)}', 'wikipedia_nop'), InlineKeyboardButton('Next', 'wikipedia_next')]
|
||||
if not a:
|
||||
buttons.pop(0)
|
||||
if len(results) == a + 1:
|
||||
buttons.pop()
|
||||
answers.append(InlineQueryResultArticle(result['title'], InputTextMessageContent(text, disable_web_page_preview=True), reply_markup=InlineKeyboardMarkup([buttons]), id=f'wikipedia{a}-{time.time()}', description=full_snippet))
|
||||
await inline_query.answer(answers, is_personal=True)
|
||||
|
||||
@Client.on_callback_query(filters.regex('^wikipedia_nop$'))
|
||||
@log_errors
|
||||
async def wikipedia_nop(client, callback_query):
|
||||
await callback_query.answer(cache_time=3600)
|
||||
|
||||
message_info = dict()
|
||||
message_lock = asyncio.Lock()
|
||||
@Client.on_chosen_inline_result()
|
||||
@log_errors
|
||||
async def wikipedia_chosen(client, inline_result):
|
||||
if inline_result.result_id.startswith('wikipedia'):
|
||||
match = re.match('^w(?:iki)?(?:pedia)?(.*)$', inline_result.query)
|
||||
if match:
|
||||
query = match.group(1).strip().lower()
|
||||
if query:
|
||||
page = int(inline_result.result_id[9])
|
||||
message_info[inline_result.inline_message_id] = query, page
|
||||
async with results_lock:
|
||||
if query not in all_results:
|
||||
async with session.get(f'https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&formatversion=2&srlimit=10&srprop=snippet&srenablerewrites=1&srsearch={urlencode(query)}') as resp:
|
||||
all_results[query] = (await resp.json())['query']['search']
|
||||
return
|
||||
inline_result.continue_propagation()
|
||||
|
||||
@Client.on_callback_query(filters.regex('^wikipedia_(back|next)$'))
|
||||
@log_errors
|
||||
async def wikipedia_move(client, callback_query):
|
||||
if callback_query.from_user.id not in app_user_ids:
|
||||
await callback_query.answer('...no', cache_time=3600, show_alert=True)
|
||||
return
|
||||
async with message_lock:
|
||||
if callback_query.inline_message_id not in message_info:
|
||||
await callback_query.answer('This message is too old', cache_time=3600, show_alert=True)
|
||||
return
|
||||
query, page = message_info[callback_query.inline_message_id]
|
||||
opage = page
|
||||
if callback_query.matches[0].group(1) == 'back':
|
||||
page -= 1
|
||||
elif callback_query.matches[0].group(1) == 'next':
|
||||
page += 1
|
||||
if page < 0:
|
||||
page = 0
|
||||
elif page > 9:
|
||||
page = 9
|
||||
if page != opage:
|
||||
async with results_lock:
|
||||
results = all_results[query]
|
||||
result = results[page]
|
||||
text = f'<a href="https://en.wikipedia.org/wiki/{urlencode(result["title"])}">{result["title"]}</a>\n\n'
|
||||
if result['snippet']:
|
||||
parser = pyrogram_html(client)
|
||||
snippet = (await parser.parse(result['snippet']))['message']
|
||||
total_length = len((await parser.parse(text))['message'])
|
||||
if len(snippet) > 1022 - total_length:
|
||||
snippet = snippet[:1021-total_length] + '…'
|
||||
text += snippet
|
||||
buttons = [InlineKeyboardButton('Back', 'wikipedia_back'), InlineKeyboardButton(f'{page + 1}/{len(results)}', 'wikipedia_nop'), InlineKeyboardButton('Next', 'wikipedia_next')]
|
||||
if not page:
|
||||
buttons.pop(0)
|
||||
if len(results) == page + 1:
|
||||
buttons.pop()
|
||||
await callback_query.edit_message_text(text, disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup([buttons]))
|
||||
message_info[callback_query.inline_message_id] = query, page
|
||||
await callback_query.answer()
|
Loading…
Reference in New Issue