2018-08-28 08:44:33 +00:00
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
2020-02-24 15:08:04 +00:00
|
|
|
"""
|
|
|
|
Show information about the chat or replied user
|
|
|
|
"""
|
2019-12-31 22:58:06 +00:00
|
|
|
import datetime
|
2019-09-03 19:50:39 +00:00
|
|
|
import html
|
2019-10-21 10:18:32 +00:00
|
|
|
import time
|
2018-08-28 08:44:33 +00:00
|
|
|
|
|
|
|
from telethon import events
|
2018-08-28 10:16:17 +00:00
|
|
|
from telethon import utils
|
2019-10-07 14:53:10 +00:00
|
|
|
from telethon.tl import types, functions
|
2018-08-28 08:44:33 +00:00
|
|
|
|
|
|
|
|
2019-10-07 14:53:10 +00:00
|
|
|
def get_who_string(who, rank=None):
|
2019-09-07 07:31:43 +00:00
|
|
|
who_string = html.escape(utils.get_display_name(who))
|
2019-10-07 14:53:10 +00:00
|
|
|
if rank is not None:
|
|
|
|
who_string += f' <i>"{html.escape(rank)}"</i>'
|
2019-10-08 15:41:00 +00:00
|
|
|
if isinstance(who, (types.User, types.Channel)) and who.username:
|
|
|
|
who_string += f" <i>(@{who.username})</i>"
|
2019-09-07 07:31:43 +00:00
|
|
|
who_string += f", <a href='tg://user?id={who.id}'>#{who.id}</a>"
|
|
|
|
return who_string
|
|
|
|
|
|
|
|
|
2018-08-28 08:44:33 +00:00
|
|
|
@borg.on(events.NewMessage(pattern=r"\.who", outgoing=True))
|
|
|
|
async def _(event):
|
2019-10-07 14:53:10 +00:00
|
|
|
rank = None
|
2018-08-28 08:44:33 +00:00
|
|
|
if not event.message.is_reply:
|
|
|
|
who = await event.get_chat()
|
|
|
|
else:
|
|
|
|
msg = await event.message.get_reply_message()
|
|
|
|
if msg.forward:
|
2019-05-20 07:53:16 +00:00
|
|
|
# FIXME forward privacy memes
|
2018-08-28 08:44:33 +00:00
|
|
|
who = await borg.get_entity(
|
|
|
|
msg.forward.from_id or msg.forward.channel_id)
|
|
|
|
else:
|
2018-08-28 10:16:17 +00:00
|
|
|
who = await msg.get_sender()
|
2019-10-08 15:41:00 +00:00
|
|
|
ic = await event.get_input_chat()
|
|
|
|
if isinstance(ic, types.InputPeerChannel):
|
|
|
|
rank = getattr((await borg(functions.channels.GetParticipantRequest(
|
|
|
|
ic,
|
|
|
|
who
|
|
|
|
))).participant, 'rank', None)
|
2018-08-28 08:44:33 +00:00
|
|
|
|
2019-10-07 14:53:10 +00:00
|
|
|
await event.edit(get_who_string(who, rank), parse_mode='html')
|
2019-09-07 07:31:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
@borg.on(events.NewMessage(pattern=r"\.members", outgoing=True))
|
|
|
|
async def _(event):
|
2019-10-21 10:18:32 +00:00
|
|
|
last = 0
|
|
|
|
index = 0
|
2019-09-07 08:08:07 +00:00
|
|
|
members = []
|
2019-10-21 10:18:32 +00:00
|
|
|
|
|
|
|
it = borg.iter_participants(event.chat_id)
|
|
|
|
async for member in it:
|
|
|
|
index += 1
|
|
|
|
now = time.time()
|
|
|
|
if now - last > 0.5:
|
|
|
|
last = now
|
|
|
|
await event.edit(f'counting member stats ({index / it.total:.2%})…')
|
|
|
|
|
2019-09-07 08:08:07 +00:00
|
|
|
messages = await borg.get_messages(
|
|
|
|
event.chat_id,
|
|
|
|
from_user=member,
|
|
|
|
limit=0
|
|
|
|
)
|
|
|
|
members.append((
|
|
|
|
messages.total,
|
|
|
|
f"{messages.total} - {get_who_string(member)}"
|
|
|
|
))
|
|
|
|
members = (
|
|
|
|
m[1] for m in sorted(members, key=lambda m: m[0], reverse=True)
|
|
|
|
)
|
2018-08-28 08:44:33 +00:00
|
|
|
|
2019-10-21 10:21:28 +00:00
|
|
|
await event.edit("\n".join(members), parse_mode='html')
|
|
|
|
|
|
|
|
|
|
|
|
@borg.on(events.NewMessage(pattern=r"\.active_members", outgoing=True))
|
|
|
|
async def _(event):
|
|
|
|
members = []
|
|
|
|
async for member in borg.iter_participants(event.chat_id):
|
|
|
|
messages = await borg.get_messages(
|
|
|
|
event.chat_id,
|
|
|
|
from_user=member,
|
|
|
|
limit=1
|
|
|
|
)
|
2019-12-31 22:58:06 +00:00
|
|
|
date = (messages[0].date if messages
|
|
|
|
else datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc))
|
2019-10-21 10:21:28 +00:00
|
|
|
members.append((
|
|
|
|
date,
|
|
|
|
f"{date:%Y-%m-%d} - {get_who_string(member)}"
|
|
|
|
))
|
|
|
|
members = (
|
|
|
|
m[1] for m in sorted(members, key=lambda m: m[0], reverse=True)
|
|
|
|
)
|
|
|
|
|
2019-12-31 22:58:06 +00:00
|
|
|
await event.edit("\n".join(members), parse_mode='html')
|