admin_tools: Talk to users
This commit is contained in:
parent
a1c4e10dae
commit
5a7fb42017
@ -7,7 +7,7 @@ __author__ = "Davide Testa"
|
|||||||
__email__ = "davte@libero.it"
|
__email__ = "davte@libero.it"
|
||||||
__credits__ = "Marco Origlia"
|
__credits__ = "Marco Origlia"
|
||||||
__license__ = "GNU General Public License v3.0"
|
__license__ = "GNU General Public License v3.0"
|
||||||
__version__ = "1.4.5"
|
__version__ = "1.4.6"
|
||||||
__maintainer__ = "Davide Testa"
|
__maintainer__ = "Davide Testa"
|
||||||
__contact__ = "t.me/davte"
|
__contact__ = "t.me/davte"
|
||||||
|
|
||||||
|
231
davtelepot/admin_tools.py
Normal file
231
davtelepot/admin_tools.py
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
"""Administration tools for telegram bots.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
```
|
||||||
|
import davtelepot
|
||||||
|
my_bot = davtelepot.Bot.get('my_token', 'my_database.db')
|
||||||
|
davtelepot.admin_tools.init(my_bot)
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Third party modules
|
||||||
|
from davteutil import (
|
||||||
|
get_cleaned_text, get_user, escape_html_chars, extract,
|
||||||
|
line_drawing_unordered_list, make_button, make_inline_keyboard,
|
||||||
|
remove_html_tags
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
TALK_MESSAGES = dict(
|
||||||
|
confirm_user_button=dict(
|
||||||
|
en='Talk to {u}?',
|
||||||
|
it='Parla con {u}?'
|
||||||
|
),
|
||||||
|
confirm_user_text=dict(
|
||||||
|
en='Do you want to talk to {u}?',
|
||||||
|
it='Vuoi parlare con {u}?'
|
||||||
|
),
|
||||||
|
search_button=dict(
|
||||||
|
en="🔍 Search for user",
|
||||||
|
it="🔍 Cerca utente",
|
||||||
|
),
|
||||||
|
select_user=dict(
|
||||||
|
en='Which user would you like to talk to?',
|
||||||
|
it='Con quale utente vorresti parlare?'
|
||||||
|
),
|
||||||
|
user_not_found=dict(
|
||||||
|
en=(
|
||||||
|
"Sory, but no user matches your query for\n"
|
||||||
|
"<code>{q}</code>"
|
||||||
|
),
|
||||||
|
it=(
|
||||||
|
"Spiacente, ma nessun utente corrisponde alla ricerca per\n"
|
||||||
|
"<code>{q}</code>"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
# key=dict(
|
||||||
|
# en='',
|
||||||
|
# it='',
|
||||||
|
# ),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_talk_panel(text, bot):
|
||||||
|
"""Return text and reply markup of talk panel.
|
||||||
|
|
||||||
|
Get 'user_id' as string, username as string or void string for main menu.
|
||||||
|
"""
|
||||||
|
users = []
|
||||||
|
if len(text):
|
||||||
|
with bot.db as db:
|
||||||
|
if text.isnumeric():
|
||||||
|
users = list(
|
||||||
|
db['users'].find(id=int(text))
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
users = list(
|
||||||
|
db.query(
|
||||||
|
"""SELECT *
|
||||||
|
FROM users
|
||||||
|
WHERE COALESCE(
|
||||||
|
first_name || last_name || username,
|
||||||
|
last_name || username,
|
||||||
|
first_name || username,
|
||||||
|
username,
|
||||||
|
first_name || last_name,
|
||||||
|
last_name,
|
||||||
|
first_name
|
||||||
|
) LIKE '%{username}%'
|
||||||
|
""".format(
|
||||||
|
username=text
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if len(users) == 0:
|
||||||
|
text = (
|
||||||
|
bot.get_message('talk', 'user_not_found', update=update)
|
||||||
|
).format(
|
||||||
|
q=escape_html_chars(
|
||||||
|
remove_html_tags(text)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
reply_markup = make_inline_keyboard(
|
||||||
|
[
|
||||||
|
make_button(
|
||||||
|
bot.get_message(
|
||||||
|
'talk', 'search_button',
|
||||||
|
update=update
|
||||||
|
),
|
||||||
|
prefix='talk:///',
|
||||||
|
data=['search']
|
||||||
|
)
|
||||||
|
],
|
||||||
|
1
|
||||||
|
)
|
||||||
|
elif len(users) == 1:
|
||||||
|
user = users[0]
|
||||||
|
text = (
|
||||||
|
bot.get_message(
|
||||||
|
'talk', 'confirm_user_text',
|
||||||
|
update=update
|
||||||
|
)
|
||||||
|
).format(
|
||||||
|
u=get_user(user)
|
||||||
|
)
|
||||||
|
reply_markup = make_inline_keyboard(
|
||||||
|
[
|
||||||
|
make_button(
|
||||||
|
(
|
||||||
|
bot.get_message(
|
||||||
|
'talk', 'confirm_user_button',
|
||||||
|
update=update
|
||||||
|
)
|
||||||
|
).format(
|
||||||
|
u=get_user(user)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
],
|
||||||
|
1
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
text = "{header}\n\n{u}".format(
|
||||||
|
header=bot.get_message(
|
||||||
|
'talk', 'select_user',
|
||||||
|
update=update
|
||||||
|
),
|
||||||
|
u=line_drawing_unordered_list(
|
||||||
|
[
|
||||||
|
get_user(user)
|
||||||
|
for user in users
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
reply_markup = make_inline_keyboard(
|
||||||
|
[
|
||||||
|
make_button(
|
||||||
|
'👤 {u}'.format(
|
||||||
|
u=get_user(
|
||||||
|
{
|
||||||
|
key: val
|
||||||
|
for key, val in user.items()
|
||||||
|
if key in (
|
||||||
|
'first_name',
|
||||||
|
'last_name',
|
||||||
|
'username'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
),
|
||||||
|
prefix='talk:///',
|
||||||
|
data=[
|
||||||
|
'select',
|
||||||
|
user['id']
|
||||||
|
]
|
||||||
|
)
|
||||||
|
for user in users
|
||||||
|
],
|
||||||
|
2
|
||||||
|
)
|
||||||
|
return text, reply_markup
|
||||||
|
|
||||||
|
|
||||||
|
async def _talk_command(update, bot):
|
||||||
|
text = get_cleaned_text(
|
||||||
|
update,
|
||||||
|
bot,
|
||||||
|
['talk']
|
||||||
|
)
|
||||||
|
text, reply_markup = get_talk_panel(text, bot)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
async def _talk_button(update, bot):
|
||||||
|
telegram_id = update['from']['id']
|
||||||
|
command, *arguments = extract(update['data'], '///').split('|')
|
||||||
|
if text:
|
||||||
|
return dict(
|
||||||
|
text=result,
|
||||||
|
edit=dict(
|
||||||
|
text=text,
|
||||||
|
parse_mode='HTML',
|
||||||
|
reply_markup=reply_markup,
|
||||||
|
disable_web_page_preview=True
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def init(bot):
|
||||||
|
"""Assign parsers, commands, buttons and queries to given `bot`."""
|
||||||
|
bot.messages['talk'] = TALK_MESSAGES
|
||||||
|
with bot.db as db:
|
||||||
|
if 'talking_sessions' not in db.tables:
|
||||||
|
db['talking_sessions'].insert(
|
||||||
|
dict(
|
||||||
|
user=0,
|
||||||
|
admin=0,
|
||||||
|
cancelled=1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
@bot.additional_task(when='BEFORE')
|
||||||
|
async def load_talking_sessions():
|
||||||
|
with botd.db as db:
|
||||||
|
for session in db.query(
|
||||||
|
"""SELECT *
|
||||||
|
FROM talking_sessions
|
||||||
|
WHERE NOT cancelled
|
||||||
|
"""
|
||||||
|
):
|
||||||
|
pass # Set cutom_parser
|
||||||
|
|
||||||
|
@bot.command(command='/talk', aliases=[], show_in_keyboard=False,
|
||||||
|
descr="Choose a user and forward messages to each other.",
|
||||||
|
auth='admin')
|
||||||
|
async def talk_command(update):
|
||||||
|
return await _talk_command(update, bot)
|
||||||
|
|
||||||
|
@bot.button(data='talk:///', auth='admin')
|
||||||
|
async def talk_button(update):
|
||||||
|
return await _talk_button(update, bot)
|
||||||
|
return
|
Loading…
x
Reference in New Issue
Block a user